169 lines
6.3 KiB
Python
169 lines
6.3 KiB
Python
|
import networkx as nx
|
||
|
from networkx.algorithms import bipartite
|
||
|
from networkx.testing import almost_equal
|
||
|
|
||
|
class TestBipartiteCentrality(object):
|
||
|
|
||
|
@classmethod
|
||
|
def setup_class(cls):
|
||
|
cls.P4 = nx.path_graph(4)
|
||
|
cls.K3 = nx.complete_bipartite_graph(3, 3)
|
||
|
cls.C4 = nx.cycle_graph(4)
|
||
|
cls.davis = nx.davis_southern_women_graph()
|
||
|
cls.top_nodes = [n for n, d in cls.davis.nodes(data=True)
|
||
|
if d['bipartite'] == 0]
|
||
|
|
||
|
def test_degree_centrality(self):
|
||
|
d = bipartite.degree_centrality(self.P4, [1, 3])
|
||
|
answer = {0: 0.5, 1: 1.0, 2: 1.0, 3: 0.5}
|
||
|
assert d == answer
|
||
|
d = bipartite.degree_centrality(self.K3, [0, 1, 2])
|
||
|
answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0, 5: 1.0}
|
||
|
assert d == answer
|
||
|
d = bipartite.degree_centrality(self.C4, [0, 2])
|
||
|
answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0}
|
||
|
assert d == answer
|
||
|
|
||
|
def test_betweenness_centrality(self):
|
||
|
c = bipartite.betweenness_centrality(self.P4, [1, 3])
|
||
|
answer = {0: 0.0, 1: 1.0, 2: 1.0, 3: 0.0}
|
||
|
assert c == answer
|
||
|
c = bipartite.betweenness_centrality(self.K3, [0, 1, 2])
|
||
|
answer = {0: 0.125, 1: 0.125, 2: 0.125, 3: 0.125, 4: 0.125, 5: 0.125}
|
||
|
assert c == answer
|
||
|
c = bipartite.betweenness_centrality(self.C4, [0, 2])
|
||
|
answer = {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25}
|
||
|
assert c == answer
|
||
|
|
||
|
def test_closeness_centrality(self):
|
||
|
c = bipartite.closeness_centrality(self.P4, [1, 3])
|
||
|
answer = {0: 2.0 / 3, 1: 1.0, 2: 1.0, 3: 2.0 / 3}
|
||
|
assert c == answer
|
||
|
c = bipartite.closeness_centrality(self.K3, [0, 1, 2])
|
||
|
answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0, 5: 1.0}
|
||
|
assert c == answer
|
||
|
c = bipartite.closeness_centrality(self.C4, [0, 2])
|
||
|
answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0}
|
||
|
assert c == answer
|
||
|
G = nx.Graph()
|
||
|
G.add_node(0)
|
||
|
G.add_node(1)
|
||
|
c = bipartite.closeness_centrality(G, [0])
|
||
|
assert c == {1: 0.0}
|
||
|
c = bipartite.closeness_centrality(G, [1])
|
||
|
assert c == {1: 0.0}
|
||
|
|
||
|
def test_davis_degree_centrality(self):
|
||
|
G = self.davis
|
||
|
deg = bipartite.degree_centrality(G, self.top_nodes)
|
||
|
answer = {'E8': 0.78,
|
||
|
'E9': 0.67,
|
||
|
'E7': 0.56,
|
||
|
'Nora Fayette': 0.57,
|
||
|
'Evelyn Jefferson': 0.57,
|
||
|
'Theresa Anderson': 0.57,
|
||
|
'E6': 0.44,
|
||
|
'Sylvia Avondale': 0.50,
|
||
|
'Laura Mandeville': 0.50,
|
||
|
'Brenda Rogers': 0.50,
|
||
|
'Katherina Rogers': 0.43,
|
||
|
'E5': 0.44,
|
||
|
'Helen Lloyd': 0.36,
|
||
|
'E3': 0.33,
|
||
|
'Ruth DeSand': 0.29,
|
||
|
'Verne Sanderson': 0.29,
|
||
|
'E12': 0.33,
|
||
|
'Myra Liddel': 0.29,
|
||
|
'E11': 0.22,
|
||
|
'Eleanor Nye': 0.29,
|
||
|
'Frances Anderson': 0.29,
|
||
|
'Pearl Oglethorpe': 0.21,
|
||
|
'E4': 0.22,
|
||
|
'Charlotte McDowd': 0.29,
|
||
|
'E10': 0.28,
|
||
|
'Olivia Carleton': 0.14,
|
||
|
'Flora Price': 0.14,
|
||
|
'E2': 0.17,
|
||
|
'E1': 0.17,
|
||
|
'Dorothy Murchison': 0.14,
|
||
|
'E13': 0.17,
|
||
|
'E14': 0.17}
|
||
|
for node, value in answer.items():
|
||
|
assert almost_equal(value, deg[node], places=2)
|
||
|
|
||
|
def test_davis_betweenness_centrality(self):
|
||
|
G = self.davis
|
||
|
bet = bipartite.betweenness_centrality(G, self.top_nodes)
|
||
|
answer = {'E8': 0.24,
|
||
|
'E9': 0.23,
|
||
|
'E7': 0.13,
|
||
|
'Nora Fayette': 0.11,
|
||
|
'Evelyn Jefferson': 0.10,
|
||
|
'Theresa Anderson': 0.09,
|
||
|
'E6': 0.07,
|
||
|
'Sylvia Avondale': 0.07,
|
||
|
'Laura Mandeville': 0.05,
|
||
|
'Brenda Rogers': 0.05,
|
||
|
'Katherina Rogers': 0.05,
|
||
|
'E5': 0.04,
|
||
|
'Helen Lloyd': 0.04,
|
||
|
'E3': 0.02,
|
||
|
'Ruth DeSand': 0.02,
|
||
|
'Verne Sanderson': 0.02,
|
||
|
'E12': 0.02,
|
||
|
'Myra Liddel': 0.02,
|
||
|
'E11': 0.02,
|
||
|
'Eleanor Nye': 0.01,
|
||
|
'Frances Anderson': 0.01,
|
||
|
'Pearl Oglethorpe': 0.01,
|
||
|
'E4': 0.01,
|
||
|
'Charlotte McDowd': 0.01,
|
||
|
'E10': 0.01,
|
||
|
'Olivia Carleton': 0.01,
|
||
|
'Flora Price': 0.01,
|
||
|
'E2': 0.00,
|
||
|
'E1': 0.00,
|
||
|
'Dorothy Murchison': 0.00,
|
||
|
'E13': 0.00,
|
||
|
'E14': 0.00}
|
||
|
for node, value in answer.items():
|
||
|
assert almost_equal(value, bet[node], places=2)
|
||
|
|
||
|
def test_davis_closeness_centrality(self):
|
||
|
G = self.davis
|
||
|
clos = bipartite.closeness_centrality(G, self.top_nodes)
|
||
|
answer = {'E8': 0.85,
|
||
|
'E9': 0.79,
|
||
|
'E7': 0.73,
|
||
|
'Nora Fayette': 0.80,
|
||
|
'Evelyn Jefferson': 0.80,
|
||
|
'Theresa Anderson': 0.80,
|
||
|
'E6': 0.69,
|
||
|
'Sylvia Avondale': 0.77,
|
||
|
'Laura Mandeville': 0.73,
|
||
|
'Brenda Rogers': 0.73,
|
||
|
'Katherina Rogers': 0.73,
|
||
|
'E5': 0.59,
|
||
|
'Helen Lloyd': 0.73,
|
||
|
'E3': 0.56,
|
||
|
'Ruth DeSand': 0.71,
|
||
|
'Verne Sanderson': 0.71,
|
||
|
'E12': 0.56,
|
||
|
'Myra Liddel': 0.69,
|
||
|
'E11': 0.54,
|
||
|
'Eleanor Nye': 0.67,
|
||
|
'Frances Anderson': 0.67,
|
||
|
'Pearl Oglethorpe': 0.67,
|
||
|
'E4': 0.54,
|
||
|
'Charlotte McDowd': 0.60,
|
||
|
'E10': 0.55,
|
||
|
'Olivia Carleton': 0.59,
|
||
|
'Flora Price': 0.59,
|
||
|
'E2': 0.52,
|
||
|
'E1': 0.52,
|
||
|
'Dorothy Murchison': 0.65,
|
||
|
'E13': 0.52,
|
||
|
'E14': 0.52}
|
||
|
for node, value in answer.items():
|
||
|
assert almost_equal(value, clos[node], places=2)
|