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)
Exemplo n.º 6
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
Exemplo n.º 7
0
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)