66 lines
2.0 KiB
Python
66 lines
2.0 KiB
Python
from itertools import combinations
|
|
|
|
import pytest
|
|
|
|
import networkx as nx
|
|
from networkx.algorithms.community import k_clique_communities
|
|
|
|
|
|
def test_overlapping_K5():
|
|
G = nx.Graph()
|
|
G.add_edges_from(combinations(range(5), 2)) # Add a five clique
|
|
G.add_edges_from(combinations(range(2, 7), 2)) # Add another five clique
|
|
c = list(k_clique_communities(G, 4))
|
|
assert c == [frozenset(range(7))]
|
|
c = set(k_clique_communities(G, 5))
|
|
assert c == {frozenset(range(5)), frozenset(range(2, 7))}
|
|
|
|
|
|
def test_isolated_K5():
|
|
G = nx.Graph()
|
|
G.add_edges_from(combinations(range(0, 5), 2)) # Add a five clique
|
|
G.add_edges_from(combinations(range(5, 10), 2)) # Add another five clique
|
|
c = set(k_clique_communities(G, 5))
|
|
assert c == {frozenset(range(5)), frozenset(range(5, 10))}
|
|
|
|
|
|
class TestZacharyKarateClub(object):
|
|
|
|
def setup(self):
|
|
self.G = nx.karate_club_graph()
|
|
|
|
def _check_communities(self, k, expected):
|
|
communities = set(k_clique_communities(self.G, k))
|
|
assert communities == expected
|
|
|
|
def test_k2(self):
|
|
# clique percolation with k=2 is just connected components
|
|
expected = {frozenset(self.G)}
|
|
self._check_communities(2, expected)
|
|
|
|
def test_k3(self):
|
|
comm1 = [0, 1, 2, 3, 7, 8, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23,
|
|
26, 27, 28, 29, 30, 31, 32, 33]
|
|
comm2 = [0, 4, 5, 6, 10, 16]
|
|
comm3 = [24, 25, 31]
|
|
expected = {frozenset(comm1), frozenset(comm2), frozenset(comm3)}
|
|
self._check_communities(3, expected)
|
|
|
|
def test_k4(self):
|
|
expected = {frozenset([0, 1, 2, 3, 7, 13]), frozenset([8, 32, 30, 33]),
|
|
frozenset([32, 33, 29, 23])}
|
|
self._check_communities(4, expected)
|
|
|
|
def test_k5(self):
|
|
expected = {frozenset([0, 1, 2, 3, 7, 13])}
|
|
self._check_communities(5, expected)
|
|
|
|
def test_k6(self):
|
|
expected = set()
|
|
self._check_communities(6, expected)
|
|
|
|
|
|
def test_bad_k():
|
|
with pytest.raises(nx.NetworkXError):
|
|
list(k_clique_communities(nx.Graph(), 1))
|