Generated on for Gecode by doxygen 1.17.0
common.hpp
Go to the documentation of this file.
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2/*
3 * Main authors:
4 * Guido Tack <tack@gecode.dev>
5 * Christian Schulte <schulte@gecode.dev>
6 *
7 * Contributing authors:
8 * Gabor Szokoli <szokoli@gecode.dev>
9 *
10 * Copyright:
11 * Guido Tack, 2004
12 * Christian Schulte, 2004
13 * Gabor Szokoli, 2004
14 *
15 * This file is part of Gecode, the generic constraint
16 * development environment:
17 * http://www.gecode.dev
18 *
19 * Permission is hereby granted, free of charge, to any person obtaining
20 * a copy of this software and associated documentation files (the
21 * "Software"), to deal in the Software without restriction, including
22 * without limitation the rights to use, copy, modify, merge, publish,
23 * distribute, sublicense, and/or sell copies of the Software, and to
24 * permit persons to whom the Software is furnished to do so, subject to
25 * the following conditions:
26 *
27 * The above copyright notice and this permission notice shall be
28 * included in all copies or substantial portions of the Software.
29 *
30 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
31 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
33 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
34 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
35 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
36 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 *
38 */
39
40#ifndef GECODE_SET_RELOP_COMM_ICC
41#define GECODE_SET_RELOP_COMM_ICC
42
43namespace Gecode {
44
45 template<class View0, class View1>
46 forceinline bool
47 viewarrayshared(const ViewArray<View0>& va, const View1& y) {
48 return shared(va,y);
49 }
50
51 template<>
52 forceinline bool
55 return false;
56 }
57
59 template<>
60 forceinline bool
62 (const ViewArray<Set::ComplementView<Set::SingletonView> >&,
63 const Set::SetView&) {
64 return false;
65 }
66
67 template<>
68 forceinline bool
73 return false;
74 }
76
77
78namespace Set { namespace RelOp {
79
80 /*
81 * Detect sharing between 3 variables
82 *
83 */
84 template<class View0, class View1, class View2>
85 forceinline bool
86 shared(View0 v0, View1 v1, View2 v2) {
87 return shared(v0,v1) || shared(v0,v2) || shared(v1,v2);
88 }
89
90 template<class View0, class View1, class View2>
92 bool& retmodified, View0& x0, View1& x1, View2& x2) {
93 bool modified = false;
94 do {
95 retmodified |= modified;
96 modified = false;
97
98 {
99 LubRanges<View0> x0ub(x0);
100 LubRanges<View1> x1ub(x1);
102 u1(x0ub,x1ub);
103 unsigned int s1 = Iter::Ranges::size(u1);
104
105 if (x0.cardMin() + x1.cardMin() > s1) {
107 x2.cardMin(home, x0.cardMin()+x1.cardMin()-s1));
108 }
109
110 // unsigned int res = std::max(x0.cardMin()+
111 // (x1.cardMin()<s1 ?
112 // 0 : x1.cardMin()-s1),
113 // std::max(x0.cardMin(),
114 // x1.cardMin()));
115 // GECODE_ME_CHECK_MODIFIED(modified, x2.cardMin(home,res));
116 }
117
118 {
119 GlbRanges<View0> x0lb(x0);
120 GlbRanges<View1> x1lb(x1);
122 u1(x0lb,x1lb);
123 unsigned int s1 = Iter::Ranges::size(u1);
125 x2.cardMax(home,
126 x0.cardMax()+x1.cardMax()-s1));
127 }
128
129 if (x2.cardMax() < x1.cardMin())
131 x0.cardMax(home,
132 Set::Limits::card+x2.cardMax()-x1.cardMin()));
133
134 if (x2.cardMax() < x0.cardMin())
136 x1.cardMax(home,
137 Set::Limits::card+x2.cardMax()-x0.cardMin()));
138
140 x0.cardMin(home,x2.cardMin()));
142 x1.cardMin(home,x2.cardMin()));
143 } while(modified);
144 return ES_FIX;
145 }
146 template<class View0, class View1, class View2>
148 bool& retmodified, View0& x0, View1& x1, View2& x2) {
149 bool modified = false;
150 do {
151 retmodified |= modified;
152 modified = false;
153
154 {
155 LubRanges<View0> x0ub(x0);
156 LubRanges<View1> x1ub(x1);
158 unsigned int s1 = Iter::Ranges::size(i1);
159 unsigned int res = std::max(x0.cardMin()+
160 (x1.cardMin()<s1 ?
161 0 : x1.cardMin()-s1),
162 std::max(x0.cardMin(),
163 x1.cardMin()));
164 GECODE_ME_CHECK_MODIFIED(modified, x2.cardMin(home,res));
165 }
166
167 {
168 LubRanges<View0> x0ub(x0);
169 LubRanges<View1> x1ub(x1);
171 unsigned int s1 = Iter::Ranges::size(u1);
173 x2.cardMax(home,
174 std::min(x0.cardMax()+x1.cardMax(),s1)));
175 }
176
177 if (x2.cardMin() > x1.cardMax())
179 x0.cardMin(home,x2.cardMin() - x1.cardMax()));
180
181 if (x2.cardMin() > x0.cardMax())
183 x1.cardMin(home,x2.cardMin() - x0.cardMax()));
184
186 x0.cardMax(home,x2.cardMax()));
188 x1.cardMax(home,x2.cardMax()));
189 } while(modified);
190 return ES_FIX;
191 }
192
193 template<class View0, class View1>
195 unionNCard(Space& home, bool& modified, ViewArray<View0>& x,
196 View1& y, GLBndSet& unionOfDets) {
197 int xsize = x.size();
198 // Max(Xi.cardMin) <= y.card <= Sum(Xi.cardMax)
199 // Xi.card <=y.cardMax
200 unsigned int cardMaxSum=unionOfDets.size();
201 bool maxValid = true;
202 for (int i=xsize; i--; ) {
203 cardMaxSum+=x[i].cardMax();
204 if (cardMaxSum < x[i].cardMax()) { maxValid = false; } //overflow
205 GECODE_ME_CHECK_MODIFIED(modified, y.cardMin(home,x[i].cardMin()) );
206 GECODE_ME_CHECK_MODIFIED(modified, x[i].cardMax(home,y.cardMax()) );
207 }
208 if (maxValid) {
209 GECODE_ME_CHECK_MODIFIED(modified, y.cardMax(home,cardMaxSum));
210 }
211 //y.cardMin - Sum(Xj.cardMax) <= Xi.card
212
213 if (x.size() == 0)
214 return ES_NOFIX;
215
216 Region r;
217 //TODO: overflow management is a waste now.
218 {
219 unsigned int* rightSum = r.alloc<unsigned int>(xsize);
220 rightSum[xsize-1]=0;
221
222 for (int i=x.size()-1;i--;) {
223 rightSum[i] = rightSum[i+1] + x[i+1].cardMax();
224 if (rightSum[i] < rightSum[i+1]) {
225 //overflow, fill the rest of the array.
226 for (int j=i; j>0;j--) {
227 rightSum[j]=Limits::card;
228 }
229 break;
230 }
231 }
232
233 //Size of union of determied vars missing from x sneaked in here:
234 unsigned int leftAcc=unionOfDets.size();
235
236 for (int i=0; i<xsize;i++) {
237 unsigned int jsum = leftAcc+rightSum[i];
238 //If jsum did not overflow and is less than y.cardMin:
239 if (jsum >= leftAcc && jsum < y.cardMin()) {
240 GECODE_ME_CHECK_MODIFIED(modified, x[i].cardMin(home,y.cardMin()-jsum));
241 }
242 leftAcc += x[i].cardMax();
243 if (leftAcc < x[i].cardMax()) {leftAcc = Limits::card;}
244 }
245 }
246
247 //y.cardMin - |U(Xj.ub)| <= Xi.card
248
249 {
250 GLBndSet* rightUnion =
251 static_cast<GLBndSet*>(r.ralloc(sizeof(GLBndSet)*xsize));
252 new (&rightUnion[xsize-1]) GLBndSet(home);
253 for (int i=xsize-1;i--;) {
254 BndSetRanges prev(rightUnion[i+1]);
255 LubRanges<View0> prevX(x[i+1]);
257 iter(prev,prevX);
258 new (&rightUnion[i]) GLBndSet(home);
259 rightUnion[i].includeI(home, iter);
260 }
261
262 //union of determied vars missing from x sneaked in here:
263 GLBndSet leftAcc;
264 leftAcc.update(home,unionOfDets);
265 for (int i=0; i<xsize; i++) {
266 BndSetRanges left(leftAcc);
267 BndSetRanges right(rightUnion[i]);
269 BndSetRanges> iter(left, right);
270 unsigned int unionSize = Iter::Ranges::size(iter);
271 if (y.cardMin() > unionSize) {
273 x[i].cardMin(home, y.cardMin() - unionSize) );
274 }
275 LubRanges<View0> xiub(x[i]);
276 leftAcc.includeI(home, xiub);
277 }
278
279 for (int i=xsize; i--;)
280 rightUnion[i].dispose(home);
281 leftAcc.dispose(home);
282 }
283
284 //no need for this: |y.lb - U(Xj.cardMax)| <= S.card
285
286 return ES_NOFIX;
287
288 }
289
290 /*
291 * Xi UB is subset of YUB
292 * Subscribes to Y UB
293 */
294 template<class View0, class View1>
297 bool& modified, ViewArray<View0>& x, View1& y,
298 GLBndSet &) {
299 int xsize = x.size();
300 for (int i=xsize; i--; ) {
301 LubRanges<View1> yub(y);
302 GECODE_ME_CHECK_MODIFIED(modified, x[i].intersectI(home, yub));
303 }
304 return ES_FIX;
305 }
306
307 // cardinality rules for PartitionN constraint
308 template<class View0, class View1>
311 bool& modified, ViewArray<View0>& x, View1& y,
312 GLBndSet& unionOfDets) {
313 unsigned int cardMinSum=unionOfDets.size();
314 unsigned int cardMaxSum=unionOfDets.size();
315 int xsize = x.size();
316 for (int i=xsize; i--; ) {
317 cardMinSum+=x[i].cardMin();
318 if (cardMinSum < x[i].cardMin()) {
319 //sum of mins overflows: fail the space.
321 }
322 }
323 GECODE_ME_CHECK_MODIFIED(modified, y.cardMin(home,cardMinSum));
324 for (int i=xsize; i--; ) {
325 cardMaxSum+=x[i].cardMax();
326 if (cardMaxSum < x[i].cardMax()) {
327 //sum of maxes overflows: no useful information to tell.
328 goto overflow;
329 }
330 }
331 GECODE_ME_CHECK_MODIFIED(modified, y.cardMax(home,cardMaxSum));
332
333 if (x.size() == 0)
334 return ES_NOFIX;
335
336 overflow:
337
338 //Cardinality of each x[i] limited by cardinality of y minus all x[j]s:
339
340 {
341 Region r;
342 unsigned int* rightMinSum = r.alloc<unsigned int>(xsize);
343 unsigned int* rightMaxSum = r.alloc<unsigned int>(xsize);
344 rightMinSum[xsize-1]=0;
345 rightMaxSum[xsize-1]=0;
346
347 for (int i=x.size()-1;i--;) {
348 rightMaxSum[i] = rightMaxSum[i+1] + x[i+1].cardMax();
349 if (rightMaxSum[i] < rightMaxSum[i+1]) {
350 //overflow, fill the rest of the array.
351 for (int j=i; j>0;j--) {
352 rightMaxSum[j]=Limits::card;
353 }
354 break;
355 }
356 }
357 for (int i=x.size()-1;i--;) {
358 rightMinSum[i] = rightMinSum[i+1] + x[i+1].cardMin();
359 if (rightMinSum[i] < rightMinSum[i+1]) {
360 //overflow, fail the space
362 }
363 }
364 unsigned int leftMinAcc=unionOfDets.size();
365 unsigned int leftMaxAcc=unionOfDets.size();
366
367 for (int i=0; i<xsize;i++) {
368 unsigned int maxSum = leftMaxAcc+rightMaxSum[i];
369 unsigned int minSum = leftMinAcc+rightMinSum[i];
370 //If maxSum did not overflow and is less than y.cardMin:
371 if (maxSum >= leftMaxAcc && maxSum < y.cardMin()) {
372 GECODE_ME_CHECK_MODIFIED(modified, x[i].cardMin(home,y.cardMin()-maxSum));
373 }
374
375 //Overflow, fail.
376 if (minSum < leftMinAcc || y.cardMax() < minSum) {
378 }
379 else {
380 GECODE_ME_CHECK_MODIFIED(modified, x[i].cardMax(home,y.cardMax()-minSum));
381 }
382
383 leftMaxAcc += x[i].cardMax();
384 if (leftMaxAcc < x[i].cardMax())
385 leftMaxAcc = Limits::card;
386 leftMinAcc += x[i].cardMin();
387 if (leftMinAcc < x[i].cardMin())
389 }
390 }
391
392 return ES_NOFIX;
393 }
394
395 // Xi LB includes YLB minus union Xj UB
396 // Xi UB is subset of YUB minus union of Xj LBs
397 template<class View0, class View1>
400 bool& modified, ViewArray<View0>& x, View1& y) {
401 int xsize = x.size();
402 Region r;
403 GLBndSet* afterUB =
404 static_cast<GLBndSet*>(r.ralloc(sizeof(GLBndSet)*xsize));
405 GLBndSet* afterLB =
406 static_cast<GLBndSet*>(r.ralloc(sizeof(GLBndSet)*xsize));
407
408 {
409 GLBndSet sofarAfterUB;
410 GLBndSet sofarAfterLB;
411 for (int i=xsize; i--;) {
412 new (&afterUB[i]) GLBndSet(home);
413 new (&afterLB[i]) GLBndSet(home);
414 afterUB[i].update(home,sofarAfterUB);
415 afterLB[i].update(home,sofarAfterLB);
416 LubRanges<View0> xiub(x[i]);
417 GlbRanges<View0> xilb(x[i]);
418 sofarAfterUB.includeI(home,xiub);
419 sofarAfterLB.includeI(home,xilb);
420 }
421 sofarAfterUB.dispose(home);
422 sofarAfterLB.dispose(home);
423 }
424
425 {
426 GLBndSet sofarBeforeUB;
427 GLBndSet sofarBeforeLB;
428 for (int i=0; i<xsize; i++) {
429 LubRanges<View1> yub(y);
430 BndSetRanges slb(sofarBeforeLB);
431 BndSetRanges afterlb(afterLB[i]);
433 BndSetRanges> xjlb(slb, afterlb);
436 BndSetRanges> > diff1(yub, xjlb);
437 GECODE_ME_CHECK_MODIFIED(modified, x[i].intersectI(home,diff1));
438
439 GlbRanges<View1> ylb(y);
440 BndSetRanges sub(sofarBeforeUB);
441 BndSetRanges afterub(afterUB[i]);
443 BndSetRanges> xjub(sub, afterub);
446 BndSetRanges> > diff2(ylb, xjub);
447 GECODE_ME_CHECK_MODIFIED(modified, x[i].includeI(home,diff2));
448
449 LubRanges<View0> xiub(x[i]);
450 GlbRanges<View0> xilb(x[i]);
451 sofarBeforeUB.includeI(home,xiub);
452 sofarBeforeLB.includeI(home,xilb);
453 }
454 sofarBeforeLB.dispose(home);
455 sofarBeforeUB.dispose(home);
456 }
457
458 for (int i=xsize;i--;) {
459 afterUB[i].dispose(home);
460 afterLB[i].dispose(home);
461 }
462
463 return ES_NOFIX;
464 }
465
466 // Xi UB is subset of YUB minus union of Xj LBs
467 template<class View0, class View1>
470 bool& modified, ViewArray<View0>& x, View1& y,
471 GLBndSet& unionOfDets) {
472 int xsize = x.size();
473 Region r;
474 GLBndSet* afterLB =
475 static_cast<GLBndSet*>(r.ralloc(sizeof(GLBndSet)*xsize));
476
477 {
478 GLBndSet sofarAfterLB;
479 for (int i=xsize; i--;) {
480 new (&afterLB[i]) GLBndSet(home);
481 afterLB[i].update(home,sofarAfterLB);
482 GlbRanges<View0> xilb(x[i]);
483 sofarAfterLB.includeI(home,xilb);
484 }
485 sofarAfterLB.dispose(home);
486 }
487
488 {
489 GLBndSet sofarBeforeLB;
490 sofarBeforeLB.update(home,unionOfDets);
491 for (int i=0; i<xsize; i++) {
492 LubRanges<View1> yub(y);
493 BndSetRanges slb(sofarBeforeLB);
494 BndSetRanges afterlb(afterLB[i]);
496 BndSetRanges> xjlb(slb, afterlb);
499 BndSetRanges> > diff1(yub, xjlb);
500 GECODE_ME_CHECK_MODIFIED(modified, x[i].intersectI(home,diff1));
501
502 GlbRanges<View0> xilb(x[i]);
503 sofarBeforeLB.includeI(home,xilb);
504 }
505 sofarBeforeLB.dispose(home);
506 }
507 for (int i=xsize; i--;)
508 afterLB[i].dispose(home);
509 return ES_NOFIX;
510 }
511
512 // Xi LB includes YLB minus union Xj UB
513 template<class View0, class View1>
516 bool& modified, ViewArray<View0>& x, View1& y,
517 GLBndSet& unionOfDets) {
518 int xsize = x.size();
519 Region r;
520 GLBndSet* afterUB =
521 static_cast<GLBndSet*>(r.ralloc(sizeof(GLBndSet)*xsize));
522
523 {
524 GLBndSet sofarAfterUB;
525 for (int i=xsize; i--;) {
526 new (&afterUB[i]) GLBndSet(home);
527 afterUB[i].update(home,sofarAfterUB);
528 LubRanges<View0> xiub(x[i]);
529 sofarAfterUB.includeI(home,xiub);
530 }
531 sofarAfterUB.dispose(home);
532 }
533
534 {
535 //The union of previously determined x[j]-s is added to the mix here:
536 GLBndSet sofarBeforeUB;
537 sofarBeforeUB.update(home,unionOfDets);
538 for (int i=0; i<xsize; i++) {
539 GlbRanges<View1> ylb(y);
540 BndSetRanges sub(sofarBeforeUB);
541 BndSetRanges afterub(afterUB[i]);
543 BndSetRanges> xjub(sub, afterub);
546 BndSetRanges> > diff2(ylb, xjub);
547 GECODE_ME_CHECK_MODIFIED(modified, x[i].includeI(home,diff2));
548
549 LubRanges<View0> xiub(x[i]);
550 sofarBeforeUB.includeI(home,xiub);
551 }
552 sofarBeforeUB.dispose(home);
553 }
554 for (int i=xsize;i--;)
555 afterUB[i].dispose(home);
556 return ES_NOFIX;
557 }
558
559 // Y LB contains union of X LBs
560 template<class View0, class View1>
563 bool& modified, ViewArray<View0>& x, View1& y,
564 GLBndSet& unionOfDets) {
565 assert(unionOfDets.isConsistent());
566 int xsize = x.size();
567 Region reg;
568 GlbRanges<View0>* xLBs = reg.alloc<GlbRanges<View0> >(xsize);
569 int nonEmptyCounter=0;
570 for (int i = xsize; i--; ) {
571 GlbRanges<View0> r(x[i]);
572 if (r()) {
573 xLBs[nonEmptyCounter] = r;
574 nonEmptyCounter++;
575 }
576 }
577 if (nonEmptyCounter !=0) {
578 Iter::Ranges::NaryUnion xLBUnion(reg,xLBs,nonEmptyCounter);
579 BndSetRanges dets(unionOfDets);
580 xLBUnion |= dets;
581 GECODE_ME_CHECK_MODIFIED(modified, y.includeI(home,xLBUnion));
582 }
583 return ES_FIX;
584 }
585
586 // Y UB is subset of union of X UBs
587 template<class View0, class View1>
590 bool& modified, ViewArray<View0>& x, View1& y,
591 GLBndSet& unionOfDets) {
592 int xsize = x.size();
593 Region reg;
594 LubRanges<View0>* xUBs = reg.alloc<LubRanges<View0> >(xsize);
595 int nonEmptyCounter=0;
596 for (int i = xsize; i--; ) {
597 LubRanges<View0> r(x[i]);
598 if (r()) {
599 xUBs[nonEmptyCounter] = r;
600 nonEmptyCounter++;
601 }
602 }
603 if (nonEmptyCounter != 0) {
604 Iter::Ranges::NaryUnion xUBUnion(reg,xUBs,nonEmptyCounter);
605 BndSetRanges dets(unionOfDets);
606 xUBUnion |= dets;
607 GECODE_ME_CHECK_MODIFIED(modified, y.intersectI(home,xUBUnion));
608 }
609 return ES_FIX;
610 }
611
612}}}
613
614#endif
615
616// STATISTICS: set-prop
Range iterator for computing set difference.
Range iterator for computing intersection (binary).
Range iterator for union of iterators.
Range iterator for computing union (binary).
Handle to region.
Definition region.hpp:55
void * ralloc(size_t s)
Allocate memory from region.
Definition region.hpp:361
T * alloc(long unsigned int n)
Allocate block of n objects of type T from region.
Definition region.hpp:386
Range iterator for integer sets.
Definition var-imp.hpp:185
bool isConsistent(void) const
Check whether internal invariants hold.
unsigned int size(void) const
Return size.
void update(Space &home, BndSet &x)
Update this set to be a clone of set x.
void dispose(Space &home)
Free memory used by this set.
Complement set view.
Definition view.hpp:769
Growing sets of integers.
Definition var-imp.hpp:205
bool includeI(Space &home, I &i)
Include the set represented by i in this set.
Range iterator for the greatest lower bound.
Definition var-imp.hpp:359
Range iterator for the least upper bound.
Definition var-imp.hpp:317
Set view for set variables
Definition view.hpp:56
Computation spaces.
Definition core.hpp:1775
View arrays.
Definition array.hpp:255
int size(void) const
Return size of array (number of elements).
Definition array.hpp:1156
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
Definition macros.hpp:52
#define GECODE_ME_CHECK_MODIFIED(modified, me)
Check whether me is failed or modified, and forward failure.
Definition macros.hpp:64
unsigned int size(I &i)
Size of all ranges of range iterator i.
const unsigned int card
Maximum cardinality of an integer set.
Definition set.hh:101
Standard set operation propagators.
Definition rel-op.hh:46
ExecStatus interCard(Space &home, bool &retmodified, View0 &x0, View1 &x1, View2 &x2)
Definition common.hpp:91
ExecStatus partitionNCard(Space &home, bool &modified, ViewArray< View0 > &x, View1 &y, GLBndSet &unionOfDets)
Definition common.hpp:310
bool shared(View0 v0, View1 v1, View2 v2)
Definition common.hpp:86
ExecStatus partitionNYLB(Space &home, bool &modified, ViewArray< View0 > &x, View1 &y, GLBndSet &unionOfDets)
Definition common.hpp:562
ExecStatus unionNCard(Space &home, bool &modified, ViewArray< View0 > &x, View1 &y, GLBndSet &unionOfDets)
Definition common.hpp:195
ExecStatus partitionNXiUB(Space &home, bool &modified, ViewArray< View0 > &x, View1 &y, GLBndSet &unionOfDets)
Definition common.hpp:469
ExecStatus partitionNXi(Space &home, bool &modified, ViewArray< View0 > &x, View1 &y)
Definition common.hpp:399
ExecStatus unionNXiUB(Space &home, bool &modified, ViewArray< View0 > &x, View1 &y, GLBndSet &)
Definition common.hpp:296
ExecStatus unionCard(Space &home, bool &retmodified, View0 &x0, View1 &x1, View2 &x2)
Definition common.hpp:147
ExecStatus partitionNXiLB(Space &home, bool &modified, ViewArray< View0 > &x, View1 &y, GLBndSet &unionOfDets)
Definition common.hpp:515
ExecStatus partitionNYUB(Space &home, bool &modified, ViewArray< View0 > &x, View1 &y, GLBndSet &unionOfDets)
Definition common.hpp:589
Finite integer sets.
Definition var-imp.hpp:145
const Gecode::ModEvent ME_SET_FAILED
Domain operation has resulted in failure.
Definition var-type.hpp:146
Gecode toplevel namespace
bool viewarrayshared(const ViewArray< View0 > &va, const View1 &y)
Definition common.hpp:47
bool viewarrayshared< Set::SingletonView, Set::SetView >(const ViewArray< Set::SingletonView > &, const Set::SetView &)
Definition common.hpp:54
ExecStatus
Definition core.hpp:479
@ ES_FIX
Propagation has computed fixpoint.
Definition core.hpp:484
@ ES_NOFIX
Propagation has not computed fixpoint.
Definition core.hpp:482
bool shared(ViewArray< ViewX > x, ViewArray< ViewY > y)
Definition array.hpp:1455