63#ifdef GECODE_HAS_FLOAT_VARS
67#ifdef GECODE_HAS_SET_VARS
82 static void*
operator new(
size_t size);
84 static void operator delete(
void* p,
size_t size);
100 BoolExpr::Node::operator
new(
size_t size) {
101#ifdef GECODE_HAS_FAULT_INJECTION
104 return heap.ralloc(size);
107 BoolExpr::Node::operator
delete(
void* p, size_t) {
114 if ((
l !=
nullptr) &&
l->decrement())
116 if ((
r !=
nullptr) &&
r->decrement())
138 : BoolExpr(l,t,r,false) {}
142 if (accumulator && ((t ==
NT_AND) || (t ==
NT_OR)) &&
148 if (accumulator && ((t ==
NT_AND) || (t ==
NT_OR)) &&
155 int ls = ((l.n->
t == t) || (l.n->
t ==
NT_VAR)) ? l.n->
same : 1;
156 int rs = ((
r.n->t == t) || (
r.n->t ==
NT_VAR)) ?
r.n->same : 1;
190#ifdef GECODE_HAS_FLOAT_VARS
201#ifdef GECODE_HAS_SET_VARS
284 static NNF* nnf(Region& r, Node* n,
bool neg);
287 void post(Home home, NodeType t,
288 BoolVarArgs& bp, BoolVarArgs& bn,
290 const IntPropLevels& ipls)
const;
293 BoolVar
expr(Home home,
const IntPropLevels& ipls)
const;
296 void rel(Home home,
const IntPropLevels& ipls)
const;
298 static void*
operator new(
size_t s, Region&
r);
300 static void operator delete(
void*);
302 static void operator delete(
void*, Region&);
310 NNF::operator
delete(
void*) {}
313 NNF::operator
delete(
void*, Region&) {}
316 NNF::operator
new(
size_t s, Region&
r) {
321 NNF::expr(Home home,
const IntPropLevels& ipls)
const {
331 u.a.x->rl.post(home, b, !u.a.neg, ipls);
333#ifdef GECODE_HAS_FLOAT_VARS
335 u.a.x->rfl.post(home, b, !u.a.neg);
338#ifdef GECODE_HAS_SET_VARS
340 u.a.x->rs.post(home, b, !u.a.neg);
344 u.a.x->m->post(home, b, u.a.neg, ipls);
348 BoolVarArgs bp(p), bn(n);
356 BoolVarArgs bp(p), bn(n);
368 if (u.b.l->u.a.neg) n = !n;
370 l = u.b.l->expr(home,ipls);
375 if (u.b.r->u.a.neg) n = !n;
377 r = u.b.r->expr(home,ipls);
390 BoolVarArgs& bp, BoolVarArgs& bn,
392 const IntPropLevels& ipls)
const {
405 u.a.x->rl.post(home, b, !u.a.neg, ipls);
409#ifdef GECODE_HAS_FLOAT_VARS
413 u.a.x->rfl.post(home, b, !u.a.neg);
418#ifdef GECODE_HAS_SET_VARS
422 u.a.x->rs.post(home, b, !u.a.neg);
430 u.a.x->m->post(home, b, u.a.neg, ipls);
435 bp[ip++] =
expr(home, ipls);
439 u.b.l->post(home, t, bp, bn, ip, in, ipls);
440 u.b.r->post(home, t, bp, bn, ip, in, ipls);
445 NNF::rel(Home home,
const IntPropLevels& ipls)
const {
451 u.a.x->rl.post(home, !u.a.neg, ipls);
453#ifdef GECODE_HAS_FLOAT_VARS
455 u.a.x->rfl.post(home, !u.a.neg);
458#ifdef GECODE_HAS_SET_VARS
460 u.a.x->rs.post(home, !u.a.neg);
465 BoolVar
b(home,!u.a.neg,!u.a.neg);
466 u.a.x->m->post(home, b,
false, ipls);
470 u.b.l->rel(home, ipls);
471 u.b.r->rel(home, ipls);
475 BoolVarArgs bp(p), bn(n);
484 u.b.r->u.a.x->rl.post(home, u.b.l->u.a.x->x,
485 u.b.l->u.a.neg==u.b.r->u.a.neg, ipls);
488 u.b.l->u.a.x->rl.post(home, u.b.r->u.a.x->x,
489 u.b.l->u.a.neg==u.b.r->u.a.neg, ipls);
491 u.b.l->u.a.x->rl.post(home, u.b.r->expr(home,ipls),
492 !u.b.l->u.a.neg,ipls);
494 u.b.r->u.a.x->rl.post(home, u.b.l->expr(home,ipls),
495 !u.b.r->u.a.neg,ipls);
496#ifdef GECODE_HAS_FLOAT_VARS
499 u.b.r->u.a.x->rfl.post(home, u.b.l->u.a.x->x,
500 u.b.l->u.a.neg==u.b.r->u.a.neg);
503 u.b.l->u.a.x->rfl.post(home, u.b.r->u.a.x->x,
504 u.b.l->u.a.neg==u.b.r->u.a.neg);
506 u.b.l->u.a.x->rfl.post(home, u.b.r->expr(home,ipls),
509 u.b.r->u.a.x->rfl.post(home, u.b.l->expr(home,ipls),
512#ifdef GECODE_HAS_SET_VARS
515 u.b.r->u.a.x->rs.post(home, u.b.l->u.a.x->x,
516 u.b.l->u.a.neg==u.b.r->u.a.neg);
519 u.b.l->u.a.x->rs.post(home, u.b.r->u.a.x->x,
520 u.b.l->u.a.neg==u.b.r->u.a.neg);
522 u.b.l->u.a.x->rs.post(home, u.b.r->expr(home,ipls),
525 u.b.r->u.a.x->rs.post(home, u.b.l->expr(home,ipls),
538 NNF::nnf(Region& r,
Node* n,
bool neg) {
540 throw MiniModel::TooFewArguments(
"BoolExpr");
545 #ifdef GECODE_HAS_FLOAT_VARS
548 #ifdef GECODE_HAS_SET_VARS
552 NNF* x =
new (
r) NNF;
553 x->t = n->t; x->u.a.neg =
neg; x->u.a.x = n;
562 return nnf(r,n->l,!
neg);
567 NNF* x =
new (
r) NNF;
569 x->u.b.l = nnf(r,n->l,
neg);
570 x->u.b.r = nnf(r,n->r,
neg);
572 if ((x->u.b.l->t == t) ||
574 p_l=x->u.b.l->p; n_l=x->u.b.l->n;
579 if ((x->u.b.r->t == t) ||
581 p_r=x->u.b.r->p; n_r=x->u.b.r->n;
591 NNF* x =
new (
r) NNF;
593 x->u.b.l = nnf(r,n->l,
neg);
594 x->u.b.r = nnf(r,n->r,
false);
609 return NNF::nnf(r,n,
false)->expr(home,ipls);
615 return NNF::nnf(r,n,
false)->rel(home,ipls);
665 return e.
expr(home,ipls);
702 for (
int i=b.
size(); i--;)
720 x[i] =
a[i].
expr(home,ipls);
Boolean element expressions.
LinIntExpr idx
The linear expression for the index.
int n
The number of Boolean expressions.
virtual void post(Home home, BoolVar b, bool neg, const IntPropLevels &ipls)
Constrain b to be equivalent to the expression (negated if neg).
virtual ~BElementExpr(void)
Destructor.
BElementExpr(const BoolVarArgs &b, const LinIntExpr &idx)
Constructor.
BoolExpr * a
The Boolean expressions.
Miscealloneous Boolean expressions.
virtual ~Misc(void)
Destructor.
Node for Boolean expression
BoolVar x
Possibly a variable.
NodeType t
Type of expression.
Node(void)
Default constructor.
LinFloatRel rfl
Possibly a reified float linear relation.
LinIntRel rl
Possibly a reified linear relation.
SetRel rs
Possibly a reified set relation.
bool decrement(void)
Decrement reference count and possibly free memory.
Misc * m
Possibly a misc Boolean expression.
unsigned int use
Nodes are reference counted.
int same
Number of variables in subtree with same type (for AND and OR).
friend BoolExpr operator||(const BoolExpr &, const BoolExpr &)
friend BoolExpr operator&&(const BoolExpr &, const BoolExpr &)
NodeType
Type of Boolean expression.
@ NT_RLINFLOAT
Reified linear relation.
@ NT_RLIN
Reified linear relation.
@ NT_MISC
Other Boolean expression.
@ NT_RSET
Reified set relation.
const BoolExpr & operator=(const BoolExpr &e)
Assignment operator.
BoolVar expr(Home home, const IntPropLevels &ipls) const
Post propagators for expression.
~BoolExpr(void)
Destructor.
void rel(Home home, const IntPropLevels &ipls) const
Post propagators for relation.
Passing Boolean variables.
Boolean integer variables.
FloatNum size(void) const
Return size of float value (distance between maximum and minimum).
Home class for posting propagators
bool failed(void) const
Check whether corresponding space is failed.
Class for specifying integer propagation levels used by minimodel.
IntPropLevel element(void) const
Return integer propagation level for element constraints.
int val(void) const
Return assigned value.
Linear expressions over integer variables.
Linear relations over integer variables.
Class to set group information when a post function is executed.
Comparison relation (for two-sided comparisons).
bool assigned(void) const
Test whether view is assigned.
void post(Home home, Term *t, int n, FloatRelType frt, FloatVal c)
Post propagator for linear constraint over floats.
Heap heap
The single global heap.
#define GECODE_POST
Check for failure in a constraint post function.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1)
Post propagator for .
void clause(Home home, BoolOpType o, const BoolVarArgs &x, const BoolVarArgs &y, BoolVar z, IntPropLevel ipl=IPL_DEF)
Post domain consistent propagator for Boolean clause with positive variables x and negative variables...
#define GECODE_MINIMODEL_EXPORT
void check(Phase p)
Check failpoint for phase p.
Gecode toplevel namespace
IntVar expr(Home home, const LinIntExpr &e, const IntPropLevels &ipls=IntPropLevels::def)
Post linear expression and return its value.
Archive & operator<<(Archive &e, FloatNumBranch nl)
IntRelType neg(IntRelType irt)
Return negated relation type of irt.
void element(Home home, IntSharedArray n, IntVar x0, IntVar x1, IntPropLevel ipl=IPL_DEF)
Post domain consistent propagator for .
BoolExpr operator!(const BoolExpr &)
Negated Boolean expression.
BoolExpr operator^(const BoolExpr &, const BoolExpr &)
Exclusive-or of Boolean expressions.
TFE post(PropagatorGroup g)
Only post functions (but not propagators) from g are considered.
Archive & operator>>(Archive &e, FloatNumBranch &nl)
bool operator==(const FloatVal &x, const FloatVal &y)
bool operator!=(const FloatVal &x, const FloatVal &y)
Gecode::FloatVal b(9, 12)
Gecode::FloatVal a(-8, 5)
#define GECODE_NEVER
Assert that this command is never executed.