static bool apply_relevant_rules(Postprocessor *pp, bool (applyfn)(PP_data *, Linkage, pp_rule *), Linkage sublinkage, pp_rule *rule_array, int *relevant_rules, const char **msg) { int i, idx; PP_data *pp_data = &pp->pp_data; /* If we didn't accumulate link names for this sentence, we need * to apply all rules. */ if (pp_linkset_population(pp->set_of_links_of_sentence) == 0) { return apply_rules(pp_data, applyfn, sublinkage, rule_array, msg); } /* We did, and we don't. */ for (i = 0; (idx = relevant_rules[i]) != -1; i++) { *msg = rule_array[idx].msg; if (!applyfn(pp_data, sublinkage, &(rule_array[idx]))) return false; } return true; }
void prune_irrelevant_rules(Postprocessor *pp) { /* call this (a) after having called post_process_scan_linkage() on all generated linkages, but (b) before calling post_process() on any particular linkage. Here we mark all rules which we know (from having accumulated a set of link names appearing in *any* linkage) won't ever be needed. */ pp_rule *rule; int coIDX, cnIDX, rcoIDX=0, rcnIDX=0; /* If we didn't scan any linkages, there's no pruning to be done. */ if (pp_linkset_population(pp->set_of_links_of_sentence)==0) return; for (coIDX=0;;coIDX++) { rule = &(pp->knowledge->contains_one_rules[coIDX]); if (rule->msg==NULL) break; if (pp_linkset_match_bw(pp->set_of_links_of_sentence, rule->selector)) { /* mark rule as being relevant to this sentence */ pp->relevant_contains_one_rules[rcoIDX++] = coIDX; pp_linkset_add(pp->set_of_links_in_an_active_rule, rule->selector); } } pp->relevant_contains_one_rules[rcoIDX] = -1; /* end sentinel */ for (cnIDX=0;;cnIDX++) { rule = &(pp->knowledge->contains_none_rules[cnIDX]); if (rule->msg==NULL) break; if (pp_linkset_match_bw(pp->set_of_links_of_sentence, rule->selector)) { pp->relevant_contains_none_rules[rcnIDX++] = cnIDX; pp_linkset_add(pp->set_of_links_in_an_active_rule, rule->selector); } } pp->relevant_contains_none_rules[rcnIDX] = -1; if (verbosity>1) { printf("Saw %i unique link names in all linkages.\n", pp_linkset_population(pp->set_of_links_of_sentence)); printf("Using %i 'contains one' rules and %i 'contains none' rules\n", rcoIDX, rcnIDX); } }
/** * Call this (a) after having called post_process_scan_linkage() on all * generated linkages, but (b) before calling post_process() on any * particular linkage. Here we mark all rules which we know (from having * accumulated a set of link names appearing in *any* linkage) that won't * ever be needed. */ static void prune_irrelevant_rules(Postprocessor *pp) { pp_rule *rule; int coIDX, cnIDX, rcoIDX = 0, rcnIDX = 0; /* If we didn't scan any linkages, there's no pruning to be done. */ if (pp_linkset_population(pp->set_of_links_of_sentence) == 0) return; for (coIDX = 0; ; coIDX++) { rule = &(pp->knowledge->contains_one_rules[coIDX]); if (rule->msg == NULL) break; if (pp_linkset_match_bw(pp->set_of_links_of_sentence, rule->selector)) { /* Mark rule as being relevant to this sentence */ pp->relevant_contains_one_rules[rcoIDX++] = coIDX; pp_linkset_add(pp->set_of_links_in_an_active_rule, rule->selector); } } pp->relevant_contains_one_rules[rcoIDX] = -1; /* end sentinel */ for (cnIDX = 0; ; cnIDX++) { rule = &(pp->knowledge->contains_none_rules[cnIDX]); if (rule->msg == NULL) break; if (pp_linkset_match_bw(pp->set_of_links_of_sentence, rule->selector)) { pp->relevant_contains_none_rules[rcnIDX++] = cnIDX; pp_linkset_add(pp->set_of_links_in_an_active_rule, rule->selector); } } pp->relevant_contains_none_rules[rcnIDX] = -1; if (debug_level(5)) { printf("PP: Saw %zd unique link names in all linkages.\n", pp_linkset_population(pp->set_of_links_of_sentence)); printf("PP: Using %i 'contains one' rules and %i 'contains none' rules\n", rcoIDX, rcnIDX); } }
static int apply_relevant_rules(Postprocessor *pp, int(applyfn)(Postprocessor *pp,Sublinkage*,pp_rule *rule), Sublinkage *sublinkage, pp_rule *rule_array, int *relevant_rules, char **msg) { int i, idx; /* if we didn't accumulate link names for this sentence, we need to apply all rules */ if (pp_linkset_population(pp->set_of_links_of_sentence)==0) { return apply_rules(pp, applyfn, sublinkage, rule_array, msg); } /* we did, and we don't */ for (i=0; (idx=relevant_rules[i])!=-1; i++) { *msg = rule_array[idx].msg; /* Adam had forgotten this -- DS 4/9/98 */ if (!applyfn(pp, sublinkage, &(rule_array[idx]))) return 0; } return 1; }