| @@ -0,0 +1,113 @@ | |||||
| var ngbh = {}; | |||||
| var vops = {}; | |||||
| var meta = {}; | |||||
| function add_node(node, m) { | |||||
| ngbh[node] = {}; | |||||
| vops[node] = clifford.hadamard; | |||||
| meta[node] = m ? m : {}; | |||||
| } | |||||
| function add_nodes(nodes) { | |||||
| nodes.forEach(add_node); | |||||
| } | |||||
| function add_edge(a, b) { | |||||
| ngbh[a][b] = true; | |||||
| ngbh[b][a] = true; | |||||
| } | |||||
| function add_edges(edges) { | |||||
| edges.forEach(function(e) { | |||||
| add_edge(e[0], e[1]); | |||||
| }); | |||||
| } | |||||
| function del_edge(a, b) { | |||||
| delete ngbh[a][b]; | |||||
| delete ngbh[b][a]; | |||||
| } | |||||
| function has_edge(a, b) { | |||||
| return Object.prototype.hasOwnProperty.call(ngbh[a], b); | |||||
| } | |||||
| function toggle_edge(a, b) { | |||||
| if (has_edge(a, b)) { | |||||
| del_edge(a, b); | |||||
| } else { | |||||
| add_edge(a, b); | |||||
| } | |||||
| } | |||||
| function get_swap(node, avoid) { | |||||
| for (var i in ngbh[node]) { | |||||
| if (i != avoid) {return i;} | |||||
| } | |||||
| return avoid; | |||||
| } | |||||
| function remove_vop(node, avoid) { | |||||
| var swap_qubit = get_swap(node, avoid); | |||||
| var decomposition = decompositions[vops[node]]; | |||||
| for (var i=decomposition.length-1; i >=0; --i) { | |||||
| var v = decomposition[i]; | |||||
| local_complementation(v == "x" ? a : swap_qubit); | |||||
| } | |||||
| } | |||||
| function local_complementation(node) { | |||||
| var keys = Object.keys(ngbh[node]); | |||||
| for (var i=0; i < keys.length; ++i) { | |||||
| for (var j=i+1; j < keys.length; ++j) { | |||||
| toggle_edge(keys[i], keys[j]); | |||||
| } | |||||
| vops[i] = times_table[vops[keys[i]]][sqz_h]; | |||||
| } | |||||
| vops[node] = times_table[vops[node]][msqx_h]; | |||||
| } | |||||
| function act_local_rotation(node, operation) { | |||||
| var rotation = clifford[operation]; | |||||
| vops[node] = times_table[rotation][vops[node]]; | |||||
| } | |||||
| function act_hadamard(node){ | |||||
| act_local_rotation(node, 10); | |||||
| } | |||||
| function is_sole_member(node, group){ | |||||
| return group.length == 1 && group[0] == node; | |||||
| } | |||||
| function act_cz(a, b){ | |||||
| if (is_sole_member(ngbh[a], b)) { | |||||
| remove_vop(a, b); | |||||
| } | |||||
| if (is_sole_member(ngbh[b], a)) { | |||||
| remove_vop(b, a); | |||||
| } | |||||
| if (is_sole_member(ngbh[a], b)) { | |||||
| remove_vop(a, b); | |||||
| } | |||||
| var edge = has_edge(a, b); | |||||
| var new_state = cz_table[edge ? 1 : 0][vops[a]][vops[b]]; | |||||
| vops[a] = new_state[1]; | |||||
| vops[b] = new_state[2]; | |||||
| if (new_state[0] != edge){ | |||||
| toggle_edge(a, b); | |||||
| } | |||||
| } | |||||
| function log_graph_state() { | |||||
| console.log(vops); | |||||
| console.log(ngbh); | |||||
| } | |||||
| add_node(0); | |||||
| add_node(1); | |||||
| act_local_rotation(0, 10); | |||||
| act_local_rotation(1, 10); | |||||
| act_cz(0, 1); | |||||
| log_graph_state(); | |||||
| @@ -1,5 +1,12 @@ | |||||
| function poll() { | |||||
| var ws = new WebSocket("ws://localhost:5001"); | |||||
| var ws; | |||||
| function add_node(node){ | |||||
| data = {"method": "add_node", "node": node}; | |||||
| ws.send(JSON.stringify(data)); | |||||
| } | |||||
| function connect_to_server() { | |||||
| ws = new WebSocket("ws://localhost:5001"); | |||||
| ws.onopen = function() | ws.onopen = function() | ||||
| { | { | ||||
| console.log("Connected to server."); | console.log("Connected to server."); | ||||
| @@ -17,5 +24,4 @@ function poll() { | |||||
| }; | }; | ||||
| } | } | ||||
| window.onload = poll; | |||||
| @@ -1,4 +0,0 @@ | |||||
| from abp import VisibleGraphState | |||||
| s = VisibleGraphState() | |||||
| s.add_node(0) | |||||
| @@ -1,38 +0,0 @@ | |||||
| import abp | |||||
| import atexit | |||||
| import json | |||||
| from websocket import create_connection | |||||
| class ServedState(abp.GraphState): | |||||
| def __init__(self): | |||||
| abp.GraphState.__init__(self) | |||||
| self.ws = create_connection("ws://localhost:5001") | |||||
| atexit.register(self.ws.close) | |||||
| self.send("clear") | |||||
| def send(self, method, *args, **kwargs): | |||||
| kwargs.update({"method":method}) | |||||
| self.ws.send(json.dumps(kwargs)) | |||||
| def add_node(self, node): | |||||
| abp.GraphState.add_node(self, node) | |||||
| self.send("add_node", node = node) | |||||
| def add_edge(self, start, end): | |||||
| abp.GraphState.add_edge(self, start, end) | |||||
| self.send("add_edge", start = start, end = end) | |||||
| def del_edge(self, start, end): | |||||
| abp.GraphState.del_edge(self, start, end) | |||||
| self.send("del_edge", start = start, end = end) | |||||
| def del_edge(self, start, end): | |||||
| abp.GraphState.del_edge(self, start, end) | |||||
| self.send("del_edge", start = start, end = end) | |||||
| if __name__ == '__main__': | |||||
| s = ServedState() | |||||
| s.add_node(0) | |||||
| s.add_node(1) | |||||
| s.add_edge(0,1) | |||||
| @@ -0,0 +1,5 @@ | |||||
| //TODO Move to THREE.gridhelper | |||||
| // Make a grid | |||||
| function makeGrid(side, n, color) { | |||||
| return grid; | |||||
| } | |||||
| @@ -4,9 +4,35 @@ | |||||
| <head> | <head> | ||||
| <meta charset="utf-8"> | <meta charset="utf-8"> | ||||
| <title>abp</title> | <title>abp</title> | ||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=1" /> | |||||
| <link rel="stylesheet" href="main.css"> | |||||
| </head> | </head> | ||||
| <body> | <body> | ||||
| <script type="text/javascript" src="three.js"></script> | |||||
| <script type="text/javascript" src="libs.js"></script> | |||||
| <script type="text/javascript" src="materials.js"></script> | |||||
| <script type="text/javascript" src="poll.js"></script> | <script type="text/javascript" src="poll.js"></script> | ||||
| <script type="text/javascript" src="api.js"></script> | |||||
| <script type="text/javascript" src="curve.js"></script> | |||||
| <script type="text/javascript" src="tables.js"></script> | |||||
| <script type="text/javascript" src="anders_briegel.js"></script> | |||||
| <script type="text/javascript" src="main.js"></script> | |||||
| <img id="ball" src="data:image/png;base64,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"/ | |||||
| style=display:none;> | |||||
| <div id=infoholder class=hidden> | |||||
| </div> | |||||
| <div id=pallette> | |||||
| <ul> | |||||
| <li>add_qubit</li> | |||||
| <li>delete_qubit</li> | |||||
| <li>hadamard</li> | |||||
| <li>cz</li> | |||||
| <li>clear</li> | |||||
| </ul> | |||||
| </div> | |||||
| </body> | </body> | ||||
| </html> | </html> | ||||
| @@ -13,7 +13,9 @@ window.onload = init; | |||||
| // Clear the whole scene | // Clear the whole scene | ||||
| function makeScene() { | function makeScene() { | ||||
| var myScene = new THREE.Scene(); | var myScene = new THREE.Scene(); | ||||
| var grid = makeGrid(10, 10, "lightgray"); | |||||
| var grid = new THREE.GridHelper(20, 2); | |||||
| grid.rotation.x = Math.PI/2; | |||||
| grid.setColors(0xdddddd, 0xeeeeee); | |||||
| myScene.add(grid); | myScene.add(grid); | ||||
| return myScene; | return myScene; | ||||
| } | } | ||||
| @@ -48,6 +50,10 @@ function init() { | |||||
| document.querySelector("body").appendChild(renderer.domElement); | document.querySelector("body").appendChild(renderer.domElement); | ||||
| window.addEventListener("resize", onWindowResize, false); | window.addEventListener("resize", onWindowResize, false); | ||||
| renderer.domElement.addEventListener("click", function (evt) { | |||||
| add_node(0); | |||||
| }); | |||||
| // Time to load the materials | // Time to load the materials | ||||
| loadMaterials(); | loadMaterials(); | ||||
| @@ -64,6 +70,6 @@ function init() { | |||||
| // Run | // Run | ||||
| scene = makeScene(); | scene = makeScene(); | ||||
| controls.addEventListener("change", render); | controls.addEventListener("change", render); | ||||
| poll(); | |||||
| connect_to_server(); | |||||
| render(); | render(); | ||||
| } | } | ||||
| @@ -1,12 +1,24 @@ | |||||
| from websocket_server import WebsocketServer | from websocket_server import WebsocketServer | ||||
| import threading | import threading | ||||
| import abp | |||||
| import json | |||||
| clients = [] | clients = [] | ||||
| #state = "awd" | |||||
| state = abp.VisibleGraphState() | |||||
| def compute_diff(decoded_message): | |||||
| def new_message(client, server, message): | def new_message(client, server, message): | ||||
| print "Sending message ..." | |||||
| server.send_message_to_all(message) | |||||
| decoded_message = json.loads(message) | |||||
| if "diff" in decoded_message: | |||||
| server.send_message_to_all(message) | |||||
| elif "method" in decoded_message: | |||||
| message = compute_diff(decoded_message) | |||||
| server.send_message_to_all(message) | |||||
| else: | |||||
| print "Could not interpret message" | |||||
| def new_client(client, server): | def new_client(client, server): | ||||
| print "Client {} connected.".format(client["id"]) | print "Client {} connected.".format(client["id"]) | ||||
| @@ -1,8 +0,0 @@ | |||||
| //TODO Move to THREE.gridhelper | |||||
| // Make a grid | |||||
| function makeGrid(side, n, color) { | |||||
| var grid = new THREE.GridHelper(20, 2); | |||||
| grid.rotation.x = Math.PI/2; | |||||
| grid.setColors(0xdddddd, 0xeeeeee); | |||||
| return grid; | |||||
| } | |||||
| @@ -1,47 +0,0 @@ | |||||
| html, body { margin: 0; padding: 0; overflow: hidden; font-size: 10pt; font-family: "courier new"; } | |||||
| #infoholder { | |||||
| background: black; | |||||
| color:white; | |||||
| padding: 5px; | |||||
| margin:0px; | |||||
| position: absolute; | |||||
| top:5px; | |||||
| left:5px; | |||||
| font-family:"courier new"; | |||||
| text-align: center; | |||||
| font-size:10pt; | |||||
| height:15px; | |||||
| border-radius:3px; | |||||
| } | |||||
| #pallette { | |||||
| background-color: black; | |||||
| /*border-radius:3px;*/ | |||||
| color:white; | |||||
| padding: 10px; | |||||
| font-family:"courier new"; | |||||
| position: absolute; | |||||
| top: 10px; | |||||
| right: 10px; | |||||
| font-size: 9pt; | |||||
| } | |||||
| ul { | |||||
| list-style-type: none; | |||||
| padding: 0px; | |||||
| margin: 0px; | |||||
| } | |||||
| .visible { | |||||
| visibility: visible; | |||||
| opacity: 1; | |||||
| transform: scale(1); | |||||
| transition: opacity .08s linear, transform .08s linear; | |||||
| } | |||||
| .hidden { | |||||
| visibility: hidden; | |||||
| opacity: 0; | |||||
| transform: scale(.5); | |||||
| transition: visibility .08s, opacity .08s linear, transform .08s linear; | |||||
| } | |||||
| @@ -1,54 +0,0 @@ | |||||
| function poll() { | |||||
| var xhr = new XMLHttpRequest(); | |||||
| xhr.timeout = 60000; | |||||
| xhr.onload = function() { | |||||
| var state = JSON.parse(xhr.responseText); | |||||
| updateScene(state); | |||||
| poll(); | |||||
| }; | |||||
| xhr.onerror = function(e){ | |||||
| poll(); | |||||
| }; | |||||
| xhr.open("GET", "/state", true); | |||||
| xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8'); | |||||
| xhr.send(); | |||||
| } | |||||
| function updateScene(state) { | |||||
| if (state.needs_update === false){return;} | |||||
| var oldState = scene.getObjectByName("graphstate"); | |||||
| scene.remove(oldState); | |||||
| oldState = null; | |||||
| var geometry = new THREE.Geometry(); | |||||
| //nodeGeometry.labels = []; | |||||
| //nodeGeometry.colors = []; | |||||
| for (var i in state.nodes) { | |||||
| var node = state.nodes[i]; | |||||
| var pos = state.meta[i].pos; | |||||
| var vertex = new THREE.Vector3(pos.x, pos.y, pos.z); | |||||
| geometry.vertices.push(vertex); | |||||
| //geometry.colors[i] = new THREE.Color(n.color); | |||||
| //geometry.labels[i] = n.label; | |||||
| } | |||||
| var edges = new THREE.Object3D(); | |||||
| for (i=0; i < state.edges.length; ++i) { | |||||
| var edge = state.edges[i]; | |||||
| var start = state.meta[edge[0]].pos; | |||||
| var end = state.meta[edge[1]].pos; | |||||
| var newEdge = makeEdge(start, end); | |||||
| edges.add(newEdge); | |||||
| } | |||||
| var particles = new THREE.Points(geometry, materials.qubit); | |||||
| var newState = new THREE.Object3D(); | |||||
| newState.name = "graphstate"; | |||||
| newState.add(particles); | |||||
| newState.add(edges); | |||||
| scene.add(newState); | |||||
| render(); | |||||
| } | |||||
| @@ -1,36 +0,0 @@ | |||||
| <!DOCTYPE html> | |||||
| <html lang="en"> | |||||
| <head> | |||||
| <meta charset="utf-8"> | |||||
| <title>abp</title> | |||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=1" /> | |||||
| <link rel="stylesheet" href="/static/main.css"> | |||||
| </head> | |||||
| <body> | |||||
| <script type="text/javascript" src="/static/three.js"></script> | |||||
| <script type="text/javascript" src="/static/libs.js"></script> | |||||
| <script type="text/javascript" src="/static/materials.js"></script> | |||||
| <script type="text/javascript" src="/static/poll.js"></script> | |||||
| <script type="text/javascript" src="/static/grid.js"></script> | |||||
| <script type="text/javascript" src="/static/curve.js"></script> | |||||
| <script type="text/javascript" src="/static/main.js"></script> | |||||
| <img id="ball" src="data:image/png;base64,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"/ | |||||
| style=display:none;> | |||||
| <div id=infoholder class=hidden> | |||||
| </div> | |||||
| <div id=pallette> | |||||
| <ul> | |||||
| <li>add_qubit</li> | |||||
| <li>delete_qubit</li> | |||||
| <li>hadamard</li> | |||||
| <li>cz</li> | |||||
| <li>clear</li> | |||||
| </ul> | |||||
| </div> | |||||
| </body> | |||||
| </html> | |||||