|
|
"""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()) |
|
|
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_negative_delta(): |
|
|
with pytest.raises(ValueError, match="delta_in must be >= 0."): |
|
|
scale_free_graph(10, delta_in=-1) |
|
|
with pytest.raises(ValueError, match="delta_out must be >= 0."): |
|
|
scale_free_graph(10, 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()) |
|
|
|