61 #ifdef GECODE_HAS_FLOAT_VARS
65 #ifdef GECODE_HAS_SET_VARS
80 static void*
operator new(
size_t size);
82 static void operator delete(
void*
p,
size_t size);
95 BoolExpr::Node::operator
new(
size_t size) {
99 BoolExpr::Node::operator
delete(
void*
p, size_t) {
106 if ((
l != NULL) &&
l->decrement())
108 if ((
r != NULL) &&
r->decrement())
131 int ls = ((l.n->
t ==
t) || (l.n->
t ==
NT_VAR)) ? l.n->
same : 1;
132 int rs = ((r.n->
t == t) || (r.n->
t ==
NT_VAR)) ? r.n->
same : 1;
166 #ifdef GECODE_HAS_FLOAT_VARS
177 #ifdef GECODE_HAS_SET_VARS
255 static NNF* nnf(Region&
r, Node* n,
bool neg);
259 BoolVarArgs& bp, BoolVarArgs& bn,
269 static void*
operator new(
size_t s, Region&
r);
271 static void operator delete(
void*);
273 static void operator delete(
void*, Region&);
281 NNF::operator
delete(
void*) {}
284 NNF::operator
delete(
void*, Region&) {}
287 NNF::operator
new(
size_t s, Region&
r) {
302 u.a.x->rl.post(home,
b, !
u.a.neg, icl);
304 #ifdef GECODE_HAS_FLOAT_VARS
306 u.a.x->rfl.post(home,
b, !
u.a.neg);
309 #ifdef GECODE_HAS_SET_VARS
311 u.a.x->rs.post(home,
b, !
u.a.neg);
315 u.a.x->m->post(home,
b, !
u.a.neg, icl);
319 BoolVarArgs bp(
p), bn(n);
327 BoolVarArgs bp(
p), bn(n);
339 if (
u.b.l->u.a.neg) n = !n;
341 l =
u.b.l->expr(home,icl);
346 if (
u.b.r->u.a.neg) n = !n;
348 r =
u.b.r->expr(home,icl);
361 BoolVarArgs& bp, BoolVarArgs& bn,
376 u.a.x->rl.post(home,
b, !
u.a.neg, icl);
380 #ifdef GECODE_HAS_FLOAT_VARS
384 u.a.x->rfl.post(home,
b, !
u.a.neg);
389 #ifdef GECODE_HAS_SET_VARS
393 u.a.x->rs.post(home,
b, !
u.a.neg);
401 u.a.x->m->post(home,
b, !
u.a.neg, icl);
406 bp[ip++] =
expr(home, icl);
410 u.b.l->post(home, t, bp, bn, ip, in, icl);
411 u.b.r->post(home, t, bp, bn, ip, in, icl);
422 u.a.x->rl.post(home, !
u.a.neg, icl);
424 #ifdef GECODE_HAS_FLOAT_VARS
426 u.a.x->rfl.post(home, !
u.a.neg);
429 #ifdef GECODE_HAS_SET_VARS
431 u.a.x->rs.post(home, !
u.a.neg);
436 BoolVar
b(home,!
u.a.neg,!
u.a.neg);
437 u.a.x->m->post(home,
b,
false, icl);
441 u.b.l->rel(home, icl);
442 u.b.r->rel(home, icl);
446 BoolVarArgs bp(
p), bn(n);
455 u.b.r->u.a.x->rl.post(home,
u.b.l->u.a.x->x,
456 u.b.l->u.a.neg==
u.b.r->u.a.neg, icl);
459 u.b.l->u.a.x->rl.post(home,
u.b.r->u.a.x->x,
460 u.b.l->u.a.neg==
u.b.r->u.a.neg, icl);
462 u.b.l->u.a.x->rl.post(home,
u.b.r->expr(home,icl),
463 !
u.b.l->u.a.neg,icl);
465 u.b.r->u.a.x->rl.post(home,
u.b.l->expr(home,icl),
466 !
u.b.r->u.a.neg,icl);
467 #ifdef GECODE_HAS_FLOAT_VARS
470 u.b.r->u.a.x->rfl.post(home,
u.b.l->u.a.x->x,
471 u.b.l->u.a.neg==
u.b.r->u.a.neg);
474 u.b.l->u.a.x->rfl.post(home,
u.b.r->u.a.x->x,
475 u.b.l->u.a.neg==
u.b.r->u.a.neg);
477 u.b.l->u.a.x->rfl.post(home,
u.b.r->expr(home,icl),
480 u.b.r->u.a.x->rfl.post(home,
u.b.l->expr(home,icl),
483 #ifdef GECODE_HAS_SET_VARS
486 u.b.r->u.a.x->rs.post(home,
u.b.l->u.a.x->x,
487 u.b.l->u.a.neg==
u.b.r->u.a.neg);
490 u.b.l->u.a.x->rs.post(home,
u.b.r->u.a.x->x,
491 u.b.l->u.a.neg==
u.b.r->u.a.neg);
493 u.b.l->u.a.x->rs.post(home,
u.b.r->expr(home,icl),
496 u.b.r->u.a.x->rs.post(home,
u.b.l->expr(home,icl),
509 NNF::nnf(Region& r, Node* n,
bool neg) {
514 #ifdef GECODE_HAS_FLOAT_VARS
517 #ifdef GECODE_HAS_SET_VARS
521 NNF*
x =
new (
r) NNF;
522 x->t = n->t; x->u.a.neg =
neg; x->u.a.x = n;
531 return nnf(r,n->l,!neg);
536 NNF* x =
new (
r) NNF;
538 x->u.b.l = nnf(r,n->l,neg);
539 x->u.b.r = nnf(r,n->r,neg);
541 if ((x->u.b.l->t == t) ||
543 p_l=x->u.b.l->p; n_l=x->u.b.l->n;
548 if ((x->u.b.r->t == t) ||
550 p_r=x->u.b.r->p; n_r=x->u.b.r->n;
560 NNF* x =
new (
r) NNF;
562 x->u.b.l = nnf(r,n->l,neg);
563 x->u.b.r = nnf(r,n->r,
false);
578 return NNF::nnf(r,n,
false)->expr(home,icl);
584 return NNF::nnf(r,n,
false)->rel(home,icl);
631 return e.
expr(home,icl);
638 if (home.
failed())
return;
689 for (
int i=b.
size();
i--;)