void collect_relevant_facts( void ) { Action *a; NormOperator *no; NormEffect *ne; int i, j, adr; PseudoAction *pa; PseudoActionEffect *pae; /* mark all deleted facts; such facts, that are also pos, are relevant. */ for ( a = gactions; a; a = a->next ) { if ( a->norm_operator ) { no = a->norm_operator; for ( ne = no->effects; ne; ne = ne->next ) { for ( i = 0; i < ne->num_dels; i++ ) { lp = ne->dels[i].predicate; for ( j = 0; j < garity[lp]; j++ ) { largs[j] = ( ne->dels[i].args[j] >= 0 ) ? ne->dels[i].args[j] : a->inst_table[DECODE_VAR( ne->dels[i].args[j] )]; } adr = fact_adress(); lneg[lp][adr] = 1; if ( lpos[lp][adr] && !luse[lp][adr] ) { luse[lp][adr] = 1; lindex[lp][adr] = gnum_relevant_facts; if ( gnum_relevant_facts == MAX_RELEVANT_FACTS ) { printf("\nincrease MAX_RELEVANT_FACTS! (current value: %d)\n\n", MAX_RELEVANT_FACTS); exit( 1 ); } grelevant_facts[gnum_relevant_facts].predicate = lp; for ( j = 0; j < garity[lp]; j++ ) { grelevant_facts[gnum_relevant_facts].args[j] = largs[j]; } lindex[lp][adr] = gnum_relevant_facts; gnum_relevant_facts++; } } } } else { pa = a->pseudo_action; for ( pae = pa->effects; pae; pae = pae->next ) { for ( i = 0; i < pae->num_dels; i++ ) { lp = pae->dels[i].predicate; for ( j = 0; j < garity[lp]; j++ ) { largs[j] = pae->dels[i].args[j]; } adr = fact_adress(); lneg[lp][adr] = 1; if ( lpos[lp][adr] && !luse[lp][adr] ) { luse[lp][adr] = 1; lindex[lp][adr] = gnum_relevant_facts; if ( gnum_relevant_facts == MAX_RELEVANT_FACTS ) { printf("\nincrease MAX_RELEVANT_FACTS! (current value: %d)\n\n", MAX_RELEVANT_FACTS); exit( 1 ); } grelevant_facts[gnum_relevant_facts].predicate = lp; for ( j = 0; j < garity[lp]; j++ ) { grelevant_facts[gnum_relevant_facts].args[j] = largs[j]; } lindex[lp][adr] = gnum_relevant_facts; gnum_relevant_facts++; } } } } } if ( gcmd_line.display_info == 119 ) { printf("\n\nfacts selected as relevant:\n\n"); for ( i = 0; i < gnum_relevant_facts; i++ ) { printf("\n%d: ", i); print_Fact( &(grelevant_facts[i]) ); } } lnum_effects = 0; // Chih-Wei if (GpG.SearchModal != -2) create_final_goal_state(); create_final_initial_state(); create_final_actions(); if ( gcmd_line.display_info == 120 ) { printf("\n\nfinal domain representation is:\n\n"); for ( i = 0; i < gnum_operators; i++ ) { printf("\n\n------------------operator %s-----------\n\n", goperators[i]->name); for ( a = gactions; a; a = a->next ) { if ( ( !a->norm_operator && !a->pseudo_action ) || ( a->norm_operator && a->norm_operator->operator != goperators[i] ) || ( a->pseudo_action && a->pseudo_action->operator != goperators[i] ) ) { continue; } print_Action( a ); } } printf("\n\n--------------------GOAL REACHED ops-----------\n\n"); for ( a = gactions; a; a = a->next ) { if ( !a->norm_operator && !a->pseudo_action ) { print_Action( a ); } } printf("\n\nfinal initial state is:\n\n"); for ( i = 0; i < ginitial_state.num_F; i++ ) { print_ft_name( ginitial_state.F[i] ); printf("\n"); } printf("\n\nfinal goal state is:\n\n"); for ( i = 0; i < ggoal_state.num_F; i++ ) { print_ft_name( ggoal_state.F[i] ); printf("\n"); } } }
void collect_relevant_facts( void ) { Action *a; Operator *o; int i, j, adr; /* mark all deleted facts; such facts, that are also pos, are relevant. */ for ( a = gactions; a; a = a->next ) { o = goperators[a->op]; for ( i = 0; i < o->num_dels; i++ ) { lp = o->dels[i].predicate; for ( j = 0; j < garity[lp]; j++ ) { largs[j] = GET_CONSTANT( o->dels[i].args[j], a ); } adr = fact_adress(); lneg[lp][adr] = 1; if ( lpos[lp][adr] && !luse[lp][adr] ) { luse[lp][adr] = 1; lindex[lp][adr] = gnum_relevant_facts; if ( gnum_relevant_facts == MAX_RELEVANT_FACTS ) { printf("\nincrease MAX_RELEVANT_FACTS! (current value: %d)\n\n", MAX_RELEVANT_FACTS); exit( 1 ); } grelevant_facts[gnum_relevant_facts].predicate = lp; for ( j = 0; j < garity[lp]; j++ ) { grelevant_facts[gnum_relevant_facts].args[j] = largs[j]; } lindex[lp][adr] = gnum_relevant_facts; gnum_relevant_facts++; } } } /* now build final action instances */ for ( a = gactions; a; a = a->next ) { o = goperators[a->op]; for ( i = 0; i < o->num_preconds; i++ ) { lp = o->preconds[i].predicate; for ( j = 0; j < garity[lp]; j++ ) { largs[j] = GET_CONSTANT( o->preconds[i].args[j], a ); } adr = fact_adress(); if ( !lneg[lp][adr] ) { continue; } a->preconds[a->num_preconds++] = lindex[lp][adr]; } for ( i = 0; i < o->num_adds; i++ ) { lp = o->adds[i].predicate; for ( j = 0; j < garity[lp]; j++ ) { largs[j] = GET_CONSTANT( o->adds[i].args[j], a ); } adr = fact_adress(); if ( !lneg[lp][adr] ) { continue; } a->adds[a->num_adds++] = lindex[lp][adr]; } for ( i = 0; i < o->num_dels; i++ ) { lp = o->dels[i].predicate; for ( j = 0; j < garity[lp]; j++ ) { largs[j] = GET_CONSTANT( o->dels[i].args[j], a ); } adr = fact_adress(); if ( !lpos[lp][adr] ) { continue; } a->dels[a->num_dels++] = lindex[lp][adr]; } } /* build final initial and goal representation */ ginitial_state.num_F = 0; for ( i = 0; i < gnum_initial; i++ ) { lp = ginitial[i].predicate; for ( j = 0; j < garity[lp]; j++ ) { largs[j] = ginitial[i].args[j]; } adr = fact_adress(); if ( !lneg[lp][adr] ) { continue; } ginitial_state.F[ginitial_state.num_F++] = lindex[lp][adr]; } ggoal_state.num_F = 0; for ( i = 0; i < gnum_goal; i++ ) { lp = ggoal[i].predicate; for ( j = 0; j < garity[lp]; j++ ) { largs[j] = ggoal[i].args[j]; } adr = fact_adress(); if ( !lneg[lp][adr] ) { continue; } ggoal_state.F[ggoal_state.num_F++] = lindex[lp][adr]; } if ( gcmd_line.display_info == 110 ) { printf("\n\nfinal domain representation:"); printf("\n\nall actions:"); for ( a = gactions; a; a = a->next ) { print_Action( a ); } printf("\n\ninitial_state:"); for ( i = 0; i < ginitial_state.num_F; i++ ) { printf("\n"); print_ft_name( ginitial_state.F[i] ); } printf("\n\ngoal_state:"); for ( i = 0; i < ggoal_state.num_F; i++ ) { printf("\n"); print_ft_name( ggoal_state.F[i] ); } } }