| @@ -40,7 +40,7 @@ The complete set of aliases for single-qubit Cliffords is as follows: | |||||
| """ | """ | ||||
| from .tables import * | |||||
| from tables import * | |||||
| # Aliases | # Aliases | ||||
| identity = by_name["identity"] | identity = by_name["identity"] | ||||
| @@ -108,7 +108,7 @@ class GraphState(object): | |||||
| >>> g.act_circuit([("hadamard", 0), ("hadamard", 1), ("cz", (0, 1))]) | >>> g.act_circuit([("hadamard", 0), ("hadamard", 1), ("cz", (0, 1))]) | ||||
| """ | """ | ||||
| for operation, node in circuit: | |||||
| for node, operation in circuit: | |||||
| if operation == "cz": | if operation == "cz": | ||||
| self.act_cz(*node) | self.act_cz(*node) | ||||
| else: | 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 abp import GraphState, clifford, qi | ||||
| from numpy import random | from numpy import random | ||||
| import pytest | import pytest | ||||
| from anders_briegel import graphsim | |||||
| # We always run with A&B's CZ table when we are testing | # We always run with A&B's CZ table when we are testing | ||||
| clifford.use_old_cz() | 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): | class ABPWrapper(GraphState): | ||||
| """ A wrapper for abp, just to ensure determinism """ | """ A wrapper for abp, just to ensure determinism """ | ||||
| @@ -103,8 +68,8 @@ def named_node_graph(): | |||||
| """ A graph with named nodes""" | """ A graph with named nodes""" | ||||
| edges = (0, 1), (1, 2), (2, 0), (0, 3), (100, 200), (200, "named") | edges = (0, 1), (1, 2), (2, 0), (0, 3), (100, 200), (200, "named") | ||||
| g = ABPWrapper([0, 1, 2, 3, 100, 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 | return g | ||||
| @@ -112,8 +77,8 @@ def simple_graph(): | |||||
| """ A simple graph to test with""" | """ A simple graph to test with""" | ||||
| edges = (0, 1), (1, 2), (2, 0), (0, 3), (100, 200) | edges = (0, 1), (1, 2), (2, 0), (0, 3), (100, 200) | ||||
| g = ABPWrapper([0, 1, 2, 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 | return g | ||||
| @@ -124,12 +89,6 @@ def circuit_to_state(Base, n, circuit): | |||||
| return g | 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__': | if __name__ == '__main__': | ||||
| for i in range(1000): | for i in range(1000): | ||||
| @@ -3,7 +3,9 @@ import numpy as np | |||||
| from numpy import random | from numpy import random | ||||
| import itertools as it | import itertools as it | ||||
| import pytest | import pytest | ||||
| mock = pytest.importorskip("mock") | |||||
| import mock | |||||
| ab = pytest.importorskip("ab") | |||||
| REPEATS = 100 | REPEATS = 100 | ||||
| DEPTH = 100 | DEPTH = 100 | ||||
| @@ -12,28 +14,28 @@ PAULIS = ("px", "py", "pz") | |||||
| def test_hadamard(): | def test_hadamard(): | ||||
| """ Test hadamards """ | """ Test hadamards """ | ||||
| circuit = [(0, "hadamard")] | circuit = [(0, "hadamard")] | ||||
| mock.test_circuit(circuit, 1) | |||||
| ab.test_circuit(circuit, 1) | |||||
| def test_local_rotations(): | def test_local_rotations(): | ||||
| """ Test local rotations """ | """ Test local rotations """ | ||||
| for i in list(range(REPEATS)): | for i in list(range(REPEATS)): | ||||
| circuit = [(0, random.choice(list(range(24)))) for j in range(DEPTH)] | 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(): | def test_times_table(): | ||||
| """ Test times table """ | """ Test times table """ | ||||
| for i, j in it.product(list(range(24)), list(range(24))): | for i, j in it.product(list(range(24)), list(range(24))): | ||||
| circuit = [(0, i), (0, j)] | circuit = [(0, i), (0, j)] | ||||
| mock.test_circuit(circuit, 1) | |||||
| ab.test_circuit(circuit, 1) | |||||
| def test_cz_table(): | def test_cz_table(): | ||||
| """ Test the CZ table """ | """ Test the CZ table """ | ||||
| for i, j in it.product(list(range(24)), list(range(24))): | for i, j in it.product(list(range(24)), list(range(24))): | ||||
| circuit = [(0, i), (1, j), ((0, 1), "cz")] | circuit = [(0, i), (1, j), ((0, 1), "cz")] | ||||
| mock.test_circuit(circuit, 2) | |||||
| ab.test_circuit(circuit, 2) | |||||
| def test_cz_hadamard(n=10): | 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" | circuit = [(mock.random_pair(n), gate) if gate == "cz" | ||||
| else (random.choice(list(range(n))), gate) | else (random.choice(list(range(n))), gate) | ||||
| for gate in circuit] | for gate in circuit] | ||||
| mock.test_circuit(circuit, n) | |||||
| ab.test_circuit(circuit, n) | |||||
| def test_all(n=10): | def test_all(n=10): | ||||
| @@ -53,7 +55,7 @@ def test_all(n=10): | |||||
| circuit = [(mock.random_pair(n), gate) if gate == "cz" | circuit = [(mock.random_pair(n), gate) if gate == "cz" | ||||
| else (random.choice(list(range(n))), gate) | else (random.choice(list(range(n))), gate) | ||||
| for gate in circuit] | for gate in circuit] | ||||
| mock.test_circuit(circuit, n) | |||||
| ab.test_circuit(circuit, n) | |||||
| def test_single_qubit_measurement(): | def test_single_qubit_measurement(): | ||||
| @@ -2,8 +2,7 @@ from abp import GraphState, CircuitModel, clifford | |||||
| import random | import random | ||||
| import numpy as np | import numpy as np | ||||
| import networkx as nx | import networkx as nx | ||||
| import pytest | |||||
| mock = pytest.importorskip("mock") | |||||
| import mock | |||||
| REPEATS = 100 | REPEATS = 100 | ||||
| DEPTH = 100 | DEPTH = 100 | ||||
| @@ -1,6 +1,5 @@ | |||||
| import abp | import abp | ||||
| import pytest | |||||
| mock = pytest.importorskip("mock") | |||||
| import mock | |||||
| def test_json(): | def test_json(): | ||||
| """ Test to_json and from_json """ | """ Test to_json and from_json """ | ||||
| @@ -1,7 +1,6 @@ | |||||
| from abp import GraphState | from abp import GraphState | ||||
| from abp.util import xyz | from abp.util import xyz | ||||
| import pytest | |||||
| mock = pytest.importorskip("mock") | |||||
| import mock | |||||
| def linear_cluster(n): | def linear_cluster(n): | ||||
| g = GraphState(list(range(n)), vop="hadamard") | g = GraphState(list(range(n)), vop="hadamard") | ||||
| @@ -3,8 +3,7 @@ import networkx as nx | |||||
| from abp import GraphState, NXGraphState | from abp import GraphState, NXGraphState | ||||
| from abp import clifford | from abp import clifford | ||||
| from abp.util import xyz | from abp.util import xyz | ||||
| import pytest | |||||
| mock = pytest.importorskip("mock") | |||||
| import mock | |||||
| def test_json_basic(): | def test_json_basic(): | ||||
| @@ -1,7 +1,6 @@ | |||||
| import numpy as np | import numpy as np | ||||
| from abp import qi, GraphState | from abp import qi, GraphState | ||||
| import pytest | |||||
| mock = pytest.importorskip("mock") | |||||
| import mock | |||||
| DEPTH = 1000 | DEPTH = 1000 | ||||
| @@ -1,6 +1,7 @@ | |||||
| from abp import GraphState | from abp import GraphState | ||||
| import mock | |||||
| import pytest | import pytest | ||||
| mock = pytest.importorskip("mock") | |||||
| ab = pytest.importorskip("ab") | |||||
| REPEATS = 1000 | REPEATS = 1000 | ||||
| @@ -9,7 +10,7 @@ def test_stabilizers_against_anders_and_briegel(n=10): | |||||
| for i in list(range(REPEATS)): | for i in list(range(REPEATS)): | ||||
| c = mock.random_stabilizer_circuit(n) | c = mock.random_stabilizer_circuit(n) | ||||
| g = mock.AndersWrapper(list(range(n))) | |||||
| g = ab.AndersWrapper(list(range(n))) | |||||
| g.act_circuit(c) | g.act_circuit(c) | ||||
| da = g.get_full_stabilizer().to_dictionary() | da = g.get_full_stabilizer().to_dictionary() | ||||