| @@ -142,9 +142,9 @@ class GraphState(object): | |||||
| return result | return result | ||||
| def toggle_edges(a, b): | |||||
| def toggle_edges(self, a, b): | |||||
| """ Toggle edges between vertex sets a and b """ | """ Toggle edges between vertex sets a and b """ | ||||
| done = {} | |||||
| done = set() | |||||
| for i, j in it.product(a, b): | for i, j in it.product(a, b): | ||||
| if i == j and not (i, j) in done: | if i == j and not (i, j) in done: | ||||
| done.add((i, j), (j, i)) | done.add((i, j), (j, i)) | ||||
| @@ -163,12 +163,12 @@ class GraphState(object): | |||||
| # Do a z on all ngb(vb) \ ngb(v) \ {v}, and some other stuff | # Do a z on all ngb(vb) \ ngb(v) \ {v}, and some other stuff | ||||
| self.act_local_rotation(node, "pz") | self.act_local_rotation(node, "pz") | ||||
| self.act_local_rotation(friend, "msqy") | self.act_local_rotation(friend, "msqy") | ||||
| for n in set(self.adj[friend]) - set(self.adj(node)) - {node}: | |||||
| for n in set(self.adj[friend]) - set(self.adj[node]) - {node}: | |||||
| self.act_local_rotation(n, "pz") | self.act_local_rotation(n, "pz") | ||||
| else: | else: | ||||
| # Do a z on all ngb(v) \ ngb(vb) \ {vb}, and sqy on the friend | # Do a z on all ngb(v) \ ngb(vb) \ {vb}, and sqy on the friend | ||||
| self.act_local_rotation(friend, "sqy") | self.act_local_rotation(friend, "sqy") | ||||
| for n in set(self.adj[node]) - set(self.adj(friend)) - {friend}: | |||||
| for n in set(self.adj[node]) - set(self.adj[friend]) - {friend}: | |||||
| self.act_local_rotation(n, "pz") | self.act_local_rotation(n, "pz") | ||||
| # TODO: Yuk. Just awful! | # TODO: Yuk. Just awful! | ||||
| @@ -202,7 +202,7 @@ class GraphState(object): | |||||
| def measure_z(self, node, result): | def measure_z(self, node, result): | ||||
| """ Measure the graph in the Z-basis """ | """ Measure the graph in the Z-basis """ | ||||
| # Disconnect | # Disconnect | ||||
| for neighbour in self.adj[node]: | |||||
| for neighbour in tuple(self.adj[node]): | |||||
| self.del_edge(node, neighbour) | self.del_edge(node, neighbour) | ||||
| if result: | if result: | ||||
| self.act_local_rotation(neighbour, "pz") | self.act_local_rotation(neighbour, "pz") | ||||
| @@ -288,6 +288,8 @@ class GraphState(object): | |||||
| def __eq__(self, other): | def __eq__(self, other): | ||||
| """ Check equality between graphs """ | """ Check equality between graphs """ | ||||
| if str(type(other)) == "<class 'anders_briegel.graphsim.GraphRegister'>": | |||||
| return self.to_json() == other.to_json() | |||||
| return self.adj == other.adj and self.node == other.node | return self.adj == other.adj and self.node == other.node | ||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||
| @@ -10,3 +10,4 @@ def demograph(): | |||||
| g.add_edge(100, 200) | g.add_edge(100, 200) | ||||
| return g | return g | ||||
| @@ -0,0 +1,41 @@ | |||||
| from abp import GraphState, clifford | |||||
| from anders_briegel import graphsim | |||||
| def random_state(N=10, messy=True): | |||||
| """ A state to test on """ | |||||
| a = GraphState(range(N)) | |||||
| b = graphsim.GraphRegister(N) | |||||
| clifford.use_old_cz() | |||||
| for i in range(N): | |||||
| a.act_hadamard(i) | |||||
| b.hadamard(i) | |||||
| for i in range(10): | |||||
| j, k= np.random.choice(range(N), 2, replace=False) | |||||
| a.act_cz(j, k) | |||||
| b.cphase(j, k) | |||||
| if not messy: return a, b | |||||
| for i in range(10): | |||||
| j = np.random.choice(range(N)) | |||||
| k = np.random.choice(range(24)) | |||||
| a.act_local_rotation(j, k) | |||||
| b.local_op(j, graphsim.LocCliffOp(k)) | |||||
| for i in range(10): | |||||
| j, k= np.random.choice(range(N), 2, replace=False) | |||||
| a.act_cz(j, k) | |||||
| b.cphase(j, k) | |||||
| return a, b | |||||
| def bell(): | |||||
| a = GraphState(range(2)) | |||||
| b = graphsim.GraphRegister(2) | |||||
| a.act_hadamard(0); a.act_hadamard(1); | |||||
| b.hadamard(0); b.hadamard(1); | |||||
| a.act_cz(0,1) | |||||
| b.cphase(0,1) | |||||
| return a, b | |||||
| @@ -35,10 +35,9 @@ def test_hadamard_only_multiqubit(n=6): | |||||
| assert g.to_state_vector() == c | assert g.to_state_vector() == c | ||||
| for i in range(100): | for i in range(100): | ||||
| a, b = np.random.randint(0, n - 1, 2) | |||||
| if a != b: | |||||
| g.act_cz(a, b) | |||||
| c.act_cz(a, b) | |||||
| a, b = np.random.choice(range(n), 2, False) | |||||
| g.act_cz(a, b) | |||||
| c.act_cz(a, b) | |||||
| assert g.to_state_vector() == c | assert g.to_state_vector() == c | ||||
| @@ -56,15 +55,14 @@ def test_all_multiqubit(n=4): | |||||
| assert g.to_state_vector() == c | assert g.to_state_vector() == c | ||||
| for repeat in tqdm(range(REPEATS), desc="Testing against circuit model"): | for repeat in tqdm(range(REPEATS), desc="Testing against circuit model"): | ||||
| a, b = np.random.randint(0, n - 1, 2) | |||||
| if a != b: | |||||
| g.act_cz(a, b) | |||||
| c.act_cz(a, b) | |||||
| assert np.allclose(np.sum(np.abs(c.state) ** 2), 1) | |||||
| assert np.allclose( | |||||
| np.sum(np.abs(g.to_state_vector().state) ** 2), 1) | |||||
| a, b = np.random.choice(range(n), 2, False) | |||||
| g.act_cz(a, b) | |||||
| c.act_cz(a, b) | |||||
| assert np.allclose(np.sum(np.abs(c.state) ** 2), 1) | |||||
| assert np.allclose( | |||||
| np.sum(np.abs(g.to_state_vector().state) ** 2), 1) | |||||
| assert g.to_state_vector() == c | |||||
| assert g.to_state_vector() == c | |||||
| assert g.to_state_vector() == c | assert g.to_state_vector() == c | ||||
| @@ -80,9 +78,8 @@ def test_all(n=8): | |||||
| g.act_local_rotation(qubit, rotation) | g.act_local_rotation(qubit, rotation) | ||||
| c.act_local_rotation(qubit, clifford.unitaries[rotation]) | c.act_local_rotation(qubit, clifford.unitaries[rotation]) | ||||
| else: | else: | ||||
| a, b = np.random.randint(0, n - 1, 2) | |||||
| if a != b: | |||||
| g.act_cz(a, b) | |||||
| c.act_cz(a, b) | |||||
| a, b = np.random.choice(range(n), 2, False) | |||||
| g.act_cz(a, b) | |||||
| c.act_cz(a, b) | |||||
| assert g.to_state_vector() == c | assert g.to_state_vector() == c | ||||
| @@ -53,42 +53,4 @@ def test_another_projection(): | |||||
| g.measure(0, "pz", 1) | g.measure(0, "pz", 1) | ||||
| assert np.allclose(g.to_state_vector().state, qi.one) | assert np.allclose(g.to_state_vector().state, qi.one) | ||||
| def test_z_measurement_against_ab(): | |||||
| for i in range(10): | |||||
| a = graphsim.GraphRegister(1) | |||||
| b = GraphState() | |||||
| b.add_node(0) | |||||
| #print a.measure(0, graphsim.lco_Z) | |||||
| #print b.measure(0, "pz") | |||||
| def test_all(N=20): | |||||
| """ Test everything""" | |||||
| #clifford.use_old_cz() | |||||
| #a = graphsim.GraphRegister(N) | |||||
| #b = GraphState(range(N)) | |||||
| #previous_state, previous_cz = None, None | |||||
| #for i in tqdm(range(REPEATS), desc="Testing all gates against Anders and Briegel"): | |||||
| #which = random.choice([LOCAL_ROTATION, CZ, MEASURE]) | |||||
| #if which == LOCAL_ROTATION: | |||||
| #j = random.randint(0, N-1) | |||||
| #u = random.randint(0, 23) | |||||
| #a.local_op(j, graphsim.LocCliffOp(u)) | |||||
| #b.act_local_rotation(j, u) | |||||
| #elif which == CZ: | |||||
| #q = random.randint(0, N-2) | |||||
| #if a!=b: | |||||
| #a.cphase(q, q+1) | |||||
| #b.act_cz(q, q+1) | |||||
| #else: | |||||
| #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 | |||||
| @@ -0,0 +1,31 @@ | |||||
| from abp import GraphState, clifford | |||||
| from anders_briegel import graphsim | |||||
| import numpy as np | |||||
| from tqdm import tqdm | |||||
| import dummy | |||||
| N = 2 | |||||
| REPEATS = 10 | |||||
| PZ = graphsim.lco_Z | |||||
| def _test_multiqubit_measurement_pz(): | |||||
| """ Test a multiqubit measurement """ | |||||
| for i in tqdm(range(REPEATS)): | |||||
| a, b = dummy.random_state(messy=False) | |||||
| j = np.random.choice(range(N)) | |||||
| k = "pz" | |||||
| a.measure(j, k, 0) | |||||
| print a.to_json() | |||||
| print b.to_json() | |||||
| #assert a.to_json() == b.to_json(), a | |||||
| def test_multiqubit_pz(): | |||||
| for i in range(10): | |||||
| a, b = dummy.bell() | |||||
| assert a == b | |||||
| print a.measure(0, "pz", 1) | |||||
| print b.measure(0, PZ, None, 1) | |||||
| assert a == b | |||||