Cidr4 merge algorithm #5

Merged
PavelPatsey merged 91 commits from CIDR4_merge_algorithm into main 2025-01-27 22:05:39 +03:00
2 changed files with 44 additions and 2 deletions
Showing only changes of commit 39e99d24b6 - Show all commits
+17 -2
View File
6
@@ -183,6 +183,20 @@ def merge_nodes_recursion(nodes: list[Node], required_len: int) -> list[Node]:
return merge_nodes_recursion(new_nodes, required_len) return merge_nodes_recursion(new_nodes, required_len)
def merge_nodes_cycle(nodes_to_merge: list[Node], required_len: int) -> list[Node]:
nodes = [x for x in nodes_to_merge]
while not len(nodes) <= required_len:
groups = make_groups(nodes)
neighbours, singles = find_neighbours_singles(groups)
if neighbours:
nodes = merge_neighbors(nodes, neighbours)
elif singles:
nodes = lift_lonely_node(nodes, singles)
else:
raise Cidr4MergerError("Invalid case!")
return nodes
def main(): def main():
file = "cidr4.txt" file = "cidr4.txt"
required_len = 20 required_len = 20
@@ -191,8 +205,9 @@ def main():
nodes = list(map(cidr4_to_node, data)) nodes = list(map(cidr4_to_node, data))
nodes = sort_nodes(nodes) nodes = sort_nodes(nodes)
# merged_nodes = merge_nodes(nodes, required_len) # merged_nodes = merge_nodes_deprecated(nodes, required_len)
merged_nodes = merge_nodes_recursion(nodes, required_len) # merged_nodes = merge_nodes_recursion(nodes, required_len)
merged_nodes = merge_nodes_cycle(nodes, required_len)
cidr4s = [] cidr4s = []
sum_added_ips = 0 sum_added_ips = 0
+27
View File
@@ -15,6 +15,7 @@ from cidr4_merger import (
merge_neighbors, merge_neighbors,
merge_nodes_deprecated, merge_nodes_deprecated,
merge_nodes_recursion, merge_nodes_recursion,
merge_nodes_cycle,
reduce_nodes, reduce_nodes,
sort_nodes, sort_nodes,
) )
@@ -351,3 +352,29 @@ def test_merge_nodes_recursion():
) )
assert exc_info.type is Cidr4MergerError assert exc_info.type is Cidr4MergerError
assert str(exc_info.value) == "The top of the tree has no parent!" assert str(exc_info.value) == "The top of the tree has no parent!"
def test_merge_nodes_cycle():
assert merge_nodes_cycle(
[
(0, 2, 12, 0),
(2147483648, 2, 1, 2147483648),
(3221225472, 2, 2, 2147483648),
],
2,
) == [
(2147483648, 1, 3, 0),
(0, 2, 12, 0),
]
with pytest.raises(Exception) as exc_info:
merge_nodes_cycle(
[
(0, 2, 12, 0),
(2147483648, 2, 1, 2147483648),
(3221225472, 2, 2, 2147483648),
],
1,
)
assert exc_info.type is Cidr4MergerError
assert str(exc_info.value) == "The top of the tree has no parent!"