summaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py')
-rw-r--r--lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py217
1 files changed, 217 insertions, 0 deletions
diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py
new file mode 100644
index 0000000..562d396
--- /dev/null
+++ b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py
@@ -0,0 +1,217 @@
+"""
+ Tests for VF2 isomorphism algorithm.
+"""
+
+import os
+import struct
+import random
+
+from nose.tools import assert_true, assert_equal
+import networkx as nx
+from networkx.algorithms import isomorphism as iso
+
+class TestWikipediaExample(object):
+ # Source: http://en.wikipedia.org/wiki/Graph_isomorphism
+
+ # Nodes 'a', 'b', 'c' and 'd' form a column.
+ # Nodes 'g', 'h', 'i' and 'j' form a column.
+ g1edges = [['a','g'], ['a','h'], ['a','i'],
+ ['b','g'], ['b','h'], ['b','j'],
+ ['c','g'], ['c','i'], ['c','j'],
+ ['d','h'], ['d','i'], ['d','j']]
+
+ # Nodes 1,2,3,4 form the clockwise corners of a large square.
+ # Nodes 5,6,7,8 form the clockwise corners of a small square
+ g2edges = [[1,2], [2,3], [3,4], [4,1],
+ [5,6], [6,7], [7,8], [8,5],
+ [1,5], [2,6], [3,7], [4,8]]
+
+ def test_graph(self):
+ g1 = nx.Graph()
+ g2 = nx.Graph()
+ g1.add_edges_from(self.g1edges)
+ g2.add_edges_from(self.g2edges)
+ gm = iso.GraphMatcher(g1,g2)
+ assert_true(gm.is_isomorphic())
+
+ mapping = sorted(gm.mapping.items())
+# this mapping is only one of the possibilies
+# so this test needs to be reconsidered
+# isomap = [('a', 1), ('b', 6), ('c', 3), ('d', 8),
+# ('g', 2), ('h', 5), ('i', 4), ('j', 7)]
+# assert_equal(mapping, isomap)
+
+ def test_subgraph(self):
+ g1 = nx.Graph()
+ g2 = nx.Graph()
+ g1.add_edges_from(self.g1edges)
+ g2.add_edges_from(self.g2edges)
+ g3 = g2.subgraph([1,2,3,4])
+ gm = iso.GraphMatcher(g1,g3)
+ assert_true(gm.subgraph_is_isomorphic())
+
+class TestVF2GraphDB(object):
+ # http://amalfi.dis.unina.it/graph/db/
+
+ @staticmethod
+ def create_graph(filename):
+ """Creates a Graph instance from the filename."""
+
+ # The file is assumed to be in the format from the VF2 graph database.
+ # Each file is composed of 16-bit numbers (unsigned short int).
+ # So we will want to read 2 bytes at a time.
+
+ # We can read the number as follows:
+ # number = struct.unpack('<H', file.read(2))
+ # This says, expect the data in little-endian encoding
+ # as an unsigned short int and unpack 2 bytes from the file.
+
+ fh = open(filename, mode='rb')
+
+ # Grab the number of nodes.
+ # Node numeration is 0-based, so the first node has index 0.
+ nodes = struct.unpack('<H', fh.read(2))[0]
+
+ graph = nx.Graph()
+ for from_node in range(nodes):
+ # Get the number of edges.
+ edges = struct.unpack('<H', fh.read(2))[0]
+ for edge in range(edges):
+ # Get the terminal node.
+ to_node = struct.unpack('<H', fh.read(2))[0]
+ graph.add_edge(from_node, to_node)
+
+ fh.close()
+ return graph
+
+ def test_graph(self):
+ head,tail = os.path.split(__file__)
+ g1 = self.create_graph(os.path.join(head,'iso_r01_s80.A99'))
+ g2 = self.create_graph(os.path.join(head,'iso_r01_s80.B99'))
+ gm = iso.GraphMatcher(g1,g2)
+ assert_true(gm.is_isomorphic())
+
+ def test_subgraph(self):
+ # A is the subgraph
+ # B is the full graph
+ head,tail = os.path.split(__file__)
+ subgraph = self.create_graph(os.path.join(head,'si2_b06_m200.A99'))
+ graph = self.create_graph(os.path.join(head,'si2_b06_m200.B99'))
+ gm = iso.GraphMatcher(graph, subgraph)
+ assert_true(gm.subgraph_is_isomorphic())
+
+def test_graph_atlas():
+ #Atlas = nx.graph_atlas_g()[0:208] # 208, 6 nodes or less
+ Atlas = nx.graph_atlas_g()[0:100]
+ alphabet = list(range(26))
+ for graph in Atlas:
+ nlist = graph.nodes()
+ labels = alphabet[:len(nlist)]
+ for s in range(10):
+ random.shuffle(labels)
+ d = dict(zip(nlist,labels))
+ relabel = nx.relabel_nodes(graph, d)
+ gm = iso.GraphMatcher(graph, relabel)
+ assert_true(gm.is_isomorphic())
+
+def test_multiedge():
+ # Simple test for multigraphs
+ # Need something much more rigorous
+ edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5),
+ (5, 6), (6, 7), (7, 8), (8, 9), (9, 10),
+ (10, 11), (10, 11), (11, 12), (11, 12),
+ (12, 13), (12, 13), (13, 14), (13, 14),
+ (14, 15), (14, 15), (15, 16), (15, 16),
+ (16, 17), (16, 17), (17, 18), (17, 18),
+ (18, 19), (18, 19), (19, 0), (19, 0)]
+ nodes = list(range(20))
+
+ for g1 in [nx.MultiGraph(), nx.MultiDiGraph()]:
+ g1.add_edges_from(edges)
+ for _ in range(10):
+ new_nodes = list(nodes)
+ random.shuffle(new_nodes)
+ d = dict(zip(nodes, new_nodes))
+ g2 = nx.relabel_nodes(g1, d)
+ if not g1.is_directed():
+ gm = iso.GraphMatcher(g1,g2)
+ else:
+ gm = iso.DiGraphMatcher(g1,g2)
+ assert_true(gm.is_isomorphic())
+
+def test_selfloop():
+ # Simple test for graphs with selfloops
+ edges = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 2),
+ (2, 4), (3, 1), (3, 2), (4, 2), (4, 5), (5, 4)]
+ nodes = list(range(6))
+
+ for g1 in [nx.Graph(), nx.DiGraph()]:
+ g1.add_edges_from(edges)
+ for _ in range(100):
+ new_nodes = list(nodes)
+ random.shuffle(new_nodes)
+ d = dict(zip(nodes, new_nodes))
+ g2 = nx.relabel_nodes(g1, d)
+ if not g1.is_directed():
+ gm = iso.GraphMatcher(g1,g2)
+ else:
+ gm = iso.DiGraphMatcher(g1,g2)
+ assert_true(gm.is_isomorphic())
+
+def test_isomorphism_iter1():
+ # As described in:
+ # http://groups.google.com/group/networkx-discuss/browse_thread/thread/2ff65c67f5e3b99f/d674544ebea359bb?fwc=1
+ g1 = nx.DiGraph()
+ g2 = nx.DiGraph()
+ g3 = nx.DiGraph()
+ g1.add_edge('A','B')
+ g1.add_edge('B','C')
+ g2.add_edge('Y','Z')
+ g3.add_edge('Z','Y')
+ gm12 = iso.DiGraphMatcher(g1,g2)
+ gm13 = iso.DiGraphMatcher(g1,g3)
+ x = list(gm12.subgraph_isomorphisms_iter())
+ y = list(gm13.subgraph_isomorphisms_iter())
+ assert_true({'A':'Y','B':'Z'} in x)
+ assert_true({'B':'Y','C':'Z'} in x)
+ assert_true({'A':'Z','B':'Y'} in y)
+ assert_true({'B':'Z','C':'Y'} in y)
+ assert_equal(len(x),len(y))
+ assert_equal(len(x),2)
+
+def test_isomorphism_iter2():
+ # Path
+ for L in range(2,10):
+ g1 = nx.path_graph(L)
+ gm = iso.GraphMatcher(g1,g1)
+ s = len(list(gm.isomorphisms_iter()))
+ assert_equal(s,2)
+ # Cycle
+ for L in range(3,10):
+ g1 = nx.cycle_graph(L)
+ gm = iso.GraphMatcher(g1,g1)
+ s = len(list(gm.isomorphisms_iter()))
+ assert_equal(s, 2*L)
+
+def test_multiple():
+ # Verify that we can use the graph matcher multiple times
+ edges = [('A','B'),('B','A'),('B','C')]
+ for g1,g2 in [(nx.Graph(),nx.Graph()), (nx.DiGraph(),nx.DiGraph())]:
+ g1.add_edges_from(edges)
+ g2.add_edges_from(edges)
+ g3 = nx.subgraph(g2, ['A','B'])
+ if not g1.is_directed():
+ gmA = iso.GraphMatcher(g1,g2)
+ gmB = iso.GraphMatcher(g1,g3)
+ else:
+ gmA = iso.DiGraphMatcher(g1,g2)
+ gmB = iso.DiGraphMatcher(g1,g3)
+ assert_true(gmA.is_isomorphic())
+ g2.remove_node('C')
+ assert_true(gmA.subgraph_is_isomorphic())
+ assert_true(gmB.subgraph_is_isomorphic())
+# for m in [gmB.mapping, gmB.mapping]:
+# assert_true(m['A'] == 'A')
+# assert_true(m['B'] == 'B')
+# assert_true('C' not in m)
+