43 #ifdef GECODE_HAS_SET_VARS 46 #ifdef GECODE_HAS_FLOAT_VARS 51 namespace Gecode {
namespace FlatZinc {
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;
88 for (
int i=offs->
a.size();
i--; ) {
89 oa[
i] = offs->
a[
i]->getInt();
102 if (ce[0]->isIntVar()) {
103 if (ce[1]->isIntVar()) {
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()) {
201 if (singleIntVar != -1) {
202 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
207 for (
int i=0;
i<ia.
size();
i++) {
208 if (
i != singleIntVar)
209 ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
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);
239 if (singleIntVar != -1) {
240 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
245 for (
int i=0;
i<ia.
size();
i++) {
246 if (
i != singleIntVar)
247 ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
254 linear(s, ia, iv, irt, ce[2]->getInt(),
259 linear(s, ia, iv, irt, ce[2]->getInt(),
264 linear(s, ia, iv, irt, ce[2]->getInt(),
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);
328 if (ce[2]->isIntVar())
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);
345 if (ce[2]->isIntVar())
346 linear(s, ia, iv, irt, s.
iv[ce[2]->getIntVar()],
350 linear(s, ia, iv, irt, ce[2]->getInt(),
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()) {
428 }
else if (!ce[1]->isIntVar()) {
431 }
else if (!ce[2]->isIntVar()) {
433 == ce[2]->getInt(), s.
ann2ipl(ann));
441 if (!ce[0]->isIntVar()) {
444 }
else if (!ce[1]->isIntVar()) {
447 }
else if (!ce[2]->isIntVar()) {
449 == ce[2]->getInt(), s.
ann2ipl(ann));
465 pow(s, x0, ce[1]->getInt(), x2, 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);
564 #define BOOL_OP(op) \ 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) {
586 void p_bool_or_imp(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,
593 void p_bool_and(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
596 void p_bool_and_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
597 BoolVar b0 = s.arg2BoolVar(ce[0]);
598 BoolVar
b1 = s.arg2BoolVar(ce[1]);
599 BoolVar
b2 = s.arg2BoolVar(ce[2]);
603 void p_array_bool_and(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
607 void p_array_bool_and_imp(FlatZincSpace& s,
const ConExpr& ce,
610 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
611 BoolVar
b1 = s.arg2BoolVar(ce[1]);
612 for (
unsigned int i=bv.
size();
i--;)
615 void p_array_bool_or(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
619 void p_array_bool_or_imp(FlatZincSpace& s,
const ConExpr& ce,
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));
626 void p_array_bool_xor(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
630 void p_array_bool_xor_imp(FlatZincSpace& s,
const ConExpr& ce,
633 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
636 rel(s, s.arg2BoolVar(ce[1]),
BOT_IMP, tmp, 1);
638 void p_array_bool_clause(FlatZincSpace& s,
const ConExpr& ce,
640 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
641 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
644 void p_array_bool_clause_reif(FlatZincSpace& s,
const ConExpr& ce,
646 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
647 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
648 BoolVar b0 = s.arg2BoolVar(ce[2]);
651 void p_array_bool_clause_imp(FlatZincSpace& s,
const ConExpr& ce,
653 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
654 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
655 BoolVar b0 = s.arg2BoolVar(ce[2]);
658 void p_bool_xor(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
661 void p_bool_xor_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
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,
670 void p_bool_l_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
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));
679 void p_bool_r_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
682 void p_bool_not(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
683 BoolVar x0 = s.arg2BoolVar(ce[0]);
684 BoolVar x1 = s.arg2BoolVar(ce[1]);
689 void p_array_int_element(FlatZincSpace& s,
const ConExpr& ce,
691 bool isConstant =
true;
692 AST::Array*
a = ce[1]->getArray();
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));
709 void p_array_bool_element(FlatZincSpace& s,
const ConExpr& ce,
711 bool isConstant =
true;
712 AST::Array*
a = ce[1]->getArray();
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));
731 void p_bool2int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* 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));
740 void p_int_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
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);
757 void p_int_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
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]));
777 void p_int_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
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));
798 void p_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
799 IntVar x0 = s.arg2IntVar(ce[0]);
800 IntVar x1 = s.arg2IntVar(ce[1]);
801 abs(s, x0, x1, s.ann2ipl(ann));
804 void p_array_int_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* 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));
810 void p_array_int_lq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* 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));
816 void p_array_bool_lt(FlatZincSpace& s,
const ConExpr& ce,
818 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
819 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
820 rel(s, bv0,
IRT_LE, bv1, s.ann2ipl(ann));
823 void p_array_bool_lq(FlatZincSpace& s,
const ConExpr& ce,
825 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
826 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
827 rel(s, bv0,
IRT_LQ, bv1, s.ann2ipl(ann));
830 void p_count(FlatZincSpace& s,
const ConExpr& ce, AST::Node* 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]),
849 void p_count_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
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]);
858 void p_count_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
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]);
869 FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
870 IntVarArgs iv = s.arg2intvarargs(ce[1]);
871 count(s, iv, ce[2]->getInt(), irt, ce[0]->getInt(), s.ann2ipl(ann));
874 void p_at_most(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
875 count_rel(
IRT_LQ, s, ce, ann);
878 void p_at_least(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
879 count_rel(
IRT_GQ, s, ce, ann);
882 void p_bin_packing_load(FlatZincSpace& s,
const ConExpr& ce,
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));
908 void p_global_cardinality(FlatZincSpace& s,
const ConExpr& ce,
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);
944 void p_global_cardinality_closed(FlatZincSpace& s,
const ConExpr& ce,
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);
964 void p_global_cardinality_low_up(FlatZincSpace& s,
const ConExpr& ce,
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());
992 count(s, x,
y, cover, ipl);
995 void p_global_cardinality_low_up_closed(FlatZincSpace& s,
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]);
1010 count(s, x,
y, cover, ipl);
1013 void p_minimum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1014 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1015 min(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
1018 void p_maximum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1019 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1020 max(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
1023 void p_minimum_arg(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1024 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1025 argmin(s, iv, s.arg2IntVar(ce[1]),
true, s.ann2ipl(ann));
1028 void p_maximum_arg(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1029 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1030 argmax(s, iv, s.arg2IntVar(ce[1]),
true, s.ann2ipl(ann));
1033 void p_regular(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1034 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1035 int q = ce[1]->getInt();
1036 int symbols = ce[2]->getInt();
1037 IntArgs
d = s.arg2intargs(ce[3]);
1038 int q0 = ce[4]->getInt();
1041 for (
int i=1;
i<=q;
i++) {
1042 for (
int j=1; j<=symbols; j++) {
1043 if (d[(
i-1)*symbols+(j-1)] > 0)
1049 DFA::Transition*
t = re.alloc<DFA::Transition>(noOfTrans+1);
1051 for (
int i=1;
i<=q;
i++) {
1052 for (
int j=1; j<=symbols; j++) {
1053 if (d[(
i-1)*symbols+(j-1)] > 0) {
1054 t[noOfTrans].i_state =
i;
1055 t[noOfTrans].symbol = j;
1056 t[noOfTrans].o_state = d[(
i-1)*symbols+(j-1)];
1061 t[noOfTrans].i_state = -1;
1064 AST::SetLit* sl = ce[5]->getSet();
1067 f =
static_cast<int*
>(
heap.
ralloc(
sizeof(
int)*(sl->max-sl->min+2)));
1068 for (
int i=sl->min; i<=sl->
max;
i++)
1070 f[sl->max-sl->min+1] = -1;
1072 f =
static_cast<int*
>(
heap.
ralloc(
sizeof(
int)*(sl->s.size()+1)));
1073 for (
int j=sl->s.size(); j--; )
1075 f[sl->s.size()] = -1;
1081 extensional(s, iv, s.getSharedDFA(dfa), s.ann2ipl(ann));
1085 p_sort(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1086 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1087 IntVarArgs
y = s.arg2intvarargs(ce[1]);
1088 IntVarArgs xy(x.size()+y.size());
1089 for (
int i=x.
size();
i--;)
1091 for (
int i=y.
size();
i--;)
1094 for (
int i=x.
size();
i--;)
1096 for (
int i=y.
size();
i--;)
1098 sorted(s, x, y, s.ann2ipl(ann));
1102 p_inverse_offsets(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1103 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1105 int xoff = ce[1]->getInt();
1106 IntVarArgs
y = s.arg2intvarargs(ce[2]);
1108 int yoff = ce[3]->getInt();
1109 channel(s, x, xoff, y, yoff, s.ann2ipl(ann));
1113 p_increasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1114 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1119 p_increasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1120 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1125 p_decreasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1126 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1131 p_decreasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1132 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1137 p_table_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1138 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1139 IntArgs tuples = s.arg2intargs(ce[1]);
1140 TupleSet ts = s.arg2tupleset(tuples,x.size());
1145 p_table_int_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1146 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1147 IntArgs tuples = s.arg2intargs(ce[1]);
1148 TupleSet ts = s.arg2tupleset(tuples,x.size());
1153 p_table_int_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1154 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1155 IntArgs tuples = s.arg2intargs(ce[1]);
1156 TupleSet ts = s.arg2tupleset(tuples,x.size());
1161 p_table_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1162 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1163 IntArgs tuples = s.arg2boolargs(ce[1]);
1164 TupleSet ts = s.arg2tupleset(tuples,x.size());
1169 p_table_bool_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1170 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1171 IntArgs tuples = s.arg2boolargs(ce[1]);
1172 TupleSet ts = s.arg2tupleset(tuples,x.size());
1177 p_table_bool_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1178 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1179 IntArgs tuples = s.arg2boolargs(ce[1]);
1180 TupleSet ts = s.arg2tupleset(tuples,x.size());
1184 void p_cumulative_opt(FlatZincSpace& s,
const ConExpr& ce,
1186 IntVarArgs start = s.arg2intvarargs(ce[0]);
1187 IntArgs duration = s.arg2intargs(ce[1]);
1188 IntArgs height = s.arg2intargs(ce[2]);
1189 BoolVarArgs
opt = s.arg2boolvarargs(ce[3]);
1190 int bound = ce[4]->getInt();
1192 cumulative(s,bound,start,duration,height,opt,s.ann2ipl(ann));
1195 void p_cumulatives(FlatZincSpace& s,
const ConExpr& ce,
1197 IntVarArgs start = s.arg2intvarargs(ce[0]);
1198 IntVarArgs duration = s.arg2intvarargs(ce[1]);
1199 IntVarArgs height = s.arg2intvarargs(ce[2]);
1200 int n = start.size();
1201 IntVar bound = s.arg2IntVar(ce[3]);
1207 rel(s, height[0] <= bound);
1213 for (
int i=2;
i<
n;
i++) {
1214 if (height[
i].
min() < minHeight) {
1215 minHeight2 = minHeight;
1216 minHeight = height[
i].min();
1217 }
else if (height[
i].
min() < minHeight2) {
1218 minHeight2 = height[
i].min();
1222 (minHeight > bound.max()/2) ||
1223 (minHeight2 > bound.max()/2 && minHeight+minHeight2>bound.max());
1225 rel(s, bound >=
max(height));
1227 if (duration.assigned()) {
1228 IntArgs durationI(n);
1230 durationI[
i] = duration[
i].val();
1232 unary(s,start,durationI);
1236 end[
i] =
expr(s,start[
i]+duration[
i]);
1238 unary(s,start,duration,end);
1240 }
else if (height.assigned()) {
1243 heightI[
i] = height[
i].val();
1244 if (duration.assigned()) {
1245 IntArgs durationI(n);
1247 durationI[
i] = duration[
i].val();
1248 cumulative(s, bound, start, durationI, heightI);
1251 for (
int i = n;
i--; )
1252 end[
i] =
expr(s,start[
i]+duration[
i]);
1253 cumulative(s, bound, start, duration, end, heightI);
1255 }
else if (bound.assigned()) {
1257 IntArgs limit({bound.val()});
1260 end[
i] =
expr(s,start[
i]+duration[
i]);
1261 cumulatives(s, machine, start, duration, end, height, limit,
true,
1266 IntVarArgs end(start.size());
1267 for (
int i = start.
size();
i--; ) {
1270 end[
i] =
expr(s, start[
i] + duration[
i]);
1272 for (
int time = min; time <
max; ++time) {
1273 IntVarArgs
x(start.size());
1274 for (
int i = start.
size();
i--; ) {
1275 IntVar overlaps =
channel(s,
expr(s, (start[
i] <= time) &&
1277 x[
i] =
expr(s, overlaps * height[i]);
1284 void p_among_seq_int(FlatZincSpace& s,
const ConExpr& ce,
1286 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1287 IntSet S = s.arg2intset(ce[1]);
1288 int q = ce[2]->getInt();
1289 int l = ce[3]->getInt();
1290 int u = ce[4]->getInt();
1292 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1295 void p_among_seq_bool(FlatZincSpace& s,
const ConExpr& ce,
1297 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1298 bool val = ce[1]->getBool();
1299 int q = ce[2]->getInt();
1300 int l = ce[3]->getInt();
1301 int u = ce[4]->getInt();
1304 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1307 void p_schedule_unary(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1308 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1309 IntArgs
p = s.arg2intargs(ce[1]);
1314 void p_schedule_unary_optional(FlatZincSpace& s,
const ConExpr& ce,
1316 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1317 IntArgs
p = s.arg2intargs(ce[1]);
1318 BoolVarArgs m = s.arg2boolvarargs(ce[2]);
1323 void p_circuit(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1324 int off = ce[0]->getInt();
1325 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1327 circuit(s,off,xv,s.ann2ipl(ann));
1329 void p_circuit_cost_array(FlatZincSpace& s,
const ConExpr& ce,
1331 IntArgs
c = s.arg2intargs(ce[0]);
1332 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1333 IntVarArgs yv = s.arg2intvarargs(ce[2]);
1334 IntVar
z = s.arg2IntVar(ce[3]);
1336 circuit(s,c,xv,yv,z,s.ann2ipl(ann));
1338 void p_circuit_cost(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1339 IntArgs
c = s.arg2intargs(ce[0]);
1340 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1341 IntVar
z = s.arg2IntVar(ce[2]);
1343 circuit(s,c,xv,z,s.ann2ipl(ann));
1346 void p_nooverlap(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1347 IntVarArgs x0 = s.arg2intvarargs(ce[0]);
1348 IntVarArgs w = s.arg2intvarargs(ce[1]);
1349 IntVarArgs y0 = s.arg2intvarargs(ce[2]);
1350 IntVarArgs h = s.arg2intvarargs(ce[3]);
1351 if (w.assigned() && h.assigned()) {
1352 IntArgs iw(w.size());
1353 for (
int i=w.
size();
i--;)
1355 IntArgs ih(h.size());
1356 for (
int i=h.
size();
i--;)
1358 nooverlap(s,x0,iw,y0,ih,s.ann2ipl(ann));
1360 int miny = y0[0].min();
1361 int maxy = y0[0].max();
1363 for (
int i=1;
i<y0.
size();
i++) {
1368 int minx = x0[0].min();
1369 int maxx = x0[0].max();
1371 for (
int i=1;
i<x0.
size();
i++) {
1381 IntVarArgs x1(x0.size()), y1(y0.size());
1382 for (
int i=x0.
size();
i--; )
1383 x1[
i] =
expr(s, x0[
i] + w[
i]);
1384 for (
int i=y0.size(); i--; )
1385 y1[i] =
expr(s, y0[i] + h[i]);
1386 nooverlap(s,x0,w,x1,y0,h,y1,s.ann2ipl(ann));
1390 void p_precede(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1391 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1392 int p_s = ce[1]->getInt();
1393 int p_t = ce[2]->getInt();
1394 precede(s,x,p_s,p_t,s.ann2ipl(ann));
1397 void p_nvalue(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1398 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1399 if (ce[0]->isIntVar()) {
1400 IntVar
y = s.arg2IntVar(ce[0]);
1407 void p_among(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1408 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1409 IntSet
v = s.arg2intset(ce[2]);
1410 if (ce[0]->isIntVar()) {
1411 IntVar
n = s.arg2IntVar(ce[0]);
1416 count(s,x,v,
IRT_EQ,ce[0]->getInt(),s.ann2ipl(ann));
1420 void p_member_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1421 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1422 IntVar
y = s.arg2IntVar(ce[1]);
1423 member(s,x,y,s.ann2ipl(ann));
1425 void p_member_int_reif(FlatZincSpace& s,
const ConExpr& ce,
1427 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1428 IntVar
y = s.arg2IntVar(ce[1]);
1429 BoolVar
b = s.arg2BoolVar(ce[2]);
1430 member(s,x,y,b,s.ann2ipl(ann));
1432 void p_member_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1433 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1434 BoolVar
y = s.arg2BoolVar(ce[1]);
1435 member(s,x,y,s.ann2ipl(ann));
1437 void p_member_bool_reif(FlatZincSpace& s,
const ConExpr& ce,
1439 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1440 BoolVar
y = s.arg2BoolVar(ce[1]);
1441 member(s,x,y,s.arg2BoolVar(ce[2]),s.ann2ipl(ann));
1448 registry().
add(
"all_different_offset", &p_distinctOffset);
1469 registry().
add(
"int_lin_eq_reif", &p_int_lin_eq_reif);
1470 registry().
add(
"int_lin_eq_imp", &p_int_lin_eq_imp);
1472 registry().
add(
"int_lin_ne_reif", &p_int_lin_ne_reif);
1473 registry().
add(
"int_lin_ne_imp", &p_int_lin_ne_imp);
1475 registry().
add(
"int_lin_le_reif", &p_int_lin_le_reif);
1476 registry().
add(
"int_lin_le_imp", &p_int_lin_le_imp);
1478 registry().
add(
"int_lin_lt_reif", &p_int_lin_lt_reif);
1479 registry().
add(
"int_lin_lt_imp", &p_int_lin_lt_imp);
1481 registry().
add(
"int_lin_ge_reif", &p_int_lin_ge_reif);
1482 registry().
add(
"int_lin_ge_imp", &p_int_lin_ge_imp);
1484 registry().
add(
"int_lin_gt_reif", &p_int_lin_gt_reif);
1485 registry().
add(
"int_lin_gt_imp", &p_int_lin_gt_imp);
1520 registry().
add(
"array_bool_and", &p_array_bool_and);
1521 registry().
add(
"array_bool_and_imp", &p_array_bool_and_imp);
1522 registry().
add(
"array_bool_or", &p_array_bool_or);
1523 registry().
add(
"array_bool_or_imp", &p_array_bool_or_imp);
1524 registry().
add(
"array_bool_xor", &p_array_bool_xor);
1525 registry().
add(
"array_bool_xor_imp", &p_array_bool_xor_imp);
1526 registry().
add(
"bool_clause", &p_array_bool_clause);
1527 registry().
add(
"bool_clause_reif", &p_array_bool_clause_reif);
1528 registry().
add(
"bool_clause_imp", &p_array_bool_clause_imp);
1532 registry().
add(
"array_int_element", &p_array_int_element);
1533 registry().
add(
"array_var_int_element", &p_array_int_element);
1534 registry().
add(
"array_bool_element", &p_array_bool_element);
1535 registry().
add(
"array_var_bool_element", &p_array_bool_element);
1540 #ifndef GECODE_HAS_SET_VARS 1548 registry().
add(
"array_bool_lt", &p_array_bool_lt);
1549 registry().
add(
"array_bool_lq", &p_array_bool_lq);
1555 registry().
add(
"gecode_bin_packing_load", &p_bin_packing_load);
1556 registry().
add(
"gecode_global_cardinality", &p_global_cardinality);
1557 registry().
add(
"gecode_global_cardinality_closed",
1558 &p_global_cardinality_closed);
1560 &p_global_cardinality_low_up);
1561 registry().
add(
"global_cardinality_low_up_closed",
1562 &p_global_cardinality_low_up_closed);
1565 registry().
add(
"gecode_minimum_arg_int", &p_minimum_arg);
1566 registry().
add(
"gecode_maximum_arg_int", &p_maximum_arg);
1570 registry().
add(
"inverse_offsets", &p_inverse_offsets);
1571 registry().
add(
"increasing_int", &p_increasing_int);
1572 registry().
add(
"increasing_bool", &p_increasing_bool);
1573 registry().
add(
"decreasing_int", &p_decreasing_int);
1574 registry().
add(
"decreasing_bool", &p_decreasing_bool);
1576 registry().
add(
"gecode_table_int_reif", &p_table_int_reif);
1577 registry().
add(
"gecode_table_int_imp", &p_table_int_imp);
1578 registry().
add(
"gecode_table_bool", &p_table_bool);
1579 registry().
add(
"gecode_table_bool_reif", &p_table_bool_reif);
1580 registry().
add(
"gecode_table_bool_imp", &p_table_bool_imp);
1582 registry().
add(
"gecode_among_seq_int", &p_among_seq_int);
1583 registry().
add(
"gecode_among_seq_bool", &p_among_seq_bool);
1592 registry().
add(
"bool_lin_eq_reif", &p_bool_lin_eq_reif);
1593 registry().
add(
"bool_lin_eq_imp", &p_bool_lin_eq_imp);
1594 registry().
add(
"bool_lin_ne_reif", &p_bool_lin_ne_reif);
1595 registry().
add(
"bool_lin_ne_imp", &p_bool_lin_ne_imp);
1596 registry().
add(
"bool_lin_le_reif", &p_bool_lin_le_reif);
1597 registry().
add(
"bool_lin_le_imp", &p_bool_lin_le_imp);
1598 registry().
add(
"bool_lin_lt_reif", &p_bool_lin_lt_reif);
1599 registry().
add(
"bool_lin_lt_imp", &p_bool_lin_lt_imp);
1600 registry().
add(
"bool_lin_ge_reif", &p_bool_lin_ge_reif);
1601 registry().
add(
"bool_lin_ge_imp", &p_bool_lin_ge_imp);
1602 registry().
add(
"bool_lin_gt_reif", &p_bool_lin_gt_reif);
1603 registry().
add(
"bool_lin_gt_imp", &p_bool_lin_gt_imp);
1605 registry().
add(
"gecode_schedule_unary", &p_schedule_unary);
1606 registry().
add(
"gecode_schedule_unary_optional", &p_schedule_unary_optional);
1607 registry().
add(
"gecode_schedule_cumulative_optional", &p_cumulative_opt);
1610 registry().
add(
"gecode_circuit_cost_array", &p_circuit_cost_array);
1611 registry().
add(
"gecode_circuit_cost", &p_circuit_cost);
1617 registry().
add(
"gecode_member_int_reif",&p_member_int_reif);
1619 registry().
add(
"gecode_member_bool_reif",&p_member_bool_reif);
1622 IntPoster __int_poster;
1624 #ifdef GECODE_HAS_SET_VARS 1626 const ConExpr& ce, AST::Node *) {
1627 rel(s, s.arg2SetVar(ce[0]),
op, s.arg2SetVar(ce[1]),
1628 SRT_EQ, s.arg2SetVar(ce[2]));
1630 void p_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1633 void p_set_intersect(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1636 void p_set_diff(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1640 void p_set_symdiff(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1641 SetVar
x = s.arg2SetVar(ce[0]);
1642 SetVar
y = s.arg2SetVar(ce[1]);
1644 SetVarLubRanges xub(x);
1649 SetVarLubRanges yub(y);
1657 void p_array_set_OP(FlatZincSpace& s,
SetOpType op,
1658 const ConExpr& ce, AST::Node *) {
1659 SetVarArgs xs = s.arg2setvarargs(ce[0]);
1660 rel(s, op, xs, s.arg2SetVar(ce[1]));
1662 void p_array_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1665 void p_array_set_partition(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1670 void p_set_rel(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1671 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]));
1674 void p_set_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1675 p_set_rel(s,
SRT_EQ, ce);
1677 void p_set_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1678 p_set_rel(s,
SRT_NQ, ce);
1680 void p_set_subset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1683 void p_set_superset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1686 void p_set_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1687 p_set_rel(s,
SRT_LQ, ce);
1689 void p_set_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1690 p_set_rel(s,
SRT_LE, ce);
1692 void p_set_card(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1693 if (!ce[1]->isIntVar()) {
1694 cardinality(s, s.arg2SetVar(ce[0]), ce[1]->getInt(),
1697 cardinality(s, s.arg2SetVar(ce[0]), s.arg2IntVar(ce[1]));
1700 void p_set_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1701 if (!ce[1]->isSetVar()) {
1702 IntSet
d = s.arg2intset(ce[1]);
1703 if (ce[0]->isBoolVar()) {
1705 Iter::Ranges::Singleton sr(0,1);
1706 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
1708 if (d01.size() == 0) {
1711 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
1712 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
1715 dom(s, s.arg2IntVar(ce[0]),
d);
1718 if (!ce[0]->isIntVar()) {
1719 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt());
1721 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]));
1725 void p_set_rel_reif(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1726 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]),
1727 s.arg2BoolVar(ce[2]));
1730 void p_set_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1731 p_set_rel_reif(s,
SRT_EQ,ce);
1733 void p_set_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1734 p_set_rel_reif(s,
SRT_LQ,ce);
1736 void p_set_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1737 p_set_rel_reif(s,
SRT_LE,ce);
1739 void p_set_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1740 p_set_rel_reif(s,
SRT_NQ,ce);
1742 void p_set_subset_reif(FlatZincSpace& s,
const ConExpr& ce,
1746 void p_set_superset_reif(FlatZincSpace& s,
const ConExpr& ce,
1750 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann,
ReifyMode rm) {
1751 if (!ce[1]->isSetVar()) {
1753 p_int_in_reif(s,ce,ann);
1756 p_int_in_imp(s,ce,ann);
1759 if (!ce[0]->isIntVar()) {
1760 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt(),
1761 Reify(s.arg2BoolVar(ce[2]),rm));
1763 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]),
1764 Reify(s.arg2BoolVar(ce[2]),rm));
1768 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1769 p_set_in_reif(s,ce,ann,
RM_EQV);
1771 void p_set_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1772 p_set_in_reif(s,ce,ann,
RM_IMP);
1774 void p_set_disjoint(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1775 rel(s, s.arg2SetVar(ce[0]),
SRT_DISJ, s.arg2SetVar(ce[1]));
1778 void p_link_set_to_booleans(FlatZincSpace& s,
const ConExpr& ce,
1780 SetVar
x = s.arg2SetVar(ce[0]);
1781 int idx = ce[2]->getInt();
1784 BoolVarArgs
y = s.arg2boolvarargs(ce[1],idx);
1789 void p_array_set_element(FlatZincSpace& s,
const ConExpr& ce,
1791 bool isConstant =
true;
1792 AST::Array*
a = ce[1]->getArray();
1793 for (
int i=a->
a.size();
i--;) {
1794 if (a->a[
i]->isSetVar()) {
1799 IntVar selector = s.arg2IntVar(ce[0]);
1800 rel(s, selector > 0);
1803 element(s, sv, selector, s.arg2SetVar(ce[2]));
1805 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1806 element(s, sv, selector, s.arg2SetVar(ce[2]));
1810 void p_array_set_element_op(FlatZincSpace& s,
const ConExpr& ce,
1812 const IntSet& universe =
1814 bool isConstant =
true;
1815 AST::Array*
a = ce[1]->getArray();
1816 for (
int i=a->
a.size();
i--;) {
1817 if (a->a[
i]->isSetVar()) {
1822 SetVar selector = s.arg2SetVar(ce[0]);
1826 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1828 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1829 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1833 void p_array_set_element_union(FlatZincSpace& s,
const ConExpr& ce,
1835 p_array_set_element_op(s, ce, ann,
SOT_UNION);
1838 void p_array_set_element_intersect(FlatZincSpace& s,
const ConExpr& ce,
1840 p_array_set_element_op(s, ce, ann,
SOT_INTER);
1843 void p_array_set_element_intersect_in(FlatZincSpace& s,
1846 IntSet
d = s.arg2intset(ce[3]);
1847 p_array_set_element_op(s, ce, ann,
SOT_INTER, d);
1850 void p_array_set_element_partition(FlatZincSpace& s,
const ConExpr& ce,
1852 p_array_set_element_op(s, ce, ann,
SOT_DUNION);
1855 void p_set_convex(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1856 convex(s, s.arg2SetVar(ce[0]));
1859 void p_array_set_seq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1860 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1864 void p_array_set_seq_union(FlatZincSpace& s,
const ConExpr& ce,
1866 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1867 sequence(s, sv, s.arg2SetVar(ce[1]));
1870 void p_int_set_channel(FlatZincSpace& s,
const ConExpr& ce,
1872 int xoff=ce[1]->getInt();
1874 int yoff=ce[3]->getInt();
1876 IntVarArgs xv = s.arg2intvarargs(ce[0], xoff);
1877 SetVarArgs yv = s.arg2setvarargs(ce[2], yoff, 1, IntSet(0, xoff-1));
1878 IntSet xd(yoff,yv.size()-1);
1879 for (
int i=xoff;
i<xv.
size();
i++) {
1882 IntSet yd(xoff,xv.size()-1);
1883 for (
int i=yoff;
i<yv.
size();
i++) {
1889 void p_range(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1890 int xoff=ce[1]->getInt();
1892 IntVarArgs xv = s.arg2intvarargs(ce[0],xoff);
1896 void p_weights(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1897 IntArgs e = s.arg2intargs(ce[0]);
1898 IntArgs w = s.arg2intargs(ce[1]);
1899 SetVar
x = s.arg2SetVar(ce[2]);
1900 IntVar
y = s.arg2IntVar(ce[3]);
1904 void p_inverse_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1905 int xoff = ce[2]->getInt();
1906 int yoff = ce[3]->getInt();
1907 SetVarArgs
x = s.arg2setvarargs(ce[0],xoff);
1908 SetVarArgs
y = s.arg2setvarargs(ce[1],yoff);
1912 void p_precede_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1913 SetVarArgs
x = s.arg2setvarargs(ce[0]);
1914 int p_s = ce[1]->getInt();
1915 int p_t = ce[2]->getInt();
1928 registry().
add(
"array_set_element", &p_array_set_element);
1929 registry().
add(
"array_var_set_element", &p_array_set_element);
1930 registry().
add(
"set_intersect", &p_set_intersect);
1942 registry().
add(
"set_subset_reif", &p_set_subset_reif);
1943 registry().
add(
"set_superset_reif", &p_set_superset_reif);
1948 &p_link_set_to_booleans);
1950 registry().
add(
"array_set_union", &p_array_set_union);
1951 registry().
add(
"array_set_partition", &p_array_set_partition);
1953 registry().
add(
"array_set_seq", &p_array_set_seq);
1954 registry().
add(
"array_set_seq_union", &p_array_set_seq_union);
1956 &p_array_set_element_union);
1957 registry().
add(
"gecode_array_set_element_intersect",
1958 &p_array_set_element_intersect);
1959 registry().
add(
"gecode_array_set_element_intersect_in",
1960 &p_array_set_element_intersect_in);
1961 registry().
add(
"gecode_array_set_element_partition",
1962 &p_array_set_element_partition);
1964 &p_int_set_channel);
1969 registry().
add(
"gecode_inverse_set", &p_inverse_set);
1970 registry().
add(
"gecode_precede_set", &p_precede_set);
1973 SetPoster __set_poster;
1976 #ifdef GECODE_HAS_FLOAT_VARS 1978 void p_int2float(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1979 IntVar x0 = s.arg2IntVar(ce[0]);
1980 FloatVar x1 = s.arg2FloatVar(ce[1]);
1984 void p_float_lin_cmp(FlatZincSpace& s,
FloatRelType frt,
1985 const ConExpr& ce, AST::Node*) {
1986 FloatValArgs fa = s.arg2floatargs(ce[0]);
1987 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1988 linear(s, fa, fv, frt, ce[2]->getFloat());
1990 void p_float_lin_cmp_reif(FlatZincSpace& s,
FloatRelType frt,
1991 const ConExpr& ce, AST::Node*) {
1992 FloatValArgs fa = s.arg2floatargs(ce[0]);
1993 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1994 linear(s, fa, fv, frt, ce[2]->getFloat(), s.arg2BoolVar(ce[3]));
1996 void p_float_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1997 p_float_lin_cmp(s,
FRT_EQ,ce,ann);
1999 void p_float_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce,
2001 p_float_lin_cmp_reif(s,
FRT_EQ,ce,ann);
2003 void p_float_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
2004 p_float_lin_cmp(s,
FRT_LQ,ce,ann);
2006 void p_float_lin_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
2007 p_float_lin_cmp(s,
FRT_LE,ce,ann);
2009 void p_float_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce,
2011 p_float_lin_cmp_reif(s,
FRT_LQ,ce,ann);
2013 void p_float_lin_lt_reif(FlatZincSpace& s,
const ConExpr& ce,
2015 p_float_lin_cmp_reif(s,
FRT_LE,ce,ann);
2018 void p_float_times(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2019 FloatVar
x = s.arg2FloatVar(ce[0]);
2020 FloatVar
y = s.arg2FloatVar(ce[1]);
2021 FloatVar
z = s.arg2FloatVar(ce[2]);
2025 void p_float_div(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2026 FloatVar
x = s.arg2FloatVar(ce[0]);
2027 FloatVar
y = s.arg2FloatVar(ce[1]);
2028 FloatVar
z = s.arg2FloatVar(ce[2]);
2032 void p_float_plus(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2033 FloatVar
x = s.arg2FloatVar(ce[0]);
2034 FloatVar
y = s.arg2FloatVar(ce[1]);
2035 FloatVar
z = s.arg2FloatVar(ce[2]);
2039 void p_float_sqrt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2040 FloatVar
x = s.arg2FloatVar(ce[0]);
2041 FloatVar
y = s.arg2FloatVar(ce[1]);
2045 void p_float_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2046 FloatVar
x = s.arg2FloatVar(ce[0]);
2047 FloatVar
y = s.arg2FloatVar(ce[1]);
2051 void p_float_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2052 FloatVar
x = s.arg2FloatVar(ce[0]);
2053 FloatVar
y = s.arg2FloatVar(ce[1]);
2056 void p_float_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2057 FloatVar
x = s.arg2FloatVar(ce[0]);
2058 FloatVar
y = s.arg2FloatVar(ce[1]);
2059 BoolVar
b = s.arg2BoolVar(ce[2]);
2062 void p_float_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2063 FloatVar
x = s.arg2FloatVar(ce[0]);
2064 FloatVar
y = s.arg2FloatVar(ce[1]);
2067 void p_float_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2068 FloatVar
x = s.arg2FloatVar(ce[0]);
2069 FloatVar
y = s.arg2FloatVar(ce[1]);
2070 BoolVar
b = s.arg2BoolVar(ce[2]);
2073 void p_float_max(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2074 FloatVar
x = s.arg2FloatVar(ce[0]);
2075 FloatVar
y = s.arg2FloatVar(ce[1]);
2076 FloatVar
z = s.arg2FloatVar(ce[2]);
2079 void p_float_min(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2080 FloatVar
x = s.arg2FloatVar(ce[0]);
2081 FloatVar
y = s.arg2FloatVar(ce[1]);
2082 FloatVar
z = s.arg2FloatVar(ce[2]);
2085 void p_float_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2086 FloatVar
x = s.arg2FloatVar(ce[0]);
2087 FloatVar
y = s.arg2FloatVar(ce[1]);
2092 void p_float_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2093 FloatVar
x = s.arg2FloatVar(ce[0]);
2094 FloatVar
y = s.arg2FloatVar(ce[1]);
2095 BoolVar
b = s.arg2BoolVar(ce[2]);
2098 rel(s, b == (b0 && !b1));
2103 void p_float_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2104 FloatVar
x = s.arg2FloatVar(ce[0]);
2105 FloatVar
y = s.arg2FloatVar(ce[1]);
2109 #ifdef GECODE_HAS_MPFR 2110 #define P_FLOAT_OP(Op) \ 2111 void p_float_ ## Op (FlatZincSpace& s, const ConExpr& ce, AST::Node*) {\ 2112 FloatVar x = s.arg2FloatVar(ce[0]);\ 2113 FloatVar y = s.arg2FloatVar(ce[1]);\ 2128 void p_float_ln(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2129 FloatVar
x = s.arg2FloatVar(ce[0]);
2130 FloatVar
y = s.arg2FloatVar(ce[1]);
2133 void p_float_log10(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2134 FloatVar
x = s.arg2FloatVar(ce[0]);
2135 FloatVar
y = s.arg2FloatVar(ce[1]);
2138 void p_float_log2(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2139 FloatVar
x = s.arg2FloatVar(ce[0]);
2140 FloatVar
y = s.arg2FloatVar(ce[1]);
2166 registry().
add(
"float_lin_eq_reif",&p_float_lin_eq_reif);
2169 registry().
add(
"float_lin_le_reif",&p_float_lin_le_reif);
2170 registry().
add(
"float_lin_lt_reif",&p_float_lin_lt_reif);
2172 #ifdef GECODE_HAS_MPFR
void mod(Home home, IntVar x0, IntVar x1, IntVar x2, IntPropLevel ipl)
Post propagator for .
static IntArgs create(int n, int start, int inc=1)
Allocate array with n elements such that for all .
Post propagator for SetVar SetOpType op
SetRelType
Common relation types for sets.
void mult(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
IntArgs arg2intargs(AST::Node *arg, int offset=0)
Convert arg (array of integers) to IntArgs.
void post(FlatZincSpace &s, const ConExpr &ce)
Post constraint specified by ce.
void sorted(Home home, const IntVarArgs &x, const IntVarArgs &y, const IntVarArgs &z, IntPropLevel)
Post propagator that y is x sorted in increasing order.
int size(void) const
Return size of array (number of elements)
const int min
Smallest allowed integer in integer set.
Map from constraint identifier to constraint posting functions.
void sequence(Home home, const IntVarArgs &x, const IntSet &s, int q, int l, int u, IntPropLevel)
Post propagator for .
void log(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void channel(Home home, FloatVar x0, IntVar x1)
Post propagator for channeling a float and an integer variable .
const FloatNum max
Largest allowed float value.
void count(Home home, const IntVarArgs &x, int n, IntRelType irt, int m, IntPropLevel)
Post propagator for .
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Gecode::IntVarArray iv
The integer variables.
void abs(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void pow(Home home, FloatVar x0, int n, FloatVar x1)
Post propagator for for $n 0$.
void member(Home home, const IntVarArgs &x, IntVar y, IntPropLevel)
Post domain consistent propagator for .
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
void linear(Home home, const FloatVarArgs &x, FloatRelType frt, FloatVal c)
Post propagator for .
void * ralloc(size_t s)
Allocate s bytes from heap.
void circuit(Home home, int offset, const IntVarArgs &x, IntPropLevel ipl)
Post propagator such that x forms a circuit.
void argmin(Home home, const IntVarArgs &x, IntVar y, bool tiebreak, IntPropLevel)
Post propagator for .
SetOpType
Common operations for sets.
void binpacking(Home home, const IntVarArgs &l, const IntVarArgs &b, const IntArgs &s, IntPropLevel)
Post propagator for bin packing.
const int max
Largest allowed integer in integer set.
ArgArray< IntSet > IntSetArgs
Passing set arguments.
const int max
Largest allowed integer value.
const int min
Smallest allowed integer value.
Gecode::FloatVal c(-8, 8)
int p
Number of positive literals for node type.
const FloatNum min
Smallest allowed float value.
IntRelType neg(IntRelType irt)
Return negated relation type of irt.
int n
Number of negative literals for node type.
void unshare(Home home, IntVarArgs &x, IntPropLevel ipl)
Replace multiple variable occurences in x by fresh variables.
IntPropLevel ann2ipl(AST::Node *ann)
Convert ann to integer propagation level.
Gecode::IntArgs i({1, 2, 3, 4})
void nvalues(Home home, const IntVarArgs &x, IntRelType irt, int y, IntPropLevel)
Post propagator for .
IntRelType
Relation types for integers.
IntVar arg2IntVar(AST::Node *n)
Convert n to IntVar.
FloatRelType
Relation types for floats.
Simple propagation levels.
void extensional(Home home, const IntVarArgs &x, DFA dfa, IntPropLevel)
Post domain consistent propagator for extensional constraint described by a DFA.
BoolVarArgs arg2boolvarargs(AST::Node *arg, int offset=0, int siv=-1)
Convert arg to BoolVarArgs.
void sqrt(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
struct Gecode::@593::NNF::@62::@63 b
For binary nodes (and, or, eqv)
Reification specification.
void distinct(Home home, const IntVarArgs &x, IntPropLevel ipl)
Post propagator for for all .
void argmax(Home home, const IntVarArgs &x, IntVar y, bool tiebreak, IntPropLevel)
Post propagator for .
Post propagator for SetVar SetOpType SetVar SetRelType SetVar z
IntVarArgs arg2intvarargs(AST::Node *arg, int offset=0)
Convert arg to IntVarArgs.
void convex(Home home, SetVar x)
void asin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
AST::Array * ann
Constraint annotations.
Passing integer variables.
bool isBoolArray(AST::Node *b, int &singleInt)
Check if b is array of Booleans (or has a single integer)
SharedArray< int > IntSharedArray
Arrays of integers that can be shared among several element constraints.
Passing integer arguments.
Passing Boolean variables.
static const IntSet empty
Empty set.
BoolVar expr(Home home, const BoolExpr &e, IntPropLevel ipl)
Post Boolean expression and return its value.
void nooverlap(Home home, const IntVarArgs &x, const IntArgs &w, const IntVarArgs &y, const IntArgs &h, IntPropLevel)
Post propagator for rectangle packing.
union Gecode::@593::NNF::@62 u
Union depending on nodetype t.
LinIntExpr cardinality(const SetExpr &e)
Cardinality of set expression.
Post propagator for SetVar SetOpType SetVar SetRelType r
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
void cos(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
IntPropLevel
Propagation levels for integer propagators.
AST::Array * args
Constraint arguments.
Post propagator for f(x \diamond_{\mathit{op}} y) \sim_r z \f$ void rel(Home home
Post propagator for SetVar SetOpType SetVar y
void div(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
void tan(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void(* poster)(FlatZincSpace &, const ConExpr &, AST::Node *)
Type of constraint posting function.
void precede(Home home, const IntVarArgs &x, int s, int t, IntPropLevel)
Post propagator that s precedes t in x.
Heap heap
The single global heap.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
Exception class for FlatZinc errors
Domain propagation Options: basic versus advanced propagation.
Post propagator for SetVar x
void add(const std::string &id, poster p)
Add posting function p with identifier id.
#define BOOL_ARRAY_OP(op)
A space that can be initialized with a FlatZinc model.
Gecode toplevel namespace
void weights(Home home, IntSharedArray elements, IntSharedArray weights, SetVar x, IntVar y)
Implication for reification.
void sin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
A node in a FlatZinc abstract syntax tree.
void acos(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void exp(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void cumulative(Home home, int c, const TaskTypeArgs &t, const IntVarArgs &s, const IntArgs &p, const IntArgs &u, IntPropLevel ipl)
Post propagators for scheduling tasks on cumulative resources.
ReifyMode
Mode for reification.
void unary(Home home, const IntVarArgs &s, const IntArgs &p, IntPropLevel ipl)
Post propagators for scheduling tasks on unary resources.
struct Gecode::@593::NNF::@62::@64 a
For atomic nodes.
void element(Home home, IntSharedArray c, IntVar x0, IntVar x1, IntPropLevel)
Post domain consistent propagator for .
Registry & registry(void)
Return global registry object.
void atan(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
std::string id
Identifier for the constraint.
void clause(Home home, BoolOpType o, const BoolVarArgs &x, const BoolVarArgs &y, int n, IntPropLevel)
Post domain consistent propagator for Boolean clause with positive variables x and negative variables...
Equivalence for reification (default)
IntRelType swap(IntRelType irt)
Return swapped relation type of irt.
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 cl)
Post propagators for the cumulatives constraint.
BoolVar arg2BoolVar(AST::Node *n)
Convert n to BoolVar.
Abstract representation of a constraint.