| @@ -10,7 +10,6 @@ from numpy import random | |||
| # 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 """ | |||
| @@ -28,11 +27,10 @@ class AndersWrapper(graphsim.GraphRegister): | |||
| super(AndersWrapper, self).cphase(a, b) | |||
| def measure(self, qubit, basis, force): | |||
| basis = clifford.by_name[basis] | |||
| basis = {1: graphsim.lco_X, | |||
| 2: graphsim.lco_Y, | |||
| 3: graphsim.lco_Z}[clifford.by_name[basis]] | |||
| super(AndersWrapper, self).measure(qubit, basis, None, force) | |||
| 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() | |||
| @@ -55,6 +53,7 @@ class ABPWrapper(GraphState): | |||
| def __eq__(self, other): | |||
| return self.to_json() == other.to_json() | |||
| class CircuitModelWrapper(qi.CircuitModel): | |||
| def __init__(self, nodes=[]): | |||
| @@ -85,7 +84,7 @@ def random_graph_circuit(n=10): | |||
| def random_stabilizer_circuit(n=10): | |||
| """ Generate a random stabilizer state, without any VOPs """ | |||
| return random_graph_circuit(n) + \ | |||
| [(i, random.choice(range(24))) for i in range(n)] | |||
| [(i, random.choice(range(24))) for i in range(n)] | |||
| def bell_pair(): | |||
| @@ -110,16 +109,18 @@ def simple_graph(): | |||
| g.act_circuit((edge, "cz") for edge in edges) | |||
| return g | |||
| def circuit_to_state(Base, n, circuit): | |||
| """ Convert a circuit to a state, given a base class """ | |||
| g = Base(range(n)) | |||
| g.act_circuit(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) | |||
| a = circuit_to_state(ABPWrapper, n, circuit) | |||
| b = circuit_to_state(AndersWrapper, n, circuit) | |||
| assert a == b | |||
| @@ -127,4 +128,3 @@ if __name__ == '__main__': | |||
| for i in range(1000): | |||
| test_circuit(random_graph_circuit(10), 10) | |||
| test_circuit(random_stabilizer_circuit(10), 10) | |||
| @@ -1,38 +0,0 @@ | |||
| from abp import GraphState, clifford | |||
| from anders_briegel import graphsim | |||
| import numpy as np | |||
| from tqdm import tqdm | |||
| import dummy | |||
| import itertools as it | |||
| import networkx as nx | |||
| #def all_simple_graphs(filename="tests/graph5.g6"): | |||
| #""" Generate all possible simple graphs """ | |||
| #with open(filename) as f: | |||
| #for line in tqdm(f): | |||
| #yield nx.parse_graph6(line.strip()) | |||
| #def rotated(simple_graphs): | |||
| #for g in simple_graphs: | |||
| #for r in it.product(*[range(24)]*2): | |||
| #yield g, r | |||
| #print len(list(rotated(all_simple_graphs()))) | |||
| #N = 3 | |||
| #m = {1: graphsim.lco_X, 2: graphsim.lco_Y, 3: graphsim.lco_Z} | |||
| #measurements = (3, 2, 1) | |||
| #outcomes = (0, 1) | |||
| #local_ops = it.combinations_with_replacement(range(24), N) | |||
| #edge_patterns = | |||
| #print list(local_ops) | |||
| #print len(list(local_ops)) | |||
| #print list(edge_patterns) | |||
| @@ -21,6 +21,7 @@ def test_local_rotations(): | |||
| circuit = [(0, random.choice(range(24))) for j in range(DEPTH)] | |||
| mock.test_circuit(circuit, 1) | |||
| def test_times_table(): | |||
| """ Test times table """ | |||
| for i, j in it.product(range(24), range(24)): | |||
| @@ -39,18 +40,29 @@ def test_cz_hadamard(n=10): | |||
| """ Test CZs and Hadamards at random """ | |||
| for i in tqdm(range(REPEATS), desc="Testing CZ and Hadamard against A&B"): | |||
| circuit = random.choice(["cz", "hadamard"], DEPTH) | |||
| circuit = [(mock.random_pair(n), gate) if gate =="cz" | |||
| circuit = [(mock.random_pair(n), gate) if gate == "cz" | |||
| else (random.choice(range(n)), gate) | |||
| for gate in circuit] | |||
| mock.test_circuit(circuit, n) | |||
| def test_all(n=10): | |||
| """ Test everything""" | |||
| for i in tqdm(range(REPEATS), desc="Testing CZ and Hadamard against A&B"): | |||
| circuit = random.choice(["cz"]*10 + range(24), DEPTH) | |||
| circuit = [(mock.random_pair(n), gate) if gate =="cz" | |||
| circuit = random.choice(["cz"] * 10 + range(24), DEPTH) | |||
| circuit = [(mock.random_pair(n), gate) if gate == "cz" | |||
| else (random.choice(range(n)), gate) | |||
| for gate in circuit] | |||
| mock.test_circuit(circuit, n) | |||
| def test_single_qubit_measurement(): | |||
| """ Check that single qubits work """ | |||
| space = it.product(range(24), ("px", "py", "pz"), (0, 1)) | |||
| for rotation, measurement, outcome in tqdm(space, "Testing single qubit measurements"): | |||
| a = mock.circuit_to_state(mock.ABPWrapper, 1, [(0, rotation)]) | |||
| b = mock.circuit_to_state(mock.AndersWrapper, 1, [(0, rotation)]) | |||
| result_a = a.measure(0, measurement, outcome) | |||
| result_b = b.measure(0, measurement, outcome) | |||
| assert result_a == result_b | |||
| assert a == b | |||