@@ -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 | |||||