42 #ifdef GECODE_HAS_SET_VARS
78 static void*
operator new(
size_t size);
80 static void operator delete(
void*
p,
size_t size);
90 SetExpr::Node::operator
new(
size_t size) {
94 SetExpr::Node::operator
delete(
void*
p, size_t) {
101 if ((
l != NULL) &&
l->decrement())
103 if ((
r != NULL) &&
r->decrement())
140 static NNF* nnf(Region&
r, Node* n,
bool neg);
153 static void*
operator new(
size_t s, Region&
r);
155 static void operator delete(
void*);
157 static void operator delete(
void*, Region&);
165 NNF::operator
delete(
void*) {}
168 NNF::operator
delete(
void*, Region&) {}
171 NNF::operator
new(
size_t s, Region&
r) {
191 rel(home,
u.a.x->x, srt, bc);
195 rel(home,
u.a.x->x, srt, s);
201 IntSetRanges sr(
u.a.x->s);
202 Set::RangesCompl<IntSetRanges> src(sr);
212 dom(home, s, srt, ss);
217 IntVar iv =
u.a.x->e.post(home,
ICL_DEF);
242 rel(home, bc, srt, s);
261 rel(home, bc, srt, s);
298 rel(home, br, srt, bc);
309 rel(home, br, srt, s);
336 rel(home,
u.a.x->x, srt, bc, b);
340 rel(home,
u.a.x->x, srt, s, b);
346 IntSetRanges sr(
u.a.x->s);
347 Set::RangesCompl<IntSetRanges> src(sr);
352 dom(home, s, srt, ss, b);
357 IntVar iv =
u.a.x->e.post(home,
ICL_DEF);
362 rel(home,ic,srt,s,b);
364 rel(home,iv,srt,s,b);
375 rel(home, br, srt, s, b);
386 rel(home, br, srt, s, b);
406 rel(home, br, srt, bc);
413 rel(home, br, srt, s, b);
446 u.b.l->post(home, t, b, i);
447 u.b.r->post(home, t, b, i);
454 post(home,srt,n->u.a.x->x);
460 default: n_srt = srt;
462 n->post(home,n_srt,
this);
476 post(home,srt,n->u.a.x->x,b);
482 default: n_srt = srt;
484 n->post(home,b,
true,n_srt,
this);
491 }
else if (srt ==
SRT_EQ) {
493 }
else if (srt ==
SRT_NQ) {
496 BoolVar nb(home,0,1);
498 post(home,nb,
true,srt,n);
503 NNF::nnf(Region&
r, Node* n,
bool neg) {
509 NNF*
x =
new (
r) NNF;
510 x->t = n->t; x->neg =
neg; x->u.a.x = n;
519 return nnf(r,n->l,!neg);
526 t = n->t; xneg =
neg; neg =
false;
532 NNF* x =
new (
r) NNF;
535 x->u.b.l = nnf(r,n->l,neg);
536 x->u.b.r = nnf(r,n->r,neg);
539 p_l=x->u.b.l->p; n_l=x->u.b.l->n;
545 p_r=x->u.b.r->p; n_r=x->u.b.r->n;
616 if (n != NULL && n->decrement())
625 if (n != NULL && n->decrement())
638 NNF::nnf(r,n,
false)->post(home,
SRT_EQ,s);
645 return NNF::nnf(r,n,
false)->post(home,srt,NNF::nnf(r,e.n,
false));
651 return NNF::nnf(r,n,
false)->post(home,b,t,srt,
652 NNF::nnf(r,e.n,
false));
685 for (
int i=1; i<x.
size(); i++)
694 for (
int i=1; i<x.
size(); i++)
703 for (
int i=1; i<x.
size(); i++)
708 namespace MiniModel {
725 IntVar m = result(home,ret);
731 min(home, e.post(home), m);
734 max(home, e.post(home), m);
744 if (t==SNLE_CARD && irt!=
IRT_NQ) {
749 static_cast<unsigned int>(
c));
754 static_cast<unsigned int>(c-1));
758 static_cast<unsigned int>(
c),
763 static_cast<unsigned int>(c+1),
768 static_cast<unsigned int>(
c),
769 static_cast<unsigned int>(c));
774 }
else if (t==SNLE_MIN && (irt==
IRT_GR || irt==
IRT_GQ)) {
775 c = (irt==
IRT_GQ ? c : c+1);
777 }
else if (t==SNLE_MAX && (irt==
IRT_LE || irt==
IRT_LQ)) {
778 c = (irt==
IRT_LQ ? c : c-1);
781 rel(home,
post(home,NULL,icl), irt, c);
787 c = (irt==
IRT_GQ ? c : c+1);
789 }
else if (t==SNLE_MAX && (irt==
IRT_LE || irt==
IRT_LQ)) {
790 c = (irt==
IRT_LQ ? c : c-1);
793 rel(home,
post(home,NULL,icl), irt, c, b);