def test_ranked_split(): g = nx.DiGraph() g.add_nodes_from(range(5)) g.add_edges_from([(0, 1), (0, 2), (3, 1), (3, 2), (4, 1), (4, 2), (4, 3)]) vertexes, _ = decorate_nx_graph(g) integer_partition = paige_tarjan(g) q_partition = integer_to_partition(integer_partition, vertexes) # now we modify the graph add_edge(vertexes[3], vertexes[0]) # find [v] modified_destination_block = None for block in q_partition: for vertex in block.vertexes: if vertex.label == 0: modified_destination_block = block break ranked_split(q_partition, modified_destination_block, 2) final_integer_partition = partition_to_integer(q_partition) assert final_integer_partition == set( [frozenset([0]), frozenset([1, 2]), frozenset([3]), frozenset([4])] )
def test_resets_aux_count(): g = nx.DiGraph() g.add_nodes_from(range(5)) g.add_edges_from([(0, 1), (0, 2), (3, 1), (3, 2), (4, 1), (4, 2), (4, 3)]) vertexes, _ = decorate_nx_graph(g) integer_partition = paige_tarjan(g) q_partition = integer_to_partition(integer_partition, vertexes) # now we modify the graph add_edge(vertexes[3], vertexes[0]) # find [v] modified_destination_block = None for block in q_partition: for vertex in block.vertexes: if vertex.label == 0: modified_destination_block = block break ranked_split(q_partition, modified_destination_block, 2) for vx in vertexes: assert not hasattr(vx, "aux_count") or vx.aux_count is None
def test_check_new_scc_cleans(graph, new_edge, value): vertexes, _ = decorate_nx_graph(graph) add_edge(vertexes[new_edge[0]], vertexes[new_edge[1]]) check_new_scc(vertexes[new_edge[0]], vertexes[new_edge[1]], []) for vertex in vertexes: assert not vertex.visited
def test_check_new_scc(graph, new_edge, value): vertexes, _ = decorate_nx_graph(graph) add_edge(vertexes[new_edge[0]], vertexes[new_edge[1]]) assert ( check_new_scc(vertexes[new_edge[0]], vertexes[new_edge[1]], []) == value )
def test_check_new_scc_qblocks_visited(graph, new_edge, value): vertexes, _ = decorate_nx_graph(graph) add_edge(vertexes[new_edge[0]], vertexes[new_edge[1]]) finishing_time_list = [] check_new_scc( vertexes[new_edge[0]], vertexes[new_edge[1]], finishing_time_list ) for vx in finishing_time_list: assert vx.qblock.visited
def test_propagate_wf(): graph = nx.DiGraph() graph.add_nodes_from(range(5)) graph.add_edges_from([(0, 1), (1, 2), (2, 3)]) vertexes, qblocks = decorate_nx_graph(graph, [(0,), (1,), (2,), (3, 4)]) max_rank = max(map(lambda vx: vx.rank, vertexes)) # be careful: for build_well_founded_topological vertexes in the same # block have to be of the same rank topo = build_well_founded_topological_list(qblocks, vertexes[3], max_rank) add_edge(vertexes[3], vertexes[4]) propagate_wf(vertexes[3], topo, vertexes) for idx in range(5): assert vertexes[idx].rank == 4 - idx
def test_check_new_scc_computes_finishing_time( graph, new_edge, value, correct_finishing_time ): if correct_finishing_time is None: return vertexes, _ = decorate_nx_graph(graph) add_edge(vertexes[new_edge[0]], vertexes[new_edge[1]]) finishing_time_list = [] check_new_scc( vertexes[new_edge[0]], vertexes[new_edge[1]], finishing_time_list ) assert len(finishing_time_list) == len(correct_finishing_time) for i in range(len(finishing_time_list)): assert finishing_time_list[i].label == correct_finishing_time[i]
def test_add_edge(): graph = nx.DiGraph() graph.add_nodes_from(range(5)) graph.add_edges_from([(0, 1), (1, 2), (2, 3), (4, 1)]) vertexes, _ = decorate_nx_graph(graph) ranked_partition = RankedPartition(vertexes) partition = [] for rank in ranked_partition: for block in ranked_partition: partition.append(block) edge1 = add_edge(vertexes[0], vertexes[3]) assert edge1.count is not None assert edge1.count.value == 2 edge2 = add_edge(vertexes[3], vertexes[4]) assert edge2.count is not None assert edge2.count.value == 1