From 04f8ef0f6e7ea913f28215943988c6f1088bff32 Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Thu, 7 Mar 2019 14:23:31 -0800 Subject: [PATCH] Python3 --- abp/__init__.py | 1 + abp/anders_cz.py | 1 + abp/build_tables.py | 9 ++++++--- abp/clifford.py | 17 ++++++++++++++--- abp/graphstate.py | 18 +++++++++++------- abp/nxgraphstate.py | 1 + abp/qi.py | 3 +++ abp/stabilizer.py | 2 ++ abp/tables.py | 1 + examples/mix_graph_and_networkx.py | 5 ++++- examples/stabilizers.py | 4 +++- examples/visualization/pull.py | 4 +++- examples/visualization/raussendorf.py | 4 ++++ tests/test_qi.py | 3 ++- 14 files changed, 56 insertions(+), 17 deletions(-) diff --git a/abp/__init__.py b/abp/__init__.py index 48827db..8d27185 100644 --- a/abp/__init__.py +++ b/abp/__init__.py @@ -1,4 +1,5 @@ # Alias some stuff to make imports cleaner +from __future__ import absolute_import from abp.graphstate import GraphState from abp.nxgraphstate import NXGraphState from abp.qi import CircuitModel diff --git a/abp/anders_cz.py b/abp/anders_cz.py index 2a121df..bf338d8 100644 --- a/abp/anders_cz.py +++ b/abp/anders_cz.py @@ -2,6 +2,7 @@ Copied from Anders' original C++ implementation S. Anders, H. J. Briegel: Fast Simulation of Stabilizer Circuits using a Graph State Formalism quant-ph/0504117 """ +from __future__ import absolute_import import numpy as np cz_table = ((((1, 0, 0), (1, 0, 0), (1, 0, 3), (1, 0, 3), (1, 0, 5), (1, 0, 5), (1, 0, 6), (1, 0, 6), (0, 3, 8), (0, 3, 8), (0, 0, 10), (0, 0, 10), diff --git a/abp/build_tables.py b/abp/build_tables.py index 0a333ca..6d6514f 100644 --- a/abp/build_tables.py +++ b/abp/build_tables.py @@ -3,12 +3,15 @@ This program computes lookup tables and stores them as tables.py and tables.js # TODO: clifford naming discrepancy """ +from __future__ import absolute_import +from __future__ import print_function import numpy as np import itertools as it from functools import reduce from os.path import dirname, join, split import json from . import qi, clifford +from six.moves import range DECOMPOSITIONS = ( @@ -51,8 +54,8 @@ def find_cz(bond, c1, c2, commuters, state_table): target = qi.normalize_global_phase(target) # Choose the sets to search over - s1 = commuters if c1 in commuters else range(24) - s2 = commuters if c2 in commuters else range(24) + s1 = commuters if c1 in commuters else list(range(24)) + s2 = commuters if c2 in commuters else list(range(24)) # Find a match for bondp, c1p, c2p in it.product([0, 1], s1, s2): @@ -173,7 +176,7 @@ def get_display_table(unitaries): c = qi.CircuitModel(1) c.act_local_rotation(0, u) state = c.state.round(2) - print("{:.2f}, {:.2f}".format(state[0][0], state[1][0])) + print(("{:.2f}, {:.2f}".format(state[0][0], state[1][0]))) def compute_everything(): diff --git a/abp/clifford.py b/abp/clifford.py index 38d0c02..4736cdf 100644 --- a/abp/clifford.py +++ b/abp/clifford.py @@ -40,7 +40,10 @@ The complete set of aliases for single-qubit Cliffords is as follows: """ -from tables import * +from __future__ import absolute_import +from __future__ import print_function +from .tables import * +from six.moves import range # Aliases identity = by_name["identity"] @@ -51,6 +54,15 @@ pz = by_name["pz"] msqx_h = by_name["msqx_h"] sqz_h = by_name["sqz_h"] +class Thing(object): + def __init__(self): + """ Constructor """ + return None + + def hunt(self): + """ Pete is cool """ + pass + def conjugate(operator, unitary): """ Returns transform * vop * transform^dagger and a phase in {+1, -1} """ return measurement_table[operator, unitary] @@ -73,14 +85,13 @@ def is_diagonal(v): """ Checks if a VOP is diagonal or not """ return v in {0, 3, 5, 6} - if __name__ == '__main__': from itertools import groupby for i in range(24): members = [key for key, value in list(by_name.items()) if value == i and str(key)!=str(i)] members = sorted(members, key=len) - print("* {}: {}".format(i, ", ".join(members))) + print(("* {}: {}".format(i, ", ".join(members)))) diff --git a/abp/graphstate.py b/abp/graphstate.py index c5500a8..5392061 100755 --- a/abp/graphstate.py +++ b/abp/graphstate.py @@ -4,12 +4,16 @@ This module implements Anders and Briegel's method for fast simulation of Clifford circuits. """ +from __future__ import absolute_import +from __future__ import print_function import itertools as it import json, random from . import qi, clifford, util import abp from .stabilizer import Stabilizer import requests +from six.moves import range +from six.moves import zip class GraphState(object): @@ -63,12 +67,12 @@ class GraphState(object): self._del_node(node) def _add_node(self, node, **kwargs): - """ Add a node. + """ Add a node. By default, nodes are initialized with ``vop=``:math:`I`, i.e. they are in the :math:`|+\\rangle` state. """ if node in self.node: - print("Warning: node {} already exists".format(node)) + print(("Warning: node {} already exists".format(node))) return default = kwargs.get("default", "identity") @@ -91,7 +95,7 @@ class GraphState(object): >>> g._add_node(0, label="fred", position=(1,2,3)) >>> g.node[0]["label"] - fred + fred """ kwargs["vop"] = clifford.by_name[ @@ -500,17 +504,17 @@ class GraphState(object): self.url = requests.get("https://abv.peteshadbolt.co.uk/").url data = json.dumps(self.to_json(stringify=True)) - print("Shared state to {}".format(self.url)) + print(("Shared state to {}".format(self.url))) return requests.post("{}/graph".format(self.url), data=data) def pull(self, url=None): """ Loads the state from the server """ - if url: + if url: self.url = url response = requests.get("{}/graph".format(self.url)) self.from_json(json.loads(response.content)) - - + + diff --git a/abp/nxgraphstate.py b/abp/nxgraphstate.py index 090b262..e926481 100644 --- a/abp/nxgraphstate.py +++ b/abp/nxgraphstate.py @@ -1,3 +1,4 @@ +from __future__ import absolute_import import networkx as nx import numpy as np from . import graphstate diff --git a/abp/qi.py b/abp/qi.py index 0ff1d6e..f7f9125 100644 --- a/abp/qi.py +++ b/abp/qi.py @@ -6,9 +6,12 @@ Exposes a few basic QI operators And a circuit-model simulator """ +from __future__ import absolute_import import numpy as np import itertools as it from fractions import Fraction +from six.moves import range +from six.moves import zip def hermitian_conjugate(u): """ Shortcut to the Hermitian conjugate """ diff --git a/abp/stabilizer.py b/abp/stabilizer.py index 7e0c38e..0cff18e 100644 --- a/abp/stabilizer.py +++ b/abp/stabilizer.py @@ -2,8 +2,10 @@ Implements a simple Stabilizer object. """ +from __future__ import absolute_import import itertools as it from abp import clifford +from six.moves import map I = clifford.identity X = clifford.px diff --git a/abp/tables.py b/abp/tables.py index fc783a0..f6e796c 100644 --- a/abp/tables.py +++ b/abp/tables.py @@ -1,3 +1,4 @@ +from __future__ import absolute_import import numpy as np # Define lookup tables diff --git a/examples/mix_graph_and_networkx.py b/examples/mix_graph_and_networkx.py index 71aed26..b56e3cc 100644 --- a/examples/mix_graph_and_networkx.py +++ b/examples/mix_graph_and_networkx.py @@ -1,10 +1,13 @@ +from __future__ import absolute_import +from __future__ import print_function from abp import NXGraphState from abp.util import xyz import networkx as nx +from six.moves import range n = 10 g = NXGraphState(list(range(n))) nx.set_node_attributes(g, "color", "red") g.add_edges_from([i, i+1] for i in range(n-1)) -print(g.node[0]["color"]) +print((g.node[0]["color"])) diff --git a/examples/stabilizers.py b/examples/stabilizers.py index 2412094..c282b54 100644 --- a/examples/stabilizers.py +++ b/examples/stabilizers.py @@ -1,3 +1,5 @@ +from __future__ import absolute_import +from __future__ import print_function from abp import GraphState edges = (0, 1), (1, 2), (2, 0), (0, 3), (100, 200) @@ -7,5 +9,5 @@ g.act_circuit((edge, "cz") for edge in edges) g.act_local_rotation(3, 9) -print(g.to_stabilizer()) +print((g.to_stabilizer())) diff --git a/examples/visualization/pull.py b/examples/visualization/pull.py index 1be1eeb..5dbc334 100644 --- a/examples/visualization/pull.py +++ b/examples/visualization/pull.py @@ -1,6 +1,8 @@ +from __future__ import absolute_import +from __future__ import print_function from abp import GraphState psi = GraphState() psi.pull("https://abv.peteshadbolt.co.uk/dakota-illinois-nuts-blue") -print psi +print(psi) diff --git a/examples/visualization/raussendorf.py b/examples/visualization/raussendorf.py index dd1eaab..e691c9b 100644 --- a/examples/visualization/raussendorf.py +++ b/examples/visualization/raussendorf.py @@ -1,9 +1,13 @@ +from __future__ import absolute_import +from __future__ import print_function from abp import GraphState from abp.util import xyz import numpy as np import time import itertools import networkx as nx +from six.moves import map +from six.moves import zip raussendorf_unit_cell = ( ((1, 0, 0), (1, 1, 0)), ((0, 1, 0), (1, 1, 0)), diff --git a/tests/test_qi.py b/tests/test_qi.py index b86593d..2c9579e 100644 --- a/tests/test_qi.py +++ b/tests/test_qi.py @@ -1,6 +1,7 @@ import numpy as np from abp import qi, GraphState import mock +import pytest DEPTH = 1000 @@ -125,7 +126,7 @@ def test_against_chp(n=5): try: import chp except ImportError: - raise nose.SkipTest("CHP is not installed") + raise pytest.skip("CHP is not installed") def get_chp_state(): """ Helper to convert CHP to CircuitModel """