Skip to content

Commit 1f51968

Browse files
committed
Start writing merge_networks
1 parent a26a02e commit 1f51968

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

src/snkit/network.py

+28
Original file line numberDiff line numberDiff line change
@@ -1040,3 +1040,31 @@ def add_component_ids(network: Network, id_col: str = "component_id") -> Network
10401040
network.nodes.loc[node_mask, id_col] = count + 1
10411041

10421042
return network
1043+
1044+
1045+
def merge_networks(networks: List[Network]) -> Network:
1046+
"""Merge multiple networks, identifying duplicate nodes at shared locations"""
1047+
1048+
n = len(networks)
1049+
if n == 0:
1050+
warnings.warn("Merging zero networks to return empty network.")
1051+
return Network()
1052+
if n == 1:
1053+
return networks[0]
1054+
1055+
# TODO update components
1056+
# - find duplicated nodes by location
1057+
# - for each duplicated node, record (network_idx, component_id)
1058+
# - set up nx.Graph
1059+
# - a vertex for each duplicated node
1060+
# - edges connecting duplicate node sets
1061+
# - edges connecting (network_idx, component_id) sets
1062+
# - find connected components in this graph
1063+
# - set up Dict[Tuple[network_idx, component_id], global_component_id]
1064+
1065+
# TODO do we default to concat_dedup? or default low-intervention?
1066+
# TODO how to handle expectations of unique node or edge ids? (especially if edges have topology)
1067+
nodes = concat_dedup([network.nodes for network in networks])
1068+
edges = concat_dedup([network.edges for network in networks])
1069+
1070+
return Network(nodes, edges)

tests/test_init.py

+20
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,26 @@ def test_add_component_ids(two_components):
838838
assert all(labelled.edges.component_id == pd.Series([2, 1, 1]))
839839

840840

841+
def test_merge_zero_networks():
842+
merged = snkit.network.merge_networks([])
843+
assert merged.nodes.empty
844+
assert merged.edges.empty
845+
846+
847+
def test_merge_one_network(split):
848+
merged = snkit.network.merge_networks([split])
849+
assert_frame_equal(merged.nodes, split.nodes)
850+
assert_frame_equal(merged.edges, split.edges)
851+
852+
853+
def test_merge_networks(split):
854+
split_abc = snkit.Network(split.nodes[:3], split.edges[:2])
855+
split_cd = snkit.Network(split.nodes[2:], split.edges[2:])
856+
merged = snkit.network.merge_networks([split_abc, split_cd])
857+
assert_frame_equal(merged.nodes, split.nodes)
858+
assert_frame_equal(merged.edges, split.edges)
859+
860+
841861
def test_matching_gdf_from_geoms(edge_only):
842862
expected = edge_only.edges.copy()
843863
gdf = edge_only.edges.copy()

0 commit comments

Comments
 (0)