def test_contract_trace_edges(self): net = network.TensorNetwork(backend="tensorflow") a = net.add_node(np.ones([4, 5, 2, 3, 4])) b = net.add_node(np.ones([3, 2, 3, 5])) net.connect(a[2], b[1]) net.connect(a[1], b[3]) net.connect(b[0], b[2]) net.connect(a[0], a[4]) e = a[1] net, sizes, sizes_none = stochastic_contractor.contract_trace_edges( net) self.assertDictEqual(sizes, {e.node1: 30, e.node2: 10}) self.assertDictEqual(sizes_none, dict())
def test_contraction_parallel_edges(self): net = network.TensorNetwork(backend="tensorflow") a = net.add_node(np.ones([4, 5, 2])) b = net.add_node(np.ones([3, 2, 3, 5])) c = net.add_node(np.ones([ 4, ])) net.connect(a[2], b[1]) net.connect(b[0], b[2]) net.connect(a[1], b[3]) net.connect(a[0], c[0]) net = stochastic_contractor.stochastic(net, 2) net.check_correct() res = net.get_final_node() self.assertAllClose(res.get_tensor(), 120)
def test_contraction_disconnected(self): net = network.TensorNetwork(backend="tensorflow") a = net.add_node(np.ones([4, 5, 2])) b = net.add_node(np.ones([3, 2, 3])) edge1 = a[0] net.connect(a[2], b[1]) net.connect(b[0], b[2]) c = net.add_node(np.ones([3, 4])) d = net.add_node(np.ones([4, 3])) edge2 = c[0] net.connect(c[1], d[0]) net = stochastic_contractor.stochastic(net, 2) net.check_correct(check_connected=False) node1, node2 = edge1.node1, edge2.node1 self.assertAllClose(node1.get_tensor(), 6 * np.ones([4, 5])) self.assertAllClose(node2.get_tensor(), 4 * np.ones([3, 3]))
def test_swap_gate(): net = network.TensorNetwork(backend="jax") # Prepare input state: 0.6|00> + 0.8|10> q0_in = net.add_node(np.array([0.6, 0.8], dtype=np.float64)) q1_in = net.add_node(np.array([1, 0], dtype=np.float64)) # Prepare output state: 0.6|00> + 0.8|01> q0_out = net.add_node(np.array([1, 0], dtype=np.float64)) q1_out = net.add_node(np.array([0.6, 0.8], dtype=np.float64)) # Build quantum circuit: three CNOTs implement a SWAP copy_node_1, q0_t1, q1_t1 = add_cnot(net, q0_in[0], q1_in[0]) copy_node_2, q1_t2, q0_t2 = add_cnot(net, q1_t1, q0_t1) copy_node_3, q0_t3, q1_t3 = add_cnot(net, q0_t2, q1_t2) net.connect(q0_t3, q0_out[0]) net.connect(q1_t3, q1_out[0]) # Contract the network, first Bucket Elimination, then naive to complete. contraction_order = (copy_node_1, copy_node_2, copy_node_3) net = bucket(net, contraction_order) net = naive(net) result = net.get_final_node() # Verify that SWAP has turned |10> into |01> and kept |00> unchanged. np.testing.assert_allclose(result.get_tensor(), 1.0)
def test_cnot_gate(): net = network.TensorNetwork(backend="numpy") # Prepare input state: |11> q0_in = net.add_node(np.array([0, 1], dtype=np.float64)) q1_in = net.add_node(np.array([0, 1], dtype=np.float64)) # Prepare output state: |10> q0_out = net.add_node(np.array([0, 1], dtype=np.float64)) q1_out = net.add_node(np.array([1, 0], dtype=np.float64)) # Build quantum circuit copy_node, q0_t1, q1_t1 = add_cnot(net, q0_in[0], q1_in[0]) net.connect(q0_t1, q0_out[0]) net.connect(q1_t1, q1_out[0]) # Contract the network, first using Bucket Elimination, then once # no more copy tensors are left to exploit, fall back to the naive # contractor. contraction_order = (copy_node,) net = bucket(net, contraction_order) net = naive(net) result = net.get_final_node() # Verify that CNOT has turned |11> into |10>. np.testing.assert_allclose(result.get_tensor(), 1.0)
def _build_network( tensors: Sequence[Tensor], network_structure: Sequence[Sequence] ) -> Tuple[network.TensorNetwork, Dict[Any, network_components.Edge]]: tn = network.TensorNetwork() nodes = [] edges = {} for i, (tensor, edge_lbls) in enumerate(zip(tensors, network_structure)): if len(tensor.shape) != len(edge_lbls): raise ValueError( "Incorrect number of edge labels specified tensor {}".format(i)) node = tn.add_node(tensor, name="tensor_{}".format(i)) nodes.append(node) for (axis_num, edge_lbl) in enumerate(edge_lbls): if edge_lbl not in edges: e = node[axis_num] e.set_name(str(edge_lbl)) edges[edge_lbl] = e else: # This will raise an error if the edges are not dangling. e = tn.connect(edges[edge_lbl], node[axis_num], name=str(edge_lbl)) edges[edge_lbl] = e return tn, edges
def test_cost_contract_between_no_shared_edges(backend): net = network.TensorNetwork(backend=backend) a = net.add_node(np.ones((2, 3, 4, 5))) b = net.add_node(np.ones((7, 3, 9, 5))) with pytest.raises(ValueError): cost_calculators.cost_contract_between(a, b)