47 #ifdef GECODE_HAS_SET_VARS 50 #ifdef GECODE_HAS_FLOAT_VARS 55 namespace Gecode {
namespace FlatZinc {
64 std::map<std::string,poster>::iterator
i = r.find(ce.
id);
67 std::string(
"Constraint ")+ce.
id+
" not found");
69 i->second(s, ce, ce.
ann);
75 r[
"gecode_" + id] =
p;
92 for (
int i=offs->
a.size();
i--; ) {
93 oa[
i] = offs->
a[
i]->getInt();
106 if (ce[0]->isIntVar()) {
107 if (ce[1]->isIntVar()) {
119 p_int_CMP(s,
IRT_EQ, ce, ann);
122 p_int_CMP(s,
IRT_NQ, ce, ann);
125 p_int_CMP(s,
IRT_GQ, ce, ann);
128 p_int_CMP(s,
IRT_GR, ce, ann);
131 p_int_CMP(s,
IRT_LQ, ce, ann);
134 p_int_CMP(s,
IRT_LE, ce, ann);
138 if (rm ==
RM_EQV && ce[2]->isBool()) {
139 if (ce[2]->getBool()) {
140 p_int_CMP(s, irt, ce, ann);
142 p_int_CMP(s,
neg(irt), ce, ann);
146 if (ce[0]->isIntVar()) {
147 if (ce[1]->isIntVar()) {
205 if (singleIntVar != -1) {
206 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
211 for (
int i=0;
i<ia.
size();
i++) {
212 if (
i != singleIntVar)
213 ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
232 if (rm ==
RM_EQV && ce[2]->isBool()) {
233 if (ce[2]->getBool()) {
234 p_int_lin_CMP(s, irt, ce, ann);
236 p_int_lin_CMP(s,
neg(irt), ce, ann);
243 if (singleIntVar != -1) {
244 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
249 for (
int i=0;
i<ia.
size();
i++) {
250 if (
i != singleIntVar)
251 ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
258 linear(s, ia, iv, irt, ce[2]->getInt(),
263 linear(s, ia, iv, irt, ce[2]->getInt(),
268 linear(s, ia, iv, irt, ce[2]->getInt(),
274 p_int_lin_CMP(s,
IRT_EQ, ce, ann);
283 p_int_lin_CMP(s,
IRT_NQ, ce, ann);
292 p_int_lin_CMP(s,
IRT_LQ, ce, ann);
301 p_int_lin_CMP(s,
IRT_LE, ce, ann);
310 p_int_lin_CMP(s,
IRT_GQ, ce, ann);
319 p_int_lin_CMP(s,
IRT_GR, ce, ann);
332 if (ce[2]->isIntVar())
339 if (rm ==
RM_EQV && ce[2]->isBool()) {
340 if (ce[2]->getBool()) {
341 p_bool_lin_CMP(s, irt, ce, ann);
343 p_bool_lin_CMP(s,
neg(irt), ce, ann);
349 if (ce[2]->isIntVar())
350 linear(s, ia, iv, irt, s.
iv[ce[2]->getIntVar()],
354 linear(s, ia, iv, irt, ce[2]->getInt(),
359 p_bool_lin_CMP(s,
IRT_EQ, ce, ann);
370 p_bool_lin_CMP(s,
IRT_NQ, ce, ann);
381 p_bool_lin_CMP(s,
IRT_LQ, ce, ann);
393 p_bool_lin_CMP(s,
IRT_LE, ce, ann);
404 p_bool_lin_CMP(s,
IRT_GQ, ce, ann);
415 p_bool_lin_CMP(s,
IRT_GR, ce, ann);
429 if (!ce[0]->isIntVar()) {
432 }
else if (!ce[1]->isIntVar()) {
435 }
else if (!ce[2]->isIntVar()) {
437 == ce[2]->getInt(), s.
ann2ipl(ann));
445 if (!ce[0]->isIntVar()) {
448 }
else if (!ce[1]->isIntVar()) {
451 }
else if (!ce[2]->isIntVar()) {
453 == ce[2]->getInt(), s.
ann2ipl(ann));
469 pow(s, x0, ce[1]->getInt(), x2, s.
ann2ipl(ann));
514 p_bool_CMP(s,
IRT_EQ, ce, ann);
523 p_bool_CMP(s,
IRT_NQ, ce, ann);
532 p_bool_CMP(s,
IRT_GQ, ce, ann);
541 p_bool_CMP(s,
IRT_LQ, ce, ann);
550 p_bool_CMP(s,
IRT_GR, ce, ann);
559 p_bool_CMP(s,
IRT_LE, ce, ann);
568 #define BOOL_OP(op) \ 569 BoolVar b0 = s.arg2BoolVar(ce[0]); \ 570 BoolVar b1 = s.arg2BoolVar(ce[1]); \ 571 if (ce[2]->isBool()) { \ 572 rel(s, b0, op, b1, ce[2]->getBool(), s.ann2ipl(ann)); \ 574 rel(s, b0, op, b1, s.bv[ce[2]->getBoolVar()], s.ann2ipl(ann)); \ 577 #define BOOL_ARRAY_OP(op) \ 578 BoolVarArgs bv = s.arg2boolvarargs(ce[0]); \ 579 if (ce.size()==1) { \ 580 rel(s, op, bv, 1, s.ann2ipl(ann)); \ 581 } else if (ce[1]->isBool()) { \ 582 rel(s, op, bv, ce[1]->getBool(), s.ann2ipl(ann)); \ 584 rel(s, op, bv, s.bv[ce[1]->getBoolVar()], s.ann2ipl(ann)); \ 587 void p_bool_or(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
590 void p_bool_or_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
591 BoolVar b0 = s.arg2BoolVar(ce[0]);
592 BoolVar
b1 = s.arg2BoolVar(ce[1]);
593 BoolVar
b2 = s.arg2BoolVar(ce[2]);
594 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
597 void p_bool_and(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
600 void p_bool_and_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
601 BoolVar b0 = s.arg2BoolVar(ce[0]);
602 BoolVar
b1 = s.arg2BoolVar(ce[1]);
603 BoolVar
b2 = s.arg2BoolVar(ce[2]);
607 void p_array_bool_and(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
611 void p_array_bool_and_imp(FlatZincSpace& s,
const ConExpr& ce,
614 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
615 BoolVar
b1 = s.arg2BoolVar(ce[1]);
616 for (
unsigned int i=bv.
size();
i--;)
619 void p_array_bool_or(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
623 void p_array_bool_or_imp(FlatZincSpace& s,
const ConExpr& ce,
626 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
627 BoolVar
b1 = s.arg2BoolVar(ce[1]);
628 clause(s,
BOT_OR, bv, BoolVarArgs()<<b1, 1, s.ann2ipl(ann));
630 void p_array_bool_xor(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
634 void p_array_bool_xor_imp(FlatZincSpace& s,
const ConExpr& ce,
637 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
640 rel(s, s.arg2BoolVar(ce[1]),
BOT_IMP, tmp, 1);
642 void p_array_bool_clause(FlatZincSpace& s,
const ConExpr& ce,
644 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
645 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
648 void p_array_bool_clause_reif(FlatZincSpace& s,
const ConExpr& ce,
650 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
651 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
652 BoolVar b0 = s.arg2BoolVar(ce[2]);
655 void p_array_bool_clause_imp(FlatZincSpace& s,
const ConExpr& ce,
657 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
658 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
659 BoolVar b0 = s.arg2BoolVar(ce[2]);
662 void p_bool_xor(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
665 void p_bool_xor_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
666 BoolVar b0 = s.arg2BoolVar(ce[0]);
667 BoolVar
b1 = s.arg2BoolVar(ce[1]);
668 BoolVar
b2 = s.arg2BoolVar(ce[2]);
669 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
671 clause(s,
BOT_OR, BoolVarArgs(), BoolVarArgs()<<b0<<b1<<b2, 1,
674 void p_bool_l_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
675 BoolVar b0 = s.arg2BoolVar(ce[0]);
676 BoolVar
b1 = s.arg2BoolVar(ce[1]);
677 if (ce[2]->isBool()) {
678 rel(s, b1,
BOT_IMP, b0, ce[2]->getBool(), s.ann2ipl(ann));
680 rel(s, b1,
BOT_IMP, b0, s.bv[ce[2]->getBoolVar()], s.ann2ipl(ann));
683 void p_bool_r_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
686 void p_bool_not(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
687 BoolVar x0 = s.arg2BoolVar(ce[0]);
688 BoolVar x1 = s.arg2BoolVar(ce[1]);
693 void p_array_int_element(FlatZincSpace& s,
const ConExpr& ce,
695 bool isConstant =
true;
696 AST::Array*
a = ce[1]->getArray();
697 for (
int i=a->
a.size();
i--;) {
698 if (!a->a[
i]->isInt()) {
703 IntVar selector = s.arg2IntVar(ce[0]);
704 rel(s, selector > 0);
707 element(s, sia, selector, s.arg2IntVar(ce[2]), s.ann2ipl(ann));
709 IntVarArgs iv = s.arg2intvarargs(ce[1], 1);
710 element(s, iv, selector, s.arg2IntVar(ce[2]), s.ann2ipl(ann));
713 void p_array_bool_element(FlatZincSpace& s,
const ConExpr& ce,
715 bool isConstant =
true;
716 AST::Array*
a = ce[1]->getArray();
717 for (
int i=a->
a.size();
i--;) {
718 if (!a->a[
i]->isBool()) {
723 IntVar selector = s.arg2IntVar(ce[0]);
724 rel(s, selector > 0);
727 element(s, sia, selector, s.arg2BoolVar(ce[2]), s.ann2ipl(ann));
729 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 1);
730 element(s, iv, selector, s.arg2BoolVar(ce[2]), s.ann2ipl(ann));
735 void p_bool2int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
736 BoolVar x0 = s.arg2BoolVar(ce[0]);
737 IntVar x1 = s.arg2IntVar(ce[1]);
738 if (ce[0]->isBoolVar() && ce[1]->isIntVar()) {
739 s.aliasBool2Int(ce[1]->getIntVar(), ce[0]->getBoolVar());
741 channel(s, x0, x1, s.ann2ipl(ann));
744 void p_int_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
745 IntSet
d = s.arg2intset(ce[1]);
746 if (ce[0]->isBoolVar()) {
748 Iter::Ranges::Singleton sr(0,1);
749 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
751 if (d01.size() == 0) {
754 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
755 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
758 dom(s, s.arg2IntVar(ce[0]),
d);
761 void p_int_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
762 IntSet
d = s.arg2intset(ce[1]);
763 if (ce[0]->isBoolVar()) {
765 Iter::Ranges::Singleton sr(0,1);
766 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
768 if (d01.size() == 0) {
769 rel(s, s.arg2BoolVar(ce[2]) == 0);
770 }
else if (d01.max() == 0) {
771 rel(s, s.arg2BoolVar(ce[2]) == !s.arg2BoolVar(ce[0]));
772 }
else if (d01.min() == 1) {
773 rel(s, s.arg2BoolVar(ce[2]) == s.arg2BoolVar(ce[0]));
775 rel(s, s.arg2BoolVar(ce[2]) == 1);
778 dom(s, s.arg2IntVar(ce[0]),
d, s.arg2BoolVar(ce[2]));
781 void p_int_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
782 IntSet
d = s.arg2intset(ce[1]);
783 if (ce[0]->isBoolVar()) {
785 Iter::Ranges::Singleton sr(0,1);
786 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
788 if (d01.size() == 0) {
789 rel(s, s.arg2BoolVar(ce[2]) == 0);
790 }
else if (d01.max() == 0) {
791 rel(s, s.arg2BoolVar(ce[2]) >> !s.arg2BoolVar(ce[0]));
792 }
else if (d01.min() == 1) {
793 rel(s, s.arg2BoolVar(ce[2]) >> s.arg2BoolVar(ce[0]));
796 dom(s, s.arg2IntVar(ce[0]),
d, Reify(s.arg2BoolVar(ce[2]),
RM_IMP));
802 void p_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
803 IntVar x0 = s.arg2IntVar(ce[0]);
804 IntVar x1 = s.arg2IntVar(ce[1]);
805 abs(s, x0, x1, s.ann2ipl(ann));
808 void p_array_int_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
809 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
810 IntVarArgs iv1 = s.arg2intvarargs(ce[1]);
811 rel(s, iv0,
IRT_LE, iv1, s.ann2ipl(ann));
814 void p_array_int_lq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
815 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
816 IntVarArgs iv1 = s.arg2intvarargs(ce[1]);
817 rel(s, iv0,
IRT_LQ, iv1, s.ann2ipl(ann));
820 void p_array_bool_lt(FlatZincSpace& s,
const ConExpr& ce,
822 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
823 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
824 rel(s, bv0,
IRT_LE, bv1, s.ann2ipl(ann));
827 void p_array_bool_lq(FlatZincSpace& s,
const ConExpr& ce,
829 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
830 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
831 rel(s, bv0,
IRT_LQ, bv1, s.ann2ipl(ann));
834 void p_count(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
835 IntVarArgs iv = s.arg2intvarargs(ce[0]);
836 if (!ce[1]->isIntVar()) {
837 if (!ce[2]->isIntVar()) {
838 count(s, iv, ce[1]->getInt(),
IRT_EQ, ce[2]->getInt(),
841 count(s, iv, ce[1]->getInt(),
IRT_EQ, s.arg2IntVar(ce[2]),
844 }
else if (!ce[2]->isIntVar()) {
845 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, ce[2]->getInt(),
848 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, s.arg2IntVar(ce[2]),
853 void p_count_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
854 IntVarArgs iv = s.arg2intvarargs(ce[0]);
855 IntVar
x = s.arg2IntVar(ce[1]);
856 IntVar
y = s.arg2IntVar(ce[2]);
857 BoolVar
b = s.arg2BoolVar(ce[3]);
862 void p_count_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
863 IntVarArgs iv = s.arg2intvarargs(ce[0]);
864 IntVar
x = s.arg2IntVar(ce[1]);
865 IntVar
y = s.arg2IntVar(ce[2]);
866 BoolVar
b = s.arg2BoolVar(ce[3]);
873 FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
874 IntVarArgs iv = s.arg2intvarargs(ce[1]);
875 count(s, iv, ce[2]->getInt(), irt, ce[0]->getInt(), s.ann2ipl(ann));
878 void p_at_most(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
879 count_rel(
IRT_LQ, s, ce, ann);
882 void p_at_least(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
883 count_rel(
IRT_GQ, s, ce, ann);
886 void p_bin_packing_load(FlatZincSpace& s,
const ConExpr& ce,
888 int minIdx = ce[3]->getInt();
889 IntVarArgs load = s.arg2intvarargs(ce[0]);
891 IntVarArgs bin = s.arg2intvarargs(ce[1]);
892 for (
int i=bin.
size();
i--;)
893 rel(s, bin[
i] >= minIdx);
895 for (
int i=minIdx;
i--;)
897 }
else if (minIdx < 0) {
898 IntVarArgs bin2(bin.size());
899 for (
int i=bin.
size();
i--;)
900 bin2[
i] =
expr(s, bin[
i]-minIdx, s.ann2ipl(ann));
904 IntArgs sizes = s.arg2intargs(ce[2]);
906 IntVarArgs allvars = l + bin;
908 binpacking(s, allvars.slice(0,1,l.size()), allvars.slice(l.size(),1,bin.size()),
909 sizes, s.ann2ipl(ann));
912 void p_global_cardinality(FlatZincSpace& s,
const ConExpr& ce,
914 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
915 IntArgs cover = s.arg2intargs(ce[1]);
916 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
919 IntSet cover_s(cover);
920 IntSetRanges cover_r(cover_s);
921 IntVarRanges* iv0_ri = re.alloc<IntVarRanges>(iv0.size());
922 for (
int i=iv0.
size();
i--;)
923 iv0_ri[
i] = IntVarRanges(iv0[
i]);
924 Iter::Ranges::NaryUnion iv0_r(re,iv0_ri,iv0.size());
925 Iter::Ranges::Diff<Iter::Ranges::NaryUnion,IntSetRanges>
926 extra_r(iv0_r,cover_r);
927 Iter::Ranges::ToValues<Iter::Ranges::Diff<
928 Iter::Ranges::NaryUnion,IntSetRanges> > extra(extra_r);
929 for (; extra(); ++extra) {
930 cover << extra.val();
931 iv1 << IntVar(s,0,iv0.size());
937 IntVarArgs allvars = iv0+iv1;
939 count(s, allvars.slice(0,1,iv0.size()),
940 allvars.slice(iv0.size(),1,iv1.size()),
944 count(s, iv0, iv1, cover, ipl);
948 void p_global_cardinality_closed(FlatZincSpace& s,
const ConExpr& ce,
950 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
951 IntArgs cover = s.arg2intargs(ce[1]);
952 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
957 IntVarArgs allvars = iv0+iv1;
959 count(s, allvars.slice(0,1,iv0.size()),
960 allvars.slice(iv0.size(),1,iv1.size()),
964 count(s, iv0, iv1, cover, ipl);
968 void p_global_cardinality_low_up(FlatZincSpace& s,
const ConExpr& ce,
970 IntVarArgs
x = s.arg2intvarargs(ce[0]);
971 IntArgs cover = s.arg2intargs(ce[1]);
973 IntArgs lbound = s.arg2intargs(ce[2]);
974 IntArgs ubound = s.arg2intargs(ce[3]);
976 for (
int i=cover.
size();
i--;)
977 y[
i] = IntSet(lbound[
i],ubound[i]);
979 IntSet cover_s(cover);
981 IntVarRanges* xrs = re.alloc<IntVarRanges>(x.size());
982 for (
int i=x.size(); i--;)
984 Iter::Ranges::NaryUnion
u(re, xrs, x.size());
985 Iter::Ranges::ToValues<Iter::Ranges::NaryUnion> uv(
u);
987 if (!cover_s.in(uv.val())) {
989 y << IntSet(0,x.size());
996 count(s, x,
y, cover, ipl);
999 void p_global_cardinality_low_up_closed(FlatZincSpace& s,
1002 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1003 IntArgs cover = s.arg2intargs(ce[1]);
1005 IntArgs lbound = s.arg2intargs(ce[2]);
1006 IntArgs ubound = s.arg2intargs(ce[3]);
1008 for (
int i=cover.
size();
i--;)
1009 y[
i] = IntSet(lbound[
i],ubound[i]);
1014 count(s, x,
y, cover, ipl);
1017 void p_minimum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1018 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1019 min(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
1022 void p_maximum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1023 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1024 max(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
1027 void p_minimum_arg(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1028 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1029 argmin(s, iv, s.arg2IntVar(ce[1]),
true, s.ann2ipl(ann));
1032 void p_maximum_arg(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1033 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1034 argmax(s, iv, s.arg2IntVar(ce[1]),
true, s.ann2ipl(ann));
1037 void p_regular(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1038 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1039 int q = ce[1]->getInt();
1040 int symbols = ce[2]->getInt();
1041 IntArgs
d = s.arg2intargs(ce[3]);
1042 int q0 = ce[4]->getInt();
1045 for (
int i=1;
i<=q;
i++) {
1046 for (
int j=1; j<=symbols; j++) {
1047 if (d[(
i-1)*symbols+(j-1)] > 0)
1053 DFA::Transition*
t = re.alloc<DFA::Transition>(noOfTrans+1);
1055 for (
int i=1;
i<=q;
i++) {
1056 for (
int j=1; j<=symbols; j++) {
1057 if (d[(
i-1)*symbols+(j-1)] > 0) {
1058 t[noOfTrans].i_state =
i;
1059 t[noOfTrans].symbol = j;
1060 t[noOfTrans].o_state = d[(
i-1)*symbols+(j-1)];
1065 t[noOfTrans].i_state = -1;
1068 AST::SetLit* sl = ce[5]->getSet();
1071 f =
static_cast<int*
>(
heap.
ralloc(
sizeof(
int)*(sl->max-sl->min+2)));
1072 for (
int i=sl->min; i<=sl->
max;
i++)
1074 f[sl->max-sl->min+1] = -1;
1076 f =
static_cast<int*
>(
heap.
ralloc(
sizeof(
int)*(sl->s.size()+1)));
1077 for (
int j=sl->s.size(); j--; )
1079 f[sl->s.size()] = -1;
1085 extensional(s, iv, s.getSharedDFA(dfa), s.ann2ipl(ann));
1089 p_sort(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1090 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1091 IntVarArgs
y = s.arg2intvarargs(ce[1]);
1092 IntVarArgs xy(x.size()+y.size());
1093 for (
int i=x.
size();
i--;)
1095 for (
int i=y.
size();
i--;)
1098 for (
int i=x.
size();
i--;)
1100 for (
int i=y.
size();
i--;)
1102 sorted(s, x, y, s.ann2ipl(ann));
1106 p_inverse_offsets(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1107 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1109 int xoff = ce[1]->getInt();
1110 IntVarArgs
y = s.arg2intvarargs(ce[2]);
1112 int yoff = ce[3]->getInt();
1113 channel(s, x, xoff, y, yoff, s.ann2ipl(ann));
1117 p_increasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1118 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1123 p_increasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1124 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1129 p_decreasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1130 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1135 p_decreasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1136 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1141 p_table_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1142 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1143 TupleSet ts = s.arg2tupleset(ce[1],x.size());
1148 p_table_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1149 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1150 IntArgs tuples = s.arg2boolargs(ce[1]);
1151 int noOfVars = x.size();
1152 int noOfTuples = tuples.size() == 0 ? 0 : (tuples.size()/noOfVars);
1153 TupleSet ts(noOfVars);
1154 for (
int i=0;
i<noOfTuples;
i++) {
1155 IntArgs
t(noOfVars);
1156 for (
int j=0; j<x.size(); j++) {
1157 t[j] = tuples[
i*noOfVars+j];
1165 void p_cumulative_opt(FlatZincSpace& s,
const ConExpr& ce,
1167 IntVarArgs start = s.arg2intvarargs(ce[0]);
1168 IntArgs duration = s.arg2intargs(ce[1]);
1169 IntArgs height = s.arg2intargs(ce[2]);
1170 BoolVarArgs
opt = s.arg2boolvarargs(ce[3]);
1171 int bound = ce[4]->getInt();
1173 cumulative(s,bound,start,duration,height,opt,s.ann2ipl(ann));
1176 void p_cumulatives(FlatZincSpace& s,
const ConExpr& ce,
1178 IntVarArgs start = s.arg2intvarargs(ce[0]);
1179 IntVarArgs duration = s.arg2intvarargs(ce[1]);
1180 IntVarArgs height = s.arg2intvarargs(ce[2]);
1181 int n = start.size();
1182 IntVar bound = s.arg2IntVar(ce[3]);
1188 rel(s, height[0] <= bound);
1194 for (
int i=2;
i<
n;
i++) {
1195 if (height[
i].
min() < minHeight) {
1196 minHeight2 = minHeight;
1197 minHeight = height[
i].min();
1198 }
else if (height[
i].
min() < minHeight2) {
1199 minHeight2 = height[
i].min();
1203 (minHeight > bound.max()/2) ||
1204 (minHeight2 > bound.max()/2 && minHeight+minHeight2>bound.max());
1206 rel(s, bound >=
max(height));
1208 if (duration.assigned()) {
1209 IntArgs durationI(n);
1211 durationI[
i] = duration[
i].val();
1213 unary(s,start,durationI);
1217 end[
i] =
expr(s,start[
i]+duration[
i]);
1219 unary(s,start,duration,end);
1221 }
else if (height.assigned()) {
1224 heightI[
i] = height[
i].val();
1225 if (duration.assigned()) {
1226 IntArgs durationI(n);
1228 durationI[
i] = duration[
i].val();
1229 cumulative(s, bound, start, durationI, heightI);
1232 for (
int i = n;
i--; )
1233 end[
i] =
expr(s,start[
i]+duration[
i]);
1234 cumulative(s, bound, start, duration, end, heightI);
1236 }
else if (bound.assigned()) {
1238 IntArgs limit(1, bound.val());
1241 end[
i] =
expr(s,start[
i]+duration[
i]);
1242 cumulatives(s, machine, start, duration, end, height, limit,
true,
1247 IntVarArgs end(start.size());
1248 for (
int i = start.
size();
i--; ) {
1251 end[
i] =
expr(s, start[
i] + duration[
i]);
1253 for (
int time = min; time <
max; ++time) {
1254 IntVarArgs
x(start.size());
1255 for (
int i = start.
size();
i--; ) {
1256 IntVar overlaps =
channel(s,
expr(s, (start[
i] <= time) &&
1258 x[
i] =
expr(s, overlaps * height[i]);
1265 void p_among_seq_int(FlatZincSpace& s,
const ConExpr& ce,
1267 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1268 IntSet S = s.arg2intset(ce[1]);
1269 int q = ce[2]->getInt();
1270 int l = ce[3]->getInt();
1271 int u = ce[4]->getInt();
1273 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1276 void p_among_seq_bool(FlatZincSpace& s,
const ConExpr& ce,
1278 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1279 bool val = ce[1]->getBool();
1280 int q = ce[2]->getInt();
1281 int l = ce[3]->getInt();
1282 int u = ce[4]->getInt();
1285 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1288 void p_schedule_unary(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1289 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1290 IntArgs
p = s.arg2intargs(ce[1]);
1295 void p_schedule_unary_optional(FlatZincSpace& s,
const ConExpr& ce,
1297 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1298 IntArgs
p = s.arg2intargs(ce[1]);
1299 BoolVarArgs m = s.arg2boolvarargs(ce[2]);
1304 void p_circuit(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1305 int off = ce[0]->getInt();
1306 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1308 circuit(s,off,xv,s.ann2ipl(ann));
1310 void p_circuit_cost_array(FlatZincSpace& s,
const ConExpr& ce,
1312 IntArgs
c = s.arg2intargs(ce[0]);
1313 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1314 IntVarArgs yv = s.arg2intvarargs(ce[2]);
1315 IntVar
z = s.arg2IntVar(ce[3]);
1317 circuit(s,c,xv,yv,z,s.ann2ipl(ann));
1319 void p_circuit_cost(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1320 IntArgs
c = s.arg2intargs(ce[0]);
1321 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1322 IntVar
z = s.arg2IntVar(ce[2]);
1324 circuit(s,c,xv,z,s.ann2ipl(ann));
1327 void p_nooverlap(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1328 IntVarArgs x0 = s.arg2intvarargs(ce[0]);
1329 IntVarArgs w = s.arg2intvarargs(ce[1]);
1330 IntVarArgs y0 = s.arg2intvarargs(ce[2]);
1331 IntVarArgs h = s.arg2intvarargs(ce[3]);
1332 if (w.assigned() && h.assigned()) {
1333 IntArgs iw(w.size());
1334 for (
int i=w.
size();
i--;)
1336 IntArgs ih(h.size());
1337 for (
int i=h.
size();
i--;)
1339 nooverlap(s,x0,iw,y0,ih,s.ann2ipl(ann));
1341 int miny = y0[0].min();
1342 int maxy = y0[0].max();
1344 for (
int i=1;
i<y0.
size();
i++) {
1349 int minx = x0[0].min();
1350 int maxx = x0[0].max();
1352 for (
int i=1;
i<x0.
size();
i++) {
1362 IntVarArgs x1(x0.size()), y1(y0.size());
1363 for (
int i=x0.
size();
i--; )
1364 x1[
i] =
expr(s, x0[
i] + w[
i]);
1365 for (
int i=y0.size(); i--; )
1366 y1[i] =
expr(s, y0[i] + h[i]);
1367 nooverlap(s,x0,w,x1,y0,h,y1,s.ann2ipl(ann));
1371 void p_precede(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1372 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1373 int p_s = ce[1]->getInt();
1374 int p_t = ce[2]->getInt();
1375 precede(s,x,p_s,p_t,s.ann2ipl(ann));
1378 void p_nvalue(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1379 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1380 if (ce[0]->isIntVar()) {
1381 IntVar
y = s.arg2IntVar(ce[0]);
1388 void p_among(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1389 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1390 IntSet
v = s.arg2intset(ce[2]);
1391 if (ce[0]->isIntVar()) {
1392 IntVar
n = s.arg2IntVar(ce[0]);
1397 count(s,x,v,
IRT_EQ,ce[0]->getInt(),s.ann2ipl(ann));
1401 void p_member_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1402 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1403 IntVar
y = s.arg2IntVar(ce[1]);
1404 member(s,x,y,s.ann2ipl(ann));
1406 void p_member_int_reif(FlatZincSpace& s,
const ConExpr& ce,
1408 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1409 IntVar
y = s.arg2IntVar(ce[1]);
1410 BoolVar
b = s.arg2BoolVar(ce[2]);
1411 member(s,x,y,b,s.ann2ipl(ann));
1413 void p_member_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1414 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1415 BoolVar
y = s.arg2BoolVar(ce[1]);
1416 member(s,x,y,s.ann2ipl(ann));
1418 void p_member_bool_reif(FlatZincSpace& s,
const ConExpr& ce,
1420 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1421 BoolVar
y = s.arg2BoolVar(ce[1]);
1422 member(s,x,y,s.arg2BoolVar(ce[2]),s.ann2ipl(ann));
1429 registry().
add(
"all_different_offset", &p_distinctOffset);
1450 registry().
add(
"int_lin_eq_reif", &p_int_lin_eq_reif);
1451 registry().
add(
"int_lin_eq_imp", &p_int_lin_eq_imp);
1453 registry().
add(
"int_lin_ne_reif", &p_int_lin_ne_reif);
1454 registry().
add(
"int_lin_ne_imp", &p_int_lin_ne_imp);
1456 registry().
add(
"int_lin_le_reif", &p_int_lin_le_reif);
1457 registry().
add(
"int_lin_le_imp", &p_int_lin_le_imp);
1459 registry().
add(
"int_lin_lt_reif", &p_int_lin_lt_reif);
1460 registry().
add(
"int_lin_lt_imp", &p_int_lin_lt_imp);
1462 registry().
add(
"int_lin_ge_reif", &p_int_lin_ge_reif);
1463 registry().
add(
"int_lin_ge_imp", &p_int_lin_ge_imp);
1465 registry().
add(
"int_lin_gt_reif", &p_int_lin_gt_reif);
1466 registry().
add(
"int_lin_gt_imp", &p_int_lin_gt_imp);
1501 registry().
add(
"array_bool_and", &p_array_bool_and);
1502 registry().
add(
"array_bool_and_imp", &p_array_bool_and_imp);
1503 registry().
add(
"array_bool_or", &p_array_bool_or);
1504 registry().
add(
"array_bool_or_imp", &p_array_bool_or_imp);
1505 registry().
add(
"array_bool_xor", &p_array_bool_xor);
1506 registry().
add(
"array_bool_xor_imp", &p_array_bool_xor_imp);
1507 registry().
add(
"bool_clause", &p_array_bool_clause);
1508 registry().
add(
"bool_clause_reif", &p_array_bool_clause_reif);
1509 registry().
add(
"bool_clause_imp", &p_array_bool_clause_imp);
1513 registry().
add(
"array_int_element", &p_array_int_element);
1514 registry().
add(
"array_var_int_element", &p_array_int_element);
1515 registry().
add(
"array_bool_element", &p_array_bool_element);
1516 registry().
add(
"array_var_bool_element", &p_array_bool_element);
1521 #ifndef GECODE_HAS_SET_VARS 1529 registry().
add(
"array_bool_lt", &p_array_bool_lt);
1530 registry().
add(
"array_bool_lq", &p_array_bool_lq);
1536 registry().
add(
"gecode_bin_packing_load", &p_bin_packing_load);
1537 registry().
add(
"gecode_global_cardinality", &p_global_cardinality);
1538 registry().
add(
"gecode_global_cardinality_closed",
1539 &p_global_cardinality_closed);
1541 &p_global_cardinality_low_up);
1542 registry().
add(
"global_cardinality_low_up_closed",
1543 &p_global_cardinality_low_up_closed);
1546 registry().
add(
"gecode_minimum_arg_int", &p_minimum_arg);
1547 registry().
add(
"gecode_maximum_arg_int", &p_maximum_arg);
1551 registry().
add(
"inverse_offsets", &p_inverse_offsets);
1552 registry().
add(
"increasing_int", &p_increasing_int);
1553 registry().
add(
"increasing_bool", &p_increasing_bool);
1554 registry().
add(
"decreasing_int", &p_decreasing_int);
1555 registry().
add(
"decreasing_bool", &p_decreasing_bool);
1557 registry().
add(
"gecode_table_bool", &p_table_bool);
1559 registry().
add(
"gecode_among_seq_int", &p_among_seq_int);
1560 registry().
add(
"gecode_among_seq_bool", &p_among_seq_bool);
1569 registry().
add(
"bool_lin_eq_reif", &p_bool_lin_eq_reif);
1570 registry().
add(
"bool_lin_eq_imp", &p_bool_lin_eq_imp);
1571 registry().
add(
"bool_lin_ne_reif", &p_bool_lin_ne_reif);
1572 registry().
add(
"bool_lin_ne_imp", &p_bool_lin_ne_imp);
1573 registry().
add(
"bool_lin_le_reif", &p_bool_lin_le_reif);
1574 registry().
add(
"bool_lin_le_imp", &p_bool_lin_le_imp);
1575 registry().
add(
"bool_lin_lt_reif", &p_bool_lin_lt_reif);
1576 registry().
add(
"bool_lin_lt_imp", &p_bool_lin_lt_imp);
1577 registry().
add(
"bool_lin_ge_reif", &p_bool_lin_ge_reif);
1578 registry().
add(
"bool_lin_ge_imp", &p_bool_lin_ge_imp);
1579 registry().
add(
"bool_lin_gt_reif", &p_bool_lin_gt_reif);
1580 registry().
add(
"bool_lin_gt_imp", &p_bool_lin_gt_imp);
1582 registry().
add(
"gecode_schedule_unary", &p_schedule_unary);
1583 registry().
add(
"gecode_schedule_unary_optional", &p_schedule_unary_optional);
1584 registry().
add(
"gecode_schedule_cumulative_optional", &p_cumulative_opt);
1587 registry().
add(
"gecode_circuit_cost_array", &p_circuit_cost_array);
1588 registry().
add(
"gecode_circuit_cost", &p_circuit_cost);
1594 registry().
add(
"gecode_member_int_reif",&p_member_int_reif);
1596 registry().
add(
"gecode_member_bool_reif",&p_member_bool_reif);
1599 IntPoster __int_poster;
1601 #ifdef GECODE_HAS_SET_VARS 1603 const ConExpr& ce, AST::Node *) {
1604 rel(s, s.arg2SetVar(ce[0]),
op, s.arg2SetVar(ce[1]),
1605 SRT_EQ, s.arg2SetVar(ce[2]));
1607 void p_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1610 void p_set_intersect(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1613 void p_set_diff(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1617 void p_set_symdiff(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1618 SetVar
x = s.arg2SetVar(ce[0]);
1619 SetVar
y = s.arg2SetVar(ce[1]);
1621 SetVarLubRanges xub(x);
1626 SetVarLubRanges yub(y);
1634 void p_array_set_OP(FlatZincSpace& s,
SetOpType op,
1635 const ConExpr& ce, AST::Node *) {
1636 SetVarArgs xs = s.arg2setvarargs(ce[0]);
1637 rel(s, op, xs, s.arg2SetVar(ce[1]));
1639 void p_array_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1642 void p_array_set_partition(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1647 void p_set_rel(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1648 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]));
1651 void p_set_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1652 p_set_rel(s,
SRT_EQ, ce);
1654 void p_set_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1655 p_set_rel(s,
SRT_NQ, ce);
1657 void p_set_subset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1660 void p_set_superset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1663 void p_set_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1664 p_set_rel(s,
SRT_LQ, ce);
1666 void p_set_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1667 p_set_rel(s,
SRT_LE, ce);
1669 void p_set_card(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1670 if (!ce[1]->isIntVar()) {
1671 cardinality(s, s.arg2SetVar(ce[0]), ce[1]->getInt(),
1674 cardinality(s, s.arg2SetVar(ce[0]), s.arg2IntVar(ce[1]));
1677 void p_set_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1678 if (!ce[1]->isSetVar()) {
1679 IntSet
d = s.arg2intset(ce[1]);
1680 if (ce[0]->isBoolVar()) {
1682 Iter::Ranges::Singleton sr(0,1);
1683 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
1685 if (d01.size() == 0) {
1688 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
1689 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
1692 dom(s, s.arg2IntVar(ce[0]),
d);
1695 if (!ce[0]->isIntVar()) {
1696 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt());
1698 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]));
1702 void p_set_rel_reif(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1703 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]),
1704 s.arg2BoolVar(ce[2]));
1707 void p_set_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1708 p_set_rel_reif(s,
SRT_EQ,ce);
1710 void p_set_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1711 p_set_rel_reif(s,
SRT_LQ,ce);
1713 void p_set_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1714 p_set_rel_reif(s,
SRT_LE,ce);
1716 void p_set_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1717 p_set_rel_reif(s,
SRT_NQ,ce);
1719 void p_set_subset_reif(FlatZincSpace& s,
const ConExpr& ce,
1723 void p_set_superset_reif(FlatZincSpace& s,
const ConExpr& ce,
1727 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann,
ReifyMode rm) {
1728 if (!ce[1]->isSetVar()) {
1730 p_int_in_reif(s,ce,ann);
1733 p_int_in_imp(s,ce,ann);
1736 if (!ce[0]->isIntVar()) {
1737 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt(),
1738 Reify(s.arg2BoolVar(ce[2]),rm));
1740 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]),
1741 Reify(s.arg2BoolVar(ce[2]),rm));
1745 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1746 p_set_in_reif(s,ce,ann,
RM_EQV);
1748 void p_set_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1749 p_set_in_reif(s,ce,ann,
RM_IMP);
1751 void p_set_disjoint(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1752 rel(s, s.arg2SetVar(ce[0]),
SRT_DISJ, s.arg2SetVar(ce[1]));
1755 void p_link_set_to_booleans(FlatZincSpace& s,
const ConExpr& ce,
1757 SetVar
x = s.arg2SetVar(ce[0]);
1758 int idx = ce[2]->getInt();
1761 BoolVarArgs
y = s.arg2boolvarargs(ce[1],idx);
1766 void p_array_set_element(FlatZincSpace& s,
const ConExpr& ce,
1768 bool isConstant =
true;
1769 AST::Array*
a = ce[1]->getArray();
1770 for (
int i=a->
a.size();
i--;) {
1771 if (a->a[
i]->isSetVar()) {
1776 IntVar selector = s.arg2IntVar(ce[0]);
1777 rel(s, selector > 0);
1780 element(s, sv, selector, s.arg2SetVar(ce[2]));
1782 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1783 element(s, sv, selector, s.arg2SetVar(ce[2]));
1787 void p_array_set_element_op(FlatZincSpace& s,
const ConExpr& ce,
1789 const IntSet& universe =
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 SetVar selector = s.arg2SetVar(ce[0]);
1803 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1805 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1806 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1810 void p_array_set_element_union(FlatZincSpace& s,
const ConExpr& ce,
1812 p_array_set_element_op(s, ce, ann,
SOT_UNION);
1815 void p_array_set_element_intersect(FlatZincSpace& s,
const ConExpr& ce,
1817 p_array_set_element_op(s, ce, ann,
SOT_INTER);
1820 void p_array_set_element_intersect_in(FlatZincSpace& s,
1823 IntSet
d = s.arg2intset(ce[3]);
1824 p_array_set_element_op(s, ce, ann,
SOT_INTER, d);
1827 void p_array_set_element_partition(FlatZincSpace& s,
const ConExpr& ce,
1829 p_array_set_element_op(s, ce, ann,
SOT_DUNION);
1832 void p_set_convex(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1833 convex(s, s.arg2SetVar(ce[0]));
1836 void p_array_set_seq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1837 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1841 void p_array_set_seq_union(FlatZincSpace& s,
const ConExpr& ce,
1843 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1844 sequence(s, sv, s.arg2SetVar(ce[1]));
1847 void p_int_set_channel(FlatZincSpace& s,
const ConExpr& ce,
1849 int xoff=ce[1]->getInt();
1851 int yoff=ce[3]->getInt();
1853 IntVarArgs xv = s.arg2intvarargs(ce[0], xoff);
1854 SetVarArgs yv = s.arg2setvarargs(ce[2], yoff, 1, IntSet(0, xoff-1));
1855 IntSet xd(yoff,yv.size()-1);
1856 for (
int i=xoff;
i<xv.
size();
i++) {
1859 IntSet yd(xoff,xv.size()-1);
1860 for (
int i=yoff;
i<yv.
size();
i++) {
1866 void p_range(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1867 int xoff=ce[1]->getInt();
1869 IntVarArgs xv = s.arg2intvarargs(ce[0],xoff);
1873 void p_weights(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1874 IntArgs e = s.arg2intargs(ce[0]);
1875 IntArgs w = s.arg2intargs(ce[1]);
1876 SetVar
x = s.arg2SetVar(ce[2]);
1877 IntVar
y = s.arg2IntVar(ce[3]);
1881 void p_inverse_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1882 int xoff = ce[2]->getInt();
1883 int yoff = ce[3]->getInt();
1884 SetVarArgs
x = s.arg2setvarargs(ce[0],xoff);
1885 SetVarArgs
y = s.arg2setvarargs(ce[1],yoff);
1889 void p_precede_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1890 SetVarArgs
x = s.arg2setvarargs(ce[0]);
1891 int p_s = ce[1]->getInt();
1892 int p_t = ce[2]->getInt();
1905 registry().
add(
"array_set_element", &p_array_set_element);
1906 registry().
add(
"array_var_set_element", &p_array_set_element);
1907 registry().
add(
"set_intersect", &p_set_intersect);
1919 registry().
add(
"set_subset_reif", &p_set_subset_reif);
1920 registry().
add(
"set_superset_reif", &p_set_superset_reif);
1925 &p_link_set_to_booleans);
1927 registry().
add(
"array_set_union", &p_array_set_union);
1928 registry().
add(
"array_set_partition", &p_array_set_partition);
1930 registry().
add(
"array_set_seq", &p_array_set_seq);
1931 registry().
add(
"array_set_seq_union", &p_array_set_seq_union);
1933 &p_array_set_element_union);
1934 registry().
add(
"gecode_array_set_element_intersect",
1935 &p_array_set_element_intersect);
1936 registry().
add(
"gecode_array_set_element_intersect_in",
1937 &p_array_set_element_intersect_in);
1938 registry().
add(
"gecode_array_set_element_partition",
1939 &p_array_set_element_partition);
1941 &p_int_set_channel);
1946 registry().
add(
"gecode_inverse_set", &p_inverse_set);
1947 registry().
add(
"gecode_precede_set", &p_precede_set);
1950 SetPoster __set_poster;
1953 #ifdef GECODE_HAS_FLOAT_VARS 1955 void p_int2float(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1956 IntVar x0 = s.arg2IntVar(ce[0]);
1957 FloatVar x1 = s.arg2FloatVar(ce[1]);
1961 void p_float_lin_cmp(FlatZincSpace& s,
FloatRelType frt,
1962 const ConExpr& ce, AST::Node*) {
1963 FloatValArgs fa = s.arg2floatargs(ce[0]);
1964 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1965 linear(s, fa, fv, frt, ce[2]->getFloat());
1967 void p_float_lin_cmp_reif(FlatZincSpace& s,
FloatRelType frt,
1968 const ConExpr& ce, AST::Node*) {
1969 FloatValArgs fa = s.arg2floatargs(ce[0]);
1970 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1971 linear(s, fa, fv, frt, ce[2]->getFloat(), s.arg2BoolVar(ce[3]));
1973 void p_float_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1974 p_float_lin_cmp(s,
FRT_EQ,ce,ann);
1976 void p_float_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce,
1978 p_float_lin_cmp_reif(s,
FRT_EQ,ce,ann);
1980 void p_float_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1981 p_float_lin_cmp(s,
FRT_LQ,ce,ann);
1983 void p_float_lin_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1984 p_float_lin_cmp(s,
FRT_LE,ce,ann);
1986 void p_float_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce,
1988 p_float_lin_cmp_reif(s,
FRT_LQ,ce,ann);
1990 void p_float_lin_lt_reif(FlatZincSpace& s,
const ConExpr& ce,
1992 p_float_lin_cmp_reif(s,
FRT_LE,ce,ann);
1995 void p_float_times(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1996 FloatVar
x = s.arg2FloatVar(ce[0]);
1997 FloatVar
y = s.arg2FloatVar(ce[1]);
1998 FloatVar
z = s.arg2FloatVar(ce[2]);
2002 void p_float_div(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2003 FloatVar
x = s.arg2FloatVar(ce[0]);
2004 FloatVar
y = s.arg2FloatVar(ce[1]);
2005 FloatVar
z = s.arg2FloatVar(ce[2]);
2009 void p_float_plus(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2010 FloatVar
x = s.arg2FloatVar(ce[0]);
2011 FloatVar
y = s.arg2FloatVar(ce[1]);
2012 FloatVar
z = s.arg2FloatVar(ce[2]);
2016 void p_float_sqrt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2017 FloatVar
x = s.arg2FloatVar(ce[0]);
2018 FloatVar
y = s.arg2FloatVar(ce[1]);
2022 void p_float_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2023 FloatVar
x = s.arg2FloatVar(ce[0]);
2024 FloatVar
y = s.arg2FloatVar(ce[1]);
2028 void p_float_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2029 FloatVar
x = s.arg2FloatVar(ce[0]);
2030 FloatVar
y = s.arg2FloatVar(ce[1]);
2033 void p_float_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2034 FloatVar
x = s.arg2FloatVar(ce[0]);
2035 FloatVar
y = s.arg2FloatVar(ce[1]);
2036 BoolVar
b = s.arg2BoolVar(ce[2]);
2039 void p_float_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2040 FloatVar
x = s.arg2FloatVar(ce[0]);
2041 FloatVar
y = s.arg2FloatVar(ce[1]);
2044 void p_float_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2045 FloatVar
x = s.arg2FloatVar(ce[0]);
2046 FloatVar
y = s.arg2FloatVar(ce[1]);
2047 BoolVar
b = s.arg2BoolVar(ce[2]);
2050 void p_float_max(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2051 FloatVar
x = s.arg2FloatVar(ce[0]);
2052 FloatVar
y = s.arg2FloatVar(ce[1]);
2053 FloatVar
z = s.arg2FloatVar(ce[2]);
2056 void p_float_min(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2057 FloatVar
x = s.arg2FloatVar(ce[0]);
2058 FloatVar
y = s.arg2FloatVar(ce[1]);
2059 FloatVar
z = s.arg2FloatVar(ce[2]);
2062 void p_float_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2063 FloatVar
x = s.arg2FloatVar(ce[0]);
2064 FloatVar
y = s.arg2FloatVar(ce[1]);
2069 void p_float_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2070 FloatVar
x = s.arg2FloatVar(ce[0]);
2071 FloatVar
y = s.arg2FloatVar(ce[1]);
2072 BoolVar
b = s.arg2BoolVar(ce[2]);
2075 rel(s, b == (b0 && !b1));
2080 void p_float_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2081 FloatVar
x = s.arg2FloatVar(ce[0]);
2082 FloatVar
y = s.arg2FloatVar(ce[1]);
2086 #ifdef GECODE_HAS_MPFR 2087 #define P_FLOAT_OP(Op) \ 2088 void p_float_ ## Op (FlatZincSpace& s, const ConExpr& ce, AST::Node*) {\ 2089 FloatVar x = s.arg2FloatVar(ce[0]);\ 2090 FloatVar y = s.arg2FloatVar(ce[1]);\ 2105 void p_float_ln(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2106 FloatVar
x = s.arg2FloatVar(ce[0]);
2107 FloatVar
y = s.arg2FloatVar(ce[1]);
2110 void p_float_log10(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2111 FloatVar
x = s.arg2FloatVar(ce[0]);
2112 FloatVar
y = s.arg2FloatVar(ce[1]);
2115 void p_float_log2(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2116 FloatVar
x = s.arg2FloatVar(ce[0]);
2117 FloatVar
y = s.arg2FloatVar(ce[1]);
2143 registry().
add(
"float_lin_eq_reif",&p_float_lin_eq_reif);
2146 registry().
add(
"float_lin_le_reif",&p_float_lin_le_reif);
2147 registry().
add(
"float_lin_lt_reif",&p_float_lin_lt_reif);
2149 #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.