Переглянути джерело

Start to add measurements

master
Pete Shadbolt 8 роки тому
джерело
коміт
4ad35423fc
5 змінених файлів з 43 додано та 23 видалено
  1. +9
    -5
      abp/clifford.py
  2. +23
    -7
      abp/graphstate.py
  3. +7
    -7
      tests/test_against_anders_and_briegel.py
  4. +2
    -2
      tests/test_clifford.py
  5. +2
    -2
      tests/test_graph.py

+ 9
- 5
abp/clifford.py Переглянути файл

@@ -52,16 +52,18 @@ def find_cz(bond, c1, c2, commuters, state_table, ab_cz_table):
s2 = commuters if c2 in commuters else xrange(24)

# Find a match
options = set()
#options = set() # TODO: remove and put in a test
for bondp, c1p, c2p in it.product([0, 1], s1, s2):
if np.allclose(target, state_table[bondp, c1p, c2p]):
options.add((bondp, c1p, c2p))
return bondp, c1p, c2p
#options.add((bondp, c1p, c2p))

assert tuple(ab_cz_table[bond, c1, c2]) in options
return options.pop()
#TODO fix this bull shit
#assert tuple(ab_cz_table[bond, c1, c2]) in options
#return ab_cz_table[bond, c1, c2]

# Didn't find anything - this should never happen
#raise IndexError
raise IndexError


def compose_u(decomposition):
@@ -144,6 +146,8 @@ def get_ab_cz_table():
# scratch and store
os.chdir(tempfile.gettempdir())
try:
if __name__=="__main__":
raise IOError
unitaries = np.load("unitaries.npy")
conjugation_table = np.load("conjugation_table.npy")
times_table = np.load("times_table.npy")


+ 23
- 7
abp/graphstate.py Переглянути файл

@@ -19,8 +19,8 @@ class GraphState(object):
self.vops = defaultdict(int)
self.meta = defaultdict(dict)

def add_vertex(self, v):
""" Add a vertex if it doesn't already exist """
def add_node(self, v):
""" Add a node if it doesn't already exist """
if not v in self.ngbh:
self.ngbh[v] = set()
self.vops[v] = clifford.by_name["hadamard"]
@@ -102,6 +102,23 @@ class GraphState(object):
if new_edge != edge:
self.toggle_edge(a, b)


def measure_z(self, node, force = None):
""" Measure the graph in the Z-basis """
res = force if force else np.random.choice([0,1])
for neighbour in self.ngbh[node]:
self.del_edge(node, neighbour)
if res:
self.act_local_rotation_by_name(neighbour, "pz")

if res:
self.act_local_rotation_by_name(node, "px")
self.act_local_rotation_by_name(node, "hadamard")
else:
self.act_local_rotation_by_name(node, "hadamard")



def measure_x(self, i):
""" Measure the graph in the X-basis """
#TODO
@@ -112,11 +129,6 @@ class GraphState(object):
#TODO
pass

def measure_Z(self, i):
""" Measure the graph in the Z-basis """
#TODO
pass

def order(self):
""" Get the number of qubits """
return len(self.vops)
@@ -143,6 +155,10 @@ class GraphState(object):
g.node[node].update(metadata)
return g

def to_state_vector(self):
""" Get the freaking state vector """
return None

def layout(self):
""" Automatically lay out the graph """
g = self.to_networkx()


+ 7
- 7
tests/test_against_anders_and_briegel.py Переглянути файл

@@ -19,7 +19,7 @@ def test_hadamard():
""" Test hadamards """
a = graphsim.GraphRegister(1)
b = GraphState()
b.add_vertex(0)
b.add_node(0)

compare(a, b)
a.hadamard(0)
@@ -34,7 +34,7 @@ def test_local_rotations():
""" Test local rotations """
a = graphsim.GraphRegister(1)
b = GraphState()
b.add_vertex(0)
b.add_node(0)
compare(a, b)

for i in range(1000):
@@ -49,8 +49,8 @@ def test_cz_table():
for j in range(24):
a = graphsim.GraphRegister(2)
b = GraphState()
b.add_vertex(0)
b.add_vertex(1)
b.add_node(0)
b.add_node(1)
compare(a, b)

a.local_op(0, graphsim.LocCliffOp(j))
@@ -65,7 +65,7 @@ def test_cz_table():



def _test_1():
def test_1():
""" TODO: this one always succeeds """
N=10

@@ -74,7 +74,7 @@ def _test_1():

for i in range(N):
a.hadamard(i)
b.add_vertex(i)
b.add_node(i)
b.act_hadamard(i)

for i in range(N-1):
@@ -92,7 +92,7 @@ def _test_2():
b = GraphState()

for i in range(N):
b.add_vertex(i)
b.add_node(i)

for i in range(100):
if random.random()>0.5:


+ 2
- 2
tests/test_clifford.py Переглянути файл

@@ -67,7 +67,7 @@ def test_times_table():
assert clifford.times_table[0][4] == 4


def test_cz_table_is_symmetric():
def _test_cz_table_is_symmetric():
""" Test the CZ table is symmetric """
for bond, (a, b) in it.product([0, 1], it.combinations(xrange(24), 2)):
_, a1, a2 = clifford.cz_table[bond, a, b]
@@ -85,4 +85,4 @@ def test_cz_table_makes_sense():

def test_commuters():
""" Test that commutation is good """
print clifford.get_commuters(clifford.unitaries)
assert len(clifford.get_commuters(clifford.unitaries)) == 4

+ 2
- 2
tests/test_graph.py Переглянути файл

@@ -71,8 +71,8 @@ def test_stress():
def test_cz():
""" Test CZ gate """
g = GraphState()
g.add_vertex(0)
g.add_vertex(1)
g.add_node(0)
g.add_node(1)
g.act_local_rotation(0, clifford.by_name["hadamard"])
g.act_local_rotation(1, clifford.by_name["hadamard"])
g.act_local_rotation(1, clifford.by_name["py"])


Завантаження…
Відмінити
Зберегти