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);
86 void p_distinctOffset(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
89 AST::Array* offs = ce.args->a[0]->getArray();
91 for (
int i=offs->a.size();
i--; ) {
92 oa[
i] = offs->a[
i]->getInt();
98 void p_all_equal(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
99 IntVarArgs va = s.arg2intvarargs(ce[0]);
103 void p_int_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
105 if (ce[0]->isIntVar()) {
106 if (ce[1]->isIntVar()) {
107 rel(s, s.arg2IntVar(ce[0]), irt, s.arg2IntVar(ce[1]),
110 rel(s, s.arg2IntVar(ce[0]), irt, ce[1]->getInt(), s.ann2ipl(ann));
113 rel(s, s.arg2IntVar(ce[1]),
swap(irt), ce[0]->getInt(),
117 void p_int_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
118 p_int_CMP(s,
IRT_EQ, ce, ann);
120 void p_int_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
121 p_int_CMP(s,
IRT_NQ, ce, ann);
123 void p_int_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
124 p_int_CMP(s,
IRT_GQ, ce, ann);
126 void p_int_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
127 p_int_CMP(s,
IRT_GR, ce, ann);
129 void p_int_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
130 p_int_CMP(s,
IRT_LQ, ce, ann);
132 void p_int_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
133 p_int_CMP(s,
IRT_LE, ce, ann);
136 const ConExpr& ce, AST::Node* 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()) {
147 rel(s, s.arg2IntVar(ce[0]), irt, s.arg2IntVar(ce[1]),
148 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
150 rel(s, s.arg2IntVar(ce[0]), irt, ce[1]->getInt(),
151 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
154 rel(s, s.arg2IntVar(ce[1]),
swap(irt), ce[0]->getInt(),
155 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
160 void p_int_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
163 void p_int_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
166 void p_int_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
169 void p_int_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
172 void p_int_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
175 void p_int_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
179 void p_int_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
182 void p_int_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
185 void p_int_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
188 void p_int_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
191 void p_int_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
194 void p_int_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
199 void p_int_lin_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
201 IntArgs ia = s.arg2intargs(ce[0]);
203 if (s.isBoolArray(ce[1],singleIntVar)) {
204 if (singleIntVar != -1) {
205 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
206 IntVar siv = s.arg2IntVar(ce[1]->getArray()->
a[singleIntVar]);
207 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar);
208 IntArgs ia_tmp(ia.size()-1);
210 for (
int i=0;
i<ia.size();
i++) {
211 if (
i != singleIntVar)
212 ia_tmp[
count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
215 linear(s, ia_tmp, iv,
t, siv, s.ann2ipl(ann));
217 IntVarArgs iv = s.arg2intvarargs(ce[1]);
218 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
221 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
222 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
225 IntVarArgs iv = s.arg2intvarargs(ce[1]);
226 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
230 const ConExpr& ce, AST::Node* ann) {
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);
239 IntArgs ia = s.arg2intargs(ce[0]);
241 if (s.isBoolArray(ce[1],singleIntVar)) {
242 if (singleIntVar != -1) {
243 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
244 IntVar siv = s.arg2IntVar(ce[1]->getArray()->
a[singleIntVar]);
245 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar);
246 IntArgs ia_tmp(ia.size()-1);
248 for (
int i=0;
i<ia.size();
i++) {
249 if (
i != singleIntVar)
250 ia_tmp[
count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
253 linear(s, ia_tmp, iv,
t, siv, Reify(s.arg2BoolVar(ce[3]), rm),
256 IntVarArgs iv = s.arg2intvarargs(ce[1]);
257 linear(s, ia, iv, irt, ce[2]->getInt(),
258 Reify(s.arg2BoolVar(ce[3]), rm), s.ann2ipl(ann));
261 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
262 linear(s, ia, iv, irt, ce[2]->getInt(),
263 Reify(s.arg2BoolVar(ce[3]), rm), s.ann2ipl(ann));
266 IntVarArgs iv = s.arg2intvarargs(ce[1]);
267 linear(s, ia, iv, irt, ce[2]->getInt(),
268 Reify(s.arg2BoolVar(ce[3]), rm),
272 void p_int_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
273 p_int_lin_CMP(s,
IRT_EQ, ce, ann);
275 void p_int_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
278 void p_int_lin_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
281 void p_int_lin_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
282 p_int_lin_CMP(s,
IRT_NQ, ce, ann);
284 void p_int_lin_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
287 void p_int_lin_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
290 void p_int_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
291 p_int_lin_CMP(s,
IRT_LQ, ce, ann);
293 void p_int_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
296 void p_int_lin_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
299 void p_int_lin_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
300 p_int_lin_CMP(s,
IRT_LE, ce, ann);
302 void p_int_lin_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
305 void p_int_lin_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
308 void p_int_lin_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
309 p_int_lin_CMP(s,
IRT_GQ, ce, ann);
311 void p_int_lin_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
314 void p_int_lin_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
317 void p_int_lin_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
318 p_int_lin_CMP(s,
IRT_GR, ce, ann);
320 void p_int_lin_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
323 void p_int_lin_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
327 void p_bool_lin_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
329 IntArgs ia = s.arg2intargs(ce[0]);
330 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
331 if (ce[2]->isIntVar())
332 linear(s, ia, iv, irt, s.iv[ce[2]->getIntVar()], s.ann2ipl(ann));
334 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2ipl(ann));
337 const ConExpr& ce, AST::Node* ann) {
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);
346 IntArgs ia = s.arg2intargs(ce[0]);
347 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
348 if (ce[2]->isIntVar())
349 linear(s, ia, iv, irt, s.iv[ce[2]->getIntVar()],
350 Reify(s.arg2BoolVar(ce[3]), rm),
353 linear(s, ia, iv, irt, ce[2]->getInt(),
354 Reify(s.arg2BoolVar(ce[3]), rm),
357 void p_bool_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
358 p_bool_lin_CMP(s,
IRT_EQ, ce, ann);
360 void p_bool_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
364 void p_bool_lin_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
368 void p_bool_lin_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
369 p_bool_lin_CMP(s,
IRT_NQ, ce, ann);
371 void p_bool_lin_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
375 void p_bool_lin_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
379 void p_bool_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
380 p_bool_lin_CMP(s,
IRT_LQ, ce, ann);
382 void p_bool_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
386 void p_bool_lin_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
390 void p_bool_lin_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
392 p_bool_lin_CMP(s,
IRT_LE, ce, ann);
394 void p_bool_lin_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
398 void p_bool_lin_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
402 void p_bool_lin_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
403 p_bool_lin_CMP(s,
IRT_GQ, ce, ann);
405 void p_bool_lin_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
409 void p_bool_lin_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
413 void p_bool_lin_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
414 p_bool_lin_CMP(s,
IRT_GR, ce, ann);
416 void p_bool_lin_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
420 void p_bool_lin_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
427 void p_int_plus(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
428 if (!ce[0]->isIntVar()) {
429 rel(s, ce[0]->getInt() + s.arg2IntVar(ce[1])
430 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
431 }
else if (!ce[1]->isIntVar()) {
432 rel(s, s.arg2IntVar(ce[0]) + ce[1]->getInt()
433 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
434 }
else if (!ce[2]->isIntVar()) {
435 rel(s, s.arg2IntVar(ce[0]) + s.arg2IntVar(ce[1])
436 == ce[2]->getInt(), s.ann2ipl(ann));
438 rel(s, s.arg2IntVar(ce[0]) + s.arg2IntVar(ce[1])
439 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
443 void p_int_minus(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
444 if (!ce[0]->isIntVar()) {
445 rel(s, ce[0]->getInt() - s.arg2IntVar(ce[1])
446 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
447 }
else if (!ce[1]->isIntVar()) {
448 rel(s, s.arg2IntVar(ce[0]) - ce[1]->getInt()
449 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
450 }
else if (!ce[2]->isIntVar()) {
451 rel(s, s.arg2IntVar(ce[0]) - s.arg2IntVar(ce[1])
452 == ce[2]->getInt(), s.ann2ipl(ann));
454 rel(s, s.arg2IntVar(ce[0]) - s.arg2IntVar(ce[1])
455 == s.arg2IntVar(ce[2]), s.ann2ipl(ann));
459 void p_int_times(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
460 IntVar x0 = s.arg2IntVar(ce[0]);
461 IntVar x1 = s.arg2IntVar(ce[1]);
462 IntVar x2 = s.arg2IntVar(ce[2]);
463 mult(s, x0, x1, x2, s.ann2ipl(ann));
465 void p_int_div(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
466 IntVar x0 = s.arg2IntVar(ce[0]);
467 IntVar x1 = s.arg2IntVar(ce[1]);
468 IntVar x2 = s.arg2IntVar(ce[2]);
469 div(s,x0,x1,x2, s.ann2ipl(ann));
471 void p_int_mod(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
472 IntVar x0 = s.arg2IntVar(ce[0]);
473 IntVar x1 = s.arg2IntVar(ce[1]);
474 IntVar x2 = s.arg2IntVar(ce[2]);
475 mod(s,x0,x1,x2, s.ann2ipl(ann));
478 void p_int_min(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
479 IntVar x0 = s.arg2IntVar(ce[0]);
480 IntVar x1 = s.arg2IntVar(ce[1]);
481 IntVar x2 = s.arg2IntVar(ce[2]);
482 min(s, x0, x1, x2, s.ann2ipl(ann));
484 void p_int_max(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
485 IntVar x0 = s.arg2IntVar(ce[0]);
486 IntVar x1 = s.arg2IntVar(ce[1]);
487 IntVar x2 = s.arg2IntVar(ce[2]);
488 max(s, x0, x1, x2, s.ann2ipl(ann));
490 void p_int_negate(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
491 IntVar x0 = s.arg2IntVar(ce[0]);
492 IntVar x1 = s.arg2IntVar(ce[1]);
493 rel(s, x0 == -x1, s.ann2ipl(ann));
497 void p_bool_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
499 rel(s, s.arg2BoolVar(ce[0]), irt, s.arg2BoolVar(ce[1]),
503 const ConExpr& ce, AST::Node* ann) {
504 rel(s, s.arg2BoolVar(ce[0]), irt, s.arg2BoolVar(ce[1]),
505 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2ipl(ann));
507 void p_bool_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
508 p_bool_CMP(s,
IRT_EQ, ce, ann);
510 void p_bool_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
513 void p_bool_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
516 void p_bool_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
517 p_bool_CMP(s,
IRT_NQ, ce, ann);
519 void p_bool_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
522 void p_bool_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
525 void p_bool_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
526 p_bool_CMP(s,
IRT_GQ, ce, ann);
528 void p_bool_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
531 void p_bool_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
534 void p_bool_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
535 p_bool_CMP(s,
IRT_LQ, ce, ann);
537 void p_bool_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
540 void p_bool_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
543 void p_bool_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
544 p_bool_CMP(s,
IRT_GR, ce, ann);
546 void p_bool_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
549 void p_bool_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
552 void p_bool_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
553 p_bool_CMP(s,
IRT_LE, ce, ann);
555 void p_bool_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
558 void p_bool_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* 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]);
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]);
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]);
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--;)
1073 xy[
i+
x.size()] =
y[
i];
1075 for (
int i=
x.size();
i--;)
1077 for (
int i=
y.size();
i--;)
1078 y[
i] = xy[
i+
x.size()];
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();
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();
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]);
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]);
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]);
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]);
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]);
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]);
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