Skip to content
This repository was archived by the owner on Nov 7, 2024. It is now read-only.

Commit 89ff40e

Browse files
author
Chase Roberts
authored
Get neighbors (#588)
* Added get_neighbors method * documentation * added bottom space
1 parent bb56981 commit 89ff40e

4 files changed

Lines changed: 37 additions & 2 deletions

File tree

docs/network.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ Common Functions
3333
.. autofunction:: tensornetwork.flatten_all_edges
3434
.. autofunction:: tensornetwork.flatten_edges_between
3535
.. autofunction:: tensornetwork.get_parallel_edges
36-
.. autofunction:: tensornetwork.get_shared_edges
36+
.. autofunction:: tensornetwork.get_shared_edges
37+
.. autofunction:: tensornetwork.get_neighbors

tensornetwork/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pylint: disable=line-too-long
22
from tensornetwork.network_components import Node, Edge, CopyNode, BaseNode, NodeCollection
33
#pylint: disable=line-too-long
4-
from tensornetwork.network_operations import norm, conj, copy, replicate_nodes, transpose, split_node, split_node_qr, split_node_rq, split_node_full_svd, reachable, check_connected, check_correct, get_all_nodes, get_all_edges, remove_node, contract_trace_edges, get_subgraph_dangling, reduced_density, switch_backend
4+
from tensornetwork.network_operations import norm, conj, copy, replicate_nodes, transpose, split_node, split_node_qr, split_node_rq, split_node_full_svd, reachable, check_connected, check_correct, get_all_nodes, get_all_edges, remove_node, contract_trace_edges, get_subgraph_dangling, reduced_density, switch_backend, get_neighbors
55
#pylint: disable=line-too-long
66
from tensornetwork.network_components import contract, contract_copy_node, contract_between, outer_product, outer_product_final_nodes, contract_parallel, flatten_edges, split_edge, slice_edge, get_all_nondangling, get_all_dangling, flatten_all_edges, flatten_edges_between, get_parallel_edges, get_shared_edges
77
from tensornetwork.backends.base_backend import BaseBackend

tensornetwork/network_operations.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,3 +874,24 @@ def switch_backend(nodes: Iterable[BaseNode], new_backend: Text) -> None:
874874
"is '{}'".format(node.backend))
875875
node.tensor = backend.convert_to_tensor(node.tensor)
876876
node.backend = backend
877+
878+
def get_neighbors(node: BaseNode) -> List[Node]:
879+
"""Get all of the neighbors that are directly connected to the given node.
880+
881+
Note: `node` will never be in the returned list, even if `node` has a
882+
trace edge.
883+
884+
Args:
885+
node: A node.
886+
887+
Returns:
888+
All of the neighboring edges that share an `Edge` with `node`.
889+
"""
890+
neighbors = []
891+
for edge in node.edges:
892+
if not edge.is_dangling() and not edge.is_trace():
893+
if edge.node1 is node:
894+
neighbors.append(edge.node2)
895+
else:
896+
neighbors.append(edge.node1)
897+
return neighbors

tensornetwork/tests/network_operations_test.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,3 +500,16 @@ def test_split_node_qr_orig_shape(backend):
500500
n1 = tn.Node(np.random.rand(3, 4, 5), backend=backend)
501501
tn.split_node_qr(n1, [n1[0], n1[2]], [n1[1]])
502502
np.testing.assert_allclose(n1.shape, (3, 4, 5))
503+
504+
def test_get_neighbors(backend):
505+
with tn.DefaultBackend(backend):
506+
a = tn.Node(np.ones((2, 2)))
507+
b = tn.Node(np.ones((2, 2, 2, 2)))
508+
c = tn.Node(np.ones((2, 2, 2)))
509+
d = tn.Node(np.ones((2, 2)))
510+
b[0] ^ a[1]
511+
b[3] ^ c[2]
512+
a[0] ^ d[1]
513+
b[1] ^ b[2]
514+
result = tn.get_neighbors(b)
515+
assert result == [a, c]

0 commit comments

Comments
 (0)