| @@ -41,101 +41,12 @@ abj.has_edge = function(a, b) { | |||||
| return Object.prototype.hasOwnProperty.call(abj.adj[a], b); | return Object.prototype.hasOwnProperty.call(abj.adj[a], b); | ||||
| }; | }; | ||||
| abj.toggle_edge = function(a, b) { | |||||
| if (abj.has_edge(a, b)) { | |||||
| abj.del_edge(a, b); | |||||
| } else { | |||||
| abj.add_edge(a, b); | |||||
| } | |||||
| }; | |||||
| abj.get_swap = function(node, avoid) { | |||||
| for (var i in abj.adj[node]) { | |||||
| if (i != avoid) { | |||||
| return i; | |||||
| } | |||||
| } | |||||
| return avoid; | |||||
| }; | |||||
| abj.remove_vop = function(node, avoid) { | |||||
| var swap_qubit = abj.get_swap(node, avoid); | |||||
| var decomposition = tables.decompositions[abj.node[node].vop]; | |||||
| for (var i = decomposition.length - 1; i >= 0; --i) { | |||||
| var v = decomposition[i]; | |||||
| abj.local_complementation(v == "x" ? node : swap_qubit); | |||||
| } | |||||
| }; | |||||
| abj.local_complementation = function(node) { | |||||
| // TODO: inefficient | |||||
| var done = {}; | |||||
| for (var i in abj.adj) { | |||||
| for (var j in abj.adj[i]) { | |||||
| var name = i>j ? [i,j] : [j,i]; | |||||
| if (done[name]===false){ | |||||
| abj.toggle_edge(i, j); | |||||
| done[name] = true; | |||||
| } | |||||
| } | |||||
| abj.node[i].vop = tables.times_table[abj.node[i].vop][6]; | |||||
| } | |||||
| abj.node[node].vop = tables.times_table[abj.node[node].vop][14]; | |||||
| }; | |||||
| abj.act_local_rotation = function(node, operation) { | |||||
| var rotation = tables.clifford[operation]; | |||||
| abj.node[node].vop = tables.times_table[rotation][abj.node[node].vop]; | |||||
| }; | |||||
| abj.act_hadamard = function(node) { | |||||
| abj.act_local_rotation(node, 10); | |||||
| }; | |||||
| abj.is_sole_member = function(group, node) { | abj.is_sole_member = function(group, node) { | ||||
| // TODO: this is slow as heck | // TODO: this is slow as heck | ||||
| var keys = Object.keys(group); | var keys = Object.keys(group); | ||||
| return keys.length == 1 && keys[0] == node; | return keys.length == 1 && keys[0] == node; | ||||
| }; | }; | ||||
| abj.act_cz = function(a, b) { | |||||
| if (abj.is_sole_member(abj.adj[a], b)) { | |||||
| abj.remove_vop(a, b); | |||||
| } | |||||
| if (abj.is_sole_member(abj.adj[b], a)) { | |||||
| abj.remove_vop(b, a); | |||||
| } | |||||
| if (abj.is_sole_member(abj.adj[a], b)) { | |||||
| abj.remove_vop(a, b); | |||||
| } | |||||
| var edge = abj.has_edge(a, b); | |||||
| var new_state = tables.cz_table[edge ? 1 : 0][abj.node[a].vop][abj.node[b].vop]; | |||||
| abj.node[a].vop = new_state[1]; | |||||
| abj.node[b].vop = new_state[2]; | |||||
| if (new_state[0] != edge) { | |||||
| abj.toggle_edge(a, b); | |||||
| } | |||||
| }; | |||||
| abj.edgelist = function() { | |||||
| var seen = {}; | |||||
| var output = []; | |||||
| for (var i in abj.adj) { | |||||
| for (var j in abj.adj[i]) { | |||||
| if (!Object.prototype.hasOwnProperty.call(seen, j)) { | |||||
| output.push([i, j]); | |||||
| } | |||||
| } | |||||
| seen[i] = true; | |||||
| } | |||||
| return output; | |||||
| }; | |||||
| abj.log_graph_state = function() { | |||||
| console.log(JSON.stringify(abj.node)); | |||||
| console.log(JSON.stringify(abj.adj)); | |||||
| }; | |||||
| abj.update = function(newState) { | abj.update = function(newState) { | ||||
| abj.node = newState.node; | abj.node = newState.node; | ||||
| abj.adj = newState.adj; | abj.adj = newState.adj; | ||||