393 lines
13 KiB
Python
393 lines
13 KiB
Python
import pytest
|
|
import networkx as nx
|
|
from networkx.testing import assert_edges_equal
|
|
|
|
|
|
def test_tensor_product_raises():
|
|
with pytest.raises(nx.NetworkXError):
|
|
P = nx.tensor_product(nx.DiGraph(), nx.Graph())
|
|
|
|
|
|
def test_tensor_product_null():
|
|
null = nx.null_graph()
|
|
empty10 = nx.empty_graph(10)
|
|
K3 = nx.complete_graph(3)
|
|
K10 = nx.complete_graph(10)
|
|
P3 = nx.path_graph(3)
|
|
P10 = nx.path_graph(10)
|
|
# null graph
|
|
G = nx.tensor_product(null, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
# null_graph X anything = null_graph and v.v.
|
|
G = nx.tensor_product(null, empty10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.tensor_product(null, K3)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.tensor_product(null, K10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.tensor_product(null, P3)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.tensor_product(null, P10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.tensor_product(empty10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.tensor_product(K3, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.tensor_product(K10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.tensor_product(P3, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.tensor_product(P10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
|
|
|
|
def test_tensor_product_size():
|
|
P5 = nx.path_graph(5)
|
|
K3 = nx.complete_graph(3)
|
|
K5 = nx.complete_graph(5)
|
|
|
|
G = nx.tensor_product(P5, K3)
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.tensor_product(K3, K5)
|
|
assert nx.number_of_nodes(G) == 3 * 5
|
|
|
|
|
|
def test_tensor_product_combinations():
|
|
# basic smoke test, more realistic tests would be useful
|
|
P5 = nx.path_graph(5)
|
|
K3 = nx.complete_graph(3)
|
|
G = nx.tensor_product(P5, K3)
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.tensor_product(P5, nx.MultiGraph(K3))
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.tensor_product(nx.MultiGraph(P5), K3)
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.tensor_product(nx.MultiGraph(P5), nx.MultiGraph(K3))
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
|
|
G = nx.tensor_product(nx.DiGraph(P5), nx.DiGraph(K3))
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
|
|
|
|
def test_tensor_product_classic_result():
|
|
K2 = nx.complete_graph(2)
|
|
G = nx.petersen_graph()
|
|
G = nx.tensor_product(G, K2)
|
|
assert nx.is_isomorphic(G, nx.desargues_graph())
|
|
|
|
G = nx.cycle_graph(5)
|
|
G = nx.tensor_product(G, K2)
|
|
assert nx.is_isomorphic(G, nx.cycle_graph(10))
|
|
|
|
G = nx.tetrahedral_graph()
|
|
G = nx.tensor_product(G, K2)
|
|
assert nx.is_isomorphic(G, nx.cubical_graph())
|
|
|
|
|
|
def test_tensor_product_random():
|
|
G = nx.erdos_renyi_graph(10, 2 / 10.)
|
|
H = nx.erdos_renyi_graph(10, 2 / 10.)
|
|
GH = nx.tensor_product(G, H)
|
|
|
|
for (u_G, u_H) in GH.nodes():
|
|
for (v_G, v_H) in GH.nodes():
|
|
if H.has_edge(u_H, v_H) and G.has_edge(u_G, v_G):
|
|
assert GH.has_edge((u_G, u_H), (v_G, v_H))
|
|
else:
|
|
assert not GH.has_edge((u_G, u_H), (v_G, v_H))
|
|
|
|
|
|
def test_cartesian_product_multigraph():
|
|
G = nx.MultiGraph()
|
|
G.add_edge(1, 2, key=0)
|
|
G.add_edge(1, 2, key=1)
|
|
H = nx.MultiGraph()
|
|
H.add_edge(3, 4, key=0)
|
|
H.add_edge(3, 4, key=1)
|
|
GH = nx.cartesian_product(G, H)
|
|
assert set(GH) == {(1, 3), (2, 3), (2, 4), (1, 4)}
|
|
assert ({(frozenset([u, v]), k) for u, v, k in GH.edges(keys=True)} ==
|
|
{(frozenset([u, v]), k) for u, v, k in
|
|
[((1, 3), (2, 3), 0), ((1, 3), (2, 3), 1),
|
|
((1, 3), (1, 4), 0), ((1, 3), (1, 4), 1),
|
|
((2, 3), (2, 4), 0), ((2, 3), (2, 4), 1),
|
|
((2, 4), (1, 4), 0), ((2, 4), (1, 4), 1)]})
|
|
|
|
|
|
def test_cartesian_product_raises():
|
|
with pytest.raises(nx.NetworkXError):
|
|
P = nx.cartesian_product(nx.DiGraph(), nx.Graph())
|
|
|
|
|
|
def test_cartesian_product_null():
|
|
null = nx.null_graph()
|
|
empty10 = nx.empty_graph(10)
|
|
K3 = nx.complete_graph(3)
|
|
K10 = nx.complete_graph(10)
|
|
P3 = nx.path_graph(3)
|
|
P10 = nx.path_graph(10)
|
|
# null graph
|
|
G = nx.cartesian_product(null, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
# null_graph X anything = null_graph and v.v.
|
|
G = nx.cartesian_product(null, empty10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.cartesian_product(null, K3)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.cartesian_product(null, K10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.cartesian_product(null, P3)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.cartesian_product(null, P10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.cartesian_product(empty10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.cartesian_product(K3, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.cartesian_product(K10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.cartesian_product(P3, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.cartesian_product(P10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
|
|
|
|
def test_cartesian_product_size():
|
|
# order(GXH)=order(G)*order(H)
|
|
K5 = nx.complete_graph(5)
|
|
P5 = nx.path_graph(5)
|
|
K3 = nx.complete_graph(3)
|
|
G = nx.cartesian_product(P5, K3)
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
assert (nx.number_of_edges(G) ==
|
|
nx.number_of_edges(P5) * nx.number_of_nodes(K3) +
|
|
nx.number_of_edges(K3) * nx.number_of_nodes(P5))
|
|
G = nx.cartesian_product(K3, K5)
|
|
assert nx.number_of_nodes(G) == 3 * 5
|
|
assert (nx.number_of_edges(G) ==
|
|
nx.number_of_edges(K5) * nx.number_of_nodes(K3) +
|
|
nx.number_of_edges(K3) * nx.number_of_nodes(K5))
|
|
|
|
|
|
def test_cartesian_product_classic():
|
|
# test some classic product graphs
|
|
P2 = nx.path_graph(2)
|
|
P3 = nx.path_graph(3)
|
|
# cube = 2-path X 2-path
|
|
G = nx.cartesian_product(P2, P2)
|
|
G = nx.cartesian_product(P2, G)
|
|
assert nx.is_isomorphic(G, nx.cubical_graph())
|
|
|
|
# 3x3 grid
|
|
G = nx.cartesian_product(P3, P3)
|
|
assert nx.is_isomorphic(G, nx.grid_2d_graph(3, 3))
|
|
|
|
|
|
def test_cartesian_product_random():
|
|
G = nx.erdos_renyi_graph(10, 2 / 10.)
|
|
H = nx.erdos_renyi_graph(10, 2 / 10.)
|
|
GH = nx.cartesian_product(G, H)
|
|
|
|
for (u_G, u_H) in GH.nodes():
|
|
for (v_G, v_H) in GH.nodes():
|
|
if (u_G == v_G and H.has_edge(u_H, v_H)) or \
|
|
(u_H == v_H and G.has_edge(u_G, v_G)):
|
|
assert GH.has_edge((u_G, u_H), (v_G, v_H))
|
|
else:
|
|
assert not GH.has_edge((u_G, u_H), (v_G, v_H))
|
|
|
|
|
|
def test_lexicographic_product_raises():
|
|
with pytest.raises(nx.NetworkXError):
|
|
P = nx.lexicographic_product(nx.DiGraph(), nx.Graph())
|
|
|
|
|
|
def test_lexicographic_product_null():
|
|
null = nx.null_graph()
|
|
empty10 = nx.empty_graph(10)
|
|
K3 = nx.complete_graph(3)
|
|
K10 = nx.complete_graph(10)
|
|
P3 = nx.path_graph(3)
|
|
P10 = nx.path_graph(10)
|
|
# null graph
|
|
G = nx.lexicographic_product(null, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
# null_graph X anything = null_graph and v.v.
|
|
G = nx.lexicographic_product(null, empty10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.lexicographic_product(null, K3)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.lexicographic_product(null, K10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.lexicographic_product(null, P3)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.lexicographic_product(null, P10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.lexicographic_product(empty10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.lexicographic_product(K3, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.lexicographic_product(K10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.lexicographic_product(P3, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.lexicographic_product(P10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
|
|
|
|
def test_lexicographic_product_size():
|
|
K5 = nx.complete_graph(5)
|
|
P5 = nx.path_graph(5)
|
|
K3 = nx.complete_graph(3)
|
|
G = nx.lexicographic_product(P5, K3)
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.lexicographic_product(K3, K5)
|
|
assert nx.number_of_nodes(G) == 3 * 5
|
|
|
|
|
|
def test_lexicographic_product_combinations():
|
|
P5 = nx.path_graph(5)
|
|
K3 = nx.complete_graph(3)
|
|
G = nx.lexicographic_product(P5, K3)
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.lexicographic_product(nx.MultiGraph(P5), K3)
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.lexicographic_product(P5, nx.MultiGraph(K3))
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.lexicographic_product(nx.MultiGraph(P5), nx.MultiGraph(K3))
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
|
|
# No classic easily found classic results for lexicographic product
|
|
|
|
|
|
def test_lexicographic_product_random():
|
|
G = nx.erdos_renyi_graph(10, 2 / 10.)
|
|
H = nx.erdos_renyi_graph(10, 2 / 10.)
|
|
GH = nx.lexicographic_product(G, H)
|
|
|
|
for (u_G, u_H) in GH.nodes():
|
|
for (v_G, v_H) in GH.nodes():
|
|
if G.has_edge(u_G, v_G) or (u_G == v_G and H.has_edge(u_H, v_H)):
|
|
assert GH.has_edge((u_G, u_H), (v_G, v_H))
|
|
else:
|
|
assert not GH.has_edge((u_G, u_H), (v_G, v_H))
|
|
|
|
|
|
def test_strong_product_raises():
|
|
with pytest.raises(nx.NetworkXError):
|
|
P = nx.strong_product(nx.DiGraph(), nx.Graph())
|
|
|
|
|
|
def test_strong_product_null():
|
|
null = nx.null_graph()
|
|
empty10 = nx.empty_graph(10)
|
|
K3 = nx.complete_graph(3)
|
|
K10 = nx.complete_graph(10)
|
|
P3 = nx.path_graph(3)
|
|
P10 = nx.path_graph(10)
|
|
# null graph
|
|
G = nx.strong_product(null, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
# null_graph X anything = null_graph and v.v.
|
|
G = nx.strong_product(null, empty10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.strong_product(null, K3)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.strong_product(null, K10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.strong_product(null, P3)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.strong_product(null, P10)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.strong_product(empty10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.strong_product(K3, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.strong_product(K10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.strong_product(P3, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
G = nx.strong_product(P10, null)
|
|
assert nx.is_isomorphic(G, null)
|
|
|
|
|
|
def test_strong_product_size():
|
|
K5 = nx.complete_graph(5)
|
|
P5 = nx.path_graph(5)
|
|
K3 = nx.complete_graph(3)
|
|
G = nx.strong_product(P5, K3)
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.strong_product(K3, K5)
|
|
assert nx.number_of_nodes(G) == 3 * 5
|
|
|
|
|
|
def test_strong_product_combinations():
|
|
P5 = nx.path_graph(5)
|
|
K3 = nx.complete_graph(3)
|
|
G = nx.strong_product(P5, K3)
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.strong_product(nx.MultiGraph(P5), K3)
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.strong_product(P5, nx.MultiGraph(K3))
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
G = nx.strong_product(nx.MultiGraph(P5), nx.MultiGraph(K3))
|
|
assert nx.number_of_nodes(G) == 5 * 3
|
|
|
|
# No classic easily found classic results for strong product
|
|
|
|
|
|
def test_strong_product_random():
|
|
G = nx.erdos_renyi_graph(10, 2 / 10.)
|
|
H = nx.erdos_renyi_graph(10, 2 / 10.)
|
|
GH = nx.strong_product(G, H)
|
|
|
|
for (u_G, u_H) in GH.nodes():
|
|
for (v_G, v_H) in GH.nodes():
|
|
if (u_G == v_G and H.has_edge(u_H, v_H)) or \
|
|
(u_H == v_H and G.has_edge(u_G, v_G)) or \
|
|
(G.has_edge(u_G, v_G) and H.has_edge(u_H, v_H)):
|
|
assert GH.has_edge((u_G, u_H), (v_G, v_H))
|
|
else:
|
|
assert not GH.has_edge((u_G, u_H), (v_G, v_H))
|
|
|
|
|
|
def test_graph_power_raises():
|
|
with pytest.raises(nx.NetworkXNotImplemented):
|
|
nx.power(nx.MultiDiGraph(), 2)
|
|
|
|
|
|
def test_graph_power():
|
|
# wikipedia example for graph power
|
|
G = nx.cycle_graph(7)
|
|
G.add_edge(6, 7)
|
|
G.add_edge(7, 8)
|
|
G.add_edge(8, 9)
|
|
G.add_edge(9, 2)
|
|
H = nx.power(G, 2)
|
|
|
|
assert_edges_equal(list(H.edges()),
|
|
[(0, 1), (0, 2), (0, 5), (0, 6), (0, 7), (1, 9),
|
|
(1, 2), (1, 3), (1, 6), (2, 3), (2, 4), (2, 8),
|
|
(2, 9), (3, 4), (3, 5), (3, 9), (4, 5), (4, 6),
|
|
(5, 6), (5, 7), (6, 7), (6, 8), (7, 8), (7, 9),
|
|
(8, 9)])
|
|
|
|
|
|
def test_graph_power_negative():
|
|
with pytest.raises(ValueError):
|
|
nx.power(nx.Graph(), -1)
|
|
|
|
|
|
def test_rooted_product_raises():
|
|
with pytest.raises(nx.NetworkXError):
|
|
nx.rooted_product(nx.Graph(), nx.path_graph(2), 10)
|
|
|
|
|
|
def test_rooted_product():
|
|
G = nx.cycle_graph(5)
|
|
H = nx.Graph()
|
|
H.add_edges_from([('a', 'b'), ('b', 'c'), ('b', 'd')])
|
|
R = nx.rooted_product(G, H, 'a')
|
|
assert len(R) == len(G) * len(H)
|
|
assert R.size() == G.size() + len(G) * H.size()
|