in grolp/gen/ff_planner/inst_hard.c [379:583]
void create_hard_mixed_operators( Operator *o, int curr_var )
{
int t, i, m, mn;
WffNode *tmp1, *w, *ww;
MixedOperator *tmp2;
if ( curr_var < o->num_vars ) {
if ( o->removed[curr_var] ) {
/* param doesn't matter -- select any appropriate type constant
* at least one there; otherwise, op would not have been translated.
*/
linst_table[curr_var] = gtype_consts[o->var_types[curr_var]][0];
create_hard_mixed_operators( o, curr_var + 1 );
linst_table[curr_var] = -1;
return;
}
t = o->var_types[curr_var];
for ( i = 0; i < gtype_size[t]; i++ ) {
linst_table[curr_var] = gtype_consts[t][i];
create_hard_mixed_operators( o, curr_var + 1 );
linst_table[curr_var] = -1;
}
return;
}
tmp1 = instantiate_wff( o->preconds );
if ( tmp1->connective == FAL ) {
free_WffNode( tmp1 );
return;
}
dnf( &tmp1 );
cleanup_wff( &tmp1 );
if ( tmp1->connective == FAL ) {
free_WffNode( tmp1 );
return;
}
/* only debugging, REMOVE LATER
*/
if ( is_dnf( tmp1 ) == -1 ) {
printf("\n\nILLEGAL DNF %s AFTER INSTANTIATION\n\n", o->name);
print_Wff( tmp1, 0 );
exit( 1 );
}
switch ( tmp1->connective ) {
case OR:
for ( w = tmp1->sons; w; w = w->next ) {
tmp2 = new_MixedOperator( o );
for ( i = 0; i < o->num_vars; i++ ) {
tmp2->inst_table[i] = linst_table[i];
}
if ( w->connective == AND ) {
m = 0;
mn = 0;
for ( ww = w->sons; ww; ww = ww->next ) {
if ( ww->connective == ATOM ) m++;
if ( ww->connective == COMP ) mn++;
}
tmp2->preconds = ( Fact * ) calloc( m, sizeof( Fact ) );
tmp2->numeric_preconds_comp = ( Comparator * ) calloc( mn, sizeof( Comparator ) );
tmp2->numeric_preconds_lh = ( ExpNode_pointer * ) calloc( mn, sizeof( ExpNode_pointer ) );
tmp2->numeric_preconds_rh = ( ExpNode_pointer * ) calloc( mn, sizeof( ExpNode_pointer ) );
tmp2->num_preconds = m;
tmp2->num_numeric_preconds = mn;
m = 0; mn = 0;
for ( ww = w->sons; ww; ww = ww->next ) {
if ( ww->connective == ATOM ) {
tmp2->preconds[m].predicate = ww->fact->predicate;
for ( i = 0; i < garity[ww->fact->predicate]; i++ ) {
tmp2->preconds[m].args[i] = ww->fact->args[i];
}
m++;
}
if ( ww->connective == COMP ) {
tmp2->numeric_preconds_comp[mn] = ww->comp;
tmp2->numeric_preconds_lh[mn] = copy_Exp( ww->lh );
tmp2->numeric_preconds_rh[mn] = copy_Exp( ww->rh );
mn++;
}
}
} else {
if ( w->connective == ATOM ) {
tmp2->preconds = ( Fact * ) calloc( 1, sizeof( Fact ) );
tmp2->num_preconds = 1;
tmp2->preconds[0].predicate = w->fact->predicate;
for ( i = 0; i < garity[w->fact->predicate]; i++ ) {
tmp2->preconds[0].args[i] = w->fact->args[i];
}
}
if ( w->connective == COMP ) {
tmp2->numeric_preconds_comp = ( Comparator * ) calloc( 1, sizeof( Comparator ) );
tmp2->numeric_preconds_lh = ( ExpNode_pointer * ) calloc( 1, sizeof( ExpNode_pointer ) );
tmp2->numeric_preconds_rh = ( ExpNode_pointer * ) calloc( 1, sizeof( ExpNode_pointer ) );
tmp2->numeric_preconds_comp[0] = w->comp;
tmp2->numeric_preconds_lh[0] = copy_Exp( w->lh );
tmp2->numeric_preconds_rh[0] = copy_Exp( w->rh );
tmp2->num_numeric_preconds = 1;
}
}
tmp2->effects = instantiate_Effect( o->effects );
tmp2->next = ghard_mixed_operators;
ghard_mixed_operators = tmp2;
gnum_hard_mixed_operators++;
}
break;
case AND:
tmp2 = new_MixedOperator( o );
for ( i = 0; i < o->num_vars; i++ ) {
tmp2->inst_table[i] = linst_table[i];
}
m = 0;
mn = 0;
for ( w = tmp1->sons; w; w = w->next ) {
if ( w->connective == ATOM ) m++;
if ( w->connective == COMP ) mn++;
}
tmp2->preconds = ( Fact * ) calloc( m, sizeof( Fact ) );
tmp2->numeric_preconds_comp = ( Comparator * ) calloc( mn, sizeof( Comparator ) );
tmp2->numeric_preconds_lh = ( ExpNode_pointer * ) calloc( mn, sizeof( ExpNode_pointer ) );
tmp2->numeric_preconds_rh = ( ExpNode_pointer * ) calloc( mn, sizeof( ExpNode_pointer ) );
tmp2->num_preconds = m;
tmp2->num_numeric_preconds = mn;
m = 0; mn = 0;
for ( w = tmp1->sons; w; w = w->next ) {
if ( w->connective == ATOM ) {
tmp2->preconds[m].predicate = w->fact->predicate;
for ( i = 0; i < garity[w->fact->predicate]; i++ ) {
tmp2->preconds[m].args[i] = w->fact->args[i];
}
m++;
}
if ( w->connective == COMP ) {
tmp2->numeric_preconds_comp[mn] = w->comp;
tmp2->numeric_preconds_lh[mn] = copy_Exp( w->lh );
tmp2->numeric_preconds_rh[mn] = copy_Exp( w->rh );
mn++;
}
}
tmp2->effects = instantiate_Effect( o->effects );
tmp2->next = ghard_mixed_operators;
ghard_mixed_operators = tmp2;
gnum_hard_mixed_operators++;
break;
case ATOM:
tmp2 = new_MixedOperator( o );
for ( i = 0; i < o->num_vars; i++ ) {
tmp2->inst_table[i] = linst_table[i];
}
tmp2->preconds = ( Fact * ) calloc( 1, sizeof( Fact ) );
tmp2->num_preconds = 1;
tmp2->preconds[0].predicate = tmp1->fact->predicate;
for ( i = 0; i < garity[tmp1->fact->predicate]; i++ ) {
tmp2->preconds[0].args[i] = tmp1->fact->args[i];
}
tmp2->effects = instantiate_Effect( o->effects );
tmp2->next = ghard_mixed_operators;
ghard_mixed_operators = tmp2;
gnum_hard_mixed_operators++;
break;
case COMP:
tmp2 = new_MixedOperator( o );
for ( i = 0; i < o->num_vars; i++ ) {
tmp2->inst_table[i] = linst_table[i];
}
tmp2->numeric_preconds_comp = ( Comparator * ) calloc( 1, sizeof( Comparator ) );
tmp2->numeric_preconds_lh = ( ExpNode_pointer * ) calloc( 1, sizeof( ExpNode_pointer ) );
tmp2->numeric_preconds_rh = ( ExpNode_pointer * ) calloc( 1, sizeof( ExpNode_pointer ) );
tmp2->numeric_preconds_comp[0] = tmp1->comp;
tmp2->numeric_preconds_lh[0] = copy_Exp( tmp1->lh );
tmp2->numeric_preconds_rh[0] = copy_Exp( tmp1->rh );
tmp2->num_numeric_preconds = 1;
tmp2->effects = instantiate_Effect( o->effects );
tmp2->next = ghard_mixed_operators;
ghard_mixed_operators = tmp2;
gnum_hard_mixed_operators++;
break;
case TRU:
tmp2 = new_MixedOperator( o );
for ( i = 0; i < o->num_vars; i++ ) {
tmp2->inst_table[i] = linst_table[i];
}
tmp2->effects = instantiate_Effect( o->effects );
tmp2->next = ghard_mixed_operators;
ghard_mixed_operators = tmp2;
gnum_hard_mixed_operators++;
break;
default:
printf("\n\nillegal connective %d in parsing DNF precond.\n\n",
tmp1->connective);
exit( 1 );
}
free_WffNode( tmp1 );
}