def test_not_implemented(): G = nx.MultiGraph() pytest.raises(nx.NetworkXNotImplemented, EdgeComponentAuxGraph.construct, G) pytest.raises(nx.NetworkXNotImplemented, nx.k_edge_components, G, k=2) pytest.raises(nx.NetworkXNotImplemented, nx.k_edge_subgraphs, G, k=2) with pytest.raises(nx.NetworkXNotImplemented): next(bridge_components(G)) with pytest.raises(nx.NetworkXNotImplemented): next(bridge_components(nx.DiGraph()))
def _check_edge_connectivity(G): """ Helper - generates all k-edge-components using the aux graph. Checks the both local and subgraph edge connectivity of each cc. Also checks that alternate methods of computing the k-edge-ccs generate the same result. """ # Construct the auxillary graph that can be used to make each k-cc or k-sub aux_graph = EdgeComponentAuxGraph.construct(G) # memoize the local connectivity in this graph memo = {} for k in it.count(1): # Test "local" k-edge-components and k-edge-subgraphs ccs_local = fset(aux_graph.k_edge_components(k)) ccs_subgraph = fset(aux_graph.k_edge_subgraphs(k)) # Check connectivity properties that should be garuenteed by the # algorithms. _assert_local_cc_edge_connectivity(G, ccs_local, k, memo) _assert_subgraph_edge_connectivity(G, ccs_subgraph, k) if k == 1 or k == 2 and not G.is_directed(): assert_equal( ccs_local, ccs_subgraph, 'Subgraphs and components should be the same ' 'when k == 1 or (k == 2 and not G.directed())') if G.is_directed(): # Test special case methods are the same as the aux graph if k == 1: alt_sccs = fset(nx.strongly_connected_components(G)) assert_equal(alt_sccs, ccs_local, 'k=1 failed alt') assert_equal(alt_sccs, ccs_subgraph, 'k=1 failed alt') else: # Test special case methods are the same as the aux graph if k == 1: alt_ccs = fset(nx.connected_components(G)) assert_equal(alt_ccs, ccs_local, 'k=1 failed alt') assert_equal(alt_ccs, ccs_subgraph, 'k=1 failed alt') elif k == 2: alt_bridge_ccs = fset(bridge_components(G)) assert_equal(alt_bridge_ccs, ccs_local, 'k=2 failed alt') assert_equal(alt_bridge_ccs, ccs_subgraph, 'k=2 failed alt') # if new methods for k == 3 or k == 4 are implemented add them here # Check the general subgraph method works by itself alt_subgraph_ccs = fset( [set(C.nodes()) for C in general_k_edge_subgraphs(G, k=k)]) assert_equal(alt_subgraph_ccs, ccs_subgraph, 'alt subgraph method failed') # Stop once k is larger than all special case methods # and we cannot break down ccs any further. if k > 2 and all(len(cc) == 1 for cc in ccs_local): break
def test_bridge_cc(): # define 2-connected components and bridges cc2 = [(1, 2, 4, 3, 1, 4), (8, 9, 10, 8), (11, 12, 13, 11)] bridges = [(4, 8), (3, 5), (20, 21), (22, 23, 24)] G = nx.Graph(it.chain(*(pairwise(path) for path in cc2 + bridges))) bridge_ccs = fset(bridge_components(G)) target_ccs = fset([{1, 2, 3, 4}, {5}, {8, 9, 10}, {11, 12, 13}, {20}, {21}, {22}, {23}, {24}]) assert bridge_ccs == target_ccs _check_edge_connectivity(G)
def _check_edge_connectivity(G): """ Helper - generates all k-edge-components using the aux graph. Checks the both local and subgraph edge connectivity of each cc. Also checks that alternate methods of computing the k-edge-ccs generate the same result. """ # Construct the auxiliary graph that can be used to make each k-cc or k-sub aux_graph = EdgeComponentAuxGraph.construct(G) # memoize the local connectivity in this graph memo = {} for k in it.count(1): # Test "local" k-edge-components and k-edge-subgraphs ccs_local = fset(aux_graph.k_edge_components(k)) ccs_subgraph = fset(aux_graph.k_edge_subgraphs(k)) # Check connectivity properties that should be garuenteed by the # algorithms. _assert_local_cc_edge_connectivity(G, ccs_local, k, memo) _assert_subgraph_edge_connectivity(G, ccs_subgraph, k) if k == 1 or k == 2 and not G.is_directed(): assert_equal(ccs_local, ccs_subgraph, 'Subgraphs and components should be the same ' 'when k == 1 or (k == 2 and not G.directed())') if G.is_directed(): # Test special case methods are the same as the aux graph if k == 1: alt_sccs = fset(nx.strongly_connected_components(G)) assert_equal(alt_sccs, ccs_local, 'k=1 failed alt') assert_equal(alt_sccs, ccs_subgraph, 'k=1 failed alt') else: # Test special case methods are the same as the aux graph if k == 1: alt_ccs = fset(nx.connected_components(G)) assert_equal(alt_ccs, ccs_local, 'k=1 failed alt') assert_equal(alt_ccs, ccs_subgraph, 'k=1 failed alt') elif k == 2: alt_bridge_ccs = fset(bridge_components(G)) assert_equal(alt_bridge_ccs, ccs_local, 'k=2 failed alt') assert_equal(alt_bridge_ccs, ccs_subgraph, 'k=2 failed alt') # if new methods for k == 3 or k == 4 are implemented add them here # Check the general subgraph method works by itself alt_subgraph_ccs = fset([set(C.nodes()) for C in general_k_edge_subgraphs(G, k=k)]) assert_equal(alt_subgraph_ccs, ccs_subgraph, 'alt subgraph method failed') # Stop once k is larger than all special case methods # and we cannot break down ccs any further. if k > 2 and all(len(cc) == 1 for cc in ccs_local): break
def test_bridge_cc(): # define 2-connected components and bridges cc2 = [(1, 2, 4, 3, 1, 4), (8, 9, 10, 8), (11, 12, 13, 11)] bridges = [(4, 8), (3, 5), (20, 21), (22, 23, 24)] G = nx.Graph(it.chain(*(pairwise(path) for path in cc2 + bridges))) bridge_ccs = fset(bridge_components(G)) target_ccs = fset([ {1, 2, 3, 4}, {5}, {8, 9, 10}, {11, 12, 13}, {20}, {21}, {22}, {23}, {24} ]) assert_equal(bridge_ccs, target_ccs) _check_edge_connectivity(G)
def test_bridge_cc(): # define 2-connected components and bridges cc2 = [(1, 2, 4, 3, 1, 4), (8, 9, 10, 8), (11, 12, 13, 11)] bridges = [(4, 8), (3, 5), (20, 21), (22, 23, 24)] G = nx.Graph(it.chain(*(pairwise(path) for path in cc2 + bridges))) bridge_ccs = fset(bridge_components(G)) target_ccs = fset([ set([1, 2, 3, 4]), set([5]), set([8, 9, 10]), set([11, 12, 13]), set([20]), set([21]), set([22]), set([23]), set([24]) ]) assert_equal(bridge_ccs, target_ccs) _check_edge_connectivity(G)