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
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
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
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
def test_no_sinks(type): G = DiGraph() G.add_cycle([0, 1, 2]) ex = DiGraphExtended(G) with pytest.raises(RuntimeError): ex.step(type)