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, ann);
107 void p_distinct(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
108 IntVarArgs va = s.arg2intvarargs(ce[0]);
112 void p_distinctOffset(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
113 IntVarArgs va = s.arg2intvarargs(ce[1]);
114 AST::Array* offs = ce.args->a[0]->getArray();
115 IntArgs oa(offs->a.size());
116 for (
int i=offs->
a.size();
i--; ) {
117 oa[
i] = offs->a[
i]->getInt();
123 void p_all_equal(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
124 IntVarArgs va = s.arg2intvarargs(ce[0]);
128 void p_int_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
130 if (ce[0]->isIntVar()) {
131 if (ce[1]->isIntVar()) {
132 rel(s, s.arg2IntVar(ce[0]), irt, s.arg2IntVar(ce[1]),
135 rel(s, s.arg2IntVar(ce[0]), irt, ce[1]->getInt(), s.ann2icl(ann));
138 rel(s, s.arg2IntVar(ce[1]), swap(irt), ce[0]->getInt(),
142 void p_int_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
143 p_int_CMP(s,
IRT_EQ, ce, ann);
145 void p_int_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
146 p_int_CMP(s,
IRT_NQ, ce, ann);
148 void p_int_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
149 p_int_CMP(s,
IRT_GQ, ce, ann);
151 void p_int_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
152 p_int_CMP(s,
IRT_GR, ce, ann);
154 void p_int_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
155 p_int_CMP(s,
IRT_LQ, ce, ann);
157 void p_int_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
158 p_int_CMP(s,
IRT_LE, ce, ann);
161 const ConExpr& ce, AST::Node* ann) {
162 if (rm ==
RM_EQV && ce[2]->isBool()) {
163 if (ce[2]->getBool()) {
164 p_int_CMP(s, irt, ce, ann);
166 p_int_CMP(s,
neg(irt), ce, ann);
170 if (ce[0]->isIntVar()) {
171 if (ce[1]->isIntVar()) {
172 rel(s, s.arg2IntVar(ce[0]), irt, s.arg2IntVar(ce[1]),
173 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2icl(ann));
175 rel(s, s.arg2IntVar(ce[0]), irt, ce[1]->getInt(),
176 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2icl(ann));
179 rel(s, s.arg2IntVar(ce[1]), swap(irt), ce[0]->getInt(),
180 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2icl(ann));
185 void p_int_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
188 void p_int_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
191 void p_int_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
194 void p_int_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
197 void p_int_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
200 void p_int_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
204 void p_int_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
207 void p_int_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
210 void p_int_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
213 void p_int_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
216 void p_int_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
219 void p_int_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
224 void p_int_lin_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
226 IntArgs ia = s.arg2intargs(ce[0]);
228 if (s.isBoolArray(ce[1],singleIntVar)) {
229 if (singleIntVar != -1) {
230 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
231 IntVar siv = s.arg2IntVar(ce[1]->getArray()->
a[singleIntVar]);
232 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar);
233 IntArgs ia_tmp(ia.size()-1);
235 for (
int i=0;
i<ia.
size();
i++) {
236 if (
i != singleIntVar)
237 ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
239 IntRelType t = (ia[singleIntVar] == -1 ? irt : swap(irt));
240 linear(s, ia_tmp, iv, t, siv, s.ann2icl(ann));
242 IntVarArgs iv = s.arg2intvarargs(ce[1]);
243 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2icl(ann));
246 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
247 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2icl(ann));
250 IntVarArgs iv = s.arg2intvarargs(ce[1]);
251 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2icl(ann));
255 const ConExpr& ce, AST::Node* ann) {
256 if (rm ==
RM_EQV && ce[2]->isBool()) {
257 if (ce[2]->getBool()) {
258 p_int_lin_CMP(s, irt, ce, ann);
260 p_int_lin_CMP(s,
neg(irt), ce, ann);
264 IntArgs ia = s.arg2intargs(ce[0]);
266 if (s.isBoolArray(ce[1],singleIntVar)) {
267 if (singleIntVar != -1) {
268 if (
std::abs(ia[singleIntVar]) == 1 && ce[2]->getInt() == 0) {
269 IntVar siv = s.arg2IntVar(ce[1]->getArray()->
a[singleIntVar]);
270 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 0, singleIntVar);
271 IntArgs ia_tmp(ia.size()-1);
273 for (
int i=0;
i<ia.
size();
i++) {
274 if (
i != singleIntVar)
275 ia_tmp[count++] = ia[singleIntVar] == -1 ? ia[
i] : -ia[
i];
277 IntRelType t = (ia[singleIntVar] == -1 ? irt : swap(irt));
278 linear(s, ia_tmp, iv, t, siv, Reify(s.arg2BoolVar(ce[3]), rm),
281 IntVarArgs iv = s.arg2intvarargs(ce[1]);
282 linear(s, ia, iv, irt, ce[2]->getInt(),
283 Reify(s.arg2BoolVar(ce[3]), rm), s.ann2icl(ann));
286 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
287 linear(s, ia, iv, irt, ce[2]->getInt(),
288 Reify(s.arg2BoolVar(ce[3]), rm), s.ann2icl(ann));
291 IntVarArgs iv = s.arg2intvarargs(ce[1]);
292 linear(s, ia, iv, irt, ce[2]->getInt(),
293 Reify(s.arg2BoolVar(ce[3]), rm),
297 void p_int_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
298 p_int_lin_CMP(s,
IRT_EQ, ce, ann);
300 void p_int_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
303 void p_int_lin_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
306 void p_int_lin_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
307 p_int_lin_CMP(s,
IRT_NQ, ce, ann);
309 void p_int_lin_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
312 void p_int_lin_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
315 void p_int_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
316 p_int_lin_CMP(s,
IRT_LQ, ce, ann);
318 void p_int_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
321 void p_int_lin_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
324 void p_int_lin_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
325 p_int_lin_CMP(s,
IRT_LE, ce, ann);
327 void p_int_lin_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
330 void p_int_lin_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
333 void p_int_lin_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
334 p_int_lin_CMP(s,
IRT_GQ, ce, ann);
336 void p_int_lin_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
339 void p_int_lin_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
342 void p_int_lin_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
343 p_int_lin_CMP(s,
IRT_GR, ce, ann);
345 void p_int_lin_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
348 void p_int_lin_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
352 void p_bool_lin_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
354 IntArgs ia = s.arg2intargs(ce[0]);
355 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
356 if (ce[2]->isIntVar())
357 linear(s, ia, iv, irt, s.iv[ce[2]->getIntVar()], s.ann2icl(ann));
359 linear(s, ia, iv, irt, ce[2]->getInt(), s.ann2icl(ann));
362 const ConExpr& ce, AST::Node* ann) {
363 if (rm ==
RM_EQV && ce[2]->isBool()) {
364 if (ce[2]->getBool()) {
365 p_bool_lin_CMP(s, irt, ce, ann);
367 p_bool_lin_CMP(s,
neg(irt), ce, ann);
371 IntArgs ia = s.arg2intargs(ce[0]);
372 BoolVarArgs iv = s.arg2boolvarargs(ce[1]);
373 if (ce[2]->isIntVar())
374 linear(s, ia, iv, irt, s.iv[ce[2]->getIntVar()],
375 Reify(s.arg2BoolVar(ce[3]), rm),
378 linear(s, ia, iv, irt, ce[2]->getInt(),
379 Reify(s.arg2BoolVar(ce[3]), rm),
382 void p_bool_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
383 p_bool_lin_CMP(s,
IRT_EQ, ce, ann);
385 void p_bool_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
389 void p_bool_lin_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
393 void p_bool_lin_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
394 p_bool_lin_CMP(s,
IRT_NQ, ce, ann);
396 void p_bool_lin_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
400 void p_bool_lin_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
404 void p_bool_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
405 p_bool_lin_CMP(s,
IRT_LQ, ce, ann);
407 void p_bool_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
411 void p_bool_lin_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
415 void p_bool_lin_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
417 p_bool_lin_CMP(s,
IRT_LE, ce, ann);
419 void p_bool_lin_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
423 void p_bool_lin_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
427 void p_bool_lin_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
428 p_bool_lin_CMP(s,
IRT_GQ, ce, ann);
430 void p_bool_lin_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
434 void p_bool_lin_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
438 void p_bool_lin_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
439 p_bool_lin_CMP(s,
IRT_GR, ce, ann);
441 void p_bool_lin_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
445 void p_bool_lin_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
452 void p_int_plus(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
453 if (!ce[0]->isIntVar()) {
454 rel(s, ce[0]->getInt() + s.arg2IntVar(ce[1])
455 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
456 }
else if (!ce[1]->isIntVar()) {
457 rel(s, s.arg2IntVar(ce[0]) + ce[1]->getInt()
458 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
459 }
else if (!ce[2]->isIntVar()) {
460 rel(s, s.arg2IntVar(ce[0]) + s.arg2IntVar(ce[1])
461 == ce[2]->getInt(), s.ann2icl(ann));
463 rel(s, s.arg2IntVar(ce[0]) + s.arg2IntVar(ce[1])
464 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
468 void p_int_minus(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
469 if (!ce[0]->isIntVar()) {
470 rel(s, ce[0]->getInt() - s.arg2IntVar(ce[1])
471 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
472 }
else if (!ce[1]->isIntVar()) {
473 rel(s, s.arg2IntVar(ce[0]) - ce[1]->getInt()
474 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
475 }
else if (!ce[2]->isIntVar()) {
476 rel(s, s.arg2IntVar(ce[0]) - s.arg2IntVar(ce[1])
477 == ce[2]->getInt(), s.ann2icl(ann));
479 rel(s, s.arg2IntVar(ce[0]) - s.arg2IntVar(ce[1])
480 == s.arg2IntVar(ce[2]), s.ann2icl(ann));
484 void p_int_times(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 mult(s, x0, x1, x2, s.ann2icl(ann));
490 void p_int_div(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
491 IntVar x0 = s.arg2IntVar(ce[0]);
492 IntVar x1 = s.arg2IntVar(ce[1]);
493 IntVar x2 = s.arg2IntVar(ce[2]);
494 div(s,x0,x1,x2, s.ann2icl(ann));
496 void p_int_mod(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
497 IntVar x0 = s.arg2IntVar(ce[0]);
498 IntVar x1 = s.arg2IntVar(ce[1]);
499 IntVar x2 = s.arg2IntVar(ce[2]);
500 mod(s,x0,x1,x2, s.ann2icl(ann));
503 void p_int_min(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
504 IntVar x0 = s.arg2IntVar(ce[0]);
505 IntVar x1 = s.arg2IntVar(ce[1]);
506 IntVar x2 = s.arg2IntVar(ce[2]);
507 min(s, x0, x1, x2, s.ann2icl(ann));
509 void p_int_max(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
510 IntVar x0 = s.arg2IntVar(ce[0]);
511 IntVar x1 = s.arg2IntVar(ce[1]);
512 IntVar x2 = s.arg2IntVar(ce[2]);
513 max(s, x0, x1, x2, s.ann2icl(ann));
515 void p_int_negate(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
516 IntVar x0 = s.arg2IntVar(ce[0]);
517 IntVar x1 = s.arg2IntVar(ce[1]);
518 rel(s, x0 == -x1, s.ann2icl(ann));
522 void p_bool_CMP(FlatZincSpace& s,
IntRelType irt,
const ConExpr& ce,
524 rel(s, s.arg2BoolVar(ce[0]), irt, s.arg2BoolVar(ce[1]),
528 const ConExpr& ce, AST::Node* ann) {
529 rel(s, s.arg2BoolVar(ce[0]), irt, s.arg2BoolVar(ce[1]),
530 Reify(s.arg2BoolVar(ce[2]), rm), s.ann2icl(ann));
532 void p_bool_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
533 p_bool_CMP(s,
IRT_EQ, ce, ann);
535 void p_bool_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
538 void p_bool_eq_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
541 void p_bool_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
542 p_bool_CMP(s,
IRT_NQ, ce, ann);
544 void p_bool_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
547 void p_bool_ne_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
550 void p_bool_ge(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
551 p_bool_CMP(s,
IRT_GQ, ce, ann);
553 void p_bool_ge_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
556 void p_bool_ge_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
559 void p_bool_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
560 p_bool_CMP(s,
IRT_LQ, ce, ann);
562 void p_bool_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
565 void p_bool_le_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
568 void p_bool_gt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
569 p_bool_CMP(s,
IRT_GR, ce, ann);
571 void p_bool_gt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
574 void p_bool_gt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
577 void p_bool_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
578 p_bool_CMP(s,
IRT_LE, ce, ann);
580 void p_bool_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
583 void p_bool_lt_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
587 #define BOOL_OP(op) \
588 BoolVar b0 = s.arg2BoolVar(ce[0]); \
589 BoolVar b1 = s.arg2BoolVar(ce[1]); \
590 if (ce[2]->isBool()) { \
591 rel(s, b0, op, b1, ce[2]->getBool(), s.ann2icl(ann)); \
593 rel(s, b0, op, b1, s.bv[ce[2]->getBoolVar()], s.ann2icl(ann)); \
596 #define BOOL_ARRAY_OP(op) \
597 BoolVarArgs bv = s.arg2boolvarargs(ce[0]); \
598 if (ce.size()==1) { \
599 rel(s, op, bv, 1, s.ann2icl(ann)); \
600 } else if (ce[1]->isBool()) { \
601 rel(s, op, bv, ce[1]->getBool(), s.ann2icl(ann)); \
603 rel(s, op, bv, s.bv[ce[1]->getBoolVar()], s.ann2icl(ann)); \
606 void p_bool_or(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
609 void p_bool_or_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
610 BoolVar b0 = s.arg2BoolVar(ce[0]);
611 BoolVar
b1 = s.arg2BoolVar(ce[1]);
612 BoolVar
b2 = s.arg2BoolVar(ce[2]);
613 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
616 void p_bool_and(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
619 void p_bool_and_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
620 BoolVar b0 = s.arg2BoolVar(ce[0]);
621 BoolVar b1 = s.arg2BoolVar(ce[1]);
622 BoolVar b2 = s.arg2BoolVar(ce[2]);
626 void p_array_bool_and(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
630 void p_array_bool_and_imp(FlatZincSpace& s,
const ConExpr& ce,
633 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
634 BoolVar b1 = s.arg2BoolVar(ce[1]);
635 for (
unsigned int i=bv.
size();
i--;)
638 void p_array_bool_or(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
642 void p_array_bool_or_imp(FlatZincSpace& s,
const ConExpr& ce,
645 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
646 BoolVar b1 = s.arg2BoolVar(ce[1]);
647 clause(s,
BOT_OR, bv, BoolVarArgs()<<b1, 1, s.ann2icl(ann));
649 void p_array_bool_xor(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann)
653 void p_array_bool_xor_imp(FlatZincSpace& s,
const ConExpr& ce,
656 BoolVarArgs bv = s.arg2boolvarargs(ce[0]);
659 rel(s, s.arg2BoolVar(ce[1]),
BOT_IMP, tmp, 1);
661 void p_array_bool_clause(FlatZincSpace& s,
const ConExpr& ce,
663 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
664 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
667 void p_array_bool_clause_reif(FlatZincSpace& s,
const ConExpr& ce,
669 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
670 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
671 BoolVar b0 = s.arg2BoolVar(ce[2]);
674 void p_array_bool_clause_imp(FlatZincSpace& s,
const ConExpr& ce,
676 BoolVarArgs bvp = s.arg2boolvarargs(ce[0]);
677 BoolVarArgs bvn = s.arg2boolvarargs(ce[1]);
678 BoolVar b0 = s.arg2BoolVar(ce[2]);
681 void p_bool_xor(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
684 void p_bool_xor_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
685 BoolVar b0 = s.arg2BoolVar(ce[0]);
686 BoolVar b1 = s.arg2BoolVar(ce[1]);
687 BoolVar b2 = s.arg2BoolVar(ce[2]);
688 clause(s,
BOT_OR, BoolVarArgs()<<b0<<b1, BoolVarArgs()<<b2, 1,
690 clause(s,
BOT_OR, BoolVarArgs(), BoolVarArgs()<<b0<<b1<<b2, 1,
693 void p_bool_l_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
694 BoolVar b0 = s.arg2BoolVar(ce[0]);
695 BoolVar b1 = s.arg2BoolVar(ce[1]);
696 if (ce[2]->isBool()) {
697 rel(s, b1,
BOT_IMP, b0, ce[2]->getBool(), s.ann2icl(ann));
699 rel(s, b1,
BOT_IMP, b0, s.bv[ce[2]->getBoolVar()], s.ann2icl(ann));
702 void p_bool_r_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
705 void p_bool_not(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
706 BoolVar x0 = s.arg2BoolVar(ce[0]);
707 BoolVar x1 = s.arg2BoolVar(ce[1]);
712 void p_array_int_element(FlatZincSpace& s,
const ConExpr& ce,
714 bool isConstant =
true;
715 AST::Array*
a = ce[1]->getArray();
716 for (
int i=a->
a.size();
i--;) {
717 if (!a->a[
i]->isInt()) {
722 IntVar selector = s.arg2IntVar(ce[0]);
723 rel(s, selector > 0);
725 IntArgs ia = s.arg2intargs(ce[1], 1);
726 element(s, ia, selector, s.arg2IntVar(ce[2]), s.ann2icl(ann));
728 IntVarArgs iv = s.arg2intvarargs(ce[1], 1);
729 element(s, iv, selector, s.arg2IntVar(ce[2]), s.ann2icl(ann));
732 void p_array_bool_element(FlatZincSpace& s,
const ConExpr& ce,
734 bool isConstant =
true;
735 AST::Array* a = ce[1]->getArray();
736 for (
int i=a->
a.size();
i--;) {
737 if (!a->a[
i]->isBool()) {
742 IntVar selector = s.arg2IntVar(ce[0]);
743 rel(s, selector > 0);
745 IntArgs ia = s.arg2boolargs(ce[1], 1);
746 element(s, ia, selector, s.arg2BoolVar(ce[2]), s.ann2icl(ann));
748 BoolVarArgs iv = s.arg2boolvarargs(ce[1], 1);
749 element(s, iv, selector, s.arg2BoolVar(ce[2]), s.ann2icl(ann));
754 void p_bool2int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
755 BoolVar x0 = s.arg2BoolVar(ce[0]);
756 IntVar x1 = s.arg2IntVar(ce[1]);
757 if (ce[0]->isBoolVar() && ce[1]->isIntVar()) {
758 s.aliasBool2Int(ce[1]->getIntVar(), ce[0]->getBoolVar());
760 channel(s, x0, x1, s.ann2icl(ann));
763 void p_int_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
764 IntSet
d = s.arg2intset(ce[1]);
765 if (ce[0]->isBoolVar()) {
767 Iter::Ranges::Singleton sr(0,1);
768 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
770 if (d01.size() == 0) {
773 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
774 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
777 dom(s, s.arg2IntVar(ce[0]),
d);
780 void p_int_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
781 IntSet d = s.arg2intset(ce[1]);
782 if (ce[0]->isBoolVar()) {
784 Iter::Ranges::Singleton sr(0,1);
785 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
787 if (d01.size() == 0) {
788 rel(s, s.arg2BoolVar(ce[2]) == 0);
789 }
else if (d01.max() == 0) {
790 rel(s, s.arg2BoolVar(ce[2]) == !s.arg2BoolVar(ce[0]));
791 }
else if (d01.min() == 1) {
792 rel(s, s.arg2BoolVar(ce[2]) == s.arg2BoolVar(ce[0]));
794 rel(s, s.arg2BoolVar(ce[2]) == 1);
797 dom(s, s.arg2IntVar(ce[0]),
d, s.arg2BoolVar(ce[2]));
800 void p_int_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
801 IntSet d = s.arg2intset(ce[1]);
802 if (ce[0]->isBoolVar()) {
804 Iter::Ranges::Singleton sr(0,1);
805 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
807 if (d01.size() == 0) {
808 rel(s, s.arg2BoolVar(ce[2]) == 0);
809 }
else if (d01.max() == 0) {
810 rel(s, s.arg2BoolVar(ce[2]) >> !s.arg2BoolVar(ce[0]));
811 }
else if (d01.min() == 1) {
812 rel(s, s.arg2BoolVar(ce[2]) >> s.arg2BoolVar(ce[0]));
815 dom(s, s.arg2IntVar(ce[0]),
d, Reify(s.arg2BoolVar(ce[2]),
RM_IMP));
821 void p_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
822 IntVar x0 = s.arg2IntVar(ce[0]);
823 IntVar x1 = s.arg2IntVar(ce[1]);
824 abs(s, x0, x1, s.ann2icl(ann));
827 void p_array_int_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
828 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
829 IntVarArgs iv1 = s.arg2intvarargs(ce[1]);
830 rel(s, iv0,
IRT_LE, iv1, s.ann2icl(ann));
833 void p_array_int_lq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
834 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
835 IntVarArgs iv1 = s.arg2intvarargs(ce[1]);
836 rel(s, iv0,
IRT_LQ, iv1, s.ann2icl(ann));
839 void p_array_bool_lt(FlatZincSpace& s,
const ConExpr& ce,
841 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
842 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
843 rel(s, bv0,
IRT_LE, bv1, s.ann2icl(ann));
846 void p_array_bool_lq(FlatZincSpace& s,
const ConExpr& ce,
848 BoolVarArgs bv0 = s.arg2boolvarargs(ce[0]);
849 BoolVarArgs bv1 = s.arg2boolvarargs(ce[1]);
850 rel(s, bv0,
IRT_LQ, bv1, s.ann2icl(ann));
853 void p_count(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
854 IntVarArgs iv = s.arg2intvarargs(ce[0]);
855 if (!ce[1]->isIntVar()) {
856 if (!ce[2]->isIntVar()) {
857 count(s, iv, ce[1]->getInt(),
IRT_EQ, ce[2]->getInt(),
860 count(s, iv, ce[1]->getInt(),
IRT_EQ, s.arg2IntVar(ce[2]),
863 }
else if (!ce[2]->isIntVar()) {
864 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, ce[2]->getInt(),
867 count(s, iv, s.arg2IntVar(ce[1]),
IRT_EQ, s.arg2IntVar(ce[2]),
872 void p_count_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
873 IntVarArgs iv = s.arg2intvarargs(ce[0]);
874 IntVar
x = s.arg2IntVar(ce[1]);
875 IntVar y = s.arg2IntVar(ce[2]);
876 BoolVar
b = s.arg2BoolVar(ce[3]);
881 void p_count_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
882 IntVarArgs iv = s.arg2intvarargs(ce[0]);
883 IntVar x = s.arg2IntVar(ce[1]);
884 IntVar y = s.arg2IntVar(ce[2]);
885 BoolVar b = s.arg2BoolVar(ce[3]);
892 FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
893 IntVarArgs iv = s.arg2intvarargs(ce[1]);
894 count(s, iv, ce[2]->getInt(), irt, ce[0]->getInt(), s.ann2icl(ann));
897 void p_at_most(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
898 count_rel(
IRT_LQ, s, ce, ann);
901 void p_at_least(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
902 count_rel(
IRT_GQ, s, ce, ann);
905 void p_bin_packing_load(FlatZincSpace& s,
const ConExpr& ce,
907 int minIdx = ce[3]->getInt();
908 IntVarArgs load = s.arg2intvarargs(ce[0]);
910 IntVarArgs bin = s.arg2intvarargs(ce[1]);
911 for (
int i=bin.
size();
i--;)
912 rel(s, bin[
i] >= minIdx);
914 for (
int i=minIdx;
i--;)
916 }
else if (minIdx < 0) {
917 IntVarArgs bin2(bin.size());
918 for (
int i=bin.
size();
i--;)
919 bin2[
i] =
expr(s, bin[
i]-minIdx, s.ann2icl(ann));
923 IntArgs sizes = s.arg2intargs(ce[2]);
927 void p_global_cardinality(FlatZincSpace& s,
const ConExpr& ce,
929 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
930 IntArgs cover = s.arg2intargs(ce[1]);
931 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
934 IntSet cover_s(cover);
935 IntSetRanges cover_r(cover_s);
936 IntVarRanges* iv0_ri = re.alloc<IntVarRanges>(iv0.size());
937 for (
int i=iv0.
size();
i--;)
938 iv0_ri[
i] = IntVarRanges(iv0[
i]);
939 Iter::Ranges::NaryUnion iv0_r(re,iv0_ri,iv0.size());
940 Iter::Ranges::Diff<Iter::Ranges::NaryUnion,IntSetRanges>
941 extra_r(iv0_r,cover_r);
942 Iter::Ranges::ToValues<Iter::Ranges::Diff<
943 Iter::Ranges::NaryUnion,IntSetRanges> > extra(extra_r);
944 for (; extra(); ++extra) {
945 cover << extra.val();
946 iv1 << IntVar(s,0,iv0.size());
950 IntVarArgs allvars = iv0+iv1;
952 count(s, allvars.slice(0,1,iv0.size()),
953 allvars.slice(iv0.size(),1,iv1.size()),
954 cover, s.ann2icl(ann));
956 count(s, iv0, iv1, cover, s.ann2icl(ann));
960 void p_global_cardinality_closed(FlatZincSpace& s,
const ConExpr& ce,
962 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
963 IntArgs cover = s.arg2intargs(ce[1]);
964 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
965 count(s, iv0, iv1, cover, s.ann2icl(ann));
968 void p_global_cardinality_low_up(FlatZincSpace& s,
const ConExpr& ce,
970 IntVarArgs x = s.arg2intvarargs(ce[0]);
971 IntArgs cover = s.arg2intargs(ce[1]);
973 IntArgs lbound = s.arg2intargs(ce[2]);
974 IntArgs ubound = s.arg2intargs(ce[3]);
976 for (
int i=cover.size(); i--;)
977 y[i] = IntSet(lbound[i],ubound[i]);
979 IntSet cover_s(cover);
981 IntVarRanges* xrs = re.alloc<IntVarRanges>(x.size());
982 for (
int i=x.size(); i--;)
984 Iter::Ranges::NaryUnion
u(re, xrs, x.size());
985 Iter::Ranges::ToValues<Iter::Ranges::NaryUnion> uv(
u);
987 if (!cover_s.in(uv.val())) {
989 y << IntSet(0,x.size());
993 count(s, x, y, cover, s.ann2icl(ann));
996 void p_global_cardinality_low_up_closed(FlatZincSpace& s,
999 IntVarArgs x = s.arg2intvarargs(ce[0]);
1000 IntArgs cover = s.arg2intargs(ce[1]);
1002 IntArgs lbound = s.arg2intargs(ce[2]);
1003 IntArgs ubound = s.arg2intargs(ce[3]);
1005 for (
int i=cover.size(); i--;)
1006 y[i] = IntSet(lbound[i],ubound[i]);
1008 count(s, x, y, cover, s.ann2icl(ann));
1011 void p_minimum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1012 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1013 min(s, iv, s.arg2IntVar(ce[0]), s.ann2icl(ann));
1016 void p_maximum(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1017 IntVarArgs iv = s.arg2intvarargs(ce[1]);
1018 max(s, iv, s.arg2IntVar(ce[0]), s.ann2icl(ann));
1021 void p_regular(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1022 IntVarArgs iv = s.arg2intvarargs(ce[0]);
1023 int q = ce[1]->getInt();
1024 int symbols = ce[2]->getInt();
1025 IntArgs d = s.arg2intargs(ce[3]);
1026 int q0 = ce[4]->getInt();
1029 for (
int i=1; i<=q; i++) {
1030 for (
int j=1; j<=symbols; j++) {
1031 if (d[(i-1)*symbols+(j-1)] > 0)
1037 DFA::Transition* t = re.alloc<DFA::Transition>(noOfTrans+1);
1039 for (
int i=1; i<=q; i++) {
1040 for (
int j=1; j<=symbols; j++) {
1041 if (d[(i-1)*symbols+(j-1)] > 0) {
1042 t[noOfTrans].i_state =
i;
1043 t[noOfTrans].symbol = j;
1044 t[noOfTrans].o_state = d[(i-1)*symbols+(j-1)];
1049 t[noOfTrans].i_state = -1;
1052 AST::SetLit* sl = ce[5]->getSet();
1055 f =
static_cast<int*
>(malloc(
sizeof(
int)*(sl->max-sl->min+2)));
1056 for (
int i=sl->min; i<=sl->
max; i++)
1058 f[sl->max-sl->min+1] = -1;
1060 f =
static_cast<int*
>(malloc(
sizeof(
int)*(sl->s.size()+1)));
1061 for (
int j=sl->s.size(); j--; )
1063 f[sl->s.size()] = -1;
1072 p_sort(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1073 IntVarArgs x = s.arg2intvarargs(ce[0]);
1074 IntVarArgs y = s.arg2intvarargs(ce[1]);
1075 IntVarArgs xy(x.size()+y.size());
1076 for (
int i=x.size(); i--;)
1078 for (
int i=y.size(); i--;)
1079 xy[i+x.size()] = y[
i];
1081 for (
int i=x.size(); i--;)
1083 for (
int i=y.size(); i--;)
1084 y[i] = xy[i+x.size()];
1085 sorted(s, x, y, s.ann2icl(ann));
1089 p_inverse_offsets(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1090 IntVarArgs x = s.arg2intvarargs(ce[0]);
1091 int xoff = ce[1]->getInt();
1092 IntVarArgs y = s.arg2intvarargs(ce[2]);
1093 int yoff = ce[3]->getInt();
1094 channel(s, x, xoff, y, yoff, s.ann2icl(ann));
1098 p_increasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1099 IntVarArgs x = s.arg2intvarargs(ce[0]);
1104 p_increasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1105 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1110 p_decreasing_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1111 IntVarArgs x = s.arg2intvarargs(ce[0]);
1116 p_decreasing_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1117 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1122 p_table_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1123 IntVarArgs x = s.arg2intvarargs(ce[0]);
1124 IntArgs tuples = s.arg2intargs(ce[1]);
1125 int noOfVars = x.size();
1126 int noOfTuples = tuples.size() == 0 ? 0 : (tuples.size()/noOfVars);
1128 for (
int i=0; i<noOfTuples; i++) {
1129 IntArgs
t(noOfVars);
1130 for (
int j=0; j<x.size(); j++) {
1131 t[j] = tuples[i*noOfVars+j];
1139 p_table_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1140 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1141 IntArgs tuples = s.arg2boolargs(ce[1]);
1142 int noOfVars = x.size();
1143 int noOfTuples = tuples.size() == 0 ? 0 : (tuples.size()/noOfVars);
1145 for (
int i=0; i<noOfTuples; i++) {
1146 IntArgs
t(noOfVars);
1147 for (
int j=0; j<x.size(); j++) {
1148 t[j] = tuples[i*noOfVars+j];
1156 void p_cumulatives(FlatZincSpace& s,
const ConExpr& ce,
1158 IntVarArgs start = s.arg2intvarargs(ce[0]);
1159 IntVarArgs duration = s.arg2intvarargs(ce[1]);
1160 IntVarArgs height = s.arg2intvarargs(ce[2]);
1161 int n = start.size();
1162 IntVar bound = s.arg2IntVar(ce[3]);
1164 int minHeight = INT_MAX;
int minHeight2 = INT_MAX;
1166 if (height[i].
min() < minHeight)
1167 minHeight = height[
i].min();
1168 else if (height[i].
min() < minHeight2)
1169 minHeight2 = height[
i].min();
1171 (minHeight > bound.max()/2) ||
1172 (minHeight2 > bound.max()/2 && minHeight+minHeight2>bound.max());
1174 rel(s, bound >=
max(height));
1176 if (duration.assigned()) {
1177 IntArgs durationI(n);
1179 durationI[i] = duration[i].val();
1180 unary(s,start,durationI);
1184 end[i] =
expr(s,start[i]+duration[i]);
1185 unary(s,start,duration,end);
1187 }
else if (height.assigned()) {
1190 heightI[i] = height[i].val();
1191 if (duration.assigned()) {
1192 IntArgs durationI(n);
1194 durationI[i] = duration[i].val();
1195 cumulative(s, bound, start, durationI, heightI);
1198 for (
int i = n; i--; )
1199 end[i] =
expr(s,start[i]+duration[i]);
1200 cumulative(s, bound, start, duration, end, heightI);
1202 }
else if (bound.assigned()) {
1204 IntArgs limit(1, bound.val());
1207 end[i] =
expr(s,start[i]+duration[i]);
1208 cumulatives(s, machine, start, duration, end, height, limit,
true,
1213 IntVarArgs end(start.size());
1214 for (
int i = start.size(); i--; ) {
1217 end[
i] =
expr(s, start[i] + duration[i]);
1219 for (
int time = min; time <
max; ++time) {
1220 IntVarArgs
x(start.size());
1221 for (
int i = start.size(); i--; ) {
1222 IntVar overlaps =
channel(s,
expr(s, (start[i] <= time) &&
1224 x[
i] =
expr(s, overlaps * height[i]);
1231 void p_among_seq_int(FlatZincSpace& s,
const ConExpr& ce,
1233 IntVarArgs x = s.arg2intvarargs(ce[0]);
1234 IntSet S = s.arg2intset(ce[1]);
1235 int q = ce[2]->getInt();
1236 int l = ce[3]->getInt();
1237 int u = ce[4]->getInt();
1238 sequence(s, x, S, q, l, u, s.ann2icl(ann));
1241 void p_among_seq_bool(FlatZincSpace& s,
const ConExpr& ce,
1243 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1244 bool val = ce[1]->getBool();
1245 int q = ce[2]->getInt();
1246 int l = ce[3]->getInt();
1247 int u = ce[4]->getInt();
1249 sequence(s, x, S, q, l, u, s.ann2icl(ann));
1252 void p_schedule_unary(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1253 IntVarArgs x = s.arg2intvarargs(ce[0]);
1254 IntArgs
p = s.arg2intargs(ce[1]);
1258 void p_schedule_unary_optional(FlatZincSpace& s,
const ConExpr& ce,
1260 IntVarArgs x = s.arg2intvarargs(ce[0]);
1261 IntArgs p = s.arg2intargs(ce[1]);
1262 BoolVarArgs m = s.arg2boolvarargs(ce[2]);
1266 void p_circuit(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1267 int off = ce[0]->getInt();
1268 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1269 circuit(s,off,xv,s.ann2icl(ann));
1271 void p_circuit_cost_array(FlatZincSpace& s,
const ConExpr& ce,
1273 IntArgs
c = s.arg2intargs(ce[0]);
1274 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1275 IntVarArgs yv = s.arg2intvarargs(ce[2]);
1276 IntVar z = s.arg2IntVar(ce[3]);
1277 circuit(s,c,xv,yv,z,s.ann2icl(ann));
1279 void p_circuit_cost(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1280 IntArgs c = s.arg2intargs(ce[0]);
1281 IntVarArgs xv = s.arg2intvarargs(ce[1]);
1282 IntVar z = s.arg2IntVar(ce[2]);
1283 circuit(s,c,xv,z,s.ann2icl(ann));
1286 void p_nooverlap(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1287 IntVarArgs x0 = s.arg2intvarargs(ce[0]);
1288 IntVarArgs w = s.arg2intvarargs(ce[1]);
1289 IntVarArgs y0 = s.arg2intvarargs(ce[2]);
1290 IntVarArgs h = s.arg2intvarargs(ce[3]);
1291 if (w.assigned() && h.assigned()) {
1292 IntArgs iw(w.size());
1293 for (
int i=w.size(); i--;)
1295 IntArgs ih(h.size());
1296 for (
int i=h.size(); i--;)
1298 nooverlap(s,x0,iw,y0,ih,s.ann2icl(ann));
1300 IntVarArgs x1(x0.size()), y1(y0.size());
1301 for (
int i=x0.size(); i--; )
1302 x1[i] =
expr(s, x0[i] + w[i]);
1303 for (
int i=y0.size(); i--; )
1304 y1[i] =
expr(s, y0[i] + h[i]);
1305 nooverlap(s,x0,w,x1,y0,h,y1,s.ann2icl(ann));
1309 void p_precede(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1310 IntVarArgs x = s.arg2intvarargs(ce[0]);
1311 int p_s = ce[1]->getInt();
1312 int p_t = ce[2]->getInt();
1313 precede(s,x,p_s,p_t,s.ann2icl(ann));
1316 void p_nvalue(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1317 IntVarArgs x = s.arg2intvarargs(ce[1]);
1318 if (ce[0]->isIntVar()) {
1319 IntVar y = s.arg2IntVar(ce[0]);
1326 void p_among(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1327 IntVarArgs x = s.arg2intvarargs(ce[1]);
1328 IntSet
v = s.arg2intset(ce[2]);
1329 if (ce[0]->isIntVar()) {
1330 IntVar n = s.arg2IntVar(ce[0]);
1333 count(s,x,v,
IRT_EQ,ce[0]->getInt(),s.ann2icl(ann));
1337 void p_member_int(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1338 IntVarArgs x = s.arg2intvarargs(ce[0]);
1339 IntVar y = s.arg2IntVar(ce[1]);
1340 member(s,x,y,s.ann2icl(ann));
1342 void p_member_int_reif(FlatZincSpace& s,
const ConExpr& ce,
1344 IntVarArgs x = s.arg2intvarargs(ce[0]);
1345 IntVar y = s.arg2IntVar(ce[1]);
1346 BoolVar b = s.arg2BoolVar(ce[2]);
1347 member(s,x,y,b,s.ann2icl(ann));
1349 void p_member_bool(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1350 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1351 BoolVar y = s.arg2BoolVar(ce[1]);
1352 member(s,x,y,s.ann2icl(ann));
1354 void p_member_bool_reif(FlatZincSpace& s,
const ConExpr& ce,
1356 BoolVarArgs x = s.arg2boolvarargs(ce[0]);
1357 BoolVar y = s.arg2BoolVar(ce[1]);
1358 member(s,x,y,s.arg2BoolVar(ce[2]),s.ann2icl(ann));
1365 registry().
add(
"all_different_offset", &p_distinctOffset);
1386 registry().
add(
"int_lin_eq_reif", &p_int_lin_eq_reif);
1387 registry().
add(
"int_lin_eq_imp", &p_int_lin_eq_imp);
1389 registry().
add(
"int_lin_ne_reif", &p_int_lin_ne_reif);
1390 registry().
add(
"int_lin_ne_imp", &p_int_lin_ne_imp);
1392 registry().
add(
"int_lin_le_reif", &p_int_lin_le_reif);
1393 registry().
add(
"int_lin_le_imp", &p_int_lin_le_imp);
1395 registry().
add(
"int_lin_lt_reif", &p_int_lin_lt_reif);
1396 registry().
add(
"int_lin_lt_imp", &p_int_lin_lt_imp);
1398 registry().
add(
"int_lin_ge_reif", &p_int_lin_ge_reif);
1399 registry().
add(
"int_lin_ge_imp", &p_int_lin_ge_imp);
1401 registry().
add(
"int_lin_gt_reif", &p_int_lin_gt_reif);
1402 registry().
add(
"int_lin_gt_imp", &p_int_lin_gt_imp);
1436 registry().
add(
"array_bool_and", &p_array_bool_and);
1437 registry().
add(
"array_bool_and_imp", &p_array_bool_and_imp);
1438 registry().
add(
"array_bool_or", &p_array_bool_or);
1439 registry().
add(
"array_bool_or_imp", &p_array_bool_or_imp);
1440 registry().
add(
"array_bool_xor", &p_array_bool_xor);
1441 registry().
add(
"array_bool_xor_imp", &p_array_bool_xor_imp);
1442 registry().
add(
"bool_clause", &p_array_bool_clause);
1443 registry().
add(
"bool_clause_reif", &p_array_bool_clause_reif);
1444 registry().
add(
"bool_clause_imp", &p_array_bool_clause_imp);
1448 registry().
add(
"array_int_element", &p_array_int_element);
1449 registry().
add(
"array_var_int_element", &p_array_int_element);
1450 registry().
add(
"array_bool_element", &p_array_bool_element);
1451 registry().
add(
"array_var_bool_element", &p_array_bool_element);
1456 #ifndef GECODE_HAS_SET_VARS
1464 registry().
add(
"array_bool_lt", &p_array_bool_lt);
1465 registry().
add(
"array_bool_lq", &p_array_bool_lq);
1471 registry().
add(
"gecode_bin_packing_load", &p_bin_packing_load);
1472 registry().
add(
"global_cardinality", &p_global_cardinality);
1474 &p_global_cardinality_closed);
1476 &p_global_cardinality_low_up);
1477 registry().
add(
"global_cardinality_low_up_closed",
1478 &p_global_cardinality_low_up_closed);
1483 registry().
add(
"inverse_offsets", &p_inverse_offsets);
1484 registry().
add(
"increasing_int", &p_increasing_int);
1485 registry().
add(
"increasing_bool", &p_increasing_bool);
1486 registry().
add(
"decreasing_int", &p_decreasing_int);
1487 registry().
add(
"decreasing_bool", &p_decreasing_bool);
1491 registry().
add(
"gecode_among_seq_int", &p_among_seq_int);
1492 registry().
add(
"gecode_among_seq_bool", &p_among_seq_bool);
1501 registry().
add(
"bool_lin_eq_reif", &p_bool_lin_eq_reif);
1502 registry().
add(
"bool_lin_eq_imp", &p_bool_lin_eq_imp);
1503 registry().
add(
"bool_lin_ne_reif", &p_bool_lin_ne_reif);
1504 registry().
add(
"bool_lin_ne_imp", &p_bool_lin_ne_imp);
1505 registry().
add(
"bool_lin_le_reif", &p_bool_lin_le_reif);
1506 registry().
add(
"bool_lin_le_imp", &p_bool_lin_le_imp);
1507 registry().
add(
"bool_lin_lt_reif", &p_bool_lin_lt_reif);
1508 registry().
add(
"bool_lin_lt_imp", &p_bool_lin_lt_imp);
1509 registry().
add(
"bool_lin_ge_reif", &p_bool_lin_ge_reif);
1510 registry().
add(
"bool_lin_ge_imp", &p_bool_lin_ge_imp);
1511 registry().
add(
"bool_lin_gt_reif", &p_bool_lin_gt_reif);
1512 registry().
add(
"bool_lin_gt_imp", &p_bool_lin_gt_imp);
1514 registry().
add(
"gecode_schedule_unary", &p_schedule_unary);
1515 registry().
add(
"gecode_schedule_unary_optional", &p_schedule_unary_optional);
1518 registry().
add(
"gecode_circuit_cost_array", &p_circuit_cost_array);
1519 registry().
add(
"gecode_circuit_cost", &p_circuit_cost);
1525 registry().
add(
"gecode_member_int_reif",&p_member_int_reif);
1527 registry().
add(
"gecode_member_bool_reif",&p_member_bool_reif);
1530 IntPoster __int_poster;
1532 #ifdef GECODE_HAS_SET_VARS
1533 void p_set_OP(FlatZincSpace& s,
SetOpType op,
1534 const ConExpr& ce, AST::Node *) {
1535 rel(s, s.arg2SetVar(ce[0]), op, s.arg2SetVar(ce[1]),
1536 SRT_EQ, s.arg2SetVar(ce[2]));
1538 void p_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1541 void p_set_intersect(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1544 void p_set_diff(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1548 void p_set_symdiff(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1549 SetVar x = s.arg2SetVar(ce[0]);
1550 SetVar y = s.arg2SetVar(ce[1]);
1552 SetVarLubRanges xub(x);
1557 SetVarLubRanges yub(y);
1565 void p_array_set_OP(FlatZincSpace& s,
SetOpType op,
1566 const ConExpr& ce, AST::Node *) {
1567 SetVarArgs xs = s.arg2setvarargs(ce[0]);
1568 rel(s, op, xs, s.arg2SetVar(ce[1]));
1570 void p_array_set_union(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1573 void p_array_set_partition(FlatZincSpace& s,
const ConExpr& ce, AST::Node *ann) {
1578 void p_set_rel(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1579 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]));
1582 void p_set_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1583 p_set_rel(s,
SRT_EQ, ce);
1585 void p_set_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1586 p_set_rel(s,
SRT_NQ, ce);
1588 void p_set_subset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1591 void p_set_superset(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1594 void p_set_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1595 p_set_rel(s,
SRT_LQ, ce);
1597 void p_set_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1598 p_set_rel(s,
SRT_LE, ce);
1600 void p_set_card(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1601 if (!ce[1]->isIntVar()) {
1602 cardinality(s, s.arg2SetVar(ce[0]), ce[1]->getInt(),
1605 cardinality(s, s.arg2SetVar(ce[0]), s.arg2IntVar(ce[1]));
1608 void p_set_in(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1609 if (!ce[1]->isSetVar()) {
1610 IntSet d = s.arg2intset(ce[1]);
1611 if (ce[0]->isBoolVar()) {
1613 Iter::Ranges::Singleton sr(0,1);
1614 Iter::Ranges::Inter<IntSetRanges,Iter::Ranges::Singleton>
i(dr,sr);
1616 if (d01.size() == 0) {
1619 rel(s, s.arg2BoolVar(ce[0]),
IRT_GQ, d01.min());
1620 rel(s, s.arg2BoolVar(ce[0]),
IRT_LQ, d01.max());
1623 dom(s, s.arg2IntVar(ce[0]),
d);
1626 if (!ce[0]->isIntVar()) {
1627 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt());
1629 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]));
1633 void p_set_rel_reif(FlatZincSpace& s,
SetRelType srt,
const ConExpr& ce) {
1634 rel(s, s.arg2SetVar(ce[0]), srt, s.arg2SetVar(ce[1]),
1635 s.arg2BoolVar(ce[2]));
1638 void p_set_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1639 p_set_rel_reif(s,
SRT_EQ,ce);
1641 void p_set_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1642 p_set_rel_reif(s,
SRT_LQ,ce);
1644 void p_set_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1645 p_set_rel_reif(s,
SRT_LE,ce);
1647 void p_set_ne_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1648 p_set_rel_reif(s,
SRT_NQ,ce);
1650 void p_set_subset_reif(FlatZincSpace& s,
const ConExpr& ce,
1654 void p_set_superset_reif(FlatZincSpace& s,
const ConExpr& ce,
1658 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann,
ReifyMode rm) {
1659 if (!ce[1]->isSetVar()) {
1661 p_int_in_reif(s,ce,ann);
1664 p_int_in_imp(s,ce,ann);
1667 if (!ce[0]->isIntVar()) {
1668 dom(s, s.arg2SetVar(ce[1]),
SRT_SUP, ce[0]->getInt(),
1669 Reify(s.arg2BoolVar(ce[2]),rm));
1671 rel(s, s.arg2SetVar(ce[1]),
SRT_SUP, s.arg2IntVar(ce[0]),
1672 Reify(s.arg2BoolVar(ce[2]),rm));
1676 void p_set_in_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1677 p_set_in_reif(s,ce,ann,
RM_EQV);
1679 void p_set_in_imp(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1680 p_set_in_reif(s,ce,ann,
RM_IMP);
1682 void p_set_disjoint(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1683 rel(s, s.arg2SetVar(ce[0]),
SRT_DISJ, s.arg2SetVar(ce[1]));
1686 void p_link_set_to_booleans(FlatZincSpace& s,
const ConExpr& ce,
1688 SetVar x = s.arg2SetVar(ce[0]);
1689 int idx = ce[2]->getInt();
1692 BoolVarArgs y = s.arg2boolvarargs(ce[1],idx);
1696 void p_array_set_element(FlatZincSpace& s,
const ConExpr& ce,
1698 bool isConstant =
true;
1699 AST::Array* a = ce[1]->getArray();
1700 for (
int i=a->a.size(); i--;) {
1701 if (a->a[i]->isSetVar()) {
1706 IntVar selector = s.arg2IntVar(ce[0]);
1707 rel(s, selector > 0);
1710 element(s, sv, selector, s.arg2SetVar(ce[2]));
1712 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1713 element(s, sv, selector, s.arg2SetVar(ce[2]));
1717 void p_array_set_element_op(FlatZincSpace& s,
const ConExpr& ce,
1719 const IntSet& universe =
1721 bool isConstant =
true;
1722 AST::Array* a = ce[1]->getArray();
1723 for (
int i=a->a.size(); i--;) {
1724 if (a->a[i]->isSetVar()) {
1729 SetVar selector = s.arg2SetVar(ce[0]);
1733 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1735 SetVarArgs sv = s.arg2setvarargs(ce[1], 1);
1736 element(s, op, sv, selector, s.arg2SetVar(ce[2]), universe);
1740 void p_array_set_element_union(FlatZincSpace& s,
const ConExpr& ce,
1742 p_array_set_element_op(s, ce, ann,
SOT_UNION);
1745 void p_array_set_element_intersect(FlatZincSpace& s,
const ConExpr& ce,
1747 p_array_set_element_op(s, ce, ann,
SOT_INTER);
1750 void p_array_set_element_intersect_in(FlatZincSpace& s,
1753 IntSet d = s.arg2intset(ce[3]);
1754 p_array_set_element_op(s, ce, ann,
SOT_INTER, d);
1757 void p_array_set_element_partition(FlatZincSpace& s,
const ConExpr& ce,
1759 p_array_set_element_op(s, ce, ann,
SOT_DUNION);
1762 void p_set_convex(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1763 convex(s, s.arg2SetVar(ce[0]));
1766 void p_array_set_seq(FlatZincSpace& s,
const ConExpr& ce, AST::Node *) {
1767 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1771 void p_array_set_seq_union(FlatZincSpace& s,
const ConExpr& ce,
1773 SetVarArgs sv = s.arg2setvarargs(ce[0]);
1774 sequence(s, sv, s.arg2SetVar(ce[1]));
1777 void p_int_set_channel(FlatZincSpace& s,
const ConExpr& ce,
1779 int xoff=ce[1]->getInt();
1781 int yoff=ce[3]->getInt();
1783 IntVarArgs xv = s.arg2intvarargs(ce[0], xoff);
1784 SetVarArgs yv = s.arg2setvarargs(ce[2], yoff, 1, IntSet(0, xoff-1));
1785 IntSet xd(yoff,yv.size()-1);
1786 for (
int i=xoff; i<xv.size(); i++) {
1789 IntSet yd(xoff,xv.size()-1);
1790 for (
int i=yoff; i<yv.size(); i++) {
1796 void p_range(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1797 int xoff=ce[1]->getInt();
1799 IntVarArgs xv = s.arg2intvarargs(ce[0],xoff);
1803 void p_weights(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1804 IntArgs e = s.arg2intargs(ce[0]);
1805 IntArgs w = s.arg2intargs(ce[1]);
1806 SetVar x = s.arg2SetVar(ce[2]);
1807 IntVar y = s.arg2IntVar(ce[3]);
1811 void p_inverse_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1812 int xoff = ce[2]->getInt();
1813 int yoff = ce[3]->getInt();
1814 SetVarArgs x = s.arg2setvarargs(ce[0],xoff);
1815 SetVarArgs y = s.arg2setvarargs(ce[1],yoff);
1819 void p_precede_set(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1820 SetVarArgs x = s.arg2setvarargs(ce[0]);
1821 int p_s = ce[1]->getInt();
1822 int p_t = ce[2]->getInt();
1835 registry().
add(
"array_set_element", &p_array_set_element);
1836 registry().
add(
"array_var_set_element", &p_array_set_element);
1837 registry().
add(
"set_intersect", &p_set_intersect);
1849 registry().
add(
"set_subset_reif", &p_set_subset_reif);
1850 registry().
add(
"set_superset_reif", &p_set_superset_reif);
1855 &p_link_set_to_booleans);
1857 registry().
add(
"array_set_union", &p_array_set_union);
1858 registry().
add(
"array_set_partition", &p_array_set_partition);
1860 registry().
add(
"array_set_seq", &p_array_set_seq);
1861 registry().
add(
"array_set_seq_union", &p_array_set_seq_union);
1863 &p_array_set_element_union);
1864 registry().
add(
"gecode_array_set_element_intersect",
1865 &p_array_set_element_intersect);
1866 registry().
add(
"gecode_array_set_element_intersect_in",
1867 &p_array_set_element_intersect_in);
1868 registry().
add(
"gecode_array_set_element_partition",
1869 &p_array_set_element_partition);
1871 &p_int_set_channel);
1876 registry().
add(
"gecode_inverse_set", &p_inverse_set);
1877 registry().
add(
"gecode_precede_set", &p_precede_set);
1880 SetPoster __set_poster;
1883 #ifdef GECODE_HAS_FLOAT_VARS
1885 void p_int2float(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1886 IntVar x0 = s.arg2IntVar(ce[0]);
1887 FloatVar x1 = s.arg2FloatVar(ce[1]);
1891 void p_float_lin_cmp(FlatZincSpace& s,
FloatRelType frt,
1892 const ConExpr& ce, AST::Node*) {
1893 FloatValArgs fa = s.arg2floatargs(ce[0]);
1894 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1895 linear(s, fa, fv, frt, ce[2]->getFloat());
1897 void p_float_lin_cmp_reif(FlatZincSpace& s,
FloatRelType frt,
1898 const ConExpr& ce, AST::Node*) {
1899 FloatValArgs fa = s.arg2floatargs(ce[0]);
1900 FloatVarArgs fv = s.arg2floatvarargs(ce[1]);
1901 linear(s, fa, fv, frt, ce[2]->getFloat(), s.arg2BoolVar(ce[3]));
1903 void p_float_lin_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1904 p_float_lin_cmp(s,
FRT_EQ,ce,ann);
1906 void p_float_lin_eq_reif(FlatZincSpace& s,
const ConExpr& ce,
1908 p_float_lin_cmp_reif(s,
FRT_EQ,ce,ann);
1910 void p_float_lin_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node* ann) {
1911 p_float_lin_cmp(s,
FRT_LQ,ce,ann);
1913 void p_float_lin_le_reif(FlatZincSpace& s,
const ConExpr& ce,
1915 p_float_lin_cmp_reif(s,
FRT_LQ,ce,ann);
1918 void p_float_times(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1919 FloatVar x = s.arg2FloatVar(ce[0]);
1920 FloatVar y = s.arg2FloatVar(ce[1]);
1921 FloatVar z = s.arg2FloatVar(ce[2]);
1925 void p_float_div(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1926 FloatVar x = s.arg2FloatVar(ce[0]);
1927 FloatVar y = s.arg2FloatVar(ce[1]);
1928 FloatVar z = s.arg2FloatVar(ce[2]);
1932 void p_float_plus(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1933 FloatVar x = s.arg2FloatVar(ce[0]);
1934 FloatVar y = s.arg2FloatVar(ce[1]);
1935 FloatVar z = s.arg2FloatVar(ce[2]);
1939 void p_float_sqrt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1940 FloatVar x = s.arg2FloatVar(ce[0]);
1941 FloatVar y = s.arg2FloatVar(ce[1]);
1945 void p_float_abs(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1946 FloatVar x = s.arg2FloatVar(ce[0]);
1947 FloatVar y = s.arg2FloatVar(ce[1]);
1951 void p_float_eq(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1952 FloatVar x = s.arg2FloatVar(ce[0]);
1953 FloatVar y = s.arg2FloatVar(ce[1]);
1956 void p_float_eq_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1957 FloatVar x = s.arg2FloatVar(ce[0]);
1958 FloatVar y = s.arg2FloatVar(ce[1]);
1959 BoolVar b = s.arg2BoolVar(ce[2]);
1962 void p_float_le(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1963 FloatVar x = s.arg2FloatVar(ce[0]);
1964 FloatVar y = s.arg2FloatVar(ce[1]);
1967 void p_float_le_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1968 FloatVar x = s.arg2FloatVar(ce[0]);
1969 FloatVar y = s.arg2FloatVar(ce[1]);
1970 BoolVar b = s.arg2BoolVar(ce[2]);
1973 void p_float_max(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1974 FloatVar x = s.arg2FloatVar(ce[0]);
1975 FloatVar y = s.arg2FloatVar(ce[1]);
1976 FloatVar z = s.arg2FloatVar(ce[2]);
1979 void p_float_min(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1980 FloatVar x = s.arg2FloatVar(ce[0]);
1981 FloatVar y = s.arg2FloatVar(ce[1]);
1982 FloatVar z = s.arg2FloatVar(ce[2]);
1985 void p_float_lt(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1986 FloatVar x = s.arg2FloatVar(ce[0]);
1987 FloatVar y = s.arg2FloatVar(ce[1]);
1992 void p_float_lt_reif(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
1993 FloatVar x = s.arg2FloatVar(ce[0]);
1994 FloatVar y = s.arg2FloatVar(ce[1]);
1995 BoolVar b = s.arg2BoolVar(ce[2]);
1998 rel(s, b == (b0 && !b1));
2003 void p_float_ne(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2004 FloatVar x = s.arg2FloatVar(ce[0]);
2005 FloatVar y = s.arg2FloatVar(ce[1]);
2009 #ifdef GECODE_HAS_MPFR
2010 #define P_FLOAT_OP(Op) \
2011 void p_float_ ## Op (FlatZincSpace& s, const ConExpr& ce, AST::Node*) {\
2012 FloatVar x = s.arg2FloatVar(ce[0]);\
2013 FloatVar y = s.arg2FloatVar(ce[1]);\
2028 void p_float_ln(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2029 FloatVar x = s.arg2FloatVar(ce[0]);
2030 FloatVar y = s.arg2FloatVar(ce[1]);
2033 void p_float_log10(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2034 FloatVar x = s.arg2FloatVar(ce[0]);
2035 FloatVar y = s.arg2FloatVar(ce[1]);
2038 void p_float_log2(FlatZincSpace& s,
const ConExpr& ce, AST::Node*) {
2039 FloatVar x = s.arg2FloatVar(ce[0]);
2040 FloatVar y = s.arg2FloatVar(ce[1]);
2066 registry().
add(
"float_lin_eq_reif",&p_float_lin_eq_reif);
2068 registry().
add(
"float_lin_le_reif",&p_float_lin_le_reif);
2070 #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 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.
union Gecode::@512::NNF::@54 u
Union depending on nodetype t.
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 sequence(Home home, const IntVarArgs &x, const IntSet &s, int q, int l, int u, IntConLevel)
Post propagator for .
void post(FlatZincSpace &s, const ConExpr &ce, AST::Node *ann)
Post constraint specified by ce.
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 .
struct Gecode::@512::NNF::@54::@55 b
For binary nodes (and, or, eqv)
void asin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
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.
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.
Gecode toplevel namespace
Implication for reification.
void sin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
A node in a FlatZinc abstract syntax tree.
struct Gecode::@512::NNF::@54::@56 a
For atomic nodes.
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 .
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.