void collect_relevant_facts_and_fluents()

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");
    }
  }

}