def full_match(self, other):
<EOL>graphs0 = [<EOL>self.get_subgraph(group, normalize=True)<EOL>for group in self.independent_vertices<EOL>]<EOL>graphs1 = [<EOL>other.get_subgraph(group)<EOL>for group in other.independent_vertices<EOL>]<EOL>if len(graphs0) != len(graphs1):<EOL><INDENT>return<EOL><DEDENT>matches = []<EOL>for graph0 in graphs0:<EOL><INDENT>pattern = EqualPattern(graph0)<EOL>found_match = False<EOL>for i, graph1 in enumerate(graphs1):<EOL><INDENT>local_matches = list(GraphSearch(pattern)(graph1, one_match=True))<EOL>if len(local_matches) == <NUM_LIT:1>:<EOL><INDENT>match = local_matches[<NUM_LIT:0>]<EOL>old_to_new = OneToOne((<EOL>(j, i) for i, j<EOL>in enumerate(graph0._old_vertex_indexes)<EOL>))<EOL>matches.append(match * old_to_new)<EOL>del graphs1[i]<EOL>found_match = True<EOL>break<EOL><DEDENT><DEDENT>if not found_match:<EOL><INDENT>return<EOL><DEDENT><DEDENT>result = OneToOne()<EOL>for match in matches:<EOL><INDENT>result.add_relations(match.forward.items())<EOL><DEDENT>return result<EOL>
Find the mapping between vertex indexes in self and other.

           This also works on disconnected graphs. Derived classes should just
           implement get_vertex_string and get_edge_string to make this method
           aware of the different nature of certain vertices. In case molecules,
           this would make the algorithm sensitive to atom numbers etc.