183 lines
7.0 KiB
Python
183 lines
7.0 KiB
Python
|
#!/usr/bin/env python
|
||
|
import pytest
|
||
|
|
||
|
import networkx as nx
|
||
|
from networkx.testing import almost_equal
|
||
|
from networkx import edge_current_flow_betweenness_centrality \
|
||
|
as edge_current_flow
|
||
|
from networkx import approximate_current_flow_betweenness_centrality \
|
||
|
as approximate_cfbc
|
||
|
|
||
|
|
||
|
np = pytest.importorskip('numpy')
|
||
|
npt = pytest.importorskip('numpy.testing')
|
||
|
scipy = pytest.importorskip('scipy')
|
||
|
|
||
|
|
||
|
class TestFlowBetweennessCentrality(object):
|
||
|
def test_K4_normalized(self):
|
||
|
"""Betweenness centrality: K4"""
|
||
|
G = nx.complete_graph(4)
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=True)
|
||
|
b_answer = {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25}
|
||
|
for n in sorted(G):
|
||
|
assert almost_equal(b[n], b_answer[n])
|
||
|
G.add_edge(0, 1, weight=0.5, other=0.3)
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=True, weight=None)
|
||
|
for n in sorted(G):
|
||
|
assert almost_equal(b[n], b_answer[n])
|
||
|
wb_answer = {0: 0.2222222, 1: 0.2222222, 2: 0.30555555, 3: 0.30555555}
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=True, weight='weight')
|
||
|
for n in sorted(G):
|
||
|
assert almost_equal(b[n], wb_answer[n])
|
||
|
wb_answer = {0: 0.2051282, 1: 0.2051282, 2: 0.33974358, 3: 0.33974358}
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=True, weight='other')
|
||
|
for n in sorted(G):
|
||
|
assert almost_equal(b[n], wb_answer[n])
|
||
|
|
||
|
def test_K4(self):
|
||
|
"""Betweenness centrality: K4"""
|
||
|
G = nx.complete_graph(4)
|
||
|
for solver in ['full', 'lu', 'cg']:
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=False,
|
||
|
solver=solver)
|
||
|
b_answer = {0: 0.75, 1: 0.75, 2: 0.75, 3: 0.75}
|
||
|
for n in sorted(G):
|
||
|
assert almost_equal(b[n], b_answer[n])
|
||
|
|
||
|
def test_P4_normalized(self):
|
||
|
"""Betweenness centrality: P4 normalized"""
|
||
|
G = nx.path_graph(4)
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=True)
|
||
|
b_answer = {0: 0, 1: 2. / 3, 2: 2. / 3, 3: 0}
|
||
|
for n in sorted(G):
|
||
|
assert almost_equal(b[n], b_answer[n])
|
||
|
|
||
|
def test_P4(self):
|
||
|
"""Betweenness centrality: P4"""
|
||
|
G = nx.path_graph(4)
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=False)
|
||
|
b_answer = {0: 0, 1: 2, 2: 2, 3: 0}
|
||
|
for n in sorted(G):
|
||
|
assert almost_equal(b[n], b_answer[n])
|
||
|
|
||
|
def test_star(self):
|
||
|
"""Betweenness centrality: star """
|
||
|
G = nx.Graph()
|
||
|
nx.add_star(G, ['a', 'b', 'c', 'd'])
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=True)
|
||
|
b_answer = {'a': 1.0, 'b': 0.0, 'c': 0.0, 'd': 0.0}
|
||
|
for n in sorted(G):
|
||
|
assert almost_equal(b[n], b_answer[n])
|
||
|
|
||
|
def test_solvers2(self):
|
||
|
"""Betweenness centrality: alternate solvers"""
|
||
|
G = nx.complete_graph(4)
|
||
|
for solver in ['full', 'lu', 'cg']:
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=False,
|
||
|
solver=solver)
|
||
|
b_answer = {0: 0.75, 1: 0.75, 2: 0.75, 3: 0.75}
|
||
|
for n in sorted(G):
|
||
|
assert almost_equal(b[n], b_answer[n])
|
||
|
|
||
|
|
||
|
class TestApproximateFlowBetweennessCentrality(object):
|
||
|
|
||
|
def test_K4_normalized(self):
|
||
|
"Approximate current-flow betweenness centrality: K4 normalized"
|
||
|
G = nx.complete_graph(4)
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=True)
|
||
|
epsilon = 0.1
|
||
|
ba = approximate_cfbc(G, normalized=True, epsilon=0.5 * epsilon)
|
||
|
for n in sorted(G):
|
||
|
npt.assert_allclose(b[n], ba[n], atol=epsilon)
|
||
|
|
||
|
def test_K4(self):
|
||
|
"Approximate current-flow betweenness centrality: K4"
|
||
|
G = nx.complete_graph(4)
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=False)
|
||
|
epsilon = 0.1
|
||
|
ba = approximate_cfbc(G, normalized=False, epsilon=0.5 * epsilon)
|
||
|
for n in sorted(G):
|
||
|
npt.assert_allclose(b[n], ba[n], atol=epsilon * len(G)**2)
|
||
|
|
||
|
def test_star(self):
|
||
|
"Approximate current-flow betweenness centrality: star"
|
||
|
G = nx.Graph()
|
||
|
nx.add_star(G, ['a', 'b', 'c', 'd'])
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=True)
|
||
|
epsilon = 0.1
|
||
|
ba = approximate_cfbc(G, normalized=True, epsilon=0.5 * epsilon)
|
||
|
for n in sorted(G):
|
||
|
npt.assert_allclose(b[n], ba[n], atol=epsilon)
|
||
|
|
||
|
def test_grid(self):
|
||
|
"Approximate current-flow betweenness centrality: 2d grid"
|
||
|
G = nx.grid_2d_graph(4, 4)
|
||
|
b = nx.current_flow_betweenness_centrality(G, normalized=True)
|
||
|
epsilon = 0.1
|
||
|
ba = approximate_cfbc(G, normalized=True, epsilon=0.5 * epsilon)
|
||
|
for n in sorted(G):
|
||
|
npt.assert_allclose(b[n], ba[n], atol=epsilon)
|
||
|
|
||
|
def test_seed(self):
|
||
|
G = nx.complete_graph(4)
|
||
|
b = approximate_cfbc(G, normalized=False, epsilon=0.05, seed=1)
|
||
|
b_answer = {0: 0.75, 1: 0.75, 2: 0.75, 3: 0.75}
|
||
|
for n in sorted(G):
|
||
|
npt.assert_allclose(b[n], b_answer[n], atol=0.1)
|
||
|
|
||
|
def test_solvers(self):
|
||
|
"Approximate current-flow betweenness centrality: solvers"
|
||
|
G = nx.complete_graph(4)
|
||
|
epsilon = 0.1
|
||
|
for solver in ['full', 'lu', 'cg']:
|
||
|
b = approximate_cfbc(G, normalized=False, solver=solver,
|
||
|
epsilon=0.5 * epsilon)
|
||
|
b_answer = {0: 0.75, 1: 0.75, 2: 0.75, 3: 0.75}
|
||
|
for n in sorted(G):
|
||
|
npt.assert_allclose(b[n], b_answer[n], atol=epsilon)
|
||
|
|
||
|
|
||
|
class TestWeightedFlowBetweennessCentrality(object):
|
||
|
pass
|
||
|
|
||
|
|
||
|
class TestEdgeFlowBetweennessCentrality(object):
|
||
|
|
||
|
def test_K4(self):
|
||
|
"""Edge flow betweenness centrality: K4"""
|
||
|
G = nx.complete_graph(4)
|
||
|
b = edge_current_flow(G, normalized=True)
|
||
|
b_answer = dict.fromkeys(G.edges(), 0.25)
|
||
|
for (s, t), v1 in b_answer.items():
|
||
|
v2 = b.get((s, t), b.get((t, s)))
|
||
|
assert almost_equal(v1, v2)
|
||
|
|
||
|
def test_K4_normalized(self):
|
||
|
"""Edge flow betweenness centrality: K4"""
|
||
|
G = nx.complete_graph(4)
|
||
|
b = edge_current_flow(G, normalized=False)
|
||
|
b_answer = dict.fromkeys(G.edges(), 0.75)
|
||
|
for (s, t), v1 in b_answer.items():
|
||
|
v2 = b.get((s, t), b.get((t, s)))
|
||
|
assert almost_equal(v1, v2)
|
||
|
|
||
|
def test_C4(self):
|
||
|
"""Edge flow betweenness centrality: C4"""
|
||
|
G = nx.cycle_graph(4)
|
||
|
b = edge_current_flow(G, normalized=False)
|
||
|
b_answer = {(0, 1): 1.25, (0, 3): 1.25, (1, 2): 1.25, (2, 3): 1.25}
|
||
|
for (s, t), v1 in b_answer.items():
|
||
|
v2 = b.get((s, t), b.get((t, s)))
|
||
|
assert almost_equal(v1, v2)
|
||
|
|
||
|
def test_P4(self):
|
||
|
"""Edge betweenness centrality: P4"""
|
||
|
G = nx.path_graph(4)
|
||
|
b = edge_current_flow(G, normalized=False)
|
||
|
b_answer = {(0, 1): 1.5, (1, 2): 2.0, (2, 3): 1.5}
|
||
|
for (s, t), v1 in b_answer.items():
|
||
|
v2 = b.get((s, t), b.get((t, s)))
|
||
|
assert almost_equal(v1, v2)
|