Cidr4 merge algorithm #5
+17
-2
@@ -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
|
||||||
|
|||||||
@@ -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!"
|
||||||
|
|||||||
Reference in New Issue
Block a user