def test_isomorphism(self): """ Check the graph isomorphism functions. """ vertices1 = [Vertex() for i in range(6)] edges1 = [ Edge(vertices1[0], vertices1[1]), Edge(vertices1[1], vertices1[2]), Edge(vertices1[2], vertices1[3]), Edge(vertices1[3], vertices1[4]), Edge(vertices1[4], vertices1[5]), ] vertices2 = [Vertex() for i in range(6)] edges2 = [ Edge(vertices2[0], vertices2[1]), Edge(vertices2[1], vertices2[2]), Edge(vertices2[2], vertices2[3]), Edge(vertices2[3], vertices2[4]), Edge(vertices2[4], vertices2[5]), ] graph1 = Graph() for vertex in vertices1: graph1.addVertex(vertex) for edge in edges1: graph1.addEdge(edge) graph2 = Graph() for vertex in vertices2: graph2.addVertex(vertex) for edge in edges2: graph2.addEdge(edge) self.assertTrue(graph1.isIsomorphic(graph2)) self.assertTrue(graph1.isSubgraphIsomorphic(graph2)) self.assertTrue(graph2.isIsomorphic(graph1)) self.assertTrue(graph2.isSubgraphIsomorphic(graph1))
def test_isomorphism_disconnected(self): """ Check the graph isomorphism for broken graphs. This tries to match graphs with a missing bond, eg. [ 0-1-2-3-4 5 ] should match [ 0-1-2-3-4 5 ] """ vertices1 = [Vertex() for i in range(6)] edges1 = [ Edge(vertices1[0], vertices1[1]), Edge(vertices1[1], vertices1[2]), Edge(vertices1[2], vertices1[3]), Edge(vertices1[3], vertices1[4]), #Edge(vertices1[4], vertices1[5]), ] vertices2 = [Vertex() for i in range(6)] edges2 = [ Edge(vertices2[0], vertices2[1]), Edge(vertices2[1], vertices2[2]), Edge(vertices2[2], vertices2[3]), Edge(vertices2[3], vertices2[4]), #Edge(vertices2[4], vertices2[5]), ] graph1 = Graph() for vertex in vertices1: graph1.addVertex(vertex) for edge in edges1: graph1.addEdge(edge) graph2 = Graph() for vertex in vertices2: graph2.addVertex(vertex) for edge in edges2: graph2.addEdge(edge) self.assertTrue(graph1.isIsomorphic(graph2)) self.assertTrue(graph1.isSubgraphIsomorphic(graph2)) self.assertTrue(graph2.isIsomorphic(graph1)) self.assertTrue(graph2.isSubgraphIsomorphic(graph1)) self.assertTrue(len(graph1.findSubgraphIsomorphisms(graph2)) > 0)
def test_isomorphism(self): """ Check the graph isomorphism functions. """ vertices1 = [Vertex() for i in range(6)] edges1 = [ Edge(vertices1[0], vertices1[1]), Edge(vertices1[1], vertices1[2]), Edge(vertices1[2], vertices1[3]), Edge(vertices1[3], vertices1[4]), Edge(vertices1[4], vertices1[5]), ] vertices2 = [Vertex() for i in range(6)] edges2 = [ Edge(vertices2[0], vertices2[1]), Edge(vertices2[1], vertices2[2]), Edge(vertices2[2], vertices2[3]), Edge(vertices2[3], vertices2[4]), Edge(vertices2[4], vertices2[5]), ] graph1 = Graph() for vertex in vertices1: graph1.addVertex(vertex) for edge in edges1: graph1.addEdge(edge) graph2 = Graph() for vertex in vertices2: graph2.addVertex(vertex) for edge in edges2: graph2.addEdge(edge) self.assertTrue(graph1.isIsomorphic(graph2)) self.assertTrue(graph1.isSubgraphIsomorphic(graph2)) self.assertTrue(graph2.isIsomorphic(graph1)) self.assertTrue(graph2.isSubgraphIsomorphic(graph1))
def test_isomorphism_disconnected(self): """ Check the graph isomorphism for broken graphs. This tries to match graphs with a missing bond, eg. [ 0-1-2-3-4 5 ] should match [ 0-1-2-3-4 5 ] """ vertices1 = [Vertex() for i in range(6)] edges1 = [ Edge(vertices1[0], vertices1[1]), Edge(vertices1[1], vertices1[2]), Edge(vertices1[2], vertices1[3]), Edge(vertices1[3], vertices1[4]), #Edge(vertices1[4], vertices1[5]), ] vertices2 = [Vertex() for i in range(6)] edges2 = [ Edge(vertices2[0], vertices2[1]), Edge(vertices2[1], vertices2[2]), Edge(vertices2[2], vertices2[3]), Edge(vertices2[3], vertices2[4]), #Edge(vertices2[4], vertices2[5]), ] graph1 = Graph() for vertex in vertices1: graph1.addVertex(vertex) for edge in edges1: graph1.addEdge(edge) graph2 = Graph() for vertex in vertices2: graph2.addVertex(vertex) for edge in edges2: graph2.addEdge(edge) self.assertTrue(graph1.isIsomorphic(graph2)) self.assertTrue(graph1.isSubgraphIsomorphic(graph2)) self.assertTrue(graph2.isIsomorphic(graph1)) self.assertTrue(graph2.isSubgraphIsomorphic(graph1)) self.assertTrue(len(graph1.findSubgraphIsomorphisms(graph2)) > 0)
def isSubgraphIsomorphic(self, other, initialMap=None): """ Fragment's subgraph isomorphism check is done by first creating a representative molecule of fragment, and then following same procedure of subgraph isomorphism check of `Molecule` object aganist `Group` object """ if not isinstance(other, gr.Group): raise TypeError( 'Got a {0} object for parameter "other", when a Molecule object is required.' .format(other.__class__)) group = other mapping = self.assign_representative_molecule() # Check multiplicity if group.multiplicity: if self.mol_repr.multiplicity not in group.multiplicity: return False # Compare radical counts if self.mol_repr.getRadicalCount() < group.radicalCount: return False # Compare element counts element_count = self.mol_repr.get_element_count() for element, count in group.elementCount.iteritems(): if element not in element_count: return False elif element_count[element] < count: return False # Do the isomorphism comparison new_initial_map = None if initialMap: new_initial_map = {} for fragment_vertex in initialMap: repr_mol_vertex = mapping[fragment_vertex] new_initial_map[repr_mol_vertex] = initialMap[fragment_vertex] result = Graph.isSubgraphIsomorphic(self.mol_repr, other, new_initial_map) return result
def test_subgraphIsomorphism(self): """ Check the subgraph isomorphism functions. """ vertices1 = [Vertex() for i in range(6)] edges1 = [ Edge(vertices1[0], vertices1[1]), Edge(vertices1[1], vertices1[2]), Edge(vertices1[2], vertices1[3]), Edge(vertices1[3], vertices1[4]), Edge(vertices1[4], vertices1[5]), ] vertices2 = [Vertex() for i in range(2)] edges2 = [ Edge(vertices2[0], vertices2[1]), ] graph1 = Graph() for vertex in vertices1: graph1.addVertex(vertex) for edge in edges1: graph1.addEdge(edge) graph2 = Graph() for vertex in vertices2: graph2.addVertex(vertex) for edge in edges2: graph2.addEdge(edge) self.assertFalse(graph1.isIsomorphic(graph2)) self.assertFalse(graph2.isIsomorphic(graph1)) self.assertTrue(graph1.isSubgraphIsomorphic(graph2)) mapList = graph1.findSubgraphIsomorphisms(graph2) self.assertTrue(len(mapList) == 10) for mapping in mapList: self.assertTrue(graph1.isMappingValid(graph2, mapping)) self.assertTrue(graph1.isMappingValid(graph2, mapping))
def test_subgraphIsomorphism(self): """ Check the subgraph isomorphism functions. """ vertices1 = [Vertex() for i in range(6)] edges1 = [ Edge(vertices1[0], vertices1[1]), Edge(vertices1[1], vertices1[2]), Edge(vertices1[2], vertices1[3]), Edge(vertices1[3], vertices1[4]), Edge(vertices1[4], vertices1[5]), ] vertices2 = [Vertex() for i in range(2)] edges2 = [Edge(vertices2[0], vertices2[1])] graph1 = Graph() for vertex in vertices1: graph1.addVertex(vertex) for edge in edges1: graph1.addEdge(edge) graph2 = Graph() for vertex in vertices2: graph2.addVertex(vertex) for edge in edges2: graph2.addEdge(edge) self.assertFalse(graph1.isIsomorphic(graph2)) self.assertFalse(graph2.isIsomorphic(graph1)) self.assertTrue(graph1.isSubgraphIsomorphic(graph2)) mapList = graph1.findSubgraphIsomorphisms(graph2) self.assertTrue(len(mapList) == 10) for mapping in mapList: self.assertTrue(graph1.isMappingValid(graph2, mapping)) self.assertTrue(graph1.isMappingValid(graph2, mapping))