|
|
@@ -196,11 +196,13 @@ class GraphState(object): |
|
|
|
if new_edge != edge: |
|
|
|
self._toggle_edge(a, b) |
|
|
|
|
|
|
|
def measure(self, node, basis, force=None, detail=False): |
|
|
|
def measure(self, node, basis, force=None, detail=False, friend=None): |
|
|
|
""" Measure in an arbitrary basis |
|
|
|
|
|
|
|
:param node: The name of the qubit to measure. |
|
|
|
:param basis: The basis in which to measure. |
|
|
|
:param friend: Specify a node to toggle about when performing an :math:`X` measurement. |
|
|
|
:type friend: Any neighbour of ``node``. |
|
|
|
:type basis: :math:`\in` ``{"px", "py", "pz"}`` |
|
|
|
:param force: Forces the measurement outcome. |
|
|
|
:type force: boolean |
|
|
@@ -230,7 +232,7 @@ class GraphState(object): |
|
|
|
result = not result |
|
|
|
|
|
|
|
if basis == clifford.px: |
|
|
|
result, determinate = self._measure_graph_x(node, result) |
|
|
|
result, determinate = self._measure_graph_x(node, result, friend) |
|
|
|
elif basis == clifford.py: |
|
|
|
result, determinate = self._measure_graph_y(node, result) |
|
|
|
elif basis == clifford.pz: |
|
|
@@ -252,7 +254,7 @@ class GraphState(object): |
|
|
|
else: |
|
|
|
return int(result) |
|
|
|
|
|
|
|
def measure_x(self, node, force=None, detail=False): |
|
|
|
def measure_x(self, node, force=None, detail=False, friend=None): |
|
|
|
""" Measure in the X basis |
|
|
|
|
|
|
|
:param node: The name of the qubit to measure. |
|
|
@@ -260,9 +262,11 @@ class GraphState(object): |
|
|
|
:type force: boolean |
|
|
|
:param detail: Provide detailed information |
|
|
|
:type detail: boolean |
|
|
|
:param friend: Specify a node to toggle about |
|
|
|
:type friend: Any neighbour of ``node``. |
|
|
|
|
|
|
|
""" |
|
|
|
return self.measure(node, "px", force, detail) |
|
|
|
return self.measure(node, "px", force, detail, friend) |
|
|
|
|
|
|
|
def measure_y(self, node, force=None, detail=False): |
|
|
|
""" Measure in the Y basis |
|
|
@@ -299,16 +303,19 @@ class GraphState(object): |
|
|
|
done.add((j, i)) |
|
|
|
self._toggle_edge(i, j) |
|
|
|
|
|
|
|
def _measure_graph_x(self, node, result): |
|
|
|
def _measure_graph_x(self, node, result, friend=None): |
|
|
|
""" Measure the bare graph in the X-basis """ |
|
|
|
if len(self.adj[node]) == 0: |
|
|
|
return 0, True |
|
|
|
|
|
|
|
# Pick a vertex |
|
|
|
if self.deterministic: |
|
|
|
friend = sorted(self.adj[node].keys())[0] |
|
|
|
# Pick a friend vertex |
|
|
|
if friend == None: |
|
|
|
if self.deterministic: |
|
|
|
friend = sorted(self.adj[node].keys())[0] |
|
|
|
else: |
|
|
|
friend = next(self.adj[node].iterkeys()) |
|
|
|
else: |
|
|
|
friend = next(self.adj[node].iterkeys()) |
|
|
|
assert friend in self.adj[node].keys() # TODO: unnecessary assert |
|
|
|
|
|
|
|
# Update the VOPs. TODO: pretty ugly |
|
|
|
if result: |
|
|
|