Ejemplo n.º 1
0
    def contract(self,
                 edge: network_components.Edge,
                 name: Optional[Text] = None) -> network_components.Node:
        """Contract an edge connecting two nodes in the TensorNetwork.

    Args:
      edge: The edge contract next.
      name: Name of the new node created.

    Returns:
      new_node: The new node created after the contraction.

    Raises:
      ValueError: When edge is a dangling edge or if it already has been
        contracted.
    """
        if not edge.is_being_used() or edge.node1 not in self.nodes_set:
            raise ValueError(
                "Attempting to contract edge '{}' that is not part of "
                "the network.".format(edge))
        if edge.is_dangling():
            raise ValueError("Attempting to contract dangling edge")
        if edge.node1 is edge.node2:
            return self._contract_trace(edge, name)
        new_tensor = self.backend.tensordot(edge.node1.tensor,
                                            edge.node2.tensor,
                                            [[edge.axis1], [edge.axis2]])
        new_node = self.add_node(new_tensor, name)
        self._remove_edges(set([edge]), edge.node1, edge.node2, new_node)
        return new_node
def test_edge_is_being_used_false(single_node_edge):
  node = single_node_edge.node
  edge2 = Edge(name="edge", node1=node, axis1=0)
  assert not edge2.is_being_used()