From 1673cf1bda107f2890933f5141f1552e21c88e50 Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Thu, 25 Aug 2016 22:09:02 +0100 Subject: [PATCH 1/2] Remove lattices.py --- abp/lattices.py | 61 ------------------------------------------------- 1 file changed, 61 deletions(-) delete mode 100644 abp/lattices.py diff --git a/abp/lattices.py b/abp/lattices.py deleted file mode 100644 index a1b4bb7..0000000 --- a/abp/lattices.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -This is a sketch of a consistent language for defining resource states and lattices. -""" - -import networkx as nx -from abp.fancy import GraphState - -def union(*graphs): - """ Assumes that all graphs are completely independent and uniquely labelled """ - output = nx.Graph() - output.node = dict(i for g in graphs for i in g.node.items()) - output.adj = dict(i for g in graphs for i in g.adj.items()) - return output - -def relabel(g, label): - """ Shorthand relabel """ - return nx.relabel_nodes(g, lambda x: (label, x)) - -def fuse(psi, na, nb): - """ Deterministic fusion for testing purposes """ - neighbors_a, neighbors_b = psi.neighbors(na), psi.neighbors(nb) - new_edges = ((i, j) for i in neighbors_a for j in neighbors_b if i != j) - psi.add_edges_from(new_edges) - psi.remove_nodes_from((na, nb)) - return psi - -def ghz(label): - """ A 3-GHZ state """ - psi = nx.Graph(((0, 1), (1, 2))) - return relabel(psi, label) - -def microcluster(label): - """ A microcluster """ - psi = union(ghz(0), ghz(1), ghz(2)) - psi = fuse(psi, (0, 1), (1, 0)) - psi = fuse(psi, (1, 2), (2, 1)) - return relabel(psi, label) - -def unit_cell(label): - """ A simple ring-like unit cell """ - psi = union(microcluster(0), microcluster(1), microcluster(2), microcluster(3)) - psi = fuse(psi, (0, (0, 2)), (1, (2, 2))) - psi = fuse(psi, (1, (0, 2)), (2, (2, 2))) - psi = fuse(psi, (2, (0, 2)), (3, (2, 2))) - psi = fuse(psi, (3, (0, 2)), (0, (2, 2))) - return relabel(psi, label) - -def position(node): - print node - return {} - -def annotate(g, f): - """ Annotate a graph """ - for node in g.nodes(): - g.node[node].update(f(node)) - -if __name__ == '__main__': - psi = union(unit_cell((0, 0)), unit_cell((2, 0))) - annotate(psi, position) - g = GraphState(psi) - From 110312a89789ea12eabdb2d0b432824b1753f66d Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Wed, 31 Aug 2016 15:57:23 +0100 Subject: [PATCH 2/2] 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: