| @@ -97,9 +97,10 @@ def named_node_graph(): | |||
| g.act_circuit((edge, "cz") for edge in edges) | |||
| return g | |||
| def simple_graph(): | |||
| """ 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.act_circuit((i, "hadamard") for i in g.node) | |||
| g.act_circuit((edge, "cz") for edge in edges) | |||
| @@ -1,77 +0,0 @@ | |||
| from abp import GraphState | |||
| from abp import clifford | |||
| from demograph import demograph | |||
| import time | |||
| def test_graph_basic(): | |||
| """ Test that we can construct graphs, delete edges, whatever """ | |||
| g = demograph() | |||
| assert set(g.adj[0].keys()) == set([1, 2, 3]) | |||
| g.del_edge(0, 1) | |||
| assert set(g.adj[0].keys()) == set([2, 3]) | |||
| assert g.has_edge(1, 2) | |||
| assert not g.has_edge(0, 1) | |||
| def test_local_complementation(): | |||
| """ Test that local complementation works as expected """ | |||
| g = demograph() | |||
| g.local_complementation(0) | |||
| assert g.has_edge(0, 1) | |||
| assert g.has_edge(0, 2) | |||
| assert not g.has_edge(1, 2) | |||
| assert g.has_edge(3, 2) | |||
| assert g.has_edge(3, 1) | |||
| # TODO: test VOP conditions | |||
| def test_remove_vop(): | |||
| """ Test that removing VOPs really works """ | |||
| g = demograph() | |||
| g.remove_vop(0, 1) | |||
| assert g.node[0]["vop"] == clifford.by_name["identity"] | |||
| g.remove_vop(1, 1) | |||
| assert g.node[1]["vop"] == clifford.by_name["identity"] | |||
| g.remove_vop(2, 1) | |||
| assert g.node[2]["vop"] == clifford.by_name["identity"] | |||
| g.remove_vop(0, 1) | |||
| assert g.node[0]["vop"] == clifford.by_name["identity"] | |||
| def test_edgelist(): | |||
| """ Test making edgelists """ | |||
| g = demograph() | |||
| el = g.edgelist() | |||
| assert (0, 3) in el | |||
| assert (0, 2) in el | |||
| assert (100, 200) in el | |||
| def test_stress(n = int(1e5)): | |||
| """ Testing that making a graph of ten thousand qubits takes less than half a second""" | |||
| g = GraphState(range(n+1)) | |||
| t = time.clock() | |||
| for i in xrange(n): | |||
| g.add_edge(i, i + 1) | |||
| assert time.clock() - t < .5 | |||
| def test_cz(): | |||
| """ Test CZ gate """ | |||
| g = GraphState([0, 1]) | |||
| g.act_local_rotation(0, clifford.by_name["hadamard"]) | |||
| g.act_local_rotation(1, clifford.by_name["hadamard"]) | |||
| g.act_local_rotation(1, clifford.by_name["py"]) | |||
| assert not g.has_edge(0, 1) | |||
| g.act_cz(0, 1) | |||
| assert g.has_edge(0, 1) | |||
| def test_stabilizer(): | |||
| """ Test that we can generate stabilizers okay """ | |||
| g = demograph() | |||
| stab = g.to_stabilizer() | |||
| #TODO: sux | |||
| #assert len(stab.split("\n")) == g.order() | |||
| @@ -1,24 +0,0 @@ | |||
| from abp import GraphState, fancy | |||
| from abp import clifford | |||
| from demograph import demograph | |||
| import time | |||
| import json | |||
| def test_json_basic(): | |||
| """ Test that we can export to JSON """ | |||
| g = demograph() | |||
| js = g.to_json() | |||
| assert "adj" in js | |||
| assert "node" in js | |||
| e = GraphState() | |||
| def test_tuple_keys(): | |||
| """ Test that we can write tuple-ish keys """ | |||
| g = fancy.GraphState() | |||
| g.add_node("string") | |||
| g.add_node((1, 2, 3)) | |||
| g.add_edge((1, 2, 3), "string") | |||
| print json.dumps(g.to_json(True)) | |||
| @@ -1,17 +0,0 @@ | |||
| from demograph import demograph | |||
| #TODO | |||
| def _test_nx_convert(): | |||
| g = demograph() | |||
| n = g.to_networkx() | |||
| assert len(g.ngbh) == len(n.edge) | |||
| assert len(g.vops) == len(n.node) | |||
| def _test_layout(): | |||
| g = demograph() | |||
| g.layout() | |||
| assert len(g.meta) == len(g.vops) | |||
| assert "pos" in g.meta[0] | |||
| assert "x" in g.meta[0]["pos"] | |||
| @@ -1,24 +0,0 @@ | |||
| from abp.fancy import GraphState | |||
| from abp import qi | |||
| def test_local_comp(): | |||
| """ Test that local complementation works okay """ | |||
| psi = GraphState() | |||
| psi.add_node(0) | |||
| psi.add_node(1) | |||
| psi.add_node(2) | |||
| psi.add_node(3) | |||
| for n in psi.node: | |||
| psi.act_hadamard(n) | |||
| psi.act_cz(0, 1) | |||
| psi.act_cz(0, 3) | |||
| psi.act_cz(1, 3) | |||
| psi.act_cz(1, 2) | |||
| before = psi.copy() | |||
| psi.local_complementation(1) | |||
| assert before.edgelist() != psi.edgelist() | |||
| assert before.to_state_vector() == psi.to_state_vector() | |||
| @@ -1,11 +0,0 @@ | |||
| from abp import clifford | |||
| from abp import qi | |||
| import numpy as np | |||
| def test_normalize_global_phase(): | |||
| for i in range(10): | |||
| u = qi.pz | |||
| phase = np.random.uniform(0, 2*np.pi) | |||
| m = np.exp(1j*phase) * u | |||
| normalized = qi.normalize_global_phase(m) | |||
| assert np.allclose(normalized, u) | |||
| @@ -1,12 +0,0 @@ | |||
| from abp.graphstate import GraphState | |||
| from abp.util import xyz | |||
| import networkx as nx | |||
| def simple_test(): | |||
| g = GraphState() | |||
| g.add_node(0, position = xyz(10, 0, 0)) | |||
| g.add_node(1, position = xyz(1, 0, 0)) | |||
| g.act_hadamard(0) | |||
| g.act_hadamard(1) | |||
| g.act_cz(0, 1) | |||
| @@ -0,0 +1,36 @@ | |||
| import json | |||
| import networkx as nx | |||
| from abp import GraphState, fancy | |||
| from abp import clifford | |||
| from abp.util import xyz | |||
| from mock import simple_graph | |||
| def test_json_basic(): | |||
| """ Test that we can export to JSON """ | |||
| g = simple_graph() | |||
| js = g.to_json() | |||
| assert "adj" in js | |||
| assert "node" in js | |||
| def test_tuple_keys(): | |||
| """ Test that we can use tuple-ish keys """ | |||
| g = fancy.GraphState() | |||
| g.add_node("string") | |||
| g.add_node((1, 2, 3)) | |||
| g.add_edge((1, 2, 3), "string") | |||
| json.dumps(g.to_json(True)) | |||
| def networkx_test(): | |||
| """ Test that fancy graph states really behave like networkx graphs """ | |||
| g = fancy.GraphState() | |||
| g.add_node(0, position = xyz(10, 0, 0)) | |||
| g.add_node(1, position = xyz(1, 0, 0)) | |||
| g.act_hadamard(0) | |||
| g.act_hadamard(1) | |||
| g.act_cz(0, 1) | |||
| g.copy() | |||
| # TODO: more tests here! | |||
| @@ -1,7 +1,12 @@ | |||
| from abp import GraphState | |||
| from abp import GraphState, CircuitModel, clifford | |||
| from abp import clifford | |||
| from mock import simple_graph | |||
| import time | |||
| import random | |||
| import numpy as np | |||
| from tqdm import tqdm | |||
| REPEATS = 100 | |||
| DEPTH = 100 | |||
| def test_graph_basic(): | |||
| @@ -51,6 +56,7 @@ def test_edgelist(): | |||
| def test_stress(n = int(1e5)): | |||
| """ Testing that making a graph of ten thousand qubits takes less than half a second""" | |||
| import time | |||
| g = GraphState(range(n+1)) | |||
| t = time.clock() | |||
| for i in xrange(n): | |||
| @@ -74,3 +80,101 @@ def test_stabilizer(): | |||
| stab = g.to_stabilizer() | |||
| #TODO | |||
| def test_local_complementation(): | |||
| """ Test that local complementation works okay """ | |||
| psi = GraphState() | |||
| psi.add_node(0) | |||
| psi.add_node(1) | |||
| psi.add_node(2) | |||
| psi.add_node(3) | |||
| for n in psi.node: | |||
| psi.act_hadamard(n) | |||
| psi.act_cz(0, 1) | |||
| psi.act_cz(0, 3) | |||
| psi.act_cz(1, 3) | |||
| psi.act_cz(1, 2) | |||
| old_edges = psi.edgelist() | |||
| old_state = psi.to_state_vector() | |||
| psi.local_complementation(1) | |||
| assert old_edges != psi.edgelist() | |||
| assert old_state == psi.to_state_vector() | |||
| def test_single_qubit(): | |||
| """ A multi qubit test with Hadamards only""" | |||
| for repeat in tqdm(range(REPEATS), desc="Testing against circuit model"): | |||
| g = GraphState([0]) | |||
| c = CircuitModel(1) | |||
| for i in range(100): | |||
| op = np.random.choice(range(24)) | |||
| g.act_local_rotation(0, op) | |||
| c.act_local_rotation(0, clifford.unitaries[op]) | |||
| assert g.to_state_vector() == c | |||
| def test_hadamard_only_multiqubit(n=6): | |||
| """ A multi qubit test with Hadamards only""" | |||
| for repeat in tqdm(range(REPEATS), desc="Testing against circuit model"): | |||
| g = GraphState(range(n)) | |||
| c = CircuitModel(n) | |||
| for i in range(n): | |||
| g.act_hadamard(i) | |||
| c.act_hadamard(i) | |||
| assert g.to_state_vector() == c | |||
| for i in range(100): | |||
| a, b = np.random.choice(range(n), 2, False) | |||
| g.act_cz(a, b) | |||
| c.act_cz(a, b) | |||
| assert g.to_state_vector() == c | |||
| def test_all_multiqubit(n=4): | |||
| """ A multi qubit test with arbitrary local rotations """ | |||
| g = GraphState(range(n)) | |||
| c = CircuitModel(n) | |||
| for i in range(10): | |||
| qubit = np.random.randint(0, n - 1) | |||
| rotation = np.random.randint(0, 24 - 1) | |||
| g.act_local_rotation(qubit, rotation) | |||
| c.act_local_rotation(qubit, clifford.unitaries[rotation]) | |||
| assert g.to_state_vector() == c | |||
| for repeat in tqdm(range(REPEATS), desc="Testing against circuit model"): | |||
| a, b = np.random.choice(range(n), 2, False) | |||
| g.act_cz(a, b) | |||
| c.act_cz(a, b) | |||
| assert np.allclose(np.sum(np.abs(c.state) ** 2), 1) | |||
| assert np.allclose( | |||
| np.sum(np.abs(g.to_state_vector().state) ** 2), 1) | |||
| assert g.to_state_vector() == c | |||
| assert g.to_state_vector() == c | |||
| def test_all(n=8): | |||
| """ A multi qubit test with arbitrary local rotations """ | |||
| g = GraphState(range(n)) | |||
| c = CircuitModel(n) | |||
| for repeat in tqdm(xrange(REPEATS), "Testing against circuit model"): | |||
| for step in xrange(DEPTH): | |||
| if random.random()>0.5: | |||
| qubit = np.random.randint(0, n - 1) | |||
| rotation = np.random.randint(0, 24 - 1) | |||
| g.act_local_rotation(qubit, rotation) | |||
| c.act_local_rotation(qubit, clifford.unitaries[rotation]) | |||
| else: | |||
| a, b = np.random.choice(range(n), 2, False) | |||
| g.act_cz(a, b) | |||
| c.act_cz(a, b) | |||
| assert g.to_state_vector() == c | |||
| @@ -92,13 +92,9 @@ def test_dumbness(): | |||
| a = qi.CircuitModel(1) | |||
| b = qi.CircuitModel(1) | |||
| assert a == b | |||
| a.act_local_rotation(0, qi.px) | |||
| assert not (a == b) | |||
| a.act_local_rotation(0, qi.px) | |||
| assert (a == b) | |||
| @@ -111,3 +107,12 @@ def test_to_state_vector_single_qubit(): | |||
| g.act_local_rotation(1, "hadamard") | |||
| g.act_cz(0, 1) | |||
| assert np.allclose(g.to_state_vector().state, qi.bond) | |||
| def test_normalize_global_phase(): | |||
| """ We should be able to see that two states are equivalent up to a global phase """ | |||
| for i in range(10): | |||
| u = qi.pz | |||
| phase = np.random.uniform(0, 2*np.pi) | |||
| m = np.exp(1j*phase) * u | |||
| normalized = qi.normalize_global_phase(m) | |||
| assert np.allclose(normalized, u) | |||