Browse Source

Python3

master
Pete Shadbolt 5 years ago
parent
commit
04f8ef0f6e
14 changed files with 56 additions and 17 deletions
  1. +1
    -0
      abp/__init__.py
  2. +1
    -0
      abp/anders_cz.py
  3. +6
    -3
      abp/build_tables.py
  4. +14
    -3
      abp/clifford.py
  5. +11
    -7
      abp/graphstate.py
  6. +1
    -0
      abp/nxgraphstate.py
  7. +3
    -0
      abp/qi.py
  8. +2
    -0
      abp/stabilizer.py
  9. +1
    -0
      abp/tables.py
  10. +4
    -1
      examples/mix_graph_and_networkx.py
  11. +3
    -1
      examples/stabilizers.py
  12. +3
    -1
      examples/visualization/pull.py
  13. +4
    -0
      examples/visualization/raussendorf.py
  14. +2
    -1
      tests/test_qi.py

+ 1
- 0
abp/__init__.py View File

@@ -1,4 +1,5 @@
# Alias some stuff to make imports cleaner # Alias some stuff to make imports cleaner
from __future__ import absolute_import
from abp.graphstate import GraphState from abp.graphstate import GraphState
from abp.nxgraphstate import NXGraphState from abp.nxgraphstate import NXGraphState
from abp.qi import CircuitModel from abp.qi import CircuitModel


+ 1
- 0
abp/anders_cz.py View File

@@ -2,6 +2,7 @@
Copied from Anders' original C++ implementation Copied from Anders' original C++ implementation
S. Anders, H. J. Briegel: Fast Simulation of Stabilizer Circuits using a Graph State Formalism quant-ph/0504117 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 import numpy as np
cz_table = ((((1, 0, 0), (1, 0, 0), (1, 0, 3), (1, 0, 3), (1, 0, 5), (1, 0, 5), 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), (1, 0, 6), (1, 0, 6), (0, 3, 8), (0, 3, 8), (0, 0, 10), (0, 0, 10),


+ 6
- 3
abp/build_tables.py View File

@@ -3,12 +3,15 @@ This program computes lookup tables and stores them as tables.py and tables.js
# TODO: clifford naming discrepancy # TODO: clifford naming discrepancy
""" """


from __future__ import absolute_import
from __future__ import print_function
import numpy as np import numpy as np
import itertools as it import itertools as it
from functools import reduce from functools import reduce
from os.path import dirname, join, split from os.path import dirname, join, split
import json import json
from . import qi, clifford from . import qi, clifford
from six.moves import range




DECOMPOSITIONS = ( DECOMPOSITIONS = (
@@ -51,8 +54,8 @@ def find_cz(bond, c1, c2, commuters, state_table):
target = qi.normalize_global_phase(target) target = qi.normalize_global_phase(target)


# Choose the sets to search over # 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 # Find a match
for bondp, c1p, c2p in it.product([0, 1], s1, s2): 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 = qi.CircuitModel(1)
c.act_local_rotation(0, u) c.act_local_rotation(0, u)
state = c.state.round(2) 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(): def compute_everything():


+ 14
- 3
abp/clifford.py View File

@@ -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 # Aliases
identity = by_name["identity"] identity = by_name["identity"]
@@ -51,6 +54,15 @@ pz = by_name["pz"]
msqx_h = by_name["msqx_h"] msqx_h = by_name["msqx_h"]
sqz_h = by_name["sqz_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): def conjugate(operator, unitary):
""" Returns transform * vop * transform^dagger and a phase in {+1, -1} """ """ Returns transform * vop * transform^dagger and a phase in {+1, -1} """
return measurement_table[operator, unitary] return measurement_table[operator, unitary]
@@ -73,14 +85,13 @@ def is_diagonal(v):
""" Checks if a VOP is diagonal or not """ """ Checks if a VOP is diagonal or not """
return v in {0, 3, 5, 6} return v in {0, 3, 5, 6}



if __name__ == '__main__': if __name__ == '__main__':
from itertools import groupby from itertools import groupby


for i in range(24): for i in range(24):
members = [key for key, value in list(by_name.items()) if value == i and str(key)!=str(i)] members = [key for key, value in list(by_name.items()) if value == i and str(key)!=str(i)]
members = sorted(members, key=len) members = sorted(members, key=len)
print("* {}: {}".format(i, ", ".join(members)))
print(("* {}: {}".format(i, ", ".join(members))))





+ 11
- 7
abp/graphstate.py View File

@@ -4,12 +4,16 @@
This module implements Anders and Briegel's method for fast simulation of Clifford circuits. 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 itertools as it
import json, random import json, random
from . import qi, clifford, util from . import qi, clifford, util
import abp import abp
from .stabilizer import Stabilizer from .stabilizer import Stabilizer
import requests import requests
from six.moves import range
from six.moves import zip




class GraphState(object): class GraphState(object):
@@ -63,12 +67,12 @@ class GraphState(object):
self._del_node(node) self._del_node(node)


def _add_node(self, node, **kwargs): 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. By default, nodes are initialized with ``vop=``:math:`I`, i.e. they are in the :math:`|+\\rangle` state.
""" """
if node in self.node: if node in self.node:
print("Warning: node {} already exists".format(node))
print(("Warning: node {} already exists".format(node)))
return return


default = kwargs.get("default", "identity") default = kwargs.get("default", "identity")
@@ -91,7 +95,7 @@ class GraphState(object):


>>> g._add_node(0, label="fred", position=(1,2,3)) >>> g._add_node(0, label="fred", position=(1,2,3))
>>> g.node[0]["label"] >>> g.node[0]["label"]
fred
fred


""" """
kwargs["vop"] = clifford.by_name[ kwargs["vop"] = clifford.by_name[
@@ -500,17 +504,17 @@ class GraphState(object):
self.url = requests.get("https://abv.peteshadbolt.co.uk/").url self.url = requests.get("https://abv.peteshadbolt.co.uk/").url


data = json.dumps(self.to_json(stringify=True)) 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) return requests.post("{}/graph".format(self.url), data=data)


def pull(self, url=None): def pull(self, url=None):
""" Loads the state from the server """ """ Loads the state from the server """
if url:
if url:
self.url = url self.url = url


response = requests.get("{}/graph".format(self.url)) response = requests.get("{}/graph".format(self.url))
self.from_json(json.loads(response.content)) self.from_json(json.loads(response.content))







+ 1
- 0
abp/nxgraphstate.py View File

@@ -1,3 +1,4 @@
from __future__ import absolute_import
import networkx as nx import networkx as nx
import numpy as np import numpy as np
from . import graphstate from . import graphstate


+ 3
- 0
abp/qi.py View File

@@ -6,9 +6,12 @@ Exposes a few basic QI operators
And a circuit-model simulator And a circuit-model simulator
""" """


from __future__ import absolute_import
import numpy as np import numpy as np
import itertools as it import itertools as it
from fractions import Fraction from fractions import Fraction
from six.moves import range
from six.moves import zip


def hermitian_conjugate(u): def hermitian_conjugate(u):
""" Shortcut to the Hermitian conjugate """ """ Shortcut to the Hermitian conjugate """


+ 2
- 0
abp/stabilizer.py View File

@@ -2,8 +2,10 @@
Implements a simple Stabilizer object. Implements a simple Stabilizer object.
""" """


from __future__ import absolute_import
import itertools as it import itertools as it
from abp import clifford from abp import clifford
from six.moves import map


I = clifford.identity I = clifford.identity
X = clifford.px X = clifford.px


+ 1
- 0
abp/tables.py View File

@@ -1,3 +1,4 @@
from __future__ import absolute_import
import numpy as np import numpy as np


# Define lookup tables # Define lookup tables


+ 4
- 1
examples/mix_graph_and_networkx.py View File

@@ -1,10 +1,13 @@
from __future__ import absolute_import
from __future__ import print_function
from abp import NXGraphState from abp import NXGraphState
from abp.util import xyz from abp.util import xyz
import networkx as nx import networkx as nx
from six.moves import range


n = 10 n = 10
g = NXGraphState(list(range(n))) g = NXGraphState(list(range(n)))
nx.set_node_attributes(g, "color", "red") nx.set_node_attributes(g, "color", "red")
g.add_edges_from([i, i+1] for i in range(n-1)) g.add_edges_from([i, i+1] for i in range(n-1))
print(g.node[0]["color"])
print((g.node[0]["color"]))



+ 3
- 1
examples/stabilizers.py View File

@@ -1,3 +1,5 @@
from __future__ import absolute_import
from __future__ import print_function
from abp import GraphState from abp import GraphState


edges = (0, 1), (1, 2), (2, 0), (0, 3), (100, 200) 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) g.act_local_rotation(3, 9)


print(g.to_stabilizer())
print((g.to_stabilizer()))



+ 3
- 1
examples/visualization/pull.py View File

@@ -1,6 +1,8 @@
from __future__ import absolute_import
from __future__ import print_function
from abp import GraphState from abp import GraphState


psi = GraphState() psi = GraphState()
psi.pull("https://abv.peteshadbolt.co.uk/dakota-illinois-nuts-blue") psi.pull("https://abv.peteshadbolt.co.uk/dakota-illinois-nuts-blue")
print psi
print(psi)



+ 4
- 0
examples/visualization/raussendorf.py View File

@@ -1,9 +1,13 @@
from __future__ import absolute_import
from __future__ import print_function
from abp import GraphState from abp import GraphState
from abp.util import xyz from abp.util import xyz
import numpy as np import numpy as np
import time import time
import itertools import itertools
import networkx as nx import networkx as nx
from six.moves import map
from six.moves import zip


raussendorf_unit_cell = ( raussendorf_unit_cell = (
((1, 0, 0), (1, 1, 0)), ((0, 1, 0), (1, 1, 0)), ((1, 0, 0), (1, 1, 0)), ((0, 1, 0), (1, 1, 0)),


+ 2
- 1
tests/test_qi.py View File

@@ -1,6 +1,7 @@
import numpy as np import numpy as np
from abp import qi, GraphState from abp import qi, GraphState
import mock import mock
import pytest


DEPTH = 1000 DEPTH = 1000


@@ -125,7 +126,7 @@ def test_against_chp(n=5):
try: try:
import chp import chp
except ImportError: except ImportError:
raise nose.SkipTest("CHP is not installed")
raise pytest.skip("CHP is not installed")


def get_chp_state(): def get_chp_state():
""" Helper to convert CHP to CircuitModel """ """ Helper to convert CHP to CircuitModel """


Loading…
Cancel
Save