| @@ -48,13 +48,13 @@ class GraphState(graphstate.GraphState, networkx.Graph): | |||
| #self.ws.close() | |||
| #self.connect_to_server() | |||
| def layout(self, dim=3): | |||
| def layout(self, dim=2): | |||
| """ Automatically lay out the graph """ | |||
| pos = networkx.spring_layout(self, dim, scale=np.sqrt(self.order())) | |||
| middle = np.average(pos.values(), axis=0) | |||
| pos = {key: value - middle for key, value in pos.items()} | |||
| for key, (x, y, z) in pos.items(): | |||
| self.node[key]["position"] = util.xyz(x, y, z) | |||
| for key, (x, y) in pos.items(): | |||
| self.node[key]["position"] = util.xyz(x, y, 0) | |||
| def add_vops(self): | |||
| """ Automatically add vops if they're not present """ | |||
| @@ -63,7 +63,10 @@ class GraphState(object): | |||
| def remove_vop(self, a, avoid): | |||
| """ Reduces VOP[a] to the identity """ | |||
| others = set(self.adj[a]) - {avoid} | |||
| swap_qubit = others.pop() if others else avoid | |||
| #TODO: this is a hack for determinsim. remove | |||
| swap_qubit = min(others) if others else avoid | |||
| #swap_qubit = others.pop() if others else avoid # TODO: maybe this is the only problematic part | |||
| print "SWAPPING WITH {} (options were {})".format(swap_qubit, tuple(others)) | |||
| for v in reversed(clifford.decompositions[self.node[a]["vop"]]): | |||
| if v == "x": | |||
| @@ -256,6 +259,7 @@ class GraphState(object): | |||
| def to_stabilizer(self): | |||
| """ Get the stabilizer of this graph """ | |||
| return | |||
| output = {a: {} for a in self.node} | |||
| for a, b in it.product(self.node, self.node): | |||
| if a == b: | |||
| @@ -0,0 +1,91 @@ | |||
| from abp import GraphState, clifford | |||
| from abp.fancy import GraphState as Fancy | |||
| from anders_briegel import graphsim | |||
| import random | |||
| import numpy as np | |||
| from tqdm import tqdm | |||
| import time | |||
| import itertools as it | |||
| import sys | |||
| REPEATS = 100000 | |||
| N=9 | |||
| def compare(A, B): | |||
| keys_same = set(A["node"].keys()) == set(B["node"].keys()) | |||
| vops_same = all(A["node"][i]["vop"] == B["node"][i]["vop"] for i in A["node"].keys()) | |||
| edges_same = A["adj"] == B["adj"] | |||
| if keys_same and vops_same and edges_same: | |||
| return True | |||
| sys.exit(0) | |||
| print "doing a state vector check" | |||
| alice = GraphState(range(N)) | |||
| alice.node = A["node"] | |||
| alice.adj = A["adj"] | |||
| bob = GraphState(range(N)) | |||
| bob.node = B["node"] | |||
| bob.adj = B["adj"] | |||
| if alice.to_state_vector() == bob.to_state_vector(): | |||
| return True | |||
| return False | |||
| if __name__ == '__main__': | |||
| clifford.use_old_cz() | |||
| a = graphsim.GraphRegister(N) | |||
| b = Fancy(range(N)) | |||
| # Keep comparing until fail | |||
| while compare(a.to_json(), b.to_json()): | |||
| if random.random()>0.5: | |||
| j = np.random.randint(0, N) | |||
| u = random.randint(0, 23) | |||
| print "> Acting U{} on {}".format(u, j) | |||
| a.local_op(j, graphsim.LocCliffOp(u)) | |||
| b.act_local_rotation(j, u) | |||
| print "Done" | |||
| else: | |||
| i, j= np.random.randint(0, N, 2) | |||
| if i!=j: | |||
| print "> Acting CZ on {} & {}".format(i, j) | |||
| a.cphase(i, j) | |||
| b.act_cz(i, j) | |||
| print "Done" | |||
| #b.update(delay=0.1) | |||
| # Show the diff | |||
| A = a.to_json()["node"] | |||
| B = b.to_json()["node"] | |||
| for i in range(N): | |||
| if A[i]["vop"] != B[i]["vop"]: | |||
| print "{}/ them: {}, me: {}".format(i, A[i]["vop"], B[i]["vop"]) | |||
| # Now construct unitaries | |||
| A = a.to_json() | |||
| B = b.to_json() | |||
| alice = GraphState(range(N)) | |||
| alice.node = A["node"] | |||
| alice.adj = A["adj"] | |||
| bob = GraphState(range(N)) | |||
| bob.node = B["node"] | |||
| bob.adj = B["adj"] | |||
| print alice.to_state_vector() == bob.to_state_vector() | |||
| b.layout() | |||
| @@ -3,7 +3,6 @@ from anders_briegel import graphsim | |||
| from abp import CircuitModel | |||
| from abp import clifford | |||
| import random | |||
| from copy import deepcopy | |||
| import numpy as np | |||
| from tqdm import tqdm | |||
| from abp.anders_cz import cz_table as abczt | |||
| @@ -105,7 +104,7 @@ def test_with_cphase_gates_hadamard_only(N=10): | |||
| assert_equal(a, b) | |||
| def test_cz_hadamard(N=20): | |||
| def _test_cz_hadamard(N=10): | |||
| """ Test CZs and Hadamards at random """ | |||
| clifford.use_old_cz() | |||
| @@ -126,7 +125,7 @@ def test_cz_hadamard(N=20): | |||
| def _test_all(N=9): | |||
| def test_all(N=9): | |||
| """ Test everything""" | |||
| clifford.use_old_cz() | |||
| @@ -0,0 +1,35 @@ | |||
| from abp import GraphState, clifford | |||
| from abp.fancy import GraphState as Fancy | |||
| from anders_briegel import graphsim | |||
| import random | |||
| import time | |||
| import numpy as np | |||
| from tqdm import tqdm | |||
| REPEATS = 100000 | |||
| def assert_equal(a, b, debug=""): | |||
| assert a.to_json() == b.to_json(), "\n\n" + debug + "\n\n" + str(a.to_json()) + "\n\n" + str(b.to_json()) | |||
| def test_cz_hadamard(N=9): | |||
| """ Test CZs and Hadamards at random """ | |||
| clifford.use_old_cz() | |||
| a = graphsim.GraphRegister(N) | |||
| b = Fancy(range(N)) | |||
| while a.to_json() == b.to_json(): | |||
| if random.random()>0.5: | |||
| j = random.randint(0, N-1) | |||
| a.hadamard(j) | |||
| b.act_hadamard(j) | |||
| else: | |||
| q = random.randint(0, N-2) | |||
| a.cphase(q, q+1) | |||
| b.act_cz(q, q+1) | |||
| @@ -82,11 +82,13 @@ def test_all(N=20): | |||
| a.cphase(q, q+1) | |||
| b.act_cz(q, q+1) | |||
| else: | |||
| pass | |||
| #q = random.randint(0, N-2) | |||
| #m = random.choice(["px", "py", "pz"]) | |||
| #a.measure(q, m) | |||
| #b.measure(q, mm) | |||
| assert a.to_json() == b.to_json() | |||
| q = random.randint(0, N-2) | |||
| m = random.choice([1,2,3]) | |||
| force = random.choice([0, 1]) | |||
| thing=3 | |||
| ma = a.measure(q, graphsim.LocCliffOp(m)) | |||
| mb = b.measure(q, str(m), force) | |||
| print ma, mb | |||
| assert ma == mb, i | |||