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_add_edge_table_same_type(self): g = Graph() v1, v2 = g.add_vertices(2) g.set_type(v1,VertexType.Z) g.set_type(v2,VertexType.Z) etab = {(v1,v2):[2,0]} g.add_edge_table(etab) self.assertTrue(g.connected(v1,v2)) self.assertEqual((g.phase(v1),g.phase(v2)),(0,0)) g.remove_edge(g.edge(v1,v2)) self.assertFalse(g.connected(v1,v2)) etab = {(v1,v2):[0,2]} g.add_edge_table(etab) self.assertFalse(g.connected(v1,v2)) etab = {(v1,v2): [1,1]} g.add_edge_table(etab) self.assertEqual(g.edge_type(g.edge(v1,v2)),EdgeType.SIMPLE) self.assertTrue((g.phase(v1)==1 and g.phase(v2)==0) or (g.phase(v1)==0 and g.phase(v2)==1))
def test_add_edge_table_different_type(self): g = Graph() v1, v2 = g.add_vertices(2) g.set_type(v1,1) g.set_type(v2,2) etab = {(v1,v2):[0,2]} g.add_edge_table(etab) self.assertTrue(g.connected(v1,v2)) self.assertEqual((g.phase(v1),g.phase(v2)),(0,0)) g.remove_edge(g.edge(v1,v2)) self.assertFalse(g.connected(v1,v2)) etab = {(v1,v2):[2,0]} g.add_edge_table(etab) self.assertFalse(g.connected(v1,v2)) etab = {(v1,v2): [1,1]} g.add_edge_table(etab) self.assertEqual(g.edge_type(g.edge(v1,v2)),2) self.assertTrue((g.phase(v1)==1 and g.phase(v2)==0) or (g.phase(v1)==0 and g.phase(v2)==1))
def test_scalar(self): g = Graph() x = g.add_vertex(VertexType.Z, row = 0, phase = 1 / 2) y = g.add_vertex(VertexType.Z, row = 1, phase = 1 / 4) g.add_edge(g.edge(x, y), edgetype = EdgeType.SIMPLE) full_reduce(g) val = to_quimb_tensor(g).contract(output_inds = ()) expected_val = 1 + np.exp(1j * np.pi * 3 / 4) self.assertTrue(abs(val - expected_val) < 1e-9)
def test_xor_tensor(self): g = Graph() x = g.add_vertex(VertexType.BOUNDARY) y = g.add_vertex(VertexType.BOUNDARY) v = g.add_vertex(VertexType.Z) z = g.add_vertex(VertexType.BOUNDARY) g.add_edge(g.edge(x, v), edgetype = EdgeType.HADAMARD) g.add_edge(g.edge(y, v), edgetype = EdgeType.HADAMARD) g.add_edge(g.edge(v, z), edgetype = EdgeType.HADAMARD) tn = to_quimb_tensor(g) for x in range(2): for y in range(2): for z in range(2): self.assertTrue(abs((tn & qtn.Tensor(data = [1 - x, x], inds = ("0",)) & qtn.Tensor(data = [1 - y, y], inds = ("1",)) & qtn.Tensor(data = [1 - z, z], inds = ("3",))).contract(output_inds = ()) - ((x ^ y) == z) / np.sqrt(2)) < 1e-9)
def test_phases_tensor(self): # This diagram represents a 1-input 1-output Z-spider of phase pi/2, # but written using two Z-spiders of phases pi/6 and pi/3 that are # connected by a simple edge. g = Graph() x = g.add_vertex(VertexType.BOUNDARY) v = g.add_vertex(VertexType.Z, phase = 1. / 6.) w = g.add_vertex(VertexType.Z, phase = 1. / 3.) y = g.add_vertex(VertexType.BOUNDARY) g.add_edge(g.edge(x, v), edgetype = EdgeType.SIMPLE) g.add_edge(g.edge(v, w), edgetype = EdgeType.SIMPLE) g.add_edge(g.edge(w, y), edgetype = EdgeType.SIMPLE) tn = to_quimb_tensor(g) self.assertTrue(abs((tn & qtn.Tensor(data = [1, 0], inds = ("0",)) & qtn.Tensor(data = [1, 0], inds = ("3",))) .contract(output_inds = ()) - 1) < 1e-9) self.assertTrue(abs((tn & qtn.Tensor(data = [0, 1], inds = ("0",)) & qtn.Tensor(data = [0, 1j], inds = ("3",))) .contract(output_inds = ()) + 1) < 1e-9)
def test_hadamard_tensor(self): g = Graph() x = g.add_vertex(VertexType.BOUNDARY) y = g.add_vertex(VertexType.BOUNDARY) g.add_edge(g.edge(x, y), edgetype = EdgeType.HADAMARD) tn = to_quimb_tensor(g) self.assertTrue(abs((tn & qtn.Tensor(data = [1, 0], inds = ("0",)) & qtn.Tensor(data = [1 / np.sqrt(2), 1 / np.sqrt(2)], inds = ("1",))) .contract(output_inds = ()) - 1) < 1e-9) self.assertTrue(abs((tn & qtn.Tensor(data = [0, 1], inds = ("0",)) & qtn.Tensor(data = [1 / np.sqrt(2), -1 / np.sqrt(2)], inds = ("1",))) .contract(output_inds = ()) - 1) < 1e-9)
def test_id_tensor(self): g = Graph() x = g.add_vertex(VertexType.BOUNDARY) y = g.add_vertex(VertexType.BOUNDARY) g.add_edge(g.edge(x, y), edgetype = EdgeType.SIMPLE) tn = to_quimb_tensor(g) self.assertTrue((tn & qtn.Tensor(data = [0, 1], inds = ("0",)) & qtn.Tensor(data = [0, 1], inds = ("1",))) .contract(output_inds = ()) == 1) self.assertTrue((tn & qtn.Tensor(data = [1, 0], inds = ("0",)) & qtn.Tensor(data = [1, 0], inds = ("1",))) .contract(output_inds = ()) == 1)
def test_edges(self): g = Graph() v1, v2, v3 = g.add_vertices(3) g.add_edge((v1, v2)) self.assertEqual(g.num_edges(), 1) self.assertTrue(g.connected(v1, v2)) self.assertTrue(v2 in g.neighbours(v1)) self.assertEqual(g.vertex_degree(v1), 1) self.assertFalse(g.connected(v1, v3)) e = g.edge(v1, v2) self.assertEqual(g.edge_type(e), 1) g.set_edge_type(e, 2) self.assertEqual(g.edge_type(e), 2) g.remove_edge(e) self.assertEqual(g.num_edges(), 0) self.assertFalse(g.connected(v1, v2))