""" 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