Browse Source

Think I just did something right

master
Pete Shadbolt 7 years ago
parent
commit
9623abfa10
6 changed files with 144 additions and 13 deletions
  1. +3
    -3
      abp/fancy.py
  2. +5
    -1
      abp/graphstate.py
  3. +91
    -0
      examples/wtf.py
  4. +2
    -3
      tests/test_against_anders_and_briegel.py
  5. +35
    -0
      tests/test_fancy.py
  6. +8
    -6
      tests/test_measurement.py

+ 3
- 3
abp/fancy.py View File

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


+ 5
- 1
abp/graphstate.py View File

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


+ 91
- 0
examples/wtf.py View File

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








+ 2
- 3
tests/test_against_anders_and_briegel.py View File

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


+ 35
- 0
tests/test_fancy.py View File

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





+ 8
- 6
tests/test_measurement.py View File

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



Loading…
Cancel
Save