43#ifdef GECODE_HAS_SET_VARS
46#ifdef GECODE_HAS_FLOAT_VARS
61 std::map<std::string,poster>::iterator i = r.find(ce.
id);
64 std::string(
"Constraint ")+ce.
id+
" not found", ce.
ann);
66 i->second(s, ce, ce.
ann);
72 r[
"gecode_" + id] = p;
85 void p_distinctOffset(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
88 AST::Array* offs = ce.args->a[0]->getArray();
90 for (
int i=offs->a.size(); i--; ) {
91 oa[i] = offs->a[i]->getInt();
98 IntVarArgs va = s.arg2intvarargs(ce[0]);
104 if (ce[0]->isIntVar()) {
105 if (ce[1]->isIntVar()) {
106 rel(s, s.arg2IntVar(ce[0]), irt, s.arg2IntVar(ce[1]),
109 rel(s, s.arg2IntVar(ce[0]), irt, ce[1]->getInt(), s.ann2ipl(ann));
112 rel(s, s.arg2IntVar(ce[1]),
swap(irt), ce[0]->getInt(),
117 p_int_CMP(s,
IRT_EQ, ce, ann);
120 p_int_CMP(s,
IRT_NQ, ce, ann);
123 p_int_CMP(s,
IRT_GQ, ce, ann);
126 p_int_CMP(s,
IRT_GR, ce, ann);
129 p_int_CMP(s,
IRT_LQ, ce, ann);
132 p_int_CMP(s,
IRT_LE, ce, ann);
136 if (rm ==
RM_EQV && ce[2]->isBool()) {
137 if (ce[2]->getBool()) {
138 p_int_CMP(s, irt, ce, ann);
140 p_int_CMP(s,
neg(irt), ce, ann);
144 if (ce[0]->isIntVar()) {
145 if (ce[1]->isIntVar()) {
146 rel(s, s.arg2IntVar(ce[0]), irt, s.arg2IntVar(ce[1]),
147 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
149 rel(s, s.arg2IntVar(ce[0]), irt, ce[1]->getInt(),
150 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
153 rel(s, s.arg2IntVar(ce[1]),
swap(irt), ce[0]->getInt(),
154 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
200 IntArgs ia = s.arg2intargs(ce[0]);
202 if (s.isBoolArray(ce[1],singleIntVar)) {
203 if (singleIntVar != -1) {
204 if (std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
205 IntVar siv = s.arg2IntVar(ce[1]->getArray()->a[singleIntVar]);
206 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar);
207 IntArgs ia_tmp(ia.size()-1);
209 for (
int i=0;
i<ia.
size();
i++) {
210 if (i != singleIntVar)
211 ia_tmp[
count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
214 linear(s, ia_tmp, iv, t, siv, s.ann2ipl(ann));
216 IntVarArgs iv = s.arg2intvarargs(ce[1]);
217 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
220 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
221 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
224 IntVarArgs iv = s.arg2intvarargs(ce[1]);
225 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
230 if (rm ==
RM_EQV && ce[2]->isBool()) {
231 if (ce[2]->getBool()) {
232 p_int_lin_CMP(s, irt, ce, ann);
234 p_int_lin_CMP(s,
neg(irt), ce, ann);
238 IntArgs ia = s.arg2intargs(ce[0]);
240 if (s.isBoolArray(ce[1],singleIntVar)) {
241 if (singleIntVar != -1) {
242 if (std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
243 IntVar siv = s.arg2IntVar(ce[1]->getArray()->a[singleIntVar]);
244 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar);
245 IntArgs ia_tmp(ia.size()-1);
247 for (
int i=0;
i<ia.
size();
i++) {
248 if (i != singleIntVar)
249 ia_tmp[
count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
252 linear(s, ia_tmp, iv, t, siv, Reify(s.arg2BoolVar(ce[3]), rm),
255 IntVarArgs iv = s.arg2intvarargs(ce[1]);
256 linear(s, ia, iv, irt, ce[2]->getInt(),
257 Reify(s.arg2BoolVar(ce[3]), rm), s.ann2ipl(ann));
260 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
261 linear(s, ia, iv, irt, ce[2]->getInt(),
262 Reify(s.arg2BoolVar(ce[3]), rm), s.ann2ipl(ann));
265 IntVarArgs iv = s.arg2intvarargs(ce[1]);
266 linear(s, ia, iv, irt, ce[2]->getInt(),
267 Reify(s.arg2BoolVar(ce[3]), rm),
272 p_int_lin_CMP(s,
IRT_EQ, ce, ann);
281 p_int_lin_CMP(s,
IRT_NQ, ce, ann);
290 p_int_lin_CMP(s,
IRT_LQ, ce, ann);
299 p_int_lin_CMP(s,
IRT_LE, ce, ann);
308 p_int_lin_CMP(s,
IRT_GQ, ce, ann);
317 p_int_lin_CMP(s,
IRT_GR, ce, ann);
328 IntArgs ia = s.arg2intargs(ce[0]);
329 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
330 if (ce[2]->isIntVar())
331 linear(s, ia, iv, irt, s.iv[ce[2]->getIntVar()], s.ann2ipl(ann));
333 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
337 if (rm ==
RM_EQV && ce[2]->isBool()) {
338 if (ce[2]->getBool()) {
339 p_bool_lin_CMP(s, irt, ce, ann);
341 p_bool_lin_CMP(s,
neg(irt), ce, ann);
345 IntArgs ia = s.arg2intargs(ce[0]);
346 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
347 if (ce[2]->isIntVar())
348 linear(s, ia, iv, irt, s.iv[ce[2]->getIntVar()],
349 Reify(s.arg2BoolVar(ce[3]), rm),
352 linear(s, ia, iv, irt, ce[2]->getInt(),
353 Reify(s.arg2BoolVar(ce[3]), rm),
357 p_bool_lin_CMP(s,
IRT_EQ, ce, ann);
368 p_bool_lin_CMP(s,
IRT_NQ, ce, ann);
379 p_bool_lin_CMP(s,
IRT_LQ, ce, ann);
391 p_bool_lin_CMP(s,
IRT_LE, ce, ann);
402 p_bool_lin_CMP(s,
IRT_GQ, ce, ann);
413 p_bool_lin_CMP(s,
IRT_GR, ce, ann);
427 if (!ce[0]->isIntVar()) {
428 rel(s, ce[0]->getInt() + s.arg2IntVar(ce[1])
429 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
430 }
else if (!ce[1]->isIntVar()) {
431 rel(s, s.arg2IntVar(ce[0]) + ce[1]->getInt()
432 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
433 }
else if (!ce[2]->isIntVar()) {
434 rel(s, s.arg2IntVar(ce[0]) + s.arg2IntVar(ce[1])
435 == ce[2]->getInt(), s.ann2ipl(ann));
437 rel(s, s.arg2IntVar(ce[0]) + s.arg2IntVar(ce[1])
438 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
443 if (!ce[0]->isIntVar()) {
444 rel(s, ce[0]->getInt() - s.arg2IntVar(ce[1])
445 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
446 }
else if (!ce[1]->isIntVar()) {
447 rel(s, s.arg2IntVar(ce[0]) - ce[1]->getInt()
448 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
449 }
else if (!ce[2]->isIntVar()) {
450 rel(s, s.arg2IntVar(ce[0]) - s.arg2IntVar(ce[1])
451 == ce[2]->getInt(), s.ann2ipl(ann));
453 rel(s, s.arg2IntVar(ce[0]) - s.arg2IntVar(ce[1])
454 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
459 IntVar x0 = s.arg2IntVar(ce[0]);
460 IntVar x1 = s.arg2IntVar(ce[1]);
461 IntVar x2 = s.arg2IntVar(ce[2]);
462 mult(s, x0, x1, x2, s.ann2ipl(ann));
465 IntVar x0 = s.arg2IntVar(ce[0]);
466 IntVar x2 = s.arg2IntVar(ce[2]);
467 pow(s, x0, ce[1]->getInt(), x2, s.ann2ipl(ann));
470 IntVar x0 = s.arg2IntVar(ce[0]);
471 IntVar x1 = s.arg2IntVar(ce[1]);
472 IntVar x2 = s.arg2IntVar(ce[2]);
473 IntVarArgs x = {x0, x1, x2};
475 div(s,x[0],x[1],x[2], s.ann2ipl(ann));
478 IntVar x0 = s.arg2IntVar(ce[0]);
479 IntVar x1 = s.arg2IntVar(ce[1]);
480 IntVar x2 = s.arg2IntVar(ce[2]);
481 IntVarArgs x = {x0, x1, x2};
483 mod(s,x[0],x[1],x[2], s.ann2ipl(ann));
487 IntVar x0 = s.arg2IntVar(ce[0]);
488 IntVar x1 = s.arg2IntVar(ce[1]);
489 IntVar x2 = s.arg2IntVar(ce[2]);
490 min(s, x0, x1, x2, s.ann2ipl(ann));
493 IntVar x0 = s.arg2IntVar(ce[0]);
494 IntVar x1 = s.arg2IntVar(ce[1]);
495 IntVar x2 = s.arg2IntVar(ce[2]);
496 max(s, x0, x1, x2, s.ann2ipl(ann));
499 IntVar x0 = s.arg2IntVar(ce[0]);
500 IntVar x1 = s.arg2IntVar(ce[1]);
501 rel(s, x0 == -x1, s.ann2ipl(ann));
507 rel(s, s.arg2BoolVar(ce[0]), irt, s.arg2BoolVar(ce[1]),
512 rel(s, s.arg2BoolVar(ce[0]), irt, s.arg2BoolVar(ce[1]),
513 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
516 p_bool_CMP(s,
IRT_EQ, ce, ann);
525 p_bool_CMP(s,
IRT_NQ, ce, ann);
534 p_bool_CMP(s,
IRT_GQ, ce, ann);
543 p_bool_CMP(s,
IRT_LQ, ce, ann);
552 p_bool_CMP(s,
IRT_GR, ce, ann);
561 p_bool_CMP(s,
IRT_LE, ce, ann);
571 BoolVar b0 = s.arg2BoolVar(ce[0]); \
572 BoolVar b1 = s.arg2BoolVar(ce[1]); \
573 if (ce[2]->isBool()) { \
574 rel(s, b0, op, b1, ce[2]->getBool(), s.ann2ipl(ann)); \
576 rel(s, b0, op, b1, s.bv[ce[2]->getBoolVar()], s.ann2ipl(ann)); \
579#define BOOL_ARRAY_OP(op) \
580 BoolVarArgs bv = s.arg2boolvarargs(ce[0]); \
581 if (ce.size()==1) { \
582 rel(s, op, bv, 1, s.ann2ipl(ann)); \
583 } else if (ce[1]->isBool()) { \
584 rel(s, op, bv, ce[1]->getBool(), s.ann2ipl(ann)); \
586 rel(s, op, bv, s.bv[ce[1]->getBoolVar()], s.ann2ipl(ann)); \
589 void p_bool_or(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
593 BoolVar b0 = s.arg2BoolVar(ce[0]);
594 BoolVar
b1 = s.arg2BoolVar(ce[1]);
595 BoolVar
b2 = s.arg2BoolVar(ce[2]);
596 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
603 BoolVar b0 = s.arg2BoolVar(ce[0]);
604 BoolVar
b1 = s.arg2BoolVar(ce[1]);
605 BoolVar
b2 = s.arg2BoolVar(ce[2]);
616 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
617 BoolVar
b1 = s.arg2BoolVar(ce[1]);
618 for (
unsigned int i=bv.size(); i--;)
619 rel(s, b1,
BOT_IMP, bv[i], 1, s.ann2ipl(ann));
628 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
629 BoolVar
b1 = s.arg2BoolVar(ce[1]);
630 clause(s,
BOT_OR, bv, BoolVarArgs()<<b1, 1, s.ann2ipl(ann));
639 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
642 rel(s, s.arg2BoolVar(ce[1]),
BOT_IMP, tmp, 1);
646 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
647 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
652 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
653 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
654 BoolVar b0 = s.arg2BoolVar(ce[2]);
659 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
660 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
661 BoolVar b0 = s.arg2BoolVar(ce[2]);
668 BoolVar b0 = s.arg2BoolVar(ce[0]);
669 BoolVar
b1 = s.arg2BoolVar(ce[1]);
670 BoolVar
b2 = s.arg2BoolVar(ce[2]);
671 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
673 clause(s,
BOT_OR, BoolVarArgs(), BoolVarArgs()<<b0<<b1<<b2, 1,
677 BoolVar b0 = s.arg2BoolVar(ce[0]);
678 BoolVar
b1 = s.arg2BoolVar(ce[1]);
679 if (ce[2]->isBool()) {
680 rel(s, b1,
BOT_IMP, b0, ce[2]->getBool(), s.ann2ipl(ann));
682 rel(s, b1,
BOT_IMP, b0, s.bv[ce[2]->getBoolVar()], s.ann2ipl(ann));
689 BoolVar x0 = s.arg2BoolVar(ce[0]);
690 BoolVar x1 = s.arg2BoolVar(ce[1]);
697 bool isConstant =
true;
699 for (
int i=
a->a.
size(); i--;) {
700 if (!
a->a[i]->isInt()) {
705 IntVar selector = s.arg2IntVar(ce[0]);
706 rel(s, selector > 0);
709 element(s, sia, selector, -1, s.arg2IntVar(ce[2]), s.ann2ipl(ann));
711 IntVarArgs iv = s.arg2intvarargs(ce[1]);
712 element(s, iv, selector, -1, s.arg2IntVar(ce[2]), s.ann2ipl(ann));
717 bool isConstant =
true;
719 for (
int i=
a->a.
size(); i--;) {
720 if (!
a->a[i]->isInt()) {
725 IntVar selector = s.arg2IntVar(ce[0]);
726 int offset = ce[1]->getInt();
727 rel(s, selector >= offset);
730 element(s, sia, selector, -offset, s.arg2IntVar(ce[3]), s.ann2ipl(ann));
732 IntVarArgs iv = s.arg2intvarargs(ce[2]);
733 element(s, iv, selector, -offset, s.arg2IntVar(ce[3]), s.ann2ipl(ann));
738 bool isConstant =
true;
740 for (
int i=
a->a.
size(); i--;) {
741 if (!
a->a[i]->isInt()) {
746 IntVar selector0 = s.arg2IntVar(ce[0]);
747 IntVar selector1 = s.arg2IntVar(ce[1]);
748 IntSet idxset0 = s.arg2intset(ce[3]);
749 IntSet idxset1 = s.arg2intset(ce[4]);
751 int w = idxset1.size();
752 int s1off = idxset1.min();
753 int h = idxset0.size();
754 int s0off = idxset0.min();
758 element(s, sia, selector1, -s1off, w, selector0, -s0off, h, s.arg2IntVar(ce[5]), s.ann2ipl(ann));
760 IntVarArgs iv = s.arg2intvarargs(ce[2], 0);
761 element(s, iv, selector1, -s1off, w, selector0, -s0off, h, s.arg2IntVar(ce[5]), s.ann2ipl(ann));
766 bool isConstant =
true;
768 for (
int i=
a->a.
size(); i--;) {
769 if (!
a->a[i]->isBool()) {
774 IntVar selector = s.arg2IntVar(ce[0]);
775 rel(s, selector > 0);
778 element(s, sia, selector, s.arg2BoolVar(ce[2]), s.ann2ipl(ann));
780 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 1);
781 element(s, iv, selector, s.arg2BoolVar(ce[2]), s.ann2ipl(ann));
786 bool isConstant =
true;
788 for (
int i=
a->a.
size(); i--;) {
789 if (!
a->a[i]->isBool()) {
794 IntVar selector = s.arg2IntVar(ce[0]);
795 int offset = ce[1]->getInt();
796 rel(s, selector >= offset);
799 element(s, sia, selector, -offset, s.arg2BoolVar(ce[3]), s.ann2ipl(ann));
801 BoolVarArgs iv = s.arg2boolvarargs(ce[2]);
802 element(s, iv, selector, -offset, s.arg2BoolVar(ce[3]), s.ann2ipl(ann));
807 bool isConstant =
true;
809 for (
int i=
a->a.
size(); i--;) {
810 if (!
a->a[i]->isBool()) {
815 IntVar selector0 = s.arg2IntVar(ce[0]);
816 IntVar selector1 = s.arg2IntVar(ce[1]);
817 IntSet idxset0 = s.arg2intset(ce[3]);
818 IntSet idxset1 = s.arg2intset(ce[4]);
820 int w = idxset1.size();
821 int s1off = idxset1.min();
822 int h = idxset0.size();
823 int s0off = idxset0.min();
827 element(s, sia, selector1, -s1off, w, selector0, -s0off, h, s.arg2BoolVar(ce[5]), s.ann2ipl(ann));
829 BoolVarArgs iv = s.arg2boolvarargs(ce[2], 0);
830 element(s, iv, selector1, -s1off, w, selector0, -s0off, h, s.arg2BoolVar(ce[5]), s.ann2ipl(ann));
836 BoolVar x0 = s.arg2BoolVar(ce[0]);
837 IntVar x1 = s.arg2IntVar(ce[1]);
838 if (ce[0]->isBoolVar() && ce[1]->isIntVar()) {
839 s.aliasBool2Int(ce[1]->getIntVar(), ce[0]->getBoolVar());
841 channel(s, x0, x1, s.ann2ipl(ann));
845 IntSet d = s.arg2intset(ce[1]);
846 if (ce[0]->isBoolVar()) {
848 Iter::Ranges::Singleton sr(0,1);
849 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
851 if (d01.size() == 0) {
854 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
855 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
858 dom(s, s.arg2IntVar(ce[0]), d);
862 IntSet d = s.arg2intset(ce[1]);
863 if (ce[0]->isBoolVar()) {
865 Iter::Ranges::Singleton sr(0,1);
866 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
868 if (d01.size() == 0) {
869 rel(s, s.arg2BoolVar(ce[2]) == 0);
870 }
else if (d01.max() == 0) {
871 rel(s, s.arg2BoolVar(ce[2]) == !s.arg2BoolVar(ce[0]));
872 }
else if (d01.min() == 1) {
873 rel(s, s.arg2BoolVar(ce[2]) == s.arg2BoolVar(ce[0]));
875 rel(s, s.arg2BoolVar(ce[2]) == 1);
878 dom(s, s.arg2IntVar(ce[0]), d, s.arg2BoolVar(ce[2]));
882 IntSet d = s.arg2intset(ce[1]);
883 if (ce[0]->isBoolVar()) {
885 Iter::Ranges::Singleton sr(0,1);
886 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
888 if (d01.size() == 0) {
889 rel(s, s.arg2BoolVar(ce[2]) == 0);
890 }
else if (d01.max() == 0) {
891 rel(s, s.arg2BoolVar(ce[2]) >> !s.arg2BoolVar(ce[0]));
892 }
else if (d01.min() == 1) {
893 rel(s, s.arg2BoolVar(ce[2]) >> s.arg2BoolVar(ce[0]));
896 dom(s, s.arg2IntVar(ce[0]), d, Reify(s.arg2BoolVar(ce[2]),
RM_IMP));
903 IntVar x0 = s.arg2IntVar(ce[0]);
904 IntVar x1 = s.arg2IntVar(ce[1]);
905 abs(s, x0, x1, s.ann2ipl(ann));
909 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
910 IntVarArgs iv1 = s.arg2intvarargs(ce[1]);
911 rel(s, iv0,
IRT_LE, iv1, s.ann2ipl(ann));
915 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
916 IntVarArgs iv1 = s.arg2intvarargs(ce[1]);
917 rel(s, iv0,
IRT_LQ, iv1, s.ann2ipl(ann));
922 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
923 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
924 rel(s, bv0,
IRT_LE, bv1, s.ann2ipl(ann));
929 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
930 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
931 rel(s, bv0,
IRT_LQ, bv1, s.ann2ipl(ann));
935 IntVarArgs iv = s.arg2intvarargs(ce[0]);
936 if (!ce[1]->isIntVar()) {
937 if (!ce[2]->isIntVar()) {
938 count(s, iv, ce[1]->getInt(),
IRT_EQ, ce[2]->getInt(),
941 count(s, iv, ce[1]->getInt(),
IRT_EQ, s.arg2IntVar(ce[2]),
944 }
else if (!ce[2]->isIntVar()) {
945 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, ce[2]->getInt(),
948 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, s.arg2IntVar(ce[2]),
954 IntVarArgs iv = s.arg2intvarargs(ce[0]);
955 IntVar x = s.arg2IntVar(ce[1]);
956 IntVar y = s.arg2IntVar(ce[2]);
957 BoolVar
b = s.arg2BoolVar(ce[3]);
963 IntVarArgs iv = s.arg2intvarargs(ce[0]);
964 IntVar x = s.arg2IntVar(ce[1]);
965 IntVar y = s.arg2IntVar(ce[2]);
966 BoolVar
b = s.arg2BoolVar(ce[3]);
974 IntVarArgs iv = s.arg2intvarargs(ce[1]);
975 count(s, iv, ce[2]->getInt(), irt, ce[0]->getInt(), s.ann2ipl(ann));
979 count_rel(
IRT_LQ, s, ce, ann);
983 count_rel(
IRT_GQ, s, ce, ann);
988 int minIdx = ce[3]->getInt();
989 IntVarArgs load = s.arg2intvarargs(ce[0]);
991 IntVarArgs bin = s.arg2intvarargs(ce[1]);
992 for (
int i=bin.size(); i--;)
993 rel(s, bin[i] >= minIdx);
995 for (
int i=minIdx;
i--;)
997 }
else if (minIdx < 0) {
998 IntVarArgs bin2(bin.size());
999 for (
int i=bin.size(); i--;)
1000 bin2[
i] =
expr(s, bin[i]-minIdx, s.ann2ipl(ann));
1004 IntArgs sizes = s.arg2intargs(ce[2]);
1006 IntVarArgs allvars = l + bin;
1008 binpacking(s, allvars.slice(0,1,l.size()), allvars.slice(l.size(),1,bin.size()),
1009 sizes, s.ann2ipl(ann));
1014 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
1015 IntArgs cover = s.arg2intargs(ce[1]);
1016 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
1020 IntSetRanges cover_r(cover_s);
1021 IntVarRanges* iv0_ri = re.alloc<IntVarRanges>(iv0.size());
1022 for (
int i=iv0.size(); i--;)
1023 iv0_ri[
i] = IntVarRanges(iv0[i]);
1024 Iter::Ranges::NaryUnion iv0_r(re,iv0_ri,iv0.size());
1025 Iter::Ranges::Diff<Iter::Ranges::NaryUnion,IntSetRanges>
1026 extra_r(iv0_r,cover_r);
1027 Iter::Ranges::ToValues<Iter::Ranges::Diff<
1028 Iter::Ranges::NaryUnion,IntSetRanges> > extra(extra_r);
1029 for (; extra(); ++extra) {
1030 cover << extra.val();
1031 iv1 << IntVar(s,0,iv0.size());
1037 IntVarArgs allvars = iv0+iv1;
1039 count(s, allvars.slice(0,1,iv0.size()),
1040 allvars.slice(iv0.size(),1,iv1.size()),
1044 count(s, iv0, iv1, cover, ipl);
1050 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
1051 IntArgs cover = s.arg2intargs(ce[1]);
1052 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
1057 IntVarArgs allvars = iv0+iv1;
1059 count(s, allvars.slice(0,1,iv0.size()),
1060 allvars.slice(iv0.size(),1,iv1.size()),
1064 count(s, iv0, iv1, cover, ipl);
1070 IntVarArgs x = s.arg2intvarargs(ce[0]);
1071 IntArgs cover = s.arg2intargs(ce[1]);
1073 IntArgs lbound = s.arg2intargs(ce[2]);
1074 IntArgs ubound = s.arg2intargs(ce[3]);
1076 for (
int i=cover.size(); i--;)
1077 y[
i] =
IntSet(lbound[i],ubound[i]);
1081 IntVarRanges* xrs = re.alloc<IntVarRanges>(x.size());
1082 for (
int i=x.size(); i--;)
1084 Iter::Ranges::NaryUnion u(re, xrs, x.size());
1085 Iter::Ranges::ToValues<Iter::Ranges::NaryUnion> uv(u);
1086 for (; uv(); ++uv) {
1087 if (!cover_s.in(uv.val())) {
1096 count(s, x, y, cover, ipl);
1102 IntVarArgs x = s.arg2intvarargs(ce[0]);
1103 IntArgs cover = s.arg2intargs(ce[1]);
1105 IntArgs lbound = s.arg2intargs(ce[2]);
1106 IntArgs ubound = s.arg2intargs(ce[3]);
1108 for (
int i=cover.size(); i--;)
1109 y[
i] =
IntSet(lbound[i],ubound[i]);
1114 count(s, x, y, cover, ipl);
1118 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1119 min(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
1123 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1124 max(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
1128 IntVar x = s.arg2IntVar(ce[2]);
1129 IntVarArgs iv = x + s.arg2intvarargs(ce[0]);
1131 int offset = ce[1]->getInt();
1132 argmin(s, iv.slice(1), offset, x,
true, s.ann2ipl(ann));
1136 IntVar x = s.arg2IntVar(ce[2]);
1137 IntVarArgs iv = x + s.arg2intvarargs(ce[0]);
1139 int offset = ce[1]->getInt();
1140 argmax(s, iv.slice(1), offset, x,
true, s.ann2ipl(ann));
1144 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
1146 int offset = ce[1]->getInt();
1147 argmin(s, bv, offset, s.arg2IntVar(ce[2]),
true, s.ann2ipl(ann));
1151 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
1153 int offset = ce[1]->getInt();
1154 argmax(s, bv, offset, s.arg2IntVar(ce[2]),
true, s.ann2ipl(ann));
1157 void p_regular(
FlatZincSpace& s, IntVarArgs iv,
int q,
int symbols_min,
1158 int symbols_max, IntArgs d,
int q0,
AST::SetLit* finals,
1160 int symbols = symbols_max - symbols_min + 1;
1163 for (
int i=0;
i<q;
i++) {
1164 for (
int j=0; j<symbols; j++) {
1165 if (d[i*symbols+j] > 0)
1171 DFA::Transition* t = re.alloc<DFA::Transition>(noOfTrans+1);
1173 for (
int i=1;
i<=q;
i++) {
1174 for (
int j=0; j<symbols; j++) {
1175 if (d[(i-1)*symbols+j] > 0) {
1176 t[noOfTrans].i_state =
i;
1177 t[noOfTrans].symbol = symbols_min + j;
1178 t[noOfTrans].o_state =
d[(
i-1)*symbols+j];
1183 t[noOfTrans].i_state = -1;
1187 if (finals->interval) {
1188 f =
static_cast<int*
>(
heap.
ralloc(
sizeof(
int)*(finals->max-finals->min+2)));
1189 for (
int i=finals->min; i<=finals->
max; i++)
1190 f[
i-finals->min] =
i;
1191 f[finals->max-finals->min+1] = -1;
1193 f =
static_cast<int*
>(
heap.
ralloc(
sizeof(
int)*(finals->s.size()+1)));
1194 for (
int j=finals->s.size(); j--; )
1195 f[j] = finals->s[j];
1196 f[finals->s.size()] = -1;
1202 extensional(s, iv, s.getSharedDFA(dfa), s.ann2ipl(ann));
1206 p_regular(s, s.arg2intvarargs(ce[0]), ce[1]->getInt(), 1, ce[2]->getInt(),
1207 s.arg2intargs(ce[3]), ce[4]->getInt(), ce[5]->getSet(), ann);
1211 p_regular(s, s.arg2intvarargs(ce[0]), ce[1]->getInt(), ce[2]->getInt(),
1212 ce[3]->getInt(), s.arg2intargs(ce[4]), ce[5]->getInt(),
1213 ce[6]->getSet(), ann);
1218 IntVarArgs x = s.arg2intvarargs(ce[0]);
1219 IntVarArgs y = s.arg2intvarargs(ce[1]);
1220 IntVarArgs xy(x.size()+y.size());
1221 for (
int i=x.size(); i--;)
1223 for (
int i=y.size(); i--;)
1226 for (
int i=x.size(); i--;)
1228 for (
int i=y.size(); i--;)
1230 sorted(s, x, y, s.ann2ipl(ann));
1235 IntVarArgs x = s.arg2intvarargs(ce[0]);
1236 int xoff = ce[1]->getInt();
1237 IntVarArgs y = s.arg2intvarargs(ce[2]);
1238 int yoff = ce[3]->getInt();
1239 IntVarArgs xy = x + y;
1241 channel(s, xy.slice(0, 1, x.size()), xoff, xy.slice(x.size()), yoff, s.ann2ipl(ann));
1246 IntVarArgs x = s.arg2intvarargs(ce[0]);
1252 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1258 IntVarArgs x = s.arg2intvarargs(ce[0]);
1264 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1270 IntVarArgs x = s.arg2intvarargs(ce[0]);
1271 IntArgs tuples = s.arg2intargs(ce[1]);
1272 TupleSet ts = s.arg2tupleset(tuples,x.size());
1279 IntVarArgs x = s.arg2intvarargs(ce[0]);
1280 IntArgs tuples = s.arg2intargs(ce[1]);
1281 TupleSet ts = s.arg2tupleset(tuples,x.size());
1288 IntVarArgs x = s.arg2intvarargs(ce[0]);
1289 IntArgs tuples = s.arg2intargs(ce[1]);
1290 TupleSet ts = s.arg2tupleset(tuples,x.size());
1297 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1298 IntArgs tuples = s.arg2boolargs(ce[1]);
1299 TupleSet ts = s.arg2tupleset(tuples,x.size());
1306 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1307 IntArgs tuples = s.arg2boolargs(ce[1]);
1308 TupleSet ts = s.arg2tupleset(tuples,x.size());
1315 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1316 IntArgs tuples = s.arg2boolargs(ce[1]);
1317 TupleSet ts = s.arg2tupleset(tuples,x.size());
1324 IntVarArgs start = s.arg2intvarargs(ce[0]);
1325 IntArgs duration = s.arg2intargs(ce[1]);
1326 IntArgs height = s.arg2intargs(ce[2]);
1327 BoolVarArgs
opt = s.arg2boolvarargs(ce[3]);
1328 int bound = ce[4]->getInt();
1330 cumulative(s,bound,start,duration,height,opt,s.ann2ipl(ann));
1335 if (ce.size() == 6) {
1337 IntVarArgs start = s.arg2intvarargs(ce[0]);
1338 IntVarArgs duration = s.arg2intvarargs(ce[1]);
1339 IntVarArgs resources = s.arg2intvarargs(ce[2]);
1340 IntVarArgs machine = s.arg2intvarargs(ce[3]);
1341 IntArgs bound = s.arg2intargs(ce[4]);
1342 bool upper = ce[5]->getBool();
1343 int n = start.size();
1345 if (duration.assigned()) {
1346 IntArgs durationI(n);
1347 for (
int i = n; (
i--) != 0;) {
1348 durationI[
i] = duration[
i].val();
1351 for (
int i = n; (
i--) != 0;) {
1352 end[
i] =
expr(s, start[i] + durationI[i]);
1354 if (machine.assigned()) {
1355 IntArgs machineI(n);
1356 for (
int i = n; (
i--) != 0;) {
1357 machineI[
i] = machine[
i].val();
1359 if (resources.assigned()) {
1360 IntArgs resourcesI(n);
1361 for (
int i = n; (
i--) != 0;) {
1362 resourcesI[
i] = resources[
i].val();
1364 cumulatives(s, machineI, start, durationI, end, resourcesI, bound, upper, s.ann2ipl(ann));
1366 cumulatives(s, machineI, start, durationI, end, resources, bound, upper, s.ann2ipl(ann));
1368 }
else if (resources.assigned()) {
1369 IntArgs resourcesI(n);
1370 for (
int i = n; (
i--) != 0;) {
1371 resourcesI[
i] = resources[
i].val();
1373 cumulatives(s, machine, start, durationI, end, resourcesI, bound, upper, s.ann2ipl(ann));
1375 cumulatives(s, machine, start, durationI, end, resources, bound, upper, s.ann2ipl(ann));
1379 for (
int i = n; (
i--) != 0;) {
1380 end[
i] =
expr(s, start[i] + duration[i]);
1382 if (machine.assigned()) {
1383 IntArgs machineI(n);
1384 for (
int i = n; (
i--) != 0;) {
1385 machineI[
i] = machine[
i].val();
1387 if (resources.assigned()) {
1388 IntArgs resourcesI(n);
1389 for (
int i = n; (
i--) != 0;) {
1390 resourcesI[
i] = resources[
i].val();
1392 cumulatives(s, machineI, start, duration, end, resourcesI, bound, upper, s.ann2ipl(ann));
1394 cumulatives(s, machineI, start, duration, end, resources, bound, upper, s.ann2ipl(ann));
1396 }
else if (resources.assigned()) {
1397 IntArgs resourcesI(n);
1398 for (
int i = n; (
i--) != 0;) {
1399 resourcesI[
i] = resources[
i].val();
1401 cumulatives(s, machine, start, duration, end, resourcesI, bound, upper, s.ann2ipl(ann));
1403 cumulatives(s, machine, start, duration, end, resources, bound, upper, s.ann2ipl(ann));
1409 IntVarArgs start = s.arg2intvarargs(ce[0]);
1410 IntVarArgs duration = s.arg2intvarargs(ce[1]);
1411 IntVarArgs height = s.arg2intvarargs(ce[2]);
1412 int n = start.size();
1413 IntVar bound = s.arg2IntVar(ce[3]);
1419 rel(s, height[0] <= bound);
1423 bool nonzeroDuration =
true;
1424 for (
int i=0;
i<n;
i++) {
1425 if (duration[i].
min() <= 0) {
1426 nonzeroDuration =
false;
1431 int minHeight = std::min(height[0].
min(),height[1].
min());
1432 int minHeight2 = std::max(height[0].
min(),height[1].
min());
1433 for (
int i=2;
i<n;
i++) {
1434 if (height[i].
min() < minHeight) {
1435 minHeight2 = minHeight;
1436 minHeight = height[
i].min();
1437 }
else if (height[i].
min() < minHeight2) {
1438 minHeight2 = height[
i].min();
1441 bool disjunctive = nonzeroDuration && (
1442 (minHeight > bound.max()/2) ||
1443 (minHeight2 > bound.max()/2 && minHeight+minHeight2>bound.max()));
1445 rel(s, bound >=
max(height));
1447 if (duration.assigned()) {
1448 IntArgs durationI(n);
1450 durationI[i] = duration[i].val();
1452 unary(s,start,durationI);
1456 end[i] =
expr(s,start[i]+duration[i]);
1458 unary(s,start,duration,end);
1460 }
else if (nonzeroDuration && height.assigned()) {
1463 heightI[i] = height[i].val();
1464 if (duration.assigned()) {
1465 IntArgs durationI(n);
1467 durationI[i] = duration[i].val();
1468 cumulative(s, bound, start, durationI, heightI);
1471 for (
int i = n;
i--; )
1472 end[i] =
expr(s,start[i]+duration[i]);
1473 cumulative(s, bound, start, duration, end, heightI);
1475 }
else if (nonzeroDuration && bound.assigned()) {
1477 IntArgs limit({bound.val()});
1480 end[i] =
expr(s,start[i]+duration[i]);
1481 cumulatives(s, machine, start, duration, end, height, limit,
true,
1486 IntVarArgs end(start.size());
1487 for (
int i = start.size(); i--; ) {
1489 max = std::max(
max, start[i].
max() + duration[i].
max());
1490 end[
i] =
expr(s, start[i] + duration[i]);
1492 for (
int time =
min; time <
max; ++time) {
1493 IntVarArgs x(start.size());
1494 for (
int i = start.size(); i--; ) {
1495 IntVar overlaps =
channel(s,
expr(s, (start[i] <= time) &&
1497 x[
i] =
expr(s, overlaps * height[i]);
1506 IntVarArgs x = s.arg2intvarargs(ce[0]);
1507 IntSet S = s.arg2intset(ce[1]);
1508 int q = ce[2]->getInt();
1509 int l = ce[3]->getInt();
1510 int u = ce[4]->getInt();
1512 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1517 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1518 bool val = ce[1]->getBool();
1519 int q = ce[2]->getInt();
1520 int l = ce[3]->getInt();
1521 int u = ce[4]->getInt();
1524 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1528 IntVarArgs x = s.arg2intvarargs(ce[0]);
1529 IntArgs p = s.arg2intargs(ce[1]);
1536 IntVarArgs x = s.arg2intvarargs(ce[0]);
1537 IntArgs p = s.arg2intargs(ce[1]);
1538 BoolVarArgs m = s.arg2boolvarargs(ce[2]);
1544 int off = ce[0]->getInt();
1545 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1547 circuit(s,off,xv,s.ann2ipl(ann));
1551 IntArgs
c = s.arg2intargs(ce[0]);
1552 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1553 IntVarArgs yv = s.arg2intvarargs(ce[2]);
1554 IntVar z = s.arg2IntVar(ce[3]);
1556 circuit(s,c,xv,yv,z,s.ann2ipl(ann));
1559 IntArgs
c = s.arg2intargs(ce[0]);
1560 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1561 IntVar z = s.arg2IntVar(ce[2]);
1563 circuit(s,c,xv,z,s.ann2ipl(ann));
1567 IntVarArgs x0 = s.arg2intvarargs(ce[0]);
1568 IntVarArgs w = s.arg2intvarargs(ce[1]);
1569 IntVarArgs y0 = s.arg2intvarargs(ce[2]);
1570 IntVarArgs h = s.arg2intvarargs(ce[3]);
1571 if (w.assigned() && h.assigned()) {
1572 IntArgs iw(w.size());
1573 for (
int i=w.size(); i--;)
1575 IntArgs ih(h.size());
1576 for (
int i=h.size(); i--;)
1578 nooverlap(s,x0,iw,y0,ih,s.ann2ipl(ann));
1580 int miny = y0[0].min();
1581 int maxy = y0[0].max();
1583 for (
int i=1;
i<y0.
size();
i++) {
1584 miny = std::min(miny,y0[i].
min());
1585 maxy = std::max(maxy,y0[i].
max());
1586 maxdy = std::max(maxdy,ih[i]);
1588 int minx = x0[0].min();
1589 int maxx = x0[0].max();
1591 for (
int i=1;
i<x0.
size();
i++) {
1592 minx = std::min(minx,x0[i].
min());
1593 maxx = std::max(maxx,x0[i].
max());
1594 maxdx = std::max(maxdx,iw[i]);
1601 IntVarArgs x1(x0.size()), y1(y0.size());
1602 for (
int i=x0.size(); i--; )
1603 x1[
i] =
expr(s, x0[i] + w[i]);
1604 for (
int i=y0.size(); i--; )
1605 y1[
i] =
expr(s, y0[i] + h[i]);
1606 nooverlap(s,x0,w,x1,y0,h,y1,s.ann2ipl(ann));
1611 IntVarArgs x = s.arg2intvarargs(ce[0]);
1612 int p_s = ce[1]->getInt();
1613 int p_t = ce[2]->getInt();
1614 precede(s,x,p_s,p_t,s.ann2ipl(ann));
1618 IntVarArgs x = s.arg2intvarargs(ce[1]);
1619 if (ce[0]->isIntVar()) {
1620 IntVar y = s.arg2IntVar(ce[0]);
1628 IntVarArgs x = s.arg2intvarargs(ce[1]);
1629 IntSet v = s.arg2intset(ce[2]);
1630 if (ce[0]->isIntVar()) {
1631 IntVar n = s.arg2IntVar(ce[0]);
1636 count(s,x,v,
IRT_EQ,ce[0]->getInt(),s.ann2ipl(ann));
1641 IntVarArgs x = s.arg2intvarargs(ce[0]);
1642 IntVar y = s.arg2IntVar(ce[1]);
1643 member(s,x,y,s.ann2ipl(ann));
1647 IntVarArgs x = s.arg2intvarargs(ce[0]);
1648 IntVar y = s.arg2IntVar(ce[1]);
1649 BoolVar
b = s.arg2BoolVar(ce[2]);
1650 member(s,x,y,b,s.ann2ipl(ann));
1653 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1654 BoolVar y = s.arg2BoolVar(ce[1]);
1655 member(s,x,y,s.ann2ipl(ann));
1659 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1660 BoolVar y = s.arg2BoolVar(ce[1]);
1661 member(s,x,y,s.arg2BoolVar(ce[2]),s.ann2ipl(ann));
1668 void blackbox_source(
AST::Node* ann, std::string& mode,
1669 std::string& target,
1670 std::vector<std::string>& args) {
1671 auto string_arg = [](
AST::Node* n,
const char* what) {
1672 if ((n ==
nullptr) || !n->isString()) {
1673 throw FlatZinc::Error(
"Registry",
1674 std::string(
"Malformed blackbox annotation: ") +
1675 what +
" must be a string.");
1677 return n->getString();
1680 bool has_dll = (ann !=
nullptr) && ann->hasCall(
"blackbox_dll");
1681 bool has_exec = (ann !=
nullptr) && ann->hasCall(
"blackbox_exec");
1682 if (has_dll && has_exec) {
1683 throw FlatZinc::Error(
1684 "Registry",
"Blackbox constraint has multiple execution method annotations.");
1685 }
else if (has_dll) {
1686 c = ann->getCall(
"blackbox_dll");
1688 }
else if (has_exec) {
1689 c = ann->getCall(
"blackbox_exec");
1692 throw FlatZinc::Error(
1693 "Registry",
"Blackbox constraint is missing a valid annotation specifying "
1694 "execution method.");
1696 if ((c ==
nullptr) || (
c->args ==
nullptr)) {
1697 throw FlatZinc::Error(
"Registry",
1698 "Malformed blackbox annotation: missing target.");
1703 if (arr->a.size() != 2) {
1704 throw FlatZinc::Error(
1705 "Registry",
"Malformed blackbox annotation: expected a target string and "
1706 "an argument array.");
1708 target = string_arg(arr->a[0],
"target");
1709 if (!arr->a[1]->isArray()) {
1710 throw FlatZinc::Error(
1711 "Registry",
"Malformed blackbox annotation: argument list must be an array "
1715 for (
unsigned int i = 0;
i < al->
a.size();
i++) {
1716 args.push_back(string_arg(al->a[i],
"argument"));
1719 target = string_arg(
c->args,
"target");
1726 std::vector<std::string> args;
1727 blackbox_source(ann, mode, target, args);
1728 IntVarArgs int_input = s.arg2intvarargs(ce[0]);
1729 IntVarArgs int_output = s.arg2intvarargs(ce[2]);
1730#ifdef GECODE_HAS_FLOAT_VARS
1731 FloatVarArgs float_input = s.arg2floatvarargs(ce[1]);
1732 FloatVarArgs float_output = s.arg2floatvarargs(ce[3]);
1734 if (!ce[1]->getArray()->
a.empty() || !ce[3]->getArray()->a.empty()) {
1735 throw FlatZinc::Error(
"Registry",
1736 "Blackbox propagator cannot use floating point values when Gecode is compiled without floating point decision variable support.");
1741float_input, float_output,
1743 mode, target, args);
1749 std::vector<std::string> args;
1750 blackbox_source(ann, mode, target, args);
1751 IntVarArgs ivar = s.arg2intvarargs(ce[0]);
1752#ifdef GECODE_HAS_FLOAT_VARS
1753 FloatVarArgs fvar = s.arg2floatvarargs(ce[1]);
1755 if (!ce[1]->getArray()->
a.empty()) {
1756 throw FlatZinc::Error(
"Registry",
1757 "Blackbox propagator cannot use floating point values when Gecode is compiled without floating point decision variable support.");
1760 IntArgs flat_reason = s.arg2intargs(ce[2]);
1761 std::vector<int> reason(flat_reason.size());
1762 for (
int i = 0;
i < flat_reason.
size();
i++) {
1763 reason[
i] = flat_reason[
i];
1769 mode, target, args, reason);
1776 registry().
add(
"all_different_offset", &p_distinctOffset);
1797 registry().
add(
"int_lin_eq_reif", &p_int_lin_eq_reif);
1798 registry().
add(
"int_lin_eq_imp", &p_int_lin_eq_imp);
1800 registry().
add(
"int_lin_ne_reif", &p_int_lin_ne_reif);
1801 registry().
add(
"int_lin_ne_imp", &p_int_lin_ne_imp);
1803 registry().
add(
"int_lin_le_reif", &p_int_lin_le_reif);
1804 registry().
add(
"int_lin_le_imp", &p_int_lin_le_imp);
1806 registry().
add(
"int_lin_lt_reif", &p_int_lin_lt_reif);
1807 registry().
add(
"int_lin_lt_imp", &p_int_lin_lt_imp);
1809 registry().
add(
"int_lin_ge_reif", &p_int_lin_ge_reif);
1810 registry().
add(
"int_lin_ge_imp", &p_int_lin_ge_imp);
1812 registry().
add(
"int_lin_gt_reif", &p_int_lin_gt_reif);
1813 registry().
add(
"int_lin_gt_imp", &p_int_lin_gt_imp);
1848 registry().
add(
"array_bool_and", &p_array_bool_and);
1849 registry().
add(
"array_bool_and_imp", &p_array_bool_and_imp);
1850 registry().
add(
"array_bool_or", &p_array_bool_or);
1851 registry().
add(
"array_bool_or_imp", &p_array_bool_or_imp);
1852 registry().
add(
"array_bool_xor", &p_array_bool_xor);
1853 registry().
add(
"array_bool_xor_imp", &p_array_bool_xor_imp);
1854 registry().
add(
"bool_clause", &p_array_bool_clause);
1855 registry().
add(
"bool_clause_reif", &p_array_bool_clause_reif);
1856 registry().
add(
"bool_clause_imp", &p_array_bool_clause_imp);
1860 registry().
add(
"array_int_element", &p_array_int_element);
1861 registry().
add(
"array_var_int_element", &p_array_int_element);
1862 registry().
add(
"gecode_int_element", &p_array_int_element_offset);
1863 registry().
add(
"gecode_var_int_element", &p_array_int_element_offset);
1864 registry().
add(
"gecode_int_element2d", &p_array_int_element2d);
1865 registry().
add(
"array_bool_element", &p_array_bool_element);
1866 registry().
add(
"array_var_bool_element", &p_array_bool_element);
1867 registry().
add(
"gecode_bool_element", &p_array_bool_element_offset);
1868 registry().
add(
"gecode_var_bool_element", &p_array_bool_element_offset);
1869 registry().
add(
"gecode_bool_element2d", &p_array_bool_element2d);
1874#ifndef GECODE_HAS_SET_VARS
1882 registry().
add(
"array_bool_lt", &p_array_bool_lt);
1883 registry().
add(
"array_bool_lq", &p_array_bool_lq);
1892 registry().
add(
"gecode_bin_packing_load", &p_bin_packing_load);
1893 registry().
add(
"gecode_global_cardinality", &p_global_cardinality);
1894 registry().
add(
"gecode_global_cardinality_closed",
1895 &p_global_cardinality_closed);
1897 &p_global_cardinality_low_up);
1898 registry().
add(
"global_cardinality_low_up_closed",
1899 &p_global_cardinality_low_up_closed);
1902 registry().
add(
"gecode_minimum_arg_int_offset", &p_minimum_arg);
1903 registry().
add(
"gecode_maximum_arg_int_offset", &p_maximum_arg);
1904 registry().
add(
"gecode_minimum_arg_bool_offset", &p_minimum_arg_bool);
1905 registry().
add(
"gecode_maximum_arg_bool_offset", &p_maximum_arg_bool);
1908 registry().
add(
"gecode_regular_set", &p_regular_set);
1910 registry().
add(
"inverse_offsets", &p_inverse_offsets);
1911 registry().
add(
"increasing_int", &p_increasing_int);
1912 registry().
add(
"increasing_bool", &p_increasing_bool);
1913 registry().
add(
"decreasing_int", &p_decreasing_int);
1914 registry().
add(
"decreasing_bool", &p_decreasing_bool);
1916 registry().
add(
"gecode_table_int_reif", &p_table_int_reif);
1917 registry().
add(
"gecode_table_int_imp", &p_table_int_imp);
1918 registry().
add(
"gecode_table_bool", &p_table_bool);
1919 registry().
add(
"gecode_table_bool_reif", &p_table_bool_reif);
1920 registry().
add(
"gecode_table_bool_imp", &p_table_bool_imp);
1922 registry().
add(
"gecode_among_seq_int", &p_among_seq_int);
1923 registry().
add(
"gecode_among_seq_bool", &p_among_seq_bool);
1932 registry().
add(
"bool_lin_eq_reif", &p_bool_lin_eq_reif);
1933 registry().
add(
"bool_lin_eq_imp", &p_bool_lin_eq_imp);
1934 registry().
add(
"bool_lin_ne_reif", &p_bool_lin_ne_reif);
1935 registry().
add(
"bool_lin_ne_imp", &p_bool_lin_ne_imp);
1936 registry().
add(
"bool_lin_le_reif", &p_bool_lin_le_reif);
1937 registry().
add(
"bool_lin_le_imp", &p_bool_lin_le_imp);
1938 registry().
add(
"bool_lin_lt_reif", &p_bool_lin_lt_reif);
1939 registry().
add(
"bool_lin_lt_imp", &p_bool_lin_lt_imp);
1940 registry().
add(
"bool_lin_ge_reif", &p_bool_lin_ge_reif);
1941 registry().
add(
"bool_lin_ge_imp", &p_bool_lin_ge_imp);
1942 registry().
add(
"bool_lin_gt_reif", &p_bool_lin_gt_reif);
1943 registry().
add(
"bool_lin_gt_imp", &p_bool_lin_gt_imp);
1945 registry().
add(
"gecode_schedule_unary", &p_schedule_unary);
1946 registry().
add(
"gecode_schedule_unary_optional", &p_schedule_unary_optional);
1947 registry().
add(
"gecode_schedule_cumulative_optional", &p_cumulative_opt);
1950 registry().
add(
"gecode_circuit_cost_array", &p_circuit_cost_array);
1951 registry().
add(
"gecode_circuit_cost", &p_circuit_cost);
1957 registry().
add(
"gecode_member_int_reif",&p_member_int_reif);
1959 registry().
add(
"gecode_member_bool_reif",&p_member_bool_reif);
1962 registry().
add(
"gecode_blackbox_bounds", &p_blackbox_bounds);
1965 IntPoster __int_poster;
1967#ifdef GECODE_HAS_SET_VARS
1970 rel(s, s.arg2SetVar(ce[0]), op, s.arg2SetVar(ce[1]),
1971 SRT_EQ, s.arg2SetVar(ce[2]));
1984 SetVar x = s.arg2SetVar(ce[0]);
1985 SetVar y = s.arg2SetVar(ce[1]);
1987 SetVarLubRanges xub(x);
1992 SetVarLubRanges yub(y);
2002 SetVarArgs xs = s.arg2setvarargs(ce[0]);
2003 rel(s, op, xs, s.arg2SetVar(ce[1]));
2014 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]));
2018 p_set_rel(s,
SRT_EQ, ce);
2021 p_set_rel(s,
SRT_NQ, ce);
2030 p_set_rel(s,
SRT_LQ, ce);
2033 p_set_rel(s,
SRT_LE, ce);
2036 if (!ce[1]->isIntVar()) {
2037 cardinality(s, s.arg2SetVar(ce[0]), ce[1]->getInt(),
2040 cardinality(s, s.arg2SetVar(ce[0]), s.arg2IntVar(ce[1]));
2044 if (!ce[1]->isSetVar()) {
2045 IntSet d = s.arg2intset(ce[1]);
2046 if (ce[0]->isBoolVar()) {
2048 Iter::Ranges::Singleton sr(0,1);
2049 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
2051 if (d01.size() == 0) {
2054 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
2055 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
2058 dom(s, s.arg2IntVar(ce[0]), d);
2061 if (!ce[0]->isIntVar()) {
2062 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt());
2064 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]));
2069 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]),
2070 s.arg2BoolVar(ce[2]));
2074 p_set_rel_reif(s,
SRT_EQ,ce);
2077 p_set_rel_reif(s,
SRT_LQ,ce);
2080 p_set_rel_reif(s,
SRT_LE,ce);
2083 p_set_rel_reif(s,
SRT_NQ,ce);
2094 if (!ce[1]->isSetVar()) {
2096 p_int_in_reif(s,ce,ann);
2099 p_int_in_imp(s,ce,ann);
2102 if (!ce[0]->isIntVar()) {
2103 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt(),
2104 Reify(s.arg2BoolVar(ce[2]),rm));
2106 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]),
2107 Reify(s.arg2BoolVar(ce[2]),rm));
2112 p_set_in_reif(s,ce,ann,
RM_EQV);
2115 p_set_in_reif(s,ce,ann,
RM_IMP);
2118 rel(s, s.arg2SetVar(ce[0]),
SRT_DISJ, s.arg2SetVar(ce[1]));
2123 SetVar x = s.arg2SetVar(ce[0]);
2124 int idx = ce[2]->getInt();
2127 BoolVarArgs y = s.arg2boolvarargs(ce[1],idx);
2134 bool isConstant =
true;
2136 for (
int i=
a->a.
size(); i--;) {
2137 if (
a->a[i]->isSetVar()) {
2142 IntVar selector = s.arg2IntVar(ce[0]);
2143 rel(s, selector > 0);
2146 element(s, sv, selector, s.arg2SetVar(ce[2]));
2148 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
2149 element(s, sv, selector, s.arg2SetVar(ce[2]));
2155 const IntSet& universe =
2157 bool isConstant =
true;
2159 for (
int i=
a->a.
size(); i--;) {
2160 if (
a->a[i]->isSetVar()) {
2165 SetVar selector = s.arg2SetVar(ce[0]);
2169 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
2171 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
2172 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
2178 p_array_set_element_op(s, ce, ann,
SOT_UNION);
2183 p_array_set_element_op(s, ce, ann,
SOT_INTER);
2189 IntSet d = s.arg2intset(ce[3]);
2190 p_array_set_element_op(s, ce, ann,
SOT_INTER, d);
2195 p_array_set_element_op(s, ce, ann,
SOT_DUNION);
2199 convex(s, s.arg2SetVar(ce[0]));
2203 SetVarArgs sv = s.arg2setvarargs(ce[0]);
2209 SetVarArgs sv = s.arg2setvarargs(ce[0]);
2210 sequence(s, sv, s.arg2SetVar(ce[1]));
2215 int xoff=ce[1]->getInt();
2217 int yoff=ce[3]->getInt();
2219 IntVarArgs xv = s.arg2intvarargs(ce[0], xoff);
2220 SetVarArgs yv = s.arg2setvarargs(ce[2], yoff, 1,
IntSet(0, xoff-1));
2221 IntSet xd(yoff,yv.size()-1);
2222 for (
int i=xoff;
i<xv.
size();
i++) {
2225 IntSet yd(xoff,xv.size()-1);
2226 for (
int i=yoff;
i<yv.
size();
i++) {
2233 int xoff=ce[1]->getInt();
2235 IntVarArgs xv = s.arg2intvarargs(ce[0],xoff);
2240 IntArgs e = s.arg2intargs(ce[0]);
2241 IntArgs w = s.arg2intargs(ce[1]);
2242 SetVar x = s.arg2SetVar(ce[2]);
2243 IntVar y = s.arg2IntVar(ce[3]);
2248 int xoff = ce[2]->getInt();
2249 int yoff = ce[3]->getInt();
2250 SetVarArgs x = s.arg2setvarargs(ce[0],xoff);
2251 SetVarArgs y = s.arg2setvarargs(ce[1],yoff);
2256 SetVarArgs x = s.arg2setvarargs(ce[0]);
2257 int p_s = ce[1]->getInt();
2258 int p_t = ce[2]->getInt();
2271 registry().
add(
"array_set_element", &p_array_set_element);
2272 registry().
add(
"array_var_set_element", &p_array_set_element);
2273 registry().
add(
"set_intersect", &p_set_intersect);
2285 registry().
add(
"set_subset_reif", &p_set_subset_reif);
2286 registry().
add(
"set_superset_reif", &p_set_superset_reif);
2291 &p_link_set_to_booleans);
2293 registry().
add(
"array_set_union", &p_array_set_union);
2294 registry().
add(
"array_set_partition", &p_array_set_partition);
2296 registry().
add(
"array_set_seq", &p_array_set_seq);
2297 registry().
add(
"array_set_seq_union", &p_array_set_seq_union);
2299 &p_array_set_element_union);
2300 registry().
add(
"gecode_array_set_element_intersect",
2301 &p_array_set_element_intersect);
2302 registry().
add(
"gecode_array_set_element_intersect_in",
2303 &p_array_set_element_intersect_in);
2304 registry().
add(
"gecode_array_set_element_partition",
2305 &p_array_set_element_partition);
2307 &p_int_set_channel);
2312 registry().
add(
"gecode_inverse_set", &p_inverse_set);
2313 registry().
add(
"gecode_precede_set", &p_precede_set);
2316 SetPoster __set_poster;
2319#ifdef GECODE_HAS_FLOAT_VARS
2322 IntVar x0 = s.arg2IntVar(ce[0]);
2323 FloatVar x1 = s.arg2FloatVar(ce[1]);
2329 FloatValArgs fa = s.arg2floatargs(ce[0]);
2330 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
2331 linear(s, fa, fv, frt, ce[2]->getFloat());
2335 FloatValArgs fa = s.arg2floatargs(ce[0]);
2336 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
2337 linear(s, fa, fv, frt, ce[2]->getFloat(), s.arg2BoolVar(ce[3]));
2340 p_float_lin_cmp(s,
FRT_EQ,ce,ann);
2344 p_float_lin_cmp_reif(s,
FRT_EQ,ce,ann);
2347 p_float_lin_cmp(s,
FRT_LQ,ce,ann);
2350 p_float_lin_cmp(s,
FRT_LE,ce,ann);
2354 p_float_lin_cmp_reif(s,
FRT_LQ,ce,ann);
2358 p_float_lin_cmp_reif(s,
FRT_LE,ce,ann);
2362 FloatVar x = s.arg2FloatVar(ce[0]);
2363 FloatVar y = s.arg2FloatVar(ce[1]);
2364 FloatVar z = s.arg2FloatVar(ce[2]);
2369 FloatVar x = s.arg2FloatVar(ce[0]);
2370 FloatVar y = s.arg2FloatVar(ce[1]);
2371 FloatVar z = s.arg2FloatVar(ce[2]);
2376 FloatVar x = s.arg2FloatVar(ce[0]);
2377 FloatVar y = s.arg2FloatVar(ce[1]);
2378 FloatVar z = s.arg2FloatVar(ce[2]);
2383 FloatVar x = s.arg2FloatVar(ce[0]);
2384 FloatVar y = s.arg2FloatVar(ce[1]);
2389 FloatVar x = s.arg2FloatVar(ce[0]);
2390 FloatVar y = s.arg2FloatVar(ce[1]);
2395 FloatVar x = s.arg2FloatVar(ce[0]);
2396 FloatVar y = s.arg2FloatVar(ce[1]);
2400 FloatVar x = s.arg2FloatVar(ce[0]);
2401 FloatVar y = s.arg2FloatVar(ce[1]);
2402 BoolVar
b = s.arg2BoolVar(ce[2]);
2406 FloatVar x = s.arg2FloatVar(ce[0]);
2407 FloatVar y = s.arg2FloatVar(ce[1]);
2411 FloatVar x = s.arg2FloatVar(ce[0]);
2412 FloatVar y = s.arg2FloatVar(ce[1]);
2413 BoolVar
b = s.arg2BoolVar(ce[2]);
2417 FloatVar x = s.arg2FloatVar(ce[0]);
2418 FloatVar y = s.arg2FloatVar(ce[1]);
2419 FloatVar z = s.arg2FloatVar(ce[2]);
2423 FloatVar x = s.arg2FloatVar(ce[0]);
2424 FloatVar y = s.arg2FloatVar(ce[1]);
2425 FloatVar z = s.arg2FloatVar(ce[2]);
2429 FloatVar x = s.arg2FloatVar(ce[0]);
2430 FloatVar y = s.arg2FloatVar(ce[1]);
2436 FloatVar x = s.arg2FloatVar(ce[0]);
2437 FloatVar y = s.arg2FloatVar(ce[1]);
2438 BoolVar
b = s.arg2BoolVar(ce[2]);
2441 rel(s, b == (b0 && !b1));
2447 FloatVar x = s.arg2FloatVar(ce[0]);
2448 FloatVar y = s.arg2FloatVar(ce[1]);
2452#ifdef GECODE_HAS_MPFR
2453#define P_FLOAT_OP(Op) \
2454 void p_float_ ## Op (FlatZincSpace& s, const ConExpr& ce, AST::Node*) {\
2455 FloatVar x = s.arg2FloatVar(ce[0]);\
2456 FloatVar y = s.arg2FloatVar(ce[1]);\
2471 void p_float_ln(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2472 FloatVar x = s.arg2FloatVar(ce[0]);
2473 FloatVar y = s.arg2FloatVar(ce[1]);
2477 FloatVar x = s.arg2FloatVar(ce[0]);
2478 FloatVar y = s.arg2FloatVar(ce[1]);
2482 FloatVar x = s.arg2FloatVar(ce[0]);
2483 FloatVar y = s.arg2FloatVar(ce[1]);
2509 registry().
add(
"float_lin_eq_reif",&p_float_lin_eq_reif);
2512 registry().
add(
"float_lin_le_reif",&p_float_lin_le_reif);
2513 registry().
add(
"float_lin_lt_reif",&p_float_lin_lt_reif);
2515#ifdef GECODE_HAS_MPFR
iterator end(void)
Return an iterator past the end of the array.
int size(void) const
Return size of array (number of elements).
Node representing a function call
A node in a FlatZinc abstract syntax tree.
static BlackBoxContextHandle & context(FlatZincSpace &s)
Abstract representation of a constraint.
std::string id
Identifier for the constraint.
AST::Array * ann
Constraint annotations.
Exception class for FlatZinc errors
A space that can be initialized with a FlatZinc model.
IntVarArgs arg2intvarargs(AST::Node *arg, int offset=0)
Convert arg to IntVarArgs.
IntPropLevel ann2ipl(AST::Node *ann)
Convert ann to integer propagation level.
Map from constraint identifier to constraint posting functions.
void(* poster)(FlatZincSpace &, const ConExpr &, AST::Node *)
Type of constraint posting function.
void add(const std::string &id, poster p)
Add posting function p with identifier id.
void post(FlatZincSpace &s, const ConExpr &ce)
Post constraint specified by ce.
FloatNum size(void) const
Return size of float value (distance between maximum and minimum).
void * ralloc(size_t s)
Allocate s bytes from heap.
Passing integer arguments.
static IntArgs create(int n, int start, int inc=1)
Allocate array with n elements such that for all .
static const IntSet empty
Empty set.
Passing integer variables.
Heap heap
The single global heap.
void linear(Home home, const FloatVarArgs &x, FloatRelType frt, FloatVal c)
Post propagator for .
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1)
Post propagator for .
FloatRelType
Relation types for floats.
@ FRT_LQ
Less or equal ( ).
void binpacking(Home home, const IntVarArgs &l, const IntVarArgs &b, const IntArgs &s, IntPropLevel ipl=IPL_DEF)
Post propagator for bin packing.
void extensional(Home home, const IntVarArgs &x, DFA d, IntPropLevel ipl=IPL_DEF)
Post domain consistent propagator for extensional constraint described by a DFA.
void nooverlap(Home home, const IntVarArgs &x, const IntArgs &w, const IntVarArgs &y, const IntArgs &h, IntPropLevel ipl=IPL_DEF)
Post propagator for rectangle packing.
void precede(Home home, const IntVarArgs &x, int s, int t, IntPropLevel=IPL_DEF)
Post propagator that s precedes t in x.
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...
IntRelType
Relation types for integers.
ReifyMode
Mode for reification.
IntPropLevel
Propagation levels for integer propagators.
@ IRT_GQ
Greater or equal ( ).
@ IRT_LQ
Less or equal ( ).
@ RM_IMP
Implication for reification.
@ RM_EQV
Equivalence for reification (default).
@ IPL_DOM
Domain propagation Options: basic versus advanced propagation.
@ IPL_DEF
Simple propagation levels.
@ IPL_BND
Bounds propagation.
void weights(Home home, IntSharedArray elements, IntSharedArray weights, SetVar x, IntVar y)
Post propagator for .
SetOpType
Common operations for sets.
SetRelType
Common relation types for sets.
@ SOT_DUNION
Disjoint union.
@ SRT_LQ
Less or equal ( ).
Interpreter for the FlatZinc language.
Registry & registry(void)
Return global registry object.
void blackbox_bounds(Home home, BlackBoxContextHandle &context, const IntVarArgs &ivar, const FloatVarArgs &fvar, const std::string &mode, const std::string &target, const std::vector< std::string > &args, const std::vector< int > &reason)
void blackbox(Home home, BlackBoxContextHandle &context, const IntVarArgs &int_in, const IntVarArgs &int_out, const FloatVarArgs &float_in, const FloatVarArgs &float_out, const std::string &mode, const std::string &target, const std::vector< std::string > &args)
const int min
Smallest allowed integer value.
const int max
Largest allowed integer value.
const int min
Smallest allowed integer in integer set.
const int max
Largest allowed integer in integer set.
Gecode toplevel namespace
ArgArray< IntSet > IntSetArgs
Passing set arguments.
void sin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void count(Home home, const IntVarArgs &x, int n, IntRelType irt, int m, IntPropLevel ipl=IPL_DEF)
Post propagator for .
void channel(Home home, FloatVar x0, IntVar x1)
Post propagator for channeling a float and an integer variable .
void mod(Home home, IntVar x0, IntVar x1, IntVar x2, IntPropLevel ipl=IPL_DEF)
Post propagator for .
void sequence(Home home, const IntVarArgs &x, const IntSet &s, int q, int l, int u, IntPropLevel ipl=IPL_DEF)
Post propagator for .
SharedArray< int > IntSharedArray
Arrays of integers that can be shared among several element constraints.
IntVar expr(Home home, const LinIntExpr &e, const IntPropLevels &ipls=IntPropLevels::def)
Post linear expression and return its value.
void sorted(Home home, const IntVarArgs &x, const IntVarArgs &y, IntPropLevel ipl=IPL_DEF)
Post propagator that y is x sorted in increasing order.
void distinct(Home home, const IntVarArgs &x, IntPropLevel ipl=IPL_DEF)
Post propagator for for all .
void cos(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
IntRelType neg(IntRelType irt)
Return negated relation type of irt.
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
void abs(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void div(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
void element(Home home, IntSharedArray n, IntVar x0, IntVar x1, IntPropLevel ipl=IPL_DEF)
Post domain consistent propagator for .
void argmax(Home home, const IntVarArgs &x, IntVar y, bool tiebreak=true, IntPropLevel ipl=IPL_DEF)
Post propagator for .
void mult(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
IntRelType swap(IntRelType irt)
Return swapped relation type of irt.
void sqrt(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void acos(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void cumulative(Home home, int c, const TaskTypeArgs &t, const IntVarArgs &flex, const IntArgs &fix, const IntArgs &u, IntPropLevel ipl=IPL_DEF)
Post propagators for scheduling tasks on cumulative resources.
void cumulatives(Home home, const IntVarArgs &m, const IntVarArgs &s, const IntVarArgs &p, const IntVarArgs &e, const IntVarArgs &u, const IntArgs &c, bool at_most, IntPropLevel ipl=IPL_DEF)
Post propagators for the cumulatives constraint.
void log(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void convex(Home home, SetVar x)
Post propagator that propagates that x is convex.
void exp(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void atan(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void unshare(Home home, IntVarArgs &x, IntPropLevel ipl=IPL_DEF)
Replace multiple variable occurrences in x by fresh variables.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
void argmin(Home home, const IntVarArgs &x, IntVar y, bool tiebreak=true, IntPropLevel ipl=IPL_DEF)
Post propagator for .
void nvalues(Home home, const IntVarArgs &x, IntRelType irt, int y, IntPropLevel ipl=IPL_DEF)
Post propagator for .
void unary(Home home, const IntVarArgs &s, const IntArgs &p, IntPropLevel ipl=IPL_DEF)
Post propagators for scheduling tasks on unary resources.
void asin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void member(Home home, const IntVarArgs &x, IntVar y, IntPropLevel ipl=IPL_DEF)
Post domain consistent propagator for .
void pow(Home home, FloatVar x0, int n, FloatVar x1)
Post propagator for for .
LinIntExpr cardinality(const SetExpr &)
Cardinality of set expression.
void circuit(Home home, const IntVarArgs &x, IntPropLevel ipl=IPL_DEF)
Post propagator such that x forms a circuit.
void tan(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
Gecode::FloatVal b(9, 12)
Gecode::FloatVal a(-8, 5)
Gecode::IntArgs i({1, 2, 3, 4})
#define BOOL_ARRAY_OP(op)
#define GECODE_HAS_FLOAT_VARS