123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543 |
- import pytest
- import networkx as nx
- class TestTriangles:
- def test_empty(self):
- G = nx.Graph()
- assert list(nx.triangles(G).values()) == []
- def test_path(self):
- G = nx.path_graph(10)
- assert list(nx.triangles(G).values()) == [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
- assert nx.triangles(G) == {
- 0: 0,
- 1: 0,
- 2: 0,
- 3: 0,
- 4: 0,
- 5: 0,
- 6: 0,
- 7: 0,
- 8: 0,
- 9: 0,
- }
- def test_cubical(self):
- G = nx.cubical_graph()
- assert list(nx.triangles(G).values()) == [0, 0, 0, 0, 0, 0, 0, 0]
- assert nx.triangles(G, 1) == 0
- assert list(nx.triangles(G, [1, 2]).values()) == [0, 0]
- assert nx.triangles(G, 1) == 0
- assert nx.triangles(G, [1, 2]) == {1: 0, 2: 0}
- def test_k5(self):
- G = nx.complete_graph(5)
- assert list(nx.triangles(G).values()) == [6, 6, 6, 6, 6]
- assert sum(nx.triangles(G).values()) / 3 == 10
- assert nx.triangles(G, 1) == 6
- G.remove_edge(1, 2)
- assert list(nx.triangles(G).values()) == [5, 3, 3, 5, 5]
- assert nx.triangles(G, 1) == 3
- G.add_edge(3, 3)
- assert list(nx.triangles(G).values()) == [5, 3, 3, 5, 5]
- assert nx.triangles(G, 3) == 5
- class TestDirectedClustering:
- def test_clustering(self):
- G = nx.DiGraph()
- assert list(nx.clustering(G).values()) == []
- assert nx.clustering(G) == {}
- def test_path(self):
- G = nx.path_graph(10, create_using=nx.DiGraph())
- assert list(nx.clustering(G).values()) == [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ]
- assert nx.clustering(G) == {
- 0: 0,
- 1: 0,
- 2: 0,
- 3: 0,
- 4: 0,
- 5: 0,
- 6: 0,
- 7: 0,
- 8: 0,
- 9: 0,
- }
- assert nx.clustering(G, 0) == 0
- def test_k5(self):
- G = nx.complete_graph(5, create_using=nx.DiGraph())
- assert list(nx.clustering(G).values()) == [1, 1, 1, 1, 1]
- assert nx.average_clustering(G) == 1
- G.remove_edge(1, 2)
- assert list(nx.clustering(G).values()) == [
- 11 / 12,
- 1,
- 1,
- 11 / 12,
- 11 / 12,
- ]
- assert nx.clustering(G, [1, 4]) == {1: 1, 4: 11 / 12}
- G.remove_edge(2, 1)
- assert list(nx.clustering(G).values()) == [
- 5 / 6,
- 1,
- 1,
- 5 / 6,
- 5 / 6,
- ]
- assert nx.clustering(G, [1, 4]) == {1: 1, 4: 0.83333333333333337}
- assert nx.clustering(G, 4) == 5 / 6
- def test_triangle_and_edge(self):
- G = nx.cycle_graph(3, create_using=nx.DiGraph())
- G.add_edge(0, 4)
- assert nx.clustering(G)[0] == 1 / 6
- class TestDirectedWeightedClustering:
- @classmethod
- def setup_class(cls):
- global np
- np = pytest.importorskip("numpy")
- def test_clustering(self):
- G = nx.DiGraph()
- assert list(nx.clustering(G, weight="weight").values()) == []
- assert nx.clustering(G) == {}
- def test_path(self):
- G = nx.path_graph(10, create_using=nx.DiGraph())
- assert list(nx.clustering(G, weight="weight").values()) == [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ]
- assert nx.clustering(G, weight="weight") == {
- 0: 0,
- 1: 0,
- 2: 0,
- 3: 0,
- 4: 0,
- 5: 0,
- 6: 0,
- 7: 0,
- 8: 0,
- 9: 0,
- }
- def test_k5(self):
- G = nx.complete_graph(5, create_using=nx.DiGraph())
- assert list(nx.clustering(G, weight="weight").values()) == [1, 1, 1, 1, 1]
- assert nx.average_clustering(G, weight="weight") == 1
- G.remove_edge(1, 2)
- assert list(nx.clustering(G, weight="weight").values()) == [
- 11 / 12,
- 1,
- 1,
- 11 / 12,
- 11 / 12,
- ]
- assert nx.clustering(G, [1, 4], weight="weight") == {1: 1, 4: 11 / 12}
- G.remove_edge(2, 1)
- assert list(nx.clustering(G, weight="weight").values()) == [
- 5 / 6,
- 1,
- 1,
- 5 / 6,
- 5 / 6,
- ]
- assert nx.clustering(G, [1, 4], weight="weight") == {
- 1: 1,
- 4: 0.83333333333333337,
- }
- def test_triangle_and_edge(self):
- G = nx.cycle_graph(3, create_using=nx.DiGraph())
- G.add_edge(0, 4, weight=2)
- assert nx.clustering(G)[0] == 1 / 6
-
- np.testing.assert_allclose(nx.clustering(G, weight="weight")[0], 1 / 12)
- np.testing.assert_allclose(nx.clustering(G, 0, weight="weight"), 1 / 12)
- class TestWeightedClustering:
- @classmethod
- def setup_class(cls):
- global np
- np = pytest.importorskip("numpy")
- def test_clustering(self):
- G = nx.Graph()
- assert list(nx.clustering(G, weight="weight").values()) == []
- assert nx.clustering(G) == {}
- def test_path(self):
- G = nx.path_graph(10)
- assert list(nx.clustering(G, weight="weight").values()) == [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ]
- assert nx.clustering(G, weight="weight") == {
- 0: 0,
- 1: 0,
- 2: 0,
- 3: 0,
- 4: 0,
- 5: 0,
- 6: 0,
- 7: 0,
- 8: 0,
- 9: 0,
- }
- def test_cubical(self):
- G = nx.cubical_graph()
- assert list(nx.clustering(G, weight="weight").values()) == [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ]
- assert nx.clustering(G, 1) == 0
- assert list(nx.clustering(G, [1, 2], weight="weight").values()) == [0, 0]
- assert nx.clustering(G, 1, weight="weight") == 0
- assert nx.clustering(G, [1, 2], weight="weight") == {1: 0, 2: 0}
- def test_k5(self):
- G = nx.complete_graph(5)
- assert list(nx.clustering(G, weight="weight").values()) == [1, 1, 1, 1, 1]
- assert nx.average_clustering(G, weight="weight") == 1
- G.remove_edge(1, 2)
- assert list(nx.clustering(G, weight="weight").values()) == [
- 5 / 6,
- 1,
- 1,
- 5 / 6,
- 5 / 6,
- ]
- assert nx.clustering(G, [1, 4], weight="weight") == {
- 1: 1,
- 4: 0.83333333333333337,
- }
- def test_triangle_and_edge(self):
- G = nx.cycle_graph(3)
- G.add_edge(0, 4, weight=2)
- assert nx.clustering(G)[0] == 1 / 3
- np.testing.assert_allclose(nx.clustering(G, weight="weight")[0], 1 / 6)
- np.testing.assert_allclose(nx.clustering(G, 0, weight="weight"), 1 / 6)
- def test_triangle_and_signed_edge(self):
- G = nx.cycle_graph(3)
- G.add_edge(0, 1, weight=-1)
- G.add_edge(3, 0, weight=0)
- assert nx.clustering(G)[0] == 1 / 3
- assert nx.clustering(G, weight="weight")[0] == -1 / 3
- class TestClustering:
- @classmethod
- def setup_class(cls):
- pytest.importorskip("numpy")
- def test_clustering(self):
- G = nx.Graph()
- assert list(nx.clustering(G).values()) == []
- assert nx.clustering(G) == {}
- def test_path(self):
- G = nx.path_graph(10)
- assert list(nx.clustering(G).values()) == [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ]
- assert nx.clustering(G) == {
- 0: 0,
- 1: 0,
- 2: 0,
- 3: 0,
- 4: 0,
- 5: 0,
- 6: 0,
- 7: 0,
- 8: 0,
- 9: 0,
- }
- def test_cubical(self):
- G = nx.cubical_graph()
- assert list(nx.clustering(G).values()) == [0, 0, 0, 0, 0, 0, 0, 0]
- assert nx.clustering(G, 1) == 0
- assert list(nx.clustering(G, [1, 2]).values()) == [0, 0]
- assert nx.clustering(G, 1) == 0
- assert nx.clustering(G, [1, 2]) == {1: 0, 2: 0}
- def test_k5(self):
- G = nx.complete_graph(5)
- assert list(nx.clustering(G).values()) == [1, 1, 1, 1, 1]
- assert nx.average_clustering(G) == 1
- G.remove_edge(1, 2)
- assert list(nx.clustering(G).values()) == [
- 5 / 6,
- 1,
- 1,
- 5 / 6,
- 5 / 6,
- ]
- assert nx.clustering(G, [1, 4]) == {1: 1, 4: 0.83333333333333337}
- def test_k5_signed(self):
- G = nx.complete_graph(5)
- assert list(nx.clustering(G).values()) == [1, 1, 1, 1, 1]
- assert nx.average_clustering(G) == 1
- G.remove_edge(1, 2)
- G.add_edge(0, 1, weight=-1)
- assert list(nx.clustering(G, weight="weight").values()) == [
- 1 / 6,
- -1 / 3,
- 1,
- 3 / 6,
- 3 / 6,
- ]
- class TestTransitivity:
- def test_transitivity(self):
- G = nx.Graph()
- assert nx.transitivity(G) == 0
- def test_path(self):
- G = nx.path_graph(10)
- assert nx.transitivity(G) == 0
- def test_cubical(self):
- G = nx.cubical_graph()
- assert nx.transitivity(G) == 0
- def test_k5(self):
- G = nx.complete_graph(5)
- assert nx.transitivity(G) == 1
- G.remove_edge(1, 2)
- assert nx.transitivity(G) == 0.875
- class TestSquareClustering:
- def test_clustering(self):
- G = nx.Graph()
- assert list(nx.square_clustering(G).values()) == []
- assert nx.square_clustering(G) == {}
- def test_path(self):
- G = nx.path_graph(10)
- assert list(nx.square_clustering(G).values()) == [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ]
- assert nx.square_clustering(G) == {
- 0: 0,
- 1: 0,
- 2: 0,
- 3: 0,
- 4: 0,
- 5: 0,
- 6: 0,
- 7: 0,
- 8: 0,
- 9: 0,
- }
- def test_cubical(self):
- G = nx.cubical_graph()
- assert list(nx.square_clustering(G).values()) == [
- 1 / 3,
- 1 / 3,
- 1 / 3,
- 1 / 3,
- 1 / 3,
- 1 / 3,
- 1 / 3,
- 1 / 3,
- ]
- assert list(nx.square_clustering(G, [1, 2]).values()) == [1 / 3, 1 / 3]
- assert nx.square_clustering(G, [1])[1] == 1 / 3
- assert nx.square_clustering(G, 1) == 1 / 3
- assert nx.square_clustering(G, [1, 2]) == {1: 1 / 3, 2: 1 / 3}
- def test_k5(self):
- G = nx.complete_graph(5)
- assert list(nx.square_clustering(G).values()) == [1, 1, 1, 1, 1]
- def test_bipartite_k5(self):
- G = nx.complete_bipartite_graph(5, 5)
- assert list(nx.square_clustering(G).values()) == [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
- def test_lind_square_clustering(self):
- """Test C4 for figure 1 Lind et al (2005)"""
- G = nx.Graph(
- [
- (1, 2),
- (1, 3),
- (1, 6),
- (1, 7),
- (2, 4),
- (2, 5),
- (3, 4),
- (3, 5),
- (6, 7),
- (7, 8),
- (6, 8),
- (7, 9),
- (7, 10),
- (6, 11),
- (6, 12),
- (2, 13),
- (2, 14),
- (3, 15),
- (3, 16),
- ]
- )
- G1 = G.subgraph([1, 2, 3, 4, 5, 13, 14, 15, 16])
- G2 = G.subgraph([1, 6, 7, 8, 9, 10, 11, 12])
- assert nx.square_clustering(G, [1])[1] == 3 / 43
- assert nx.square_clustering(G1, [1])[1] == 2 / 6
- assert nx.square_clustering(G2, [1])[1] == 1 / 5
- def test_peng_square_clustering(self):
- """Test eq2 for figure 1 Peng et al (2008)"""
- G = nx.Graph([(1, 2), (1, 3), (2, 4), (3, 4), (3, 5), (3, 6)])
- assert nx.square_clustering(G, [1])[1] == 1 / 3
- class TestAverageClustering:
- @classmethod
- def setup_class(cls):
- pytest.importorskip("numpy")
- def test_empty(self):
- G = nx.Graph()
- with pytest.raises(ZeroDivisionError):
- nx.average_clustering(G)
- def test_average_clustering(self):
- G = nx.cycle_graph(3)
- G.add_edge(2, 3)
- assert nx.average_clustering(G) == (1 + 1 + 1 / 3) / 4
- assert nx.average_clustering(G, count_zeros=True) == (1 + 1 + 1 / 3) / 4
- assert nx.average_clustering(G, count_zeros=False) == (1 + 1 + 1 / 3) / 3
- assert nx.average_clustering(G, [1, 2, 3]) == (1 + 1 / 3) / 3
- assert nx.average_clustering(G, [1, 2, 3], count_zeros=True) == (1 + 1 / 3) / 3
- assert nx.average_clustering(G, [1, 2, 3], count_zeros=False) == (1 + 1 / 3) / 2
- def test_average_clustering_signed(self):
- G = nx.cycle_graph(3)
- G.add_edge(2, 3)
- G.add_edge(0, 1, weight=-1)
- assert nx.average_clustering(G, weight="weight") == (-1 - 1 - 1 / 3) / 4
- assert (
- nx.average_clustering(G, weight="weight", count_zeros=True)
- == (-1 - 1 - 1 / 3) / 4
- )
- assert (
- nx.average_clustering(G, weight="weight", count_zeros=False)
- == (-1 - 1 - 1 / 3) / 3
- )
- class TestDirectedAverageClustering:
- @classmethod
- def setup_class(cls):
- pytest.importorskip("numpy")
- def test_empty(self):
- G = nx.DiGraph()
- with pytest.raises(ZeroDivisionError):
- nx.average_clustering(G)
- def test_average_clustering(self):
- G = nx.cycle_graph(3, create_using=nx.DiGraph())
- G.add_edge(2, 3)
- assert nx.average_clustering(G) == (1 + 1 + 1 / 3) / 8
- assert nx.average_clustering(G, count_zeros=True) == (1 + 1 + 1 / 3) / 8
- assert nx.average_clustering(G, count_zeros=False) == (1 + 1 + 1 / 3) / 6
- assert nx.average_clustering(G, [1, 2, 3]) == (1 + 1 / 3) / 6
- assert nx.average_clustering(G, [1, 2, 3], count_zeros=True) == (1 + 1 / 3) / 6
- assert nx.average_clustering(G, [1, 2, 3], count_zeros=False) == (1 + 1 / 3) / 4
- class TestGeneralizedDegree:
- def test_generalized_degree(self):
- G = nx.Graph()
- assert nx.generalized_degree(G) == {}
- def test_path(self):
- G = nx.path_graph(5)
- assert nx.generalized_degree(G, 0) == {0: 1}
- assert nx.generalized_degree(G, 1) == {0: 2}
- def test_cubical(self):
- G = nx.cubical_graph()
- assert nx.generalized_degree(G, 0) == {0: 3}
- def test_k5(self):
- G = nx.complete_graph(5)
- assert nx.generalized_degree(G, 0) == {3: 4}
- G.remove_edge(0, 1)
- assert nx.generalized_degree(G, 0) == {2: 3}
- assert nx.generalized_degree(G, [1, 2]) == {1: {2: 3}, 2: {2: 2, 3: 2}}
- assert nx.generalized_degree(G) == {
- 0: {2: 3},
- 1: {2: 3},
- 2: {2: 2, 3: 2},
- 3: {2: 2, 3: 2},
- 4: {2: 2, 3: 2},
- }
|