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);
107 void p_distinct(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
108 IntVarArgs va = s.arg2intvarargs(ce[0]);
113 void p_distinctOffset(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
114 IntVarArgs va = s.arg2intvarargs(ce[1]);
116 AST::Array* offs = ce.args->a[0]->getArray();
117 IntArgs oa(offs->a.size());
118 for (
int i=offs->
a.size();
i--; ) {
119 oa[
i] = offs->a[
i]->getInt();
125 void p_all_equal(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
126 IntVarArgs va = s.arg2intvarargs(ce[0]);
130 void p_int_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
132 if (ce[0]->isIntVar()) {
133 if (ce[1]->isIntVar()) {
134 rel(s, s.arg2IntVar(ce[0]), irt, s.arg2IntVar(ce[1]),
137 rel(s, s.arg2IntVar(ce[0]), irt, ce[1]->getInt(), s.ann2icl(ann));
140 rel(s, s.arg2IntVar(ce[1]), swap(irt), ce[0]->getInt(),
144 void p_int_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
145 p_int_CMP(s,
IRT_EQ, ce, ann);
147 void p_int_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
148 p_int_CMP(s,
IRT_NQ, ce, ann);
150 void p_int_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
151 p_int_CMP(s,
IRT_GQ, ce, ann);
153 void p_int_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
154 p_int_CMP(s,
IRT_GR, ce, ann);
156 void p_int_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
157 p_int_CMP(s,
IRT_LQ, ce, ann);
159 void p_int_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
160 p_int_CMP(s,
IRT_LE, ce, ann);
163 const ConExpr& ce, AST::Node* 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()) {
174 rel(s, s.arg2IntVar(ce[0]), irt, s.arg2IntVar(ce[1]),
175 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2icl(ann));
177 rel(s, s.arg2IntVar(ce[0]), irt, ce[1]->getInt(),
178 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2icl(ann));
181 rel(s, s.arg2IntVar(ce[1]), swap(irt), ce[0]->getInt(),
182 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2icl(ann));
187 void p_int_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
190 void p_int_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
193 void p_int_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
196 void p_int_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
199 void p_int_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
202 void p_int_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
206 void p_int_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
209 void p_int_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
212 void p_int_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
215 void p_int_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
218 void p_int_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
221 void p_int_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
226 void p_int_lin_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
228 IntArgs ia = s.arg2intargs(ce[0]);
230 if (s.isBoolArray(ce[1],singleIntVar)) {
231 if (singleIntVar != -1) {
232 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
233 IntVar siv = s.arg2IntVar(ce[1]->getArray()->
a[singleIntVar]);
234 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar);
235 IntArgs ia_tmp(ia.size()-1);
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));
242 linear(s, ia_tmp, iv, t, siv, s.ann2icl(ann));
244 IntVarArgs iv = s.arg2intvarargs(ce[1]);
245 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2icl(ann));
248 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
249 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2icl(ann));
252 IntVarArgs iv = s.arg2intvarargs(ce[1]);
253 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2icl(ann));
257 const ConExpr& ce, AST::Node* ann) {
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);
266 IntArgs ia = s.arg2intargs(ce[0]);
268 if (s.isBoolArray(ce[1],singleIntVar)) {
269 if (singleIntVar != -1) {
270 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
271 IntVar siv = s.arg2IntVar(ce[1]->getArray()->
a[singleIntVar]);
272 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar);
273 IntArgs ia_tmp(ia.size()-1);
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));
280 linear(s, ia_tmp, iv, t, siv, Reify(s.arg2BoolVar(ce[3]), rm),
283 IntVarArgs iv = s.arg2intvarargs(ce[1]);
284 linear(s, ia, iv, irt, ce[2]->getInt(),
285 Reify(s.arg2BoolVar(ce[3]), rm), s.ann2icl(ann));
288 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
289 linear(s, ia, iv, irt, ce[2]->getInt(),
290 Reify(s.arg2BoolVar(ce[3]), rm), s.ann2icl(ann));
293 IntVarArgs iv = s.arg2intvarargs(ce[1]);
294 linear(s, ia, iv, irt, ce[2]->getInt(),
295 Reify(s.arg2BoolVar(ce[3]), rm),
299 void p_int_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
300 p_int_lin_CMP(s,
IRT_EQ, ce, ann);
302 void p_int_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
305 void p_int_lin_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
308 void p_int_lin_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
309 p_int_lin_CMP(s,
IRT_NQ, ce, ann);
311 void p_int_lin_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
314 void p_int_lin_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
317 void p_int_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
318 p_int_lin_CMP(s,
IRT_LQ, ce, ann);
320 void p_int_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
323 void p_int_lin_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
326 void p_int_lin_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
327 p_int_lin_CMP(s,
IRT_LE, ce, ann);
329 void p_int_lin_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
332 void p_int_lin_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
335 void p_int_lin_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
336 p_int_lin_CMP(s,
IRT_GQ, ce, ann);
338 void p_int_lin_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
341 void p_int_lin_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
344 void p_int_lin_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
345 p_int_lin_CMP(s,
IRT_GR, ce, ann);
347 void p_int_lin_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
350 void p_int_lin_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
354 void p_bool_lin_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
356 IntArgs ia = s.arg2intargs(ce[0]);
357 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
358 if (ce[2]->isIntVar())
359 linear(s, ia, iv, irt, s.iv[ce[2]->getIntVar()], s.ann2icl(ann));
361 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2icl(ann));
364 const ConExpr& ce, AST::Node* ann) {
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);
373 IntArgs ia = s.arg2intargs(ce[0]);
374 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
375 if (ce[2]->isIntVar())
376 linear(s, ia, iv, irt, s.iv[ce[2]->getIntVar()],
377 Reify(s.arg2BoolVar(ce[3]), rm),
380 linear(s, ia, iv, irt, ce[2]->getInt(),
381 Reify(s.arg2BoolVar(ce[3]), rm),
384 void p_bool_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
385 p_bool_lin_CMP(s,
IRT_EQ, ce, ann);
387 void p_bool_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
391 void p_bool_lin_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
395 void p_bool_lin_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
396 p_bool_lin_CMP(s,
IRT_NQ, ce, ann);
398 void p_bool_lin_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
402 void p_bool_lin_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
406 void p_bool_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
407 p_bool_lin_CMP(s,
IRT_LQ, ce, ann);
409 void p_bool_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
413 void p_bool_lin_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
417 void p_bool_lin_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
419 p_bool_lin_CMP(s,
IRT_LE, ce, ann);
421 void p_bool_lin_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
425 void p_bool_lin_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
429 void p_bool_lin_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
430 p_bool_lin_CMP(s,
IRT_GQ, ce, ann);
432 void p_bool_lin_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
436 void p_bool_lin_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
440 void p_bool_lin_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
441 p_bool_lin_CMP(s,
IRT_GR, ce, ann);
443 void p_bool_lin_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
447 void p_bool_lin_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
454 void p_int_plus(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
455 if (!ce[0]->isIntVar()) {
456 rel(s, ce[0]->getInt() + s.arg2IntVar(ce[1])
457 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
458 }
else if (!ce[1]->isIntVar()) {
459 rel(s, s.arg2IntVar(ce[0]) + ce[1]->getInt()
460 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
461 }
else if (!ce[2]->isIntVar()) {
462 rel(s, s.arg2IntVar(ce[0]) + s.arg2IntVar(ce[1])
463 == ce[2]->getInt(), s.ann2icl(ann));
465 rel(s, s.arg2IntVar(ce[0]) + s.arg2IntVar(ce[1])
466 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
470 void p_int_minus(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
471 if (!ce[0]->isIntVar()) {
472 rel(s, ce[0]->getInt() - s.arg2IntVar(ce[1])
473 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
474 }
else if (!ce[1]->isIntVar()) {
475 rel(s, s.arg2IntVar(ce[0]) - ce[1]->getInt()
476 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
477 }
else if (!ce[2]->isIntVar()) {
478 rel(s, s.arg2IntVar(ce[0]) - s.arg2IntVar(ce[1])
479 == ce[2]->getInt(), s.ann2icl(ann));
481 rel(s, s.arg2IntVar(ce[0]) - s.arg2IntVar(ce[1])
482 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
486 void p_int_times(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
487 IntVar x0 = s.arg2IntVar(ce[0]);
488 IntVar x1 = s.arg2IntVar(ce[1]);
489 IntVar x2 = s.arg2IntVar(ce[2]);
490 mult(s, x0, x1, x2, s.ann2icl(ann));
492 void p_int_div(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
493 IntVar x0 = s.arg2IntVar(ce[0]);
494 IntVar x1 = s.arg2IntVar(ce[1]);
495 IntVar x2 = s.arg2IntVar(ce[2]);
496 div(s,x0,x1,x2, s.ann2icl(ann));
498 void p_int_mod(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
499 IntVar x0 = s.arg2IntVar(ce[0]);
500 IntVar x1 = s.arg2IntVar(ce[1]);
501 IntVar x2 = s.arg2IntVar(ce[2]);
502 mod(s,x0,x1,x2, s.ann2icl(ann));
505 void p_int_min(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
506 IntVar x0 = s.arg2IntVar(ce[0]);
507 IntVar x1 = s.arg2IntVar(ce[1]);
508 IntVar x2 = s.arg2IntVar(ce[2]);
509 min(s, x0, x1, x2, s.ann2icl(ann));
511 void p_int_max(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
512 IntVar x0 = s.arg2IntVar(ce[0]);
513 IntVar x1 = s.arg2IntVar(ce[1]);
514 IntVar x2 = s.arg2IntVar(ce[2]);
515 max(s, x0, x1, x2, s.ann2icl(ann));
517 void p_int_negate(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
518 IntVar x0 = s.arg2IntVar(ce[0]);
519 IntVar x1 = s.arg2IntVar(ce[1]);
520 rel(s, x0 == -x1, s.ann2icl(ann));
524 void p_bool_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
526 rel(s, s.arg2BoolVar(ce[0]), irt, s.arg2BoolVar(ce[1]),
530 const ConExpr& ce, AST::Node* ann) {
531 rel(s, s.arg2BoolVar(ce[0]), irt, s.arg2BoolVar(ce[1]),
532 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2icl(ann));
534 void p_bool_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
535 p_bool_CMP(s,
IRT_EQ, ce, ann);
537 void p_bool_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
540 void p_bool_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
543 void p_bool_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
544 p_bool_CMP(s,
IRT_NQ, ce, ann);
546 void p_bool_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
549 void p_bool_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
552 void p_bool_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
553 p_bool_CMP(s,
IRT_GQ, ce, ann);
555 void p_bool_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
558 void p_bool_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
561 void p_bool_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
562 p_bool_CMP(s,
IRT_LQ, ce, ann);
564 void p_bool_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
567 void p_bool_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
570 void p_bool_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
571 p_bool_CMP(s,
IRT_GR, ce, ann);
573 void p_bool_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
576 void p_bool_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
579 void p_bool_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
580 p_bool_CMP(s,
IRT_LE, ce, ann);
582 void p_bool_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
585 void p_bool_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* 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.ann2icl(ann)); \
595 rel(s, b0, op, b1, s.bv[ce[2]->getBoolVar()], s.ann2icl(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.ann2icl(ann)); \
602 } else if (ce[1]->isBool()) { \
603 rel(s, op, bv, ce[1]->getBool(), s.ann2icl(ann)); \
605 rel(s, op, bv, s.bv[ce[1]->getBoolVar()], s.ann2icl(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.ann2icl(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.ann2icl(ann));
701 rel(s, b1,
BOT_IMP, b0, s.bv[ce[2]->getBoolVar()], s.ann2icl(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.ann2icl(ann));
730 IntVarArgs iv = s.arg2intvarargs(ce[1], 1);
731 element(s, iv, selector, s.arg2IntVar(ce[2]), s.ann2icl(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.ann2icl(ann));
750 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 1);
751 element(s, iv, selector, s.arg2BoolVar(ce[2]), s.ann2icl(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.ann2icl(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.ann2icl(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.ann2icl(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.ann2icl(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.ann2icl(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.ann2icl(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.ann2icl(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.ann2icl(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.ann2icl(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());
956 IntVarArgs allvars = iv0+iv1;
958 count(s, allvars.slice(0,1,iv0.size()),
959 allvars.slice(iv0.size(),1,iv1.size()),
960 cover, s.ann2icl(ann));
963 count(s, iv0, iv1, cover, s.ann2icl(ann));
967 void p_global_cardinality_closed(FlatZincSpace& s,
const ConExpr& ce,
969 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
970 IntArgs cover = s.arg2intargs(ce[1]);
971 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
973 count(s, iv0, iv1, cover, s.ann2icl(ann));
976 void p_global_cardinality_low_up(FlatZincSpace& s,
const ConExpr& ce,
978 IntVarArgs x = s.arg2intvarargs(ce[0]);
979 IntArgs cover = s.arg2intargs(ce[1]);
981 IntArgs lbound = s.arg2intargs(ce[2]);
982 IntArgs ubound = s.arg2intargs(ce[3]);
984 for (
int i=cover.size(); i--;)
985 y[i] = IntSet(lbound[i],ubound[i]);
987 IntSet cover_s(cover);
989 IntVarRanges* xrs = re.alloc<IntVarRanges>(x.size());
990 for (
int i=x.size(); i--;)
992 Iter::Ranges::NaryUnion
u(re, xrs, x.size());
993 Iter::Ranges::ToValues<Iter::Ranges::NaryUnion> uv(
u);
995 if (!cover_s.in(uv.val())) {
997 y << IntSet(0,x.size());
1001 count(s, x, y, cover, s.ann2icl(ann));
1004 void p_global_cardinality_low_up_closed(FlatZincSpace& s,
1007 IntVarArgs x = s.arg2intvarargs(ce[0]);
1008 IntArgs cover = s.arg2intargs(ce[1]);
1010 IntArgs lbound = s.arg2intargs(ce[2]);
1011 IntArgs ubound = s.arg2intargs(ce[3]);
1013 for (
int i=cover.size(); i--;)
1014 y[i] = IntSet(lbound[i],ubound[i]);
1016 count(s, x, y, cover, s.ann2icl(ann));
1019 void p_minimum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1020 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1021 min(s, iv, s.arg2IntVar(ce[0]), s.ann2icl(ann));
1024 void p_maximum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1025 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1026 max(s, iv, s.arg2IntVar(ce[0]), s.ann2icl(ann));
1029 void p_minimum_arg(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1030 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1031 argmin(s, iv, s.arg2IntVar(ce[1]),
true, s.ann2icl(ann));
1034 void p_maximum_arg(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1035 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1036 argmax(s, iv, s.arg2IntVar(ce[1]),
true, s.ann2icl(ann));
1039 void p_regular(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1040 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1041 int q = ce[1]->getInt();
1042 int symbols = ce[2]->getInt();
1043 IntArgs d = s.arg2intargs(ce[3]);
1044 int q0 = ce[4]->getInt();
1047 for (
int i=1; i<=q; i++) {
1048 for (
int j=1; j<=symbols; j++) {
1049 if (d[(i-1)*symbols+(j-1)] > 0)
1055 DFA::Transition* t = re.alloc<DFA::Transition>(noOfTrans+1);
1057 for (
int i=1; i<=q; i++) {
1058 for (
int j=1; j<=symbols; j++) {
1059 if (d[(i-1)*symbols+(j-1)] > 0) {
1060 t[noOfTrans].i_state =
i;
1061 t[noOfTrans].symbol = j;
1062 t[noOfTrans].o_state = d[(i-1)*symbols+(j-1)];
1067 t[noOfTrans].i_state = -1;
1070 AST::SetLit* sl = ce[5]->getSet();
1073 f =
static_cast<int*
>(malloc(
sizeof(
int)*(sl->max-sl->min+2)));
1074 for (
int i=sl->min; i<=sl->
max; i++)
1076 f[sl->max-sl->min+1] = -1;
1078 f =
static_cast<int*
>(malloc(
sizeof(
int)*(sl->s.size()+1)));
1079 for (
int j=sl->s.size(); j--; )
1081 f[sl->s.size()] = -1;
1091 p_sort(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1092 IntVarArgs x = s.arg2intvarargs(ce[0]);
1093 IntVarArgs y = s.arg2intvarargs(ce[1]);
1094 IntVarArgs xy(x.size()+y.size());
1095 for (
int i=x.size(); i--;)
1097 for (
int i=y.size(); i--;)
1098 xy[i+x.size()] = y[
i];
1100 for (
int i=x.size(); i--;)
1102 for (
int i=y.size(); i--;)
1103 y[i] = xy[i+x.size()];
1104 sorted(s, x, y, s.ann2icl(ann));
1108 p_inverse_offsets(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1109 IntVarArgs x = s.arg2intvarargs(ce[0]);
1111 int xoff = ce[1]->getInt();
1112 IntVarArgs y = s.arg2intvarargs(ce[2]);
1114 int yoff = ce[3]->getInt();
1115 channel(s, x, xoff, y, yoff, s.ann2icl(ann));
1119 p_increasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1120 IntVarArgs x = s.arg2intvarargs(ce[0]);
1125 p_increasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1126 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1131 p_decreasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1132 IntVarArgs x = s.arg2intvarargs(ce[0]);
1137 p_decreasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1138 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1143 p_table_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1144 IntVarArgs x = s.arg2intvarargs(ce[0]);
1145 IntArgs tuples = s.arg2intargs(ce[1]);
1146 int noOfVars = x.size();
1147 int noOfTuples = tuples.size() == 0 ? 0 : (tuples.size()/noOfVars);
1149 for (
int i=0; i<noOfTuples; i++) {
1150 IntArgs
t(noOfVars);
1151 for (
int j=0; j<x.size(); j++) {
1152 t[j] = tuples[i*noOfVars+j];
1160 p_table_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1161 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1162 IntArgs tuples = s.arg2boolargs(ce[1]);
1163 int noOfVars = x.size();
1164 int noOfTuples = tuples.size() == 0 ? 0 : (tuples.size()/noOfVars);
1166 for (
int i=0; i<noOfTuples; i++) {
1167 IntArgs
t(noOfVars);
1168 for (
int j=0; j<x.size(); j++) {
1169 t[j] = tuples[i*noOfVars+j];
1177 void p_cumulative_opt(FlatZincSpace& s,
const ConExpr& ce,
1179 IntVarArgs start = s.arg2intvarargs(ce[0]);
1180 IntArgs duration = s.arg2intargs(ce[1]);
1181 IntArgs height = s.arg2intargs(ce[2]);
1182 BoolVarArgs
opt = s.arg2boolvarargs(ce[3]);
1183 int bound = ce[4]->getInt();
1185 cumulative(s,bound,start,duration,height,opt,s.ann2icl(ann));
1188 void p_cumulatives(FlatZincSpace& s,
const ConExpr& ce,
1190 IntVarArgs start = s.arg2intvarargs(ce[0]);
1191 IntVarArgs duration = s.arg2intvarargs(ce[1]);
1192 IntVarArgs height = s.arg2intvarargs(ce[2]);
1193 int n = start.size();
1194 IntVar bound = s.arg2IntVar(ce[3]);
1200 rel(s, height[0] <= bound);
1206 for (
int i=2; i<
n; i++) {
1207 if (height[i].
min() < minHeight) {
1208 minHeight2 = minHeight;
1209 minHeight = height[
i].min();
1210 }
else if (height[i].
min() < minHeight2) {
1211 minHeight2 = height[
i].min();
1215 (minHeight > bound.max()/2) ||
1216 (minHeight2 > bound.max()/2 && minHeight+minHeight2>bound.max());
1218 rel(s, bound >=
max(height));
1220 if (duration.assigned()) {
1221 IntArgs durationI(n);
1223 durationI[i] = duration[i].val();
1225 unary(s,start,durationI);
1229 end[i] =
expr(s,start[i]+duration[i]);
1231 unary(s,start,duration,end);
1233 }
else if (height.assigned()) {
1236 heightI[i] = height[i].val();
1237 if (duration.assigned()) {
1238 IntArgs durationI(n);
1240 durationI[i] = duration[i].val();
1241 cumulative(s, bound, start, durationI, heightI);
1244 for (
int i = n; i--; )
1245 end[i] =
expr(s,start[i]+duration[i]);
1246 cumulative(s, bound, start, duration, end, heightI);
1248 }
else if (bound.assigned()) {
1250 IntArgs limit(1, bound.val());
1253 end[i] =
expr(s,start[i]+duration[i]);
1254 cumulatives(s, machine, start, duration, end, height, limit,
true,
1259 IntVarArgs end(start.size());
1260 for (
int i = start.size(); i--; ) {
1263 end[
i] =
expr(s, start[i] + duration[i]);
1265 for (
int time = min; time <
max; ++time) {
1266 IntVarArgs
x(start.size());
1267 for (
int i = start.size(); i--; ) {
1268 IntVar overlaps =
channel(s,
expr(s, (start[i] <= time) &&
1270 x[
i] =
expr(s, overlaps * height[i]);
1277 void p_among_seq_int(FlatZincSpace& s,
const ConExpr& ce,
1279 IntVarArgs x = s.arg2intvarargs(ce[0]);
1280 IntSet S = s.arg2intset(ce[1]);
1281 int q = ce[2]->getInt();
1282 int l = ce[3]->getInt();
1283 int u = ce[4]->getInt();
1285 sequence(s, x, S, q, l, u, s.ann2icl(ann));
1288 void p_among_seq_bool(FlatZincSpace& s,
const ConExpr& ce,
1290 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1291 bool val = ce[1]->getBool();
1292 int q = ce[2]->getInt();
1293 int l = ce[3]->getInt();
1294 int u = ce[4]->getInt();
1297 sequence(s, x, S, q, l, u, s.ann2icl(ann));
1300 void p_schedule_unary(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1301 IntVarArgs x = s.arg2intvarargs(ce[0]);
1302 IntArgs
p = s.arg2intargs(ce[1]);
1307 void p_schedule_unary_optional(FlatZincSpace& s,
const ConExpr& ce,
1309 IntVarArgs x = s.arg2intvarargs(ce[0]);
1310 IntArgs p = s.arg2intargs(ce[1]);
1311 BoolVarArgs m = s.arg2boolvarargs(ce[2]);
1316 void p_circuit(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1317 int off = ce[0]->getInt();
1318 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1320 circuit(s,off,xv,s.ann2icl(ann));
1322 void p_circuit_cost_array(FlatZincSpace& s,
const ConExpr& ce,
1324 IntArgs
c = s.arg2intargs(ce[0]);
1325 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1326 IntVarArgs yv = s.arg2intvarargs(ce[2]);
1327 IntVar z = s.arg2IntVar(ce[3]);
1329 circuit(s,c,xv,yv,z,s.ann2icl(ann));
1331 void p_circuit_cost(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1332 IntArgs c = s.arg2intargs(ce[0]);
1333 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1334 IntVar z = s.arg2IntVar(ce[2]);
1336 circuit(s,c,xv,z,s.ann2icl(ann));
1339 void p_nooverlap(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1340 IntVarArgs x0 = s.arg2intvarargs(ce[0]);
1341 IntVarArgs w = s.arg2intvarargs(ce[1]);
1342 IntVarArgs y0 = s.arg2intvarargs(ce[2]);
1343 IntVarArgs h = s.arg2intvarargs(ce[3]);
1344 if (w.assigned() && h.assigned()) {
1345 IntArgs iw(w.size());
1346 for (
int i=w.size(); i--;)
1348 IntArgs ih(h.size());
1349 for (
int i=h.size(); i--;)
1351 nooverlap(s,x0,iw,y0,ih,s.ann2icl(ann));
1353 int miny = y0[0].min();
1354 int maxy = y0[0].max();
1356 for (
int i=1; i<y0.size(); i++) {
1361 int minx = x0[0].min();
1362 int maxx = x0[0].max();
1364 for (
int i=1; i<x0.size(); i++) {
1374 IntVarArgs x1(x0.size()), y1(y0.size());
1375 for (
int i=x0.size(); i--; )
1376 x1[i] =
expr(s, x0[i] + w[i]);
1377 for (
int i=y0.size(); i--; )
1378 y1[i] =
expr(s, y0[i] + h[i]);
1379 nooverlap(s,x0,w,x1,y0,h,y1,s.ann2icl(ann));
1383 void p_precede(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1384 IntVarArgs x = s.arg2intvarargs(ce[0]);
1385 int p_s = ce[1]->getInt();
1386 int p_t = ce[2]->getInt();
1387 precede(s,x,p_s,p_t,s.ann2icl(ann));
1390 void p_nvalue(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1391 IntVarArgs x = s.arg2intvarargs(ce[1]);
1392 if (ce[0]->isIntVar()) {
1393 IntVar y = s.arg2IntVar(ce[0]);
1400 void p_among(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1401 IntVarArgs x = s.arg2intvarargs(ce[1]);
1402 IntSet
v = s.arg2intset(ce[2]);
1403 if (ce[0]->isIntVar()) {
1404 IntVar n = s.arg2IntVar(ce[0]);
1409 count(s,x,v,
IRT_EQ,ce[0]->getInt(),s.ann2icl(ann));
1413 void p_member_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1414 IntVarArgs x = s.arg2intvarargs(ce[0]);
1415 IntVar y = s.arg2IntVar(ce[1]);
1416 member(s,x,y,s.ann2icl(ann));
1418 void p_member_int_reif(FlatZincSpace& s,
const ConExpr& ce,
1420 IntVarArgs x = s.arg2intvarargs(ce[0]);
1421 IntVar y = s.arg2IntVar(ce[1]);
1422 BoolVar b = s.arg2BoolVar(ce[2]);
1423 member(s,x,y,b,s.ann2icl(ann));
1425 void p_member_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1426 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1427 BoolVar y = s.arg2BoolVar(ce[1]);
1428 member(s,x,y,s.ann2icl(ann));
1430 void p_member_bool_reif(FlatZincSpace& s,
const ConExpr& ce,
1432 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1433 BoolVar y = s.arg2BoolVar(ce[1]);
1434 member(s,x,y,s.arg2BoolVar(ce[2]),s.ann2icl(ann));
1441 registry().
add(
"all_different_offset", &p_distinctOffset);
1462 registry().
add(
"int_lin_eq_reif", &p_int_lin_eq_reif);
1463 registry().
add(
"int_lin_eq_imp", &p_int_lin_eq_imp);
1465 registry().
add(
"int_lin_ne_reif", &p_int_lin_ne_reif);
1466 registry().
add(
"int_lin_ne_imp", &p_int_lin_ne_imp);
1468 registry().
add(
"int_lin_le_reif", &p_int_lin_le_reif);
1469 registry().
add(
"int_lin_le_imp", &p_int_lin_le_imp);
1471 registry().
add(
"int_lin_lt_reif", &p_int_lin_lt_reif);
1472 registry().
add(
"int_lin_lt_imp", &p_int_lin_lt_imp);
1474 registry().
add(
"int_lin_ge_reif", &p_int_lin_ge_reif);
1475 registry().
add(
"int_lin_ge_imp", &p_int_lin_ge_imp);
1477 registry().
add(
"int_lin_gt_reif", &p_int_lin_gt_reif);
1478 registry().
add(
"int_lin_gt_imp", &p_int_lin_gt_imp);
1512 registry().
add(
"array_bool_and", &p_array_bool_and);
1513 registry().
add(
"array_bool_and_imp", &p_array_bool_and_imp);
1514 registry().
add(
"array_bool_or", &p_array_bool_or);
1515 registry().
add(
"array_bool_or_imp", &p_array_bool_or_imp);
1516 registry().
add(
"array_bool_xor", &p_array_bool_xor);
1517 registry().
add(
"array_bool_xor_imp", &p_array_bool_xor_imp);
1518 registry().
add(
"bool_clause", &p_array_bool_clause);
1519 registry().
add(
"bool_clause_reif", &p_array_bool_clause_reif);
1520 registry().
add(
"bool_clause_imp", &p_array_bool_clause_imp);
1524 registry().
add(
"array_int_element", &p_array_int_element);
1525 registry().
add(
"array_var_int_element", &p_array_int_element);
1526 registry().
add(
"array_bool_element", &p_array_bool_element);
1527 registry().
add(
"array_var_bool_element", &p_array_bool_element);
1532 #ifndef GECODE_HAS_SET_VARS
1540 registry().
add(
"array_bool_lt", &p_array_bool_lt);
1541 registry().
add(
"array_bool_lq", &p_array_bool_lq);
1547 registry().
add(
"gecode_bin_packing_load", &p_bin_packing_load);
1548 registry().
add(
"global_cardinality", &p_global_cardinality);
1550 &p_global_cardinality_closed);
1552 &p_global_cardinality_low_up);
1553 registry().
add(
"global_cardinality_low_up_closed",
1554 &p_global_cardinality_low_up_closed);
1557 registry().
add(
"gecode_minimum_arg_int", &p_minimum_arg);
1558 registry().
add(
"gecode_maximum_arg_int", &p_maximum_arg);
1562 registry().
add(
"inverse_offsets", &p_inverse_offsets);
1563 registry().
add(
"increasing_int", &p_increasing_int);
1564 registry().
add(
"increasing_bool", &p_increasing_bool);
1565 registry().
add(
"decreasing_int", &p_decreasing_int);
1566 registry().
add(
"decreasing_bool", &p_decreasing_bool);
1570 registry().
add(
"gecode_among_seq_int", &p_among_seq_int);
1571 registry().
add(
"gecode_among_seq_bool", &p_among_seq_bool);
1580 registry().
add(
"bool_lin_eq_reif", &p_bool_lin_eq_reif);
1581 registry().
add(
"bool_lin_eq_imp", &p_bool_lin_eq_imp);
1582 registry().
add(
"bool_lin_ne_reif", &p_bool_lin_ne_reif);
1583 registry().
add(
"bool_lin_ne_imp", &p_bool_lin_ne_imp);
1584 registry().
add(
"bool_lin_le_reif", &p_bool_lin_le_reif);
1585 registry().
add(
"bool_lin_le_imp", &p_bool_lin_le_imp);
1586 registry().
add(
"bool_lin_lt_reif", &p_bool_lin_lt_reif);
1587 registry().
add(
"bool_lin_lt_imp", &p_bool_lin_lt_imp);
1588 registry().
add(
"bool_lin_ge_reif", &p_bool_lin_ge_reif);
1589 registry().
add(
"bool_lin_ge_imp", &p_bool_lin_ge_imp);
1590 registry().
add(
"bool_lin_gt_reif", &p_bool_lin_gt_reif);
1591 registry().
add(
"bool_lin_gt_imp", &p_bool_lin_gt_imp);
1593 registry().
add(
"gecode_schedule_unary", &p_schedule_unary);
1594 registry().
add(
"gecode_schedule_unary_optional", &p_schedule_unary_optional);
1595 registry().
add(
"gecode_schedule_cumulative_optional", &p_cumulative_opt);
1598 registry().
add(
"gecode_circuit_cost_array", &p_circuit_cost_array);
1599 registry().
add(
"gecode_circuit_cost", &p_circuit_cost);
1605 registry().
add(
"gecode_member_int_reif",&p_member_int_reif);
1607 registry().
add(
"gecode_member_bool_reif",&p_member_bool_reif);
1610 IntPoster __int_poster;
1612 #ifdef GECODE_HAS_SET_VARS
1613 void p_set_OP(FlatZincSpace& s,
SetOpType op,
1614 const ConExpr& ce, AST::Node *) {
1615 rel(s, s.arg2SetVar(ce[0]), op, s.arg2SetVar(ce[1]),
1616 SRT_EQ, s.arg2SetVar(ce[2]));
1618 void p_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1621 void p_set_intersect(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1624 void p_set_diff(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1628 void p_set_symdiff(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1629 SetVar x = s.arg2SetVar(ce[0]);
1630 SetVar y = s.arg2SetVar(ce[1]);
1632 SetVarLubRanges xub(x);
1637 SetVarLubRanges yub(y);
1645 void p_array_set_OP(FlatZincSpace& s,
SetOpType op,
1646 const ConExpr& ce, AST::Node *) {
1647 SetVarArgs xs = s.arg2setvarargs(ce[0]);
1648 rel(s, op, xs, s.arg2SetVar(ce[1]));
1650 void p_array_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1653 void p_array_set_partition(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1658 void p_set_rel(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1659 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]));
1662 void p_set_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1663 p_set_rel(s,
SRT_EQ, ce);
1665 void p_set_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1666 p_set_rel(s,
SRT_NQ, ce);
1668 void p_set_subset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1671 void p_set_superset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1674 void p_set_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1675 p_set_rel(s,
SRT_LQ, ce);
1677 void p_set_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1678 p_set_rel(s,
SRT_LE, ce);
1680 void p_set_card(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1681 if (!ce[1]->isIntVar()) {
1682 cardinality(s, s.arg2SetVar(ce[0]), ce[1]->getInt(),
1685 cardinality(s, s.arg2SetVar(ce[0]), s.arg2IntVar(ce[1]));
1688 void p_set_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1689 if (!ce[1]->isSetVar()) {
1690 IntSet d = s.arg2intset(ce[1]);
1691 if (ce[0]->isBoolVar()) {
1693 Iter::Ranges::Singleton sr(0,1);
1694 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
1696 if (d01.size() == 0) {
1699 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
1700 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
1703 dom(s, s.arg2IntVar(ce[0]),
d);
1706 if (!ce[0]->isIntVar()) {
1707 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt());
1709 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]));
1713 void p_set_rel_reif(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1714 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]),
1715 s.arg2BoolVar(ce[2]));
1718 void p_set_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1719 p_set_rel_reif(s,
SRT_EQ,ce);
1721 void p_set_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1722 p_set_rel_reif(s,
SRT_LQ,ce);
1724 void p_set_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1725 p_set_rel_reif(s,
SRT_LE,ce);
1727 void p_set_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1728 p_set_rel_reif(s,
SRT_NQ,ce);
1730 void p_set_subset_reif(FlatZincSpace& s,
const ConExpr& ce,
1734 void p_set_superset_reif(FlatZincSpace& s,
const ConExpr& ce,
1738 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann,
ReifyMode rm) {
1739 if (!ce[1]->isSetVar()) {
1741 p_int_in_reif(s,ce,ann);
1744 p_int_in_imp(s,ce,ann);
1747 if (!ce[0]->isIntVar()) {
1748 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt(),
1749 Reify(s.arg2BoolVar(ce[2]),rm));
1751 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]),
1752 Reify(s.arg2BoolVar(ce[2]),rm));
1756 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1757 p_set_in_reif(s,ce,ann,
RM_EQV);
1759 void p_set_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1760 p_set_in_reif(s,ce,ann,
RM_IMP);
1762 void p_set_disjoint(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1763 rel(s, s.arg2SetVar(ce[0]),
SRT_DISJ, s.arg2SetVar(ce[1]));
1766 void p_link_set_to_booleans(FlatZincSpace& s,
const ConExpr& ce,
1768 SetVar x = s.arg2SetVar(ce[0]);
1769 int idx = ce[2]->getInt();
1772 BoolVarArgs y = s.arg2boolvarargs(ce[1],idx);
1777 void p_array_set_element(FlatZincSpace& s,
const ConExpr& ce,
1779 bool isConstant =
true;
1780 AST::Array* a = ce[1]->getArray();
1781 for (
int i=a->a.size(); i--;) {
1782 if (a->a[i]->isSetVar()) {
1787 IntVar selector = s.arg2IntVar(ce[0]);
1788 rel(s, selector > 0);
1791 element(s, sv, selector, s.arg2SetVar(ce[2]));
1793 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1794 element(s, sv, selector, s.arg2SetVar(ce[2]));
1798 void p_array_set_element_op(FlatZincSpace& s,
const ConExpr& ce,
1800 const IntSet& universe =
1802 bool isConstant =
true;
1803 AST::Array* a = ce[1]->getArray();
1804 for (
int i=a->a.size(); i--;) {
1805 if (a->a[i]->isSetVar()) {
1810 SetVar selector = s.arg2SetVar(ce[0]);
1814 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1816 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1817 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1821 void p_array_set_element_union(FlatZincSpace& s,
const ConExpr& ce,
1823 p_array_set_element_op(s, ce, ann,
SOT_UNION);
1826 void p_array_set_element_intersect(FlatZincSpace& s,
const ConExpr& ce,
1828 p_array_set_element_op(s, ce, ann,
SOT_INTER);
1831 void p_array_set_element_intersect_in(FlatZincSpace& s,
1834 IntSet d = s.arg2intset(ce[3]);
1835 p_array_set_element_op(s, ce, ann,
SOT_INTER, d);
1838 void p_array_set_element_partition(FlatZincSpace& s,
const ConExpr& ce,
1840 p_array_set_element_op(s, ce, ann,
SOT_DUNION);
1843 void p_set_convex(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1844 convex(s, s.arg2SetVar(ce[0]));
1847 void p_array_set_seq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1848 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1852 void p_array_set_seq_union(FlatZincSpace& s,
const ConExpr& ce,
1854 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1855 sequence(s, sv, s.arg2SetVar(ce[1]));
1858 void p_int_set_channel(FlatZincSpace& s,
const ConExpr& ce,
1860 int xoff=ce[1]->getInt();
1862 int yoff=ce[3]->getInt();
1864 IntVarArgs xv = s.arg2intvarargs(ce[0], xoff);
1865 SetVarArgs yv = s.arg2setvarargs(ce[2], yoff, 1, IntSet(0, xoff-1));
1866 IntSet xd(yoff,yv.size()-1);
1867 for (
int i=xoff; i<xv.size(); i++) {
1870 IntSet yd(xoff,xv.size()-1);
1871 for (
int i=yoff; i<yv.size(); i++) {
1877 void p_range(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1878 int xoff=ce[1]->getInt();
1880 IntVarArgs xv = s.arg2intvarargs(ce[0],xoff);
1884 void p_weights(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1885 IntArgs e = s.arg2intargs(ce[0]);
1886 IntArgs w = s.arg2intargs(ce[1]);
1887 SetVar x = s.arg2SetVar(ce[2]);
1888 IntVar y = s.arg2IntVar(ce[3]);
1892 void p_inverse_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1893 int xoff = ce[2]->getInt();
1894 int yoff = ce[3]->getInt();
1895 SetVarArgs x = s.arg2setvarargs(ce[0],xoff);
1896 SetVarArgs y = s.arg2setvarargs(ce[1],yoff);
1900 void p_precede_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1901 SetVarArgs x = s.arg2setvarargs(ce[0]);
1902 int p_s = ce[1]->getInt();
1903 int p_t = ce[2]->getInt();
1916 registry().
add(
"array_set_element", &p_array_set_element);
1917 registry().
add(
"array_var_set_element", &p_array_set_element);
1918 registry().
add(
"set_intersect", &p_set_intersect);
1930 registry().
add(
"set_subset_reif", &p_set_subset_reif);
1931 registry().
add(
"set_superset_reif", &p_set_superset_reif);
1936 &p_link_set_to_booleans);
1938 registry().
add(
"array_set_union", &p_array_set_union);
1939 registry().
add(
"array_set_partition", &p_array_set_partition);
1941 registry().
add(
"array_set_seq", &p_array_set_seq);
1942 registry().
add(
"array_set_seq_union", &p_array_set_seq_union);
1944 &p_array_set_element_union);
1945 registry().
add(
"gecode_array_set_element_intersect",
1946 &p_array_set_element_intersect);
1947 registry().
add(
"gecode_array_set_element_intersect_in",
1948 &p_array_set_element_intersect_in);
1949 registry().
add(
"gecode_array_set_element_partition",
1950 &p_array_set_element_partition);
1952 &p_int_set_channel);
1957 registry().
add(
"gecode_inverse_set", &p_inverse_set);
1958 registry().
add(
"gecode_precede_set", &p_precede_set);
1961 SetPoster __set_poster;
1964 #ifdef GECODE_HAS_FLOAT_VARS
1966 void p_int2float(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1967 IntVar x0 = s.arg2IntVar(ce[0]);
1968 FloatVar x1 = s.arg2FloatVar(ce[1]);
1972 void p_float_lin_cmp(FlatZincSpace& s,
FloatRelType frt,
1973 const ConExpr& ce, AST::Node*) {
1974 FloatValArgs fa = s.arg2floatargs(ce[0]);
1975 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1976 linear(s, fa, fv, frt, ce[2]->getFloat());
1978 void p_float_lin_cmp_reif(FlatZincSpace& s,
FloatRelType frt,
1979 const ConExpr& ce, AST::Node*) {
1980 FloatValArgs fa = s.arg2floatargs(ce[0]);
1981 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1982 linear(s, fa, fv, frt, ce[2]->getFloat(), s.arg2BoolVar(ce[3]));
1984 void p_float_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1985 p_float_lin_cmp(s,
FRT_EQ,ce,ann);
1987 void p_float_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce,
1989 p_float_lin_cmp_reif(s,
FRT_EQ,ce,ann);
1991 void p_float_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1992 p_float_lin_cmp(s,
FRT_LQ,ce,ann);
1994 void p_float_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce,
1996 p_float_lin_cmp_reif(s,
FRT_LQ,ce,ann);
1999 void p_float_times(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2000 FloatVar x = s.arg2FloatVar(ce[0]);
2001 FloatVar y = s.arg2FloatVar(ce[1]);
2002 FloatVar z = s.arg2FloatVar(ce[2]);
2006 void p_float_div(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2007 FloatVar x = s.arg2FloatVar(ce[0]);
2008 FloatVar y = s.arg2FloatVar(ce[1]);
2009 FloatVar z = s.arg2FloatVar(ce[2]);
2013 void p_float_plus(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2014 FloatVar x = s.arg2FloatVar(ce[0]);
2015 FloatVar y = s.arg2FloatVar(ce[1]);
2016 FloatVar z = s.arg2FloatVar(ce[2]);
2020 void p_float_sqrt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2021 FloatVar x = s.arg2FloatVar(ce[0]);
2022 FloatVar y = s.arg2FloatVar(ce[1]);
2026 void p_float_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2027 FloatVar x = s.arg2FloatVar(ce[0]);
2028 FloatVar y = s.arg2FloatVar(ce[1]);
2032 void p_float_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2033 FloatVar x = s.arg2FloatVar(ce[0]);
2034 FloatVar y = s.arg2FloatVar(ce[1]);
2037 void p_float_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2038 FloatVar x = s.arg2FloatVar(ce[0]);
2039 FloatVar y = s.arg2FloatVar(ce[1]);
2040 BoolVar b = s.arg2BoolVar(ce[2]);
2043 void p_float_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2044 FloatVar x = s.arg2FloatVar(ce[0]);
2045 FloatVar y = s.arg2FloatVar(ce[1]);
2048 void p_float_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2049 FloatVar x = s.arg2FloatVar(ce[0]);
2050 FloatVar y = s.arg2FloatVar(ce[1]);
2051 BoolVar b = s.arg2BoolVar(ce[2]);
2054 void p_float_max(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2055 FloatVar x = s.arg2FloatVar(ce[0]);
2056 FloatVar y = s.arg2FloatVar(ce[1]);
2057 FloatVar z = s.arg2FloatVar(ce[2]);
2060 void p_float_min(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2061 FloatVar x = s.arg2FloatVar(ce[0]);
2062 FloatVar y = s.arg2FloatVar(ce[1]);
2063 FloatVar z = s.arg2FloatVar(ce[2]);
2066 void p_float_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2067 FloatVar x = s.arg2FloatVar(ce[0]);
2068 FloatVar y = s.arg2FloatVar(ce[1]);
2073 void p_float_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2074 FloatVar x = s.arg2FloatVar(ce[0]);
2075 FloatVar y = s.arg2FloatVar(ce[1]);
2076 BoolVar b = s.arg2BoolVar(ce[2]);
2079 rel(s, b == (b0 && !b1));
2084 void p_float_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2085 FloatVar x = s.arg2FloatVar(ce[0]);
2086 FloatVar y = s.arg2FloatVar(ce[1]);
2090 #ifdef GECODE_HAS_MPFR
2091 #define P_FLOAT_OP(Op) \
2092 void p_float_ ## Op (FlatZincSpace& s, const ConExpr& ce, AST::Node*) {\
2093 FloatVar x = s.arg2FloatVar(ce[0]);\
2094 FloatVar y = s.arg2FloatVar(ce[1]);\
2109 void p_float_ln(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2110 FloatVar x = s.arg2FloatVar(ce[0]);
2111 FloatVar y = s.arg2FloatVar(ce[1]);
2114 void p_float_log10(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2115 FloatVar x = s.arg2FloatVar(ce[0]);
2116 FloatVar y = s.arg2FloatVar(ce[1]);
2119 void p_float_log2(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2120 FloatVar x = s.arg2FloatVar(ce[0]);
2121 FloatVar y = s.arg2FloatVar(ce[1]);
2147 registry().
add(
"float_lin_eq_reif",&p_float_lin_eq_reif);
2149 registry().
add(
"float_lin_le_reif",&p_float_lin_le_reif);
2151 #ifdef GECODE_HAS_MPFR
static IntArgs create(int n, int start, int inc=1)
Allocate array with n elements such that for all .
void cumulative(Home home, Cap c, const TaskTypeArgs &t, const IntVarArgs &s, const IntArgs &p, const IntArgs &u, IntConLevel icl)
SetRelType
Common relation types for sets.
IntConLevel
Consistency levels for integer propagators.
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 .
void post(FlatZincSpace &s, const ConExpr &ce)
Post constraint specified by ce.
void mod(Home home, IntVar x0, IntVar x1, IntVar x2, IntConLevel icl)
Post propagator for .
const int min
Smallest allowed integer in integer set.
Map from constraint identifier to constraint posting functions.
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.
int size(void) const
Return size of array (number of elements)
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
void abs(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
SetOpType
Common operations for sets.
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.
void argmin(Home home, const IntVarArgs &x, IntVar y, bool tiebreak, IntConLevel)
Post propagator for .
void sequence(Home home, const IntVarArgs &x, const IntSet &s, int q, int l, int u, IntConLevel)
Post propagator for .
void argmax(Home home, const IntVarArgs &x, IntVar y, bool tiebreak, IntConLevel)
Post propagator for .
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)
int n
Number of negative literals for node type.
IntRelType
Relation types for integers.
FloatRelType
Relation types for floats.
void clause(Home home, BoolOpType o, const BoolVarArgs &x, const BoolVarArgs &y, int n, IntConLevel)
Post domain consistent propagator for Boolean clause with positive variables x and negative variables...
void sqrt(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void unshare(Home home, IntVarArgs &x, IntConLevel icl)
Replace multiple variable occurences in x by fresh variables.
void precede(Home home, const IntVarArgs &x, int s, int t, IntConLevel)
Post propagator that s precedes t in x.
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, IntConLevel cl)
Post propagators for the cumulatives constraint.
void element(Home home, IntSharedArray c, IntVar x0, IntVar x1, IntConLevel)
Post domain consistent propagator for .
void asin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
AST::Array * ann
Constraint annotations.
void sorted(Home home, const IntVarArgs &x, const IntVarArgs &y, const IntVarArgs &z, IntConLevel)
Post propagator that y is x sorted in increasing order.
static const IntSet empty
Empty set.
LinIntExpr cardinality(const SetExpr &e)
Cardinality of set expression.
union Gecode::@518::NNF::@57 u
Union depending on nodetype t.
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
void extensional(Home home, const IntVarArgs &x, DFA dfa, IntConLevel)
Post domain consistent propagator for extensional constraint described by a DFA.
void cos(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
BoolVar expr(Home home, const BoolExpr &e, IntConLevel icl)
Post Boolean expression and return its value.
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 count(Home home, const IntVarArgs &x, int n, IntRelType irt, int m, IntConLevel)
Post propagator for .
void convex(Home home, SetVar x)
Post propagator that propagates that x is convex.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
Exception class for FlatZinc errors
The default consistency for a constraint.
void weights(Home home, IntSharedArray elements, IntSharedArray weights, SetVar x, IntVar y)
Post propagator for .
void distinct(Home home, const IntVarArgs &x, IntConLevel icl)
Post propagator for for all .
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.
void binpacking(Home home, const IntVarArgs &l, const IntVarArgs &b, const IntArgs &s, IntConLevel)
Post propagator for bin packing.
Bounds propagation or consistency.
void nooverlap(Home home, const IntVarArgs &x, const IntArgs &w, const IntVarArgs &y, const IntArgs &h, IntConLevel)
Post propagator for rectangle packing.
struct Gecode::@518::NNF::@57::@58 b
For binary nodes (and, or, eqv)
Gecode toplevel namespace
Implication for reification.
void sin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void acos(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void exp(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
void circuit(Home home, int offset, const IntVarArgs &x, IntConLevel icl)
Post propagator such that x forms a circuit.
ReifyMode
Mode for reification.
void nvalues(Home home, const IntVarArgs &x, IntRelType irt, int y, IntConLevel)
Post propagator for .
void member(Home home, const IntVarArgs &x, IntVar y, IntConLevel)
Post domain consistent propagator for .
struct Gecode::@518::NNF::@57::@59 a
For atomic nodes.
Domain propagation or consistency.
void unary(Home home, const IntVarArgs &s, const IntArgs &p, IntConLevel icl)
Post propagators for scheduling tasks on unary resources.
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.
Equivalence for reification (default)
Abstract representation of a constraint.