@@ -1,6 +1,7 @@ | |||
from flask import Flask, request, redirect, url_for, make_response, render_template, Markup, send_from_directory, send_file | |||
from flask_redis import FlaskRedis | |||
import json, abp, markdown | |||
from pprint import pprint | |||
app = Flask(__name__) | |||
redis = FlaskRedis(app) | |||
@@ -28,6 +29,41 @@ def graph(): | |||
else: | |||
# Get from the database | |||
return redis.get("graph") | |||
@app.route("/edit", methods=["POST"]) | |||
def edit(): | |||
# Load the graph from the database | |||
g = abp.GraphState() | |||
g.from_json(json.loads(redis.get("graph"))) | |||
# Apply the edit to the graph | |||
edit = json.loads(request.data) | |||
action = edit["action"] | |||
pprint(edit, indent=2) | |||
if action == "create": | |||
g.add_qubit(edit["name"], position=edit["position"], vop=0) | |||
elif action == "cz": | |||
g.act_cz(edit["start"], edit["end"]) | |||
elif action == "hadamard": | |||
g.act_hadamard(edit["node"]) | |||
elif action == "phase": | |||
g.act_local_rotation(edit["node"], "phase") | |||
elif action == "delete": | |||
g._del_node(edit["node"]) | |||
elif action == "localcomplementation": | |||
g.local_complementation(edit["node"]) | |||
elif action == "measure": | |||
g.measure(edit["node"], "p"+edit["basis"]) | |||
else: | |||
pass | |||
# New state into JSON and database | |||
data = json.dumps(g.to_json(stringify=True)) | |||
redis.execute_command("SET", "graph", data) | |||
return data | |||
@app.route("/doc") | |||
def doc(): | |||
@@ -0,0 +1,41 @@ | |||
var api = {}; | |||
api.poll = function() { | |||
var xmlhttp = new XMLHttpRequest(); | |||
xmlhttp.onreadystatechange = function() { | |||
if (xmlhttp.readyState == XMLHttpRequest.DONE) { | |||
if (xmlhttp.status == 200) { | |||
api.update(xmlhttp.responseText); | |||
} | |||
} | |||
}; | |||
// Send the request | |||
xmlhttp.open("GET", "/graph", true); | |||
xmlhttp.send(); | |||
}; | |||
api.update = function(s) { | |||
json = JSON.parse(s); | |||
graph.update(json); | |||
} | |||
api.edit = function(edit) { | |||
var xmlhttp = new XMLHttpRequest(); | |||
xmlhttp.onreadystatechange = function() { | |||
if (xmlhttp.readyState == XMLHttpRequest.DONE) { | |||
if (xmlhttp.status == 200) { | |||
api.update(xmlhttp.responseText); | |||
} | |||
} | |||
}; | |||
// Send the request | |||
xmlhttp.open("POST", "/edit", true); | |||
xmlhttp.setRequestHeader("Content-Type", "application/json"); | |||
xmlhttp.send(JSON.stringify(edit)); | |||
} | |||
// Launch the polling loop | |||
setInterval(api.poll, 1000); |
@@ -48,7 +48,7 @@ editor.addQubitAtPoint = function(point) { | |||
gui.serverMessage("Node " + new_node +" already exists."); | |||
return; | |||
} | |||
websocket.edit({action:"create", name:new_node, position: point}); | |||
api.edit({action:"create", name:new_node, position: point}); | |||
editor.focus(new_node); | |||
gui.serverMessage("Created node " + new_node +"."); | |||
}; | |||
@@ -77,7 +77,7 @@ editor.onShiftClick = function() { | |||
if (editor.selection === undefined){ return; } | |||
if (found === editor.selection){ return; } | |||
//abj.act_cz(found, editor.selection); | |||
websocket.edit({action:"cz", start:found, end:editor.selection}); | |||
api.edit({action:"cz", start:found, end:editor.selection}); | |||
gui.serverMessage("Acted CZ between " + found + " & " + editor.selection + "."); | |||
editor.focus(found); | |||
}; | |||
@@ -87,7 +87,7 @@ editor.onCtrlClick = function() { | |||
if (found === undefined){ return; } | |||
if (editor.selection === undefined){ return; } | |||
editor.focus(found); | |||
websocket.edit({action:"hadamard", node:found}); | |||
api.edit({action:"hadamard", node:found}); | |||
gui.serverMessage("Acted H on node " + found + "."); | |||
}; | |||
@@ -144,7 +144,7 @@ editor.findNodeOnRay = function(ray) { | |||
editor.deleteNode = function() { | |||
if (editor.selection === undefined){ return; } | |||
websocket.edit({action:"delete", node:editor.selection}); | |||
api.edit({action:"delete", node:editor.selection}); | |||
gui.serverMessage("Deleted node " + editor.selection + "."); | |||
editor.selection = undefined; | |||
node_data.className = "hidden"; | |||
@@ -154,37 +154,37 @@ editor.deleteNode = function() { | |||
editor.hadamard = function() { | |||
if (editor.selection === undefined){ return; } | |||
websocket.edit({action:"hadamard", node:editor.selection}); | |||
api.edit({action:"hadamard", node:editor.selection}); | |||
gui.serverMessage("Acted Hadamard on node " + editor.selection + "."); | |||
}; | |||
editor.phase = function() { | |||
if (editor.selection === undefined){ return; } | |||
websocket.edit({action:"phase", node:editor.selection}); | |||
api.edit({action:"phase", node:editor.selection}); | |||
gui.serverMessage("Acted phase on node " + editor.selection + "."); | |||
}; | |||
editor.measureX = function() { | |||
if (editor.selection === undefined){ return; } | |||
websocket.edit({action:"measure", node:editor.selection, basis:"x"}); | |||
api.edit({action:"measure", node:editor.selection, basis:"x"}); | |||
gui.serverMessage("Measured node " + editor.selection + " in X."); | |||
}; | |||
editor.measureY = function() { | |||
if (editor.selection === undefined){ return; } | |||
websocket.edit({action:"measure", node:editor.selection, basis:"y"}); | |||
api.edit({action:"measure", node:editor.selection, basis:"y"}); | |||
gui.serverMessage("Measured node " + editor.selection + " in Y."); | |||
}; | |||
editor.measureZ = function() { | |||
if (editor.selection === undefined){ return; } | |||
websocket.edit({action:"measure", node:editor.selection, basis:"z"}); | |||
api.edit({action:"measure", node:editor.selection, basis:"z"}); | |||
gui.serverMessage("Measured node " + editor.selection + " in z."); | |||
}; | |||
editor.localComplementation = function() { | |||
if (editor.selection === undefined){ return; } | |||
websocket.edit({action:"localcomplementation", node:editor.selection}); | |||
api.edit({action:"localcomplementation", node:editor.selection}); | |||
abj.local_complementation(editor.selection); | |||
gui.serverMessage("Inverted neighbourhood of " + editor.selection + "."); | |||
}; |
@@ -48,7 +48,6 @@ graph.update = function(newState) { | |||
} | |||
if (editor.selection) { | |||
console.log(editor.selection); | |||
var node = editor.selection; | |||
if (Object.prototype.hasOwnProperty.call(abj.node, node)) { | |||
editor.grid.position.copy(abj.node[node].position); | |||
@@ -1,23 +0,0 @@ | |||
function poll() { | |||
var xmlhttp = new XMLHttpRequest(); | |||
xmlhttp.onreadystatechange = function() { | |||
if (xmlhttp.readyState == XMLHttpRequest.DONE) { | |||
if (xmlhttp.status == 200) { | |||
update(xmlhttp.responseText); | |||
} | |||
} | |||
}; | |||
// Send the request | |||
xmlhttp.open("GET", "/graph", true); | |||
xmlhttp.send(); | |||
}; | |||
function update(s) { | |||
json = JSON.parse(s); | |||
graph.update(json); | |||
} | |||
// Launch the polling loop | |||
setInterval(poll, 1000); |
@@ -14,7 +14,7 @@ | |||
<script src="{{ url_for("static", filename="scripts/graph.js") }}"></script> | |||
<script src="{{ url_for("static", filename="scripts/gui.js") }}"></script> | |||
<script src="{{ url_for("static", filename="scripts/editor.js") }}"></script> | |||
<script src="{{ url_for("static", filename="scripts/poller.js") }}"></script> | |||
<script src="{{ url_for("static", filename="scripts/api.js") }}"></script> | |||
<script src="{{ url_for("static", filename="scripts/main.js") }}"></script> | |||
</head> | |||
@@ -6,11 +6,11 @@ import json | |||
import abp | |||
import random | |||
#URL = "http://localhost:5000" | |||
URL = "https://abv.peteshadbolt.co.uk/" | |||
URL = "http://localhost:5000" | |||
#URL = "https://abv.peteshadbolt.co.uk/" | |||
def test_graph(): | |||
N = 50 | |||
N = 10 | |||
g = abp.NXGraphState(range(N)) | |||
for i in range(N): | |||