Esempio n. 1
0
def test_rm_sources_less_than_in_T():
    T = tournament_with_one_cycle(6, [False, False, False])
    G = DiGraph()
    G.add_cycle([0, 1, 2, 3, 4])
    result = rm_sinks_and_sources(G, T).get_current()
    expected = DiGraph()
    expected.add_cycle([0, 1, 2, 3, 4])
    assert result == expected
Esempio n. 2
0
def test_rm_sources():
    T = tournament_with_one_cycle(6, [False, False, False])
    G = DiGraph([(5, 0), (6, 5), (6, 4), (7, 6), (7, 3), (7, 2)])
    G.add_cycle([0, 1, 2, 3, 4])
    result = rm_sinks_and_sources(G, T).get_current()
    expected = DiGraph()
    expected.add_cycle([0, 1, 2, 3, 4])
    assert result == expected
Esempio n. 3
0
def test_rm_sources_tournament():
    T = tournament_with_one_cycle(6, [False, False, False])
    G = DiGraph()
    G.add_cycle([0, 1, 2, 3, 4])
    _, result = rm_sinks_and_sources(G, T, True)
    result = result.get_current()
    expected = DiGraph()
    expected.add_cycle([0, 2, 1])
    assert result == expected
Esempio n. 4
0
def tournament_with_one_cycle(k, sink):
    '''Zwraca turniej z dokładnie jednym cyklem. Warto zauważyć
    że taki turniej będzie albo cyklem C_3, albo powstaje poprzez
    dodawanie do C_3 kolejnych wierzchołków, które w danym momencie
    będą źródłami bądź ujściami ([1], komentarz pod Algorytmem 2).

    :param k: Int
        Liczba wierzchołków w turnieju
    :param sink: Bool array
        Kontroluje, w jaki sposób mają być skierowane kolejne krawędzie.
        Jeżeli dirs[i] == True, to wszystkie krawędzie łączące wierzchołek
        i z wierzchołkami o niższych indeksach, będą skierowane w stronę i
        (tzn. i wtedy będzie ujściem).
        Rozmiar dirs powinien być równy k - 3
    :return: DiGraph
        Turniej o k wierzchołkach, zawierający dokładnie jeden cykl.
    '''
    if not isinstance(k, int) or k < 3:
        raise ValueError("k musi być liczbą naturalną większą lub równą 3")
    if len(sink) != k - 3:
        raise ValueError("Długość tablicy sink musi być równa k-3")

    T = DiGraph()
    T.add_cycle([0, 2, 1])

    def add_source(G, v):
        vertices = G.vertices()
        for u in vertices:
            G.add_edge(v, u)

    def add_sink(G, v):
        vertices = G.vertices()
        for u in vertices:
            G.add_edge(u, v)

    for i, flag in enumerate(sink):
        if flag:
            add_sink(T, i + 3)
        else:
            add_source(T, i + 3)

    return T
Esempio n. 5
0
def test_no_sinks(type):
    G = DiGraph()
    G.add_cycle([0, 1, 2])
    ex = DiGraphExtended(G)
    with pytest.raises(RuntimeError):
        ex.step(type)