Skip to content

Commit dc0849e

Browse files
Add option to add missing nodes to a specific topology
1 parent e7087d9 commit dc0849e

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed

test/split_test.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
Topology,
1212
Wgs84GeoNode,
1313
)
14-
from yaramo.operations import Split
14+
from yaramo.operations import Label, Split
1515

1616

1717
def test_simple_split():
@@ -257,16 +257,20 @@ def test_add_non_connected_elements_to_a_partition():
257257
node_b4 = Node(geo_node=Wgs84GeoNode(120, 10))
258258
edge_1 = Edge(node_1, node_3)
259259
edge_2 = Edge(node_2, node_3)
260-
edge_3 = Edge(node_4, node_3)
260+
edge_3 = Edge(node_3, node_4)
261261
edge_4 = Edge(node_4, node_5)
262262
edge_5 = Edge(node_4, node_6)
263263
edge_b1 = Edge(node_b1, node_b2)
264264
edge_b2 = Edge(node_b2, node_b3)
265265
edge_b3 = Edge(node_b2, node_b4)
266-
topology.add_nodes([node_1, node_2, node_3, node_4, node_5, node_6, node_b1, node_b2, node_b3, node_b4])
266+
topology.add_nodes(
267+
[node_1, node_2, node_3, node_4, node_5, node_6, node_b1, node_b2, node_b3, node_b4]
268+
)
267269
topology.add_edges([edge_1, edge_2, edge_3, edge_4, edge_5, edge_b1, edge_b2, edge_b3])
268270

269-
topology_a, topology_b = Split.split(topology, split_edges={edge_3: 5.0})
271+
topology_a, topology_b = Split.split(
272+
topology, split_edges={edge_3: 5.0}, add_missing_elements_to_topology=Label.A_Topology
273+
)
270274

271275
assert set([node_1, node_2, node_3, node_b1, node_b2, node_b3, node_b4]).issubset(
272276
topology_a.nodes.values()

yaramo/operations/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
from .split import Split
1+
from .split import Label, Split
22
from .union import Union

yaramo/operations/split.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ def get_opposite_label(label):
1717

1818
class Split:
1919
@staticmethod
20-
def split(topology: Topology, split_edges: Dict[Edge, float]) -> Tuple[Topology, Topology]:
20+
def split(
21+
topology: Topology,
22+
split_edges: Dict[Edge, float],
23+
add_missing_elements_to_topology: None | Label = None,
24+
) -> Tuple[Topology, Topology]:
2125
Split._validate_split_edges(split_edges)
2226

2327
topology_a = Topology()
@@ -26,6 +30,11 @@ def split(topology: Topology, split_edges: Dict[Edge, float]) -> Tuple[Topology,
2630
new_end_nodes = Split._split_edges(topology, split_edges)
2731
node_labels, edge_labels, signal_labels = Split._label_elements(topology, new_end_nodes)
2832

33+
if add_missing_elements_to_topology is not None:
34+
Split._assign_missing_elements_to_label(
35+
topology, node_labels, edge_labels, signal_labels, add_missing_elements_to_topology
36+
)
37+
2938
# Add nodes, edges and signals to destination topologies.
3039
def _add_elements_to_topology(
3140
_element_label_matching, _topology_a_method, _topology_b_method
@@ -188,6 +197,24 @@ def _dfs(_start_node: Node, _label):
188197

189198
return node_labels, edge_labels, signal_labels
190199

200+
@staticmethod
201+
def _assign_missing_elements_to_label(
202+
topology: Topology,
203+
node_labels: Dict[Node, Label],
204+
edge_labels: Dict[Edge, Label],
205+
signal_labels: Dict[Signal, Label],
206+
label: Label,
207+
):
208+
for node in topology.nodes.values():
209+
if node not in node_labels:
210+
node_labels[node] = label
211+
for edge in topology.edges.values():
212+
if edge not in edge_labels:
213+
edge_labels[edge] = label
214+
for signal in topology.signals.values():
215+
if signal not in signal_labels:
216+
signal_labels[signal] = label
217+
191218
@staticmethod
192219
def _validate_for_data_loss(
193220
topology: Topology,

0 commit comments

Comments
 (0)