in grolp/gen/ff_planner/inst_final.c [505:803]
void collect_relevant_facts_and_fluents( void )
{
Action *a;
NormOperator *no;
NormEffect *ne;
int i, j, adr, size;
PseudoAction *pa;
PseudoActionEffect *pae;
FluentValues *fvs;
/* facts: 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++;
}
}
}
}
}
/* fluents: collect all that are defined in initial state, plus
* all that are assigned to by an effect of an action
* (i.e. preconds poss. pos. due to reachability)
*
* first initialise fast access structures
*/
for ( i = 0; i < gnum_functions; i++ ) {
size = 1;
for ( j = 0; j < gf_arity[i]; j++ ) {
size *= gnum_constants;
}
lf_def[i] = ( int_pointer ) calloc( size, sizeof( int ) );
lf_index[i] = ( int_pointer ) calloc( size, sizeof( int ) );
for ( j = 0; j < size; j++ ) {
lf_def[i][j] = 0;
lf_index[i][j] = -1;
}
}
/* from initial state, only those that are not static.
*/
for ( fvs = gf_initial; fvs; fvs = fvs->next ) {
lf = fvs->fluent.function;
for ( j = 0; j < gf_arity[lf]; j++ ) {
lf_args[j] = fvs->fluent.args[j];
}
adr = fluent_adress();
if ( !lf_def[lf][adr] ) {
lf_def[lf][adr] = 1;
if ( gnum_relevant_fluents == MAX_RELEVANT_FLUENTS ) {
printf("\ntoo many relevant fluents! increase MAX_RELEVANT_FLUENTS (currently %d)\n\n",
MAX_RELEVANT_FLUENTS);
exit( 1 );
}
grelevant_fluents[gnum_relevant_fluents].function = lf;
grelevant_fluents_name[gnum_relevant_fluents] =
( char * ) calloc( MAX_LENGTH, sizeof( char ) );
strcpy( grelevant_fluents_name[gnum_relevant_fluents], gfunctions[lf] );
for ( j = 0; j < gf_arity[lf]; j++ ) {
grelevant_fluents[gnum_relevant_fluents].args[j] = lf_args[j];
strcat( grelevant_fluents_name[gnum_relevant_fluents], "_" );
strcat( grelevant_fluents_name[gnum_relevant_fluents], gconstants[lf_args[j]] );
}
lf_index[lf][adr] = gnum_relevant_fluents;
gnum_relevant_fluents++;
} else {
printf("\n\nfluent ");
print_Fluent( &(fvs->fluent) );
printf(" defined twice in initial state! check input files\n\n");
exit( 1 );
}
}
/* from actions, all assigns (are non-static anyway)
*/
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_numeric_effects; i++ ) {
if ( ne->numeric_effects_neft[i] != ASSIGN ) continue;
lf = ne->numeric_effects_fluent[i].function;
for ( j = 0; j < gf_arity[lf]; j++ ) {
lf_args[j] = ( ne->numeric_effects_fluent[i].args[j] >= 0 ) ?
ne->numeric_effects_fluent[i].args[j] :
a->inst_table[DECODE_VAR( ne->numeric_effects_fluent[i].args[j] )];
}
adr = fluent_adress();
if ( !lf_def[lf][adr] ) {
lf_def[lf][adr] = 1;
if ( gnum_relevant_fluents == MAX_RELEVANT_FLUENTS ) {
printf("\ntoo many relevant fluents! increase MAX_RELEVANT_FLUENTS (currently %d)\n\n",
MAX_RELEVANT_FLUENTS);
exit( 1 );
}
grelevant_fluents[gnum_relevant_fluents].function = lf;
grelevant_fluents_name[gnum_relevant_fluents] =
( char * ) calloc( MAX_LENGTH, sizeof( char ) );
strcpy( grelevant_fluents_name[gnum_relevant_fluents], gfunctions[lf] );
for ( j = 0; j < gf_arity[lf]; j++ ) {
grelevant_fluents[gnum_relevant_fluents].args[j] = lf_args[j];
strcat( grelevant_fluents_name[gnum_relevant_fluents], "_" );
strcat( grelevant_fluents_name[gnum_relevant_fluents], gconstants[lf_args[j]] );
}
lf_index[lf][adr] = gnum_relevant_fluents;
gnum_relevant_fluents++;
}
}
}
} else {
pa = a->pseudo_action;
for ( pae = pa->effects; pae; pae = pae->next ) {
for ( i = 0; i < pae->num_numeric_effects; i++ ) {
if ( pae->numeric_effects_neft[i] != ASSIGN ) continue;
lf = pae->numeric_effects_fluent[i].function;
for ( j = 0; j < gf_arity[lf]; j++ ) {
lf_args[j] = ( pae->numeric_effects_fluent[i].args[j] >= 0 ) ?
pae->numeric_effects_fluent[i].args[j] :
a->inst_table[DECODE_VAR( pae->numeric_effects_fluent[i].args[j] )];
}
adr = fluent_adress();
if ( !lf_def[lf][adr] ) {
lf_def[lf][adr] = 1;
if ( gnum_relevant_fluents == MAX_RELEVANT_FLUENTS ) {
printf("\ntoo many relevant fluents! increase MAX_RELEVANT_FLUENTS (currently %d)\n\n",
MAX_RELEVANT_FLUENTS);
exit( 1 );
}
grelevant_fluents[gnum_relevant_fluents].function = lf;
grelevant_fluents_name[gnum_relevant_fluents] =
( char * ) calloc( MAX_LENGTH, sizeof( char ) );
strcpy( grelevant_fluents_name[gnum_relevant_fluents], gfunctions[lf] );
for ( j = 0; j < gf_arity[lf]; j++ ) {
grelevant_fluents[gnum_relevant_fluents].args[j] = lf_args[j];
strcat( grelevant_fluents_name[gnum_relevant_fluents], "_" );
strcat( grelevant_fluents_name[gnum_relevant_fluents], gconstants[lf_args[j]] );
}
lf_index[lf][adr] = gnum_relevant_fluents;
gnum_relevant_fluents++;
}
}
}
}
}
if ( gcmd_line.display_info == 119 ) {
printf("\n\nfacts selected as relevant:");
for ( i = 0; i < gnum_relevant_facts; i++ ) {
printf("\n%d: ", i);
print_Fact( &(grelevant_facts[i]) );
}
printf("\n\nfluents selected as relevant:");
for ( i = 0; i < gnum_relevant_fluents; i++ ) {
printf("\n%d: ", i);
print_Fluent( &(grelevant_fluents[i]) );
}
printf("\n\n");
}
lnum_effects = 0;
create_final_goal_state();
create_final_initial_state();
create_final_actions();
if ( gmetric != NULL ) {
if ( !set_relevants_in_exp( &gmetric ) ) {
if ( gcmd_line.display_info ) {
printf("\nwarning: undefined fluent used in optimization expression. defaulting to plan length");
}
free_ExpNode( gmetric );
gmetric = NULL;
}
}
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");
print_State( ginitial_state );
printf("\n\nfinal goal is:\n\n");
for ( i = 0; i < gnum_logic_goal; i++ ) {
print_ft_name( glogic_goal[i] );
printf("\n");
}
for ( i = 0; i < gnum_numeric_goal; i++ ) {
switch ( gnumeric_goal_comp[i] ) {
case LE:
printf("(< ");
break;
case LEQ:
printf("(<= ");
break;
case EQ:
printf("(= ");
break;
case GEQ:
printf("(>= ");
break;
case GE:
printf("(> ");
break;
default:
printf("\nwrong comparator in gnumeric_goal %d\n\n", gnumeric_goal_comp[i]);
exit( 1 );
}
print_ExpNode( gnumeric_goal_lh[i] );
print_ExpNode( gnumeric_goal_rh[i] );
printf(")\n");
}
if ( gmetric ) {
printf("\n\nmetric is (minimize):\n");
print_ExpNode( gmetric );
} else {
printf("\n\nmetric: none, i.e. plan length\n");
}
}
}