from itertools import chain import networkx as nx import pytest def _check_partition(G, cut_value, partition, weight): assert isinstance(partition, tuple) assert len(partition) == 2 assert isinstance(partition[0], list) assert isinstance(partition[1], list) assert len(partition[0]) > 0 assert len(partition[1]) > 0 assert sum(map(len, partition)) == len(G) assert set(chain.from_iterable(partition)) == set(G) partition = tuple(map(set, partition)) w = 0 for u, v, e in G.edges(data=True): if (u in partition[0]) == (v in partition[1]): w += e.get(weight, 1) assert w == cut_value def _test_stoer_wagner(G, answer, weight='weight'): cut_value, partition = nx.stoer_wagner(G, weight, heap=nx.utils.PairingHeap) assert cut_value == answer _check_partition(G, cut_value, partition, weight) cut_value, partition = nx.stoer_wagner(G, weight, heap=nx.utils.BinaryHeap) assert cut_value == answer _check_partition(G, cut_value, partition, weight) def test_graph1(): G = nx.Graph() G.add_edge('x', 'a', weight=3) G.add_edge('x', 'b', weight=1) G.add_edge('a', 'c', weight=3) G.add_edge('b', 'c', weight=5) G.add_edge('b', 'd', weight=4) G.add_edge('d', 'e', weight=2) G.add_edge('c', 'y', weight=2) G.add_edge('e', 'y', weight=3) _test_stoer_wagner(G, 4) def test_graph2(): G = nx.Graph() G.add_edge('x', 'a') G.add_edge('x', 'b') G.add_edge('a', 'c') G.add_edge('b', 'c') G.add_edge('b', 'd') G.add_edge('d', 'e') G.add_edge('c', 'y') G.add_edge('e', 'y') _test_stoer_wagner(G, 2) def test_graph3(): # Source: # Stoer, M. and Wagner, F. (1997). "A simple min-cut algorithm". Journal of # the ACM 44 (4), 585-591. G = nx.Graph() G.add_edge(1, 2, weight=2) G.add_edge(1, 5, weight=3) G.add_edge(2, 3, weight=3) G.add_edge(2, 5, weight=2) G.add_edge(2, 6, weight=2) G.add_edge(3, 4, weight=4) G.add_edge(3, 7, weight=2) G.add_edge(4, 7, weight=2) G.add_edge(4, 8, weight=2) G.add_edge(5, 6, weight=3) G.add_edge(6, 7, weight=1) G.add_edge(7, 8, weight=3) _test_stoer_wagner(G, 4) def test_weight_name(): G = nx.Graph() G.add_edge(1, 2, weight=1, cost=8) G.add_edge(1, 3, cost=2) G.add_edge(2, 3, cost=4) _test_stoer_wagner(G, 6, weight='cost') def test_exceptions(): G = nx.Graph() pytest.raises(nx.NetworkXError, nx.stoer_wagner, G) G.add_node(1) pytest.raises(nx.NetworkXError, nx.stoer_wagner, G) G.add_node(2) pytest.raises(nx.NetworkXError, nx.stoer_wagner, G) G.add_edge(1, 2, weight=-2) pytest.raises(nx.NetworkXError, nx.stoer_wagner, G) G = nx.DiGraph() pytest.raises(nx.NetworkXNotImplemented, nx.stoer_wagner, G) G = nx.MultiGraph() pytest.raises(nx.NetworkXNotImplemented, nx.stoer_wagner, G) G = nx.MultiDiGraph() pytest.raises(nx.NetworkXNotImplemented, nx.stoer_wagner, G)