@@ -40,7 +40,7 @@ The complete set of aliases for single-qubit Cliffords is as follows: | |||
""" | |||
from .tables import * | |||
from tables import * | |||
# Aliases | |||
identity = by_name["identity"] | |||
@@ -108,7 +108,7 @@ class GraphState(object): | |||
>>> g.act_circuit([("hadamard", 0), ("hadamard", 1), ("cz", (0, 1))]) | |||
""" | |||
for operation, node in circuit: | |||
for node, operation in circuit: | |||
if operation == "cz": | |||
self.act_cz(*node) | |||
else: | |||
@@ -0,0 +1,54 @@ | |||
""" | |||
Mock graphs used for testing | |||
""" | |||
import numpy as np | |||
import abp | |||
from abp import GraphState, clifford, qi | |||
from numpy import random | |||
import pytest | |||
from anders_briegel import graphsim | |||
# We always run with A&B's CZ table when we are testing | |||
clifford.use_old_cz() | |||
class AndersWrapper(graphsim.GraphRegister): | |||
""" A wrapper for A&B to make the interface identical and enable equality testing """ | |||
def __init__(self, nodes): | |||
assert list(nodes) == list(range(len(nodes))) | |||
super(AndersWrapper, self).__init__(len(nodes)) | |||
def act_local_rotation(self, qubit, operation): | |||
operation = clifford.by_name[str(operation)] | |||
op = graphsim.LocCliffOp(operation) | |||
super(AndersWrapper, self).local_op(qubit, op) | |||
def act_cz(self, a, b): | |||
super(AndersWrapper, self).cphase(a, b) | |||
def measure(self, qubit, basis, force): | |||
basis = {1: graphsim.lco_X, | |||
2: graphsim.lco_Y, | |||
3: graphsim.lco_Z}[clifford.by_name[str(basis)]] | |||
return super(AndersWrapper, self).measure(qubit, basis, None, force) | |||
def __eq__(self, other): | |||
return self.to_json() == other.to_json() | |||
def act_circuit(self, circuit): | |||
for operation, node in circuit: | |||
if operation == "cz": | |||
self.act_cz(*node) | |||
else: | |||
self.act_local_rotation(node, operation) | |||
def test_circuit(circuit, n): | |||
""" Check that two classes exhibit the same behaviour for a given circuit """ | |||
a = circuit_to_state(ABPWrapper, n, circuit) | |||
b = circuit_to_state(AndersWrapper, n, circuit) | |||
assert a == b | |||
@@ -7,45 +7,10 @@ import abp | |||
from abp import GraphState, clifford, qi | |||
from numpy import random | |||
import pytest | |||
from anders_briegel import graphsim | |||
# We always run with A&B's CZ table when we are testing | |||
clifford.use_old_cz() | |||
class AndersWrapper(graphsim.GraphRegister): | |||
""" A wrapper for A&B to make the interface identical and enable equality testing """ | |||
def __init__(self, nodes): | |||
assert list(nodes) == list(range(len(nodes))) | |||
super(AndersWrapper, self).__init__(len(nodes)) | |||
def act_local_rotation(self, qubit, operation): | |||
operation = clifford.by_name[str(operation)] | |||
op = graphsim.LocCliffOp(operation) | |||
super(AndersWrapper, self).local_op(qubit, op) | |||
def act_cz(self, a, b): | |||
super(AndersWrapper, self).cphase(a, b) | |||
def measure(self, qubit, basis, force): | |||
basis = {1: graphsim.lco_X, | |||
2: graphsim.lco_Y, | |||
3: graphsim.lco_Z}[clifford.by_name[str(basis)]] | |||
return super(AndersWrapper, self).measure(qubit, basis, None, force) | |||
def __eq__(self, other): | |||
return self.to_json() == other.to_json() | |||
def act_circuit(self, circuit): | |||
for operation, node in circuit: | |||
if operation == "cz": | |||
self.act_cz(*node) | |||
else: | |||
self.act_local_rotation(node, operation) | |||
class ABPWrapper(GraphState): | |||
""" A wrapper for abp, just to ensure determinism """ | |||
@@ -103,8 +68,8 @@ def named_node_graph(): | |||
""" A graph with named nodes""" | |||
edges = (0, 1), (1, 2), (2, 0), (0, 3), (100, 200), (200, "named") | |||
g = ABPWrapper([0, 1, 2, 3, 100, 200, "named"]) | |||
g.act_circuit(("hadamard", i) for i in g.node) | |||
g.act_circuit(("cz", edge) for edge in edges) | |||
g.act_circuit((i, "hadamard") for i in g.node) | |||
g.act_circuit((edge, "cz") for edge in edges) | |||
return g | |||
@@ -112,8 +77,8 @@ def simple_graph(): | |||
""" A simple graph to test with""" | |||
edges = (0, 1), (1, 2), (2, 0), (0, 3), (100, 200) | |||
g = ABPWrapper([0, 1, 2, 3, 100, 200]) | |||
g.act_circuit(("hadamard", i) for i in g.node) | |||
g.act_circuit(("cz", edge) for edge in edges) | |||
g.act_circuit((i, "hadamard") for i in g.node) | |||
g.act_circuit((edge, "cz") for edge in edges) | |||
return g | |||
@@ -124,12 +89,6 @@ def circuit_to_state(Base, n, circuit): | |||
return g | |||
def test_circuit(circuit, n): | |||
""" Check that two classes exhibit the same behaviour for a given circuit """ | |||
a = circuit_to_state(ABPWrapper, n, circuit) | |||
b = circuit_to_state(AndersWrapper, n, circuit) | |||
assert a == b | |||
if __name__ == '__main__': | |||
for i in range(1000): | |||
@@ -3,7 +3,9 @@ import numpy as np | |||
from numpy import random | |||
import itertools as it | |||
import pytest | |||
mock = pytest.importorskip("mock") | |||
import mock | |||
ab = pytest.importorskip("ab") | |||
REPEATS = 100 | |||
DEPTH = 100 | |||
@@ -12,28 +14,28 @@ PAULIS = ("px", "py", "pz") | |||
def test_hadamard(): | |||
""" Test hadamards """ | |||
circuit = [(0, "hadamard")] | |||
mock.test_circuit(circuit, 1) | |||
ab.test_circuit(circuit, 1) | |||
def test_local_rotations(): | |||
""" Test local rotations """ | |||
for i in list(range(REPEATS)): | |||
circuit = [(0, random.choice(list(range(24)))) for j in range(DEPTH)] | |||
mock.test_circuit(circuit, 1) | |||
ab.test_circuit(circuit, 1) | |||
def test_times_table(): | |||
""" Test times table """ | |||
for i, j in it.product(list(range(24)), list(range(24))): | |||
circuit = [(0, i), (0, j)] | |||
mock.test_circuit(circuit, 1) | |||
ab.test_circuit(circuit, 1) | |||
def test_cz_table(): | |||
""" Test the CZ table """ | |||
for i, j in it.product(list(range(24)), list(range(24))): | |||
circuit = [(0, i), (1, j), ((0, 1), "cz")] | |||
mock.test_circuit(circuit, 2) | |||
ab.test_circuit(circuit, 2) | |||
def test_cz_hadamard(n=10): | |||
@@ -43,7 +45,7 @@ def test_cz_hadamard(n=10): | |||
circuit = [(mock.random_pair(n), gate) if gate == "cz" | |||
else (random.choice(list(range(n))), gate) | |||
for gate in circuit] | |||
mock.test_circuit(circuit, n) | |||
ab.test_circuit(circuit, n) | |||
def test_all(n=10): | |||
@@ -53,7 +55,7 @@ def test_all(n=10): | |||
circuit = [(mock.random_pair(n), gate) if gate == "cz" | |||
else (random.choice(list(range(n))), gate) | |||
for gate in circuit] | |||
mock.test_circuit(circuit, n) | |||
ab.test_circuit(circuit, n) | |||
def test_single_qubit_measurement(): | |||
@@ -2,8 +2,7 @@ from abp import GraphState, CircuitModel, clifford | |||
import random | |||
import numpy as np | |||
import networkx as nx | |||
import pytest | |||
mock = pytest.importorskip("mock") | |||
import mock | |||
REPEATS = 100 | |||
DEPTH = 100 | |||
@@ -1,6 +1,5 @@ | |||
import abp | |||
import pytest | |||
mock = pytest.importorskip("mock") | |||
import mock | |||
def test_json(): | |||
""" Test to_json and from_json """ | |||
@@ -1,7 +1,6 @@ | |||
from abp import GraphState | |||
from abp.util import xyz | |||
import pytest | |||
mock = pytest.importorskip("mock") | |||
import mock | |||
def linear_cluster(n): | |||
g = GraphState(list(range(n)), vop="hadamard") | |||
@@ -3,8 +3,7 @@ import networkx as nx | |||
from abp import GraphState, NXGraphState | |||
from abp import clifford | |||
from abp.util import xyz | |||
import pytest | |||
mock = pytest.importorskip("mock") | |||
import mock | |||
def test_json_basic(): | |||
@@ -1,7 +1,6 @@ | |||
import numpy as np | |||
from abp import qi, GraphState | |||
import pytest | |||
mock = pytest.importorskip("mock") | |||
import mock | |||
DEPTH = 1000 | |||
@@ -1,6 +1,7 @@ | |||
from abp import GraphState | |||
import mock | |||
import pytest | |||
mock = pytest.importorskip("mock") | |||
ab = pytest.importorskip("ab") | |||
REPEATS = 1000 | |||
@@ -9,7 +10,7 @@ def test_stabilizers_against_anders_and_briegel(n=10): | |||
for i in list(range(REPEATS)): | |||
c = mock.random_stabilizer_circuit(n) | |||
g = mock.AndersWrapper(list(range(n))) | |||
g = ab.AndersWrapper(list(range(n))) | |||
g.act_circuit(c) | |||
da = g.get_full_stabilizer().to_dictionary() | |||