Mercurial > repos > shellac > sam_consensus_v3
comparison env/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_project.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4f3585e2f14b |
---|---|
1 import networkx as nx | |
2 from networkx.algorithms import bipartite | |
3 from networkx.testing import assert_edges_equal, assert_nodes_equal | |
4 | |
5 | |
6 class TestBipartiteProject: | |
7 def test_path_projected_graph(self): | |
8 G = nx.path_graph(4) | |
9 P = bipartite.projected_graph(G, [1, 3]) | |
10 assert_nodes_equal(list(P), [1, 3]) | |
11 assert_edges_equal(list(P.edges()), [(1, 3)]) | |
12 P = bipartite.projected_graph(G, [0, 2]) | |
13 assert_nodes_equal(list(P), [0, 2]) | |
14 assert_edges_equal(list(P.edges()), [(0, 2)]) | |
15 | |
16 def test_path_projected_properties_graph(self): | |
17 G = nx.path_graph(4) | |
18 G.add_node(1, name="one") | |
19 G.add_node(2, name="two") | |
20 P = bipartite.projected_graph(G, [1, 3]) | |
21 assert_nodes_equal(list(P), [1, 3]) | |
22 assert_edges_equal(list(P.edges()), [(1, 3)]) | |
23 assert P.nodes[1]["name"] == G.nodes[1]["name"] | |
24 P = bipartite.projected_graph(G, [0, 2]) | |
25 assert_nodes_equal(list(P), [0, 2]) | |
26 assert_edges_equal(list(P.edges()), [(0, 2)]) | |
27 assert P.nodes[2]["name"] == G.nodes[2]["name"] | |
28 | |
29 def test_path_collaboration_projected_graph(self): | |
30 G = nx.path_graph(4) | |
31 P = bipartite.collaboration_weighted_projected_graph(G, [1, 3]) | |
32 assert_nodes_equal(list(P), [1, 3]) | |
33 assert_edges_equal(list(P.edges()), [(1, 3)]) | |
34 P[1][3]["weight"] = 1 | |
35 P = bipartite.collaboration_weighted_projected_graph(G, [0, 2]) | |
36 assert_nodes_equal(list(P), [0, 2]) | |
37 assert_edges_equal(list(P.edges()), [(0, 2)]) | |
38 P[0][2]["weight"] = 1 | |
39 | |
40 def test_directed_path_collaboration_projected_graph(self): | |
41 G = nx.DiGraph() | |
42 nx.add_path(G, range(4)) | |
43 P = bipartite.collaboration_weighted_projected_graph(G, [1, 3]) | |
44 assert_nodes_equal(list(P), [1, 3]) | |
45 assert_edges_equal(list(P.edges()), [(1, 3)]) | |
46 P[1][3]["weight"] = 1 | |
47 P = bipartite.collaboration_weighted_projected_graph(G, [0, 2]) | |
48 assert_nodes_equal(list(P), [0, 2]) | |
49 assert_edges_equal(list(P.edges()), [(0, 2)]) | |
50 P[0][2]["weight"] = 1 | |
51 | |
52 def test_path_weighted_projected_graph(self): | |
53 G = nx.path_graph(4) | |
54 P = bipartite.weighted_projected_graph(G, [1, 3]) | |
55 assert_nodes_equal(list(P), [1, 3]) | |
56 assert_edges_equal(list(P.edges()), [(1, 3)]) | |
57 P[1][3]["weight"] = 1 | |
58 P = bipartite.weighted_projected_graph(G, [0, 2]) | |
59 assert_nodes_equal(list(P), [0, 2]) | |
60 assert_edges_equal(list(P.edges()), [(0, 2)]) | |
61 P[0][2]["weight"] = 1 | |
62 | |
63 def test_path_weighted_projected_directed_graph(self): | |
64 G = nx.DiGraph() | |
65 nx.add_path(G, range(4)) | |
66 P = bipartite.weighted_projected_graph(G, [1, 3]) | |
67 assert_nodes_equal(list(P), [1, 3]) | |
68 assert_edges_equal(list(P.edges()), [(1, 3)]) | |
69 P[1][3]["weight"] = 1 | |
70 P = bipartite.weighted_projected_graph(G, [0, 2]) | |
71 assert_nodes_equal(list(P), [0, 2]) | |
72 assert_edges_equal(list(P.edges()), [(0, 2)]) | |
73 P[0][2]["weight"] = 1 | |
74 | |
75 def test_star_projected_graph(self): | |
76 G = nx.star_graph(3) | |
77 P = bipartite.projected_graph(G, [1, 2, 3]) | |
78 assert_nodes_equal(list(P), [1, 2, 3]) | |
79 assert_edges_equal(list(P.edges()), [(1, 2), (1, 3), (2, 3)]) | |
80 P = bipartite.weighted_projected_graph(G, [1, 2, 3]) | |
81 assert_nodes_equal(list(P), [1, 2, 3]) | |
82 assert_edges_equal(list(P.edges()), [(1, 2), (1, 3), (2, 3)]) | |
83 | |
84 P = bipartite.projected_graph(G, [0]) | |
85 assert_nodes_equal(list(P), [0]) | |
86 assert_edges_equal(list(P.edges()), []) | |
87 | |
88 def test_project_multigraph(self): | |
89 G = nx.Graph() | |
90 G.add_edge("a", 1) | |
91 G.add_edge("b", 1) | |
92 G.add_edge("a", 2) | |
93 G.add_edge("b", 2) | |
94 P = bipartite.projected_graph(G, "ab") | |
95 assert_edges_equal(list(P.edges()), [("a", "b")]) | |
96 P = bipartite.weighted_projected_graph(G, "ab") | |
97 assert_edges_equal(list(P.edges()), [("a", "b")]) | |
98 P = bipartite.projected_graph(G, "ab", multigraph=True) | |
99 assert_edges_equal(list(P.edges()), [("a", "b"), ("a", "b")]) | |
100 | |
101 def test_project_collaboration(self): | |
102 G = nx.Graph() | |
103 G.add_edge("a", 1) | |
104 G.add_edge("b", 1) | |
105 G.add_edge("b", 2) | |
106 G.add_edge("c", 2) | |
107 G.add_edge("c", 3) | |
108 G.add_edge("c", 4) | |
109 G.add_edge("b", 4) | |
110 P = bipartite.collaboration_weighted_projected_graph(G, "abc") | |
111 assert P["a"]["b"]["weight"] == 1 | |
112 assert P["b"]["c"]["weight"] == 2 | |
113 | |
114 def test_directed_projection(self): | |
115 G = nx.DiGraph() | |
116 G.add_edge("A", 1) | |
117 G.add_edge(1, "B") | |
118 G.add_edge("A", 2) | |
119 G.add_edge("B", 2) | |
120 P = bipartite.projected_graph(G, "AB") | |
121 assert_edges_equal(list(P.edges()), [("A", "B")]) | |
122 P = bipartite.weighted_projected_graph(G, "AB") | |
123 assert_edges_equal(list(P.edges()), [("A", "B")]) | |
124 assert P["A"]["B"]["weight"] == 1 | |
125 | |
126 P = bipartite.projected_graph(G, "AB", multigraph=True) | |
127 assert_edges_equal(list(P.edges()), [("A", "B")]) | |
128 | |
129 G = nx.DiGraph() | |
130 G.add_edge("A", 1) | |
131 G.add_edge(1, "B") | |
132 G.add_edge("A", 2) | |
133 G.add_edge(2, "B") | |
134 P = bipartite.projected_graph(G, "AB") | |
135 assert_edges_equal(list(P.edges()), [("A", "B")]) | |
136 P = bipartite.weighted_projected_graph(G, "AB") | |
137 assert_edges_equal(list(P.edges()), [("A", "B")]) | |
138 assert P["A"]["B"]["weight"] == 2 | |
139 | |
140 P = bipartite.projected_graph(G, "AB", multigraph=True) | |
141 assert_edges_equal(list(P.edges()), [("A", "B"), ("A", "B")]) | |
142 | |
143 | |
144 class TestBipartiteWeightedProjection: | |
145 @classmethod | |
146 def setup_class(cls): | |
147 # Tore Opsahl's example | |
148 # http://toreopsahl.com/2009/05/01/projecting-two-mode-networks-onto-weighted-one-mode-networks/ | |
149 cls.G = nx.Graph() | |
150 cls.G.add_edge("A", 1) | |
151 cls.G.add_edge("A", 2) | |
152 cls.G.add_edge("B", 1) | |
153 cls.G.add_edge("B", 2) | |
154 cls.G.add_edge("B", 3) | |
155 cls.G.add_edge("B", 4) | |
156 cls.G.add_edge("B", 5) | |
157 cls.G.add_edge("C", 1) | |
158 cls.G.add_edge("D", 3) | |
159 cls.G.add_edge("E", 4) | |
160 cls.G.add_edge("E", 5) | |
161 cls.G.add_edge("E", 6) | |
162 cls.G.add_edge("F", 6) | |
163 # Graph based on figure 6 from Newman (2001) | |
164 cls.N = nx.Graph() | |
165 cls.N.add_edge("A", 1) | |
166 cls.N.add_edge("A", 2) | |
167 cls.N.add_edge("A", 3) | |
168 cls.N.add_edge("B", 1) | |
169 cls.N.add_edge("B", 2) | |
170 cls.N.add_edge("B", 3) | |
171 cls.N.add_edge("C", 1) | |
172 cls.N.add_edge("D", 1) | |
173 cls.N.add_edge("E", 3) | |
174 | |
175 def test_project_weighted_shared(self): | |
176 edges = [ | |
177 ("A", "B", 2), | |
178 ("A", "C", 1), | |
179 ("B", "C", 1), | |
180 ("B", "D", 1), | |
181 ("B", "E", 2), | |
182 ("E", "F", 1), | |
183 ] | |
184 Panswer = nx.Graph() | |
185 Panswer.add_weighted_edges_from(edges) | |
186 P = bipartite.weighted_projected_graph(self.G, "ABCDEF") | |
187 assert_edges_equal(list(P.edges()), Panswer.edges()) | |
188 for u, v in list(P.edges()): | |
189 assert P[u][v]["weight"] == Panswer[u][v]["weight"] | |
190 | |
191 edges = [ | |
192 ("A", "B", 3), | |
193 ("A", "E", 1), | |
194 ("A", "C", 1), | |
195 ("A", "D", 1), | |
196 ("B", "E", 1), | |
197 ("B", "C", 1), | |
198 ("B", "D", 1), | |
199 ("C", "D", 1), | |
200 ] | |
201 Panswer = nx.Graph() | |
202 Panswer.add_weighted_edges_from(edges) | |
203 P = bipartite.weighted_projected_graph(self.N, "ABCDE") | |
204 assert_edges_equal(list(P.edges()), Panswer.edges()) | |
205 for u, v in list(P.edges()): | |
206 assert P[u][v]["weight"] == Panswer[u][v]["weight"] | |
207 | |
208 def test_project_weighted_newman(self): | |
209 edges = [ | |
210 ("A", "B", 1.5), | |
211 ("A", "C", 0.5), | |
212 ("B", "C", 0.5), | |
213 ("B", "D", 1), | |
214 ("B", "E", 2), | |
215 ("E", "F", 1), | |
216 ] | |
217 Panswer = nx.Graph() | |
218 Panswer.add_weighted_edges_from(edges) | |
219 P = bipartite.collaboration_weighted_projected_graph(self.G, "ABCDEF") | |
220 assert_edges_equal(list(P.edges()), Panswer.edges()) | |
221 for u, v in list(P.edges()): | |
222 assert P[u][v]["weight"] == Panswer[u][v]["weight"] | |
223 | |
224 edges = [ | |
225 ("A", "B", 11 / 6.0), | |
226 ("A", "E", 1 / 2.0), | |
227 ("A", "C", 1 / 3.0), | |
228 ("A", "D", 1 / 3.0), | |
229 ("B", "E", 1 / 2.0), | |
230 ("B", "C", 1 / 3.0), | |
231 ("B", "D", 1 / 3.0), | |
232 ("C", "D", 1 / 3.0), | |
233 ] | |
234 Panswer = nx.Graph() | |
235 Panswer.add_weighted_edges_from(edges) | |
236 P = bipartite.collaboration_weighted_projected_graph(self.N, "ABCDE") | |
237 assert_edges_equal(list(P.edges()), Panswer.edges()) | |
238 for u, v in list(P.edges()): | |
239 assert P[u][v]["weight"] == Panswer[u][v]["weight"] | |
240 | |
241 def test_project_weighted_ratio(self): | |
242 edges = [ | |
243 ("A", "B", 2 / 6.0), | |
244 ("A", "C", 1 / 6.0), | |
245 ("B", "C", 1 / 6.0), | |
246 ("B", "D", 1 / 6.0), | |
247 ("B", "E", 2 / 6.0), | |
248 ("E", "F", 1 / 6.0), | |
249 ] | |
250 Panswer = nx.Graph() | |
251 Panswer.add_weighted_edges_from(edges) | |
252 P = bipartite.weighted_projected_graph(self.G, "ABCDEF", ratio=True) | |
253 assert_edges_equal(list(P.edges()), Panswer.edges()) | |
254 for u, v in list(P.edges()): | |
255 assert P[u][v]["weight"] == Panswer[u][v]["weight"] | |
256 | |
257 edges = [ | |
258 ("A", "B", 3 / 3.0), | |
259 ("A", "E", 1 / 3.0), | |
260 ("A", "C", 1 / 3.0), | |
261 ("A", "D", 1 / 3.0), | |
262 ("B", "E", 1 / 3.0), | |
263 ("B", "C", 1 / 3.0), | |
264 ("B", "D", 1 / 3.0), | |
265 ("C", "D", 1 / 3.0), | |
266 ] | |
267 Panswer = nx.Graph() | |
268 Panswer.add_weighted_edges_from(edges) | |
269 P = bipartite.weighted_projected_graph(self.N, "ABCDE", ratio=True) | |
270 assert_edges_equal(list(P.edges()), Panswer.edges()) | |
271 for u, v in list(P.edges()): | |
272 assert P[u][v]["weight"] == Panswer[u][v]["weight"] | |
273 | |
274 def test_project_weighted_overlap(self): | |
275 edges = [ | |
276 ("A", "B", 2 / 2.0), | |
277 ("A", "C", 1 / 1.0), | |
278 ("B", "C", 1 / 1.0), | |
279 ("B", "D", 1 / 1.0), | |
280 ("B", "E", 2 / 3.0), | |
281 ("E", "F", 1 / 1.0), | |
282 ] | |
283 Panswer = nx.Graph() | |
284 Panswer.add_weighted_edges_from(edges) | |
285 P = bipartite.overlap_weighted_projected_graph(self.G, "ABCDEF", jaccard=False) | |
286 assert_edges_equal(list(P.edges()), Panswer.edges()) | |
287 for u, v in list(P.edges()): | |
288 assert P[u][v]["weight"] == Panswer[u][v]["weight"] | |
289 | |
290 edges = [ | |
291 ("A", "B", 3 / 3.0), | |
292 ("A", "E", 1 / 1.0), | |
293 ("A", "C", 1 / 1.0), | |
294 ("A", "D", 1 / 1.0), | |
295 ("B", "E", 1 / 1.0), | |
296 ("B", "C", 1 / 1.0), | |
297 ("B", "D", 1 / 1.0), | |
298 ("C", "D", 1 / 1.0), | |
299 ] | |
300 Panswer = nx.Graph() | |
301 Panswer.add_weighted_edges_from(edges) | |
302 P = bipartite.overlap_weighted_projected_graph(self.N, "ABCDE", jaccard=False) | |
303 assert_edges_equal(list(P.edges()), Panswer.edges()) | |
304 for u, v in list(P.edges()): | |
305 assert P[u][v]["weight"] == Panswer[u][v]["weight"] | |
306 | |
307 def test_project_weighted_jaccard(self): | |
308 edges = [ | |
309 ("A", "B", 2 / 5.0), | |
310 ("A", "C", 1 / 2.0), | |
311 ("B", "C", 1 / 5.0), | |
312 ("B", "D", 1 / 5.0), | |
313 ("B", "E", 2 / 6.0), | |
314 ("E", "F", 1 / 3.0), | |
315 ] | |
316 Panswer = nx.Graph() | |
317 Panswer.add_weighted_edges_from(edges) | |
318 P = bipartite.overlap_weighted_projected_graph(self.G, "ABCDEF") | |
319 assert_edges_equal(list(P.edges()), Panswer.edges()) | |
320 for u, v in list(P.edges()): | |
321 assert P[u][v]["weight"] == Panswer[u][v]["weight"] | |
322 | |
323 edges = [ | |
324 ("A", "B", 3 / 3.0), | |
325 ("A", "E", 1 / 3.0), | |
326 ("A", "C", 1 / 3.0), | |
327 ("A", "D", 1 / 3.0), | |
328 ("B", "E", 1 / 3.0), | |
329 ("B", "C", 1 / 3.0), | |
330 ("B", "D", 1 / 3.0), | |
331 ("C", "D", 1 / 1.0), | |
332 ] | |
333 Panswer = nx.Graph() | |
334 Panswer.add_weighted_edges_from(edges) | |
335 P = bipartite.overlap_weighted_projected_graph(self.N, "ABCDE") | |
336 assert_edges_equal(list(P.edges()), Panswer.edges()) | |
337 for u, v in P.edges(): | |
338 assert P[u][v]["weight"] == Panswer[u][v]["weight"] | |
339 | |
340 def test_generic_weighted_projected_graph_simple(self): | |
341 def shared(G, u, v): | |
342 return len(set(G[u]) & set(G[v])) | |
343 | |
344 B = nx.path_graph(5) | |
345 G = bipartite.generic_weighted_projected_graph( | |
346 B, [0, 2, 4], weight_function=shared | |
347 ) | |
348 assert_nodes_equal(list(G), [0, 2, 4]) | |
349 assert_edges_equal( | |
350 list(list(G.edges(data=True))), | |
351 [(0, 2, {"weight": 1}), (2, 4, {"weight": 1})], | |
352 ) | |
353 | |
354 G = bipartite.generic_weighted_projected_graph(B, [0, 2, 4]) | |
355 assert_nodes_equal(list(G), [0, 2, 4]) | |
356 assert_edges_equal( | |
357 list(list(G.edges(data=True))), | |
358 [(0, 2, {"weight": 1}), (2, 4, {"weight": 1})], | |
359 ) | |
360 B = nx.DiGraph() | |
361 nx.add_path(B, range(5)) | |
362 G = bipartite.generic_weighted_projected_graph(B, [0, 2, 4]) | |
363 assert_nodes_equal(list(G), [0, 2, 4]) | |
364 assert_edges_equal( | |
365 list(G.edges(data=True)), [(0, 2, {"weight": 1}), (2, 4, {"weight": 1})] | |
366 ) | |
367 | |
368 def test_generic_weighted_projected_graph_custom(self): | |
369 def jaccard(G, u, v): | |
370 unbrs = set(G[u]) | |
371 vnbrs = set(G[v]) | |
372 return float(len(unbrs & vnbrs)) / len(unbrs | vnbrs) | |
373 | |
374 def my_weight(G, u, v, weight="weight"): | |
375 w = 0 | |
376 for nbr in set(G[u]) & set(G[v]): | |
377 w += G.edges[u, nbr].get(weight, 1) + G.edges[v, nbr].get(weight, 1) | |
378 return w | |
379 | |
380 B = nx.bipartite.complete_bipartite_graph(2, 2) | |
381 for i, (u, v) in enumerate(B.edges()): | |
382 B.edges[u, v]["weight"] = i + 1 | |
383 G = bipartite.generic_weighted_projected_graph( | |
384 B, [0, 1], weight_function=jaccard | |
385 ) | |
386 assert_edges_equal(list(G.edges(data=True)), [(0, 1, {"weight": 1.0})]) | |
387 G = bipartite.generic_weighted_projected_graph( | |
388 B, [0, 1], weight_function=my_weight | |
389 ) | |
390 assert_edges_equal(list(G.edges(data=True)), [(0, 1, {"weight": 10})]) | |
391 G = bipartite.generic_weighted_projected_graph(B, [0, 1]) | |
392 assert_edges_equal(list(G.edges(data=True)), [(0, 1, {"weight": 2})]) |