From 110312a89789ea12eabdb2d0b432824b1753f66d Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Wed, 31 Aug 2016 15:57:23 +0100 Subject: [PATCH] Suggested fix to `friend` issue --- abp/graphstate.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/abp/graphstate.py b/abp/graphstate.py index acb2b63..8b45327 100644 --- a/abp/graphstate.py +++ b/abp/graphstate.py @@ -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: