123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- import pytest
- import networkx as nx
- def test_random_partition_graph():
- G = nx.random_partition_graph([3, 3, 3], 1, 0, seed=42)
- C = G.graph["partition"]
- assert C == [{0, 1, 2}, {3, 4, 5}, {6, 7, 8}]
- assert len(G) == 9
- assert len(list(G.edges())) == 9
- G = nx.random_partition_graph([3, 3, 3], 0, 1)
- C = G.graph["partition"]
- assert C == [{0, 1, 2}, {3, 4, 5}, {6, 7, 8}]
- assert len(G) == 9
- assert len(list(G.edges())) == 27
- G = nx.random_partition_graph([3, 3, 3], 1, 0, directed=True)
- C = G.graph["partition"]
- assert C == [{0, 1, 2}, {3, 4, 5}, {6, 7, 8}]
- assert len(G) == 9
- assert len(list(G.edges())) == 18
- G = nx.random_partition_graph([3, 3, 3], 0, 1, directed=True)
- C = G.graph["partition"]
- assert C == [{0, 1, 2}, {3, 4, 5}, {6, 7, 8}]
- assert len(G) == 9
- assert len(list(G.edges())) == 54
- G = nx.random_partition_graph([1, 2, 3, 4, 5], 0.5, 0.1)
- C = G.graph["partition"]
- assert C == [{0}, {1, 2}, {3, 4, 5}, {6, 7, 8, 9}, {10, 11, 12, 13, 14}]
- assert len(G) == 15
- rpg = nx.random_partition_graph
- pytest.raises(nx.NetworkXError, rpg, [1, 2, 3], 1.1, 0.1)
- pytest.raises(nx.NetworkXError, rpg, [1, 2, 3], -0.1, 0.1)
- pytest.raises(nx.NetworkXError, rpg, [1, 2, 3], 0.1, 1.1)
- pytest.raises(nx.NetworkXError, rpg, [1, 2, 3], 0.1, -0.1)
- def test_planted_partition_graph():
- G = nx.planted_partition_graph(4, 3, 1, 0, seed=42)
- C = G.graph["partition"]
- assert len(C) == 4
- assert len(G) == 12
- assert len(list(G.edges())) == 12
- G = nx.planted_partition_graph(4, 3, 0, 1)
- C = G.graph["partition"]
- assert len(C) == 4
- assert len(G) == 12
- assert len(list(G.edges())) == 54
- G = nx.planted_partition_graph(10, 4, 0.5, 0.1, seed=42)
- C = G.graph["partition"]
- assert len(C) == 10
- assert len(G) == 40
- G = nx.planted_partition_graph(4, 3, 1, 0, directed=True)
- C = G.graph["partition"]
- assert len(C) == 4
- assert len(G) == 12
- assert len(list(G.edges())) == 24
- G = nx.planted_partition_graph(4, 3, 0, 1, directed=True)
- C = G.graph["partition"]
- assert len(C) == 4
- assert len(G) == 12
- assert len(list(G.edges())) == 108
- G = nx.planted_partition_graph(10, 4, 0.5, 0.1, seed=42, directed=True)
- C = G.graph["partition"]
- assert len(C) == 10
- assert len(G) == 40
- ppg = nx.planted_partition_graph
- pytest.raises(nx.NetworkXError, ppg, 3, 3, 1.1, 0.1)
- pytest.raises(nx.NetworkXError, ppg, 3, 3, -0.1, 0.1)
- pytest.raises(nx.NetworkXError, ppg, 3, 3, 0.1, 1.1)
- pytest.raises(nx.NetworkXError, ppg, 3, 3, 0.1, -0.1)
- def test_relaxed_caveman_graph():
- G = nx.relaxed_caveman_graph(4, 3, 0)
- assert len(G) == 12
- G = nx.relaxed_caveman_graph(4, 3, 1)
- assert len(G) == 12
- G = nx.relaxed_caveman_graph(4, 3, 0.5)
- assert len(G) == 12
- G = nx.relaxed_caveman_graph(4, 3, 0.5, seed=42)
- assert len(G) == 12
- def test_connected_caveman_graph():
- G = nx.connected_caveman_graph(4, 3)
- assert len(G) == 12
- G = nx.connected_caveman_graph(1, 5)
- K5 = nx.complete_graph(5)
- K5.remove_edge(3, 4)
- assert nx.is_isomorphic(G, K5)
- # need at least 2 nodes in each clique
- pytest.raises(nx.NetworkXError, nx.connected_caveman_graph, 4, 1)
- def test_caveman_graph():
- G = nx.caveman_graph(4, 3)
- assert len(G) == 12
- G = nx.caveman_graph(5, 1)
- E5 = nx.empty_graph(5)
- assert nx.is_isomorphic(G, E5)
- G = nx.caveman_graph(1, 5)
- K5 = nx.complete_graph(5)
- assert nx.is_isomorphic(G, K5)
- def test_gaussian_random_partition_graph():
- G = nx.gaussian_random_partition_graph(100, 10, 10, 0.3, 0.01)
- assert len(G) == 100
- G = nx.gaussian_random_partition_graph(100, 10, 10, 0.3, 0.01, directed=True)
- assert len(G) == 100
- G = nx.gaussian_random_partition_graph(
- 100, 10, 10, 0.3, 0.01, directed=False, seed=42
- )
- assert len(G) == 100
- assert not isinstance(G, nx.DiGraph)
- G = nx.gaussian_random_partition_graph(
- 100, 10, 10, 0.3, 0.01, directed=True, seed=42
- )
- assert len(G) == 100
- assert isinstance(G, nx.DiGraph)
- pytest.raises(
- nx.NetworkXError, nx.gaussian_random_partition_graph, 100, 101, 10, 1, 0
- )
- # Test when clusters are likely less than 1
- G = nx.gaussian_random_partition_graph(10, 0.5, 0.5, 0.5, 0.5, seed=1)
- assert len(G) == 10
- def test_ring_of_cliques():
- for i in range(2, 20, 3):
- for j in range(2, 20, 3):
- G = nx.ring_of_cliques(i, j)
- assert G.number_of_nodes() == i * j
- if i != 2 or j != 1:
- expected_num_edges = i * (((j * (j - 1)) // 2) + 1)
- else:
- # the edge that already exists cannot be duplicated
- expected_num_edges = i * (((j * (j - 1)) // 2) + 1) - 1
- assert G.number_of_edges() == expected_num_edges
- with pytest.raises(
- nx.NetworkXError, match="A ring of cliques must have at least two cliques"
- ):
- nx.ring_of_cliques(1, 5)
- with pytest.raises(
- nx.NetworkXError, match="The cliques must have at least two nodes"
- ):
- nx.ring_of_cliques(3, 0)
- def test_windmill_graph():
- for n in range(2, 20, 3):
- for k in range(2, 20, 3):
- G = nx.windmill_graph(n, k)
- assert G.number_of_nodes() == (k - 1) * n + 1
- assert G.number_of_edges() == n * k * (k - 1) / 2
- assert G.degree(0) == G.number_of_nodes() - 1
- for i in range(1, G.number_of_nodes()):
- assert G.degree(i) == k - 1
- with pytest.raises(
- nx.NetworkXError, match="A windmill graph must have at least two cliques"
- ):
- nx.windmill_graph(1, 3)
- with pytest.raises(
- nx.NetworkXError, match="The cliques must have at least two nodes"
- ):
- nx.windmill_graph(3, 0)
- def test_stochastic_block_model():
- sizes = [75, 75, 300]
- probs = [[0.25, 0.05, 0.02], [0.05, 0.35, 0.07], [0.02, 0.07, 0.40]]
- G = nx.stochastic_block_model(sizes, probs, seed=0)
- C = G.graph["partition"]
- assert len(C) == 3
- assert len(G) == 450
- assert G.size() == 22160
- GG = nx.stochastic_block_model(sizes, probs, range(450), seed=0)
- assert G.nodes == GG.nodes
- # Test Exceptions
- sbm = nx.stochastic_block_model
- badnodelist = list(range(400)) # not enough nodes to match sizes
- badprobs1 = [[0.25, 0.05, 1.02], [0.05, 0.35, 0.07], [0.02, 0.07, 0.40]]
- badprobs2 = [[0.25, 0.05, 0.02], [0.05, -0.35, 0.07], [0.02, 0.07, 0.40]]
- probs_rect1 = [[0.25, 0.05, 0.02], [0.05, -0.35, 0.07]]
- probs_rect2 = [[0.25, 0.05], [0.05, -0.35], [0.02, 0.07]]
- asymprobs = [[0.25, 0.05, 0.01], [0.05, -0.35, 0.07], [0.02, 0.07, 0.40]]
- pytest.raises(nx.NetworkXException, sbm, sizes, badprobs1)
- pytest.raises(nx.NetworkXException, sbm, sizes, badprobs2)
- pytest.raises(nx.NetworkXException, sbm, sizes, probs_rect1, directed=True)
- pytest.raises(nx.NetworkXException, sbm, sizes, probs_rect2, directed=True)
- pytest.raises(nx.NetworkXException, sbm, sizes, asymprobs, directed=False)
- pytest.raises(nx.NetworkXException, sbm, sizes, probs, badnodelist)
- nodelist = [0] + list(range(449)) # repeated node name in nodelist
- pytest.raises(nx.NetworkXException, sbm, sizes, probs, nodelist)
- # Extra keyword arguments test
- GG = nx.stochastic_block_model(sizes, probs, seed=0, selfloops=True)
- assert G.nodes == GG.nodes
- GG = nx.stochastic_block_model(sizes, probs, selfloops=True, directed=True)
- assert G.nodes == GG.nodes
- GG = nx.stochastic_block_model(sizes, probs, seed=0, sparse=False)
- assert G.nodes == GG.nodes
- def test_generator():
- n = 250
- tau1 = 3
- tau2 = 1.5
- mu = 0.1
- G = nx.LFR_benchmark_graph(
- n, tau1, tau2, mu, average_degree=5, min_community=20, seed=10
- )
- assert len(G) == 250
- C = {frozenset(G.nodes[v]["community"]) for v in G}
- assert nx.community.is_partition(G.nodes(), C)
- def test_invalid_tau1():
- with pytest.raises(nx.NetworkXError, match="tau2 must be greater than one"):
- n = 100
- tau1 = 2
- tau2 = 1
- mu = 0.1
- nx.LFR_benchmark_graph(n, tau1, tau2, mu, min_degree=2)
- def test_invalid_tau2():
- with pytest.raises(nx.NetworkXError, match="tau1 must be greater than one"):
- n = 100
- tau1 = 1
- tau2 = 2
- mu = 0.1
- nx.LFR_benchmark_graph(n, tau1, tau2, mu, min_degree=2)
- def test_mu_too_large():
- with pytest.raises(nx.NetworkXError, match="mu must be in the interval \\[0, 1\\]"):
- n = 100
- tau1 = 2
- tau2 = 2
- mu = 1.1
- nx.LFR_benchmark_graph(n, tau1, tau2, mu, min_degree=2)
- def test_mu_too_small():
- with pytest.raises(nx.NetworkXError, match="mu must be in the interval \\[0, 1\\]"):
- n = 100
- tau1 = 2
- tau2 = 2
- mu = -1
- nx.LFR_benchmark_graph(n, tau1, tau2, mu, min_degree=2)
- def test_both_degrees_none():
- with pytest.raises(
- nx.NetworkXError,
- match="Must assign exactly one of min_degree and average_degree",
- ):
- n = 100
- tau1 = 2
- tau2 = 2
- mu = 1
- nx.LFR_benchmark_graph(n, tau1, tau2, mu)
- def test_neither_degrees_none():
- with pytest.raises(
- nx.NetworkXError,
- match="Must assign exactly one of min_degree and average_degree",
- ):
- n = 100
- tau1 = 2
- tau2 = 2
- mu = 1
- nx.LFR_benchmark_graph(n, tau1, tau2, mu, min_degree=2, average_degree=5)
- def test_max_iters_exeded():
- with pytest.raises(
- nx.ExceededMaxIterations,
- match="Could not assign communities; try increasing min_community",
- ):
- n = 10
- tau1 = 2
- tau2 = 2
- mu = 0.1
- nx.LFR_benchmark_graph(n, tau1, tau2, mu, min_degree=2, max_iters=10, seed=1)
- def test_max_deg_out_of_range():
- with pytest.raises(
- nx.NetworkXError, match="max_degree must be in the interval \\(0, n\\]"
- ):
- n = 10
- tau1 = 2
- tau2 = 2
- mu = 0.1
- nx.LFR_benchmark_graph(
- n, tau1, tau2, mu, max_degree=n + 1, max_iters=10, seed=1
- )
- def test_max_community():
- n = 250
- tau1 = 3
- tau2 = 1.5
- mu = 0.1
- G = nx.LFR_benchmark_graph(
- n,
- tau1,
- tau2,
- mu,
- average_degree=5,
- max_degree=100,
- min_community=50,
- max_community=200,
- seed=10,
- )
- assert len(G) == 250
- C = {frozenset(G.nodes[v]["community"]) for v in G}
- assert nx.community.is_partition(G.nodes(), C)
- def test_powerlaw_iterations_exceeded():
- with pytest.raises(
- nx.ExceededMaxIterations, match="Could not create power law sequence"
- ):
- n = 100
- tau1 = 2
- tau2 = 2
- mu = 1
- nx.LFR_benchmark_graph(n, tau1, tau2, mu, min_degree=2, max_iters=0)
- def test_no_scipy_zeta():
- zeta2 = 1.6449340668482264
- assert abs(zeta2 - nx.generators.community._hurwitz_zeta(2, 1, 0.0001)) < 0.01
- def test_generate_min_degree_itr():
- with pytest.raises(
- nx.ExceededMaxIterations, match="Could not match average_degree"
- ):
- nx.generators.community._generate_min_degree(2, 2, 1, 0.01, 0)
|