00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <gecode/set.hh>
00042 #include <gecode/set/rel.hh>
00043
00044 namespace Gecode {
00045
00046 void
00047 dom(Home home, SetVar s, SetRelType r, int i) {
00048 Set::Limits::check(i, "Set::dom");
00049 IntSet d(i,i);
00050 dom(home, s, r, d);
00051 }
00052
00053 void
00054 dom(Home home, const SetVarArgs& s, SetRelType r, int i) {
00055 Set::Limits::check(i, "Set::dom");
00056 IntSet d(i,i);
00057 dom(home, s, r, d);
00058 }
00059
00060 void
00061 dom(Home home, SetVar s, SetRelType r, int i, int j) {
00062 Set::Limits::check(i, "Set::dom");
00063 Set::Limits::check(j, "Set::dom");
00064 IntSet d(i,j);
00065 dom(home, s, r, d);
00066 }
00067
00068 void
00069 dom(Home home, const SetVarArgs& s, SetRelType r, int i, int j) {
00070 Set::Limits::check(i, "Set::dom");
00071 Set::Limits::check(j, "Set::dom");
00072 IntSet d(i,j);
00073 dom(home, s, r, d);
00074 }
00075
00076 void
00077 dom(Home home, SetVar s, SetRelType r, const IntSet& is) {
00078 Set::Limits::check(is, "Set::dom");
00079 GECODE_POST;
00080
00081 Set::SetView _s(s);
00082
00083 switch (r) {
00084 case SRT_EQ:
00085 {
00086 if (is.ranges() == 1) {
00087 GECODE_ME_FAIL(_s.include(home, is.min(), is.max()));
00088 GECODE_ME_FAIL(_s.intersect(home, is.min(), is.max()));
00089 } else {
00090 IntSetRanges rd1(is);
00091 GECODE_ME_FAIL(_s.includeI(home, rd1));
00092 IntSetRanges rd2(is);
00093 GECODE_ME_FAIL(_s.intersectI(home, rd2));
00094 }
00095 }
00096 break;
00097 case SRT_LQ:
00098 {
00099 Set::ConstSetView cv(home, is);
00100 GECODE_ES_FAIL(
00101 (Set::Rel::Lq<Set::SetView,Set::ConstSetView,false>
00102 ::post(home,s,cv)));
00103 }
00104 break;
00105 case SRT_LE:
00106 {
00107 Set::ConstSetView cv(home, is);
00108 GECODE_ES_FAIL(
00109 (Set::Rel::Lq<Set::SetView,Set::ConstSetView,true>
00110 ::post(home,s,cv)));
00111 }
00112 break;
00113 case SRT_GQ:
00114 {
00115 Set::ConstSetView cv(home, is);
00116 GECODE_ES_FAIL(
00117 (Set::Rel::Lq<Set::ConstSetView,Set::SetView,false>
00118 ::post(home,cv,s)));
00119 }
00120 break;
00121 case SRT_GR:
00122 {
00123 Set::ConstSetView cv(home, is);
00124 GECODE_ES_FAIL(
00125 (Set::Rel::Lq<Set::ConstSetView,Set::SetView,true>
00126 ::post(home,cv,s)));
00127 }
00128 break;
00129 case SRT_DISJ:
00130 {
00131 if (is.ranges() == 1) {
00132 GECODE_ME_FAIL(_s.exclude(home, is.min(), is.max()));
00133 } else {
00134 IntSetRanges rd(is);
00135 GECODE_ME_FAIL(_s.excludeI(home, rd));
00136 }
00137 }
00138 break;
00139 case SRT_NQ:
00140 {
00141 Set::ConstSetView cv(home, is);
00142 GECODE_ES_FAIL(
00143 (Set::Rel::DistinctDoit<Set::SetView>::post(home, s,
00144 cv)));
00145 }
00146 break;
00147 case SRT_SUB:
00148 {
00149 if (is.ranges() == 1) {
00150 GECODE_ME_FAIL(_s.intersect(home, is.min(), is.max()));
00151 } else {
00152 IntSetRanges rd(is);
00153 GECODE_ME_FAIL(_s.intersectI(home, rd));
00154 }
00155 }
00156 break;
00157 case SRT_SUP:
00158 {
00159 if (is.ranges() == 1) {
00160 GECODE_ME_FAIL(_s.include(home, is.min(), is.max()));
00161 } else {
00162 IntSetRanges rd(is);
00163 GECODE_ME_FAIL(_s.includeI(home, rd));
00164 }
00165 }
00166 break;
00167 case SRT_CMPL:
00168 {
00169 if (is.ranges() == 1) {
00170 GECODE_ME_FAIL(_s.exclude(home, is.min(), is.max()));
00171 GECODE_ME_FAIL(
00172 _s.include(home,
00173 Set::Limits::min,
00174 is.min()-1) );
00175 GECODE_ME_FAIL(
00176 _s.include(home, is.max()+1,
00177 Set::Limits::max) );
00178 } else {
00179 IntSetRanges rd1(is);
00180 Set::RangesCompl<IntSetRanges > rdC1(rd1);
00181 GECODE_ME_FAIL(_s.includeI(home, rdC1));
00182 IntSetRanges rd2(is);
00183 Set::RangesCompl<IntSetRanges > rdC2(rd2);
00184 GECODE_ME_FAIL(_s.intersectI(home, rdC2));
00185 }
00186 }
00187 break;
00188 default:
00189 throw Set::UnknownRelation("Set::dom");
00190 }
00191 }
00192
00193 void
00194 dom(Home home, const SetVarArgs& s, SetRelType r, const IntSet& is) {
00195 Set::Limits::check(is, "Set::dom");
00196 GECODE_POST;
00197
00198 switch (r) {
00199 case SRT_EQ:
00200 {
00201 if (is.ranges() == 1) {
00202 for (int i=s.size(); i--; ) {
00203 Set::SetView _s(s[i]);
00204 GECODE_ME_FAIL(_s.include(home, is.min(), is.max()));
00205 GECODE_ME_FAIL(_s.intersect(home, is.min(), is.max()));
00206 }
00207 } else {
00208 for (int i=s.size(); i--; ) {
00209 Set::SetView _s(s[i]);
00210 IntSetRanges rd1(is);
00211 GECODE_ME_FAIL(_s.includeI(home, rd1));
00212 IntSetRanges rd2(is);
00213 GECODE_ME_FAIL(_s.intersectI(home, rd2));
00214 }
00215 }
00216 }
00217 break;
00218 case SRT_LQ:
00219 {
00220 Set::ConstSetView cv(home, is);
00221 for (int i=s.size(); i--; ) {
00222 Set::SetView _s(s[i]);
00223 GECODE_ES_FAIL((Set::Rel::Lq<Set::SetView,Set::ConstSetView,false>
00224 ::post(home,_s,cv)));
00225 }
00226 }
00227 break;
00228 case SRT_LE:
00229 {
00230 Set::ConstSetView cv(home, is);
00231 for (int i=s.size(); i--; ) {
00232 Set::SetView _s(s[i]);
00233 GECODE_ES_FAIL((Set::Rel::Lq<Set::SetView,Set::ConstSetView,true>
00234 ::post(home,_s,cv)));
00235 }
00236 }
00237 break;
00238 case SRT_GQ:
00239 {
00240 Set::ConstSetView cv(home, is);
00241 for (int i=s.size(); i--; ) {
00242 Set::SetView _s(s[i]);
00243 GECODE_ES_FAIL((Set::Rel::Lq<Set::ConstSetView,Set::SetView,false>
00244 ::post(home,cv,_s)));
00245 }
00246 }
00247 break;
00248 case SRT_GR:
00249 {
00250 Set::ConstSetView cv(home, is);
00251 for (int i=s.size(); i--; ) {
00252 Set::SetView _s(s[i]);
00253 GECODE_ES_FAIL((Set::Rel::Lq<Set::ConstSetView,Set::SetView,true>
00254 ::post(home,cv,_s)));
00255 }
00256 }
00257 break;
00258 case SRT_DISJ:
00259 {
00260 if (is.ranges() == 1) {
00261 for (int i=s.size(); i--; ) {
00262 Set::SetView _s(s[i]);
00263 GECODE_ME_FAIL(_s.exclude(home, is.min(), is.max()));
00264 }
00265 } else {
00266 for (int i=s.size(); i--; ) {
00267 Set::SetView _s(s[i]);
00268 IntSetRanges rd(is);
00269 GECODE_ME_FAIL(_s.excludeI(home, rd));
00270 }
00271 }
00272 }
00273 break;
00274 case SRT_NQ:
00275 {
00276 Set::ConstSetView cv(home, is);
00277 for (int i=s.size(); i--; ) {
00278 Set::SetView _s(s[i]);
00279 GECODE_ES_FAIL((Set::Rel::DistinctDoit<Set::SetView>
00280 ::post(home,_s,cv)));
00281 }
00282 }
00283 break;
00284 case SRT_SUB:
00285 {
00286 if (is.ranges() == 1) {
00287 for (int i=s.size(); i--; ) {
00288 Set::SetView _s(s[i]);
00289 GECODE_ME_FAIL(_s.intersect(home, is.min(), is.max()));
00290 }
00291 } else {
00292 for (int i=s.size(); i--; ) {
00293 Set::SetView _s(s[i]);
00294 IntSetRanges rd(is);
00295 GECODE_ME_FAIL(_s.intersectI(home, rd));
00296 }
00297 }
00298 }
00299 break;
00300 case SRT_SUP:
00301 {
00302 if (is.ranges() == 1) {
00303 for (int i=s.size(); i--; ) {
00304 Set::SetView _s(s[i]);
00305 GECODE_ME_FAIL(_s.include(home, is.min(), is.max()));
00306 }
00307 } else {
00308 for (int i=s.size(); i--; ) {
00309 Set::SetView _s(s[i]);
00310 IntSetRanges rd(is);
00311 GECODE_ME_FAIL(_s.includeI(home, rd));
00312 }
00313 }
00314 }
00315 break;
00316 case SRT_CMPL:
00317 {
00318 if (is.ranges() == 1) {
00319 for (int i=s.size(); i--; ) {
00320 Set::SetView _s(s[i]);
00321 GECODE_ME_FAIL(_s.exclude(home, is.min(), is.max()));
00322 GECODE_ME_FAIL(_s.include(home,
00323 Set::Limits::min,
00324 is.min()-1) );
00325 GECODE_ME_FAIL(_s.include(home, is.max()+1,
00326 Set::Limits::max) );
00327 }
00328 } else {
00329 for (int i=s.size(); i--; ) {
00330 Set::SetView _s(s[i]);
00331 IntSetRanges rd1(is);
00332 Set::RangesCompl<IntSetRanges > rdC1(rd1);
00333 GECODE_ME_FAIL(_s.includeI(home, rdC1));
00334 IntSetRanges rd2(is);
00335 Set::RangesCompl<IntSetRanges > rdC2(rd2);
00336 GECODE_ME_FAIL(_s.intersectI(home, rdC2));
00337 }
00338 }
00339 }
00340 break;
00341 default:
00342 throw Set::UnknownRelation("Set::dom");
00343 }
00344 }
00345
00346 void
00347 dom(Home home, SetVar s, SetRelType rt, int i, Reify r) {
00348 Set::Limits::check(i, "Set::dom");
00349 IntSet d(i,i);
00350 dom(home, s, rt, d, r);
00351 }
00352
00353 void
00354 dom(Home home, SetVar s, SetRelType rt, int i, int j, Reify r) {
00355 Set::Limits::check(i, "Set::dom");
00356 Set::Limits::check(j, "Set::dom");
00357 IntSet d(i,j);
00358 dom(home, s, rt, d, r);
00359 }
00360
00361 void
00362 dom(Home home, SetVar s, SetRelType rt, const IntSet& is, Reify r) {
00363 Set::Limits::check(is, "Set::dom");
00364 GECODE_POST;
00365 switch (rt) {
00366 case SRT_EQ:
00367 {
00368 Set::ConstSetView cv(home, is);
00369 switch (r.mode()) {
00370 case RM_EQV:
00371 GECODE_ES_FAIL(
00372 (Set::Rel::ReEq<Set::SetView,
00373 Set::ConstSetView,Gecode::Int::BoolView,RM_EQV>
00374 ::post(home, s, cv, r.var())));
00375 break;
00376 case RM_IMP:
00377 GECODE_ES_FAIL(
00378 (Set::Rel::ReEq<Set::SetView,
00379 Set::ConstSetView,Gecode::Int::BoolView,RM_IMP>
00380 ::post(home, s, cv, r.var())));
00381 break;
00382 case RM_PMI:
00383 GECODE_ES_FAIL(
00384 (Set::Rel::ReEq<Set::SetView,
00385 Set::ConstSetView,Gecode::Int::BoolView,RM_PMI>
00386 ::post(home, s, cv, r.var())));
00387 break;
00388 default: throw Gecode::Int::UnknownReifyMode("Set::dom");
00389 }
00390 }
00391 break;
00392 case SRT_LQ:
00393 {
00394 Set::ConstSetView cv(home, is);
00395 switch (r.mode()) {
00396 case RM_EQV:
00397 GECODE_ES_FAIL(
00398 (Set::Rel::ReLq<Set::SetView,
00399 Set::ConstSetView,RM_EQV,false>::post(home, s, cv, r.var())));
00400 break;
00401 case RM_IMP:
00402 GECODE_ES_FAIL(
00403 (Set::Rel::ReLq<Set::SetView,
00404 Set::ConstSetView,RM_IMP,false>::post(home, s, cv, r.var())));
00405 break;
00406 case RM_PMI:
00407 GECODE_ES_FAIL(
00408 (Set::Rel::ReLq<Set::SetView,
00409 Set::ConstSetView,RM_PMI,false>::post(home, s, cv, r.var())));
00410 break;
00411 default: throw Gecode::Int::UnknownReifyMode("Set::dom");
00412 }
00413 }
00414 break;
00415 case SRT_LE:
00416 {
00417 Set::ConstSetView cv(home, is);
00418 switch (r.mode()) {
00419 case RM_EQV:
00420 GECODE_ES_FAIL(
00421 (Set::Rel::ReLq<Set::SetView,
00422 Set::ConstSetView,RM_EQV,true>::post(home, s, cv, r.var())));
00423 break;
00424 case RM_IMP:
00425 GECODE_ES_FAIL(
00426 (Set::Rel::ReLq<Set::SetView,
00427 Set::ConstSetView,RM_IMP,true>::post(home, s, cv, r.var())));
00428 break;
00429 case RM_PMI:
00430 GECODE_ES_FAIL(
00431 (Set::Rel::ReLq<Set::SetView,
00432 Set::ConstSetView,RM_PMI,true>::post(home, s, cv, r.var())));
00433 break;
00434 default: throw Gecode::Int::UnknownReifyMode("Set::dom");
00435 }
00436 }
00437 break;
00438 case SRT_GQ:
00439 {
00440 Set::ConstSetView cv(home, is);
00441 switch (r.mode()) {
00442 case RM_EQV:
00443 GECODE_ES_FAIL(
00444 (Set::Rel::ReLq<Set::ConstSetView,Set::SetView,RM_EQV,false>
00445 ::post(home,cv,s,r.var())));
00446 break;
00447 case RM_IMP:
00448 GECODE_ES_FAIL(
00449 (Set::Rel::ReLq<Set::ConstSetView,Set::SetView,RM_IMP,false>
00450 ::post(home,cv,s,r.var())));
00451 break;
00452 case RM_PMI:
00453 GECODE_ES_FAIL(
00454 (Set::Rel::ReLq<Set::ConstSetView,Set::SetView,RM_PMI,false>
00455 ::post(home,cv,s,r.var())));
00456 break;
00457 default: throw Gecode::Int::UnknownReifyMode("Set::dom");
00458 }
00459 }
00460 break;
00461 case SRT_GR:
00462 {
00463 Set::ConstSetView cv(home, is);
00464 switch (r.mode()) {
00465 case RM_EQV:
00466 GECODE_ES_FAIL(
00467 (Set::Rel::ReLq<Set::ConstSetView,Set::SetView,RM_EQV,true>
00468 ::post(home,cv,s,r.var())));
00469 break;
00470 case RM_IMP:
00471 GECODE_ES_FAIL(
00472 (Set::Rel::ReLq<Set::ConstSetView,Set::SetView,RM_IMP,true>
00473 ::post(home,cv,s,r.var())));
00474 break;
00475 case RM_PMI:
00476 GECODE_ES_FAIL(
00477 (Set::Rel::ReLq<Set::ConstSetView,Set::SetView,RM_PMI,true>
00478 ::post(home,cv,s,r.var())));
00479 break;
00480 default: throw Gecode::Int::UnknownReifyMode("Set::dom");
00481 }
00482 }
00483 break;
00484 case SRT_NQ:
00485 {
00486 Gecode::Int::NegBoolView notb(r.var());
00487 Set::ConstSetView cv(home, is);
00488 switch (r.mode()) {
00489 case RM_EQV:
00490 GECODE_ES_FAIL(
00491 (Set::Rel::ReEq<Set::SetView,
00492 Set::ConstSetView,Gecode::Int::NegBoolView,RM_EQV>
00493 ::post(home, s, cv, notb)));
00494 break;
00495 case RM_IMP:
00496 GECODE_ES_FAIL(
00497 (Set::Rel::ReEq<Set::SetView,
00498 Set::ConstSetView,Gecode::Int::NegBoolView,RM_PMI>
00499 ::post(home, s, cv, notb)));
00500 break;
00501 case RM_PMI:
00502 GECODE_ES_FAIL(
00503 (Set::Rel::ReEq<Set::SetView,
00504 Set::ConstSetView,Gecode::Int::NegBoolView,RM_IMP>
00505 ::post(home, s, cv, notb)));
00506 break;
00507 default: throw Gecode::Int::UnknownReifyMode("Set::dom");
00508 }
00509 }
00510 break;
00511 case SRT_SUB:
00512 {
00513 Set::ConstSetView cv(home, is);
00514 switch (r.mode()) {
00515 case RM_EQV:
00516 GECODE_ES_FAIL(
00517 (Set::Rel::ReSubset<Set::SetView,
00518 Set::ConstSetView,Gecode::Int::BoolView,RM_EQV>
00519 ::post(home, s, cv, r.var())));
00520 break;
00521 case RM_IMP:
00522 GECODE_ES_FAIL(
00523 (Set::Rel::ReSubset<Set::SetView,
00524 Set::ConstSetView,Gecode::Int::BoolView,RM_IMP>
00525 ::post(home, s, cv, r.var())));
00526 break;
00527 case RM_PMI:
00528 GECODE_ES_FAIL(
00529 (Set::Rel::ReSubset<Set::SetView,
00530 Set::ConstSetView,Gecode::Int::BoolView,RM_PMI>
00531 ::post(home, s, cv, r.var())));
00532 break;
00533 default: throw Gecode::Int::UnknownReifyMode("Set::dom");
00534 }
00535 }
00536 break;
00537 case SRT_SUP:
00538 {
00539 Set::ConstSetView cv(home, is);
00540 switch (r.mode()) {
00541 case RM_EQV:
00542 GECODE_ES_FAIL(
00543 (Set::Rel::ReSubset<Set::ConstSetView,Set::SetView,
00544 Gecode::Int::BoolView,RM_EQV>
00545 ::post(home, cv, s, r.var())));
00546 break;
00547 case RM_IMP:
00548 GECODE_ES_FAIL(
00549 (Set::Rel::ReSubset<Set::ConstSetView,Set::SetView,
00550 Gecode::Int::BoolView,RM_IMP>
00551 ::post(home, cv, s, r.var())));
00552 break;
00553 case RM_PMI:
00554 GECODE_ES_FAIL(
00555 (Set::Rel::ReSubset<Set::ConstSetView,Set::SetView,
00556 Gecode::Int::BoolView,RM_PMI>
00557 ::post(home, cv, s, r.var())));
00558 break;
00559 default: throw Gecode::Int::UnknownReifyMode("Set::dom");
00560 }
00561 }
00562 break;
00563 case SRT_DISJ:
00564 {
00565
00566
00567
00568
00569 IntSetRanges dr1(is);
00570 Set::RangesCompl<IntSetRanges > dc1(dr1);
00571 IntSet dcompl(dc1);
00572 Set::ConstSetView cvcompl(home, dcompl);
00573 switch (r.mode()) {
00574 case RM_EQV:
00575 GECODE_ES_FAIL(
00576 (Set::Rel::ReSubset<Set::SetView,
00577 Set::ConstSetView,Gecode::Int::BoolView,RM_EQV>
00578 ::post(home, s, cvcompl, r.var())));
00579 break;
00580 case RM_IMP:
00581 GECODE_ES_FAIL(
00582 (Set::Rel::ReSubset<Set::SetView,
00583 Set::ConstSetView,Gecode::Int::BoolView,RM_IMP>
00584 ::post(home, s, cvcompl, r.var())));
00585 break;
00586 case RM_PMI:
00587 GECODE_ES_FAIL(
00588 (Set::Rel::ReSubset<Set::SetView,
00589 Set::ConstSetView,Gecode::Int::BoolView,RM_PMI>
00590 ::post(home, s, cvcompl, r.var())));
00591 break;
00592 default: throw Gecode::Int::UnknownReifyMode("Set::dom");
00593 }
00594 }
00595 break;
00596 case SRT_CMPL:
00597 {
00598 Set::SetView sv(s);
00599
00600 IntSetRanges dr1(is);
00601 Set::RangesCompl<IntSetRanges> dc1(dr1);
00602 IntSet dcompl(dc1);
00603 Set::ConstSetView cvcompl(home, dcompl);
00604
00605 switch (r.mode()) {
00606 case RM_EQV:
00607 GECODE_ES_FAIL(
00608 (Set::Rel::ReEq<Set::SetView,
00609 Set::ConstSetView,Gecode::Int::BoolView,RM_EQV>
00610 ::post(home, s, cvcompl, r.var())));
00611 break;
00612 case RM_IMP:
00613 GECODE_ES_FAIL(
00614 (Set::Rel::ReEq<Set::SetView,
00615 Set::ConstSetView,Gecode::Int::BoolView,RM_IMP>
00616 ::post(home, s, cvcompl, r.var())));
00617 break;
00618 case RM_PMI:
00619 GECODE_ES_FAIL(
00620 (Set::Rel::ReEq<Set::SetView,
00621 Set::ConstSetView,Gecode::Int::BoolView,RM_PMI>
00622 ::post(home, s, cvcompl, r.var())));
00623 break;
00624 default: throw Gecode::Int::UnknownReifyMode("Set::dom");
00625 }
00626 }
00627 break;
00628 default:
00629 throw Set::UnknownRelation("Set::dom");
00630 }
00631 }
00632
00633 void
00634 dom(Home home, SetVar x, SetVar d) {
00635 using namespace Set;
00636 GECODE_POST;
00637 SetView xv(x), dv(d);
00638 if (!same(xv,dv)) {
00639 GECODE_ME_FAIL(xv.cardMax(home,dv.cardMax()));
00640 GECODE_ME_FAIL(xv.cardMin(home,dv.cardMin()));
00641 GlbRanges<SetView> lb(dv);
00642 GECODE_ME_FAIL(xv.includeI(home,lb));
00643 LubRanges<SetView> ub(dv);
00644 GECODE_ME_FAIL(xv.intersectI(home,ub));
00645 }
00646 }
00647
00648 void
00649 dom(Home home, const SetVarArgs& x, const SetVarArgs& d) {
00650 using namespace Set;
00651 if (x.size() != d.size())
00652 throw ArgumentSizeMismatch("Set::dom");
00653 for (int i=x.size(); i--; ) {
00654 GECODE_POST;
00655 SetView xv(x[i]), dv(d[i]);
00656 if (!same(xv,dv)) {
00657 GECODE_ME_FAIL(xv.cardMax(home,dv.cardMax()));
00658 GECODE_ME_FAIL(xv.cardMin(home,dv.cardMin()));
00659 GlbRanges<SetView> lb(dv);
00660 GECODE_ME_FAIL(xv.includeI(home,lb));
00661 LubRanges<SetView> ub(dv);
00662 GECODE_ME_FAIL(xv.intersectI(home,ub));
00663 }
00664 }
00665 }
00666
00667 }
00668
00669