blob: 2745504259270168f40f65b18fbd7e64b4adc892 [file] [log] [blame]
from nose.tools import assert_equal, assert_true, assert_false
import networkx as nx
# helper functions for tests
def _generate_no_biconnected(max_attempts=50):
attempts = 0
while True:
G = nx.fast_gnp_random_graph(100,0.0575)
if nx.is_connected(G) and not nx.is_biconnected(G):
attempts = 0
yield G
else:
if attempts >= max_attempts:
msg = "Tried %d times: no suitable Graph."
raise Exception(msg % max_attempts)
else:
attempts += 1
def is_dominating_set(G, nbunch):
# Proposed by Dan on the mailing list
allnodes=set(G)
testset=set(n for n in nbunch if n in G)
nbrs=set()
for n in testset:
nbrs.update(G[n])
if nbrs - allnodes: # some nodes left--not dominating
return False
else:
return True
# Tests for node and edge connectivity
def test_average_connectivity():
# figure 1 from:
# Beineke, L., O. Oellermann, and R. Pippert (2002). The average
# connectivity of a graph. Discrete mathematics 252(1-3), 31-45
# http://www.sciencedirect.com/science/article/pii/S0012365X01001807
G1 = nx.path_graph(3)
G1.add_edges_from([(1,3),(1,4)])
assert_equal(nx.average_node_connectivity(G1),1)
G2 = nx.path_graph(3)
G2.add_edges_from([(1,3),(1,4),(0,3),(0,4),(3,4)])
assert_equal(nx.average_node_connectivity(G2),2.2)
G3 = nx.Graph()
assert_equal(nx.average_node_connectivity(G3),0)
def test_articulation_points():
Ggen = _generate_no_biconnected()
for i in range(5):
G = next(Ggen)
assert_equal(nx.node_connectivity(G), 1)
def test_brandes_erlebach():
# Figure 1 chapter 7: Connectivity
# http://www.informatik.uni-augsburg.de/thi/personen/kammer/Graph_Connectivity.pdf
G = nx.Graph()
G.add_edges_from([(1,2),(1,3),(1,4),(1,5),(2,3),(2,6),(3,4),
(3,6),(4,6),(4,7),(5,7),(6,8),(6,9),(7,8),
(7,10),(8,11),(9,10),(9,11),(10,11)])
assert_equal(3,nx.local_edge_connectivity(G,1,11))
assert_equal(3,nx.edge_connectivity(G,1,11))
assert_equal(2,nx.local_node_connectivity(G,1,11))
assert_equal(2,nx.node_connectivity(G,1,11))
assert_equal(2,nx.edge_connectivity(G)) # node 5 has degree 2
assert_equal(2,nx.node_connectivity(G))
def test_white_harary_1():
# Figure 1b white and harary (2001)
# # http://eclectic.ss.uci.edu/~drwhite/sm-w23.PDF
# A graph with high adhesion (edge connectivity) and low cohesion
# (vertex connectivity)
G = nx.disjoint_union(nx.complete_graph(4), nx.complete_graph(4))
G.remove_node(7)
for i in range(4,7):
G.add_edge(0,i)
G = nx.disjoint_union(G, nx.complete_graph(4))
G.remove_node(G.order()-1)
for i in range(7,10):
G.add_edge(0,i)
assert_equal(1, nx.node_connectivity(G))
assert_equal(3, nx.edge_connectivity(G))
def test_white_harary_2():
# Figure 8 white and harary (2001)
# # http://eclectic.ss.uci.edu/~drwhite/sm-w23.PDF
G = nx.disjoint_union(nx.complete_graph(4), nx.complete_graph(4))
G.add_edge(0,4)
# kappa <= lambda <= delta
assert_equal(3, min(nx.core_number(G).values()))
assert_equal(1, nx.node_connectivity(G))
assert_equal(1, nx.edge_connectivity(G))
def test_complete_graphs():
for n in range(5, 25, 5):
G = nx.complete_graph(n)
assert_equal(n-1, nx.node_connectivity(G))
assert_equal(n-1, nx.node_connectivity(G.to_directed()))
assert_equal(n-1, nx.edge_connectivity(G))
assert_equal(n-1, nx.edge_connectivity(G.to_directed()))
def test_empty_graphs():
for k in range(5, 25, 5):
G = nx.empty_graph(k)
assert_equal(0, nx.node_connectivity(G))
assert_equal(0, nx.edge_connectivity(G))
def test_petersen():
G = nx.petersen_graph()
assert_equal(3, nx.node_connectivity(G))
assert_equal(3, nx.edge_connectivity(G))
def test_tutte():
G = nx.tutte_graph()
assert_equal(3, nx.node_connectivity(G))
assert_equal(3, nx.edge_connectivity(G))
def test_dodecahedral():
G = nx.dodecahedral_graph()
assert_equal(3, nx.node_connectivity(G))
assert_equal(3, nx.edge_connectivity(G))
def test_octahedral():
G=nx.octahedral_graph()
assert_equal(4, nx.node_connectivity(G))
assert_equal(4, nx.edge_connectivity(G))
def test_icosahedral():
G=nx.icosahedral_graph()
assert_equal(5, nx.node_connectivity(G))
assert_equal(5, nx.edge_connectivity(G))
def test_directed_edge_connectivity():
G = nx.cycle_graph(10,create_using=nx.DiGraph()) # only one direction
D = nx.cycle_graph(10).to_directed() # 2 reciprocal edges
assert_equal(1, nx.edge_connectivity(G))
assert_equal(1, nx.local_edge_connectivity(G,1,4))
assert_equal(1, nx.edge_connectivity(G,1,4))
assert_equal(2, nx.edge_connectivity(D))
assert_equal(2, nx.local_edge_connectivity(D,1,4))
assert_equal(2, nx.edge_connectivity(D,1,4))
def test_dominating_set():
for i in range(5):
G = nx.gnp_random_graph(100,0.1)
D = nx.dominating_set(G)
assert_true(is_dominating_set(G,D))