43#ifdef GECODE_HAS_SET_VARS
46#ifdef GECODE_HAS_FLOAT_VARS
60 std::map<std::string,poster>::iterator i = r.find(ce.
id);
63 std::string(
"Constraint ")+ce.
id+
" not found");
65 i->second(s, ce, ce.
ann);
71 r[
"gecode_" + id] = p;
83 void p_distinctOffset(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
86 AST::Array* offs = ce.args->a[0]->getArray();
88 for (
int i=offs->a.size(); i--; ) {
89 oa[i] = offs->a[i]->getInt();
96 IntVarArgs va = s.arg2intvarargs(ce[0]);
102 if (ce[0]->isIntVar()) {
103 if (ce[1]->isIntVar()) {
104 rel(s, s.arg2IntVar(ce[0]), irt, s.arg2IntVar(ce[1]),
107 rel(s, s.arg2IntVar(ce[0]), irt, ce[1]->getInt(), s.ann2ipl(ann));
110 rel(s, s.arg2IntVar(ce[1]),
swap(irt), ce[0]->getInt(),
115 p_int_CMP(s,
IRT_EQ, ce, ann);
118 p_int_CMP(s,
IRT_NQ, ce, ann);
121 p_int_CMP(s,
IRT_GQ, ce, ann);
124 p_int_CMP(s,
IRT_GR, ce, ann);
127 p_int_CMP(s,
IRT_LQ, ce, ann);
130 p_int_CMP(s,
IRT_LE, ce, ann);
134 if (rm ==
RM_EQV && ce[2]->isBool()) {
135 if (ce[2]->getBool()) {
136 p_int_CMP(s, irt, ce, ann);
138 p_int_CMP(s,
neg(irt), ce, ann);
142 if (ce[0]->isIntVar()) {
143 if (ce[1]->isIntVar()) {
144 rel(s, s.arg2IntVar(ce[0]), irt, s.arg2IntVar(ce[1]),
145 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
147 rel(s, s.arg2IntVar(ce[0]), irt, ce[1]->getInt(),
148 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
151 rel(s, s.arg2IntVar(ce[1]),
swap(irt), ce[0]->getInt(),
152 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
198 IntArgs ia = s.arg2intargs(ce[0]);
200 if (s.isBoolArray(ce[1],singleIntVar)) {
201 if (singleIntVar != -1) {
202 if (std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
203 IntVar siv = s.arg2IntVar(ce[1]->getArray()->a[singleIntVar]);
204 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar);
205 IntArgs ia_tmp(ia.size()-1);
207 for (
int i=0;
i<ia.
size();
i++) {
208 if (i != singleIntVar)
209 ia_tmp[
count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
212 linear(s, ia_tmp, iv, t, siv, s.ann2ipl(ann));
214 IntVarArgs iv = s.arg2intvarargs(ce[1]);
215 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
218 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
219 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
222 IntVarArgs iv = s.arg2intvarargs(ce[1]);
223 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
228 if (rm ==
RM_EQV && ce[2]->isBool()) {
229 if (ce[2]->getBool()) {
230 p_int_lin_CMP(s, irt, ce, ann);
232 p_int_lin_CMP(s,
neg(irt), ce, ann);
236 IntArgs ia = s.arg2intargs(ce[0]);
238 if (s.isBoolArray(ce[1],singleIntVar)) {
239 if (singleIntVar != -1) {
240 if (std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
241 IntVar siv = s.arg2IntVar(ce[1]->getArray()->a[singleIntVar]);
242 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar);
243 IntArgs ia_tmp(ia.size()-1);
245 for (
int i=0;
i<ia.
size();
i++) {
246 if (i != singleIntVar)
247 ia_tmp[
count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
250 linear(s, ia_tmp, iv, t, siv, Reify(s.arg2BoolVar(ce[3]), rm),
253 IntVarArgs iv = s.arg2intvarargs(ce[1]);
254 linear(s, ia, iv, irt, ce[2]->getInt(),
255 Reify(s.arg2BoolVar(ce[3]), rm), s.ann2ipl(ann));
258 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
259 linear(s, ia, iv, irt, ce[2]->getInt(),
260 Reify(s.arg2BoolVar(ce[3]), rm), s.ann2ipl(ann));
263 IntVarArgs iv = s.arg2intvarargs(ce[1]);
264 linear(s, ia, iv, irt, ce[2]->getInt(),
265 Reify(s.arg2BoolVar(ce[3]), rm),
270 p_int_lin_CMP(s,
IRT_EQ, ce, ann);
279 p_int_lin_CMP(s,
IRT_NQ, ce, ann);
288 p_int_lin_CMP(s,
IRT_LQ, ce, ann);
297 p_int_lin_CMP(s,
IRT_LE, ce, ann);
306 p_int_lin_CMP(s,
IRT_GQ, ce, ann);
315 p_int_lin_CMP(s,
IRT_GR, ce, ann);
326 IntArgs ia = s.arg2intargs(ce[0]);
327 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
328 if (ce[2]->isIntVar())
329 linear(s, ia, iv, irt, s.iv[ce[2]->getIntVar()], s.ann2ipl(ann));
331 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
335 if (rm ==
RM_EQV && ce[2]->isBool()) {
336 if (ce[2]->getBool()) {
337 p_bool_lin_CMP(s, irt, ce, ann);
339 p_bool_lin_CMP(s,
neg(irt), ce, ann);
343 IntArgs ia = s.arg2intargs(ce[0]);
344 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
345 if (ce[2]->isIntVar())
346 linear(s, ia, iv, irt, s.iv[ce[2]->getIntVar()],
347 Reify(s.arg2BoolVar(ce[3]), rm),
350 linear(s, ia, iv, irt, ce[2]->getInt(),
351 Reify(s.arg2BoolVar(ce[3]), rm),
355 p_bool_lin_CMP(s,
IRT_EQ, ce, ann);
366 p_bool_lin_CMP(s,
IRT_NQ, ce, ann);
377 p_bool_lin_CMP(s,
IRT_LQ, ce, ann);
389 p_bool_lin_CMP(s,
IRT_LE, ce, ann);
400 p_bool_lin_CMP(s,
IRT_GQ, ce, ann);
411 p_bool_lin_CMP(s,
IRT_GR, ce, ann);
425 if (!ce[0]->isIntVar()) {
426 rel(s, ce[0]->getInt() + s.arg2IntVar(ce[1])
427 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
428 }
else if (!ce[1]->isIntVar()) {
429 rel(s, s.arg2IntVar(ce[0]) + ce[1]->getInt()
430 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
431 }
else if (!ce[2]->isIntVar()) {
432 rel(s, s.arg2IntVar(ce[0]) + s.arg2IntVar(ce[1])
433 == ce[2]->getInt(), s.ann2ipl(ann));
435 rel(s, s.arg2IntVar(ce[0]) + s.arg2IntVar(ce[1])
436 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
441 if (!ce[0]->isIntVar()) {
442 rel(s, ce[0]->getInt() - s.arg2IntVar(ce[1])
443 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
444 }
else if (!ce[1]->isIntVar()) {
445 rel(s, s.arg2IntVar(ce[0]) - ce[1]->getInt()
446 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
447 }
else if (!ce[2]->isIntVar()) {
448 rel(s, s.arg2IntVar(ce[0]) - s.arg2IntVar(ce[1])
449 == ce[2]->getInt(), s.ann2ipl(ann));
451 rel(s, s.arg2IntVar(ce[0]) - s.arg2IntVar(ce[1])
452 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
457 IntVar x0 = s.arg2IntVar(ce[0]);
458 IntVar x1 = s.arg2IntVar(ce[1]);
459 IntVar x2 = s.arg2IntVar(ce[2]);
460 mult(s, x0, x1, x2, s.ann2ipl(ann));
463 IntVar x0 = s.arg2IntVar(ce[0]);
464 IntVar x2 = s.arg2IntVar(ce[2]);
465 pow(s, x0, ce[1]->getInt(), x2, s.ann2ipl(ann));
468 IntVar x0 = s.arg2IntVar(ce[0]);
469 IntVar x1 = s.arg2IntVar(ce[1]);
470 IntVar x2 = s.arg2IntVar(ce[2]);
471 div(s,x0,x1,x2, s.ann2ipl(ann));
474 IntVar x0 = s.arg2IntVar(ce[0]);
475 IntVar x1 = s.arg2IntVar(ce[1]);
476 IntVar x2 = s.arg2IntVar(ce[2]);
477 mod(s,x0,x1,x2, s.ann2ipl(ann));
481 IntVar x0 = s.arg2IntVar(ce[0]);
482 IntVar x1 = s.arg2IntVar(ce[1]);
483 IntVar x2 = s.arg2IntVar(ce[2]);
484 min(s, x0, x1, x2, 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 max(s, x0, x1, x2, s.ann2ipl(ann));
493 IntVar x0 = s.arg2IntVar(ce[0]);
494 IntVar x1 = s.arg2IntVar(ce[1]);
495 rel(s, x0 == -x1, s.ann2ipl(ann));
501 rel(s, s.arg2BoolVar(ce[0]), irt, s.arg2BoolVar(ce[1]),
506 rel(s, s.arg2BoolVar(ce[0]), irt, s.arg2BoolVar(ce[1]),
507 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
510 p_bool_CMP(s,
IRT_EQ, ce, ann);
519 p_bool_CMP(s,
IRT_NQ, ce, ann);
528 p_bool_CMP(s,
IRT_GQ, ce, ann);
537 p_bool_CMP(s,
IRT_LQ, ce, ann);
546 p_bool_CMP(s,
IRT_GR, ce, ann);
555 p_bool_CMP(s,
IRT_LE, ce, ann);
565 BoolVar b0 = s.arg2BoolVar(ce[0]); \
566 BoolVar b1 = s.arg2BoolVar(ce[1]); \
567 if (ce[2]->isBool()) { \
568 rel(s, b0, op, b1, ce[2]->getBool(), s.ann2ipl(ann)); \
570 rel(s, b0, op, b1, s.bv[ce[2]->getBoolVar()], s.ann2ipl(ann)); \
573#define BOOL_ARRAY_OP(op) \
574 BoolVarArgs bv = s.arg2boolvarargs(ce[0]); \
575 if (ce.size()==1) { \
576 rel(s, op, bv, 1, s.ann2ipl(ann)); \
577 } else if (ce[1]->isBool()) { \
578 rel(s, op, bv, ce[1]->getBool(), s.ann2ipl(ann)); \
580 rel(s, op, bv, s.bv[ce[1]->getBoolVar()], s.ann2ipl(ann)); \
583 void p_bool_or(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
587 BoolVar b0 = s.arg2BoolVar(ce[0]);
588 BoolVar
b1 = s.arg2BoolVar(ce[1]);
589 BoolVar
b2 = s.arg2BoolVar(ce[2]);
590 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
597 BoolVar b0 = s.arg2BoolVar(ce[0]);
598 BoolVar
b1 = s.arg2BoolVar(ce[1]);
599 BoolVar
b2 = s.arg2BoolVar(ce[2]);
610 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
611 BoolVar
b1 = s.arg2BoolVar(ce[1]);
612 for (
unsigned int i=bv.size(); i--;)
613 rel(s, b1,
BOT_IMP, bv[i], 1, s.ann2ipl(ann));
622 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
623 BoolVar
b1 = s.arg2BoolVar(ce[1]);
624 clause(s,
BOT_OR, bv, BoolVarArgs()<<b1, 1, s.ann2ipl(ann));
633 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
636 rel(s, s.arg2BoolVar(ce[1]),
BOT_IMP, tmp, 1);
640 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
641 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
646 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
647 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
648 BoolVar b0 = s.arg2BoolVar(ce[2]);
653 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
654 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
655 BoolVar b0 = s.arg2BoolVar(ce[2]);
662 BoolVar b0 = s.arg2BoolVar(ce[0]);
663 BoolVar
b1 = s.arg2BoolVar(ce[1]);
664 BoolVar
b2 = s.arg2BoolVar(ce[2]);
665 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
667 clause(s,
BOT_OR, BoolVarArgs(), BoolVarArgs()<<b0<<b1<<b2, 1,
671 BoolVar b0 = s.arg2BoolVar(ce[0]);
672 BoolVar
b1 = s.arg2BoolVar(ce[1]);
673 if (ce[2]->isBool()) {
674 rel(s, b1,
BOT_IMP, b0, ce[2]->getBool(), s.ann2ipl(ann));
676 rel(s, b1,
BOT_IMP, b0, s.bv[ce[2]->getBoolVar()], s.ann2ipl(ann));
683 BoolVar x0 = s.arg2BoolVar(ce[0]);
684 BoolVar x1 = s.arg2BoolVar(ce[1]);
691 bool isConstant =
true;
693 for (
int i=
a->a.
size(); i--;) {
694 if (!
a->a[i]->isInt()) {
699 IntVar selector = s.arg2IntVar(ce[0]);
700 rel(s, selector > 0);
703 element(s, sia, selector, s.arg2IntVar(ce[2]), s.ann2ipl(ann));
705 IntVarArgs iv = s.arg2intvarargs(ce[1], 1);
706 element(s, iv, selector, s.arg2IntVar(ce[2]), s.ann2ipl(ann));
711 bool isConstant =
true;
713 for (
int i=
a->a.
size(); i--;) {
714 if (!
a->a[i]->isBool()) {
719 IntVar selector = s.arg2IntVar(ce[0]);
720 rel(s, selector > 0);
723 element(s, sia, selector, s.arg2BoolVar(ce[2]), s.ann2ipl(ann));
725 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 1);
726 element(s, iv, selector, s.arg2BoolVar(ce[2]), s.ann2ipl(ann));
732 BoolVar x0 = s.arg2BoolVar(ce[0]);
733 IntVar x1 = s.arg2IntVar(ce[1]);
734 if (ce[0]->isBoolVar() && ce[1]->isIntVar()) {
735 s.aliasBool2Int(ce[1]->getIntVar(), ce[0]->getBoolVar());
737 channel(s, x0, x1, s.ann2ipl(ann));
741 IntSet
d = s.arg2intset(ce[1]);
742 if (ce[0]->isBoolVar()) {
744 Iter::Ranges::Singleton sr(0,1);
745 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
747 if (d01.size() == 0) {
750 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
751 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
754 dom(s, s.arg2IntVar(ce[0]), d);
758 IntSet
d = s.arg2intset(ce[1]);
759 if (ce[0]->isBoolVar()) {
761 Iter::Ranges::Singleton sr(0,1);
762 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
764 if (d01.size() == 0) {
765 rel(s, s.arg2BoolVar(ce[2]) == 0);
766 }
else if (d01.max() == 0) {
767 rel(s, s.arg2BoolVar(ce[2]) == !s.arg2BoolVar(ce[0]));
768 }
else if (d01.min() == 1) {
769 rel(s, s.arg2BoolVar(ce[2]) == s.arg2BoolVar(ce[0]));
771 rel(s, s.arg2BoolVar(ce[2]) == 1);
774 dom(s, s.arg2IntVar(ce[0]), d, s.arg2BoolVar(ce[2]));
778 IntSet
d = s.arg2intset(ce[1]);
779 if (ce[0]->isBoolVar()) {
781 Iter::Ranges::Singleton sr(0,1);
782 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
784 if (d01.size() == 0) {
785 rel(s, s.arg2BoolVar(ce[2]) == 0);
786 }
else if (d01.max() == 0) {
787 rel(s, s.arg2BoolVar(ce[2]) >> !s.arg2BoolVar(ce[0]));
788 }
else if (d01.min() == 1) {
789 rel(s, s.arg2BoolVar(ce[2]) >> s.arg2BoolVar(ce[0]));
792 dom(s, s.arg2IntVar(ce[0]), d, Reify(s.arg2BoolVar(ce[2]),
RM_IMP));
799 IntVar x0 = s.arg2IntVar(ce[0]);
800 IntVar x1 = s.arg2IntVar(ce[1]);
801 abs(s, x0, x1, s.ann2ipl(ann));
805 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
806 IntVarArgs iv1 = s.arg2intvarargs(ce[1]);
807 rel(s, iv0,
IRT_LE, iv1, s.ann2ipl(ann));
811 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
812 IntVarArgs iv1 = s.arg2intvarargs(ce[1]);
813 rel(s, iv0,
IRT_LQ, iv1, s.ann2ipl(ann));
818 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
819 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
820 rel(s, bv0,
IRT_LE, bv1, s.ann2ipl(ann));
825 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
826 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
827 rel(s, bv0,
IRT_LQ, bv1, s.ann2ipl(ann));
831 IntVarArgs iv = s.arg2intvarargs(ce[0]);
832 if (!ce[1]->isIntVar()) {
833 if (!ce[2]->isIntVar()) {
834 count(s, iv, ce[1]->getInt(),
IRT_EQ, ce[2]->getInt(),
837 count(s, iv, ce[1]->getInt(),
IRT_EQ, s.arg2IntVar(ce[2]),
840 }
else if (!ce[2]->isIntVar()) {
841 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, ce[2]->getInt(),
844 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, s.arg2IntVar(ce[2]),
850 IntVarArgs iv = s.arg2intvarargs(ce[0]);
851 IntVar
x = s.arg2IntVar(ce[1]);
852 IntVar
y = s.arg2IntVar(ce[2]);
853 BoolVar
b = s.arg2BoolVar(ce[3]);
859 IntVarArgs iv = s.arg2intvarargs(ce[0]);
860 IntVar
x = s.arg2IntVar(ce[1]);
861 IntVar
y = s.arg2IntVar(ce[2]);
862 BoolVar
b = s.arg2BoolVar(ce[3]);
870 IntVarArgs iv = s.arg2intvarargs(ce[1]);
871 count(s, iv, ce[2]->getInt(), irt, ce[0]->getInt(), s.ann2ipl(ann));
875 count_rel(
IRT_LQ, s, ce, ann);
879 count_rel(
IRT_GQ, s, ce, ann);
884 int minIdx = ce[3]->getInt();
885 IntVarArgs load = s.arg2intvarargs(ce[0]);
887 IntVarArgs bin = s.arg2intvarargs(ce[1]);
888 for (
int i=bin.size(); i--;)
889 rel(s, bin[i] >= minIdx);
891 for (
int i=minIdx;
i--;)
893 }
else if (minIdx < 0) {
894 IntVarArgs bin2(bin.size());
895 for (
int i=bin.size(); i--;)
896 bin2[
i] =
expr(s, bin[i]-minIdx, s.ann2ipl(ann));
900 IntArgs sizes = s.arg2intargs(ce[2]);
902 IntVarArgs allvars = l + bin;
904 binpacking(s, allvars.slice(0,1,l.size()), allvars.slice(l.size(),1,bin.size()),
905 sizes, s.ann2ipl(ann));
910 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
911 IntArgs cover = s.arg2intargs(ce[1]);
912 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
915 IntSet cover_s(cover);
916 IntSetRanges cover_r(cover_s);
917 IntVarRanges* iv0_ri = re.alloc<IntVarRanges>(iv0.size());
918 for (
int i=iv0.size(); i--;)
919 iv0_ri[
i] = IntVarRanges(iv0[i]);
920 Iter::Ranges::NaryUnion iv0_r(re,iv0_ri,iv0.size());
921 Iter::Ranges::Diff<Iter::Ranges::NaryUnion,IntSetRanges>
922 extra_r(iv0_r,cover_r);
923 Iter::Ranges::ToValues<Iter::Ranges::Diff<
924 Iter::Ranges::NaryUnion,IntSetRanges> > extra(extra_r);
925 for (; extra(); ++extra) {
926 cover << extra.val();
927 iv1 << IntVar(s,0,iv0.size());
933 IntVarArgs allvars = iv0+iv1;
935 count(s, allvars.slice(0,1,iv0.size()),
936 allvars.slice(iv0.size(),1,iv1.size()),
940 count(s, iv0, iv1, cover, ipl);
946 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
947 IntArgs cover = s.arg2intargs(ce[1]);
948 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
953 IntVarArgs allvars = iv0+iv1;
955 count(s, allvars.slice(0,1,iv0.size()),
956 allvars.slice(iv0.size(),1,iv1.size()),
960 count(s, iv0, iv1, cover, ipl);
966 IntVarArgs
x = s.arg2intvarargs(ce[0]);
967 IntArgs cover = s.arg2intargs(ce[1]);
969 IntArgs lbound = s.arg2intargs(ce[2]);
970 IntArgs ubound = s.arg2intargs(ce[3]);
972 for (
int i=cover.size(); i--;)
973 y[
i] = IntSet(lbound[i],ubound[i]);
975 IntSet cover_s(cover);
977 IntVarRanges* xrs = re.alloc<IntVarRanges>(
x.size());
978 for (
int i=
x.size(); i--;)
980 Iter::Ranges::NaryUnion u(re, xrs,
x.size());
981 Iter::Ranges::ToValues<Iter::Ranges::NaryUnion> uv(u);
983 if (!cover_s.in(uv.val())) {
985 y << IntSet(0,
x.size());
998 IntVarArgs
x = s.arg2intvarargs(ce[0]);
999 IntArgs cover = s.arg2intargs(ce[1]);
1001 IntArgs lbound = s.arg2intargs(ce[2]);
1002 IntArgs ubound = s.arg2intargs(ce[3]);
1004 for (
int i=cover.size(); i--;)
1005 y[
i] = IntSet(lbound[i],ubound[i]);
1014 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1015 min(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
1019 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1020 max(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
1024 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1025 int offset = ce[1]->getInt();
1026 argmin(s, iv,
offset, s.arg2IntVar(ce[2]),
true, s.ann2ipl(ann));
1030 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1031 int offset = ce[1]->getInt();
1032 argmax(s, iv,
offset, s.arg2IntVar(ce[2]),
true, s.ann2ipl(ann));
1036 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
1037 int offset = ce[1]->getInt();
1038 argmin(s, bv,
offset, s.arg2IntVar(ce[2]),
true, s.ann2ipl(ann));
1042 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
1043 int offset = ce[1]->getInt();
1044 argmax(s, bv,
offset, s.arg2IntVar(ce[2]),
true, s.ann2ipl(ann));
1048 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1049 int q = ce[1]->getInt();
1050 int symbols = ce[2]->getInt();
1051 IntArgs
d = s.arg2intargs(ce[3]);
1052 int q0 = ce[4]->getInt();
1055 for (
int i=1;
i<=q;
i++) {
1056 for (
int j=1; j<=symbols; j++) {
1057 if (d[(i-1)*symbols+(j-1)] > 0)
1063 DFA::Transition* t = re.alloc<DFA::Transition>(noOfTrans+1);
1065 for (
int i=1;
i<=q;
i++) {
1066 for (
int j=1; j<=symbols; j++) {
1067 if (d[(i-1)*symbols+(j-1)] > 0) {
1068 t[noOfTrans].i_state =
i;
1069 t[noOfTrans].symbol = j;
1070 t[noOfTrans].o_state =
d[(
i-1)*symbols+(j-1)];
1075 t[noOfTrans].i_state = -1;
1081 f =
static_cast<int*
>(
heap.
ralloc(
sizeof(
int)*(sl->max-sl->min+2)));
1082 for (
int i=sl->min; i<=sl->
max; i++)
1084 f[sl->max-sl->min+1] = -1;
1086 f =
static_cast<int*
>(
heap.
ralloc(
sizeof(
int)*(sl->s.size()+1)));
1087 for (
int j=sl->s.size(); j--; )
1089 f[sl->s.size()] = -1;
1095 extensional(s, iv, s.getSharedDFA(dfa), s.ann2ipl(ann));
1100 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1101 IntVarArgs
y = s.arg2intvarargs(ce[1]);
1102 IntVarArgs xy(
x.size()+
y.size());
1103 for (
int i=
x.size(); i--;)
1105 for (
int i=
y.size(); i--;)
1106 xy[
i+
x.size()] =
y[
i];
1108 for (
int i=
x.size(); i--;)
1110 for (
int i=
y.size(); i--;)
1111 y[
i] = xy[
i+
x.size()];
1117 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1119 int xoff = ce[1]->getInt();
1120 IntVarArgs
y = s.arg2intvarargs(ce[2]);
1122 int yoff = ce[3]->getInt();
1123 channel(s,
x, xoff,
y, yoff, s.ann2ipl(ann));
1128 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1134 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1140 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1146 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1152 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1153 IntArgs tuples = s.arg2intargs(ce[1]);
1154 TupleSet ts = s.arg2tupleset(tuples,
x.size());
1160 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1161 IntArgs tuples = s.arg2intargs(ce[1]);
1162 TupleSet ts = s.arg2tupleset(tuples,
x.size());
1168 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1169 IntArgs tuples = s.arg2intargs(ce[1]);
1170 TupleSet ts = s.arg2tupleset(tuples,
x.size());
1176 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1177 IntArgs tuples = s.arg2boolargs(ce[1]);
1178 TupleSet ts = s.arg2tupleset(tuples,
x.size());
1184 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1185 IntArgs tuples = s.arg2boolargs(ce[1]);
1186 TupleSet ts = s.arg2tupleset(tuples,
x.size());
1192 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1193 IntArgs tuples = s.arg2boolargs(ce[1]);
1194 TupleSet ts = s.arg2tupleset(tuples,
x.size());
1200 IntVarArgs start = s.arg2intvarargs(ce[0]);
1201 IntArgs duration = s.arg2intargs(ce[1]);
1202 IntArgs height = s.arg2intargs(ce[2]);
1203 BoolVarArgs
opt = s.arg2boolvarargs(ce[3]);
1204 int bound = ce[4]->getInt();
1206 cumulative(s,bound,start,duration,height,opt,s.ann2ipl(ann));
1211 IntVarArgs start = s.arg2intvarargs(ce[0]);
1212 IntVarArgs duration = s.arg2intvarargs(ce[1]);
1213 IntVarArgs height = s.arg2intvarargs(ce[2]);
1214 int n = start.size();
1215 IntVar bound = s.arg2IntVar(ce[3]);
1221 rel(s, height[0] <= bound);
1225 int minHeight = std::min(height[0].
min(),height[1].
min());
1226 int minHeight2 = std::max(height[0].
min(),height[1].
min());
1227 for (
int i=2;
i<n;
i++) {
1228 if (height[i].
min() < minHeight) {
1229 minHeight2 = minHeight;
1230 minHeight = height[
i].min();
1231 }
else if (height[i].
min() < minHeight2) {
1232 minHeight2 = height[
i].min();
1236 (minHeight > bound.max()/2) ||
1237 (minHeight2 > bound.max()/2 && minHeight+minHeight2>bound.max());
1239 rel(s, bound >=
max(height));
1241 if (duration.assigned()) {
1242 IntArgs durationI(n);
1244 durationI[i] = duration[i].val();
1246 unary(s,start,durationI);
1250 end[i] =
expr(s,start[i]+duration[i]);
1252 unary(s,start,duration,end);
1254 }
else if (height.assigned()) {
1257 heightI[i] = height[i].val();
1258 if (duration.assigned()) {
1259 IntArgs durationI(n);
1261 durationI[i] = duration[i].val();
1262 cumulative(s, bound, start, durationI, heightI);
1265 for (
int i = n;
i--; )
1266 end[i] =
expr(s,start[i]+duration[i]);
1267 cumulative(s, bound, start, duration, end, heightI);
1269 }
else if (bound.assigned()) {
1271 IntArgs limit({bound.val()});
1274 end[i] =
expr(s,start[i]+duration[i]);
1275 cumulatives(s, machine, start, duration, end, height, limit,
true,
1280 IntVarArgs end(start.size());
1281 for (
int i = start.size(); i--; ) {
1283 max = std::max(
max, start[i].
max() + duration[i].
max());
1284 end[
i] =
expr(s, start[i] + duration[i]);
1286 for (
int time =
min; time <
max; ++time) {
1287 IntVarArgs
x(start.size());
1288 for (
int i = start.size(); i--; ) {
1289 IntVar overlaps =
channel(s,
expr(s, (start[i] <= time) &&
1291 x[
i] =
expr(s, overlaps * height[i]);
1300 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1301 IntSet S = s.arg2intset(ce[1]);
1302 int q = ce[2]->getInt();
1303 int l = ce[3]->getInt();
1304 int u = ce[4]->getInt();
1306 sequence(s,
x, S, q, l, u, s.ann2ipl(ann));
1311 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1312 bool val = ce[1]->getBool();
1313 int q = ce[2]->getInt();
1314 int l = ce[3]->getInt();
1315 int u = ce[4]->getInt();
1318 sequence(s,
x, S, q, l, u, s.ann2ipl(ann));
1322 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1323 IntArgs p = s.arg2intargs(ce[1]);
1330 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1331 IntArgs p = s.arg2intargs(ce[1]);
1332 BoolVarArgs m = s.arg2boolvarargs(ce[2]);
1338 int off = ce[0]->getInt();
1339 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1341 circuit(s,off,xv,s.ann2ipl(ann));
1345 IntArgs
c = s.arg2intargs(ce[0]);
1346 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1347 IntVarArgs yv = s.arg2intvarargs(ce[2]);
1348 IntVar
z = s.arg2IntVar(ce[3]);
1350 circuit(s,c,xv,yv,
z,s.ann2ipl(ann));
1353 IntArgs
c = s.arg2intargs(ce[0]);
1354 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1355 IntVar
z = s.arg2IntVar(ce[2]);
1361 IntVarArgs x0 = s.arg2intvarargs(ce[0]);
1362 IntVarArgs w = s.arg2intvarargs(ce[1]);
1363 IntVarArgs y0 = s.arg2intvarargs(ce[2]);
1364 IntVarArgs h = s.arg2intvarargs(ce[3]);
1365 if (w.assigned() && h.assigned()) {
1366 IntArgs iw(w.size());
1367 for (
int i=w.size(); i--;)
1369 IntArgs ih(h.size());
1370 for (
int i=h.size(); i--;)
1372 nooverlap(s,x0,iw,y0,ih,s.ann2ipl(ann));
1374 int miny = y0[0].min();
1375 int maxy = y0[0].max();
1377 for (
int i=1;
i<y0.
size();
i++) {
1378 miny = std::min(miny,y0[i].
min());
1379 maxy = std::max(maxy,y0[i].
max());
1380 maxdy = std::max(maxdy,ih[i]);
1382 int minx = x0[0].min();
1383 int maxx = x0[0].max();
1385 for (
int i=1;
i<x0.
size();
i++) {
1386 minx = std::min(minx,x0[i].
min());
1387 maxx = std::max(maxx,x0[i].
max());
1388 maxdx = std::max(maxdx,iw[i]);
1395 IntVarArgs x1(x0.size()), y1(y0.size());
1396 for (
int i=x0.size(); i--; )
1397 x1[
i] =
expr(s, x0[i] + w[i]);
1398 for (
int i=y0.size(); i--; )
1399 y1[
i] =
expr(s, y0[i] + h[i]);
1400 nooverlap(s,x0,w,x1,y0,h,y1,s.ann2ipl(ann));
1405 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1406 int p_s = ce[1]->getInt();
1407 int p_t = ce[2]->getInt();
1408 precede(s,
x,p_s,p_t,s.ann2ipl(ann));
1412 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1413 if (ce[0]->isIntVar()) {
1414 IntVar
y = s.arg2IntVar(ce[0]);
1422 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1423 IntSet
v = s.arg2intset(ce[2]);
1424 if (ce[0]->isIntVar()) {
1425 IntVar n = s.arg2IntVar(ce[0]);
1435 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1436 IntVar
y = s.arg2IntVar(ce[1]);
1441 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1442 IntVar
y = s.arg2IntVar(ce[1]);
1443 BoolVar
b = s.arg2BoolVar(ce[2]);
1447 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1448 BoolVar
y = s.arg2BoolVar(ce[1]);
1453 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1454 BoolVar
y = s.arg2BoolVar(ce[1]);
1455 member(s,
x,
y,s.arg2BoolVar(ce[2]),s.ann2ipl(ann));
1462 registry().
add(
"all_different_offset", &p_distinctOffset);
1483 registry().
add(
"int_lin_eq_reif", &p_int_lin_eq_reif);
1484 registry().
add(
"int_lin_eq_imp", &p_int_lin_eq_imp);
1486 registry().
add(
"int_lin_ne_reif", &p_int_lin_ne_reif);
1487 registry().
add(
"int_lin_ne_imp", &p_int_lin_ne_imp);
1489 registry().
add(
"int_lin_le_reif", &p_int_lin_le_reif);
1490 registry().
add(
"int_lin_le_imp", &p_int_lin_le_imp);
1492 registry().
add(
"int_lin_lt_reif", &p_int_lin_lt_reif);
1493 registry().
add(
"int_lin_lt_imp", &p_int_lin_lt_imp);
1495 registry().
add(
"int_lin_ge_reif", &p_int_lin_ge_reif);
1496 registry().
add(
"int_lin_ge_imp", &p_int_lin_ge_imp);
1498 registry().
add(
"int_lin_gt_reif", &p_int_lin_gt_reif);
1499 registry().
add(
"int_lin_gt_imp", &p_int_lin_gt_imp);
1534 registry().
add(
"array_bool_and", &p_array_bool_and);
1535 registry().
add(
"array_bool_and_imp", &p_array_bool_and_imp);
1536 registry().
add(
"array_bool_or", &p_array_bool_or);
1537 registry().
add(
"array_bool_or_imp", &p_array_bool_or_imp);
1538 registry().
add(
"array_bool_xor", &p_array_bool_xor);
1539 registry().
add(
"array_bool_xor_imp", &p_array_bool_xor_imp);
1540 registry().
add(
"bool_clause", &p_array_bool_clause);
1541 registry().
add(
"bool_clause_reif", &p_array_bool_clause_reif);
1542 registry().
add(
"bool_clause_imp", &p_array_bool_clause_imp);
1546 registry().
add(
"array_int_element", &p_array_int_element);
1547 registry().
add(
"array_var_int_element", &p_array_int_element);
1548 registry().
add(
"array_bool_element", &p_array_bool_element);
1549 registry().
add(
"array_var_bool_element", &p_array_bool_element);
1554#ifndef GECODE_HAS_SET_VARS
1562 registry().
add(
"array_bool_lt", &p_array_bool_lt);
1563 registry().
add(
"array_bool_lq", &p_array_bool_lq);
1569 registry().
add(
"gecode_bin_packing_load", &p_bin_packing_load);
1570 registry().
add(
"gecode_global_cardinality", &p_global_cardinality);
1571 registry().
add(
"gecode_global_cardinality_closed",
1572 &p_global_cardinality_closed);
1574 &p_global_cardinality_low_up);
1575 registry().
add(
"global_cardinality_low_up_closed",
1576 &p_global_cardinality_low_up_closed);
1579 registry().
add(
"gecode_minimum_arg_int_offset", &p_minimum_arg);
1580 registry().
add(
"gecode_maximum_arg_int_offset", &p_maximum_arg);
1581 registry().
add(
"gecode_minimum_arg_bool_offset", &p_minimum_arg_bool);
1582 registry().
add(
"gecode_maximum_arg_bool_offset", &p_maximum_arg_bool);
1586 registry().
add(
"inverse_offsets", &p_inverse_offsets);
1587 registry().
add(
"increasing_int", &p_increasing_int);
1588 registry().
add(
"increasing_bool", &p_increasing_bool);
1589 registry().
add(
"decreasing_int", &p_decreasing_int);
1590 registry().
add(
"decreasing_bool", &p_decreasing_bool);
1592 registry().
add(
"gecode_table_int_reif", &p_table_int_reif);
1593 registry().
add(
"gecode_table_int_imp", &p_table_int_imp);
1594 registry().
add(
"gecode_table_bool", &p_table_bool);
1595 registry().
add(
"gecode_table_bool_reif", &p_table_bool_reif);
1596 registry().
add(
"gecode_table_bool_imp", &p_table_bool_imp);
1598 registry().
add(
"gecode_among_seq_int", &p_among_seq_int);
1599 registry().
add(
"gecode_among_seq_bool", &p_among_seq_bool);
1608 registry().
add(
"bool_lin_eq_reif", &p_bool_lin_eq_reif);
1609 registry().
add(
"bool_lin_eq_imp", &p_bool_lin_eq_imp);
1610 registry().
add(
"bool_lin_ne_reif", &p_bool_lin_ne_reif);
1611 registry().
add(
"bool_lin_ne_imp", &p_bool_lin_ne_imp);
1612 registry().
add(
"bool_lin_le_reif", &p_bool_lin_le_reif);
1613 registry().
add(
"bool_lin_le_imp", &p_bool_lin_le_imp);
1614 registry().
add(
"bool_lin_lt_reif", &p_bool_lin_lt_reif);
1615 registry().
add(
"bool_lin_lt_imp", &p_bool_lin_lt_imp);
1616 registry().
add(
"bool_lin_ge_reif", &p_bool_lin_ge_reif);
1617 registry().
add(
"bool_lin_ge_imp", &p_bool_lin_ge_imp);
1618 registry().
add(
"bool_lin_gt_reif", &p_bool_lin_gt_reif);
1619 registry().
add(
"bool_lin_gt_imp", &p_bool_lin_gt_imp);
1621 registry().
add(
"gecode_schedule_unary", &p_schedule_unary);
1622 registry().
add(
"gecode_schedule_unary_optional", &p_schedule_unary_optional);
1623 registry().
add(
"gecode_schedule_cumulative_optional", &p_cumulative_opt);
1626 registry().
add(
"gecode_circuit_cost_array", &p_circuit_cost_array);
1627 registry().
add(
"gecode_circuit_cost", &p_circuit_cost);
1633 registry().
add(
"gecode_member_int_reif",&p_member_int_reif);
1635 registry().
add(
"gecode_member_bool_reif",&p_member_bool_reif);
1638 IntPoster __int_poster;
1640#ifdef GECODE_HAS_SET_VARS
1643 rel(s, s.arg2SetVar(ce[0]),
op, s.arg2SetVar(ce[1]),
1644 SRT_EQ, s.arg2SetVar(ce[2]));
1657 SetVar
x = s.arg2SetVar(ce[0]);
1658 SetVar
y = s.arg2SetVar(ce[1]);
1660 SetVarLubRanges xub(
x);
1665 SetVarLubRanges yub(
y);
1675 SetVarArgs xs = s.arg2setvarargs(ce[0]);
1676 rel(s,
op, xs, s.arg2SetVar(ce[1]));
1687 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]));
1691 p_set_rel(s,
SRT_EQ, ce);
1694 p_set_rel(s,
SRT_NQ, ce);
1703 p_set_rel(s,
SRT_LQ, ce);
1706 p_set_rel(s,
SRT_LE, ce);
1709 if (!ce[1]->isIntVar()) {
1710 cardinality(s, s.arg2SetVar(ce[0]), ce[1]->getInt(),
1713 cardinality(s, s.arg2SetVar(ce[0]), s.arg2IntVar(ce[1]));
1717 if (!ce[1]->isSetVar()) {
1718 IntSet
d = s.arg2intset(ce[1]);
1719 if (ce[0]->isBoolVar()) {
1721 Iter::Ranges::Singleton sr(0,1);
1722 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
1724 if (d01.size() == 0) {
1727 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
1728 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
1731 dom(s, s.arg2IntVar(ce[0]), d);
1734 if (!ce[0]->isIntVar()) {
1735 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt());
1737 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]));
1742 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]),
1743 s.arg2BoolVar(ce[2]));
1747 p_set_rel_reif(s,
SRT_EQ,ce);
1750 p_set_rel_reif(s,
SRT_LQ,ce);
1753 p_set_rel_reif(s,
SRT_LE,ce);
1756 p_set_rel_reif(s,
SRT_NQ,ce);
1767 if (!ce[1]->isSetVar()) {
1769 p_int_in_reif(s,ce,ann);
1772 p_int_in_imp(s,ce,ann);
1775 if (!ce[0]->isIntVar()) {
1776 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt(),
1777 Reify(s.arg2BoolVar(ce[2]),rm));
1779 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]),
1780 Reify(s.arg2BoolVar(ce[2]),rm));
1785 p_set_in_reif(s,ce,ann,
RM_EQV);
1788 p_set_in_reif(s,ce,ann,
RM_IMP);
1791 rel(s, s.arg2SetVar(ce[0]),
SRT_DISJ, s.arg2SetVar(ce[1]));
1796 SetVar
x = s.arg2SetVar(ce[0]);
1797 int idx = ce[2]->getInt();
1800 BoolVarArgs
y = s.arg2boolvarargs(ce[1],idx);
1807 bool isConstant =
true;
1809 for (
int i=
a->a.
size(); i--;) {
1810 if (
a->a[i]->isSetVar()) {
1815 IntVar selector = s.arg2IntVar(ce[0]);
1816 rel(s, selector > 0);
1819 element(s, sv, selector, s.arg2SetVar(ce[2]));
1821 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1822 element(s, sv, selector, s.arg2SetVar(ce[2]));
1828 const IntSet& universe =
1830 bool isConstant =
true;
1832 for (
int i=
a->a.
size(); i--;) {
1833 if (
a->a[i]->isSetVar()) {
1838 SetVar selector = s.arg2SetVar(ce[0]);
1842 element(s,
op, sv, selector, s.arg2SetVar(ce[2]), universe);
1844 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1845 element(s,
op, sv, selector, s.arg2SetVar(ce[2]), universe);
1851 p_array_set_element_op(s, ce, ann,
SOT_UNION);
1856 p_array_set_element_op(s, ce, ann,
SOT_INTER);
1862 IntSet
d = s.arg2intset(ce[3]);
1863 p_array_set_element_op(s, ce, ann,
SOT_INTER, d);
1868 p_array_set_element_op(s, ce, ann,
SOT_DUNION);
1872 convex(s, s.arg2SetVar(ce[0]));
1876 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1882 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1883 sequence(s, sv, s.arg2SetVar(ce[1]));
1888 int xoff=ce[1]->getInt();
1890 int yoff=ce[3]->getInt();
1892 IntVarArgs xv = s.arg2intvarargs(ce[0], xoff);
1893 SetVarArgs yv = s.arg2setvarargs(ce[2], yoff, 1, IntSet(0, xoff-1));
1894 IntSet xd(yoff,yv.size()-1);
1895 for (
int i=xoff;
i<xv.
size();
i++) {
1898 IntSet yd(xoff,xv.size()-1);
1899 for (
int i=yoff;
i<yv.
size();
i++) {
1906 int xoff=ce[1]->getInt();
1908 IntVarArgs xv = s.arg2intvarargs(ce[0],xoff);
1913 IntArgs e = s.arg2intargs(ce[0]);
1914 IntArgs w = s.arg2intargs(ce[1]);
1915 SetVar
x = s.arg2SetVar(ce[2]);
1916 IntVar
y = s.arg2IntVar(ce[3]);
1921 int xoff = ce[2]->getInt();
1922 int yoff = ce[3]->getInt();
1923 SetVarArgs
x = s.arg2setvarargs(ce[0],xoff);
1924 SetVarArgs
y = s.arg2setvarargs(ce[1],yoff);
1929 SetVarArgs
x = s.arg2setvarargs(ce[0]);
1930 int p_s = ce[1]->getInt();
1931 int p_t = ce[2]->getInt();
1944 registry().
add(
"array_set_element", &p_array_set_element);
1945 registry().
add(
"array_var_set_element", &p_array_set_element);
1946 registry().
add(
"set_intersect", &p_set_intersect);
1958 registry().
add(
"set_subset_reif", &p_set_subset_reif);
1959 registry().
add(
"set_superset_reif", &p_set_superset_reif);
1964 &p_link_set_to_booleans);
1966 registry().
add(
"array_set_union", &p_array_set_union);
1967 registry().
add(
"array_set_partition", &p_array_set_partition);
1969 registry().
add(
"array_set_seq", &p_array_set_seq);
1970 registry().
add(
"array_set_seq_union", &p_array_set_seq_union);
1972 &p_array_set_element_union);
1973 registry().
add(
"gecode_array_set_element_intersect",
1974 &p_array_set_element_intersect);
1975 registry().
add(
"gecode_array_set_element_intersect_in",
1976 &p_array_set_element_intersect_in);
1977 registry().
add(
"gecode_array_set_element_partition",
1978 &p_array_set_element_partition);
1980 &p_int_set_channel);
1985 registry().
add(
"gecode_inverse_set", &p_inverse_set);
1986 registry().
add(
"gecode_precede_set", &p_precede_set);
1989 SetPoster __set_poster;
1992#ifdef GECODE_HAS_FLOAT_VARS
1995 IntVar x0 = s.arg2IntVar(ce[0]);
1996 FloatVar x1 = s.arg2FloatVar(ce[1]);
2002 FloatValArgs fa = s.arg2floatargs(ce[0]);
2003 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
2004 linear(s, fa, fv, frt, ce[2]->getFloat());
2008 FloatValArgs fa = s.arg2floatargs(ce[0]);
2009 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
2010 linear(s, fa, fv, frt, ce[2]->getFloat(), s.arg2BoolVar(ce[3]));
2013 p_float_lin_cmp(s,
FRT_EQ,ce,ann);
2017 p_float_lin_cmp_reif(s,
FRT_EQ,ce,ann);
2020 p_float_lin_cmp(s,
FRT_LQ,ce,ann);
2023 p_float_lin_cmp(s,
FRT_LE,ce,ann);
2027 p_float_lin_cmp_reif(s,
FRT_LQ,ce,ann);
2031 p_float_lin_cmp_reif(s,
FRT_LE,ce,ann);
2035 FloatVar
x = s.arg2FloatVar(ce[0]);
2036 FloatVar
y = s.arg2FloatVar(ce[1]);
2037 FloatVar
z = s.arg2FloatVar(ce[2]);
2042 FloatVar
x = s.arg2FloatVar(ce[0]);
2043 FloatVar
y = s.arg2FloatVar(ce[1]);
2044 FloatVar
z = s.arg2FloatVar(ce[2]);
2049 FloatVar
x = s.arg2FloatVar(ce[0]);
2050 FloatVar
y = s.arg2FloatVar(ce[1]);
2051 FloatVar
z = s.arg2FloatVar(ce[2]);
2056 FloatVar
x = s.arg2FloatVar(ce[0]);
2057 FloatVar
y = s.arg2FloatVar(ce[1]);
2062 FloatVar
x = s.arg2FloatVar(ce[0]);
2063 FloatVar
y = s.arg2FloatVar(ce[1]);
2068 FloatVar
x = s.arg2FloatVar(ce[0]);
2069 FloatVar
y = s.arg2FloatVar(ce[1]);
2073 FloatVar
x = s.arg2FloatVar(ce[0]);
2074 FloatVar
y = s.arg2FloatVar(ce[1]);
2075 BoolVar
b = s.arg2BoolVar(ce[2]);
2079 FloatVar
x = s.arg2FloatVar(ce[0]);
2080 FloatVar
y = s.arg2FloatVar(ce[1]);
2084 FloatVar
x = s.arg2FloatVar(ce[0]);
2085 FloatVar
y = s.arg2FloatVar(ce[1]);
2086 BoolVar
b = s.arg2BoolVar(ce[2]);
2090 FloatVar
x = s.arg2FloatVar(ce[0]);
2091 FloatVar
y = s.arg2FloatVar(ce[1]);
2092 FloatVar
z = s.arg2FloatVar(ce[2]);
2096 FloatVar
x = s.arg2FloatVar(ce[0]);
2097 FloatVar
y = s.arg2FloatVar(ce[1]);
2098 FloatVar
z = s.arg2FloatVar(ce[2]);
2102 FloatVar
x = s.arg2FloatVar(ce[0]);
2103 FloatVar
y = s.arg2FloatVar(ce[1]);
2109 FloatVar
x = s.arg2FloatVar(ce[0]);
2110 FloatVar
y = s.arg2FloatVar(ce[1]);
2111 BoolVar
b = s.arg2BoolVar(ce[2]);
2114 rel(s, b == (b0 && !b1));
2120 FloatVar
x = s.arg2FloatVar(ce[0]);
2121 FloatVar
y = s.arg2FloatVar(ce[1]);
2125#ifdef GECODE_HAS_MPFR
2126#define P_FLOAT_OP(Op) \
2127 void p_float_ ## Op (FlatZincSpace& s, const ConExpr& ce, AST::Node*) {\
2128 FloatVar x = s.arg2FloatVar(ce[0]);\
2129 FloatVar y = s.arg2FloatVar(ce[1]);\
2144 void p_float_ln(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2145 FloatVar
x = s.arg2FloatVar(ce[0]);
2146 FloatVar
y = s.arg2FloatVar(ce[1]);
2150 FloatVar
x = s.arg2FloatVar(ce[0]);
2151 FloatVar
y = s.arg2FloatVar(ce[1]);
2155 FloatVar
x = s.arg2FloatVar(ce[0]);
2156 FloatVar
y = s.arg2FloatVar(ce[1]);
2182 registry().
add(
"float_lin_eq_reif",&p_float_lin_eq_reif);
2185 registry().
add(
"float_lin_le_reif",&p_float_lin_le_reif);
2186 registry().
add(
"float_lin_lt_reif",&p_float_lin_lt_reif);
2188#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)
A node in a FlatZinc abstract syntax tree.
SetLit * getSet(void)
Cast this node to a set literal node.
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.
int offset(void) const
Integer-precision integer scale view.
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.
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.
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 weights(Home home, IntSharedArray elements, IntSharedArray weights, SetVar x, IntVar y)
Post propagator for SetVar SetOpType SetVar SetRelType r
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 .
Post propagator for SetVar SetOpType SetVar SetRelType SetVar z
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 .
Post propagator for SetVar SetOpType SetVar y
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 .
Post propagator that propagates that a x is convex void convex(Home home, SetVar x)
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 occurences 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 $n\geq 0$.
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.
Post propagator for SetVar x
Post propagator for SetVar SetOpType op
void tan(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
Gecode::FloatVal c(-8, 8)
Gecode::FloatVal b(9, 12)
Gecode::FloatVal a(-8, 5)
Gecode::IntArgs i({1, 2, 3, 4})
#define BOOL_ARRAY_OP(op)