Generated on for Gecode by doxygen 1.15.0
bool-expr.cpp
Go to the documentation of this file.
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2/*
3 * Main authors:
4 * Guido Tack <tack@gecode.dev>
5 * Christian Schulte <schulte@gecode.dev>
6 * Vincent Barichard <Vincent.Barichard@univ-angers.fr>
7 *
8 * Contributing authors:
9 * Alexander Shepil <alexander.shepil@sap.com>
10 * Mikael Zayenz Lagerkvist <lagerkvist@gecode.dev>
11 *
12 * Copyright:
13 * Guido Tack, 2004
14 * Christian Schulte, 2004
15 * Alexander Shepil, 2024
16 * Mikael Zayenz Lagerkvist, 2026
17 * Vincent Barichard, 2012
18 *
19 * This file is part of Gecode, the generic constraint
20 * development environment:
21 * http://www.gecode.dev
22 *
23 * Permission is hereby granted, free of charge, to any person obtaining
24 * a copy of this software and associated documentation files (the
25 * "Software"), to deal in the Software without restriction, including
26 * without limitation the rights to use, copy, modify, merge, publish,
27 * distribute, sublicense, and/or sell copies of the Software, and to
28 * permit persons to whom the Software is furnished to do so, subject to
29 * the following conditions:
30 *
31 * The above copyright notice and this permission notice shall be
32 * included in all copies or substantial portions of the Software.
33 *
34 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
35 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
36 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
37 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
38 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
39 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
40 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
41 *
42 */
43
44#include <gecode/minimodel.hh>
45
46namespace Gecode {
47
50 public:
52 unsigned int use;
54 int same;
58 Node *l, *r;
63#ifdef GECODE_HAS_FLOAT_VARS
66#endif
67#ifdef GECODE_HAS_SET_VARS
70#endif
73
75 Node(void);
77 ~Node(void);
80 bool decrement(void);
82 static void* operator new(size_t size);
84 static void operator delete(void* p, size_t size);
85 };
86
87
88 /*
89 * Operations for nodes
90 *
91 */
93 : use(1), same(0), t(NT_AND), l(nullptr), r(nullptr), m(nullptr) {}
94
96 delete m;
97 }
98
99 void*
100 BoolExpr::Node::operator new(size_t size) {
101#ifdef GECODE_HAS_FAULT_INJECTION
103#endif
104 return heap.ralloc(size);
105 }
106 void
107 BoolExpr::Node::operator delete(void* p, size_t) {
108 heap.rfree(p);
109 }
110
111 bool
113 if (--use == 0) {
114 if ((l != nullptr) && l->decrement())
115 delete l;
116 if ((r != nullptr) && r->decrement())
117 delete r;
118 return true;
119 }
120 return false;
121 }
122
123 BoolExpr::BoolExpr(void) : n(new Node) {}
124
125 BoolExpr::BoolExpr(const BoolExpr& e) : n(e.n) {
126 n->use++;
127 }
128
129 BoolExpr::BoolExpr(const BoolVar& x) : n(new Node) {
130 n->same = 1;
131 n->t = NT_VAR;
132 n->l = nullptr;
133 n->r = nullptr;
134 n->x = x;
135 }
136
137 BoolExpr::BoolExpr(const BoolExpr& l, NodeType t, const BoolExpr& r)
138 : BoolExpr(l,t,r,false) {}
139
140 BoolExpr::BoolExpr(const BoolExpr& l, NodeType t, const BoolExpr& r,
141 bool accumulator) {
142 if (accumulator && ((t == NT_AND) || (t == NT_OR)) &&
143 (l.n->same == 0)) {
144 n = r.n;
145 n->use++;
146 return;
147 }
148 if (accumulator && ((t == NT_AND) || (t == NT_OR)) &&
149 (r.n->same == 0)) {
150 n = l.n;
151 n->use++;
152 return;
153 }
154 n = new Node;
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;
157 n->same = ls+rs;
158 n->t = t;
159 n->l = l.n;
160 n->l->use++;
161 n->r = r.n;
162 n->r->use++;
163 }
164
165 BoolExpr::BoolExpr(const BoolExpr& l, NodeType t) {
166 (void) t;
167 assert(t == NT_NOT);
168 if (l.n->t == NT_NOT) {
169 n = l.n->l;
170 n->use++;
171 } else {
172 n = new Node;
173 n->same = 1;
174 n->t = NT_NOT;
175 n->l = l.n;
176 n->l->use++;
177 n->r = nullptr;
178 }
179 }
180
182 : n(new Node) {
183 n->same = 1;
184 n->t = NT_RLIN;
185 n->l = nullptr;
186 n->r = nullptr;
187 n->rl = rl;
188 }
189
190#ifdef GECODE_HAS_FLOAT_VARS
192 : n(new Node) {
193 n->same = 1;
194 n->t = NT_RLINFLOAT;
195 n->l = nullptr;
196 n->r = nullptr;
197 n->rfl = rfl;
198 }
199#endif
200
201#ifdef GECODE_HAS_SET_VARS
203 : n(new Node) {
204 n->same = 1;
205 n->t = NT_RSET;
206 n->l = nullptr;
207 n->r = nullptr;
208 n->rs = rs;
209 }
210
212 : n(new Node) {
213 n->same = 1;
214 n->t = NT_RSET;
215 n->l = nullptr;
216 n->r = nullptr;
217 n->rs = rs;
218 }
219#endif
220
222 : n(nullptr) {
223 try {
224 n = new Node;
225 } catch (...) {
226 delete m;
227 throw;
228 }
229 n->same = 1;
230 n->t = NT_MISC;
231 n->l = nullptr;
232 n->r = nullptr;
233 n->m = m;
234 }
235
236 const BoolExpr&
237 BoolExpr::operator =(const BoolExpr& e) {
238 if (this != &e) {
239 if (n->decrement())
240 delete n;
241 n = e.n;
242 n->use++;
243 }
244 return *this;
245 }
246
248
250 if (n->decrement())
251 delete n;
252 }
253
254 namespace {
256 class NNF {
257 public:
258 typedef BoolExpr::NodeType NodeType;
259 typedef BoolExpr::Node Node;
261 NodeType t;
263 int p;
265 int n;
267 union {
269 struct {
271 NNF* l;
273 NNF* r;
274 } b;
276 struct {
278 bool neg;
280 Node* x;
281 } a;
282 } u;
284 static NNF* nnf(Region& r, Node* n, bool neg);
287 void post(Home home, NodeType t,
288 BoolVarArgs& bp, BoolVarArgs& bn,
289 int& ip, int& in,
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&);
303 };
304
305 /*
306 * Operations for negation normalform
307 *
308 */
309 forceinline void
310 NNF::operator delete(void*) {}
311
312 forceinline void
313 NNF::operator delete(void*, Region&) {}
314
315 forceinline void*
316 NNF::operator new(size_t s, Region& r) {
317 return r.ralloc(s);
318 }
319
320 BoolVar
321 NNF::expr(Home home, const IntPropLevels& ipls) const {
322 if ((t == BoolExpr::NT_VAR) && !u.a.neg)
323 return u.a.x->x;
324 BoolVar b(home,0,1);
325 switch (t) {
326 case BoolExpr::NT_VAR:
327 assert(u.a.neg);
328 Gecode::rel(home, u.a.x->x, IRT_NQ, b);
329 break;
331 u.a.x->rl.post(home, b, !u.a.neg, ipls);
332 break;
333#ifdef GECODE_HAS_FLOAT_VARS
335 u.a.x->rfl.post(home, b, !u.a.neg);
336 break;
337#endif
338#ifdef GECODE_HAS_SET_VARS
340 u.a.x->rs.post(home, b, !u.a.neg);
341 break;
342#endif
344 u.a.x->m->post(home, b, u.a.neg, ipls);
345 break;
346 case BoolExpr::NT_AND:
347 {
348 BoolVarArgs bp(p), bn(n);
349 int ip=0, in=0;
350 post(home, BoolExpr::NT_AND, bp, bn, ip, in, ipls);
351 clause(home, BOT_AND, bp, bn, b);
352 }
353 break;
354 case BoolExpr::NT_OR:
355 {
356 BoolVarArgs bp(p), bn(n);
357 int ip=0, in=0;
358 post(home, BoolExpr::NT_OR, bp, bn, ip, in, ipls);
359 clause(home, BOT_OR, bp, bn, b);
360 }
361 break;
362 case BoolExpr::NT_EQV:
363 {
364 bool n = false;
365 BoolVar l;
366 if (u.b.l->t == BoolExpr::NT_VAR) {
367 l = u.b.l->u.a.x->x;
368 if (u.b.l->u.a.neg) n = !n;
369 } else {
370 l = u.b.l->expr(home,ipls);
371 }
372 BoolVar r;
373 if (u.b.r->t == BoolExpr::NT_VAR) {
374 r = u.b.r->u.a.x->x;
375 if (u.b.r->u.a.neg) n = !n;
376 } else {
377 r = u.b.r->expr(home,ipls);
378 }
379 Gecode::rel(home, l, n ? BOT_XOR : BOT_EQV, r, b);
380 }
381 break;
382 default:
384 }
385 return b;
386 }
387
388 void
389 NNF::post(Home home, NodeType t,
390 BoolVarArgs& bp, BoolVarArgs& bn,
391 int& ip, int& in,
392 const IntPropLevels& ipls) const {
393 if (this->t != t) {
394 switch (this->t) {
395 case BoolExpr::NT_VAR:
396 if (u.a.neg) {
397 bn[in++]=u.a.x->x;
398 } else {
399 bp[ip++]=u.a.x->x;
400 }
401 break;
403 {
404 BoolVar b(home,0,1);
405 u.a.x->rl.post(home, b, !u.a.neg, ipls);
406 bp[ip++]=b;
407 }
408 break;
409#ifdef GECODE_HAS_FLOAT_VARS
411 {
412 BoolVar b(home,0,1);
413 u.a.x->rfl.post(home, b, !u.a.neg);
414 bp[ip++]=b;
415 }
416 break;
417#endif
418#ifdef GECODE_HAS_SET_VARS
420 {
421 BoolVar b(home,0,1);
422 u.a.x->rs.post(home, b, !u.a.neg);
423 bp[ip++]=b;
424 }
425 break;
426#endif
428 {
429 BoolVar b(home,0,1);
430 u.a.x->m->post(home, b, u.a.neg, ipls);
431 bp[ip++]=b;
432 }
433 break;
434 default:
435 bp[ip++] = expr(home, ipls);
436 break;
437 }
438 } else {
439 u.b.l->post(home, t, bp, bn, ip, in, ipls);
440 u.b.r->post(home, t, bp, bn, ip, in, ipls);
441 }
442 }
443
444 void
445 NNF::rel(Home home, const IntPropLevels& ipls) const {
446 switch (t) {
447 case BoolExpr::NT_VAR:
448 Gecode::rel(home, u.a.x->x, IRT_EQ, u.a.neg ? 0 : 1);
449 break;
451 u.a.x->rl.post(home, !u.a.neg, ipls);
452 break;
453#ifdef GECODE_HAS_FLOAT_VARS
455 u.a.x->rfl.post(home, !u.a.neg);
456 break;
457#endif
458#ifdef GECODE_HAS_SET_VARS
460 u.a.x->rs.post(home, !u.a.neg);
461 break;
462#endif
464 {
465 BoolVar b(home,!u.a.neg,!u.a.neg);
466 u.a.x->m->post(home, b, false, ipls);
467 }
468 break;
469 case BoolExpr::NT_AND:
470 u.b.l->rel(home, ipls);
471 u.b.r->rel(home, ipls);
472 break;
473 case BoolExpr::NT_OR:
474 {
475 BoolVarArgs bp(p), bn(n);
476 int ip=0, in=0;
477 post(home, BoolExpr::NT_OR, bp, bn, ip, in, ipls);
478 clause(home, BOT_OR, bp, bn, 1);
479 }
480 break;
481 case BoolExpr::NT_EQV:
482 if (u.b.l->t==BoolExpr::NT_VAR &&
483 u.b.r->t==BoolExpr::NT_RLIN) {
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);
486 } else if (u.b.r->t==BoolExpr::NT_VAR &&
487 u.b.l->t==BoolExpr::NT_RLIN) {
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);
490 } else if (u.b.l->t==BoolExpr::NT_RLIN) {
491 u.b.l->u.a.x->rl.post(home, u.b.r->expr(home,ipls),
492 !u.b.l->u.a.neg,ipls);
493 } else if (u.b.r->t==BoolExpr::NT_RLIN) {
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
497 } else if (u.b.l->t==BoolExpr::NT_VAR &&
498 u.b.r->t==BoolExpr::NT_RLINFLOAT) {
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);
501 } else if (u.b.r->t==BoolExpr::NT_VAR &&
502 u.b.l->t==BoolExpr::NT_RLINFLOAT) {
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);
505 } else if (u.b.l->t==BoolExpr::NT_RLINFLOAT) {
506 u.b.l->u.a.x->rfl.post(home, u.b.r->expr(home,ipls),
507 !u.b.l->u.a.neg);
508 } else if (u.b.r->t==BoolExpr::NT_RLINFLOAT) {
509 u.b.r->u.a.x->rfl.post(home, u.b.l->expr(home,ipls),
510 !u.b.r->u.a.neg);
511#endif
512#ifdef GECODE_HAS_SET_VARS
513 } else if (u.b.l->t==BoolExpr::NT_VAR &&
514 u.b.r->t==BoolExpr::NT_RSET) {
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);
517 } else if (u.b.r->t==BoolExpr::NT_VAR &&
518 u.b.l->t==BoolExpr::NT_RSET) {
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);
521 } else if (u.b.l->t==BoolExpr::NT_RSET) {
522 u.b.l->u.a.x->rs.post(home, u.b.r->expr(home,ipls),
523 !u.b.l->u.a.neg);
524 } else if (u.b.r->t==BoolExpr::NT_RSET) {
525 u.b.r->u.a.x->rs.post(home, u.b.l->expr(home,ipls),
526 !u.b.r->u.a.neg);
527#endif
528 } else {
529 Gecode::rel(home, expr(home, ipls), IRT_EQ, 1);
530 }
531 break;
532 default:
534 }
535 }
536
537 NNF*
538 NNF::nnf(Region& r, Node* n, bool neg) {
539 if (n->same == 0)
540 throw MiniModel::TooFewArguments("BoolExpr");
541 switch (n->t) {
542 case BoolExpr::NT_VAR:
545 #ifdef GECODE_HAS_FLOAT_VARS
547 #endif
548 #ifdef GECODE_HAS_SET_VARS
550 #endif
551 {
552 NNF* x = new (r) NNF;
553 x->t = n->t; x->u.a.neg = neg; x->u.a.x = n;
554 if (neg) {
555 x->p = 0; x->n = 1;
556 } else {
557 x->p = 1; x->n = 0;
558 }
559 return x;
560 }
561 case BoolExpr::NT_NOT:
562 return nnf(r,n->l,!neg);
564 {
565 NodeType t = ((n->t == BoolExpr::NT_AND) == neg) ?
566 BoolExpr::NT_OR : BoolExpr::NT_AND;
567 NNF* x = new (r) NNF;
568 x->t = t;
569 x->u.b.l = nnf(r,n->l,neg);
570 x->u.b.r = nnf(r,n->r,neg);
571 int p_l, n_l;
572 if ((x->u.b.l->t == t) ||
573 (x->u.b.l->t == BoolExpr::NT_VAR)) {
574 p_l=x->u.b.l->p; n_l=x->u.b.l->n;
575 } else {
576 p_l=1; n_l=0;
577 }
578 int p_r, n_r;
579 if ((x->u.b.r->t == t) ||
580 (x->u.b.r->t == BoolExpr::NT_VAR)) {
581 p_r=x->u.b.r->p; n_r=x->u.b.r->n;
582 } else {
583 p_r=1; n_r=0;
584 }
585 x->p = p_l+p_r;
586 x->n = n_l+n_r;
587 return x;
588 }
589 case BoolExpr::NT_EQV:
590 {
591 NNF* x = new (r) NNF;
592 x->t = BoolExpr::NT_EQV;
593 x->u.b.l = nnf(r,n->l,neg);
594 x->u.b.r = nnf(r,n->r,false);
595 x->p = 2; x->n = 0;
596 return x;
597 }
598 default:
600 }
602 return nullptr;
603 }
604 }
605
606 BoolVar
607 BoolExpr::expr(Home home, const IntPropLevels& ipls) const {
608 Region r;
609 return NNF::nnf(r,n,false)->expr(home,ipls);
610 }
611
612 void
613 BoolExpr::rel(Home home, const IntPropLevels& ipls) const {
614 Region r;
615 return NNF::nnf(r,n,false)->rel(home,ipls);
616 }
617
618
620 operator &&(const BoolExpr& l, const BoolExpr& r) {
621 return BoolExpr(l,BoolExpr::NT_AND,r,true);
622 }
624 operator ||(const BoolExpr& l, const BoolExpr& r) {
625 return BoolExpr(l,BoolExpr::NT_OR,r,true);
626 }
628 operator ^(const BoolExpr& l, const BoolExpr& r) {
630 }
631
634 return BoolExpr(e,BoolExpr::NT_NOT);
635 }
636
638 operator !=(const BoolExpr& l, const BoolExpr& r) {
639 return !BoolExpr(l, BoolExpr::NT_EQV, r);
640 }
642 operator ==(const BoolExpr& l, const BoolExpr& r) {
643 return BoolExpr(l, BoolExpr::NT_EQV, r);
644 }
646 operator >>(const BoolExpr& l, const BoolExpr& r) {
649 }
651 operator <<(const BoolExpr& l, const BoolExpr& r) {
654 }
655
656
657 /*
658 * Posting Boolean expressions and relations
659 *
660 */
661 BoolVar
662 expr(Home home, const BoolExpr& e, const IntPropLevels& ipls) {
663 PostInfo pi(home);
664 if (!home.failed())
665 return e.expr(home,ipls);
666 BoolVar x(home,0,1);
667 return x;
668 }
669
670 void
671 rel(Home home, const BoolExpr& e, const IntPropLevels& ipls) {
673 e.rel(home,ipls);
674 }
675
676 /*
677 * Boolean element constraints
678 *
679 */
680
683 protected:
687 int n;
690 public:
692 BElementExpr(const BoolVarArgs& b, const LinIntExpr& idx);
694 virtual ~BElementExpr(void);
696 virtual void post(Home home, BoolVar b, bool neg,
697 const IntPropLevels& ipls);
698 };
699
701 : a(static_cast<BoolExpr*>(heap.ralloc(sizeof(BoolExpr)*b.size()))), n(b.size()), idx(idx) {
702 for (int i=b.size(); i--;)
703 new (&a[i]) BoolExpr(b[i]);
704 }
705
707 heap.free<BoolExpr>(a,n);
708 }
709
710 void
712 const IntPropLevels& ipls) {
713 IntVar z = idx.post(home, ipls);
714 if (z.assigned() && (z.val() >= 0) && (z.val() < n)) {
715 BoolExpr be = neg ? (a[z.val()] == !b) : (a[z.val()] == b);
716 be.rel(home,ipls);
717 } else {
718 BoolVarArgs x(n);
719 for (int i=n; i--;)
720 x[i] = a[i].expr(home,ipls);
721 BoolVar res = neg ? (!b).expr(home,ipls) : b;
722 element(home, x, z, res, ipls.element());
723 }
724 }
725
727 element(const BoolVarArgs& b, const LinIntExpr& idx) {
728 return BoolExpr(new BElementExpr(b,idx));
729 }
730
731}
732
733// STATISTICS: minimodel-any
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
Definition bool-expr.cpp:49
BoolVar x
Possibly a variable.
Definition bool-expr.cpp:60
~Node(void)
Destructor.
Definition bool-expr.cpp:95
NodeType t
Type of expression.
Definition bool-expr.cpp:56
Node(void)
Default constructor.
Definition bool-expr.cpp:92
LinFloatRel rfl
Possibly a reified float linear relation.
Definition bool-expr.cpp:65
LinIntRel rl
Possibly a reified linear relation.
Definition bool-expr.cpp:62
Node * l
Subexpressions.
Definition bool-expr.cpp:58
SetRel rs
Possibly a reified set relation.
Definition bool-expr.cpp:69
bool decrement(void)
Decrement reference count and possibly free memory.
Misc * m
Possibly a misc Boolean expression.
Definition bool-expr.cpp:72
unsigned int use
Nodes are reference counted.
Definition bool-expr.cpp:52
int same
Number of variables in subtree with same type (for AND and OR).
Definition bool-expr.cpp:54
Boolean expressions.
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_AND
Conjunction.
@ NT_EQV
Equivalence.
@ NT_RLIN
Reified linear relation.
@ NT_VAR
Variable.
@ NT_OR
Disjunction.
@ NT_MISC
Other Boolean expression.
@ NT_NOT
Negation.
@ 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.
Definition int.hh:738
Boolean integer variables.
Definition int.hh:533
FloatNum size(void) const
Return size of float value (distance between maximum and minimum).
Definition val.hpp:78
Home class for posting propagators
Definition core.hpp:863
bool failed(void) const
Check whether corresponding space is failed.
Definition core.hpp:4185
Class for specifying integer propagation levels used by minimodel.
Definition minimodel.hh:109
IntPropLevel element(void) const
Return integer propagation level for element constraints.
Definition ipl.hpp:164
Integer variables.
Definition int.hh:389
int val(void) const
Return assigned value.
Definition int.hpp:56
Linear relations.
Definition minimodel.hh:919
Linear expressions over integer variables.
Definition minimodel.hh:257
Linear relations over integer variables.
Definition minimodel.hh:358
Class to set group information when a post function is executed.
Definition core.hpp:957
Handle to region.
Definition region.hpp:55
Comparison relation (for two-sided comparisons).
Set relations
bool assigned(void) const
Test whether view is assigned.
Definition var.hpp:111
const int * pi[]
Definition photo.cpp:14262
void post(Home home, Term *t, int n, FloatRelType frt, FloatVal c)
Post propagator for linear constraint over floats.
Definition post.cpp:238
Heap heap
The single global heap.
Definition heap.cpp:44
#define GECODE_POST
Check for failure in a constraint post function.
Definition macros.hpp:40
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1)
Post propagator for .
Definition rel.cpp:68
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...
Definition bool.cpp:955
@ IRT_EQ
Equality ( ).
Definition int.hh:960
@ IRT_NQ
Disequality ( ).
Definition int.hh:961
@ BOT_OR
Disjunction.
Definition int.hh:986
@ BOT_EQV
Equivalence.
Definition int.hh:988
@ BOT_XOR
Exclusive or.
Definition int.hh:989
@ BOT_AND
Conjunction.
Definition int.hh:985
#define GECODE_MINIMODEL_EXPORT
Definition minimodel.hh:86
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.
Definition int-expr.cpp:988
Archive & operator<<(Archive &e, FloatNumBranch nl)
Definition val-sel.hpp:39
IntRelType neg(IntRelType irt)
Return negated relation type of irt.
Definition irt.hpp:52
void element(Home home, IntSharedArray n, IntVar x0, IntVar x1, IntPropLevel ipl=IPL_DEF)
Post domain consistent propagator for .
Definition element.cpp:39
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.
Definition filter.cpp:138
Archive & operator>>(Archive &e, FloatNumBranch &nl)
Definition val-sel.hpp:44
bool operator==(const FloatVal &x, const FloatVal &y)
Definition val.hpp:311
bool operator!=(const FloatVal &x, const FloatVal &y)
Definition val.hpp:334
Gecode::FloatVal b(9, 12)
Gecode::FloatVal a(-8, 5)
const int r[4][2]
Definition dom.cpp:152
#define forceinline
Definition config.hpp:141
#define GECODE_NEVER
Assert that this command is never executed.
Definition macros.hpp:56