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);
91 for (
int i=offs->
a.size();
i--; ) {
92 oa[
i] = offs->
a[
i]->getInt();
105 if (ce[0]->isIntVar()) {
106 if (ce[1]->isIntVar()) {
118 p_int_CMP(s,
IRT_EQ, ce, ann);
121 p_int_CMP(s,
IRT_NQ, ce, ann);
124 p_int_CMP(s,
IRT_GQ, ce, ann);
127 p_int_CMP(s,
IRT_GR, ce, ann);
130 p_int_CMP(s,
IRT_LQ, ce, ann);
133 p_int_CMP(s,
IRT_LE, ce, ann);
137 if (rm ==
RM_EQV && ce[2]->isBool()) {
138 if (ce[2]->getBool()) {
139 p_int_CMP(s, irt, ce, ann);
141 p_int_CMP(s,
neg(irt), ce, ann);
145 if (ce[0]->isIntVar()) {
146 if (ce[1]->isIntVar()) {
204 if (singleIntVar != -1) {
205 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
210 for (
int i=0;
i<ia.
size();
i++) {
211 if (
i != singleIntVar)
212 ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
231 if (rm ==
RM_EQV && ce[2]->isBool()) {
232 if (ce[2]->getBool()) {
233 p_int_lin_CMP(s, irt, ce, ann);
235 p_int_lin_CMP(s,
neg(irt), ce, ann);
242 if (singleIntVar != -1) {
243 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
248 for (
int i=0;
i<ia.
size();
i++) {
249 if (
i != singleIntVar)
250 ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
257 linear(s, ia, iv, irt, ce[2]->getInt(),
262 linear(s, ia, iv, irt, ce[2]->getInt(),
267 linear(s, ia, iv, irt, ce[2]->getInt(),
273 p_int_lin_CMP(s,
IRT_EQ, ce, ann);
282 p_int_lin_CMP(s,
IRT_NQ, ce, ann);
291 p_int_lin_CMP(s,
IRT_LQ, ce, ann);
300 p_int_lin_CMP(s,
IRT_LE, ce, ann);
309 p_int_lin_CMP(s,
IRT_GQ, ce, ann);
318 p_int_lin_CMP(s,
IRT_GR, ce, ann);
331 if (ce[2]->isIntVar())
338 if (rm ==
RM_EQV && ce[2]->isBool()) {
339 if (ce[2]->getBool()) {
340 p_bool_lin_CMP(s, irt, ce, ann);
342 p_bool_lin_CMP(s,
neg(irt), ce, ann);
348 if (ce[2]->isIntVar())
349 linear(s, ia, iv, irt, s.
iv[ce[2]->getIntVar()],
353 linear(s, ia, iv, irt, ce[2]->getInt(),
358 p_bool_lin_CMP(s,
IRT_EQ, ce, ann);
369 p_bool_lin_CMP(s,
IRT_NQ, ce, ann);
380 p_bool_lin_CMP(s,
IRT_LQ, ce, ann);
392 p_bool_lin_CMP(s,
IRT_LE, ce, ann);
403 p_bool_lin_CMP(s,
IRT_GQ, ce, ann);
414 p_bool_lin_CMP(s,
IRT_GR, ce, ann);
428 if (!ce[0]->isIntVar()) {
431 }
else if (!ce[1]->isIntVar()) {
434 }
else if (!ce[2]->isIntVar()) {
436 == ce[2]->getInt(), s.
ann2ipl(ann));
444 if (!ce[0]->isIntVar()) {
447 }
else if (!ce[1]->isIntVar()) {
450 }
else if (!ce[2]->isIntVar()) {
452 == ce[2]->getInt(), s.
ann2ipl(ann));
508 p_bool_CMP(s,
IRT_EQ, ce, ann);
517 p_bool_CMP(s,
IRT_NQ, ce, ann);
526 p_bool_CMP(s,
IRT_GQ, ce, ann);
535 p_bool_CMP(s,
IRT_LQ, ce, ann);
544 p_bool_CMP(s,
IRT_GR, ce, ann);
553 p_bool_CMP(s,
IRT_LE, ce, ann);
562 #define BOOL_OP(op) \ 563 BoolVar b0 = s.arg2BoolVar(ce[0]); \ 564 BoolVar b1 = s.arg2BoolVar(ce[1]); \ 565 if (ce[2]->isBool()) { \ 566 rel(s, b0, op, b1, ce[2]->getBool(), s.ann2ipl(ann)); \ 568 rel(s, b0, op, b1, s.bv[ce[2]->getBoolVar()], s.ann2ipl(ann)); \ 571 #define BOOL_ARRAY_OP(op) \ 572 BoolVarArgs bv = s.arg2boolvarargs(ce[0]); \ 573 if (ce.size()==1) { \ 574 rel(s, op, bv, 1, s.ann2ipl(ann)); \ 575 } else if (ce[1]->isBool()) { \ 576 rel(s, op, bv, ce[1]->getBool(), s.ann2ipl(ann)); \ 578 rel(s, op, bv, s.bv[ce[1]->getBoolVar()], s.ann2ipl(ann)); \ 581 void p_bool_or(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
584 void p_bool_or_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
585 BoolVar b0 = s.arg2BoolVar(ce[0]);
586 BoolVar
b1 = s.arg2BoolVar(ce[1]);
587 BoolVar
b2 = s.arg2BoolVar(ce[2]);
588 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
591 void p_bool_and(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
594 void p_bool_and_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
595 BoolVar b0 = s.arg2BoolVar(ce[0]);
596 BoolVar
b1 = s.arg2BoolVar(ce[1]);
597 BoolVar
b2 = s.arg2BoolVar(ce[2]);
601 void p_array_bool_and(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
605 void p_array_bool_and_imp(FlatZincSpace& s,
const ConExpr& ce,
608 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
609 BoolVar
b1 = s.arg2BoolVar(ce[1]);
610 for (
unsigned int i=bv.
size();
i--;)
613 void p_array_bool_or(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
617 void p_array_bool_or_imp(FlatZincSpace& s,
const ConExpr& ce,
620 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
621 BoolVar
b1 = s.arg2BoolVar(ce[1]);
622 clause(s,
BOT_OR, bv, BoolVarArgs()<<b1, 1, s.ann2ipl(ann));
624 void p_array_bool_xor(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
628 void p_array_bool_xor_imp(FlatZincSpace& s,
const ConExpr& ce,
631 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
634 rel(s, s.arg2BoolVar(ce[1]),
BOT_IMP, tmp, 1);
636 void p_array_bool_clause(FlatZincSpace& s,
const ConExpr& ce,
638 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
639 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
642 void p_array_bool_clause_reif(FlatZincSpace& s,
const ConExpr& ce,
644 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
645 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
646 BoolVar b0 = s.arg2BoolVar(ce[2]);
649 void p_array_bool_clause_imp(FlatZincSpace& s,
const ConExpr& ce,
651 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
652 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
653 BoolVar b0 = s.arg2BoolVar(ce[2]);
656 void p_bool_xor(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
659 void p_bool_xor_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
660 BoolVar b0 = s.arg2BoolVar(ce[0]);
661 BoolVar
b1 = s.arg2BoolVar(ce[1]);
662 BoolVar
b2 = s.arg2BoolVar(ce[2]);
663 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
665 clause(s,
BOT_OR, BoolVarArgs(), BoolVarArgs()<<b0<<b1<<b2, 1,
668 void p_bool_l_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
669 BoolVar b0 = s.arg2BoolVar(ce[0]);
670 BoolVar
b1 = s.arg2BoolVar(ce[1]);
671 if (ce[2]->isBool()) {
672 rel(s, b1,
BOT_IMP, b0, ce[2]->getBool(), s.ann2ipl(ann));
674 rel(s, b1,
BOT_IMP, b0, s.bv[ce[2]->getBoolVar()], s.ann2ipl(ann));
677 void p_bool_r_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
680 void p_bool_not(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
681 BoolVar x0 = s.arg2BoolVar(ce[0]);
682 BoolVar x1 = s.arg2BoolVar(ce[1]);
687 void p_array_int_element(FlatZincSpace& s,
const ConExpr& ce,
689 bool isConstant =
true;
690 AST::Array*
a = ce[1]->getArray();
691 for (
int i=a->
a.size();
i--;) {
692 if (!a->a[
i]->isInt()) {
697 IntVar selector = s.arg2IntVar(ce[0]);
698 rel(s, selector > 0);
700 IntArgs ia = s.arg2intargs(ce[1], 1);
701 element(s, ia, selector, s.arg2IntVar(ce[2]), s.ann2ipl(ann));
703 IntVarArgs iv = s.arg2intvarargs(ce[1], 1);
704 element(s, iv, selector, s.arg2IntVar(ce[2]), s.ann2ipl(ann));
707 void p_array_bool_element(FlatZincSpace& s,
const ConExpr& ce,
709 bool isConstant =
true;
710 AST::Array*
a = ce[1]->getArray();
711 for (
int i=a->
a.size();
i--;) {
712 if (!a->a[
i]->isBool()) {
717 IntVar selector = s.arg2IntVar(ce[0]);
718 rel(s, selector > 0);
720 IntArgs ia = s.arg2boolargs(ce[1], 1);
721 element(s, ia, selector, s.arg2BoolVar(ce[2]), s.ann2ipl(ann));
723 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 1);
724 element(s, iv, selector, s.arg2BoolVar(ce[2]), s.ann2ipl(ann));
729 void p_bool2int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
730 BoolVar x0 = s.arg2BoolVar(ce[0]);
731 IntVar x1 = s.arg2IntVar(ce[1]);
732 if (ce[0]->isBoolVar() && ce[1]->isIntVar()) {
733 s.aliasBool2Int(ce[1]->getIntVar(), ce[0]->getBoolVar());
735 channel(s, x0, x1, s.ann2ipl(ann));
738 void p_int_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
739 IntSet
d = s.arg2intset(ce[1]);
740 if (ce[0]->isBoolVar()) {
742 Iter::Ranges::Singleton sr(0,1);
743 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
745 if (d01.size() == 0) {
748 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
749 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
752 dom(s, s.arg2IntVar(ce[0]),
d);
755 void p_int_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
756 IntSet
d = s.arg2intset(ce[1]);
757 if (ce[0]->isBoolVar()) {
759 Iter::Ranges::Singleton sr(0,1);
760 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
762 if (d01.size() == 0) {
763 rel(s, s.arg2BoolVar(ce[2]) == 0);
764 }
else if (d01.max() == 0) {
765 rel(s, s.arg2BoolVar(ce[2]) == !s.arg2BoolVar(ce[0]));
766 }
else if (d01.min() == 1) {
767 rel(s, s.arg2BoolVar(ce[2]) == s.arg2BoolVar(ce[0]));
769 rel(s, s.arg2BoolVar(ce[2]) == 1);
772 dom(s, s.arg2IntVar(ce[0]),
d, s.arg2BoolVar(ce[2]));
775 void p_int_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
776 IntSet
d = s.arg2intset(ce[1]);
777 if (ce[0]->isBoolVar()) {
779 Iter::Ranges::Singleton sr(0,1);
780 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
782 if (d01.size() == 0) {
783 rel(s, s.arg2BoolVar(ce[2]) == 0);
784 }
else if (d01.max() == 0) {
785 rel(s, s.arg2BoolVar(ce[2]) >> !s.arg2BoolVar(ce[0]));
786 }
else if (d01.min() == 1) {
787 rel(s, s.arg2BoolVar(ce[2]) >> s.arg2BoolVar(ce[0]));
790 dom(s, s.arg2IntVar(ce[0]),
d, Reify(s.arg2BoolVar(ce[2]),
RM_IMP));
796 void p_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
797 IntVar x0 = s.arg2IntVar(ce[0]);
798 IntVar x1 = s.arg2IntVar(ce[1]);
799 abs(s, x0, x1, s.ann2ipl(ann));
802 void p_array_int_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
803 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
804 IntVarArgs iv1 = s.arg2intvarargs(ce[1]);
805 rel(s, iv0,
IRT_LE, iv1, s.ann2ipl(ann));
808 void p_array_int_lq(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_LQ, iv1, s.ann2ipl(ann));
814 void p_array_bool_lt(FlatZincSpace& s,
const ConExpr& ce,
816 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
817 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
818 rel(s, bv0,
IRT_LE, bv1, s.ann2ipl(ann));
821 void p_array_bool_lq(FlatZincSpace& s,
const ConExpr& ce,
823 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
824 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
825 rel(s, bv0,
IRT_LQ, bv1, s.ann2ipl(ann));
828 void p_count(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
829 IntVarArgs iv = s.arg2intvarargs(ce[0]);
830 if (!ce[1]->isIntVar()) {
831 if (!ce[2]->isIntVar()) {
832 count(s, iv, ce[1]->getInt(),
IRT_EQ, ce[2]->getInt(),
835 count(s, iv, ce[1]->getInt(),
IRT_EQ, s.arg2IntVar(ce[2]),
838 }
else if (!ce[2]->isIntVar()) {
839 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, ce[2]->getInt(),
842 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, s.arg2IntVar(ce[2]),
847 void p_count_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
848 IntVarArgs iv = s.arg2intvarargs(ce[0]);
849 IntVar
x = s.arg2IntVar(ce[1]);
850 IntVar
y = s.arg2IntVar(ce[2]);
851 BoolVar
b = s.arg2BoolVar(ce[3]);
856 void p_count_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
857 IntVarArgs iv = s.arg2intvarargs(ce[0]);
858 IntVar
x = s.arg2IntVar(ce[1]);
859 IntVar
y = s.arg2IntVar(ce[2]);
860 BoolVar
b = s.arg2BoolVar(ce[3]);
867 FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
868 IntVarArgs iv = s.arg2intvarargs(ce[1]);
869 count(s, iv, ce[2]->getInt(), irt, ce[0]->getInt(), s.ann2ipl(ann));
872 void p_at_most(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
873 count_rel(
IRT_LQ, s, ce, ann);
876 void p_at_least(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
877 count_rel(
IRT_GQ, s, ce, ann);
880 void p_bin_packing_load(FlatZincSpace& s,
const ConExpr& ce,
882 int minIdx = ce[3]->getInt();
883 IntVarArgs load = s.arg2intvarargs(ce[0]);
885 IntVarArgs bin = s.arg2intvarargs(ce[1]);
886 for (
int i=bin.
size();
i--;)
887 rel(s, bin[
i] >= minIdx);
889 for (
int i=minIdx;
i--;)
891 }
else if (minIdx < 0) {
892 IntVarArgs bin2(bin.size());
893 for (
int i=bin.
size();
i--;)
894 bin2[
i] =
expr(s, bin[
i]-minIdx, s.ann2ipl(ann));
898 IntArgs sizes = s.arg2intargs(ce[2]);
900 IntVarArgs allvars = l + bin;
902 binpacking(s, allvars.slice(0,1,l.size()), allvars.slice(l.size(),1,bin.size()),
903 sizes, s.ann2ipl(ann));
906 void p_global_cardinality(FlatZincSpace& s,
const ConExpr& ce,
908 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
909 IntArgs cover = s.arg2intargs(ce[1]);
910 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
913 IntSet cover_s(cover);
914 IntSetRanges cover_r(cover_s);
915 IntVarRanges* iv0_ri = re.alloc<IntVarRanges>(iv0.size());
916 for (
int i=iv0.
size();
i--;)
917 iv0_ri[
i] = IntVarRanges(iv0[
i]);
918 Iter::Ranges::NaryUnion iv0_r(re,iv0_ri,iv0.size());
919 Iter::Ranges::Diff<Iter::Ranges::NaryUnion,IntSetRanges>
920 extra_r(iv0_r,cover_r);
921 Iter::Ranges::ToValues<Iter::Ranges::Diff<
922 Iter::Ranges::NaryUnion,IntSetRanges> > extra(extra_r);
923 for (; extra(); ++extra) {
924 cover << extra.val();
925 iv1 << IntVar(s,0,iv0.size());
931 IntVarArgs allvars = iv0+iv1;
933 count(s, allvars.slice(0,1,iv0.size()),
934 allvars.slice(iv0.size(),1,iv1.size()),
938 count(s, iv0, iv1, cover, ipl);
942 void p_global_cardinality_closed(FlatZincSpace& s,
const ConExpr& ce,
944 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
945 IntArgs cover = s.arg2intargs(ce[1]);
946 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
948 count(s, iv0, iv1, cover, s.ann2ipl(ann));
951 void p_global_cardinality_low_up(FlatZincSpace& s,
const ConExpr& ce,
953 IntVarArgs
x = s.arg2intvarargs(ce[0]);
954 IntArgs cover = s.arg2intargs(ce[1]);
956 IntArgs lbound = s.arg2intargs(ce[2]);
957 IntArgs ubound = s.arg2intargs(ce[3]);
959 for (
int i=cover.
size();
i--;)
960 y[
i] = IntSet(lbound[
i],ubound[i]);
962 IntSet cover_s(cover);
964 IntVarRanges* xrs = re.alloc<IntVarRanges>(x.size());
965 for (
int i=x.size(); i--;)
967 Iter::Ranges::NaryUnion
u(re, xrs, x.size());
968 Iter::Ranges::ToValues<Iter::Ranges::NaryUnion> uv(
u);
970 if (!cover_s.in(uv.val())) {
972 y << IntSet(0,x.size());
976 count(s, x,
y, cover, s.ann2ipl(ann));
979 void p_global_cardinality_low_up_closed(FlatZincSpace& s,
982 IntVarArgs
x = s.arg2intvarargs(ce[0]);
983 IntArgs cover = s.arg2intargs(ce[1]);
985 IntArgs lbound = s.arg2intargs(ce[2]);
986 IntArgs ubound = s.arg2intargs(ce[3]);
988 for (
int i=cover.
size();
i--;)
989 y[
i] = IntSet(lbound[
i],ubound[i]);
991 count(s, x,
y, cover, s.ann2ipl(ann));
994 void p_minimum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
995 IntVarArgs iv = s.arg2intvarargs(ce[1]);
996 min(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
999 void p_maximum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1000 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1001 max(s, iv, s.arg2IntVar(ce[0]), s.ann2ipl(ann));
1004 void p_minimum_arg(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1005 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1006 argmin(s, iv, s.arg2IntVar(ce[1]),
true, s.ann2ipl(ann));
1009 void p_maximum_arg(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1010 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1011 argmax(s, iv, s.arg2IntVar(ce[1]),
true, s.ann2ipl(ann));
1014 void p_regular(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1015 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1016 int q = ce[1]->getInt();
1017 int symbols = ce[2]->getInt();
1018 IntArgs
d = s.arg2intargs(ce[3]);
1019 int q0 = ce[4]->getInt();
1022 for (
int i=1;
i<=q;
i++) {
1023 for (
int j=1; j<=symbols; j++) {
1024 if (d[(
i-1)*symbols+(j-1)] > 0)
1030 DFA::Transition*
t = re.alloc<DFA::Transition>(noOfTrans+1);
1032 for (
int i=1;
i<=q;
i++) {
1033 for (
int j=1; j<=symbols; j++) {
1034 if (d[(
i-1)*symbols+(j-1)] > 0) {
1035 t[noOfTrans].i_state =
i;
1036 t[noOfTrans].symbol = j;
1037 t[noOfTrans].o_state = d[(
i-1)*symbols+(j-1)];
1042 t[noOfTrans].i_state = -1;
1045 AST::SetLit* sl = ce[5]->getSet();
1048 f =
static_cast<int*
>(malloc(
sizeof(
int)*(sl->max-sl->min+2)));
1049 for (
int i=sl->min; i<=sl->
max;
i++)
1051 f[sl->max-sl->min+1] = -1;
1053 f =
static_cast<int*
>(malloc(
sizeof(
int)*(sl->s.size()+1)));
1054 for (
int j=sl->s.size(); j--; )
1056 f[sl->s.size()] = -1;
1066 p_sort(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1067 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1068 IntVarArgs
y = s.arg2intvarargs(ce[1]);
1069 IntVarArgs xy(x.size()+y.size());
1070 for (
int i=x.
size();
i--;)
1072 for (
int i=y.
size();
i--;)
1075 for (
int i=x.
size();
i--;)
1077 for (
int i=y.
size();
i--;)
1079 sorted(s, x, y, s.ann2ipl(ann));
1083 p_inverse_offsets(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1084 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1086 int xoff = ce[1]->getInt();
1087 IntVarArgs
y = s.arg2intvarargs(ce[2]);
1089 int yoff = ce[3]->getInt();
1090 channel(s, x, xoff, y, yoff, s.ann2ipl(ann));
1094 p_increasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1095 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1100 p_increasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1101 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1106 p_decreasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1107 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1112 p_decreasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1113 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1118 p_table_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1119 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1120 IntArgs tuples = s.arg2intargs(ce[1]);
1121 int noOfVars = x.size();
1122 int noOfTuples = tuples.size() == 0 ? 0 : (tuples.size()/noOfVars);
1124 for (
int i=0;
i<noOfTuples;
i++) {
1125 IntArgs
t(noOfVars);
1126 for (
int j=0; j<x.size(); j++) {
1127 t[j] = tuples[
i*noOfVars+j];
1135 p_table_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1136 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1137 IntArgs tuples = s.arg2boolargs(ce[1]);
1138 int noOfVars = x.size();
1139 int noOfTuples = tuples.size() == 0 ? 0 : (tuples.size()/noOfVars);
1141 for (
int i=0;
i<noOfTuples;
i++) {
1142 IntArgs
t(noOfVars);
1143 for (
int j=0; j<x.size(); j++) {
1144 t[j] = tuples[
i*noOfVars+j];
1152 void p_cumulative_opt(FlatZincSpace& s,
const ConExpr& ce,
1154 IntVarArgs start = s.arg2intvarargs(ce[0]);
1155 IntArgs duration = s.arg2intargs(ce[1]);
1156 IntArgs height = s.arg2intargs(ce[2]);
1157 BoolVarArgs
opt = s.arg2boolvarargs(ce[3]);
1158 int bound = ce[4]->getInt();
1160 cumulative(s,bound,start,duration,height,opt,s.ann2ipl(ann));
1163 void p_cumulatives(FlatZincSpace& s,
const ConExpr& ce,
1165 IntVarArgs start = s.arg2intvarargs(ce[0]);
1166 IntVarArgs duration = s.arg2intvarargs(ce[1]);
1167 IntVarArgs height = s.arg2intvarargs(ce[2]);
1168 int n = start.size();
1169 IntVar bound = s.arg2IntVar(ce[3]);
1175 rel(s, height[0] <= bound);
1181 for (
int i=2;
i<
n;
i++) {
1182 if (height[
i].
min() < minHeight) {
1183 minHeight2 = minHeight;
1184 minHeight = height[
i].min();
1185 }
else if (height[
i].
min() < minHeight2) {
1186 minHeight2 = height[
i].min();
1190 (minHeight > bound.max()/2) ||
1191 (minHeight2 > bound.max()/2 && minHeight+minHeight2>bound.max());
1193 rel(s, bound >=
max(height));
1195 if (duration.assigned()) {
1196 IntArgs durationI(n);
1198 durationI[
i] = duration[
i].val();
1200 unary(s,start,durationI);
1204 end[
i] =
expr(s,start[
i]+duration[
i]);
1206 unary(s,start,duration,end);
1208 }
else if (height.assigned()) {
1211 heightI[
i] = height[
i].val();
1212 if (duration.assigned()) {
1213 IntArgs durationI(n);
1215 durationI[
i] = duration[
i].val();
1216 cumulative(s, bound, start, durationI, heightI);
1219 for (
int i = n;
i--; )
1220 end[
i] =
expr(s,start[
i]+duration[
i]);
1221 cumulative(s, bound, start, duration, end, heightI);
1223 }
else if (bound.assigned()) {
1225 IntArgs limit(1, bound.val());
1228 end[
i] =
expr(s,start[
i]+duration[
i]);
1229 cumulatives(s, machine, start, duration, end, height, limit,
true,
1234 IntVarArgs end(start.size());
1235 for (
int i = start.
size();
i--; ) {
1238 end[
i] =
expr(s, start[
i] + duration[
i]);
1240 for (
int time = min; time <
max; ++time) {
1241 IntVarArgs
x(start.size());
1242 for (
int i = start.
size();
i--; ) {
1243 IntVar overlaps =
channel(s,
expr(s, (start[
i] <= time) &&
1245 x[
i] =
expr(s, overlaps * height[i]);
1252 void p_among_seq_int(FlatZincSpace& s,
const ConExpr& ce,
1254 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1255 IntSet S = s.arg2intset(ce[1]);
1256 int q = ce[2]->getInt();
1257 int l = ce[3]->getInt();
1258 int u = ce[4]->getInt();
1260 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1263 void p_among_seq_bool(FlatZincSpace& s,
const ConExpr& ce,
1265 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1266 bool val = ce[1]->getBool();
1267 int q = ce[2]->getInt();
1268 int l = ce[3]->getInt();
1269 int u = ce[4]->getInt();
1272 sequence(s, x, S, q, l, u, s.ann2ipl(ann));
1275 void p_schedule_unary(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1276 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1277 IntArgs
p = s.arg2intargs(ce[1]);
1282 void p_schedule_unary_optional(FlatZincSpace& s,
const ConExpr& ce,
1284 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1285 IntArgs
p = s.arg2intargs(ce[1]);
1286 BoolVarArgs m = s.arg2boolvarargs(ce[2]);
1291 void p_circuit(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1292 int off = ce[0]->getInt();
1293 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1295 circuit(s,off,xv,s.ann2ipl(ann));
1297 void p_circuit_cost_array(FlatZincSpace& s,
const ConExpr& ce,
1299 IntArgs
c = s.arg2intargs(ce[0]);
1300 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1301 IntVarArgs yv = s.arg2intvarargs(ce[2]);
1302 IntVar
z = s.arg2IntVar(ce[3]);
1304 circuit(s,c,xv,yv,z,s.ann2ipl(ann));
1306 void p_circuit_cost(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1307 IntArgs
c = s.arg2intargs(ce[0]);
1308 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1309 IntVar
z = s.arg2IntVar(ce[2]);
1311 circuit(s,c,xv,z,s.ann2ipl(ann));
1314 void p_nooverlap(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1315 IntVarArgs x0 = s.arg2intvarargs(ce[0]);
1316 IntVarArgs w = s.arg2intvarargs(ce[1]);
1317 IntVarArgs y0 = s.arg2intvarargs(ce[2]);
1318 IntVarArgs h = s.arg2intvarargs(ce[3]);
1319 if (w.assigned() && h.assigned()) {
1320 IntArgs iw(w.size());
1321 for (
int i=w.
size();
i--;)
1323 IntArgs ih(h.size());
1324 for (
int i=h.
size();
i--;)
1326 nooverlap(s,x0,iw,y0,ih,s.ann2ipl(ann));
1328 int miny = y0[0].min();
1329 int maxy = y0[0].max();
1331 for (
int i=1;
i<y0.
size();
i++) {
1336 int minx = x0[0].min();
1337 int maxx = x0[0].max();
1339 for (
int i=1;
i<x0.
size();
i++) {
1349 IntVarArgs x1(x0.size()), y1(y0.size());
1350 for (
int i=x0.
size();
i--; )
1351 x1[
i] =
expr(s, x0[
i] + w[
i]);
1352 for (
int i=y0.size(); i--; )
1353 y1[i] =
expr(s, y0[i] + h[i]);
1354 nooverlap(s,x0,w,x1,y0,h,y1,s.ann2ipl(ann));
1358 void p_precede(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1359 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1360 int p_s = ce[1]->getInt();
1361 int p_t = ce[2]->getInt();
1362 precede(s,x,p_s,p_t,s.ann2ipl(ann));
1365 void p_nvalue(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1366 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1367 if (ce[0]->isIntVar()) {
1368 IntVar
y = s.arg2IntVar(ce[0]);
1375 void p_among(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1376 IntVarArgs
x = s.arg2intvarargs(ce[1]);
1377 IntSet
v = s.arg2intset(ce[2]);
1378 if (ce[0]->isIntVar()) {
1379 IntVar
n = s.arg2IntVar(ce[0]);
1384 count(s,x,v,
IRT_EQ,ce[0]->getInt(),s.ann2ipl(ann));
1388 void p_member_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1389 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1390 IntVar
y = s.arg2IntVar(ce[1]);
1391 member(s,x,y,s.ann2ipl(ann));
1393 void p_member_int_reif(FlatZincSpace& s,
const ConExpr& ce,
1395 IntVarArgs
x = s.arg2intvarargs(ce[0]);
1396 IntVar
y = s.arg2IntVar(ce[1]);
1397 BoolVar
b = s.arg2BoolVar(ce[2]);
1398 member(s,x,y,b,s.ann2ipl(ann));
1400 void p_member_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1401 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1402 BoolVar
y = s.arg2BoolVar(ce[1]);
1403 member(s,x,y,s.ann2ipl(ann));
1405 void p_member_bool_reif(FlatZincSpace& s,
const ConExpr& ce,
1407 BoolVarArgs
x = s.arg2boolvarargs(ce[0]);
1408 BoolVar
y = s.arg2BoolVar(ce[1]);
1409 member(s,x,y,s.arg2BoolVar(ce[2]),s.ann2ipl(ann));
1416 registry().
add(
"all_different_offset", &p_distinctOffset);
1437 registry().
add(
"int_lin_eq_reif", &p_int_lin_eq_reif);
1438 registry().
add(
"int_lin_eq_imp", &p_int_lin_eq_imp);
1440 registry().
add(
"int_lin_ne_reif", &p_int_lin_ne_reif);
1441 registry().
add(
"int_lin_ne_imp", &p_int_lin_ne_imp);
1443 registry().
add(
"int_lin_le_reif", &p_int_lin_le_reif);
1444 registry().
add(
"int_lin_le_imp", &p_int_lin_le_imp);
1446 registry().
add(
"int_lin_lt_reif", &p_int_lin_lt_reif);
1447 registry().
add(
"int_lin_lt_imp", &p_int_lin_lt_imp);
1449 registry().
add(
"int_lin_ge_reif", &p_int_lin_ge_reif);
1450 registry().
add(
"int_lin_ge_imp", &p_int_lin_ge_imp);
1452 registry().
add(
"int_lin_gt_reif", &p_int_lin_gt_reif);
1453 registry().
add(
"int_lin_gt_imp", &p_int_lin_gt_imp);
1487 registry().
add(
"array_bool_and", &p_array_bool_and);
1488 registry().
add(
"array_bool_and_imp", &p_array_bool_and_imp);
1489 registry().
add(
"array_bool_or", &p_array_bool_or);
1490 registry().
add(
"array_bool_or_imp", &p_array_bool_or_imp);
1491 registry().
add(
"array_bool_xor", &p_array_bool_xor);
1492 registry().
add(
"array_bool_xor_imp", &p_array_bool_xor_imp);
1493 registry().
add(
"bool_clause", &p_array_bool_clause);
1494 registry().
add(
"bool_clause_reif", &p_array_bool_clause_reif);
1495 registry().
add(
"bool_clause_imp", &p_array_bool_clause_imp);
1499 registry().
add(
"array_int_element", &p_array_int_element);
1500 registry().
add(
"array_var_int_element", &p_array_int_element);
1501 registry().
add(
"array_bool_element", &p_array_bool_element);
1502 registry().
add(
"array_var_bool_element", &p_array_bool_element);
1507 #ifndef GECODE_HAS_SET_VARS 1515 registry().
add(
"array_bool_lt", &p_array_bool_lt);
1516 registry().
add(
"array_bool_lq", &p_array_bool_lq);
1522 registry().
add(
"gecode_bin_packing_load", &p_bin_packing_load);
1523 registry().
add(
"gecode_global_cardinality", &p_global_cardinality);
1524 registry().
add(
"gecode_global_cardinality_closed",
1525 &p_global_cardinality_closed);
1527 &p_global_cardinality_low_up);
1528 registry().
add(
"global_cardinality_low_up_closed",
1529 &p_global_cardinality_low_up_closed);
1532 registry().
add(
"gecode_minimum_arg_int", &p_minimum_arg);
1533 registry().
add(
"gecode_maximum_arg_int", &p_maximum_arg);
1537 registry().
add(
"inverse_offsets", &p_inverse_offsets);
1538 registry().
add(
"increasing_int", &p_increasing_int);
1539 registry().
add(
"increasing_bool", &p_increasing_bool);
1540 registry().
add(
"decreasing_int", &p_decreasing_int);
1541 registry().
add(
"decreasing_bool", &p_decreasing_bool);
1543 registry().
add(
"gecode_table_bool", &p_table_bool);
1545 registry().
add(
"gecode_among_seq_int", &p_among_seq_int);
1546 registry().
add(
"gecode_among_seq_bool", &p_among_seq_bool);
1555 registry().
add(
"bool_lin_eq_reif", &p_bool_lin_eq_reif);
1556 registry().
add(
"bool_lin_eq_imp", &p_bool_lin_eq_imp);
1557 registry().
add(
"bool_lin_ne_reif", &p_bool_lin_ne_reif);
1558 registry().
add(
"bool_lin_ne_imp", &p_bool_lin_ne_imp);
1559 registry().
add(
"bool_lin_le_reif", &p_bool_lin_le_reif);
1560 registry().
add(
"bool_lin_le_imp", &p_bool_lin_le_imp);
1561 registry().
add(
"bool_lin_lt_reif", &p_bool_lin_lt_reif);
1562 registry().
add(
"bool_lin_lt_imp", &p_bool_lin_lt_imp);
1563 registry().
add(
"bool_lin_ge_reif", &p_bool_lin_ge_reif);
1564 registry().
add(
"bool_lin_ge_imp", &p_bool_lin_ge_imp);
1565 registry().
add(
"bool_lin_gt_reif", &p_bool_lin_gt_reif);
1566 registry().
add(
"bool_lin_gt_imp", &p_bool_lin_gt_imp);
1568 registry().
add(
"gecode_schedule_unary", &p_schedule_unary);
1569 registry().
add(
"gecode_schedule_unary_optional", &p_schedule_unary_optional);
1570 registry().
add(
"gecode_schedule_cumulative_optional", &p_cumulative_opt);
1573 registry().
add(
"gecode_circuit_cost_array", &p_circuit_cost_array);
1574 registry().
add(
"gecode_circuit_cost", &p_circuit_cost);
1580 registry().
add(
"gecode_member_int_reif",&p_member_int_reif);
1582 registry().
add(
"gecode_member_bool_reif",&p_member_bool_reif);
1585 IntPoster __int_poster;
1587 #ifdef GECODE_HAS_SET_VARS 1589 const ConExpr& ce, AST::Node *) {
1590 rel(s, s.arg2SetVar(ce[0]),
op, s.arg2SetVar(ce[1]),
1591 SRT_EQ, s.arg2SetVar(ce[2]));
1593 void p_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1596 void p_set_intersect(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1599 void p_set_diff(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1603 void p_set_symdiff(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1604 SetVar
x = s.arg2SetVar(ce[0]);
1605 SetVar
y = s.arg2SetVar(ce[1]);
1607 SetVarLubRanges xub(x);
1612 SetVarLubRanges yub(y);
1620 void p_array_set_OP(FlatZincSpace& s,
SetOpType op,
1621 const ConExpr& ce, AST::Node *) {
1622 SetVarArgs xs = s.arg2setvarargs(ce[0]);
1623 rel(s, op, xs, s.arg2SetVar(ce[1]));
1625 void p_array_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1628 void p_array_set_partition(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1633 void p_set_rel(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1634 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]));
1637 void p_set_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1638 p_set_rel(s,
SRT_EQ, ce);
1640 void p_set_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1641 p_set_rel(s,
SRT_NQ, ce);
1643 void p_set_subset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1646 void p_set_superset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1649 void p_set_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1650 p_set_rel(s,
SRT_LQ, ce);
1652 void p_set_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1653 p_set_rel(s,
SRT_LE, ce);
1655 void p_set_card(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1656 if (!ce[1]->isIntVar()) {
1657 cardinality(s, s.arg2SetVar(ce[0]), ce[1]->getInt(),
1660 cardinality(s, s.arg2SetVar(ce[0]), s.arg2IntVar(ce[1]));
1663 void p_set_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1664 if (!ce[1]->isSetVar()) {
1665 IntSet
d = s.arg2intset(ce[1]);
1666 if (ce[0]->isBoolVar()) {
1668 Iter::Ranges::Singleton sr(0,1);
1669 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
1671 if (d01.size() == 0) {
1674 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
1675 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
1678 dom(s, s.arg2IntVar(ce[0]),
d);
1681 if (!ce[0]->isIntVar()) {
1682 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt());
1684 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]));
1688 void p_set_rel_reif(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1689 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]),
1690 s.arg2BoolVar(ce[2]));
1693 void p_set_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1694 p_set_rel_reif(s,
SRT_EQ,ce);
1696 void p_set_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1697 p_set_rel_reif(s,
SRT_LQ,ce);
1699 void p_set_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1700 p_set_rel_reif(s,
SRT_LE,ce);
1702 void p_set_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1703 p_set_rel_reif(s,
SRT_NQ,ce);
1705 void p_set_subset_reif(FlatZincSpace& s,
const ConExpr& ce,
1709 void p_set_superset_reif(FlatZincSpace& s,
const ConExpr& ce,
1713 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann,
ReifyMode rm) {
1714 if (!ce[1]->isSetVar()) {
1716 p_int_in_reif(s,ce,ann);
1719 p_int_in_imp(s,ce,ann);
1722 if (!ce[0]->isIntVar()) {
1723 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt(),
1724 Reify(s.arg2BoolVar(ce[2]),rm));
1726 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]),
1727 Reify(s.arg2BoolVar(ce[2]),rm));
1731 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1732 p_set_in_reif(s,ce,ann,
RM_EQV);
1734 void p_set_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1735 p_set_in_reif(s,ce,ann,
RM_IMP);
1737 void p_set_disjoint(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1738 rel(s, s.arg2SetVar(ce[0]),
SRT_DISJ, s.arg2SetVar(ce[1]));
1741 void p_link_set_to_booleans(FlatZincSpace& s,
const ConExpr& ce,
1743 SetVar
x = s.arg2SetVar(ce[0]);
1744 int idx = ce[2]->getInt();
1747 BoolVarArgs
y = s.arg2boolvarargs(ce[1],idx);
1752 void p_array_set_element(FlatZincSpace& s,
const ConExpr& ce,
1754 bool isConstant =
true;
1755 AST::Array*
a = ce[1]->getArray();
1756 for (
int i=a->
a.size();
i--;) {
1757 if (a->a[
i]->isSetVar()) {
1762 IntVar selector = s.arg2IntVar(ce[0]);
1763 rel(s, selector > 0);
1766 element(s, sv, selector, s.arg2SetVar(ce[2]));
1768 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1769 element(s, sv, selector, s.arg2SetVar(ce[2]));
1773 void p_array_set_element_op(FlatZincSpace& s,
const ConExpr& ce,
1775 const IntSet& universe =
1777 bool isConstant =
true;
1778 AST::Array*
a = ce[1]->getArray();
1779 for (
int i=a->
a.size();
i--;) {
1780 if (a->a[
i]->isSetVar()) {
1785 SetVar selector = s.arg2SetVar(ce[0]);
1789 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1791 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1792 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1796 void p_array_set_element_union(FlatZincSpace& s,
const ConExpr& ce,
1798 p_array_set_element_op(s, ce, ann,
SOT_UNION);
1801 void p_array_set_element_intersect(FlatZincSpace& s,
const ConExpr& ce,
1803 p_array_set_element_op(s, ce, ann,
SOT_INTER);
1806 void p_array_set_element_intersect_in(FlatZincSpace& s,
1809 IntSet
d = s.arg2intset(ce[3]);
1810 p_array_set_element_op(s, ce, ann,
SOT_INTER, d);
1813 void p_array_set_element_partition(FlatZincSpace& s,
const ConExpr& ce,
1815 p_array_set_element_op(s, ce, ann,
SOT_DUNION);
1818 void p_set_convex(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1819 convex(s, s.arg2SetVar(ce[0]));
1822 void p_array_set_seq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1823 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1827 void p_array_set_seq_union(FlatZincSpace& s,
const ConExpr& ce,
1829 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1830 sequence(s, sv, s.arg2SetVar(ce[1]));
1833 void p_int_set_channel(FlatZincSpace& s,
const ConExpr& ce,
1835 int xoff=ce[1]->getInt();
1837 int yoff=ce[3]->getInt();
1839 IntVarArgs xv = s.arg2intvarargs(ce[0], xoff);
1840 SetVarArgs yv = s.arg2setvarargs(ce[2], yoff, 1, IntSet(0, xoff-1));
1841 IntSet xd(yoff,yv.size()-1);
1842 for (
int i=xoff;
i<xv.
size();
i++) {
1845 IntSet yd(xoff,xv.size()-1);
1846 for (
int i=yoff;
i<yv.
size();
i++) {
1852 void p_range(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1853 int xoff=ce[1]->getInt();
1855 IntVarArgs xv = s.arg2intvarargs(ce[0],xoff);
1859 void p_weights(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1860 IntArgs e = s.arg2intargs(ce[0]);
1861 IntArgs w = s.arg2intargs(ce[1]);
1862 SetVar
x = s.arg2SetVar(ce[2]);
1863 IntVar
y = s.arg2IntVar(ce[3]);
1867 void p_inverse_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1868 int xoff = ce[2]->getInt();
1869 int yoff = ce[3]->getInt();
1870 SetVarArgs
x = s.arg2setvarargs(ce[0],xoff);
1871 SetVarArgs
y = s.arg2setvarargs(ce[1],yoff);
1875 void p_precede_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1876 SetVarArgs
x = s.arg2setvarargs(ce[0]);
1877 int p_s = ce[1]->getInt();
1878 int p_t = ce[2]->getInt();
1891 registry().
add(
"array_set_element", &p_array_set_element);
1892 registry().
add(
"array_var_set_element", &p_array_set_element);
1893 registry().
add(
"set_intersect", &p_set_intersect);
1905 registry().
add(
"set_subset_reif", &p_set_subset_reif);
1906 registry().
add(
"set_superset_reif", &p_set_superset_reif);
1911 &p_link_set_to_booleans);
1913 registry().
add(
"array_set_union", &p_array_set_union);
1914 registry().
add(
"array_set_partition", &p_array_set_partition);
1916 registry().
add(
"array_set_seq", &p_array_set_seq);
1917 registry().
add(
"array_set_seq_union", &p_array_set_seq_union);
1919 &p_array_set_element_union);
1920 registry().
add(
"gecode_array_set_element_intersect",
1921 &p_array_set_element_intersect);
1922 registry().
add(
"gecode_array_set_element_intersect_in",
1923 &p_array_set_element_intersect_in);
1924 registry().
add(
"gecode_array_set_element_partition",
1925 &p_array_set_element_partition);
1927 &p_int_set_channel);
1932 registry().
add(
"gecode_inverse_set", &p_inverse_set);
1933 registry().
add(
"gecode_precede_set", &p_precede_set);
1936 SetPoster __set_poster;
1939 #ifdef GECODE_HAS_FLOAT_VARS 1941 void p_int2float(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1942 IntVar x0 = s.arg2IntVar(ce[0]);
1943 FloatVar x1 = s.arg2FloatVar(ce[1]);
1947 void p_float_lin_cmp(FlatZincSpace& s,
FloatRelType frt,
1948 const ConExpr& ce, AST::Node*) {
1949 FloatValArgs fa = s.arg2floatargs(ce[0]);
1950 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1951 linear(s, fa, fv, frt, ce[2]->getFloat());
1953 void p_float_lin_cmp_reif(FlatZincSpace& s,
FloatRelType frt,
1954 const ConExpr& ce, AST::Node*) {
1955 FloatValArgs fa = s.arg2floatargs(ce[0]);
1956 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1957 linear(s, fa, fv, frt, ce[2]->getFloat(), s.arg2BoolVar(ce[3]));
1959 void p_float_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1960 p_float_lin_cmp(s,
FRT_EQ,ce,ann);
1962 void p_float_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce,
1964 p_float_lin_cmp_reif(s,
FRT_EQ,ce,ann);
1966 void p_float_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1967 p_float_lin_cmp(s,
FRT_LQ,ce,ann);
1969 void p_float_lin_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1970 p_float_lin_cmp(s,
FRT_LE,ce,ann);
1972 void p_float_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce,
1974 p_float_lin_cmp_reif(s,
FRT_LQ,ce,ann);
1976 void p_float_lin_lt_reif(FlatZincSpace& s,
const ConExpr& ce,
1978 p_float_lin_cmp_reif(s,
FRT_LE,ce,ann);
1981 void p_float_times(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1982 FloatVar
x = s.arg2FloatVar(ce[0]);
1983 FloatVar
y = s.arg2FloatVar(ce[1]);
1984 FloatVar
z = s.arg2FloatVar(ce[2]);
1988 void p_float_div(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1989 FloatVar
x = s.arg2FloatVar(ce[0]);
1990 FloatVar
y = s.arg2FloatVar(ce[1]);
1991 FloatVar
z = s.arg2FloatVar(ce[2]);
1995 void p_float_plus(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_sqrt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2003 FloatVar
x = s.arg2FloatVar(ce[0]);
2004 FloatVar
y = s.arg2FloatVar(ce[1]);
2008 void p_float_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2009 FloatVar
x = s.arg2FloatVar(ce[0]);
2010 FloatVar
y = s.arg2FloatVar(ce[1]);
2014 void p_float_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2015 FloatVar
x = s.arg2FloatVar(ce[0]);
2016 FloatVar
y = s.arg2FloatVar(ce[1]);
2019 void p_float_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2020 FloatVar
x = s.arg2FloatVar(ce[0]);
2021 FloatVar
y = s.arg2FloatVar(ce[1]);
2022 BoolVar
b = s.arg2BoolVar(ce[2]);
2025 void p_float_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2026 FloatVar
x = s.arg2FloatVar(ce[0]);
2027 FloatVar
y = s.arg2FloatVar(ce[1]);
2030 void p_float_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2031 FloatVar
x = s.arg2FloatVar(ce[0]);
2032 FloatVar
y = s.arg2FloatVar(ce[1]);
2033 BoolVar
b = s.arg2BoolVar(ce[2]);
2036 void p_float_max(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2037 FloatVar
x = s.arg2FloatVar(ce[0]);
2038 FloatVar
y = s.arg2FloatVar(ce[1]);
2039 FloatVar
z = s.arg2FloatVar(ce[2]);
2042 void p_float_min(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2043 FloatVar
x = s.arg2FloatVar(ce[0]);
2044 FloatVar
y = s.arg2FloatVar(ce[1]);
2045 FloatVar
z = s.arg2FloatVar(ce[2]);
2048 void p_float_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2049 FloatVar
x = s.arg2FloatVar(ce[0]);
2050 FloatVar
y = s.arg2FloatVar(ce[1]);
2055 void p_float_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2056 FloatVar
x = s.arg2FloatVar(ce[0]);
2057 FloatVar
y = s.arg2FloatVar(ce[1]);
2058 BoolVar
b = s.arg2BoolVar(ce[2]);
2061 rel(s, b == (b0 && !b1));
2066 void p_float_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2067 FloatVar
x = s.arg2FloatVar(ce[0]);
2068 FloatVar
y = s.arg2FloatVar(ce[1]);
2072 #ifdef GECODE_HAS_MPFR 2073 #define P_FLOAT_OP(Op) \ 2074 void p_float_ ## Op (FlatZincSpace& s, const ConExpr& ce, AST::Node*) {\ 2075 FloatVar x = s.arg2FloatVar(ce[0]);\ 2076 FloatVar y = s.arg2FloatVar(ce[1]);\ 2091 void p_float_ln(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2092 FloatVar
x = s.arg2FloatVar(ce[0]);
2093 FloatVar
y = s.arg2FloatVar(ce[1]);
2096 void p_float_log10(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2097 FloatVar
x = s.arg2FloatVar(ce[0]);
2098 FloatVar
y = s.arg2FloatVar(ce[1]);
2101 void p_float_log2(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2102 FloatVar
x = s.arg2FloatVar(ce[0]);
2103 FloatVar
y = s.arg2FloatVar(ce[1]);
2129 registry().
add(
"float_lin_eq_reif",&p_float_lin_eq_reif);
2132 registry().
add(
"float_lin_le_reif",&p_float_lin_le_reif);
2133 registry().
add(
"float_lin_lt_reif",&p_float_lin_lt_reif);
2135 #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)
union Gecode::@579::NNF::@61 u
Union depending on nodetype t.
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 linear(Home home, const FloatVarArgs &x, FloatRelType frt, FloatVal c)
Post propagator for .
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.
struct Gecode::@579::NNF::@61::@63 a
For atomic nodes.
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.
struct Gecode::@579::NNF::@61::@62 b
For binary nodes (and, or, eqv)
void distinct(Home home, const IntVarArgs &x, IntPropLevel ipl)
Post propagator for for all .
void argmax(Home home, const IntVarArgs &x, IntVar y, bool tiebreak, IntPropLevel)
Post propagator for .
Post propagator for SetVar SetOpType SetVar SetRelType SetVar z
IntVarArgs arg2intvarargs(AST::Node *arg, int offset=0)
Convert arg to IntVarArgs.
void convex(Home home, SetVar x)
void asin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
AST::Array * ann
Constraint annotations.
Passing integer variables.
bool isBoolArray(AST::Node *b, int &singleInt)
Check if b is array of Booleans (or has a single integer)
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.
Post propagator for f(x \diamond_{\mathit{op}} y) \sim_r z \f$ void rel(Home home
Post propagator for SetVar SetOpType SetVar y
void div(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
void tan(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void(* poster)(FlatZincSpace &, const ConExpr &, AST::Node *)
Type of constraint posting function.
void precede(Home home, const IntVarArgs &x, int s, int t, IntPropLevel)
Post propagator that s precedes t in x.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
Exception class for FlatZinc errors
Domain propagation Preferences: prefer speed or memory.
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.