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