瀏覽代碼

Think I just did something right

master
Pete Shadbolt 9 年之前
父節點
當前提交
9623abfa10
共有 6 個檔案被更改,包括 144 行新增13 行删除
  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 查看文件

@@ -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 查看文件

@@ -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 查看文件

@@ -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 查看文件

@@ -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 查看文件

@@ -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 查看文件

@@ -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…
取消
儲存