Repository URL to install this package:
|
Version:
2.1 ▾
|
from nose.tools import assert_in, assert_not_in, assert_equal
from nose.tools import assert_is, assert_is_not
from nose.tools import assert_raises, assert_true, assert_false
import networkx as nx
from networkx.testing import assert_edges_equal, assert_nodes_equal
# Note: SubGraph views are not tested here. They have their own testing file
class TestReverseView(object):
def setup(self):
self.G = nx.path_graph(9, create_using=nx.DiGraph())
self.rv = nx.reverse_view(self.G)
def test_pickle(self):
import pickle
rv = self.rv
prv = pickle.loads(pickle.dumps(rv, -1))
assert_equal(rv._node, prv._node)
assert_equal(rv._adj, prv._adj)
assert_equal(rv.graph, prv.graph)
def test_contains(self):
assert_in((2, 3), self.G.edges)
assert_not_in((3, 2), self.G.edges)
assert_not_in((2, 3), self.rv.edges)
assert_in((3, 2), self.rv.edges)
def test_iter(self):
expected = sorted(tuple(reversed(e)) for e in self.G.edges)
assert_equal(sorted(self.rv.edges), expected)
def test_exceptions(self):
nxg = nx.graphviews
assert_raises(nx.NetworkXNotImplemented, nxg.ReverseView, nx.Graph())
class TestMultiReverseView(object):
def setup(self):
self.G = nx.path_graph(9, create_using=nx.MultiDiGraph())
self.G.add_edge(4, 5)
self.rv = nx.reverse_view(self.G)
def test_pickle(self):
import pickle
rv = self.rv
prv = pickle.loads(pickle.dumps(rv, -1))
assert_equal(rv._node, prv._node)
assert_equal(rv._adj, prv._adj)
assert_equal(rv.graph, prv.graph)
def test_contains(self):
assert_in((2, 3, 0), self.G.edges)
assert_not_in((3, 2, 0), self.G.edges)
assert_not_in((2, 3, 0), self.rv.edges)
assert_in((3, 2, 0), self.rv.edges)
assert_in((5, 4, 1), self.rv.edges)
assert_not_in((4, 5, 1), self.rv.edges)
def test_iter(self):
expected = sorted((v, u, k) for u, v, k in self.G.edges)
assert_equal(sorted(self.rv.edges), expected)
def test_exceptions(self):
nxg = nx.graphviews
MG = nx.MultiGraph(self.G)
assert_raises(nx.NetworkXNotImplemented, nxg.MultiReverseView, MG)
class TestToDirected(object):
def setup(self):
self.G = nx.path_graph(9)
self.dv = nx.to_directed(self.G)
self.MG = nx.path_graph(9, create_using=nx.MultiGraph())
self.Mdv = nx.to_directed(self.MG)
def test_directed(self):
assert_false(self.G.is_directed())
assert_true(self.dv.is_directed())
def test_already_directed(self):
dd = nx.to_directed(self.dv)
Mdd = nx.to_directed(self.Mdv)
assert_edges_equal(dd.edges, self.dv.edges)
assert_edges_equal(Mdd.edges, self.Mdv.edges)
def test_pickle(self):
import pickle
dv = self.dv
pdv = pickle.loads(pickle.dumps(dv, -1))
assert_equal(dv._node, pdv._node)
assert_equal(dv._succ, pdv._succ)
assert_equal(dv._pred, pdv._pred)
assert_equal(dv.graph, pdv.graph)
def test_contains(self):
assert_in((2, 3), self.G.edges)
assert_in((3, 2), self.G.edges)
assert_in((2, 3), self.dv.edges)
assert_in((3, 2), self.dv.edges)
def test_iter(self):
revd = [tuple(reversed(e)) for e in self.G.edges]
expected = sorted(list(self.G.edges) + revd)
assert_equal(sorted(self.dv.edges), expected)
def test_exceptions(self):
nxg = nx.graphviews
assert_raises(nx.NetworkXError, nxg.DiGraphView, self.MG)
assert_raises(nx.NetworkXError, nxg.MultiDiGraphView, self.G)
class TestToUndirected(object):
def setup(self):
self.DG = nx.path_graph(9, create_using=nx.DiGraph())
self.uv = nx.to_undirected(self.DG)
self.MDG = nx.path_graph(9, create_using=nx.MultiDiGraph())
self.Muv = nx.to_undirected(self.MDG)
def test_directed(self):
assert_true(self.DG.is_directed())
assert_false(self.uv.is_directed())
def test_already_directed(self):
uu = nx.to_undirected(self.uv)
Muu = nx.to_undirected(self.Muv)
assert_edges_equal(uu.edges, self.uv.edges)
assert_edges_equal(Muu.edges, self.Muv.edges)
def test_pickle(self):
import pickle
uv = self.uv
puv = pickle.loads(pickle.dumps(uv, -1))
assert_equal(uv._node, puv._node)
assert_equal(uv._adj, puv._adj)
assert_equal(uv.graph, puv.graph)
assert_true(hasattr(uv, '_graph'))
def test_contains(self):
assert_in((2, 3), self.DG.edges)
assert_not_in((3, 2), self.DG.edges)
assert_in((2, 3), self.uv.edges)
assert_in((3, 2), self.uv.edges)
def test_iter(self):
expected = sorted(self.DG.edges)
assert_equal(sorted(self.uv.edges), expected)
def test_exceptions(self):
nxg = nx.graphviews
assert_raises(nx.NetworkXError, nxg.GraphView, self.MDG)
assert_raises(nx.NetworkXError, nxg.MultiGraphView, self.DG)
class TestChainsOfViews(object):
def setUp(self):
self.G = nx.path_graph(9)
self.DG = nx.path_graph(9, create_using=nx.DiGraph())
self.MG = nx.path_graph(9, create_using=nx.MultiGraph())
self.MDG = nx.path_graph(9, create_using=nx.MultiDiGraph())
self.Gv = nx.to_undirected(self.DG)
self.DGv = nx.to_directed(self.G)
self.MGv = nx.to_undirected(self.MDG)
self.MDGv = nx.to_directed(self.MG)
self.Rv = self.DG.reverse()
self.MRv = self.MDG.reverse()
self.graphs = [self.G, self.DG, self.MG, self.MDG,
self.Gv, self.DGv, self.MGv, self.MDGv,
self.Rv, self.MRv]
for G in self.graphs:
G.edges, G.nodes, G.degree
def test_pickle(self):
import pickle
for G in self.graphs:
H = pickle.loads(pickle.dumps(G, -1))
assert_edges_equal(H.edges, G.edges)
assert_nodes_equal(H.nodes, G.nodes)
def test_subgraph_of_subgraph(self):
SGv = nx.subgraph(self.G, range(3, 7))
SDGv = nx.subgraph(self.DG, range(3, 7))
SMGv = nx.subgraph(self.MG, range(3, 7))
SMDGv = nx.subgraph(self.MDG, range(3, 7))
for G in self.graphs + [SGv, SDGv, SMGv, SMDGv]:
SG = nx.induced_subgraph(G, [4, 5, 6])
assert_equal(list(SG), [4, 5, 6])
SSG = SG.subgraph([6, 7])
assert_equal(list(SSG), [6])
# subgraph-subgraph chain is short-cut in base class method
assert_is(SSG._graph, G)
def test_restricted_induced_subgraph_chains(self):
""" Test subgraph chains that both restrict and show nodes/edges.
A restricted_view subgraph should allow induced subgraphs using
G.subgraph that automagically without a chain (meaning the result
is a subgraph view of the original graph not a subgraph-of-subgraph.
"""
hide_nodes = [3, 4, 5]
hide_edges = [(6, 7)]
RG = nx.restricted_view(self.G, hide_nodes, hide_edges)
nodes = [4, 5, 6, 7, 8]
SG = nx.induced_subgraph(RG, nodes)
SSG = RG.subgraph(nodes)
assert_is(SSG.root_graph, SSG._graph)
assert_is_not(SG.root_graph, SG._graph)
assert_edges_equal(SG.edges, SSG.edges)
# should be same as morphing the graph
CG = self.G.copy()
CG.remove_nodes_from(hide_nodes)
CG.remove_edges_from(hide_edges)
assert_edges_equal(CG.edges(nodes), SSG.edges)
CG.remove_nodes_from([0, 1, 2, 3])
assert_edges_equal(CG.edges, SSG.edges)
# switch order: subgraph first, then restricted view
SSSG = self.G.subgraph(nodes)
RSG = nx.restricted_view(SSSG, hide_nodes, hide_edges)
assert_is_not(RSG.root_graph, RSG._graph)
assert_edges_equal(RSG.edges, CG.edges)
def test_subgraph_todirected(self):
SG = nx.induced_subgraph(self.G, [4, 5, 6])
SSG = SG.to_directed()
assert_equal(sorted(SSG), [4, 5, 6])
assert_equal(sorted(SSG.edges), [(4, 5), (5, 4), (5, 6), (6, 5)])
def test_subgraph_toundirected(self):
SG = nx.induced_subgraph(self.G, [4, 5, 6])
SSG = SG.to_undirected()
assert_equal(list(SSG), [4, 5, 6])
assert_equal(sorted(SSG.edges), [(4, 5), (5, 6)])
def test_reverse_subgraph_toundirected(self):
G = self.DG.reverse(copy=False)
SG = G.subgraph([4, 5, 6])
SSG = SG.to_undirected()
assert_equal(list(SSG), [4, 5, 6])
assert_equal(sorted(SSG.edges), [(4, 5), (5, 6)])
def test_reverse_reverse_copy(self):
G = self.DG.reverse(copy=False)
H = G.reverse(copy=True)
assert_equal(H.nodes, self.DG.nodes)
assert_equal(H.edges, self.DG.edges)
G = self.MDG.reverse(copy=False)
H = G.reverse(copy=True)
assert_equal(H.nodes, self.MDG.nodes)
assert_equal(H.edges, self.MDG.edges)
def test_subgraph_edgesubgraph_toundirected(self):
G = self.G.copy()
SG = G.subgraph([4, 5, 6])
SSG = SG.edge_subgraph([(4, 5), (5, 4)])
USSG = SSG.to_undirected()
assert_equal(list(USSG), [4, 5])
assert_equal(sorted(USSG.edges), [(4, 5)])
def test_copy_subgraph(self):
G = self.G.copy()
SG = G.subgraph([4, 5, 6])
CSG = SG.copy(as_view=True)
DCSG = SG.copy(as_view=False)
assert_equal(CSG.__class__.__name__, 'GraphView')
assert_equal(DCSG.__class__.__name__, 'Graph')
def test_copy_disubgraph(self):
G = self.DG.copy()
SG = G.subgraph([4, 5, 6])
CSG = SG.copy(as_view=True)
DCSG = SG.copy(as_view=False)
assert_equal(CSG.__class__.__name__, 'DiGraphView')
assert_equal(DCSG.__class__.__name__, 'DiGraph')
def test_copy_multidisubgraph(self):
G = self.MDG.copy()
SG = G.subgraph([4, 5, 6])
CSG = SG.copy(as_view=True)
DCSG = SG.copy(as_view=False)
assert_equal(CSG.__class__.__name__, 'MultiDiGraphView')
assert_equal(DCSG.__class__.__name__, 'MultiDiGraph')
def test_copy_multisubgraph(self):
G = self.MGv.copy()
SG = G.subgraph([4, 5, 6])
CSG = SG.copy(as_view=True)
DCSG = SG.copy(as_view=False)
assert_equal(CSG.__class__.__name__, 'MultiGraphView')
assert_equal(DCSG.__class__.__name__, 'MultiGraph')