def __init__( self, molecule1, molecule2, prematched=[], vertex_equality=None, edge_equality=None, maxsol=0, ): if vertex_equality is None: import operator vertex_equality = operator.eq if edge_equality is None: import operator edge_equality = operator.eq self.molecule1 = molecule1.atom_for self.molecule2 = molecule2.atom_for self.best = [[]] self.largest = 0 from graph import maximum_clique self.compat_graph = maximum_clique.compatibility_graph( first=molecule1.graph, second=molecule2.graph, vertex_equality=vertex_equality, edge_equality=edge_equality) self.prematched = prematched if self.prematched: desc_for_1 = molecule1.descriptor_for desc_for_2 = molecule2.descriptor_for pairs = set([(desc_for_1[l], desc_for_2[r]) for (l, r) in self.prematched]) vertices = [ v for v in self.compat_graph.vertices() if self.compat_graph.vertex_label(vertex=v) in pairs ] assert len(vertices) == len(self.prematched) neighbours = set( self.compat_graph.adjacent_vertices(vertex=vertices[0])) for v in vertices[1:]: neighbours.intersection_update( self.compat_graph.adjacent_vertices(vertex=v)) self.compat_graph = maximum_clique.selected_subgraph( graph=self.compat_graph, vertices=neighbours, ) self.result = maximum_clique.greedy(graph=self.compat_graph, maxsol=maxsol)
def manipulation(self, g): n = {} n["1,1'"] = g.add_vertex(label="1,1'") # 0 n["1,5'"] = g.add_vertex(label="1,5'") # 1 n["2,2'"] = g.add_vertex(label="2,2'") # 2 n["2,3'"] = g.add_vertex(label="2,3'") # 3 n["3,2'"] = g.add_vertex(label="3,2'") # 4 n["3,3'"] = g.add_vertex(label="3,3'") # 5 n["4,4'"] = g.add_vertex(label="4,4'") # 6 n["5,1'"] = g.add_vertex(label="5,1'") # 7 n["5,5'"] = g.add_vertex(label="5,5'") # 8 g.add_edge(vertex1=n["1,1'"], vertex2=n["3,3'"]) g.add_edge(vertex1=n["1,1'"], vertex2=n["4,4'"]) g.add_edge(vertex1=n["1,1'"], vertex2=n["5,5'"]) g.add_edge(vertex1=n["1,5'"], vertex2=n["3,2'"]) g.add_edge(vertex1=n["1,5'"], vertex2=n["4,4'"]) g.add_edge(vertex1=n["1,5'"], vertex2=n["5,1'"]) g.add_edge(vertex1=n["2,2'"], vertex2=n["3,3'"]) g.add_edge(vertex1=n["2,2'"], vertex2=n["4,4'"]) g.add_edge(vertex1=n["2,2'"], vertex2=n["5,5'"]) g.add_edge(vertex1=n["2,3'"], vertex2=n["3,2'"]) g.add_edge(vertex1=n["2,3'"], vertex2=n["5,1'"]) g.add_edge(vertex1=n["3,2'"], vertex2=n["5,1'"]) g.add_edge(vertex1=n["3,3'"], vertex2=n["4,4'"]) g.add_edge(vertex1=n["3,3'"], vertex2=n["5,5'"]) g.add_edge(vertex1=n["4,4'"], vertex2=n["5,1'"]) g.add_edge(vertex1=n["4,4'"], vertex2=n["5,5'"]) subgraph = maximum_clique.selected_subgraph( graph=g, vertices=g.adjacent_vertices(vertex=n["2,2'"])) vertices = list(subgraph.vertices()) self.assertEqual(len(vertices), 3) self.assertEqual( set(subgraph.vertex_label(vertex=v) for v in vertices), set(["3,3'", "4,4'", "5,5'"])) edges = list(subgraph.edges()) self.assertEqual(len(edges), 3) self.assertEqual( set( frozenset([ subgraph.vertex_label(vertex=subgraph.source(edge=e)), subgraph.vertex_label(vertex=subgraph.target(edge=e)), ]) for e in edges), set([ frozenset(["3,3'", "4,4'"]), frozenset(["3,3'", "5,5'"]), frozenset(["4,4'", "5,5'"]), ]))
def __init__( self, molecule1, molecule2, prematched = [], vertex_equality = None, edge_equality = None, maxsol = 0, ): if vertex_equality is None: import operator vertex_equality = operator.eq if edge_equality is None: import operator edge_equality = operator.eq self.molecule1 = molecule1.atom_for self.molecule2 = molecule2.atom_for self.best = [ [] ] self.largest = 0 from graph import maximum_clique self.compat_graph = maximum_clique.compatibility_graph( first = molecule1.graph, second = molecule2.graph, vertex_equality = vertex_equality, edge_equality = edge_equality ) self.prematched = prematched if self.prematched: desc_for_1 = molecule1.descriptor_for desc_for_2 = molecule2.descriptor_for pairs = set( [ ( desc_for_1[ l ], desc_for_2[ r ] ) for ( l, r ) in self.prematched ] ) vertices = [ v for v in self.compat_graph.vertices() if self.compat_graph.vertex_label( vertex = v ) in pairs ] assert len( vertices ) == len( self.prematched ) neighbours = set( self.compat_graph.adjacent_vertices( vertex = vertices[0] ) ) for v in vertices[1:]: neighbours.intersection_update( self.compat_graph.adjacent_vertices( vertex = v ) ) self.compat_graph = maximum_clique.selected_subgraph( graph = self.compat_graph, vertices = neighbours, ) self.result = maximum_clique.greedy( graph = self.compat_graph, maxsol = maxsol )
def subset(self, atoms): if not all(a in self.descriptor_for for a in atoms): raise ValueError, "Unknown atoms: %s" % atoms from graph import maximum_clique subgraph = maximum_clique.selected_subgraph( graph=self.graph, vertices=(self.descriptor_for[a] for a in atoms), ) return self.__class__(graph=subgraph)
def subset(self, atoms): if not all( a in self.descriptor_for for a in atoms ): raise ValueError, "Unknown atoms: %s" % atoms from graph import maximum_clique subgraph = maximum_clique.selected_subgraph( graph = self.graph, vertices = ( self.descriptor_for[ a ] for a in atoms ), ) return self.__class__( graph = subgraph )
def manipulation(self, g): n = {} n[ "1,1'" ] = g.add_vertex( label = "1,1'" ) # 0 n[ "1,5'" ] = g.add_vertex( label = "1,5'" ) # 1 n[ "2,2'" ] = g.add_vertex( label = "2,2'" ) # 2 n[ "2,3'" ] = g.add_vertex( label = "2,3'" ) # 3 n[ "3,2'" ] = g.add_vertex( label = "3,2'" ) # 4 n[ "3,3'" ] = g.add_vertex( label = "3,3'" ) # 5 n[ "4,4'" ] = g.add_vertex( label = "4,4'" ) # 6 n[ "5,1'" ] = g.add_vertex( label = "5,1'" ) # 7 n[ "5,5'" ] = g.add_vertex( label = "5,5'" ) # 8 g.add_edge( vertex1 = n[ "1,1'" ], vertex2 = n[ "3,3'" ] ) g.add_edge( vertex1 = n[ "1,1'" ], vertex2 = n[ "4,4'" ] ) g.add_edge( vertex1 = n[ "1,1'" ], vertex2 = n[ "5,5'" ] ) g.add_edge( vertex1 = n[ "1,5'" ], vertex2 = n[ "3,2'" ] ) g.add_edge( vertex1 = n[ "1,5'" ], vertex2 = n[ "4,4'" ] ) g.add_edge( vertex1 = n[ "1,5'" ], vertex2 = n[ "5,1'" ] ) g.add_edge( vertex1 = n[ "2,2'" ], vertex2 = n[ "3,3'" ] ) g.add_edge( vertex1 = n[ "2,2'" ], vertex2 = n[ "4,4'" ] ) g.add_edge( vertex1 = n[ "2,2'" ], vertex2 = n[ "5,5'" ] ) g.add_edge( vertex1 = n[ "2,3'" ], vertex2 = n[ "3,2'" ] ) g.add_edge( vertex1 = n[ "2,3'" ], vertex2 = n[ "5,1'" ] ) g.add_edge( vertex1 = n[ "3,2'" ], vertex2 = n[ "5,1'" ] ) g.add_edge( vertex1 = n[ "3,3'" ], vertex2 = n[ "4,4'" ] ) g.add_edge( vertex1 = n[ "3,3'" ], vertex2 = n[ "5,5'" ] ) g.add_edge( vertex1 = n[ "4,4'" ], vertex2 = n[ "5,1'" ] ) g.add_edge( vertex1 = n[ "4,4'" ], vertex2 = n[ "5,5'" ] ) subgraph = maximum_clique.selected_subgraph( graph = g, vertices = g.adjacent_vertices( vertex = n[ "2,2'"] ) ) vertices = list( subgraph.vertices() ) self.assertEqual( len( vertices ), 3 ) self.assertEqual( set( subgraph.vertex_label( vertex = v ) for v in vertices ), set( [ "3,3'", "4,4'", "5,5'" ] ) ) edges = list( subgraph.edges() ) self.assertEqual( len( edges ), 3 ) self.assertEqual( set( frozenset( [ subgraph.vertex_label( vertex = subgraph.source( edge = e ) ), subgraph.vertex_label( vertex = subgraph.target( edge = e ) ), ] ) for e in edges ), set( [ frozenset( [ "3,3'", "4,4'" ] ), frozenset( [ "3,3'", "5,5'" ] ), frozenset( [ "4,4'", "5,5'" ] ), ] ) )