def iter_final_matches(self, canonical_match, subject_graph, one_match):
if self.criteria_sets is None or one_match:<EOL><INDENT>yield canonical_match<EOL><DEDENT>else:<EOL><INDENT>for criteria_set in self.criteria_sets:<EOL><INDENT>satisfied_match_tags = set([])<EOL>for symmetry in self.pattern_graph.symmetries:<EOL><INDENT>final_match = canonical_match * symmetry<EOL>if criteria_set.test_match(final_match, self.pattern_graph, subject_graph):<EOL><INDENT>match_tags = tuple(<EOL>self.vertex_tags.get(symmetry.reverse[vertex0])<EOL>for vertex0<EOL>in range(self.pattern_graph.num_vertices)<EOL>)<EOL>if match_tags not in satisfied_match_tags:<EOL><INDENT>final_match.__dict__.update(criteria_set.info)<EOL>yield final_match<EOL>satisfied_match_tags.add(match_tags)<EOL><DEDENT><DEDENT><DEDENT><DEDENT><DEDENT>
Given a match, iterate over all related equivalent matches

           When criteria sets are defined, the iterator runs over all symmetric
           equivalent matches that fulfill one of the criteria sets. When not
           criteria sets are defined, the iterator only yields the input match.