Mercurial > repos > shellac > sam_consensus_v3
comparison env/lib/python3.9/site-packages/networkx/generators/tests/test_random_graphs.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 """Unit tests for the :mod:`networkx.generators.random_graphs` module. | |
| 2 | |
| 3 """ | |
| 4 import pytest | |
| 5 | |
| 6 from networkx.exception import NetworkXError | |
| 7 from networkx.generators.random_graphs import barabasi_albert_graph | |
| 8 from networkx.generators.random_graphs import dual_barabasi_albert_graph | |
| 9 from networkx.generators.random_graphs import extended_barabasi_albert_graph | |
| 10 from networkx.generators.random_graphs import binomial_graph | |
| 11 from networkx.generators.random_graphs import connected_watts_strogatz_graph | |
| 12 from networkx.generators.random_graphs import dense_gnm_random_graph | |
| 13 from networkx.generators.random_graphs import erdos_renyi_graph | |
| 14 from networkx.generators.random_graphs import fast_gnp_random_graph | |
| 15 from networkx.generators.random_graphs import gnm_random_graph | |
| 16 from networkx.generators.random_graphs import gnp_random_graph | |
| 17 from networkx.generators.random_graphs import newman_watts_strogatz_graph | |
| 18 from networkx.generators.random_graphs import powerlaw_cluster_graph | |
| 19 from networkx.generators.random_graphs import random_kernel_graph | |
| 20 from networkx.generators.random_graphs import random_lobster | |
| 21 from networkx.generators.random_graphs import random_powerlaw_tree | |
| 22 from networkx.generators.random_graphs import random_powerlaw_tree_sequence | |
| 23 from networkx.generators.random_graphs import random_regular_graph | |
| 24 from networkx.generators.random_graphs import random_shell_graph | |
| 25 from networkx.generators.random_graphs import watts_strogatz_graph | |
| 26 | |
| 27 | |
| 28 class TestGeneratorsRandom: | |
| 29 def test_random_graph(self): | |
| 30 seed = 42 | |
| 31 G = gnp_random_graph(100, 0.25, seed) | |
| 32 G = gnp_random_graph(100, 0.25, seed, directed=True) | |
| 33 G = binomial_graph(100, 0.25, seed) | |
| 34 G = erdos_renyi_graph(100, 0.25, seed) | |
| 35 G = fast_gnp_random_graph(100, 0.25, seed) | |
| 36 G = fast_gnp_random_graph(100, 0.25, seed, directed=True) | |
| 37 G = gnm_random_graph(100, 20, seed) | |
| 38 G = gnm_random_graph(100, 20, seed, directed=True) | |
| 39 G = dense_gnm_random_graph(100, 20, seed) | |
| 40 | |
| 41 G = watts_strogatz_graph(10, 2, 0.25, seed) | |
| 42 assert len(G) == 10 | |
| 43 assert G.number_of_edges() == 10 | |
| 44 | |
| 45 G = connected_watts_strogatz_graph(10, 2, 0.1, tries=10, seed=seed) | |
| 46 assert len(G) == 10 | |
| 47 assert G.number_of_edges() == 10 | |
| 48 pytest.raises( | |
| 49 NetworkXError, connected_watts_strogatz_graph, 10, 2, 0.1, tries=0 | |
| 50 ) | |
| 51 | |
| 52 G = watts_strogatz_graph(10, 4, 0.25, seed) | |
| 53 assert len(G) == 10 | |
| 54 assert G.number_of_edges() == 20 | |
| 55 | |
| 56 G = newman_watts_strogatz_graph(10, 2, 0.0, seed) | |
| 57 assert len(G) == 10 | |
| 58 assert G.number_of_edges() == 10 | |
| 59 | |
| 60 G = newman_watts_strogatz_graph(10, 4, 0.25, seed) | |
| 61 assert len(G) == 10 | |
| 62 assert G.number_of_edges() >= 20 | |
| 63 | |
| 64 G = barabasi_albert_graph(100, 1, seed) | |
| 65 G = barabasi_albert_graph(100, 3, seed) | |
| 66 assert G.number_of_edges() == (97 * 3) | |
| 67 | |
| 68 G = extended_barabasi_albert_graph(100, 1, 0, 0, seed) | |
| 69 assert G.number_of_edges() == 99 | |
| 70 G = extended_barabasi_albert_graph(100, 3, 0, 0, seed) | |
| 71 assert G.number_of_edges() == 97 * 3 | |
| 72 G = extended_barabasi_albert_graph(100, 1, 0, 0.5, seed) | |
| 73 assert G.number_of_edges() == 99 | |
| 74 G = extended_barabasi_albert_graph(100, 2, 0.5, 0, seed) | |
| 75 assert G.number_of_edges() > 100 * 3 | |
| 76 assert G.number_of_edges() < 100 * 4 | |
| 77 | |
| 78 G = extended_barabasi_albert_graph(100, 2, 0.3, 0.3, seed) | |
| 79 assert G.number_of_edges() > 100 * 2 | |
| 80 assert G.number_of_edges() < 100 * 4 | |
| 81 | |
| 82 G = powerlaw_cluster_graph(100, 1, 1.0, seed) | |
| 83 G = powerlaw_cluster_graph(100, 3, 0.0, seed) | |
| 84 assert G.number_of_edges() == (97 * 3) | |
| 85 | |
| 86 G = random_regular_graph(10, 20, seed) | |
| 87 | |
| 88 pytest.raises(NetworkXError, random_regular_graph, 3, 21) | |
| 89 pytest.raises(NetworkXError, random_regular_graph, 33, 21) | |
| 90 | |
| 91 constructor = [(10, 20, 0.8), (20, 40, 0.8)] | |
| 92 G = random_shell_graph(constructor, seed) | |
| 93 | |
| 94 def is_caterpillar(g): | |
| 95 """ | |
| 96 A tree is a caterpillar iff all nodes of degree >=3 are surrounded | |
| 97 by at most two nodes of degree two or greater. | |
| 98 ref: http://mathworld.wolfram.com/CaterpillarGraph.html | |
| 99 """ | |
| 100 deg_over_3 = [n for n in g if g.degree(n) >= 3] | |
| 101 for n in deg_over_3: | |
| 102 nbh_deg_over_2 = [nbh for nbh in g.neighbors(n) if g.degree(nbh) >= 2] | |
| 103 if not len(nbh_deg_over_2) <= 2: | |
| 104 return False | |
| 105 return True | |
| 106 | |
| 107 def is_lobster(g): | |
| 108 """ | |
| 109 A tree is a lobster if it has the property that the removal of leaf | |
| 110 nodes leaves a caterpillar graph (Gallian 2007) | |
| 111 ref: http://mathworld.wolfram.com/LobsterGraph.html | |
| 112 """ | |
| 113 non_leafs = [n for n in g if g.degree(n) > 1] | |
| 114 return is_caterpillar(g.subgraph(non_leafs)) | |
| 115 | |
| 116 G = random_lobster(10, 0.1, 0.5, seed) | |
| 117 assert max([G.degree(n) for n in G.nodes()]) > 3 | |
| 118 assert is_lobster(G) | |
| 119 pytest.raises(NetworkXError, random_lobster, 10, 0.1, 1, seed) | |
| 120 pytest.raises(NetworkXError, random_lobster, 10, 1, 1, seed) | |
| 121 pytest.raises(NetworkXError, random_lobster, 10, 1, 0.5, seed) | |
| 122 | |
| 123 # docstring says this should be a caterpillar | |
| 124 G = random_lobster(10, 0.1, 0.0, seed) | |
| 125 assert is_caterpillar(G) | |
| 126 | |
| 127 # difficult to find seed that requires few tries | |
| 128 seq = random_powerlaw_tree_sequence(10, 3, seed=14, tries=1) | |
| 129 G = random_powerlaw_tree(10, 3, seed=14, tries=1) | |
| 130 | |
| 131 def test_dual_barabasi_albert(self, m1=1, m2=4, p=0.5): | |
| 132 """ | |
| 133 Tests that the dual BA random graph generated behaves consistently. | |
| 134 | |
| 135 Tests the exceptions are raised as expected. | |
| 136 | |
| 137 The graphs generation are repeated several times to prevent lucky shots | |
| 138 | |
| 139 """ | |
| 140 seed = 42 | |
| 141 repeats = 2 | |
| 142 | |
| 143 while repeats: | |
| 144 repeats -= 1 | |
| 145 | |
| 146 # This should be BA with m = m1 | |
| 147 BA1 = barabasi_albert_graph(100, m1, seed) | |
| 148 DBA1 = dual_barabasi_albert_graph(100, m1, m2, 1, seed) | |
| 149 assert BA1.size() == DBA1.size() | |
| 150 | |
| 151 # This should be BA with m = m2 | |
| 152 BA2 = barabasi_albert_graph(100, m2, seed) | |
| 153 DBA2 = dual_barabasi_albert_graph(100, m1, m2, 0, seed) | |
| 154 assert BA2.size() == DBA2.size() | |
| 155 | |
| 156 # Testing exceptions | |
| 157 dbag = dual_barabasi_albert_graph | |
| 158 pytest.raises(NetworkXError, dbag, m1, m1, m2, 0) | |
| 159 pytest.raises(NetworkXError, dbag, m2, m1, m2, 0) | |
| 160 pytest.raises(NetworkXError, dbag, 100, m1, m2, -0.5) | |
| 161 pytest.raises(NetworkXError, dbag, 100, m1, m2, 1.5) | |
| 162 | |
| 163 def test_extended_barabasi_albert(self, m=2): | |
| 164 """ | |
| 165 Tests that the extended BA random graph generated behaves consistently. | |
| 166 | |
| 167 Tests the exceptions are raised as expected. | |
| 168 | |
| 169 The graphs generation are repeated several times to prevent lucky-shots | |
| 170 | |
| 171 """ | |
| 172 seed = 42 | |
| 173 repeats = 2 | |
| 174 BA_model = barabasi_albert_graph(100, m, seed) | |
| 175 BA_model_edges = BA_model.number_of_edges() | |
| 176 | |
| 177 while repeats: | |
| 178 repeats -= 1 | |
| 179 | |
| 180 # This behaves just like BA, the number of edges must be the same | |
| 181 G1 = extended_barabasi_albert_graph(100, m, 0, 0, seed) | |
| 182 assert G1.size() == BA_model_edges | |
| 183 | |
| 184 # More than twice more edges should have been added | |
| 185 G1 = extended_barabasi_albert_graph(100, m, 0.8, 0, seed) | |
| 186 assert G1.size() > BA_model_edges * 2 | |
| 187 | |
| 188 # Only edge rewiring, so the number of edges less than original | |
| 189 G2 = extended_barabasi_albert_graph(100, m, 0, 0.8, seed) | |
| 190 assert G2.size() == BA_model_edges | |
| 191 | |
| 192 # Mixed scenario: less edges than G1 and more edges than G2 | |
| 193 G3 = extended_barabasi_albert_graph(100, m, 0.3, 0.3, seed) | |
| 194 assert G3.size() > G2.size() | |
| 195 assert G3.size() < G1.size() | |
| 196 | |
| 197 # Testing exceptions | |
| 198 ebag = extended_barabasi_albert_graph | |
| 199 pytest.raises(NetworkXError, ebag, m, m, 0, 0) | |
| 200 pytest.raises(NetworkXError, ebag, 1, 0.5, 0, 0) | |
| 201 pytest.raises(NetworkXError, ebag, 100, 2, 0.5, 0.5) | |
| 202 | |
| 203 def test_random_zero_regular_graph(self): | |
| 204 """Tests that a 0-regular graph has the correct number of nodes and | |
| 205 edges. | |
| 206 | |
| 207 """ | |
| 208 seed = 42 | |
| 209 G = random_regular_graph(0, 10, seed) | |
| 210 assert len(G) == 10 | |
| 211 assert sum(1 for _ in G.edges()) == 0 | |
| 212 | |
| 213 def test_gnp(self): | |
| 214 for generator in [ | |
| 215 gnp_random_graph, | |
| 216 binomial_graph, | |
| 217 erdos_renyi_graph, | |
| 218 fast_gnp_random_graph, | |
| 219 ]: | |
| 220 G = generator(10, -1.1) | |
| 221 assert len(G) == 10 | |
| 222 assert sum(1 for _ in G.edges()) == 0 | |
| 223 | |
| 224 G = generator(10, 0.1) | |
| 225 assert len(G) == 10 | |
| 226 | |
| 227 G = generator(10, 0.1, seed=42) | |
| 228 assert len(G) == 10 | |
| 229 | |
| 230 G = generator(10, 1.1) | |
| 231 assert len(G) == 10 | |
| 232 assert sum(1 for _ in G.edges()) == 45 | |
| 233 | |
| 234 G = generator(10, -1.1, directed=True) | |
| 235 assert G.is_directed() | |
| 236 assert len(G) == 10 | |
| 237 assert sum(1 for _ in G.edges()) == 0 | |
| 238 | |
| 239 G = generator(10, 0.1, directed=True) | |
| 240 assert G.is_directed() | |
| 241 assert len(G) == 10 | |
| 242 | |
| 243 G = generator(10, 1.1, directed=True) | |
| 244 assert G.is_directed() | |
| 245 assert len(G) == 10 | |
| 246 assert sum(1 for _ in G.edges()) == 90 | |
| 247 | |
| 248 # assert that random graphs generate all edges for p close to 1 | |
| 249 edges = 0 | |
| 250 runs = 100 | |
| 251 for i in range(runs): | |
| 252 edges += sum(1 for _ in generator(10, 0.99999, directed=True).edges()) | |
| 253 assert abs(edges / float(runs) - 90) <= runs * 2.0 / 100 | |
| 254 | |
| 255 def test_gnm(self): | |
| 256 G = gnm_random_graph(10, 3) | |
| 257 assert len(G) == 10 | |
| 258 assert sum(1 for _ in G.edges()) == 3 | |
| 259 | |
| 260 G = gnm_random_graph(10, 3, seed=42) | |
| 261 assert len(G) == 10 | |
| 262 assert sum(1 for _ in G.edges()) == 3 | |
| 263 | |
| 264 G = gnm_random_graph(10, 100) | |
| 265 assert len(G) == 10 | |
| 266 assert sum(1 for _ in G.edges()) == 45 | |
| 267 | |
| 268 G = gnm_random_graph(10, 100, directed=True) | |
| 269 assert len(G) == 10 | |
| 270 assert sum(1 for _ in G.edges()) == 90 | |
| 271 | |
| 272 G = gnm_random_graph(10, -1.1) | |
| 273 assert len(G) == 10 | |
| 274 assert sum(1 for _ in G.edges()) == 0 | |
| 275 | |
| 276 def test_watts_strogatz_big_k(self): | |
| 277 # Test to make sure than n <= k | |
| 278 pytest.raises(NetworkXError, watts_strogatz_graph, 10, 11, 0.25) | |
| 279 pytest.raises(NetworkXError, newman_watts_strogatz_graph, 10, 11, 0.25) | |
| 280 | |
| 281 # could create an infinite loop, now doesn't | |
| 282 # infinite loop used to occur when a node has degree n-1 and needs to rewire | |
| 283 watts_strogatz_graph(10, 9, 0.25, seed=0) | |
| 284 newman_watts_strogatz_graph(10, 9, 0.5, seed=0) | |
| 285 | |
| 286 # Test k==n scenario | |
| 287 watts_strogatz_graph(10, 10, 0.25, seed=0) | |
| 288 newman_watts_strogatz_graph(10, 10, 0.25, seed=0) | |
| 289 | |
| 290 def test_random_kernel_graph(self): | |
| 291 def integral(u, w, z): | |
| 292 return c * (z - w) | |
| 293 | |
| 294 def root(u, w, r): | |
| 295 return r / c + w | |
| 296 | |
| 297 c = 1 | |
| 298 graph = random_kernel_graph(1000, integral, root) | |
| 299 graph = random_kernel_graph(1000, integral, root, seed=42) | |
| 300 assert len(graph) == 1000 |
