def get_largest_matching_pattern( pattern: PerceptionGraphPattern, graph: PerceptionGraph, *, debug_callback: Optional[DebugCallableType] = None, graph_logger: Optional[GraphLogger] = None, ontology: Ontology, match_ratio: Optional[float] = None, match_mode: MatchMode, trim_after_match: Optional[Callable[[PerceptionGraphPattern], PerceptionGraphPattern]] = None, allowed_matches: ImmutableSetMultiDict[Any, Any] = immutablesetmultidict(), ) -> Optional[PerceptionGraphPattern]: """ Helper function to return the largest matching `PerceptionGraphPattern` for learner from a perception pattern and graph pair.""" matching = pattern.matcher( graph, debug_callback=debug_callback, match_mode=match_mode, allowed_matches=allowed_matches, ) return matching.relax_pattern_until_it_matches( graph_logger=graph_logger, ontology=ontology, min_ratio=match_ratio, trim_after_match=trim_after_match, )
def test_successfully_extending_partial_match(): """ Tests whether we can match a perception pattern against a perception graph when initializing the search from a partial match. """ target_object = BOX # Create train and test templates for the target objects train_obj_object = object_variable("obj-with-color", target_object) obj_template = Phase1SituationTemplate( "colored-obj-object", salient_object_variables=[train_obj_object]) template = all_possible(obj_template, chooser=PHASE1_CHOOSER_FACTORY(), ontology=GAILA_PHASE_1_ONTOLOGY) train_curriculum = phase1_instances("all obj situations", situations=template) perceptual_representation = only(train_curriculum.instances())[2] # Original perception graph perception = PerceptionGraph.from_frame( perceptual_representation.frames[0]) # Create a perception pattern for the whole thing # and also a perception pattern for a subset of the whole pattern whole_perception_pattern = PerceptionGraphPattern.from_graph( perception).perception_graph_pattern partial_digraph = whole_perception_pattern.copy_as_digraph() partial_digraph.remove_nodes_from([ node for node in partial_digraph.nodes if isinstance(node, IsColorNodePredicate) ]) partial_perception_pattern = PerceptionGraphPattern(partial_digraph) # get our initial match by matching the partial pattern matcher = partial_perception_pattern.matcher( perception, match_mode=MatchMode.NON_OBJECT) partial_match: PerceptionGraphPatternMatch = first( matcher.matches(use_lookahead_pruning=True)) partial_mapping = partial_match.pattern_node_to_matched_graph_node # Try to extend the partial mapping, to create a complete mapping matcher_2 = whole_perception_pattern.matcher( perception, match_mode=MatchMode.NON_OBJECT) complete_match: PerceptionGraphPatternMatch = first( matcher_2.matches(initial_partial_match=partial_mapping, use_lookahead_pruning=True), None, ) complete_mapping = complete_match.pattern_node_to_matched_graph_node assert len(complete_mapping) == len(perception.copy_as_digraph().nodes) assert len(complete_mapping) == len( whole_perception_pattern.copy_as_digraph().nodes)