def test_remove_isolated_vertex_preserves_semantics(self): g = Graph() v = g.add_vertex(1, 0, 0) g2 = g.copy() g2.remove_isolated_vertices() self.assertTrue(compare_tensors(g, g2)) self.assertEqual(g2.scalar.to_number(), 2) g.set_phase(v, Fraction(1)) g2 = g.copy() g2.remove_isolated_vertices() self.assertTrue(compare_tensors(g, g2)) self.assertAlmostEqual(g2.scalar.to_number(), 0)
def test_copy(self): g = Graph() v1, v2 = g.add_vertices(2) g.add_edge((v1, v2), 2) g2 = g.copy() self.assertEqual(g.num_vertices(), g2.num_vertices()) self.assertEqual(g.num_edges(), g2.num_edges()) v1, v2 = list(g2.vertices()) self.assertEqual(g.edge_type(g.edge(v1, v2)), 2)
def test_remove_isolated_pair_preserves_semantics(self): for i, j, k in itertools.product([1, 2], repeat=3): for phase1, phase2 in itertools.product([0, 1, 2], [0, 4, 5]): with self.subTest(i=i, j=j, k=k, phase1=phase1, phase2=phase2): g = Graph() v = g.add_vertex(i, 0, 0, phase=phase1) w = g.add_vertex(j, 1, 0, phase=phase2) g.add_edge((v, w), k) g2 = g.copy() g2.remove_isolated_vertices() self.assertEqual(g2.num_vertices(), 0) self.assertTrue(compare_tensors(g, g2))
class TestGraphCircuitMethods(unittest.TestCase): def setUp(self): """Sets up a two qubit circuit containing a single CNOT with some phases.""" self.graph = Graph() g = self.graph i1 = g.add_vertex(0,0,0) #add_vertex(type,qubit_index,row_index,phase=0) i2 = g.add_vertex(0,1,0) g.inputs = [i1,i2] v = g.add_vertex(1,0,1,Fraction(1,2)) w = g.add_vertex(2,1,1,Fraction(1,1)) o1 = g.add_vertex(0,0,2) o2 = g.add_vertex(0,1,2) g.outputs = [o1, o2] g.add_edges([(i1,v),(i2,w),(v,w),(v,o1),(w,o2)]) self.i1, self.i2, self.v, self.w, self.o1, self.o2 = i1, i2, v, w, o1, o2 def test_qubit_index_and_depth(self): g = self.graph self.assertEqual(g.depth(),2) self.assertEqual(g.qubit_count(),2) def test_adjoint(self): g = self.graph adj = g.adjoint() self.assertEqual(g.num_vertices(),adj.num_vertices()) self.assertEqual(g.num_edges(),adj.num_edges()) self.assertEqual(g.depth(), adj.depth()) self.assertEqual(g.qubit_count(), adj.qubit_count()) v = [i for i in g.vertices() if g.type(i)==1][0] w = [i for i in adj.vertices() if adj.type(i)==1][0] self.assertEqual(g.phase(v),(-adj.phase(v))%2) self.assertEqual(g.vertex_degree(v),adj.vertex_degree(w)) def test_compose_basic(self): g = self.graph.copy() g.compose(g) self.assertEqual(g.num_vertices(), self.graph.num_vertices()+2) self.assertEqual((len(g.inputs),len(g.outputs)),(2,2)) def test_compose_handling_hadamards(self): g = self.graph g.set_edge_type(g.edge(self.v,self.o1),2) g2 = g.copy() g2.compose(g) num_hadamards = len([e for e in g2.edges() if g2.edge_type(e)==2]) self.assertEqual(num_hadamards, 2) g2 = g.copy() g2.compose(g.adjoint()) num_hadamards = len([e for e in g2.edges() if g2.edge_type(e)==2]) self.assertEqual(num_hadamards, 0)
def test_equality_of_id_zx_graph_to_id(self): g = Graph() i = g.add_vertex(0, 0, 0) o = g.add_vertex(0, 0, 2) g.inputs.append(i) g.outputs.append(o) g2 = g.copy() g.add_edge((i, o)) v = g2.add_vertex(1, 0, 1) g2.add_edges([(i, v), (v, o)]) tensor1 = tensorfy(g) tensor2 = tensorfy(g2) self.assertTrue(compare_tensors(tensor1, tensor2))
def test_inequality_id_and_swap(self): g = Graph() i1 = g.add_vertex(0, 0, 0) i2 = g.add_vertex(0, 1, 0) o1 = g.add_vertex(0, 0, 1) o2 = g.add_vertex(0, 1, 1) g.inputs = [i1, i2] g.outputs = [o1, o2] g2 = g.copy() g.add_edges([(i1, o2), (i2, o1)]) g2.add_edges([(i1, o1), (i2, o2)]) id_id = tensorfy(g2) swap = tensorfy(g) self.assertFalse(compare_tensors(id_id, swap))
class TestGraphCircuitMethods(unittest.TestCase): def setUp(self): """Sets up a two qubit circuit containing a single CNOT with some phases.""" self.graph = Graph() g = self.graph i1 = g.add_vertex(VertexType.BOUNDARY, 0, 0) #add_vertex(type,qubit_index,row_index,phase=0) i2 = g.add_vertex(VertexType.BOUNDARY, 1, 0) g.inputs = [i1, i2] v = g.add_vertex(VertexType.Z, 0, 1, Fraction(1, 2)) w = g.add_vertex(VertexType.X, 1, 1, Fraction(1, 1)) o1 = g.add_vertex(VertexType.BOUNDARY, 0, 2) o2 = g.add_vertex(VertexType.BOUNDARY, 1, 2) g.outputs = [o1, o2] g.add_edges([(i1, v), (i2, w), (v, w), (v, o1), (w, o2)]) self.i1, self.i2, self.v, self.w, self.o1, self.o2 = i1, i2, v, w, o1, o2 def test_qubit_index_and_depth(self): g = self.graph self.assertEqual(g.depth(), 2) self.assertEqual(g.qubit_count(), 2) def test_adjoint(self): g = self.graph adj = g.adjoint() self.assertEqual(g.num_vertices(), adj.num_vertices()) self.assertEqual(g.num_edges(), adj.num_edges()) self.assertEqual(g.depth(), adj.depth()) self.assertEqual(g.qubit_count(), adj.qubit_count()) v = [i for i in g.vertices() if g.type(i) == VertexType.Z][0] w = [i for i in adj.vertices() if adj.type(i) == VertexType.Z][0] self.assertEqual(g.phase(v), (-adj.phase(v)) % 2) self.assertEqual(g.vertex_degree(v), adj.vertex_degree(w)) def test_compose_basic(self): g = self.graph.copy() g.compose(g) self.assertEqual((len(g.inputs), len(g.outputs)), (2, 2)) @unittest.skipUnless(np, "numpy needs to be installed for this to run") def test_compose_unitary(self): g = self.graph g.set_edge_type(g.edge(self.v, self.o1), EdgeType.HADAMARD) g2 = g.adjoint() g2.compose(g) self.assertTrue(compare_tensors(g2, identity(2), False))