123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- """Generators - Directed Graphs
- ----------------------------
- """
- import pytest
- import networkx as nx
- from networkx.classes import Graph, MultiDiGraph
- from networkx.generators.directed import (
- gn_graph,
- gnc_graph,
- gnr_graph,
- random_k_out_graph,
- random_uniform_k_out_graph,
- scale_free_graph,
- )
- class TestGeneratorsDirected:
- def test_smoke_test_random_graphs(self):
- gn_graph(100)
- gnr_graph(100, 0.5)
- gnc_graph(100)
- scale_free_graph(100)
- gn_graph(100, seed=42)
- gnr_graph(100, 0.5, seed=42)
- gnc_graph(100, seed=42)
- scale_free_graph(100, seed=42)
- def test_create_using_keyword_arguments(self):
- pytest.raises(nx.NetworkXError, gn_graph, 100, create_using=Graph())
- pytest.raises(nx.NetworkXError, gnr_graph, 100, 0.5, create_using=Graph())
- pytest.raises(nx.NetworkXError, gnc_graph, 100, create_using=Graph())
- pytest.raises(nx.NetworkXError, scale_free_graph, 100, create_using=Graph())
- G = gn_graph(100, seed=1)
- MG = gn_graph(100, create_using=MultiDiGraph(), seed=1)
- assert sorted(G.edges()) == sorted(MG.edges())
- G = gnr_graph(100, 0.5, seed=1)
- MG = gnr_graph(100, 0.5, create_using=MultiDiGraph(), seed=1)
- assert sorted(G.edges()) == sorted(MG.edges())
- G = gnc_graph(100, seed=1)
- MG = gnc_graph(100, create_using=MultiDiGraph(), seed=1)
- assert sorted(G.edges()) == sorted(MG.edges())
- G = scale_free_graph(
- 100,
- alpha=0.3,
- beta=0.4,
- gamma=0.3,
- delta_in=0.3,
- delta_out=0.1,
- initial_graph=nx.cycle_graph(4, create_using=MultiDiGraph),
- seed=1,
- )
- pytest.raises(ValueError, scale_free_graph, 100, 0.5, 0.4, 0.3)
- pytest.raises(ValueError, scale_free_graph, 100, alpha=-0.3)
- pytest.raises(ValueError, scale_free_graph, 100, beta=-0.3)
- pytest.raises(ValueError, scale_free_graph, 100, gamma=-0.3)
- def test_parameters(self):
- G = nx.DiGraph()
- G.add_node(0)
- def kernel(x):
- return x
- assert nx.is_isomorphic(gn_graph(1), G)
- assert nx.is_isomorphic(gn_graph(1, kernel=kernel), G)
- assert nx.is_isomorphic(gnc_graph(1), G)
- assert nx.is_isomorphic(gnr_graph(1, 0.5), G)
- def test_scale_free_graph_create_using_with_initial_graph():
- G = nx.MultiGraph()
- with pytest.raises(
- ValueError,
- match="Cannot set both create_using and initial_graph. Set create_using=None.",
- ):
- scale_free_graph(10, create_using=nx.Graph, initial_graph=G)
- def test_scale_free_graph_negative_delta():
- with pytest.raises(ValueError, match="delta_in must be >= 0."):
- scale_free_graph(10, create_using=None, delta_in=-1)
- with pytest.raises(ValueError, match="delta_out must be >= 0."):
- scale_free_graph(10, create_using=None, delta_out=-1)
- def test_non_numeric_ordering():
- G = MultiDiGraph([("a", "b"), ("b", "c"), ("c", "a")])
- s = scale_free_graph(3, initial_graph=G)
- assert len(s) == 3
- assert len(s.edges) == 3
- @pytest.mark.parametrize("ig", (nx.Graph(), nx.DiGraph([(0, 1)])))
- def test_scale_free_graph_initial_graph_kwarg(ig):
- with pytest.raises(nx.NetworkXError):
- scale_free_graph(100, initial_graph=ig)
- class TestRandomKOutGraph:
- """Unit tests for the
- :func:`~networkx.generators.directed.random_k_out_graph` function.
- """
- def test_regularity(self):
- """Tests that the generated graph is `k`-out-regular."""
- n = 10
- k = 3
- alpha = 1
- G = random_k_out_graph(n, k, alpha)
- assert all(d == k for v, d in G.out_degree())
- G = random_k_out_graph(n, k, alpha, seed=42)
- assert all(d == k for v, d in G.out_degree())
- def test_no_self_loops(self):
- """Tests for forbidding self-loops."""
- n = 10
- k = 3
- alpha = 1
- G = random_k_out_graph(n, k, alpha, self_loops=False)
- assert nx.number_of_selfloops(G) == 0
- def test_negative_alpha(self):
- with pytest.raises(ValueError, match="alpha must be positive"):
- random_k_out_graph(10, 3, -1)
- class TestUniformRandomKOutGraph:
- """Unit tests for the
- :func:`~networkx.generators.directed.random_uniform_k_out_graph`
- function.
- """
- def test_regularity(self):
- """Tests that the generated graph is `k`-out-regular."""
- n = 10
- k = 3
- G = random_uniform_k_out_graph(n, k)
- assert all(d == k for v, d in G.out_degree())
- G = random_uniform_k_out_graph(n, k, seed=42)
- assert all(d == k for v, d in G.out_degree())
- def test_no_self_loops(self):
- """Tests for forbidding self-loops."""
- n = 10
- k = 3
- G = random_uniform_k_out_graph(n, k, self_loops=False)
- assert nx.number_of_selfloops(G) == 0
- assert all(d == k for v, d in G.out_degree())
- def test_with_replacement(self):
- n = 10
- k = 3
- G = random_uniform_k_out_graph(n, k, with_replacement=True)
- assert G.is_multigraph()
- assert all(d == k for v, d in G.out_degree())
- n = 10
- k = 9
- G = random_uniform_k_out_graph(n, k, with_replacement=False, self_loops=False)
- assert nx.number_of_selfloops(G) == 0
- assert all(d == k for v, d in G.out_degree())
- def test_without_replacement(self):
- n = 10
- k = 3
- G = random_uniform_k_out_graph(n, k, with_replacement=False)
- assert not G.is_multigraph()
- assert all(d == k for v, d in G.out_degree())
|