comparison env/lib/python3.9/site-packages/networkx/algorithms/bipartite/tests/test_generators.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 ..generators import (
4 alternating_havel_hakimi_graph,
5 complete_bipartite_graph,
6 configuration_model,
7 gnmk_random_graph,
8 havel_hakimi_graph,
9 preferential_attachment_graph,
10 random_graph,
11 reverse_havel_hakimi_graph,
12 )
13
14 """
15 Generators - Bipartite
16 ----------------------
17 """
18
19
20 class TestGeneratorsBipartite:
21 def test_complete_bipartite_graph(self):
22 G = complete_bipartite_graph(0, 0)
23 assert nx.is_isomorphic(G, nx.null_graph())
24
25 for i in [1, 5]:
26 G = complete_bipartite_graph(i, 0)
27 assert nx.is_isomorphic(G, nx.empty_graph(i))
28 G = complete_bipartite_graph(0, i)
29 assert nx.is_isomorphic(G, nx.empty_graph(i))
30
31 G = complete_bipartite_graph(2, 2)
32 assert nx.is_isomorphic(G, nx.cycle_graph(4))
33
34 G = complete_bipartite_graph(1, 5)
35 assert nx.is_isomorphic(G, nx.star_graph(5))
36
37 G = complete_bipartite_graph(5, 1)
38 assert nx.is_isomorphic(G, nx.star_graph(5))
39
40 # complete_bipartite_graph(m1,m2) is a connected graph with
41 # m1+m2 nodes and m1*m2 edges
42 for m1, m2 in [(5, 11), (7, 3)]:
43 G = complete_bipartite_graph(m1, m2)
44 assert nx.number_of_nodes(G) == m1 + m2
45 assert nx.number_of_edges(G) == m1 * m2
46
47 pytest.raises(
48 nx.NetworkXError, complete_bipartite_graph, 7, 3, create_using=nx.DiGraph
49 )
50 pytest.raises(
51 nx.NetworkXError, complete_bipartite_graph, 7, 3, create_using=nx.DiGraph
52 )
53 pytest.raises(
54 nx.NetworkXError,
55 complete_bipartite_graph,
56 7,
57 3,
58 create_using=nx.MultiDiGraph,
59 )
60
61 mG = complete_bipartite_graph(7, 3, create_using=nx.MultiGraph)
62 assert mG.is_multigraph()
63 assert sorted(mG.edges()) == sorted(G.edges())
64
65 mG = complete_bipartite_graph(7, 3, create_using=nx.MultiGraph)
66 assert mG.is_multigraph()
67 assert sorted(mG.edges()) == sorted(G.edges())
68
69 mG = complete_bipartite_graph(7, 3) # default to Graph
70 assert sorted(mG.edges()) == sorted(G.edges())
71 assert not mG.is_multigraph()
72 assert not mG.is_directed()
73
74 # specify nodes rather than number of nodes
75 G = complete_bipartite_graph([1, 2], ["a", "b"])
76 has_edges = (
77 G.has_edge(1, "a")
78 & G.has_edge(1, "b")
79 & G.has_edge(2, "a")
80 & G.has_edge(2, "b")
81 )
82 assert has_edges
83 assert G.size() == 4
84
85 def test_configuration_model(self):
86 aseq = []
87 bseq = []
88 G = configuration_model(aseq, bseq)
89 assert len(G) == 0
90
91 aseq = [0, 0]
92 bseq = [0, 0]
93 G = configuration_model(aseq, bseq)
94 assert len(G) == 4
95 assert G.number_of_edges() == 0
96
97 aseq = [3, 3, 3, 3]
98 bseq = [2, 2, 2, 2, 2]
99 pytest.raises(nx.NetworkXError, configuration_model, aseq, bseq)
100
101 aseq = [3, 3, 3, 3]
102 bseq = [2, 2, 2, 2, 2, 2]
103 G = configuration_model(aseq, bseq)
104 assert sorted(d for n, d in G.degree()) == [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
105
106 aseq = [2, 2, 2, 2, 2, 2]
107 bseq = [3, 3, 3, 3]
108 G = configuration_model(aseq, bseq)
109 assert sorted(d for n, d in G.degree()) == [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
110
111 aseq = [2, 2, 2, 1, 1, 1]
112 bseq = [3, 3, 3]
113 G = configuration_model(aseq, bseq)
114 assert G.is_multigraph()
115 assert not G.is_directed()
116 assert sorted(d for n, d in G.degree()) == [1, 1, 1, 2, 2, 2, 3, 3, 3]
117
118 GU = nx.project(nx.Graph(G), range(len(aseq)))
119 assert GU.number_of_nodes() == 6
120
121 GD = nx.project(nx.Graph(G), range(len(aseq), len(aseq) + len(bseq)))
122 assert GD.number_of_nodes() == 3
123
124 G = reverse_havel_hakimi_graph(aseq, bseq, create_using=nx.Graph)
125 assert not G.is_multigraph()
126 assert not G.is_directed()
127
128 pytest.raises(
129 nx.NetworkXError, configuration_model, aseq, bseq, create_using=nx.DiGraph()
130 )
131 pytest.raises(
132 nx.NetworkXError, configuration_model, aseq, bseq, create_using=nx.DiGraph
133 )
134 pytest.raises(
135 nx.NetworkXError,
136 configuration_model,
137 aseq,
138 bseq,
139 create_using=nx.MultiDiGraph,
140 )
141
142 def test_havel_hakimi_graph(self):
143 aseq = []
144 bseq = []
145 G = havel_hakimi_graph(aseq, bseq)
146 assert len(G) == 0
147
148 aseq = [0, 0]
149 bseq = [0, 0]
150 G = havel_hakimi_graph(aseq, bseq)
151 assert len(G) == 4
152 assert G.number_of_edges() == 0
153
154 aseq = [3, 3, 3, 3]
155 bseq = [2, 2, 2, 2, 2]
156 pytest.raises(nx.NetworkXError, havel_hakimi_graph, aseq, bseq)
157
158 bseq = [2, 2, 2, 2, 2, 2]
159 G = havel_hakimi_graph(aseq, bseq)
160 assert sorted(d for n, d in G.degree()) == [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
161
162 aseq = [2, 2, 2, 2, 2, 2]
163 bseq = [3, 3, 3, 3]
164 G = havel_hakimi_graph(aseq, bseq)
165 assert G.is_multigraph()
166 assert not G.is_directed()
167 assert sorted(d for n, d in G.degree()) == [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
168
169 GU = nx.project(nx.Graph(G), range(len(aseq)))
170 assert GU.number_of_nodes() == 6
171
172 GD = nx.project(nx.Graph(G), range(len(aseq), len(aseq) + len(bseq)))
173 assert GD.number_of_nodes() == 4
174
175 G = reverse_havel_hakimi_graph(aseq, bseq, create_using=nx.Graph)
176 assert not G.is_multigraph()
177 assert not G.is_directed()
178
179 pytest.raises(
180 nx.NetworkXError, havel_hakimi_graph, aseq, bseq, create_using=nx.DiGraph
181 )
182 pytest.raises(
183 nx.NetworkXError, havel_hakimi_graph, aseq, bseq, create_using=nx.DiGraph
184 )
185 pytest.raises(
186 nx.NetworkXError,
187 havel_hakimi_graph,
188 aseq,
189 bseq,
190 create_using=nx.MultiDiGraph,
191 )
192
193 def test_reverse_havel_hakimi_graph(self):
194 aseq = []
195 bseq = []
196 G = reverse_havel_hakimi_graph(aseq, bseq)
197 assert len(G) == 0
198
199 aseq = [0, 0]
200 bseq = [0, 0]
201 G = reverse_havel_hakimi_graph(aseq, bseq)
202 assert len(G) == 4
203 assert G.number_of_edges() == 0
204
205 aseq = [3, 3, 3, 3]
206 bseq = [2, 2, 2, 2, 2]
207 pytest.raises(nx.NetworkXError, reverse_havel_hakimi_graph, aseq, bseq)
208
209 bseq = [2, 2, 2, 2, 2, 2]
210 G = reverse_havel_hakimi_graph(aseq, bseq)
211 assert sorted(d for n, d in G.degree()) == [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
212
213 aseq = [2, 2, 2, 2, 2, 2]
214 bseq = [3, 3, 3, 3]
215 G = reverse_havel_hakimi_graph(aseq, bseq)
216 assert sorted(d for n, d in G.degree()) == [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
217
218 aseq = [2, 2, 2, 1, 1, 1]
219 bseq = [3, 3, 3]
220 G = reverse_havel_hakimi_graph(aseq, bseq)
221 assert G.is_multigraph()
222 assert not G.is_directed()
223 assert sorted(d for n, d in G.degree()) == [1, 1, 1, 2, 2, 2, 3, 3, 3]
224
225 GU = nx.project(nx.Graph(G), range(len(aseq)))
226 assert GU.number_of_nodes() == 6
227
228 GD = nx.project(nx.Graph(G), range(len(aseq), len(aseq) + len(bseq)))
229 assert GD.number_of_nodes() == 3
230
231 G = reverse_havel_hakimi_graph(aseq, bseq, create_using=nx.Graph)
232 assert not G.is_multigraph()
233 assert not G.is_directed()
234
235 pytest.raises(
236 nx.NetworkXError,
237 reverse_havel_hakimi_graph,
238 aseq,
239 bseq,
240 create_using=nx.DiGraph,
241 )
242 pytest.raises(
243 nx.NetworkXError,
244 reverse_havel_hakimi_graph,
245 aseq,
246 bseq,
247 create_using=nx.DiGraph,
248 )
249 pytest.raises(
250 nx.NetworkXError,
251 reverse_havel_hakimi_graph,
252 aseq,
253 bseq,
254 create_using=nx.MultiDiGraph,
255 )
256
257 def test_alternating_havel_hakimi_graph(self):
258 aseq = []
259 bseq = []
260 G = alternating_havel_hakimi_graph(aseq, bseq)
261 assert len(G) == 0
262
263 aseq = [0, 0]
264 bseq = [0, 0]
265 G = alternating_havel_hakimi_graph(aseq, bseq)
266 assert len(G) == 4
267 assert G.number_of_edges() == 0
268
269 aseq = [3, 3, 3, 3]
270 bseq = [2, 2, 2, 2, 2]
271 pytest.raises(nx.NetworkXError, alternating_havel_hakimi_graph, aseq, bseq)
272
273 bseq = [2, 2, 2, 2, 2, 2]
274 G = alternating_havel_hakimi_graph(aseq, bseq)
275 assert sorted(d for n, d in G.degree()) == [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
276
277 aseq = [2, 2, 2, 2, 2, 2]
278 bseq = [3, 3, 3, 3]
279 G = alternating_havel_hakimi_graph(aseq, bseq)
280 assert sorted(d for n, d in G.degree()) == [2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
281
282 aseq = [2, 2, 2, 1, 1, 1]
283 bseq = [3, 3, 3]
284 G = alternating_havel_hakimi_graph(aseq, bseq)
285 assert G.is_multigraph()
286 assert not G.is_directed()
287 assert sorted(d for n, d in G.degree()) == [1, 1, 1, 2, 2, 2, 3, 3, 3]
288
289 GU = nx.project(nx.Graph(G), range(len(aseq)))
290 assert GU.number_of_nodes() == 6
291
292 GD = nx.project(nx.Graph(G), range(len(aseq), len(aseq) + len(bseq)))
293 assert GD.number_of_nodes() == 3
294
295 G = reverse_havel_hakimi_graph(aseq, bseq, create_using=nx.Graph)
296 assert not G.is_multigraph()
297 assert not G.is_directed()
298
299 pytest.raises(
300 nx.NetworkXError,
301 alternating_havel_hakimi_graph,
302 aseq,
303 bseq,
304 create_using=nx.DiGraph,
305 )
306 pytest.raises(
307 nx.NetworkXError,
308 alternating_havel_hakimi_graph,
309 aseq,
310 bseq,
311 create_using=nx.DiGraph,
312 )
313 pytest.raises(
314 nx.NetworkXError,
315 alternating_havel_hakimi_graph,
316 aseq,
317 bseq,
318 create_using=nx.MultiDiGraph,
319 )
320
321 def test_preferential_attachment(self):
322 aseq = [3, 2, 1, 1]
323 G = preferential_attachment_graph(aseq, 0.5)
324 assert G.is_multigraph()
325 assert not G.is_directed()
326
327 G = preferential_attachment_graph(aseq, 0.5, create_using=nx.Graph)
328 assert not G.is_multigraph()
329 assert not G.is_directed()
330
331 pytest.raises(
332 nx.NetworkXError,
333 preferential_attachment_graph,
334 aseq,
335 0.5,
336 create_using=nx.DiGraph(),
337 )
338 pytest.raises(
339 nx.NetworkXError,
340 preferential_attachment_graph,
341 aseq,
342 0.5,
343 create_using=nx.DiGraph(),
344 )
345 pytest.raises(
346 nx.NetworkXError,
347 preferential_attachment_graph,
348 aseq,
349 0.5,
350 create_using=nx.DiGraph(),
351 )
352
353 def test_random_graph(self):
354 n = 10
355 m = 20
356 G = random_graph(n, m, 0.9)
357 assert len(G) == 30
358 assert nx.is_bipartite(G)
359 X, Y = nx.algorithms.bipartite.sets(G)
360 assert set(range(n)) == X
361 assert set(range(n, n + m)) == Y
362
363 def test_random_digraph(self):
364 n = 10
365 m = 20
366 G = random_graph(n, m, 0.9, directed=True)
367 assert len(G) == 30
368 assert nx.is_bipartite(G)
369 X, Y = nx.algorithms.bipartite.sets(G)
370 assert set(range(n)) == X
371 assert set(range(n, n + m)) == Y
372
373 def test_gnmk_random_graph(self):
374 n = 10
375 m = 20
376 edges = 100
377 # set seed because sometimes it is not connected
378 # which raises an error in bipartite.sets(G) below.
379 G = gnmk_random_graph(n, m, edges, seed=1234)
380 assert len(G) == n + m
381 assert nx.is_bipartite(G)
382 X, Y = nx.algorithms.bipartite.sets(G)
383 # print(X)
384 assert set(range(n)) == X
385 assert set(range(n, n + m)) == Y
386 assert edges == len(list(G.edges()))
387
388 def test_gnmk_random_graph_complete(self):
389 n = 10
390 m = 20
391 edges = 200
392 G = gnmk_random_graph(n, m, edges)
393 assert len(G) == n + m
394 assert nx.is_bipartite(G)
395 X, Y = nx.algorithms.bipartite.sets(G)
396 # print(X)
397 assert set(range(n)) == X
398 assert set(range(n, n + m)) == Y
399 assert edges == len(list(G.edges()))