diff options
author | Simone Gasperini <simone.gasperini2@studio.unibo.it> | 2021-10-18 17:53:25 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-18 11:53:25 -0400 |
commit | 9ae1ac441cc34c2950389ca5e97f9000d308fbe5 (patch) | |
tree | 260ee5c4b81c78b87045add86a0480448bc55674 | |
parent | f2b5f2d3153409c10481e1af0021837484ff40fe (diff) | |
download | networkx-9ae1ac441cc34c2950389ca5e97f9000d308fbe5.tar.gz |
Improve random graphs test suite for gnp generators (issue #5092) (#5115)
* Reorganize test suite for gnp random graphs generators
* Remove unnecessary outer class
* Split tests in smaller functions to improve granularity and readability
* Add tests parametrization for different gnp generators and their pars
* Improve tests for gnp generators aliases
* Test binomial_graph and erdos_renyi_graph as aliases of gnp_random_graph
* Add tests parametrization for different random seeds
-rw-r--r-- | networkx/generators/tests/test_random_graphs.py | 164 |
1 files changed, 92 insertions, 72 deletions
diff --git a/networkx/generators/tests/test_random_graphs.py b/networkx/generators/tests/test_random_graphs.py index cb2ac29f..8d47b960 100644 --- a/networkx/generators/tests/test_random_graphs.py +++ b/networkx/generators/tests/test_random_graphs.py @@ -1,19 +1,102 @@ -"""Unit tests for the :mod:`networkx.generators.random_graphs` module. - -""" +"""Unit tests for the :mod:`networkx.generators.random_graphs` module.""" import networkx as nx import pytest +_gnp_generators = [ + nx.gnp_random_graph, + nx.fast_gnp_random_graph, + nx.binomial_graph, + nx.erdos_renyi_graph, +] + + +@pytest.mark.parametrize("generator", _gnp_generators) +@pytest.mark.parametrize("directed", (True, False)) +def test_gnp_generators_negative_edge_probability(generator, directed): + """If the edge probability `p` is <=0, the resulting graph should have no edges.""" + G = generator(10, -1.1, directed=directed) + assert len(G) == 10 + assert G.number_of_edges() == 0 + assert G.is_directed() == directed + + +@pytest.mark.parametrize("generator", _gnp_generators) +@pytest.mark.parametrize( + ("directed", "expected_num_edges"), + [(False, 45), (True, 90)], +) +def test_gnp_generators_greater_than_1_edge_probability( + generator, directed, expected_num_edges +): + """If the edge probability `p` is >=1, the resulting graph should be complete.""" + G = generator(10, 1.1, directed=directed) + assert len(G) == 10 + assert G.number_of_edges() == expected_num_edges + assert G.is_directed() == directed + + +@pytest.mark.parametrize("generator", _gnp_generators) +@pytest.mark.parametrize("directed", (True, False)) +def test_gnp_generators_basic(generator, directed): + """If the edge probability `p` is >0 and <1, test only the basic properties.""" + G = generator(10, 0.1, directed=directed) + assert len(G) == 10 + assert G.is_directed() == directed + + +@pytest.mark.parametrize("generator", _gnp_generators) +def test_gnp_generators_for_p_close_to_1(generator): + """If the edge probability `p` is close to 1, the resulting graph should have all edges.""" + runs = 100 + edges = sum( + [generator(10, 0.99999, directed=True).number_of_edges() for _ in range(runs)] + ) + assert abs(edges / float(runs) - 90) <= runs * 2.0 / 100 + + +@pytest.mark.parametrize("generator", _gnp_generators) +@pytest.mark.parametrize("p", (0.2, 0.8)) +@pytest.mark.parametrize("directed", (True, False)) +def test_gnp_generators_edge_probability(generator, p, directed): + """Test that gnp generators generate edges according to the their probability `p`.""" + runs = 5000 + n = 5 + edge_counts = [[0] * n for _ in range(n)] + for i in range(runs): + G = generator(n, p, directed=directed) + for (v, w) in G.edges: + edge_counts[v][w] += 1 + if not directed: + edge_counts[w][v] += 1 + for v in range(n): + for w in range(n): + if v == w: + # There should be no loops + assert edge_counts[v][w] == 0 + else: + # Each edge should have been generated with probability close to p + assert abs(edge_counts[v][w] / float(runs) - p) <= 0.03 + + +@pytest.mark.parametrize( + "generator", [nx.gnp_random_graph, nx.binomial_graph, nx.erdos_renyi_graph] +) +@pytest.mark.parametrize( + ("seed", "directed", "expected_num_edges"), + [(42, False, 1219), (42, True, 2454), (314, False, 1247), (314, True, 2476)], +) +def test_gnp_random_graph_aliases(generator, seed, directed, expected_num_edges): + """Test that aliases give the same result with the same seed.""" + G = generator(100, 0.25, seed=seed, directed=directed) + assert len(G) == 100 + assert G.number_of_edges() == expected_num_edges + assert G.is_directed() == directed + + class TestGeneratorsRandom: def test_random_graph(self): seed = 42 - G = nx.gnp_random_graph(100, 0.25, seed) - G = nx.gnp_random_graph(100, 0.25, seed, directed=True) - G = nx.binomial_graph(100, 0.25, seed) - G = nx.erdos_renyi_graph(100, 0.25, seed) - G = nx.fast_gnp_random_graph(100, 0.25, seed) - G = nx.fast_gnp_random_graph(100, 0.25, seed, directed=True) G = nx.gnm_random_graph(100, 20, seed) G = nx.gnm_random_graph(100, 20, seed, directed=True) G = nx.dense_gnm_random_graph(100, 20, seed) @@ -205,69 +288,6 @@ class TestGeneratorsRandom: assert len(G) == 10 assert G.number_of_edges() == 0 - def test_gnp(self): - for generator in [ - nx.gnp_random_graph, - nx.binomial_graph, - nx.erdos_renyi_graph, - nx.fast_gnp_random_graph, - ]: - G = generator(10, -1.1) - assert len(G) == 10 - assert G.number_of_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 G.number_of_edges() == 45 - - G = generator(10, -1.1, directed=True) - assert G.is_directed() - assert len(G) == 10 - assert G.number_of_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 G.number_of_edges() == 90 - - # assert that random graphs generate all edges for p close to 1 - edges = 0 - runs = 100 - for i in range(runs): - edges += generator(10, 0.99999, directed=True).number_of_edges() - assert abs(edges / float(runs) - 90) <= runs * 2.0 / 100 - - # assert that edges are generated with correct probability - runs = 5000 - n = 5 - for p in [0.2, 0.8]: - for directed in [False, True]: - edge_counts = [[0] * 5 for row in range(5)] - for i in range(runs): - G = generator(n, p, directed=directed) - for (v, w) in G.edges: - edge_counts[v][w] += 1 - if not directed: - edge_counts[w][v] += 1 - for v in range(n): - for w in range(n): - if v == w: - # There should be no loops - assert edge_counts[v][w] == 0 - else: - # Each edge should have been generated with probability close to p - assert abs(edge_counts[v][w] / float(runs) - p) <= 0.03 - def test_gnm(self): G = nx.gnm_random_graph(10, 3) assert len(G) == 10 |