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);
118 for (
int i=offs->
a.size();
i--; ) {
119 oa[
i] = offs->
a[
i]->getInt();
132 if (ce[0]->isIntVar()) {
133 if (ce[1]->isIntVar()) {
145 p_int_CMP(s,
IRT_EQ, ce, ann);
148 p_int_CMP(s,
IRT_NQ, ce, ann);
151 p_int_CMP(s,
IRT_GQ, ce, ann);
154 p_int_CMP(s,
IRT_GR, ce, ann);
157 p_int_CMP(s,
IRT_LQ, ce, ann);
160 p_int_CMP(s,
IRT_LE, ce, ann);
164 if (rm ==
RM_EQV && ce[2]->isBool()) {
165 if (ce[2]->getBool()) {
166 p_int_CMP(s, irt, ce, ann);
168 p_int_CMP(s,
neg(irt), ce, ann);
172 if (ce[0]->isIntVar()) {
173 if (ce[1]->isIntVar()) {
231 if (singleIntVar != -1) {
232 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
237 for (
int i=0;
i<ia.
size();
i++) {
238 if (
i != singleIntVar)
239 ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
241 IntRelType t = (ia[singleIntVar] == -1 ? irt : swap(irt));
258 if (rm ==
RM_EQV && ce[2]->isBool()) {
259 if (ce[2]->getBool()) {
260 p_int_lin_CMP(s, irt, ce, ann);
262 p_int_lin_CMP(s,
neg(irt), ce, ann);
269 if (singleIntVar != -1) {
270 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
275 for (
int i=0;
i<ia.
size();
i++) {
276 if (
i != singleIntVar)
277 ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
279 IntRelType t = (ia[singleIntVar] == -1 ? irt : swap(irt));
284 linear(s, ia, iv, irt, ce[2]->getInt(),
289 linear(s, ia, iv, irt, ce[2]->getInt(),
294 linear(s, ia, iv, irt, ce[2]->getInt(),
300 p_int_lin_CMP(s,
IRT_EQ, ce, ann);
309 p_int_lin_CMP(s,
IRT_NQ, ce, ann);
318 p_int_lin_CMP(s,
IRT_LQ, ce, ann);
327 p_int_lin_CMP(s,
IRT_LE, ce, ann);
336 p_int_lin_CMP(s,
IRT_GQ, ce, ann);
345 p_int_lin_CMP(s,
IRT_GR, ce, ann);
358 if (ce[2]->isIntVar())
365 if (rm ==
RM_EQV && ce[2]->isBool()) {
366 if (ce[2]->getBool()) {
367 p_bool_lin_CMP(s, irt, ce, ann);
369 p_bool_lin_CMP(s,
neg(irt), ce, ann);
375 if (ce[2]->isIntVar())
376 linear(s, ia, iv, irt, s.
iv[ce[2]->getIntVar()],
380 linear(s, ia, iv, irt, ce[2]->getInt(),
385 p_bool_lin_CMP(s,
IRT_EQ, ce, ann);
396 p_bool_lin_CMP(s,
IRT_NQ, ce, ann);
407 p_bool_lin_CMP(s,
IRT_LQ, ce, ann);
419 p_bool_lin_CMP(s,
IRT_LE, ce, ann);
430 p_bool_lin_CMP(s,
IRT_GQ, ce, ann);
441 p_bool_lin_CMP(s,
IRT_GR, ce, ann);
455 if (!ce[0]->isIntVar()) {
458 }
else if (!ce[1]->isIntVar()) {
461 }
else if (!ce[2]->isIntVar()) {
463 == ce[2]->getInt(), s.
ann2ipl(ann));
471 if (!ce[0]->isIntVar()) {
474 }
else if (!ce[1]->isIntVar()) {
477 }
else if (!ce[2]->isIntVar()) {
479 == ce[2]->getInt(), s.
ann2ipl(ann));
535 p_bool_CMP(s,
IRT_EQ, ce, ann);
544 p_bool_CMP(s,
IRT_NQ, ce, ann);
553 p_bool_CMP(s,
IRT_GQ, ce, ann);
562 p_bool_CMP(s,
IRT_LQ, ce, ann);
571 p_bool_CMP(s,
IRT_GR, ce, ann);
580 p_bool_CMP(s,
IRT_LE, ce, ann);
589 #define BOOL_OP(op) \ 590 BoolVar b0 = s.arg2BoolVar(ce[0]); \ 591 BoolVar b1 = s.arg2BoolVar(ce[1]); \ 592 if (ce[2]->isBool()) { \ 593 rel(s, b0, op, b1, ce[2]->getBool(), s.ann2ipl(ann)); \ 595 rel(s, b0, op, b1, s.bv[ce[2]->getBoolVar()], s.ann2ipl(ann)); \ 598 #define BOOL_ARRAY_OP(op) \ 599 BoolVarArgs bv = s.arg2boolvarargs(ce[0]); \ 600 if (ce.size()==1) { \ 601 rel(s, op, bv, 1, s.ann2ipl(ann)); \ 602 } else if (ce[1]->isBool()) { \ 603 rel(s, op, bv, ce[1]->getBool(), s.ann2ipl(ann)); \ 605 rel(s, op, bv, s.bv[ce[1]->getBoolVar()], s.ann2ipl(ann)); \ 608 void p_bool_or(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
611 void p_bool_or_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
612 BoolVar b0 = s.arg2BoolVar(ce[0]);
613 BoolVar
b1 = s.arg2BoolVar(ce[1]);
614 BoolVar
b2 = s.arg2BoolVar(ce[2]);
615 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
618 void p_bool_and(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
621 void p_bool_and_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
622 BoolVar b0 = s.arg2BoolVar(ce[0]);
623 BoolVar
b1 = s.arg2BoolVar(ce[1]);
624 BoolVar
b2 = s.arg2BoolVar(ce[2]);
628 void p_array_bool_and(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
632 void p_array_bool_and_imp(FlatZincSpace& s,
const ConExpr& ce,
635 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
636 BoolVar
b1 = s.arg2BoolVar(ce[1]);
637 for (
unsigned int i=bv.
size();
i--;)
640 void p_array_bool_or(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
644 void p_array_bool_or_imp(FlatZincSpace& s,
const ConExpr& ce,
647 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
648 BoolVar
b1 = s.arg2BoolVar(ce[1]);
649 clause(s,
BOT_OR, bv, BoolVarArgs()<<b1, 1, s.ann2ipl(ann));
651 void p_array_bool_xor(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
655 void p_array_bool_xor_imp(FlatZincSpace& s,
const ConExpr& ce,
658 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
661 rel(s, s.arg2BoolVar(ce[1]),
BOT_IMP, tmp, 1);
663 void p_array_bool_clause(FlatZincSpace& s,
const ConExpr& ce,
665 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
666 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
669 void p_array_bool_clause_reif(FlatZincSpace& s,
const ConExpr& ce,
671 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
672 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
673 BoolVar b0 = s.arg2BoolVar(ce[2]);
676 void p_array_bool_clause_imp(FlatZincSpace& s,
const ConExpr& ce,
678 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
679 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
680 BoolVar b0 = s.arg2BoolVar(ce[2]);
683 void p_bool_xor(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
686 void p_bool_xor_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
687 BoolVar b0 = s.arg2BoolVar(ce[0]);
688 BoolVar
b1 = s.arg2BoolVar(ce[1]);
689 BoolVar
b2 = s.arg2BoolVar(ce[2]);
690 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
692 clause(s,
BOT_OR, BoolVarArgs(), BoolVarArgs()<<b0<<b1<<b2, 1,
695 void p_bool_l_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
696 BoolVar b0 = s.arg2BoolVar(ce[0]);
697 BoolVar
b1 = s.arg2BoolVar(ce[1]);
698 if (ce[2]->isBool()) {
699 rel(s, b1,
BOT_IMP, b0, ce[2]->getBool(), s.ann2ipl(ann));
701 rel(s, b1,
BOT_IMP, b0, s.bv[ce[2]->getBoolVar()], s.ann2ipl(ann));
704 void p_bool_r_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
707 void p_bool_not(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
708 BoolVar x0 = s.arg2BoolVar(ce[0]);
709 BoolVar x1 = s.arg2BoolVar(ce[1]);
714 void p_array_int_element(FlatZincSpace& s,
const ConExpr& ce,
716 bool isConstant =
true;
717 AST::Array*
a = ce[1]->getArray();
718 for (
int i=a->
a.size();
i--;) {
719 if (!a->a[
i]->isInt()) {
724 IntVar selector = s.arg2IntVar(ce[0]);
725 rel(s, selector > 0);
727 IntArgs ia = s.arg2intargs(ce[1], 1);
728 element(s, ia, selector, s.arg2IntVar(ce[2]), s.ann2ipl(ann));
730 IntVarArgs iv = s.arg2intvarargs(ce[1], 1);
731 element(s, iv, selector, s.arg2IntVar(ce[2]), s.ann2ipl(ann));
734 void p_array_bool_element(FlatZincSpace& s,
const ConExpr& ce,
736 bool isConstant =
true;
737 AST::Array*
a = ce[1]->getArray();
738 for (
int i=a->
a.size();
i--;) {
739 if (!a->a[
i]->isBool()) {
744 IntVar selector = s.arg2IntVar(ce[0]);
745 rel(s, selector > 0);
747 IntArgs ia = s.arg2boolargs(ce[1], 1);
748 element(s, ia, selector, s.arg2BoolVar(ce[2]), s.ann2ipl(ann));
750 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 1);
751 element(s, iv, selector, s.arg2BoolVar(ce[2]), s.ann2ipl(ann));
756 void p_bool2int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
757 BoolVar x0 = s.arg2BoolVar(ce[0]);
758 IntVar x1 = s.arg2IntVar(ce[1]);
759 if (ce[0]->isBoolVar() && ce[1]->isIntVar()) {
760 s.aliasBool2Int(ce[1]->getIntVar(), ce[0]->getBoolVar());
762 channel(s, x0, x1, s.ann2ipl(ann));
765 void p_int_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
766 IntSet
d = s.arg2intset(ce[1]);
767 if (ce[0]->isBoolVar()) {
769 Iter::Ranges::Singleton sr(0,1);
770 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
772 if (d01.size() == 0) {
775 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
776 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
779 dom(s, s.arg2IntVar(ce[0]),
d);
782 void p_int_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
783 IntSet
d = s.arg2intset(ce[1]);
784 if (ce[0]->isBoolVar()) {
786 Iter::Ranges::Singleton sr(0,1);
787 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
789 if (d01.size() == 0) {
790 rel(s, s.arg2BoolVar(ce[2]) == 0);
791 }
else if (d01.max() == 0) {
792 rel(s, s.arg2BoolVar(ce[2]) == !s.arg2BoolVar(ce[0]));
793 }
else if (d01.min() == 1) {
794 rel(s, s.arg2BoolVar(ce[2]) == s.arg2BoolVar(ce[0]));
796 rel(s, s.arg2BoolVar(ce[2]) == 1);
799 dom(s, s.arg2IntVar(ce[0]),
d, s.arg2BoolVar(ce[2]));
802 void p_int_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
803 IntSet
d = s.arg2intset(ce[1]);
804 if (ce[0]->isBoolVar()) {
806 Iter::Ranges::Singleton sr(0,1);
807 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
809 if (d01.size() == 0) {
810 rel(s, s.arg2BoolVar(ce[2]) == 0);
811 }
else if (d01.max() == 0) {
812 rel(s, s.arg2BoolVar(ce[2]) >> !s.arg2BoolVar(ce[0]));
813 }
else if (d01.min() == 1) {
814 rel(s, s.arg2BoolVar(ce[2]) >> s.arg2BoolVar(ce[0]));
817 dom(s, s.arg2IntVar(ce[0]),
d, Reify(s.arg2BoolVar(ce[2]),
RM_IMP));
823 void p_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
824 IntVar x0 = s.arg2IntVar(ce[0]);
825 IntVar x1 = s.arg2IntVar(ce[1]);
826 abs(s, x0, x1, s.ann2ipl(ann));
829 void p_array_int_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
830 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
831 IntVarArgs iv1 = s.arg2intvarargs(ce[1]);
832 rel(s, iv0,
IRT_LE, iv1, s.ann2ipl(ann));
835 void p_array_int_lq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
836 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
837 IntVarArgs iv1 = s.arg2intvarargs(ce[1]);
838 rel(s, iv0,
IRT_LQ, iv1, s.ann2ipl(ann));
841 void p_array_bool_lt(FlatZincSpace& s,
const ConExpr& ce,
843 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
844 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
845 rel(s, bv0,
IRT_LE, bv1, s.ann2ipl(ann));
848 void p_array_bool_lq(FlatZincSpace& s,
const ConExpr& ce,
850 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
851 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
852 rel(s, bv0,
IRT_LQ, bv1, s.ann2ipl(ann));
855 void p_count(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
856 IntVarArgs iv = s.arg2intvarargs(ce[0]);
857 if (!ce[1]->isIntVar()) {
858 if (!ce[2]->isIntVar()) {
859 count(s, iv, ce[1]->getInt(),
IRT_EQ, ce[2]->getInt(),
862 count(s, iv, ce[1]->getInt(),
IRT_EQ, s.arg2IntVar(ce[2]),
865 }
else if (!ce[2]->isIntVar()) {
866 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, ce[2]->getInt(),
869 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, s.arg2IntVar(ce[2]),
874 void p_count_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
875 IntVarArgs iv = s.arg2intvarargs(ce[0]);
876 IntVar
x = s.arg2IntVar(ce[1]);
877 IntVar y = s.arg2IntVar(ce[2]);
878 BoolVar
b = s.arg2BoolVar(ce[3]);
883 void p_count_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
884 IntVarArgs iv = s.arg2intvarargs(ce[0]);
885 IntVar
x = s.arg2IntVar(ce[1]);
886 IntVar y = s.arg2IntVar(ce[2]);
887 BoolVar
b = s.arg2BoolVar(ce[3]);
894 FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
895 IntVarArgs iv = s.arg2intvarargs(ce[1]);
896 count(s, iv, ce[2]->getInt(), irt, ce[0]->getInt(), s.ann2ipl(ann));
899 void p_at_most(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
900 count_rel(
IRT_LQ, s, ce, ann);
903 void p_at_least(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
904 count_rel(
IRT_GQ, s, ce, ann);
907 void p_bin_packing_load(FlatZincSpace& s,
const ConExpr& ce,
909 int minIdx = ce[3]->getInt();
910 IntVarArgs load = s.arg2intvarargs(ce[0]);
912 IntVarArgs bin = s.arg2intvarargs(ce[1]);
913 for (
int i=bin.
size();
i--;)
914 rel(s, bin[
i] >= minIdx);
916 for (
int i=minIdx;
i--;)
918 }
else if (minIdx < 0) {
919 IntVarArgs bin2(bin.size());
920 for (
int i=bin.
size();
i--;)
921 bin2[
i] =
expr(s, bin[
i]-minIdx, s.ann2ipl(ann));
925 IntArgs sizes = s.arg2intargs(ce[2]);
927 IntVarArgs allvars = l + bin;
929 binpacking(s, allvars.slice(0,1,l.size()), allvars.slice(l.size(),1,bin.size()),
930 sizes, s.ann2ipl(ann));
933 void p_global_cardinality(FlatZincSpace& s,
const ConExpr& ce,
935 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
936 IntArgs cover = s.arg2intargs(ce[1]);
937 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
940 IntSet cover_s(cover);
941 IntSetRanges cover_r(cover_s);
942 IntVarRanges* iv0_ri = re.alloc<IntVarRanges>(iv0.size());
943 for (
int i=iv0.
size();
i--;)
944 iv0_ri[
i] = IntVarRanges(iv0[
i]);
945 Iter::Ranges::NaryUnion iv0_r(re,iv0_ri,iv0.size());
946 Iter::Ranges::Diff<Iter::Ranges::NaryUnion,IntSetRanges>
947 extra_r(iv0_r,cover_r);
948 Iter::Ranges::ToValues<Iter::Ranges::Diff<
949 Iter::Ranges::NaryUnion,IntSetRanges> > extra(extra_r);
950 for (; extra(); ++extra) {
951 cover << extra.val();
952 iv1 << IntVar(s,0,iv0.size());
958 IntVarArgs allvars = iv0+iv1;
960 count(s, allvars.slice(0,1,iv0.size()),
961 allvars.slice(iv0.size(),1,iv1.size()),
965 count(s, iv0, iv1, cover, ipl);
969 void p_global_cardinality_closed(FlatZincSpace& s,
const ConExpr& ce,
971 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
972 IntArgs cover = s.arg2intargs(ce[1]);
973 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
975 count(s, iv0, iv1, cover, s.ann2ipl(ann));
978 void p_global_cardinality_low_up(FlatZincSpace& s,
const ConExpr& ce,
980 IntVarArgs
x = s.arg2intvarargs(ce[0]);
981 IntArgs cover = s.arg2intargs(ce[1]);
983 IntArgs lbound = s.arg2intargs(ce[2]);
984 IntArgs ubound = s.arg2intargs(ce[3]);
986 for (
int i=cover.
size();
i--;)
987 y[
i] = IntSet(lbound[
i],ubound[i]);
989 IntSet cover_s(cover);
991 IntVarRanges* xrs = re.alloc<IntVarRanges>(x.size());
992 for (
int i=x.size(); i--;)
994 Iter::Ranges::NaryUnion
u(re, xrs, x.size());
995 Iter::Ranges::ToValues<Iter::Ranges::NaryUnion> uv(
u);
997 if (!cover_s.in(uv.val())) {
999 y << IntSet(0,x.size());
1003 count(s, x, y, cover, s.ann2ipl(ann));
1006 void p_global_cardinality_low_up_closed(FlatZincSpace& s,
1009 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1010 IntArgs cover = s.arg2intargs(ce[1]);
1012 IntArgs lbound = s.arg2intargs(ce[2]);
1013 IntArgs ubound = s.arg2intargs(ce[3]);
1015 for (
int i=cover.
size();
i--;)
1016 y[
i] = IntSet(lbound[
i],ubound[i]);
1018 count(s, x, y, cover, s.ann2ipl(ann));
1021 void p_minimum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1022 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1023 min(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
1026 void p_maximum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1027 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1028 max(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
1031 void p_minimum_arg(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1032 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1033 argmin(s, iv, s.arg2IntVar(ce[1]),
true, s.ann2ipl(ann));
1036 void p_maximum_arg(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1037 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1038 argmax(s, iv, s.arg2IntVar(ce[1]),
true, s.ann2ipl(ann));
1041 void p_regular(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1042 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1043 int q = ce[1]->getInt();
1044 int symbols = ce[2]->getInt();
1045 IntArgs
d = s.arg2intargs(ce[3]);
1046 int q0 = ce[4]->getInt();
1049 for (
int i=1;
i<=q;
i++) {
1050 for (
int j=1; j<=symbols; j++) {
1051 if (d[(
i-1)*symbols+(j-1)] > 0)
1057 DFA::Transition*
t = re.alloc<DFA::Transition>(noOfTrans+1);
1059 for (
int i=1;
i<=q;
i++) {
1060 for (
int j=1; j<=symbols; j++) {
1061 if (d[(
i-1)*symbols+(j-1)] > 0) {
1062 t[noOfTrans].i_state =
i;
1063 t[noOfTrans].symbol = j;
1064 t[noOfTrans].o_state = d[(
i-1)*symbols+(j-1)];
1069 t[noOfTrans].i_state = -1;
1072 AST::SetLit* sl = ce[5]->getSet();
1075 f =
static_cast<int*
>(malloc(
sizeof(
int)*(sl->max-sl->min+2)));
1076 for (
int i=sl->min; i<=sl->
max;
i++)
1078 f[sl->max-sl->min+1] = -1;
1080 f =
static_cast<int*
>(malloc(
sizeof(
int)*(sl->s.size()+1)));
1081 for (
int j=sl->s.size(); j--; )
1083 f[sl->s.size()] = -1;
1093 p_sort(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1094 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1095 IntVarArgs y = s.arg2intvarargs(ce[1]);
1096 IntVarArgs xy(x.size()+y.size());
1097 for (
int i=x.
size();
i--;)
1099 for (
int i=y.
size();
i--;)
1102 for (
int i=x.
size();
i--;)
1104 for (
int i=y.
size();
i--;)
1106 sorted(s, x, y, s.ann2ipl(ann));
1110 p_inverse_offsets(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1111 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1113 int xoff = ce[1]->getInt();
1114 IntVarArgs y = s.arg2intvarargs(ce[2]);
1116 int yoff = ce[3]->getInt();
1117 channel(s, x, xoff, y, yoff, s.ann2ipl(ann));
1121 p_increasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1122 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1127 p_increasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1128 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1133 p_decreasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1134 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1139 p_decreasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1140 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1145 p_table_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1146 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1147 IntArgs tuples = s.arg2intargs(ce[1]);
1148 int noOfVars = x.size();
1149 int noOfTuples = tuples.size() == 0 ? 0 : (tuples.size()/noOfVars);
1151 for (
int i=0;
i<noOfTuples;
i++) {
1152 IntArgs
t(noOfVars);
1153 for (
int j=0; j<x.size(); j++) {
1154 t[j] = tuples[
i*noOfVars+j];
1162 p_table_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1163 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1164 IntArgs tuples = s.arg2boolargs(ce[1]);
1165 int noOfVars = x.size();
1166 int noOfTuples = tuples.size() == 0 ? 0 : (tuples.size()/noOfVars);
1168 for (
int i=0;
i<noOfTuples;
i++) {
1169 IntArgs
t(noOfVars);
1170 for (
int j=0; j<x.size(); j++) {
1171 t[j] = tuples[
i*noOfVars+j];
1179 void p_cumulative_opt(FlatZincSpace& s,
const ConExpr& ce,
1181 IntVarArgs start = s.arg2intvarargs(ce[0]);
1182 IntArgs duration = s.arg2intargs(ce[1]);
1183 IntArgs height = s.arg2intargs(ce[2]);
1184 BoolVarArgs
opt = s.arg2boolvarargs(ce[3]);
1185 int bound = ce[4]->getInt();
1187 cumulative(s,bound,start,duration,height,opt,s.ann2ipl(ann));
1190 void p_cumulatives(FlatZincSpace& s,
const ConExpr& ce,
1192 IntVarArgs start = s.arg2intvarargs(ce[0]);
1193 IntVarArgs duration = s.arg2intvarargs(ce[1]);
1194 IntVarArgs height = s.arg2intvarargs(ce[2]);
1195 int n = start.size();
1196 IntVar bound = s.arg2IntVar(ce[3]);
1202 rel(s, height[0] <= bound);
1208 for (
int i=2;
i<
n;
i++) {
1209 if (height[
i].
min() < minHeight) {
1210 minHeight2 = minHeight;
1211 minHeight = height[
i].min();
1212 }
else if (height[
i].
min() < minHeight2) {
1213 minHeight2 = height[
i].min();
1217 (minHeight > bound.max()/2) ||
1218 (minHeight2 > bound.max()/2 && minHeight+minHeight2>bound.max());
1220 rel(s, bound >=
max(height));
1222 if (duration.assigned()) {
1223 IntArgs durationI(n);
1225 durationI[
i] = duration[
i].val();
1227 unary(s,start,durationI);
1231 end[
i] =
expr(s,start[
i]+duration[
i]);
1233 unary(s,start,duration,end);
1235 }
else if (height.assigned()) {
1238 heightI[
i] = height[
i].val();
1239 if (duration.assigned()) {
1240 IntArgs durationI(n);
1242 durationI[
i] = duration[
i].val();
1243 cumulative(s, bound, start, durationI, heightI);
1246 for (
int i = n;
i--; )
1247 end[
i] =
expr(s,start[
i]+duration[
i]);
1248 cumulative(s, bound, start, duration, end, heightI);
1250 }
else if (bound.assigned()) {
1252 IntArgs limit(1, bound.val());
1255 end[
i] =
expr(s,start[
i]+duration[
i]);
1256 cumulatives(s, machine, start, duration, end, height, limit,
true,
1261 IntVarArgs end(start.size());
1262 for (
int i = start.
size();
i--; ) {
1265 end[
i] =
expr(s, start[
i] + duration[
i]);
1267 for (
int time = min; time <
max; ++time) {
1268 IntVarArgs
x(start.size());
1269 for (
int i = start.
size();
i--; ) {
1270 IntVar overlaps =
channel(s,
expr(s, (start[
i] <= time) &&
1272 x[
i] =
expr(s, overlaps * height[i]);
1279 void p_among_seq_int(FlatZincSpace& s,
const ConExpr& ce,
1281 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1282 IntSet S = s.arg2intset(ce[1]);
1283 int q = ce[2]->getInt();
1284 int l = ce[3]->getInt();
1285 int u = ce[4]->getInt();
1287 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1290 void p_among_seq_bool(FlatZincSpace& s,
const ConExpr& ce,
1292 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1293 bool val = ce[1]->getBool();
1294 int q = ce[2]->getInt();
1295 int l = ce[3]->getInt();
1296 int u = ce[4]->getInt();
1299 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1302 void p_schedule_unary(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1303 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1304 IntArgs
p = s.arg2intargs(ce[1]);
1309 void p_schedule_unary_optional(FlatZincSpace& s,
const ConExpr& ce,
1311 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1312 IntArgs
p = s.arg2intargs(ce[1]);
1313 BoolVarArgs m = s.arg2boolvarargs(ce[2]);
1318 void p_circuit(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1319 int off = ce[0]->getInt();
1320 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1322 circuit(s,off,xv,s.ann2ipl(ann));
1324 void p_circuit_cost_array(FlatZincSpace& s,
const ConExpr& ce,
1326 IntArgs
c = s.arg2intargs(ce[0]);
1327 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1328 IntVarArgs yv = s.arg2intvarargs(ce[2]);
1329 IntVar z = s.arg2IntVar(ce[3]);
1331 circuit(s,c,xv,yv,z,s.ann2ipl(ann));
1333 void p_circuit_cost(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1334 IntArgs
c = s.arg2intargs(ce[0]);
1335 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1336 IntVar z = s.arg2IntVar(ce[2]);
1338 circuit(s,c,xv,z,s.ann2ipl(ann));
1341 void p_nooverlap(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1342 IntVarArgs x0 = s.arg2intvarargs(ce[0]);
1343 IntVarArgs w = s.arg2intvarargs(ce[1]);
1344 IntVarArgs y0 = s.arg2intvarargs(ce[2]);
1345 IntVarArgs h = s.arg2intvarargs(ce[3]);
1346 if (w.assigned() && h.assigned()) {
1347 IntArgs iw(w.size());
1348 for (
int i=w.
size();
i--;)
1350 IntArgs ih(h.size());
1351 for (
int i=h.
size();
i--;)
1353 nooverlap(s,x0,iw,y0,ih,s.ann2ipl(ann));
1355 int miny = y0[0].min();
1356 int maxy = y0[0].max();
1358 for (
int i=1;
i<y0.
size();
i++) {
1363 int minx = x0[0].min();
1364 int maxx = x0[0].max();
1366 for (
int i=1;
i<x0.
size();
i++) {
1376 IntVarArgs x1(x0.size()), y1(y0.size());
1377 for (
int i=x0.
size();
i--; )
1378 x1[
i] =
expr(s, x0[
i] + w[
i]);
1379 for (
int i=y0.size(); i--; )
1380 y1[i] =
expr(s, y0[i] + h[i]);
1381 nooverlap(s,x0,w,x1,y0,h,y1,s.ann2ipl(ann));
1385 void p_precede(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1386 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1387 int p_s = ce[1]->getInt();
1388 int p_t = ce[2]->getInt();
1389 precede(s,x,p_s,p_t,s.ann2ipl(ann));
1392 void p_nvalue(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1393 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1394 if (ce[0]->isIntVar()) {
1395 IntVar y = s.arg2IntVar(ce[0]);
1402 void p_among(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1403 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1404 IntSet
v = s.arg2intset(ce[2]);
1405 if (ce[0]->isIntVar()) {
1406 IntVar
n = s.arg2IntVar(ce[0]);
1411 count(s,x,v,
IRT_EQ,ce[0]->getInt(),s.ann2ipl(ann));
1415 void p_member_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1416 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1417 IntVar y = s.arg2IntVar(ce[1]);
1418 member(s,x,y,s.ann2ipl(ann));
1420 void p_member_int_reif(FlatZincSpace& s,
const ConExpr& ce,
1422 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1423 IntVar y = s.arg2IntVar(ce[1]);
1424 BoolVar
b = s.arg2BoolVar(ce[2]);
1425 member(s,x,y,b,s.ann2ipl(ann));
1427 void p_member_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1428 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1429 BoolVar y = s.arg2BoolVar(ce[1]);
1430 member(s,x,y,s.ann2ipl(ann));
1432 void p_member_bool_reif(FlatZincSpace& s,
const ConExpr& ce,
1434 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1435 BoolVar y = s.arg2BoolVar(ce[1]);
1436 member(s,x,y,s.arg2BoolVar(ce[2]),s.ann2ipl(ann));
1443 registry().
add(
"all_different_offset", &p_distinctOffset);
1464 registry().
add(
"int_lin_eq_reif", &p_int_lin_eq_reif);
1465 registry().
add(
"int_lin_eq_imp", &p_int_lin_eq_imp);
1467 registry().
add(
"int_lin_ne_reif", &p_int_lin_ne_reif);
1468 registry().
add(
"int_lin_ne_imp", &p_int_lin_ne_imp);
1470 registry().
add(
"int_lin_le_reif", &p_int_lin_le_reif);
1471 registry().
add(
"int_lin_le_imp", &p_int_lin_le_imp);
1473 registry().
add(
"int_lin_lt_reif", &p_int_lin_lt_reif);
1474 registry().
add(
"int_lin_lt_imp", &p_int_lin_lt_imp);
1476 registry().
add(
"int_lin_ge_reif", &p_int_lin_ge_reif);
1477 registry().
add(
"int_lin_ge_imp", &p_int_lin_ge_imp);
1479 registry().
add(
"int_lin_gt_reif", &p_int_lin_gt_reif);
1480 registry().
add(
"int_lin_gt_imp", &p_int_lin_gt_imp);
1514 registry().
add(
"array_bool_and", &p_array_bool_and);
1515 registry().
add(
"array_bool_and_imp", &p_array_bool_and_imp);
1516 registry().
add(
"array_bool_or", &p_array_bool_or);
1517 registry().
add(
"array_bool_or_imp", &p_array_bool_or_imp);
1518 registry().
add(
"array_bool_xor", &p_array_bool_xor);
1519 registry().
add(
"array_bool_xor_imp", &p_array_bool_xor_imp);
1520 registry().
add(
"bool_clause", &p_array_bool_clause);
1521 registry().
add(
"bool_clause_reif", &p_array_bool_clause_reif);
1522 registry().
add(
"bool_clause_imp", &p_array_bool_clause_imp);
1526 registry().
add(
"array_int_element", &p_array_int_element);
1527 registry().
add(
"array_var_int_element", &p_array_int_element);
1528 registry().
add(
"array_bool_element", &p_array_bool_element);
1529 registry().
add(
"array_var_bool_element", &p_array_bool_element);
1534 #ifndef GECODE_HAS_SET_VARS 1542 registry().
add(
"array_bool_lt", &p_array_bool_lt);
1543 registry().
add(
"array_bool_lq", &p_array_bool_lq);
1549 registry().
add(
"gecode_bin_packing_load", &p_bin_packing_load);
1550 registry().
add(
"global_cardinality", &p_global_cardinality);
1552 &p_global_cardinality_closed);
1554 &p_global_cardinality_low_up);
1555 registry().
add(
"global_cardinality_low_up_closed",
1556 &p_global_cardinality_low_up_closed);
1559 registry().
add(
"gecode_minimum_arg_int", &p_minimum_arg);
1560 registry().
add(
"gecode_maximum_arg_int", &p_maximum_arg);
1564 registry().
add(
"inverse_offsets", &p_inverse_offsets);
1565 registry().
add(
"increasing_int", &p_increasing_int);
1566 registry().
add(
"increasing_bool", &p_increasing_bool);
1567 registry().
add(
"decreasing_int", &p_decreasing_int);
1568 registry().
add(
"decreasing_bool", &p_decreasing_bool);
1572 registry().
add(
"gecode_among_seq_int", &p_among_seq_int);
1573 registry().
add(
"gecode_among_seq_bool", &p_among_seq_bool);
1582 registry().
add(
"bool_lin_eq_reif", &p_bool_lin_eq_reif);
1583 registry().
add(
"bool_lin_eq_imp", &p_bool_lin_eq_imp);
1584 registry().
add(
"bool_lin_ne_reif", &p_bool_lin_ne_reif);
1585 registry().
add(
"bool_lin_ne_imp", &p_bool_lin_ne_imp);
1586 registry().
add(
"bool_lin_le_reif", &p_bool_lin_le_reif);
1587 registry().
add(
"bool_lin_le_imp", &p_bool_lin_le_imp);
1588 registry().
add(
"bool_lin_lt_reif", &p_bool_lin_lt_reif);
1589 registry().
add(
"bool_lin_lt_imp", &p_bool_lin_lt_imp);
1590 registry().
add(
"bool_lin_ge_reif", &p_bool_lin_ge_reif);
1591 registry().
add(
"bool_lin_ge_imp", &p_bool_lin_ge_imp);
1592 registry().
add(
"bool_lin_gt_reif", &p_bool_lin_gt_reif);
1593 registry().
add(
"bool_lin_gt_imp", &p_bool_lin_gt_imp);
1595 registry().
add(
"gecode_schedule_unary", &p_schedule_unary);
1596 registry().
add(
"gecode_schedule_unary_optional", &p_schedule_unary_optional);
1597 registry().
add(
"gecode_schedule_cumulative_optional", &p_cumulative_opt);
1600 registry().
add(
"gecode_circuit_cost_array", &p_circuit_cost_array);
1601 registry().
add(
"gecode_circuit_cost", &p_circuit_cost);
1607 registry().
add(
"gecode_member_int_reif",&p_member_int_reif);
1609 registry().
add(
"gecode_member_bool_reif",&p_member_bool_reif);
1612 IntPoster __int_poster;
1614 #ifdef GECODE_HAS_SET_VARS 1615 void p_set_OP(FlatZincSpace& s,
SetOpType op,
1616 const ConExpr& ce, AST::Node *) {
1617 rel(s, s.arg2SetVar(ce[0]), op, s.arg2SetVar(ce[1]),
1618 SRT_EQ, s.arg2SetVar(ce[2]));
1620 void p_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1623 void p_set_intersect(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1626 void p_set_diff(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1630 void p_set_symdiff(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1631 SetVar
x = s.arg2SetVar(ce[0]);
1632 SetVar y = s.arg2SetVar(ce[1]);
1634 SetVarLubRanges xub(x);
1639 SetVarLubRanges yub(y);
1647 void p_array_set_OP(FlatZincSpace& s,
SetOpType op,
1648 const ConExpr& ce, AST::Node *) {
1649 SetVarArgs xs = s.arg2setvarargs(ce[0]);
1650 rel(s, op, xs, s.arg2SetVar(ce[1]));
1652 void p_array_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1655 void p_array_set_partition(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1660 void p_set_rel(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1661 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]));
1664 void p_set_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1665 p_set_rel(s,
SRT_EQ, ce);
1667 void p_set_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1668 p_set_rel(s,
SRT_NQ, ce);
1670 void p_set_subset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1673 void p_set_superset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1676 void p_set_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1677 p_set_rel(s,
SRT_LQ, ce);
1679 void p_set_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1680 p_set_rel(s,
SRT_LE, ce);
1682 void p_set_card(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1683 if (!ce[1]->isIntVar()) {
1684 cardinality(s, s.arg2SetVar(ce[0]), ce[1]->getInt(),
1687 cardinality(s, s.arg2SetVar(ce[0]), s.arg2IntVar(ce[1]));
1690 void p_set_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1691 if (!ce[1]->isSetVar()) {
1692 IntSet
d = s.arg2intset(ce[1]);
1693 if (ce[0]->isBoolVar()) {
1695 Iter::Ranges::Singleton sr(0,1);
1696 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
1698 if (d01.size() == 0) {
1701 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
1702 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
1705 dom(s, s.arg2IntVar(ce[0]),
d);
1708 if (!ce[0]->isIntVar()) {
1709 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt());
1711 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]));
1715 void p_set_rel_reif(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1716 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]),
1717 s.arg2BoolVar(ce[2]));
1720 void p_set_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1721 p_set_rel_reif(s,
SRT_EQ,ce);
1723 void p_set_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1724 p_set_rel_reif(s,
SRT_LQ,ce);
1726 void p_set_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1727 p_set_rel_reif(s,
SRT_LE,ce);
1729 void p_set_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1730 p_set_rel_reif(s,
SRT_NQ,ce);
1732 void p_set_subset_reif(FlatZincSpace& s,
const ConExpr& ce,
1736 void p_set_superset_reif(FlatZincSpace& s,
const ConExpr& ce,
1740 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann,
ReifyMode rm) {
1741 if (!ce[1]->isSetVar()) {
1743 p_int_in_reif(s,ce,ann);
1746 p_int_in_imp(s,ce,ann);
1749 if (!ce[0]->isIntVar()) {
1750 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt(),
1751 Reify(s.arg2BoolVar(ce[2]),rm));
1753 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]),
1754 Reify(s.arg2BoolVar(ce[2]),rm));
1758 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1759 p_set_in_reif(s,ce,ann,
RM_EQV);
1761 void p_set_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1762 p_set_in_reif(s,ce,ann,
RM_IMP);
1764 void p_set_disjoint(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1765 rel(s, s.arg2SetVar(ce[0]),
SRT_DISJ, s.arg2SetVar(ce[1]));
1768 void p_link_set_to_booleans(FlatZincSpace& s,
const ConExpr& ce,
1770 SetVar
x = s.arg2SetVar(ce[0]);
1771 int idx = ce[2]->getInt();
1774 BoolVarArgs y = s.arg2boolvarargs(ce[1],idx);
1779 void p_array_set_element(FlatZincSpace& s,
const ConExpr& ce,
1781 bool isConstant =
true;
1782 AST::Array*
a = ce[1]->getArray();
1783 for (
int i=a->
a.size();
i--;) {
1784 if (a->a[
i]->isSetVar()) {
1789 IntVar selector = s.arg2IntVar(ce[0]);
1790 rel(s, selector > 0);
1793 element(s, sv, selector, s.arg2SetVar(ce[2]));
1795 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1796 element(s, sv, selector, s.arg2SetVar(ce[2]));
1800 void p_array_set_element_op(FlatZincSpace& s,
const ConExpr& ce,
1802 const IntSet& universe =
1804 bool isConstant =
true;
1805 AST::Array*
a = ce[1]->getArray();
1806 for (
int i=a->
a.size();
i--;) {
1807 if (a->a[
i]->isSetVar()) {
1812 SetVar selector = s.arg2SetVar(ce[0]);
1816 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1818 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1819 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1823 void p_array_set_element_union(FlatZincSpace& s,
const ConExpr& ce,
1825 p_array_set_element_op(s, ce, ann,
SOT_UNION);
1828 void p_array_set_element_intersect(FlatZincSpace& s,
const ConExpr& ce,
1830 p_array_set_element_op(s, ce, ann,
SOT_INTER);
1833 void p_array_set_element_intersect_in(FlatZincSpace& s,
1836 IntSet
d = s.arg2intset(ce[3]);
1837 p_array_set_element_op(s, ce, ann,
SOT_INTER, d);
1840 void p_array_set_element_partition(FlatZincSpace& s,
const ConExpr& ce,
1842 p_array_set_element_op(s, ce, ann,
SOT_DUNION);
1845 void p_set_convex(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1846 convex(s, s.arg2SetVar(ce[0]));
1849 void p_array_set_seq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1850 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1854 void p_array_set_seq_union(FlatZincSpace& s,
const ConExpr& ce,
1856 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1857 sequence(s, sv, s.arg2SetVar(ce[1]));
1860 void p_int_set_channel(FlatZincSpace& s,
const ConExpr& ce,
1862 int xoff=ce[1]->getInt();
1864 int yoff=ce[3]->getInt();
1866 IntVarArgs xv = s.arg2intvarargs(ce[0], xoff);
1867 SetVarArgs yv = s.arg2setvarargs(ce[2], yoff, 1, IntSet(0, xoff-1));
1868 IntSet xd(yoff,yv.size()-1);
1869 for (
int i=xoff;
i<xv.
size();
i++) {
1872 IntSet yd(xoff,xv.size()-1);
1873 for (
int i=yoff;
i<yv.
size();
i++) {
1879 void p_range(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1880 int xoff=ce[1]->getInt();
1882 IntVarArgs xv = s.arg2intvarargs(ce[0],xoff);
1886 void p_weights(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1887 IntArgs e = s.arg2intargs(ce[0]);
1888 IntArgs w = s.arg2intargs(ce[1]);
1889 SetVar
x = s.arg2SetVar(ce[2]);
1890 IntVar y = s.arg2IntVar(ce[3]);
1894 void p_inverse_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1895 int xoff = ce[2]->getInt();
1896 int yoff = ce[3]->getInt();
1897 SetVarArgs
x = s.arg2setvarargs(ce[0],xoff);
1898 SetVarArgs y = s.arg2setvarargs(ce[1],yoff);
1902 void p_precede_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1903 SetVarArgs
x = s.arg2setvarargs(ce[0]);
1904 int p_s = ce[1]->getInt();
1905 int p_t = ce[2]->getInt();
1918 registry().
add(
"array_set_element", &p_array_set_element);
1919 registry().
add(
"array_var_set_element", &p_array_set_element);
1920 registry().
add(
"set_intersect", &p_set_intersect);
1932 registry().
add(
"set_subset_reif", &p_set_subset_reif);
1933 registry().
add(
"set_superset_reif", &p_set_superset_reif);
1938 &p_link_set_to_booleans);
1940 registry().
add(
"array_set_union", &p_array_set_union);
1941 registry().
add(
"array_set_partition", &p_array_set_partition);
1943 registry().
add(
"array_set_seq", &p_array_set_seq);
1944 registry().
add(
"array_set_seq_union", &p_array_set_seq_union);
1946 &p_array_set_element_union);
1947 registry().
add(
"gecode_array_set_element_intersect",
1948 &p_array_set_element_intersect);
1949 registry().
add(
"gecode_array_set_element_intersect_in",
1950 &p_array_set_element_intersect_in);
1951 registry().
add(
"gecode_array_set_element_partition",
1952 &p_array_set_element_partition);
1954 &p_int_set_channel);
1959 registry().
add(
"gecode_inverse_set", &p_inverse_set);
1960 registry().
add(
"gecode_precede_set", &p_precede_set);
1963 SetPoster __set_poster;
1966 #ifdef GECODE_HAS_FLOAT_VARS 1968 void p_int2float(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1969 IntVar x0 = s.arg2IntVar(ce[0]);
1970 FloatVar x1 = s.arg2FloatVar(ce[1]);
1974 void p_float_lin_cmp(FlatZincSpace& s,
FloatRelType frt,
1975 const ConExpr& ce, AST::Node*) {
1976 FloatValArgs fa = s.arg2floatargs(ce[0]);
1977 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1978 linear(s, fa, fv, frt, ce[2]->getFloat());
1980 void p_float_lin_cmp_reif(FlatZincSpace& s,
FloatRelType frt,
1981 const ConExpr& ce, AST::Node*) {
1982 FloatValArgs fa = s.arg2floatargs(ce[0]);
1983 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1984 linear(s, fa, fv, frt, ce[2]->getFloat(), s.arg2BoolVar(ce[3]));
1986 void p_float_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1987 p_float_lin_cmp(s,
FRT_EQ,ce,ann);
1989 void p_float_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce,
1991 p_float_lin_cmp_reif(s,
FRT_EQ,ce,ann);
1993 void p_float_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1994 p_float_lin_cmp(s,
FRT_LQ,ce,ann);
1996 void p_float_lin_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1997 p_float_lin_cmp(s,
FRT_LE,ce,ann);
1999 void p_float_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce,
2001 p_float_lin_cmp_reif(s,
FRT_LQ,ce,ann);
2003 void p_float_lin_lt_reif(FlatZincSpace& s,
const ConExpr& ce,
2005 p_float_lin_cmp_reif(s,
FRT_LE,ce,ann);
2008 void p_float_times(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2009 FloatVar
x = s.arg2FloatVar(ce[0]);
2010 FloatVar y = s.arg2FloatVar(ce[1]);
2011 FloatVar z = s.arg2FloatVar(ce[2]);
2015 void p_float_div(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2016 FloatVar
x = s.arg2FloatVar(ce[0]);
2017 FloatVar y = s.arg2FloatVar(ce[1]);
2018 FloatVar z = s.arg2FloatVar(ce[2]);
2022 void p_float_plus(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2023 FloatVar
x = s.arg2FloatVar(ce[0]);
2024 FloatVar y = s.arg2FloatVar(ce[1]);
2025 FloatVar z = s.arg2FloatVar(ce[2]);
2029 void p_float_sqrt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2030 FloatVar
x = s.arg2FloatVar(ce[0]);
2031 FloatVar y = s.arg2FloatVar(ce[1]);
2035 void p_float_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2036 FloatVar
x = s.arg2FloatVar(ce[0]);
2037 FloatVar y = s.arg2FloatVar(ce[1]);
2041 void p_float_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2042 FloatVar
x = s.arg2FloatVar(ce[0]);
2043 FloatVar y = s.arg2FloatVar(ce[1]);
2046 void p_float_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2047 FloatVar
x = s.arg2FloatVar(ce[0]);
2048 FloatVar y = s.arg2FloatVar(ce[1]);
2049 BoolVar
b = s.arg2BoolVar(ce[2]);
2052 void p_float_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2053 FloatVar
x = s.arg2FloatVar(ce[0]);
2054 FloatVar y = s.arg2FloatVar(ce[1]);
2057 void p_float_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2058 FloatVar
x = s.arg2FloatVar(ce[0]);
2059 FloatVar y = s.arg2FloatVar(ce[1]);
2060 BoolVar
b = s.arg2BoolVar(ce[2]);
2063 void p_float_max(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2064 FloatVar
x = s.arg2FloatVar(ce[0]);
2065 FloatVar y = s.arg2FloatVar(ce[1]);
2066 FloatVar z = s.arg2FloatVar(ce[2]);
2069 void p_float_min(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2070 FloatVar
x = s.arg2FloatVar(ce[0]);
2071 FloatVar y = s.arg2FloatVar(ce[1]);
2072 FloatVar z = s.arg2FloatVar(ce[2]);
2075 void p_float_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2076 FloatVar
x = s.arg2FloatVar(ce[0]);
2077 FloatVar y = s.arg2FloatVar(ce[1]);
2082 void p_float_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2083 FloatVar
x = s.arg2FloatVar(ce[0]);
2084 FloatVar y = s.arg2FloatVar(ce[1]);
2085 BoolVar
b = s.arg2BoolVar(ce[2]);
2088 rel(s, b == (b0 && !b1));
2093 void p_float_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2094 FloatVar
x = s.arg2FloatVar(ce[0]);
2095 FloatVar y = s.arg2FloatVar(ce[1]);
2099 #ifdef GECODE_HAS_MPFR 2100 #define P_FLOAT_OP(Op) \ 2101 void p_float_ ## Op (FlatZincSpace& s, const ConExpr& ce, AST::Node*) {\ 2102 FloatVar x = s.arg2FloatVar(ce[0]);\ 2103 FloatVar y = s.arg2FloatVar(ce[1]);\ 2118 void p_float_ln(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2119 FloatVar
x = s.arg2FloatVar(ce[0]);
2120 FloatVar y = s.arg2FloatVar(ce[1]);
2123 void p_float_log10(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2124 FloatVar
x = s.arg2FloatVar(ce[0]);
2125 FloatVar y = s.arg2FloatVar(ce[1]);
2128 void p_float_log2(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2129 FloatVar
x = s.arg2FloatVar(ce[0]);
2130 FloatVar y = s.arg2FloatVar(ce[1]);
2156 registry().
add(
"float_lin_eq_reif",&p_float_lin_eq_reif);
2159 registry().
add(
"float_lin_le_reif",&p_float_lin_le_reif);
2160 registry().
add(
"float_lin_lt_reif",&p_float_lin_lt_reif);
2162 #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 .
SetRelType
Common relation types for sets.
void mult(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
void linear(Home home, const FloatVarArgs &x, FloatRelType frt, FloatNum c)
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 member(Home home, const IntVarArgs &x, IntVar y, IntPropLevel)
Post domain consistent propagator for .
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
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)
struct Gecode::@554::NNF::@60::@62 a
For atomic nodes.
int p
Number of positive literals for node type.
const FloatNum min
Smallest allowed float value.
Gecode::IntArgs i(4, 1, 2, 3, 4)
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 .
union Gecode::@554::NNF::@60 u
Union depending on nodetype t.
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 .
IntVarArgs arg2intvarargs(AST::Node *arg, int offset=0)
Convert arg to IntVarArgs.
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)
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.
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.
void div(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Node * x
Pointer to corresponding Boolean expression node.
void tan(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void(* poster)(FlatZincSpace &, const ConExpr &, AST::Node *)
Type of constraint posting function.
void convex(Home home, SetVar x)
Post propagator that propagates that x is convex.
void precede(Home home, const IntVarArgs &x, int s, int t, IntPropLevel)
Post propagator that s precedes t in x.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
Exception class for FlatZinc errors
Domain propagation Preferences: prefer speed or memory.
void weights(Home home, IntSharedArray elements, IntSharedArray weights, SetVar x, IntVar y)
Post propagator for .
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
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.
struct Gecode::@554::NNF::@60::@61 b
For binary nodes (and, or, eqv)
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.
bool neg
Is atomic formula negative.
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)
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.