Mercurial > repos > shellac > sam_consensus_v3
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.9/site-packages/networkx/generators/tests/test_random_graphs.py Mon Mar 22 18:12:50 2021 +0000 @@ -0,0 +1,300 @@ +"""Unit tests for the :mod:`networkx.generators.random_graphs` module. + +""" +import pytest + +from networkx.exception import NetworkXError +from networkx.generators.random_graphs import barabasi_albert_graph +from networkx.generators.random_graphs import dual_barabasi_albert_graph +from networkx.generators.random_graphs import extended_barabasi_albert_graph +from networkx.generators.random_graphs import binomial_graph +from networkx.generators.random_graphs import connected_watts_strogatz_graph +from networkx.generators.random_graphs import dense_gnm_random_graph +from networkx.generators.random_graphs import erdos_renyi_graph +from networkx.generators.random_graphs import fast_gnp_random_graph +from networkx.generators.random_graphs import gnm_random_graph +from networkx.generators.random_graphs import gnp_random_graph +from networkx.generators.random_graphs import newman_watts_strogatz_graph +from networkx.generators.random_graphs import powerlaw_cluster_graph +from networkx.generators.random_graphs import random_kernel_graph +from networkx.generators.random_graphs import random_lobster +from networkx.generators.random_graphs import random_powerlaw_tree +from networkx.generators.random_graphs import random_powerlaw_tree_sequence +from networkx.generators.random_graphs import random_regular_graph +from networkx.generators.random_graphs import random_shell_graph +from networkx.generators.random_graphs import watts_strogatz_graph + + +class TestGeneratorsRandom: + def test_random_graph(self): + seed = 42 + G = gnp_random_graph(100, 0.25, seed) + G = gnp_random_graph(100, 0.25, seed, directed=True) + G = binomial_graph(100, 0.25, seed) + G = erdos_renyi_graph(100, 0.25, seed) + G = fast_gnp_random_graph(100, 0.25, seed) + G = fast_gnp_random_graph(100, 0.25, seed, directed=True) + G = gnm_random_graph(100, 20, seed) + G = gnm_random_graph(100, 20, seed, directed=True) + G = dense_gnm_random_graph(100, 20, seed) + + G = watts_strogatz_graph(10, 2, 0.25, seed) + assert len(G) == 10 + assert G.number_of_edges() == 10 + + G = connected_watts_strogatz_graph(10, 2, 0.1, tries=10, seed=seed) + assert len(G) == 10 + assert G.number_of_edges() == 10 + pytest.raises( + NetworkXError, connected_watts_strogatz_graph, 10, 2, 0.1, tries=0 + ) + + G = watts_strogatz_graph(10, 4, 0.25, seed) + assert len(G) == 10 + assert G.number_of_edges() == 20 + + G = newman_watts_strogatz_graph(10, 2, 0.0, seed) + assert len(G) == 10 + assert G.number_of_edges() == 10 + + G = newman_watts_strogatz_graph(10, 4, 0.25, seed) + assert len(G) == 10 + assert G.number_of_edges() >= 20 + + G = barabasi_albert_graph(100, 1, seed) + G = barabasi_albert_graph(100, 3, seed) + assert G.number_of_edges() == (97 * 3) + + G = extended_barabasi_albert_graph(100, 1, 0, 0, seed) + assert G.number_of_edges() == 99 + G = extended_barabasi_albert_graph(100, 3, 0, 0, seed) + assert G.number_of_edges() == 97 * 3 + G = extended_barabasi_albert_graph(100, 1, 0, 0.5, seed) + assert G.number_of_edges() == 99 + G = extended_barabasi_albert_graph(100, 2, 0.5, 0, seed) + assert G.number_of_edges() > 100 * 3 + assert G.number_of_edges() < 100 * 4 + + G = extended_barabasi_albert_graph(100, 2, 0.3, 0.3, seed) + assert G.number_of_edges() > 100 * 2 + assert G.number_of_edges() < 100 * 4 + + G = powerlaw_cluster_graph(100, 1, 1.0, seed) + G = powerlaw_cluster_graph(100, 3, 0.0, seed) + assert G.number_of_edges() == (97 * 3) + + G = random_regular_graph(10, 20, seed) + + pytest.raises(NetworkXError, random_regular_graph, 3, 21) + pytest.raises(NetworkXError, random_regular_graph, 33, 21) + + constructor = [(10, 20, 0.8), (20, 40, 0.8)] + G = random_shell_graph(constructor, seed) + + def is_caterpillar(g): + """ + A tree is a caterpillar iff all nodes of degree >=3 are surrounded + by at most two nodes of degree two or greater. + ref: http://mathworld.wolfram.com/CaterpillarGraph.html + """ + deg_over_3 = [n for n in g if g.degree(n) >= 3] + for n in deg_over_3: + nbh_deg_over_2 = [nbh for nbh in g.neighbors(n) if g.degree(nbh) >= 2] + if not len(nbh_deg_over_2) <= 2: + return False + return True + + def is_lobster(g): + """ + A tree is a lobster if it has the property that the removal of leaf + nodes leaves a caterpillar graph (Gallian 2007) + ref: http://mathworld.wolfram.com/LobsterGraph.html + """ + non_leafs = [n for n in g if g.degree(n) > 1] + return is_caterpillar(g.subgraph(non_leafs)) + + G = random_lobster(10, 0.1, 0.5, seed) + assert max([G.degree(n) for n in G.nodes()]) > 3 + assert is_lobster(G) + pytest.raises(NetworkXError, random_lobster, 10, 0.1, 1, seed) + pytest.raises(NetworkXError, random_lobster, 10, 1, 1, seed) + pytest.raises(NetworkXError, random_lobster, 10, 1, 0.5, seed) + + # docstring says this should be a caterpillar + G = random_lobster(10, 0.1, 0.0, seed) + assert is_caterpillar(G) + + # difficult to find seed that requires few tries + seq = random_powerlaw_tree_sequence(10, 3, seed=14, tries=1) + G = random_powerlaw_tree(10, 3, seed=14, tries=1) + + def test_dual_barabasi_albert(self, m1=1, m2=4, p=0.5): + """ + Tests that the dual BA random graph generated behaves consistently. + + Tests the exceptions are raised as expected. + + The graphs generation are repeated several times to prevent lucky shots + + """ + seed = 42 + repeats = 2 + + while repeats: + repeats -= 1 + + # This should be BA with m = m1 + BA1 = barabasi_albert_graph(100, m1, seed) + DBA1 = dual_barabasi_albert_graph(100, m1, m2, 1, seed) + assert BA1.size() == DBA1.size() + + # This should be BA with m = m2 + BA2 = barabasi_albert_graph(100, m2, seed) + DBA2 = dual_barabasi_albert_graph(100, m1, m2, 0, seed) + assert BA2.size() == DBA2.size() + + # Testing exceptions + dbag = dual_barabasi_albert_graph + pytest.raises(NetworkXError, dbag, m1, m1, m2, 0) + pytest.raises(NetworkXError, dbag, m2, m1, m2, 0) + pytest.raises(NetworkXError, dbag, 100, m1, m2, -0.5) + pytest.raises(NetworkXError, dbag, 100, m1, m2, 1.5) + + def test_extended_barabasi_albert(self, m=2): + """ + Tests that the extended BA random graph generated behaves consistently. + + Tests the exceptions are raised as expected. + + The graphs generation are repeated several times to prevent lucky-shots + + """ + seed = 42 + repeats = 2 + BA_model = barabasi_albert_graph(100, m, seed) + BA_model_edges = BA_model.number_of_edges() + + while repeats: + repeats -= 1 + + # This behaves just like BA, the number of edges must be the same + G1 = extended_barabasi_albert_graph(100, m, 0, 0, seed) + assert G1.size() == BA_model_edges + + # More than twice more edges should have been added + G1 = extended_barabasi_albert_graph(100, m, 0.8, 0, seed) + assert G1.size() > BA_model_edges * 2 + + # Only edge rewiring, so the number of edges less than original + G2 = extended_barabasi_albert_graph(100, m, 0, 0.8, seed) + assert G2.size() == BA_model_edges + + # Mixed scenario: less edges than G1 and more edges than G2 + G3 = extended_barabasi_albert_graph(100, m, 0.3, 0.3, seed) + assert G3.size() > G2.size() + assert G3.size() < G1.size() + + # Testing exceptions + ebag = extended_barabasi_albert_graph + pytest.raises(NetworkXError, ebag, m, m, 0, 0) + pytest.raises(NetworkXError, ebag, 1, 0.5, 0, 0) + pytest.raises(NetworkXError, ebag, 100, 2, 0.5, 0.5) + + def test_random_zero_regular_graph(self): + """Tests that a 0-regular graph has the correct number of nodes and + edges. + + """ + seed = 42 + G = random_regular_graph(0, 10, seed) + assert len(G) == 10 + assert sum(1 for _ in G.edges()) == 0 + + def test_gnp(self): + for generator in [ + gnp_random_graph, + binomial_graph, + erdos_renyi_graph, + fast_gnp_random_graph, + ]: + G = generator(10, -1.1) + assert len(G) == 10 + assert sum(1 for _ in G.edges()) == 0 + + G = generator(10, 0.1) + assert len(G) == 10 + + G = generator(10, 0.1, seed=42) + assert len(G) == 10 + + G = generator(10, 1.1) + assert len(G) == 10 + assert sum(1 for _ in G.edges()) == 45 + + G = generator(10, -1.1, directed=True) + assert G.is_directed() + assert len(G) == 10 + assert sum(1 for _ in G.edges()) == 0 + + G = generator(10, 0.1, directed=True) + assert G.is_directed() + assert len(G) == 10 + + G = generator(10, 1.1, directed=True) + assert G.is_directed() + assert len(G) == 10 + assert sum(1 for _ in G.edges()) == 90 + + # assert that random graphs generate all edges for p close to 1 + edges = 0 + runs = 100 + for i in range(runs): + edges += sum(1 for _ in generator(10, 0.99999, directed=True).edges()) + assert abs(edges / float(runs) - 90) <= runs * 2.0 / 100 + + def test_gnm(self): + G = gnm_random_graph(10, 3) + assert len(G) == 10 + assert sum(1 for _ in G.edges()) == 3 + + G = gnm_random_graph(10, 3, seed=42) + assert len(G) == 10 + assert sum(1 for _ in G.edges()) == 3 + + G = gnm_random_graph(10, 100) + assert len(G) == 10 + assert sum(1 for _ in G.edges()) == 45 + + G = gnm_random_graph(10, 100, directed=True) + assert len(G) == 10 + assert sum(1 for _ in G.edges()) == 90 + + G = gnm_random_graph(10, -1.1) + assert len(G) == 10 + assert sum(1 for _ in G.edges()) == 0 + + def test_watts_strogatz_big_k(self): + # Test to make sure than n <= k + pytest.raises(NetworkXError, watts_strogatz_graph, 10, 11, 0.25) + pytest.raises(NetworkXError, newman_watts_strogatz_graph, 10, 11, 0.25) + + # could create an infinite loop, now doesn't + # infinite loop used to occur when a node has degree n-1 and needs to rewire + watts_strogatz_graph(10, 9, 0.25, seed=0) + newman_watts_strogatz_graph(10, 9, 0.5, seed=0) + + # Test k==n scenario + watts_strogatz_graph(10, 10, 0.25, seed=0) + newman_watts_strogatz_graph(10, 10, 0.25, seed=0) + + def test_random_kernel_graph(self): + def integral(u, w, z): + return c * (z - w) + + def root(u, w, r): + return r / c + w + + c = 1 + graph = random_kernel_graph(1000, integral, root) + graph = random_kernel_graph(1000, integral, root, seed=42) + assert len(graph) == 1000