inline bool wma_forgetting_forget_wme( agent *my_agent, wme *w ) { bool return_val = false; bool fake = ( my_agent->wma_params->fake_forgetting->get_value() == on ); if ( w->preference && w->preference->slot ) { preference* p = w->preference->slot->all_preferences; preference* next_p; while ( p ) { next_p = p->all_of_slot_next; if ( p->o_supported && p->in_tm && ( p->value == w->value ) ) { if ( !fake ) { remove_preference_from_tm( my_agent, p ); return_val = true; } } p = next_p; } } return return_val; }
void retract_instantiation (instantiation *inst) { preference *pref, *next; bool retracted_a_preference; bool trace_it; /* --- invoke callback function --- */ #ifndef NO_CALLBACKS soar_invoke_callbacks(soar_agent, RETRACTION_CALLBACK, (soar_call_data) inst); #endif retracted_a_preference = FALSE; trace_it = trace_firings_of_inst (inst); /* --- retract any preferences that are in TM and aren't o-supported --- */ pref = inst->preferences_generated; while (pref!=NIL) { next = pref->inst_next; if (pref->in_tm && (! pref->o_supported)) { if (trace_it) { if (!retracted_a_preference) { if (get_printer_output_column()!=1) print ("\n"); /* AGR 617/634 */ print ("Retracting "); print_instantiation_with_wmes (inst, (wme_trace_type)current_agent(sysparams)[TRACE_FIRINGS_WME_TRACE_TYPE_SYSPARAM]); if (current_agent(sysparams)[TRACE_FIRINGS_PREFERENCES_SYSPARAM]) print (" -->"); } if (current_agent(sysparams)[TRACE_FIRINGS_PREFERENCES_SYSPARAM]) { print (" "); print_preference (pref); } } remove_preference_from_tm (pref); retracted_a_preference = TRUE; } pref = next; } /* --- remove inst from list of instantiations of this production --- */ remove_from_dll (inst->prod->instantiations, inst, next, prev); /* --- if retracting a justification, excise it --- */ /* * if the reference_count on the production is 1 (or less) then the * only thing supporting this justification is the instantiation, hence * it has already been excised, and doing it again is wrong. */ if (inst->prod->type==JUSTIFICATION_PRODUCTION_TYPE && inst->prod->reference_count > 1) excise_production (inst->prod, FALSE); /* --- mark as no longer in MS, and possibly deallocate --- */ inst->in_ms = FALSE; possibly_deallocate_instantiation (inst); }
/* IMPORTANT: Any changes made to deallocate_preference should also be made to corresponding code in deallocate_instantiation */ void deallocate_preference(agent* thisAgent, preference* pref, bool dont_cache) { /* Remove from temporary memory and match goal if necessary */ if (pref->in_tm) remove_preference_from_tm(thisAgent, pref); if (pref->on_goal_list) remove_from_dll(pref->inst->match_goal->id->preferences_from_goal, pref, all_of_goal_next, all_of_goal_prev); if (pref->inst) { if (!dont_cache) cache_preference_if_necessary(thisAgent, pref); remove_from_dll(pref->inst->preferences_generated, pref, inst_next, inst_prev); possibly_deallocate_instantiation(thisAgent, pref->inst); } /* Clean up contents and deallocate */ deallocate_preference_contents(thisAgent, pref, dont_cache); }
void process_o_rejects_and_deallocate_them(agent* thisAgent, preference* o_rejects, preference_list& bufdeallo) { preference* pref, *next_pref, *p, *next_p; slot* s; for (pref = o_rejects; pref != NIL; pref = pref->next) { preference_add_ref(pref); /* prevents it from being deallocated if it's a clone of some other pref we're about to remove */ } pref = o_rejects; while (pref) { next_pref = pref->next; s = find_slot(pref->id, pref->attr); if (s) { /* remove all pref's in the slot that have the same value */ p = s->all_preferences; while (p) { next_p = p->all_of_slot_next; if (p->value == pref->value) { // Buffer deallocation by adding a reference here and putting it // on a list. These are deallocated after the inner elaboration // loop completes. preference_add_ref(p); bufdeallo.push_back(p); remove_preference_from_tm(thisAgent, p); } p = next_p; } } preference_remove_ref(thisAgent, pref); pref = next_pref; } }