blob: 85f967af3f85ef166ec18b69ab3ae3e0f56f036c [file] [log] [blame]
#!/usr/bin/env python
from nose.tools import *
import networkx as nx
from networkx.algorithms.components import biconnected
def assert_components_equal(x,y):
sx = set((frozenset([frozenset(e) for e in c]) for c in x))
sy = set((frozenset([frozenset(e) for e in c]) for c in y))
assert_equal(sx,sy)
def test_barbell():
G=nx.barbell_graph(8,4)
G.add_path([7,20,21,22])
G.add_cycle([22,23,24,25])
pts=set(biconnected.articulation_points(G))
assert_equal(pts,set([7,8,9,10,11,12,20,21,22]))
answer = [set([12, 13, 14, 15, 16, 17, 18, 19]),
set([0, 1, 2, 3, 4, 5, 6, 7]),
set([22, 23, 24, 25]),
set([11, 12]),
set([10, 11]),
set([9, 10]),
set([8, 9]),
set([7, 8]),
set([21, 22]),
set([20, 21]),
set([7, 20])]
bcc=list(biconnected.biconnected_components(G))
bcc.sort(key=len, reverse=True)
assert_equal(bcc,answer)
G.add_edge(2,17)
pts=set(biconnected.articulation_points(G))
assert_equal(pts,set([7,20,21,22]))
def test_articulation_points_cycle():
G=nx.cycle_graph(3)
G.add_cycle([1,3,4])
pts=set(biconnected.articulation_points(G))
assert_equal(pts,set([1]))
def test_is_biconnected():
G=nx.cycle_graph(3)
assert_true(biconnected.is_biconnected(G))
G.add_cycle([1,3,4])
assert_false(biconnected.is_biconnected(G))
def test_empty_is_biconnected():
G=nx.empty_graph(5)
assert_false(biconnected.is_biconnected(G))
G.add_edge(0,1)
assert_false(biconnected.is_biconnected(G))
def test_biconnected_components_cycle():
G=nx.cycle_graph(3)
G.add_cycle([1,3,4])
pts = set(map(frozenset,biconnected.biconnected_components(G)))
assert_equal(pts,set([frozenset([0,1,2]),frozenset([1,3,4])]))
def test_biconnected_component_subgraphs_cycle():
G=nx.cycle_graph(3)
G.add_cycle([1,3,4,5])
G.add_edge(1,3,eattr='red') # test copying of edge data
G.node[1]['nattr']='blue'
G.graph['gattr']='green'
Gc = set(biconnected.biconnected_component_subgraphs(G))
assert_equal(len(Gc),2)
g1,g2=Gc
if 0 in g1:
assert_true(nx.is_isomorphic(g1,nx.Graph([(0,1),(0,2),(1,2)])))
assert_true(nx.is_isomorphic(g2,nx.Graph([(1,3),(1,5),(3,4),(4,5)])))
assert_equal(g2[1][3]['eattr'],'red')
assert_equal(g2.node[1]['nattr'],'blue')
assert_equal(g2.graph['gattr'],'green')
g2[1][3]['eattr']='blue'
assert_equal(g2[1][3]['eattr'],'blue')
assert_equal(G[1][3]['eattr'],'red')
else:
assert_true(nx.is_isomorphic(g1,nx.Graph([(1,3),(1,5),(3,4),(4,5)])))
assert_true(nx.is_isomorphic(g2,nx.Graph([(0,1),(0,2),(1,2)])))
assert_equal(g1[1][3]['eattr'],'red')
assert_equal(g1.node[1]['nattr'],'blue')
assert_equal(g1.graph['gattr'],'green')
g1[1][3]['eattr']='blue'
assert_equal(g1[1][3]['eattr'],'blue')
assert_equal(G[1][3]['eattr'],'red')
def test_biconnected_components1():
# graph example from
# http://www.ibluemojo.com/school/articul_algorithm.html
edges=[(0,1),
(0,5),
(0,6),
(0,14),
(1,5),
(1,6),
(1,14),
(2,4),
(2,10),
(3,4),
(3,15),
(4,6),
(4,7),
(4,10),
(5,14),
(6,14),
(7,9),
(8,9),
(8,12),
(8,13),
(10,15),
(11,12),
(11,13),
(12,13)]
G=nx.Graph(edges)
pts = set(biconnected.articulation_points(G))
assert_equal(pts,set([4,6,7,8,9]))
comps = list(biconnected.biconnected_component_edges(G))
answer = [
[(3,4),(15,3),(10,15),(10,4),(2,10),(4,2)],
[(13,12),(13,8),(11,13),(12,11),(8,12)],
[(9,8)],
[(7,9)],
[(4,7)],
[(6,4)],
[(14,0),(5,1),(5,0),(14,5),(14,1),(6,14),(6,0),(1,6),(0,1)],
]
assert_components_equal(comps,answer)
def test_biconnected_components2():
G=nx.Graph()
G.add_cycle('ABC')
G.add_cycle('CDE')
G.add_cycle('FIJHG')
G.add_cycle('GIJ')
G.add_edge('E','G')
comps = list(biconnected.biconnected_component_edges(G))
answer = [
[tuple('GF'),tuple('FI'),tuple('IG'),tuple('IJ'),tuple('JG'),tuple('JH'),tuple('HG')],
[tuple('EG')],
[tuple('CD'),tuple('DE'),tuple('CE')],
[tuple('AB'),tuple('BC'),tuple('AC')]
]
assert_components_equal(comps,answer)
def test_biconnected_davis():
D = nx.davis_southern_women_graph()
bcc = list(biconnected.biconnected_components(D))[0]
assert_true(set(D) == bcc) # All nodes in a giant bicomponent
# So no articulation points
assert_equal(list(biconnected.articulation_points(D)),[])
def test_biconnected_karate():
K = nx.karate_club_graph()
answer = [set([0, 1, 2, 3, 7, 8, 9, 12, 13, 14, 15, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]),
set([0, 4, 5, 6, 10, 16]),
set([0, 11])]
bcc = list(biconnected.biconnected_components(K))
bcc.sort(key=len, reverse=True)
assert_true(list(biconnected.biconnected_components(K)) == answer)
assert_equal(list(biconnected.articulation_points(K)),[0])
def test_biconnected_eppstein():
# tests from http://www.ics.uci.edu/~eppstein/PADS/Biconnectivity.py
G1 = nx.Graph({
0: [1,2,5],
1: [0,5],
2: [0,3,4],
3: [2,4,5,6],
4: [2,3,5,6],
5: [0,1,3,4],
6: [3,4]})
G2 = nx.Graph({
0: [2,5],
1: [3,8],
2: [0,3,5],
3: [1,2,6,8],
4: [7],
5: [0,2],
6: [3,8],
7: [4],
8: [1,3,6]})
assert_true(biconnected.is_biconnected(G1))
assert_false(biconnected.is_biconnected(G2))
answer_G2 = [set([1, 3, 6, 8]), set([0, 2, 5]), set([2, 3]), set([4, 7])]
bcc = list(biconnected.biconnected_components(G2))
bcc.sort(key=len, reverse=True)
assert_equal(bcc, answer_G2)