def test_triangles(): paths = [ (11, 12, 13, 11), # first 3-clique (21, 22, 23, 21), # second 3-clique (11, 21), # connected by an edge ] G = nx.Graph(it.chain(*[pairwise(path) for path in paths])) # subgraph and ccs are the same in all cases here assert_equal( fset(nx.k_edge_components(G, k=1)), fset(nx.k_edge_subgraphs(G, k=1)) ) assert_equal( fset(nx.k_edge_components(G, k=2)), fset(nx.k_edge_subgraphs(G, k=2)) ) assert_equal( fset(nx.k_edge_components(G, k=3)), fset(nx.k_edge_subgraphs(G, k=3)) ) _check_edge_connectivity(G)
def test_five_clique(): # Make a graph that can be disconnected less than 4 edges, but no node has # degree less than 4. G = nx.disjoint_union(nx.complete_graph(5), nx.complete_graph(5)) paths = [ # add aux-connections (1, 100, 6), (2, 100, 7), (3, 200, 8), (4, 200, 100), ] G.add_edges_from(it.chain(*[pairwise(path) for path in paths])) assert min(dict(nx.degree(G)).values()) == 4 # For k=3 they are the same assert fset(nx.k_edge_components(G, k=3)) == fset(nx.k_edge_subgraphs(G, k=3)) # For k=4 they are the different # the aux nodes are in the same CC as clique 1 but no the same subgraph assert fset(nx.k_edge_components(G, k=4)) != fset( nx.k_edge_subgraphs(G, k=4)) # For k=5 they are not the same assert fset(nx.k_edge_components(G, k=5)) != fset( nx.k_edge_subgraphs(G, k=5)) # For k=6 they are the same assert fset(nx.k_edge_components(G, k=6)) == fset(nx.k_edge_subgraphs(G, k=6)) _check_edge_connectivity(G)
def test_local_subgraph_difference_directed(): dipaths = [ (1, 2, 3, 4, 1), (1, 3, 1), ] G = nx.DiGraph(it.chain(*[pairwise(path) for path in dipaths])) assert_equal( fset(nx.k_edge_components(G, k=1)), fset(nx.k_edge_subgraphs(G, k=1)) ) # Unlike undirected graphs, when k=2, for directed graphs there is a case # where the k-edge-ccs are not the same as the k-edge-subgraphs. # (in directed graphs ccs and subgraphs are the same when k=2) assert_not_equal( fset(nx.k_edge_components(G, k=2)), fset(nx.k_edge_subgraphs(G, k=2)) ) assert_equal( fset(nx.k_edge_components(G, k=3)), fset(nx.k_edge_subgraphs(G, k=3)) ) _check_edge_connectivity(G)
def test_empty_input(): G = nx.Graph() assert [] == list(nx.k_edge_components(G, k=5)) assert [] == list(nx.k_edge_subgraphs(G, k=5)) G = nx.DiGraph() assert [] == list(nx.k_edge_components(G, k=5)) assert [] == list(nx.k_edge_subgraphs(G, k=5))
def test_empty_input(): G = nx.Graph() assert_equal([], list(nx.k_edge_components(G, k=5))) assert_equal([], list(nx.k_edge_subgraphs(G, k=5))) G = nx.DiGraph() assert_equal([], list(nx.k_edge_components(G, k=5))) assert_equal([], list(nx.k_edge_subgraphs(G, k=5)))
def test_four_clique(): paths = [ (11, 12, 13, 14, 11, 13, 14, 12), # first 4-clique (21, 22, 23, 24, 21, 23, 24, 22), # second 4-clique # paths connecting the 4 cliques such that they are # 3-connected in G, but not in the subgraph. # Case where the nodes bridging them do not have degree less than 3. (100, 13), (12, 100, 22), (13, 200, 23), (14, 300, 24), ] G = nx.Graph(it.chain(*[pairwise(path) for path in paths])) # The subgraphs and ccs are different for k=3 local_ccs = fset(nx.k_edge_components(G, k=3)) subgraphs = fset(nx.k_edge_subgraphs(G, k=3)) assert local_ccs != subgraphs # The cliques ares in the same cc clique1 = frozenset(paths[0]) clique2 = frozenset(paths[1]) assert clique1.union(clique2).union({100}) in local_ccs # but different subgraphs assert clique1 in subgraphs assert clique2 in subgraphs assert G.degree(100) == 3 _check_edge_connectivity(G)
def test_four_clique(): paths = [ (11, 12, 13, 14, 11, 13, 14, 12), # first 4-clique (21, 22, 23, 24, 21, 23, 24, 22), # second 4-clique # paths connecting the 4 cliques such that they are # 3-connected in G, but not in the subgraph. # Case where the nodes bridging them do not have degree less than 3. (100, 13), (12, 100, 22), (13, 200, 23), (14, 300, 24), ] G = nx.Graph(it.chain(*[pairwise(path) for path in paths])) # The subgraphs and ccs are different for k=3 local_ccs = fset(nx.k_edge_components(G, k=3)) subgraphs = fset(nx.k_edge_subgraphs(G, k=3)) assert_not_equal(local_ccs, subgraphs) # The cliques ares in the same cc clique1 = frozenset(paths[0]) clique2 = frozenset(paths[1]) assert_in(clique1.union(clique2).union({100}), local_ccs) # but different subgraphs assert_in(clique1, subgraphs) assert_in(clique2, subgraphs) assert_equal(G.degree(100), 3) _check_edge_connectivity(G)
def get_k_connected_routers(self, k): graph = self.to_undirected() components = nx.k_edge_components(graph, k=k) k_connected_pairs = set() for component in components: for r1, r2 in itertools.combinations(component, 2): if r1 < r2: k_connected_pairs.add((r1, r2)) else: k_connected_pairs.add((r2, r1)) return k_connected_pairs
def test_five_clique(): # Make a graph that can be disconnected less than 4 edges, but no node has # degree less than 4. G = nx.disjoint_union(nx.complete_graph(5), nx.complete_graph(5)) paths = [ # add aux-connections (1, 100, 6), (2, 100, 7), (3, 200, 8), (4, 200, 100), ] G.add_edges_from(it.chain(*[pairwise(path) for path in paths])) assert_equal(min(dict(nx.degree(G)).values()), 4) # For k=3 they are the same assert_equal( fset(nx.k_edge_components(G, k=3)), fset(nx.k_edge_subgraphs(G, k=3)) ) # For k=4 they are the different # the aux nodes are in the same CC as clique 1 but no the same subgraph assert_not_equal( fset(nx.k_edge_components(G, k=4)), fset(nx.k_edge_subgraphs(G, k=4)) ) # For k=5 they are not the same assert_not_equal( fset(nx.k_edge_components(G, k=5)), fset(nx.k_edge_subgraphs(G, k=5)) ) # For k=6 they are the same assert_equal( fset(nx.k_edge_components(G, k=6)), fset(nx.k_edge_subgraphs(G, k=6)) ) _check_edge_connectivity(G)