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.ws.close()
#self.connect_to_server() #self.connect_to_server()


def layout(self, dim=3):
def layout(self, dim=2):
""" Automatically lay out the graph """ """ Automatically lay out the graph """
pos = networkx.spring_layout(self, dim, scale=np.sqrt(self.order())) pos = networkx.spring_layout(self, dim, scale=np.sqrt(self.order()))
middle = np.average(pos.values(), axis=0) middle = np.average(pos.values(), axis=0)
pos = {key: value - middle for key, value in pos.items()} 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): def add_vops(self):
""" Automatically add vops if they're not present """ """ 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): def remove_vop(self, a, avoid):
""" Reduces VOP[a] to the identity """ """ Reduces VOP[a] to the identity """
others = set(self.adj[a]) - {avoid} 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"]]): for v in reversed(clifford.decompositions[self.node[a]["vop"]]):
if v == "x": if v == "x":
@@ -256,6 +259,7 @@ class GraphState(object):


def to_stabilizer(self): def to_stabilizer(self):
""" Get the stabilizer of this graph """ """ Get the stabilizer of this graph """
return
output = {a: {} for a in self.node} output = {a: {} for a in self.node}
for a, b in it.product(self.node, self.node): for a, b in it.product(self.node, self.node):
if a == b: 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 CircuitModel
from abp import clifford from abp import clifford
import random import random
from copy import deepcopy
import numpy as np import numpy as np
from tqdm import tqdm from tqdm import tqdm
from abp.anders_cz import cz_table as abczt 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) assert_equal(a, b)


def test_cz_hadamard(N=20):
def _test_cz_hadamard(N=10):
""" Test CZs and Hadamards at random """ """ Test CZs and Hadamards at random """


clifford.use_old_cz() 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""" """ Test everything"""


clifford.use_old_cz() 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) a.cphase(q, q+1)
b.act_cz(q, q+1) b.act_cz(q, q+1)
else: 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