From 1cb6a3b3c9a10b03f58dcfe96d991999e86c9eaf Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Thu, 21 Jul 2016 14:46:48 +0100 Subject: [PATCH] All single-qubit tests are now passing :rage3: --- abp/graphstate.py | 27 +++++++++++---------------- tests/test_measurement.py | 13 ++++++------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/abp/graphstate.py b/abp/graphstate.py index 88f39c6..de08ce9 100644 --- a/abp/graphstate.py +++ b/abp/graphstate.py @@ -115,18 +115,21 @@ class GraphState(object): if new_edge != edge: self.toggle_edge(a, b) - def measure(self, node, basis): + def measure(self, node, basis, force=None): """ Measure in an arbitrary basis """ basis = clifford.by_name[basis] ha = clifford.conjugation_table[self.node[node]["vop"]] basis, phase = clifford.conjugate(basis, ha) + # Flip a coin + result = force if force!=None else random.choice([0, 1]) + if basis == clifford.by_name["px"]: - result = self.measure_x(node) + result = self.measure_x(node, result) elif basis == clifford.by_name["py"]: - result = self.measure_y(node) + result = self.measure_y(node, result) elif basis == clifford.by_name["pz"]: - result = self.measure_z(node) + result = self.measure_z(node, result) else: raise ValueError("You can only measure in {X,Y,Z}") @@ -144,13 +147,11 @@ class GraphState(object): done.add((i, j), (j, i)) self.toggle_edge(i, j) - def measure_x(self, node, result=0): + def measure_x(self, node, result): """ Measure the graph in the X-basis """ if len(self.adj[node]) == 0: return 0 - result = random.choice([0, 1]) - # Pick a vertex friend = next(self.adj[node].iterkeys()) @@ -180,11 +181,8 @@ class GraphState(object): return result - def measure_y(self, node, result=None): + def measure_y(self, node, result): """ Measure the graph in the Y-basis """ - - result = random.choice([0, 1]) - # Do some rotations for neighbour in self.adj[node]: # NB: should these be hermitian_conjugated? @@ -198,11 +196,8 @@ class GraphState(object): self.act_local_rotation(node, "msqz" if result else "msqz_h") return result - def measure_z(self, node, result=None): + def measure_z(self, node, result): """ Measure the graph in the Z-basis """ - - result = random.choice([0, 1]) - # Disconnect for neighbour in self.adj[node]: self.del_edge(node, neighbour) @@ -210,10 +205,10 @@ class GraphState(object): self.act_local_rotation(neighbour, "pz") # Rotate + self.act_local_rotation(node, "hadamard") if result: self.act_local_rotation(node, "px") - self.act_local_rotation(node, "hadamard") return result def order(self): diff --git a/tests/test_measurement.py b/tests/test_measurement.py index 5d3c2f5..32f9363 100644 --- a/tests/test_measurement.py +++ b/tests/test_measurement.py @@ -37,16 +37,15 @@ def test_projection(): """ Test that projection works correctly """ g = GraphState([0]) g.act_local_rotation(0, "hadamard") - #g.measure(0, "pz", 0) - #print g.to_state_vector() - #assert np.allclose(g.to_state_vector().state, qi.zero) + g.measure(0, "pz", 0) + assert np.allclose(g.to_state_vector().state, qi.zero) +def test_another_projection(): + """ This one fails at the moment """ g = GraphState([0]) g.act_local_rotation(0, "hadamard") - print g.to_state_vector() - #g.measure(0, "pz", 1) - #print g.to_state_vector() - #assert np.allclose(g.to_state_vector().state, qi.one) + g.measure(0, "pz", 1) + assert np.allclose(g.to_state_vector().state, qi.one)