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 TupleSet ts = s.arg2tupleset(ce[1],x.size());
1144 p_table_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1145 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1146 IntArgs tuples = s.arg2boolargs(ce[1]);
1147 int noOfVars = x.size();
1148 int noOfTuples = tuples.size() == 0 ? 0 : (tuples.size()/noOfVars);
1149 TupleSet ts(noOfVars);
1150 for (
int i=0;
i<noOfTuples;
i++) {
1151 IntArgs
t(noOfVars);
1152 for (
int j=0; j<x.size(); j++) {
1153 t[j] = tuples[
i*noOfVars+j];
1161 void p_cumulative_opt(FlatZincSpace& s,
const ConExpr& ce,
1163 IntVarArgs start = s.arg2intvarargs(ce[0]);
1164 IntArgs duration = s.arg2intargs(ce[1]);
1165 IntArgs height = s.arg2intargs(ce[2]);
1166 BoolVarArgs
opt = s.arg2boolvarargs(ce[3]);
1167 int bound = ce[4]->getInt();
1169 cumulative(s,bound,start,duration,height,opt,s.ann2ipl(ann));
1172 void p_cumulatives(FlatZincSpace& s,
const ConExpr& ce,
1174 IntVarArgs start = s.arg2intvarargs(ce[0]);
1175 IntVarArgs duration = s.arg2intvarargs(ce[1]);
1176 IntVarArgs height = s.arg2intvarargs(ce[2]);
1177 int n = start.size();
1178 IntVar bound = s.arg2IntVar(ce[3]);
1184 rel(s, height[0] <= bound);
1190 for (
int i=2;
i<
n;
i++) {
1191 if (height[
i].
min() < minHeight) {
1192 minHeight2 = minHeight;
1193 minHeight = height[
i].min();
1194 }
else if (height[
i].
min() < minHeight2) {
1195 minHeight2 = height[
i].min();
1199 (minHeight > bound.max()/2) ||
1200 (minHeight2 > bound.max()/2 && minHeight+minHeight2>bound.max());
1202 rel(s, bound >=
max(height));
1204 if (duration.assigned()) {
1205 IntArgs durationI(n);
1207 durationI[
i] = duration[
i].val();
1209 unary(s,start,durationI);
1213 end[
i] =
expr(s,start[
i]+duration[
i]);
1215 unary(s,start,duration,end);
1217 }
else if (height.assigned()) {
1220 heightI[
i] = height[
i].val();
1221 if (duration.assigned()) {
1222 IntArgs durationI(n);
1224 durationI[
i] = duration[
i].val();
1225 cumulative(s, bound, start, durationI, heightI);
1228 for (
int i = n;
i--; )
1229 end[
i] =
expr(s,start[
i]+duration[
i]);
1230 cumulative(s, bound, start, duration, end, heightI);
1232 }
else if (bound.assigned()) {
1234 IntArgs limit(1, bound.val());
1237 end[
i] =
expr(s,start[
i]+duration[
i]);
1238 cumulatives(s, machine, start, duration, end, height, limit,
true,
1243 IntVarArgs end(start.size());
1244 for (
int i = start.
size();
i--; ) {
1247 end[
i] =
expr(s, start[
i] + duration[
i]);
1249 for (
int time = min; time <
max; ++time) {
1250 IntVarArgs
x(start.size());
1251 for (
int i = start.
size();
i--; ) {
1252 IntVar overlaps =
channel(s,
expr(s, (start[
i] <= time) &&
1254 x[
i] =
expr(s, overlaps * height[i]);
1261 void p_among_seq_int(FlatZincSpace& s,
const ConExpr& ce,
1263 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1264 IntSet S = s.arg2intset(ce[1]);
1265 int q = ce[2]->getInt();
1266 int l = ce[3]->getInt();
1267 int u = ce[4]->getInt();
1269 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1272 void p_among_seq_bool(FlatZincSpace& s,
const ConExpr& ce,
1274 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1275 bool val = ce[1]->getBool();
1276 int q = ce[2]->getInt();
1277 int l = ce[3]->getInt();
1278 int u = ce[4]->getInt();
1281 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1284 void p_schedule_unary(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1285 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1286 IntArgs
p = s.arg2intargs(ce[1]);
1291 void p_schedule_unary_optional(FlatZincSpace& s,
const ConExpr& ce,
1293 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1294 IntArgs
p = s.arg2intargs(ce[1]);
1295 BoolVarArgs m = s.arg2boolvarargs(ce[2]);
1300 void p_circuit(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1301 int off = ce[0]->getInt();
1302 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1304 circuit(s,off,xv,s.ann2ipl(ann));
1306 void p_circuit_cost_array(FlatZincSpace& s,
const ConExpr& ce,
1308 IntArgs
c = s.arg2intargs(ce[0]);
1309 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1310 IntVarArgs yv = s.arg2intvarargs(ce[2]);
1311 IntVar
z = s.arg2IntVar(ce[3]);
1313 circuit(s,c,xv,yv,z,s.ann2ipl(ann));
1315 void p_circuit_cost(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1316 IntArgs
c = s.arg2intargs(ce[0]);
1317 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1318 IntVar
z = s.arg2IntVar(ce[2]);
1320 circuit(s,c,xv,z,s.ann2ipl(ann));
1323 void p_nooverlap(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1324 IntVarArgs x0 = s.arg2intvarargs(ce[0]);
1325 IntVarArgs w = s.arg2intvarargs(ce[1]);
1326 IntVarArgs y0 = s.arg2intvarargs(ce[2]);
1327 IntVarArgs h = s.arg2intvarargs(ce[3]);
1328 if (w.assigned() && h.assigned()) {
1329 IntArgs iw(w.size());
1330 for (
int i=w.
size();
i--;)
1332 IntArgs ih(h.size());
1333 for (
int i=h.
size();
i--;)
1335 nooverlap(s,x0,iw,y0,ih,s.ann2ipl(ann));
1337 int miny = y0[0].min();
1338 int maxy = y0[0].max();
1340 for (
int i=1;
i<y0.
size();
i++) {
1345 int minx = x0[0].min();
1346 int maxx = x0[0].max();
1348 for (
int i=1;
i<x0.
size();
i++) {
1358 IntVarArgs x1(x0.size()), y1(y0.size());
1359 for (
int i=x0.
size();
i--; )
1360 x1[
i] =
expr(s, x0[
i] + w[
i]);
1361 for (
int i=y0.size(); i--; )
1362 y1[i] =
expr(s, y0[i] + h[i]);
1363 nooverlap(s,x0,w,x1,y0,h,y1,s.ann2ipl(ann));
1367 void p_precede(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1368 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1369 int p_s = ce[1]->getInt();
1370 int p_t = ce[2]->getInt();
1371 precede(s,x,p_s,p_t,s.ann2ipl(ann));
1374 void p_nvalue(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1375 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1376 if (ce[0]->isIntVar()) {
1377 IntVar
y = s.arg2IntVar(ce[0]);
1384 void p_among(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1385 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1386 IntSet
v = s.arg2intset(ce[2]);
1387 if (ce[0]->isIntVar()) {
1388 IntVar
n = s.arg2IntVar(ce[0]);
1393 count(s,x,v,
IRT_EQ,ce[0]->getInt(),s.ann2ipl(ann));
1397 void p_member_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1398 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1399 IntVar
y = s.arg2IntVar(ce[1]);
1400 member(s,x,y,s.ann2ipl(ann));
1402 void p_member_int_reif(FlatZincSpace& s,
const ConExpr& ce,
1404 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1405 IntVar
y = s.arg2IntVar(ce[1]);
1406 BoolVar
b = s.arg2BoolVar(ce[2]);
1407 member(s,x,y,b,s.ann2ipl(ann));
1409 void p_member_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1410 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1411 BoolVar
y = s.arg2BoolVar(ce[1]);
1412 member(s,x,y,s.ann2ipl(ann));
1414 void p_member_bool_reif(FlatZincSpace& s,
const ConExpr& ce,
1416 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1417 BoolVar
y = s.arg2BoolVar(ce[1]);
1418 member(s,x,y,s.arg2BoolVar(ce[2]),s.ann2ipl(ann));
1425 registry().
add(
"all_different_offset", &p_distinctOffset);
1446 registry().
add(
"int_lin_eq_reif", &p_int_lin_eq_reif);
1447 registry().
add(
"int_lin_eq_imp", &p_int_lin_eq_imp);
1449 registry().
add(
"int_lin_ne_reif", &p_int_lin_ne_reif);
1450 registry().
add(
"int_lin_ne_imp", &p_int_lin_ne_imp);
1452 registry().
add(
"int_lin_le_reif", &p_int_lin_le_reif);
1453 registry().
add(
"int_lin_le_imp", &p_int_lin_le_imp);
1455 registry().
add(
"int_lin_lt_reif", &p_int_lin_lt_reif);
1456 registry().
add(
"int_lin_lt_imp", &p_int_lin_lt_imp);
1458 registry().
add(
"int_lin_ge_reif", &p_int_lin_ge_reif);
1459 registry().
add(
"int_lin_ge_imp", &p_int_lin_ge_imp);
1461 registry().
add(
"int_lin_gt_reif", &p_int_lin_gt_reif);
1462 registry().
add(
"int_lin_gt_imp", &p_int_lin_gt_imp);
1497 registry().
add(
"array_bool_and", &p_array_bool_and);
1498 registry().
add(
"array_bool_and_imp", &p_array_bool_and_imp);
1499 registry().
add(
"array_bool_or", &p_array_bool_or);
1500 registry().
add(
"array_bool_or_imp", &p_array_bool_or_imp);
1501 registry().
add(
"array_bool_xor", &p_array_bool_xor);
1502 registry().
add(
"array_bool_xor_imp", &p_array_bool_xor_imp);
1503 registry().
add(
"bool_clause", &p_array_bool_clause);
1504 registry().
add(
"bool_clause_reif", &p_array_bool_clause_reif);
1505 registry().
add(
"bool_clause_imp", &p_array_bool_clause_imp);
1509 registry().
add(
"array_int_element", &p_array_int_element);
1510 registry().
add(
"array_var_int_element", &p_array_int_element);
1511 registry().
add(
"array_bool_element", &p_array_bool_element);
1512 registry().
add(
"array_var_bool_element", &p_array_bool_element);
1517 #ifndef GECODE_HAS_SET_VARS 1525 registry().
add(
"array_bool_lt", &p_array_bool_lt);
1526 registry().
add(
"array_bool_lq", &p_array_bool_lq);
1532 registry().
add(
"gecode_bin_packing_load", &p_bin_packing_load);
1533 registry().
add(
"gecode_global_cardinality", &p_global_cardinality);
1534 registry().
add(
"gecode_global_cardinality_closed",
1535 &p_global_cardinality_closed);
1537 &p_global_cardinality_low_up);
1538 registry().
add(
"global_cardinality_low_up_closed",
1539 &p_global_cardinality_low_up_closed);
1542 registry().
add(
"gecode_minimum_arg_int", &p_minimum_arg);
1543 registry().
add(
"gecode_maximum_arg_int", &p_maximum_arg);
1547 registry().
add(
"inverse_offsets", &p_inverse_offsets);
1548 registry().
add(
"increasing_int", &p_increasing_int);
1549 registry().
add(
"increasing_bool", &p_increasing_bool);
1550 registry().
add(
"decreasing_int", &p_decreasing_int);
1551 registry().
add(
"decreasing_bool", &p_decreasing_bool);
1553 registry().
add(
"gecode_table_bool", &p_table_bool);
1555 registry().
add(
"gecode_among_seq_int", &p_among_seq_int);
1556 registry().
add(
"gecode_among_seq_bool", &p_among_seq_bool);
1565 registry().
add(
"bool_lin_eq_reif", &p_bool_lin_eq_reif);
1566 registry().
add(
"bool_lin_eq_imp", &p_bool_lin_eq_imp);
1567 registry().
add(
"bool_lin_ne_reif", &p_bool_lin_ne_reif);
1568 registry().
add(
"bool_lin_ne_imp", &p_bool_lin_ne_imp);
1569 registry().
add(
"bool_lin_le_reif", &p_bool_lin_le_reif);
1570 registry().
add(
"bool_lin_le_imp", &p_bool_lin_le_imp);
1571 registry().
add(
"bool_lin_lt_reif", &p_bool_lin_lt_reif);
1572 registry().
add(
"bool_lin_lt_imp", &p_bool_lin_lt_imp);
1573 registry().
add(
"bool_lin_ge_reif", &p_bool_lin_ge_reif);
1574 registry().
add(
"bool_lin_ge_imp", &p_bool_lin_ge_imp);
1575 registry().
add(
"bool_lin_gt_reif", &p_bool_lin_gt_reif);
1576 registry().
add(
"bool_lin_gt_imp", &p_bool_lin_gt_imp);
1578 registry().
add(
"gecode_schedule_unary", &p_schedule_unary);
1579 registry().
add(
"gecode_schedule_unary_optional", &p_schedule_unary_optional);
1580 registry().
add(
"gecode_schedule_cumulative_optional", &p_cumulative_opt);
1583 registry().
add(
"gecode_circuit_cost_array", &p_circuit_cost_array);
1584 registry().
add(
"gecode_circuit_cost", &p_circuit_cost);
1590 registry().
add(
"gecode_member_int_reif",&p_member_int_reif);
1592 registry().
add(
"gecode_member_bool_reif",&p_member_bool_reif);
1595 IntPoster __int_poster;
1597 #ifdef GECODE_HAS_SET_VARS 1599 const ConExpr& ce, AST::Node *) {
1600 rel(s, s.arg2SetVar(ce[0]),
op, s.arg2SetVar(ce[1]),
1601 SRT_EQ, s.arg2SetVar(ce[2]));
1603 void p_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1606 void p_set_intersect(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1609 void p_set_diff(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1613 void p_set_symdiff(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1614 SetVar
x = s.arg2SetVar(ce[0]);
1615 SetVar
y = s.arg2SetVar(ce[1]);
1617 SetVarLubRanges xub(x);
1622 SetVarLubRanges yub(y);
1630 void p_array_set_OP(FlatZincSpace& s,
SetOpType op,
1631 const ConExpr& ce, AST::Node *) {
1632 SetVarArgs xs = s.arg2setvarargs(ce[0]);
1633 rel(s, op, xs, s.arg2SetVar(ce[1]));
1635 void p_array_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1638 void p_array_set_partition(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1643 void p_set_rel(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1644 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]));
1647 void p_set_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1648 p_set_rel(s,
SRT_EQ, ce);
1650 void p_set_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1651 p_set_rel(s,
SRT_NQ, ce);
1653 void p_set_subset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1656 void p_set_superset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1659 void p_set_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1660 p_set_rel(s,
SRT_LQ, ce);
1662 void p_set_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1663 p_set_rel(s,
SRT_LE, ce);
1665 void p_set_card(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1666 if (!ce[1]->isIntVar()) {
1667 cardinality(s, s.arg2SetVar(ce[0]), ce[1]->getInt(),
1670 cardinality(s, s.arg2SetVar(ce[0]), s.arg2IntVar(ce[1]));
1673 void p_set_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1674 if (!ce[1]->isSetVar()) {
1675 IntSet
d = s.arg2intset(ce[1]);
1676 if (ce[0]->isBoolVar()) {
1678 Iter::Ranges::Singleton sr(0,1);
1679 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
1681 if (d01.size() == 0) {
1684 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
1685 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
1688 dom(s, s.arg2IntVar(ce[0]),
d);
1691 if (!ce[0]->isIntVar()) {
1692 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt());
1694 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]));
1698 void p_set_rel_reif(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1699 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]),
1700 s.arg2BoolVar(ce[2]));
1703 void p_set_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1704 p_set_rel_reif(s,
SRT_EQ,ce);
1706 void p_set_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1707 p_set_rel_reif(s,
SRT_LQ,ce);
1709 void p_set_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1710 p_set_rel_reif(s,
SRT_LE,ce);
1712 void p_set_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1713 p_set_rel_reif(s,
SRT_NQ,ce);
1715 void p_set_subset_reif(FlatZincSpace& s,
const ConExpr& ce,
1719 void p_set_superset_reif(FlatZincSpace& s,
const ConExpr& ce,
1723 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann,
ReifyMode rm) {
1724 if (!ce[1]->isSetVar()) {
1726 p_int_in_reif(s,ce,ann);
1729 p_int_in_imp(s,ce,ann);
1732 if (!ce[0]->isIntVar()) {
1733 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt(),
1734 Reify(s.arg2BoolVar(ce[2]),rm));
1736 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]),
1737 Reify(s.arg2BoolVar(ce[2]),rm));
1741 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1742 p_set_in_reif(s,ce,ann,
RM_EQV);
1744 void p_set_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1745 p_set_in_reif(s,ce,ann,
RM_IMP);
1747 void p_set_disjoint(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1748 rel(s, s.arg2SetVar(ce[0]),
SRT_DISJ, s.arg2SetVar(ce[1]));
1751 void p_link_set_to_booleans(FlatZincSpace& s,
const ConExpr& ce,
1753 SetVar
x = s.arg2SetVar(ce[0]);
1754 int idx = ce[2]->getInt();
1757 BoolVarArgs
y = s.arg2boolvarargs(ce[1],idx);
1762 void p_array_set_element(FlatZincSpace& s,
const ConExpr& ce,
1764 bool isConstant =
true;
1765 AST::Array*
a = ce[1]->getArray();
1766 for (
int i=a->
a.size();
i--;) {
1767 if (a->a[
i]->isSetVar()) {
1772 IntVar selector = s.arg2IntVar(ce[0]);
1773 rel(s, selector > 0);
1776 element(s, sv, selector, s.arg2SetVar(ce[2]));
1778 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1779 element(s, sv, selector, s.arg2SetVar(ce[2]));
1783 void p_array_set_element_op(FlatZincSpace& s,
const ConExpr& ce,
1785 const IntSet& universe =
1787 bool isConstant =
true;
1788 AST::Array*
a = ce[1]->getArray();
1789 for (
int i=a->
a.size();
i--;) {
1790 if (a->a[
i]->isSetVar()) {
1795 SetVar selector = s.arg2SetVar(ce[0]);
1799 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1801 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1802 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1806 void p_array_set_element_union(FlatZincSpace& s,
const ConExpr& ce,
1808 p_array_set_element_op(s, ce, ann,
SOT_UNION);
1811 void p_array_set_element_intersect(FlatZincSpace& s,
const ConExpr& ce,
1813 p_array_set_element_op(s, ce, ann,
SOT_INTER);
1816 void p_array_set_element_intersect_in(FlatZincSpace& s,
1819 IntSet
d = s.arg2intset(ce[3]);
1820 p_array_set_element_op(s, ce, ann,
SOT_INTER, d);
1823 void p_array_set_element_partition(FlatZincSpace& s,
const ConExpr& ce,
1825 p_array_set_element_op(s, ce, ann,
SOT_DUNION);
1828 void p_set_convex(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1829 convex(s, s.arg2SetVar(ce[0]));
1832 void p_array_set_seq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1833 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1837 void p_array_set_seq_union(FlatZincSpace& s,
const ConExpr& ce,
1839 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1840 sequence(s, sv, s.arg2SetVar(ce[1]));
1843 void p_int_set_channel(FlatZincSpace& s,
const ConExpr& ce,
1845 int xoff=ce[1]->getInt();
1847 int yoff=ce[3]->getInt();
1849 IntVarArgs xv = s.arg2intvarargs(ce[0], xoff);
1850 SetVarArgs yv = s.arg2setvarargs(ce[2], yoff, 1, IntSet(0, xoff-1));
1851 IntSet xd(yoff,yv.size()-1);
1852 for (
int i=xoff;
i<xv.
size();
i++) {
1855 IntSet yd(xoff,xv.size()-1);
1856 for (
int i=yoff;
i<yv.
size();
i++) {
1862 void p_range(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1863 int xoff=ce[1]->getInt();
1865 IntVarArgs xv = s.arg2intvarargs(ce[0],xoff);
1869 void p_weights(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1870 IntArgs e = s.arg2intargs(ce[0]);
1871 IntArgs w = s.arg2intargs(ce[1]);
1872 SetVar
x = s.arg2SetVar(ce[2]);
1873 IntVar
y = s.arg2IntVar(ce[3]);
1877 void p_inverse_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1878 int xoff = ce[2]->getInt();
1879 int yoff = ce[3]->getInt();
1880 SetVarArgs
x = s.arg2setvarargs(ce[0],xoff);
1881 SetVarArgs
y = s.arg2setvarargs(ce[1],yoff);
1885 void p_precede_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1886 SetVarArgs
x = s.arg2setvarargs(ce[0]);
1887 int p_s = ce[1]->getInt();
1888 int p_t = ce[2]->getInt();
1901 registry().
add(
"array_set_element", &p_array_set_element);
1902 registry().
add(
"array_var_set_element", &p_array_set_element);
1903 registry().
add(
"set_intersect", &p_set_intersect);
1915 registry().
add(
"set_subset_reif", &p_set_subset_reif);
1916 registry().
add(
"set_superset_reif", &p_set_superset_reif);
1921 &p_link_set_to_booleans);
1923 registry().
add(
"array_set_union", &p_array_set_union);
1924 registry().
add(
"array_set_partition", &p_array_set_partition);
1926 registry().
add(
"array_set_seq", &p_array_set_seq);
1927 registry().
add(
"array_set_seq_union", &p_array_set_seq_union);
1929 &p_array_set_element_union);
1930 registry().
add(
"gecode_array_set_element_intersect",
1931 &p_array_set_element_intersect);
1932 registry().
add(
"gecode_array_set_element_intersect_in",
1933 &p_array_set_element_intersect_in);
1934 registry().
add(
"gecode_array_set_element_partition",
1935 &p_array_set_element_partition);
1937 &p_int_set_channel);
1942 registry().
add(
"gecode_inverse_set", &p_inverse_set);
1943 registry().
add(
"gecode_precede_set", &p_precede_set);
1946 SetPoster __set_poster;
1949 #ifdef GECODE_HAS_FLOAT_VARS 1951 void p_int2float(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1952 IntVar x0 = s.arg2IntVar(ce[0]);
1953 FloatVar x1 = s.arg2FloatVar(ce[1]);
1957 void p_float_lin_cmp(FlatZincSpace& s,
FloatRelType frt,
1958 const ConExpr& ce, AST::Node*) {
1959 FloatValArgs fa = s.arg2floatargs(ce[0]);
1960 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1961 linear(s, fa, fv, frt, ce[2]->getFloat());
1963 void p_float_lin_cmp_reif(FlatZincSpace& s,
FloatRelType frt,
1964 const ConExpr& ce, AST::Node*) {
1965 FloatValArgs fa = s.arg2floatargs(ce[0]);
1966 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1967 linear(s, fa, fv, frt, ce[2]->getFloat(), s.arg2BoolVar(ce[3]));
1969 void p_float_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1970 p_float_lin_cmp(s,
FRT_EQ,ce,ann);
1972 void p_float_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce,
1974 p_float_lin_cmp_reif(s,
FRT_EQ,ce,ann);
1976 void p_float_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1977 p_float_lin_cmp(s,
FRT_LQ,ce,ann);
1979 void p_float_lin_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1980 p_float_lin_cmp(s,
FRT_LE,ce,ann);
1982 void p_float_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce,
1984 p_float_lin_cmp_reif(s,
FRT_LQ,ce,ann);
1986 void p_float_lin_lt_reif(FlatZincSpace& s,
const ConExpr& ce,
1988 p_float_lin_cmp_reif(s,
FRT_LE,ce,ann);
1991 void p_float_times(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1992 FloatVar
x = s.arg2FloatVar(ce[0]);
1993 FloatVar
y = s.arg2FloatVar(ce[1]);
1994 FloatVar
z = s.arg2FloatVar(ce[2]);
1998 void p_float_div(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1999 FloatVar
x = s.arg2FloatVar(ce[0]);
2000 FloatVar
y = s.arg2FloatVar(ce[1]);
2001 FloatVar
z = s.arg2FloatVar(ce[2]);
2005 void p_float_plus(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2006 FloatVar
x = s.arg2FloatVar(ce[0]);
2007 FloatVar
y = s.arg2FloatVar(ce[1]);
2008 FloatVar
z = s.arg2FloatVar(ce[2]);
2012 void p_float_sqrt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2013 FloatVar
x = s.arg2FloatVar(ce[0]);
2014 FloatVar
y = s.arg2FloatVar(ce[1]);
2018 void p_float_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2019 FloatVar
x = s.arg2FloatVar(ce[0]);
2020 FloatVar
y = s.arg2FloatVar(ce[1]);
2024 void p_float_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2025 FloatVar
x = s.arg2FloatVar(ce[0]);
2026 FloatVar
y = s.arg2FloatVar(ce[1]);
2029 void p_float_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2030 FloatVar
x = s.arg2FloatVar(ce[0]);
2031 FloatVar
y = s.arg2FloatVar(ce[1]);
2032 BoolVar
b = s.arg2BoolVar(ce[2]);
2035 void p_float_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2036 FloatVar
x = s.arg2FloatVar(ce[0]);
2037 FloatVar
y = s.arg2FloatVar(ce[1]);
2040 void p_float_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2041 FloatVar
x = s.arg2FloatVar(ce[0]);
2042 FloatVar
y = s.arg2FloatVar(ce[1]);
2043 BoolVar
b = s.arg2BoolVar(ce[2]);
2046 void p_float_max(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2047 FloatVar
x = s.arg2FloatVar(ce[0]);
2048 FloatVar
y = s.arg2FloatVar(ce[1]);
2049 FloatVar
z = s.arg2FloatVar(ce[2]);
2052 void p_float_min(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2053 FloatVar
x = s.arg2FloatVar(ce[0]);
2054 FloatVar
y = s.arg2FloatVar(ce[1]);
2055 FloatVar
z = s.arg2FloatVar(ce[2]);
2058 void p_float_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2059 FloatVar
x = s.arg2FloatVar(ce[0]);
2060 FloatVar
y = s.arg2FloatVar(ce[1]);
2065 void p_float_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2066 FloatVar
x = s.arg2FloatVar(ce[0]);
2067 FloatVar
y = s.arg2FloatVar(ce[1]);
2068 BoolVar
b = s.arg2BoolVar(ce[2]);
2071 rel(s, b == (b0 && !b1));
2076 void p_float_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2077 FloatVar
x = s.arg2FloatVar(ce[0]);
2078 FloatVar
y = s.arg2FloatVar(ce[1]);
2082 #ifdef GECODE_HAS_MPFR 2083 #define P_FLOAT_OP(Op) \ 2084 void p_float_ ## Op (FlatZincSpace& s, const ConExpr& ce, AST::Node*) {\ 2085 FloatVar x = s.arg2FloatVar(ce[0]);\ 2086 FloatVar y = s.arg2FloatVar(ce[1]);\ 2101 void p_float_ln(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2102 FloatVar
x = s.arg2FloatVar(ce[0]);
2103 FloatVar
y = s.arg2FloatVar(ce[1]);
2106 void p_float_log10(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2107 FloatVar
x = s.arg2FloatVar(ce[0]);
2108 FloatVar
y = s.arg2FloatVar(ce[1]);
2111 void p_float_log2(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2112 FloatVar
x = s.arg2FloatVar(ce[0]);
2113 FloatVar
y = s.arg2FloatVar(ce[1]);
2139 registry().
add(
"float_lin_eq_reif",&p_float_lin_eq_reif);
2142 registry().
add(
"float_lin_le_reif",&p_float_lin_le_reif);
2143 registry().
add(
"float_lin_lt_reif",&p_float_lin_lt_reif);
2145 #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.
Gecode::IntArgs i(4, 1, 2, 3, 4)
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.
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 .
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 .
union Gecode::@585::NNF::@62 u
Union depending on nodetype t.
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.
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.
struct Gecode::@585::NNF::@62::@63 b
For binary nodes (and, or, eqv)
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 .
struct Gecode::@585::NNF::@62::@64 a
For atomic nodes.
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.
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.