Пример #1
0
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])]
    )
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
    )
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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]
Пример #8
0
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