test_centrality.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import pytest
  2. import networkx as nx
  3. from networkx.algorithms import bipartite
  4. class TestBipartiteCentrality:
  5. @classmethod
  6. def setup_class(cls):
  7. cls.P4 = nx.path_graph(4)
  8. cls.K3 = nx.complete_bipartite_graph(3, 3)
  9. cls.C4 = nx.cycle_graph(4)
  10. cls.davis = nx.davis_southern_women_graph()
  11. cls.top_nodes = [
  12. n for n, d in cls.davis.nodes(data=True) if d["bipartite"] == 0
  13. ]
  14. def test_degree_centrality(self):
  15. d = bipartite.degree_centrality(self.P4, [1, 3])
  16. answer = {0: 0.5, 1: 1.0, 2: 1.0, 3: 0.5}
  17. assert d == answer
  18. d = bipartite.degree_centrality(self.K3, [0, 1, 2])
  19. answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0, 5: 1.0}
  20. assert d == answer
  21. d = bipartite.degree_centrality(self.C4, [0, 2])
  22. answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0}
  23. assert d == answer
  24. def test_betweenness_centrality(self):
  25. c = bipartite.betweenness_centrality(self.P4, [1, 3])
  26. answer = {0: 0.0, 1: 1.0, 2: 1.0, 3: 0.0}
  27. assert c == answer
  28. c = bipartite.betweenness_centrality(self.K3, [0, 1, 2])
  29. answer = {0: 0.125, 1: 0.125, 2: 0.125, 3: 0.125, 4: 0.125, 5: 0.125}
  30. assert c == answer
  31. c = bipartite.betweenness_centrality(self.C4, [0, 2])
  32. answer = {0: 0.25, 1: 0.25, 2: 0.25, 3: 0.25}
  33. assert c == answer
  34. def test_closeness_centrality(self):
  35. c = bipartite.closeness_centrality(self.P4, [1, 3])
  36. answer = {0: 2.0 / 3, 1: 1.0, 2: 1.0, 3: 2.0 / 3}
  37. assert c == answer
  38. c = bipartite.closeness_centrality(self.K3, [0, 1, 2])
  39. answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0, 5: 1.0}
  40. assert c == answer
  41. c = bipartite.closeness_centrality(self.C4, [0, 2])
  42. answer = {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0}
  43. assert c == answer
  44. G = nx.Graph()
  45. G.add_node(0)
  46. G.add_node(1)
  47. c = bipartite.closeness_centrality(G, [0])
  48. assert c == {0: 0.0, 1: 0.0}
  49. c = bipartite.closeness_centrality(G, [1])
  50. assert c == {0: 0.0, 1: 0.0}
  51. def test_bipartite_closeness_centrality_unconnected(self):
  52. G = nx.complete_bipartite_graph(3, 3)
  53. G.add_edge(6, 7)
  54. c = bipartite.closeness_centrality(G, [0, 2, 4, 6], normalized=False)
  55. answer = {
  56. 0: 10.0 / 7,
  57. 2: 10.0 / 7,
  58. 4: 10.0 / 7,
  59. 6: 10.0,
  60. 1: 10.0 / 7,
  61. 3: 10.0 / 7,
  62. 5: 10.0 / 7,
  63. 7: 10.0,
  64. }
  65. assert c == answer
  66. def test_davis_degree_centrality(self):
  67. G = self.davis
  68. deg = bipartite.degree_centrality(G, self.top_nodes)
  69. answer = {
  70. "E8": 0.78,
  71. "E9": 0.67,
  72. "E7": 0.56,
  73. "Nora Fayette": 0.57,
  74. "Evelyn Jefferson": 0.57,
  75. "Theresa Anderson": 0.57,
  76. "E6": 0.44,
  77. "Sylvia Avondale": 0.50,
  78. "Laura Mandeville": 0.50,
  79. "Brenda Rogers": 0.50,
  80. "Katherina Rogers": 0.43,
  81. "E5": 0.44,
  82. "Helen Lloyd": 0.36,
  83. "E3": 0.33,
  84. "Ruth DeSand": 0.29,
  85. "Verne Sanderson": 0.29,
  86. "E12": 0.33,
  87. "Myra Liddel": 0.29,
  88. "E11": 0.22,
  89. "Eleanor Nye": 0.29,
  90. "Frances Anderson": 0.29,
  91. "Pearl Oglethorpe": 0.21,
  92. "E4": 0.22,
  93. "Charlotte McDowd": 0.29,
  94. "E10": 0.28,
  95. "Olivia Carleton": 0.14,
  96. "Flora Price": 0.14,
  97. "E2": 0.17,
  98. "E1": 0.17,
  99. "Dorothy Murchison": 0.14,
  100. "E13": 0.17,
  101. "E14": 0.17,
  102. }
  103. for node, value in answer.items():
  104. assert value == pytest.approx(deg[node], abs=1e-2)
  105. def test_davis_betweenness_centrality(self):
  106. G = self.davis
  107. bet = bipartite.betweenness_centrality(G, self.top_nodes)
  108. answer = {
  109. "E8": 0.24,
  110. "E9": 0.23,
  111. "E7": 0.13,
  112. "Nora Fayette": 0.11,
  113. "Evelyn Jefferson": 0.10,
  114. "Theresa Anderson": 0.09,
  115. "E6": 0.07,
  116. "Sylvia Avondale": 0.07,
  117. "Laura Mandeville": 0.05,
  118. "Brenda Rogers": 0.05,
  119. "Katherina Rogers": 0.05,
  120. "E5": 0.04,
  121. "Helen Lloyd": 0.04,
  122. "E3": 0.02,
  123. "Ruth DeSand": 0.02,
  124. "Verne Sanderson": 0.02,
  125. "E12": 0.02,
  126. "Myra Liddel": 0.02,
  127. "E11": 0.02,
  128. "Eleanor Nye": 0.01,
  129. "Frances Anderson": 0.01,
  130. "Pearl Oglethorpe": 0.01,
  131. "E4": 0.01,
  132. "Charlotte McDowd": 0.01,
  133. "E10": 0.01,
  134. "Olivia Carleton": 0.01,
  135. "Flora Price": 0.01,
  136. "E2": 0.00,
  137. "E1": 0.00,
  138. "Dorothy Murchison": 0.00,
  139. "E13": 0.00,
  140. "E14": 0.00,
  141. }
  142. for node, value in answer.items():
  143. assert value == pytest.approx(bet[node], abs=1e-2)
  144. def test_davis_closeness_centrality(self):
  145. G = self.davis
  146. clos = bipartite.closeness_centrality(G, self.top_nodes)
  147. answer = {
  148. "E8": 0.85,
  149. "E9": 0.79,
  150. "E7": 0.73,
  151. "Nora Fayette": 0.80,
  152. "Evelyn Jefferson": 0.80,
  153. "Theresa Anderson": 0.80,
  154. "E6": 0.69,
  155. "Sylvia Avondale": 0.77,
  156. "Laura Mandeville": 0.73,
  157. "Brenda Rogers": 0.73,
  158. "Katherina Rogers": 0.73,
  159. "E5": 0.59,
  160. "Helen Lloyd": 0.73,
  161. "E3": 0.56,
  162. "Ruth DeSand": 0.71,
  163. "Verne Sanderson": 0.71,
  164. "E12": 0.56,
  165. "Myra Liddel": 0.69,
  166. "E11": 0.54,
  167. "Eleanor Nye": 0.67,
  168. "Frances Anderson": 0.67,
  169. "Pearl Oglethorpe": 0.67,
  170. "E4": 0.54,
  171. "Charlotte McDowd": 0.60,
  172. "E10": 0.55,
  173. "Olivia Carleton": 0.59,
  174. "Flora Price": 0.59,
  175. "E2": 0.52,
  176. "E1": 0.52,
  177. "Dorothy Murchison": 0.65,
  178. "E13": 0.52,
  179. "E14": 0.52,
  180. }
  181. for node, value in answer.items():
  182. assert value == pytest.approx(clos[node], abs=1e-2)