void split_domain()

in grolp/gen/ff_planner/inst_pre.c [3072:3248]


void split_domain( void )

{

  int i, j, m, s = 0, mn;
  Effect *e;
  WffNode *w, *ww, *www;
  NormOperator *tmp_op;
  Fact *tmp_ft;

  for ( i = 0; i < MAX_TYPES; i++ ) {
    gnum_intersected_types[i] = -1;
  }

  for ( i = 0; i < gnum_operators; i++ ) {
    if ( (m = is_dnf( goperators[i]->preconds )) != -1 ) {
      for ( e = goperators[i]->effects; e; e = e->next ) {
	if ( is_dnf( e->conditions ) == -1 ) {
	  break;
	}
      }
      if ( !e ) {
	goperators[i]->hard = FALSE;
	s += m;
      }
    }
  }

  ghard_operators = ( Operator_pointer * ) calloc( MAX_OPERATORS, sizeof( Operator ) );
  gnum_hard_operators = 0; 
  geasy_operators = ( NormOperator_pointer * ) calloc( s, sizeof( NormOperator_pointer ) );
  gnum_easy_operators = 0;

  for ( i = 0; i < gnum_operators; i++ ) {
    if ( goperators[i]->hard ) {
      ghard_operators[gnum_hard_operators++] = goperators[i];
      continue;
    }
    w = goperators[i]->preconds;
    switch ( w->connective ) {
    case OR:
      for ( ww = w->sons; ww; ww = ww->next ) {
	tmp_op = new_NormOperator( goperators[i] );
	if ( ww->connective == AND ) {
	  m = 0;
	  mn = 0;
	  for ( www = ww->sons; www; www = www->next ) {
	    if ( www->connective == ATOM ) m++;
	    if ( www->connective == COMP ) mn++;
	  }
	  tmp_op->preconds = ( Fact * ) calloc( m, sizeof( Fact ) );
	  tmp_op->numeric_preconds_comp = ( Comparator * ) calloc( mn, sizeof( Comparator ) );
	  tmp_op->numeric_preconds_lh = ( ExpNode_pointer * ) calloc( mn, sizeof( ExpNode_pointer ) );
	  tmp_op->numeric_preconds_rh = ( ExpNode_pointer * ) calloc( mn, sizeof( ExpNode_pointer ) );
	  for ( www = ww->sons; www; www = www->next ) {
	    if ( www->connective == ATOM ) {
	      tmp_ft = &(tmp_op->preconds[tmp_op->num_preconds]);
	      tmp_ft->predicate = www->fact->predicate;
	      for ( j = 0; j < garity[tmp_ft->predicate]; j++ ) {
		tmp_ft->args[j] = www->fact->args[j];
	      }
	      tmp_op->num_preconds++;
	    }
	    if ( www->connective == COMP ) {
	      tmp_op->numeric_preconds_comp[tmp_op->num_numeric_preconds] = www->comp;
	      tmp_op->numeric_preconds_lh[tmp_op->num_numeric_preconds] = copy_Exp( www->lh );
	      tmp_op->numeric_preconds_rh[tmp_op->num_numeric_preconds] = copy_Exp( www->rh );
	      tmp_op->num_numeric_preconds++;
	    }
	  }
	} else {
	  if ( ww->connective == ATOM ) {
	    tmp_op->preconds = ( Fact * ) calloc( 1, sizeof( Fact ) );
	    tmp_ft = &(tmp_op->preconds[0]);
	    tmp_ft->predicate = ww->fact->predicate;
	    for ( j = 0; j < garity[tmp_ft->predicate]; j++ ) {
	      tmp_ft->args[j] = ww->fact->args[j];
	    }
	    tmp_op->num_preconds = 1;
	  }
	  if ( ww->connective == COMP ) {
	    tmp_op->numeric_preconds_comp = ( Comparator * ) calloc( 1, sizeof( Comparator ) );
	    tmp_op->numeric_preconds_lh = ( ExpNode_pointer * ) calloc( 1, sizeof( ExpNode_pointer ) );
	    tmp_op->numeric_preconds_rh = ( ExpNode_pointer * ) calloc( 1, sizeof( ExpNode_pointer ) );
	    tmp_op->numeric_preconds_comp[0] = ww->comp;
	    tmp_op->numeric_preconds_lh[0] = copy_Exp( ww->lh );
	    tmp_op->numeric_preconds_rh[0] = copy_Exp( ww->rh );
	    tmp_op->num_numeric_preconds = 1;
	  }
	}
	make_normal_effects( &tmp_op, goperators[i] );
	geasy_operators[gnum_easy_operators++] = tmp_op;
      }
      break;
    case AND:
      tmp_op = new_NormOperator( goperators[i] );
      m = 0; 
      mn = 0;
      for ( ww = w->sons; ww; ww = ww->next ) {
	if ( ww->connective == ATOM ) m++;
	if ( ww->connective == COMP ) mn++;
      }
      tmp_op->preconds = ( Fact * ) calloc( m, sizeof( Fact ) );
      tmp_op->numeric_preconds_comp = ( Comparator * ) calloc( mn, sizeof( Comparator ) );
      tmp_op->numeric_preconds_lh = ( ExpNode_pointer * ) calloc( mn, sizeof( ExpNode_pointer ) );
      tmp_op->numeric_preconds_rh = ( ExpNode_pointer * ) calloc( mn, sizeof( ExpNode_pointer ) );
      for ( ww = w->sons; ww; ww = ww->next ) {
	if ( ww->connective == ATOM ) {
	  tmp_ft = &(tmp_op->preconds[tmp_op->num_preconds]);
	  tmp_ft->predicate = ww->fact->predicate;
	  for ( j = 0; j < garity[tmp_ft->predicate]; j++ ) {
	    tmp_ft->args[j] = ww->fact->args[j];
	  }
	  tmp_op->num_preconds++;
	}
	if ( ww->connective == COMP ) {
	  tmp_op->numeric_preconds_comp[tmp_op->num_numeric_preconds] = ww->comp;
	  tmp_op->numeric_preconds_lh[tmp_op->num_numeric_preconds] = copy_Exp( ww->lh );
	  tmp_op->numeric_preconds_rh[tmp_op->num_numeric_preconds] = copy_Exp( ww->rh );
	  tmp_op->num_numeric_preconds++;
	}
      }
      make_normal_effects( &tmp_op, goperators[i] );
      geasy_operators[gnum_easy_operators++] = tmp_op;
      break;
    case ATOM:
      tmp_op = new_NormOperator( goperators[i] );
      tmp_op->preconds = ( Fact * ) calloc( 1, sizeof( Fact ) );
      tmp_ft = &(tmp_op->preconds[0]);
      tmp_ft->predicate = w->fact->predicate;
      for ( j = 0; j < garity[tmp_ft->predicate]; j++ ) {
	tmp_ft->args[j] = w->fact->args[j];
      }
      tmp_op->num_preconds = 1;
      make_normal_effects( &tmp_op, goperators[i] );
      geasy_operators[gnum_easy_operators++] = tmp_op;
      break;
    case COMP:
      tmp_op = new_NormOperator( goperators[i] );
      tmp_op->numeric_preconds_comp = ( Comparator * ) calloc( 1, sizeof( Comparator ) );
      tmp_op->numeric_preconds_lh = ( ExpNode_pointer * ) calloc( 1, sizeof( ExpNode_pointer ) );
      tmp_op->numeric_preconds_rh = ( ExpNode_pointer * ) calloc( 1, sizeof( ExpNode_pointer ) );
      tmp_op->numeric_preconds_comp[0] = w->comp;
      tmp_op->numeric_preconds_lh[0] = copy_Exp( w->lh );
      tmp_op->numeric_preconds_rh[0] = copy_Exp( w->rh );
      tmp_op->num_numeric_preconds = 1;
      make_normal_effects( &tmp_op, goperators[i] );
      geasy_operators[gnum_easy_operators++] = tmp_op;
      break;
    case TRU:
      tmp_op = new_NormOperator( goperators[i] );
      make_normal_effects( &tmp_op, goperators[i] );
      geasy_operators[gnum_easy_operators++] = tmp_op;
      break;
    case FAL:
      break;
    default:
      printf("\nwon't get here: non OR, AND, ATOM, TRUE, FALSE in dnf. debug me\n\n");
      exit( 1 );
    }
  }

  if ( gcmd_line.display_info == 109 ) {
    printf("\n\nsplitted operators are:\n");
    
    printf("\nEASY:\n");
    for ( i = 0; i < gnum_easy_operators; i++ ) {
      print_NormOperator( geasy_operators[i] );
    }

    printf("\n\n\nHARD:\n");
    for ( i = 0; i < gnum_hard_operators; i++ ) {
      print_Operator( ghard_operators[i] );
    }
  } 

}