116 lines
3.1 KiB
Python
116 lines
3.1 KiB
Python
|
# test_clique.py - unit tests for the approximation.clique module
|
||
|
#
|
||
|
# Copyright 2015 NetworkX developers.
|
||
|
#
|
||
|
# This file is part of NetworkX.
|
||
|
#
|
||
|
# NetworkX is distributed under a BSD license; see LICENSE.txt for more
|
||
|
# information.
|
||
|
"""Unit tests for the :mod:`networkx.algorithms.approximation.clique`
|
||
|
module.
|
||
|
|
||
|
"""
|
||
|
|
||
|
|
||
|
import networkx as nx
|
||
|
from networkx.algorithms.approximation import max_clique
|
||
|
from networkx.algorithms.approximation import clique_removal
|
||
|
from networkx.algorithms.approximation import large_clique_size
|
||
|
|
||
|
|
||
|
def is_independent_set(G, nodes):
|
||
|
"""Returns True if and only if `nodes` is a clique in `G`.
|
||
|
|
||
|
`G` is a NetworkX graph. `nodes` is an iterable of nodes in
|
||
|
`G`.
|
||
|
|
||
|
"""
|
||
|
return G.subgraph(nodes).number_of_edges() == 0
|
||
|
|
||
|
|
||
|
def is_clique(G, nodes):
|
||
|
"""Returns True if and only if `nodes` is an independent set
|
||
|
in `G`.
|
||
|
|
||
|
`G` is an undirected simple graph. `nodes` is an iterable of
|
||
|
nodes in `G`.
|
||
|
|
||
|
"""
|
||
|
H = G.subgraph(nodes)
|
||
|
n = len(H)
|
||
|
return H.number_of_edges() == n * (n - 1) // 2
|
||
|
|
||
|
|
||
|
class TestCliqueRemoval(object):
|
||
|
"""Unit tests for the
|
||
|
:func:`~networkx.algorithms.approximation.clique_removal` function.
|
||
|
|
||
|
"""
|
||
|
|
||
|
def test_trivial_graph(self):
|
||
|
G = nx.trivial_graph()
|
||
|
independent_set, cliques = clique_removal(G)
|
||
|
assert is_independent_set(G, independent_set)
|
||
|
assert all(is_clique(G, clique) for clique in cliques)
|
||
|
# In fact, we should only have 1-cliques, that is, singleton nodes.
|
||
|
assert all(len(clique) == 1 for clique in cliques)
|
||
|
|
||
|
def test_complete_graph(self):
|
||
|
G = nx.complete_graph(10)
|
||
|
independent_set, cliques = clique_removal(G)
|
||
|
assert is_independent_set(G, independent_set)
|
||
|
assert all(is_clique(G, clique) for clique in cliques)
|
||
|
|
||
|
def test_barbell_graph(self):
|
||
|
G = nx.barbell_graph(10, 5)
|
||
|
independent_set, cliques = clique_removal(G)
|
||
|
assert is_independent_set(G, independent_set)
|
||
|
assert all(is_clique(G, clique) for clique in cliques)
|
||
|
|
||
|
|
||
|
class TestMaxClique(object):
|
||
|
"""Unit tests for the :func:`networkx.algorithms.approximation.max_clique`
|
||
|
function.
|
||
|
|
||
|
"""
|
||
|
|
||
|
def test_null_graph(self):
|
||
|
G = nx.null_graph()
|
||
|
assert len(max_clique(G)) == 0
|
||
|
|
||
|
def test_complete_graph(self):
|
||
|
graph = nx.complete_graph(30)
|
||
|
# this should return the entire graph
|
||
|
mc = max_clique(graph)
|
||
|
assert 30 == len(mc)
|
||
|
|
||
|
def test_maximal_by_cardinality(self):
|
||
|
"""Tests that the maximal clique is computed according to maximum
|
||
|
cardinality of the sets.
|
||
|
|
||
|
For more information, see pull request #1531.
|
||
|
|
||
|
"""
|
||
|
G = nx.complete_graph(5)
|
||
|
G.add_edge(4, 5)
|
||
|
clique = max_clique(G)
|
||
|
assert len(clique) > 1
|
||
|
|
||
|
G = nx.lollipop_graph(30, 2)
|
||
|
clique = max_clique(G)
|
||
|
assert len(clique) > 2
|
||
|
|
||
|
|
||
|
def test_large_clique_size():
|
||
|
G = nx.complete_graph(9)
|
||
|
nx.add_cycle(G, [9, 10, 11])
|
||
|
G.add_edge(8, 9)
|
||
|
G.add_edge(1, 12)
|
||
|
G.add_node(13)
|
||
|
|
||
|
assert large_clique_size(G) == 9
|
||
|
G.remove_node(5)
|
||
|
assert large_clique_size(G) == 8
|
||
|
G.remove_edge(2, 3)
|
||
|
assert large_clique_size(G) == 7
|