comparison env/lib/python3.9/site-packages/networkx/algorithms/operators/tests/test_binary.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 pytest
2 import networkx as nx
3 from networkx.testing import assert_edges_equal
4
5
6 def test_union_attributes():
7 g = nx.Graph()
8 g.add_node(0, x=4)
9 g.add_node(1, x=5)
10 g.add_edge(0, 1, size=5)
11 g.graph["name"] = "g"
12
13 h = g.copy()
14 h.graph["name"] = "h"
15 h.graph["attr"] = "attr"
16 h.nodes[0]["x"] = 7
17
18 gh = nx.union(g, h, rename=("g", "h"))
19 assert set(gh.nodes()) == {"h0", "h1", "g0", "g1"}
20 for n in gh:
21 graph, node = n
22 assert gh.nodes[n] == eval(graph).nodes[int(node)]
23
24 assert gh.graph["attr"] == "attr"
25 assert gh.graph["name"] == "h" # h graph attributes take precendent
26
27
28 def test_intersection():
29 G = nx.Graph()
30 H = nx.Graph()
31 G.add_nodes_from([1, 2, 3, 4])
32 G.add_edge(1, 2)
33 G.add_edge(2, 3)
34 H.add_nodes_from([1, 2, 3, 4])
35 H.add_edge(2, 3)
36 H.add_edge(3, 4)
37 I = nx.intersection(G, H)
38 assert set(I.nodes()) == {1, 2, 3, 4}
39 assert sorted(I.edges()) == [(2, 3)]
40
41
42 def test_intersection_attributes():
43 g = nx.Graph()
44 g.add_node(0, x=4)
45 g.add_node(1, x=5)
46 g.add_edge(0, 1, size=5)
47 g.graph["name"] = "g"
48
49 h = g.copy()
50 h.graph["name"] = "h"
51 h.graph["attr"] = "attr"
52 h.nodes[0]["x"] = 7
53
54 gh = nx.intersection(g, h)
55 assert set(gh.nodes()) == set(g.nodes())
56 assert set(gh.nodes()) == set(h.nodes())
57 assert sorted(gh.edges()) == sorted(g.edges())
58
59 h.remove_node(0)
60 pytest.raises(nx.NetworkXError, nx.intersection, g, h)
61
62
63 def test_intersection_multigraph_attributes():
64 g = nx.MultiGraph()
65 g.add_edge(0, 1, key=0)
66 g.add_edge(0, 1, key=1)
67 g.add_edge(0, 1, key=2)
68 h = nx.MultiGraph()
69 h.add_edge(0, 1, key=0)
70 h.add_edge(0, 1, key=3)
71 gh = nx.intersection(g, h)
72 assert set(gh.nodes()) == set(g.nodes())
73 assert set(gh.nodes()) == set(h.nodes())
74 assert sorted(gh.edges()) == [(0, 1)]
75 assert sorted(gh.edges(keys=True)) == [(0, 1, 0)]
76
77
78 def test_difference():
79 G = nx.Graph()
80 H = nx.Graph()
81 G.add_nodes_from([1, 2, 3, 4])
82 G.add_edge(1, 2)
83 G.add_edge(2, 3)
84 H.add_nodes_from([1, 2, 3, 4])
85 H.add_edge(2, 3)
86 H.add_edge(3, 4)
87 D = nx.difference(G, H)
88 assert set(D.nodes()) == {1, 2, 3, 4}
89 assert sorted(D.edges()) == [(1, 2)]
90 D = nx.difference(H, G)
91 assert set(D.nodes()) == {1, 2, 3, 4}
92 assert sorted(D.edges()) == [(3, 4)]
93 D = nx.symmetric_difference(G, H)
94 assert set(D.nodes()) == {1, 2, 3, 4}
95 assert sorted(D.edges()) == [(1, 2), (3, 4)]
96
97
98 def test_difference2():
99 G = nx.Graph()
100 H = nx.Graph()
101 G.add_nodes_from([1, 2, 3, 4])
102 H.add_nodes_from([1, 2, 3, 4])
103 G.add_edge(1, 2)
104 H.add_edge(1, 2)
105 G.add_edge(2, 3)
106 D = nx.difference(G, H)
107 assert set(D.nodes()) == {1, 2, 3, 4}
108 assert sorted(D.edges()) == [(2, 3)]
109 D = nx.difference(H, G)
110 assert set(D.nodes()) == {1, 2, 3, 4}
111 assert sorted(D.edges()) == []
112 H.add_edge(3, 4)
113 D = nx.difference(H, G)
114 assert set(D.nodes()) == {1, 2, 3, 4}
115 assert sorted(D.edges()) == [(3, 4)]
116
117
118 def test_difference_attributes():
119 g = nx.Graph()
120 g.add_node(0, x=4)
121 g.add_node(1, x=5)
122 g.add_edge(0, 1, size=5)
123 g.graph["name"] = "g"
124
125 h = g.copy()
126 h.graph["name"] = "h"
127 h.graph["attr"] = "attr"
128 h.nodes[0]["x"] = 7
129
130 gh = nx.difference(g, h)
131 assert set(gh.nodes()) == set(g.nodes())
132 assert set(gh.nodes()) == set(h.nodes())
133 assert sorted(gh.edges()) == []
134
135 h.remove_node(0)
136 pytest.raises(nx.NetworkXError, nx.intersection, g, h)
137
138
139 def test_difference_multigraph_attributes():
140 g = nx.MultiGraph()
141 g.add_edge(0, 1, key=0)
142 g.add_edge(0, 1, key=1)
143 g.add_edge(0, 1, key=2)
144 h = nx.MultiGraph()
145 h.add_edge(0, 1, key=0)
146 h.add_edge(0, 1, key=3)
147 gh = nx.difference(g, h)
148 assert set(gh.nodes()) == set(g.nodes())
149 assert set(gh.nodes()) == set(h.nodes())
150 assert sorted(gh.edges()) == [(0, 1), (0, 1)]
151 assert sorted(gh.edges(keys=True)) == [(0, 1, 1), (0, 1, 2)]
152
153
154 def test_difference_raise():
155 G = nx.path_graph(4)
156 H = nx.path_graph(3)
157 pytest.raises(nx.NetworkXError, nx.difference, G, H)
158 pytest.raises(nx.NetworkXError, nx.symmetric_difference, G, H)
159
160
161 def test_symmetric_difference_multigraph():
162 g = nx.MultiGraph()
163 g.add_edge(0, 1, key=0)
164 g.add_edge(0, 1, key=1)
165 g.add_edge(0, 1, key=2)
166 h = nx.MultiGraph()
167 h.add_edge(0, 1, key=0)
168 h.add_edge(0, 1, key=3)
169 gh = nx.symmetric_difference(g, h)
170 assert set(gh.nodes()) == set(g.nodes())
171 assert set(gh.nodes()) == set(h.nodes())
172 assert sorted(gh.edges()) == 3 * [(0, 1)]
173 assert sorted(sorted(e) for e in gh.edges(keys=True)) == [
174 [0, 1, 1],
175 [0, 1, 2],
176 [0, 1, 3],
177 ]
178
179
180 def test_union_and_compose():
181 K3 = nx.complete_graph(3)
182 P3 = nx.path_graph(3)
183
184 G1 = nx.DiGraph()
185 G1.add_edge("A", "B")
186 G1.add_edge("A", "C")
187 G1.add_edge("A", "D")
188 G2 = nx.DiGraph()
189 G2.add_edge("1", "2")
190 G2.add_edge("1", "3")
191 G2.add_edge("1", "4")
192
193 G = nx.union(G1, G2)
194 H = nx.compose(G1, G2)
195 assert_edges_equal(G.edges(), H.edges())
196 assert not G.has_edge("A", 1)
197 pytest.raises(nx.NetworkXError, nx.union, K3, P3)
198 H1 = nx.union(H, G1, rename=("H", "G1"))
199 assert sorted(H1.nodes()) == [
200 "G1A",
201 "G1B",
202 "G1C",
203 "G1D",
204 "H1",
205 "H2",
206 "H3",
207 "H4",
208 "HA",
209 "HB",
210 "HC",
211 "HD",
212 ]
213
214 H2 = nx.union(H, G2, rename=("H", ""))
215 assert sorted(H2.nodes()) == [
216 "1",
217 "2",
218 "3",
219 "4",
220 "H1",
221 "H2",
222 "H3",
223 "H4",
224 "HA",
225 "HB",
226 "HC",
227 "HD",
228 ]
229
230 assert not H1.has_edge("NB", "NA")
231
232 G = nx.compose(G, G)
233 assert_edges_equal(G.edges(), H.edges())
234
235 G2 = nx.union(G2, G2, rename=("", "copy"))
236 assert sorted(G2.nodes()) == [
237 "1",
238 "2",
239 "3",
240 "4",
241 "copy1",
242 "copy2",
243 "copy3",
244 "copy4",
245 ]
246
247 assert sorted(G2.neighbors("copy4")) == []
248 assert sorted(G2.neighbors("copy1")) == ["copy2", "copy3", "copy4"]
249 assert len(G) == 8
250 assert nx.number_of_edges(G) == 6
251
252 E = nx.disjoint_union(G, G)
253 assert len(E) == 16
254 assert nx.number_of_edges(E) == 12
255
256 E = nx.disjoint_union(G1, G2)
257 assert sorted(E.nodes()) == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
258
259 G = nx.Graph()
260 H = nx.Graph()
261 G.add_nodes_from([(1, {"a1": 1})])
262 H.add_nodes_from([(1, {"b1": 1})])
263 R = nx.compose(G, H)
264 assert R.nodes == {1: {"a1": 1, "b1": 1}}
265
266
267 def test_union_multigraph():
268 G = nx.MultiGraph()
269 G.add_edge(1, 2, key=0)
270 G.add_edge(1, 2, key=1)
271 H = nx.MultiGraph()
272 H.add_edge(3, 4, key=0)
273 H.add_edge(3, 4, key=1)
274 GH = nx.union(G, H)
275 assert set(GH) == set(G) | set(H)
276 assert set(GH.edges(keys=True)) == set(G.edges(keys=True)) | set(H.edges(keys=True))
277
278
279 def test_disjoint_union_multigraph():
280 G = nx.MultiGraph()
281 G.add_edge(0, 1, key=0)
282 G.add_edge(0, 1, key=1)
283 H = nx.MultiGraph()
284 H.add_edge(2, 3, key=0)
285 H.add_edge(2, 3, key=1)
286 GH = nx.disjoint_union(G, H)
287 assert set(GH) == set(G) | set(H)
288 assert set(GH.edges(keys=True)) == set(G.edges(keys=True)) | set(H.edges(keys=True))
289
290
291 def test_compose_multigraph():
292 G = nx.MultiGraph()
293 G.add_edge(1, 2, key=0)
294 G.add_edge(1, 2, key=1)
295 H = nx.MultiGraph()
296 H.add_edge(3, 4, key=0)
297 H.add_edge(3, 4, key=1)
298 GH = nx.compose(G, H)
299 assert set(GH) == set(G) | set(H)
300 assert set(GH.edges(keys=True)) == set(G.edges(keys=True)) | set(H.edges(keys=True))
301 H.add_edge(1, 2, key=2)
302 GH = nx.compose(G, H)
303 assert set(GH) == set(G) | set(H)
304 assert set(GH.edges(keys=True)) == set(G.edges(keys=True)) | set(H.edges(keys=True))
305
306
307 def test_full_join_graph():
308 # Simple Graphs
309 G = nx.Graph()
310 G.add_node(0)
311 G.add_edge(1, 2)
312 H = nx.Graph()
313 H.add_edge(3, 4)
314
315 U = nx.full_join(G, H)
316 assert set(U) == set(G) | set(H)
317 assert len(U) == len(G) + len(H)
318 assert len(U.edges()) == len(G.edges()) + len(H.edges()) + len(G) * len(H)
319
320 # Rename
321 U = nx.full_join(G, H, rename=("g", "h"))
322 assert set(U) == {"g0", "g1", "g2", "h3", "h4"}
323 assert len(U) == len(G) + len(H)
324 assert len(U.edges()) == len(G.edges()) + len(H.edges()) + len(G) * len(H)
325
326 # Rename graphs with string-like nodes
327 G = nx.Graph()
328 G.add_node("a")
329 G.add_edge("b", "c")
330 H = nx.Graph()
331 H.add_edge("d", "e")
332
333 U = nx.full_join(G, H, rename=("g", "h"))
334 assert set(U) == {"ga", "gb", "gc", "hd", "he"}
335 assert len(U) == len(G) + len(H)
336 assert len(U.edges()) == len(G.edges()) + len(H.edges()) + len(G) * len(H)
337
338 # DiGraphs
339 G = nx.DiGraph()
340 G.add_node(0)
341 G.add_edge(1, 2)
342 H = nx.DiGraph()
343 H.add_edge(3, 4)
344
345 U = nx.full_join(G, H)
346 assert set(U) == set(G) | set(H)
347 assert len(U) == len(G) + len(H)
348 assert len(U.edges()) == len(G.edges()) + len(H.edges()) + len(G) * len(H) * 2
349
350 # DiGraphs Rename
351 U = nx.full_join(G, H, rename=("g", "h"))
352 assert set(U) == {"g0", "g1", "g2", "h3", "h4"}
353 assert len(U) == len(G) + len(H)
354 assert len(U.edges()) == len(G.edges()) + len(H.edges()) + len(G) * len(H) * 2
355
356
357 def test_full_join_multigraph():
358 # MultiGraphs
359 G = nx.MultiGraph()
360 G.add_node(0)
361 G.add_edge(1, 2)
362 H = nx.MultiGraph()
363 H.add_edge(3, 4)
364
365 U = nx.full_join(G, H)
366 assert set(U) == set(G) | set(H)
367 assert len(U) == len(G) + len(H)
368 assert len(U.edges()) == len(G.edges()) + len(H.edges()) + len(G) * len(H)
369
370 # MultiGraphs rename
371 U = nx.full_join(G, H, rename=("g", "h"))
372 assert set(U) == {"g0", "g1", "g2", "h3", "h4"}
373 assert len(U) == len(G) + len(H)
374 assert len(U.edges()) == len(G.edges()) + len(H.edges()) + len(G) * len(H)
375
376 # MultiDiGraphs
377 G = nx.MultiDiGraph()
378 G.add_node(0)
379 G.add_edge(1, 2)
380 H = nx.MultiDiGraph()
381 H.add_edge(3, 4)
382
383 U = nx.full_join(G, H)
384 assert set(U) == set(G) | set(H)
385 assert len(U) == len(G) + len(H)
386 assert len(U.edges()) == len(G.edges()) + len(H.edges()) + len(G) * len(H) * 2
387
388 # MultiDiGraphs rename
389 U = nx.full_join(G, H, rename=("g", "h"))
390 assert set(U) == {"g0", "g1", "g2", "h3", "h4"}
391 assert len(U) == len(G) + len(H)
392 assert len(U.edges()) == len(G.edges()) + len(H.edges()) + len(G) * len(H) * 2
393
394
395 def test_mixed_type_union():
396 G = nx.Graph()
397 H = nx.MultiGraph()
398 pytest.raises(nx.NetworkXError, nx.union, G, H)
399 pytest.raises(nx.NetworkXError, nx.disjoint_union, G, H)
400 pytest.raises(nx.NetworkXError, nx.intersection, G, H)
401 pytest.raises(nx.NetworkXError, nx.difference, G, H)
402 pytest.raises(nx.NetworkXError, nx.symmetric_difference, G, H)
403 pytest.raises(nx.NetworkXError, nx.compose, G, H)