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 #include <gecode/int/rel.hh>
00039 #include <gecode/int/bool.hh>
00040
00041 #include <algorithm>
00042
00043 namespace Gecode {
00044
00045 using namespace Int;
00046
00047 void
00048 rel(Home home, IntVar x0, IntRelType irt, int n, IntConLevel) {
00049 Limits::check(n,"Int::rel");
00050 if (home.failed()) return;
00051 IntView x(x0);
00052 switch (irt) {
00053 case IRT_EQ: GECODE_ME_FAIL(x.eq(home,n)); break;
00054 case IRT_NQ: GECODE_ME_FAIL(x.nq(home,n)); break;
00055 case IRT_LQ: GECODE_ME_FAIL(x.lq(home,n)); break;
00056 case IRT_LE: GECODE_ME_FAIL(x.le(home,n)); break;
00057 case IRT_GQ: GECODE_ME_FAIL(x.gq(home,n)); break;
00058 case IRT_GR: GECODE_ME_FAIL(x.gr(home,n)); break;
00059 default: throw UnknownRelation("Int::rel");
00060 }
00061 }
00062
00063 void
00064 rel(Home home, const IntVarArgs& x, IntRelType irt, int n, IntConLevel) {
00065 Limits::check(n,"Int::rel");
00066 if (home.failed()) return;
00067 switch (irt) {
00068 case IRT_EQ:
00069 for (int i=x.size(); i--; ) {
00070 IntView xi(x[i]); GECODE_ME_FAIL(xi.eq(home,n));
00071 }
00072 break;
00073 case IRT_NQ:
00074 for (int i=x.size(); i--; ) {
00075 IntView xi(x[i]); GECODE_ME_FAIL(xi.nq(home,n));
00076 }
00077 break;
00078 case IRT_LQ:
00079 for (int i=x.size(); i--; ) {
00080 IntView xi(x[i]); GECODE_ME_FAIL(xi.lq(home,n));
00081 }
00082 break;
00083 case IRT_LE:
00084 for (int i=x.size(); i--; ) {
00085 IntView xi(x[i]); GECODE_ME_FAIL(xi.le(home,n));
00086 }
00087 break;
00088 case IRT_GQ:
00089 for (int i=x.size(); i--; ) {
00090 IntView xi(x[i]); GECODE_ME_FAIL(xi.gq(home,n));
00091 }
00092 break;
00093 case IRT_GR:
00094 for (int i=x.size(); i--; ) {
00095 IntView xi(x[i]); GECODE_ME_FAIL(xi.gr(home,n));
00096 }
00097 break;
00098 default:
00099 throw UnknownRelation("Int::rel");
00100 }
00101 }
00102
00103 void
00104 rel(Home home, IntVar x0, IntRelType irt, IntVar x1, IntConLevel icl) {
00105 if (home.failed()) return;
00106 switch (irt) {
00107 case IRT_EQ:
00108 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00109 GECODE_ES_FAIL((Rel::EqDom<IntView,IntView>::post(home,x0,x1)));
00110 } else {
00111 GECODE_ES_FAIL((Rel::EqBnd<IntView,IntView>::post(home,x0,x1)));
00112 }
00113 break;
00114 case IRT_NQ:
00115 GECODE_ES_FAIL(Rel::Nq<IntView>::post(home,x0,x1)); break;
00116 case IRT_GQ:
00117 std::swap(x0,x1);
00118 case IRT_LQ:
00119 GECODE_ES_FAIL(Rel::Lq<IntView>::post(home,x0,x1)); break;
00120 case IRT_GR:
00121 std::swap(x0,x1);
00122 case IRT_LE:
00123 GECODE_ES_FAIL(Rel::Le<IntView>::post(home,x0,x1)); break;
00124 default:
00125 throw UnknownRelation("Int::rel");
00126 }
00127 }
00128
00129 void
00130 rel(Home home, const IntVarArgs& x, IntRelType irt, IntVar y,
00131 IntConLevel icl) {
00132 if (home.failed()) return;
00133 switch (irt) {
00134 case IRT_EQ:
00135 {
00136 ViewArray<IntView> xv(home,x.size()+1);
00137 xv[x.size()]=y;
00138 for (int i=x.size(); i--; )
00139 xv[i]=x[i];
00140 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00141 GECODE_ES_FAIL(Rel::NaryEqDom<IntView>::post(home,xv));
00142 } else {
00143 GECODE_ES_FAIL(Rel::NaryEqBnd<IntView>::post(home,xv));
00144 }
00145 }
00146 break;
00147 case IRT_NQ:
00148 for (int i=x.size(); i--; ) {
00149 GECODE_ES_FAIL(Rel::Nq<IntView>::post(home,x[i],y));
00150 }
00151 break;
00152 case IRT_GQ:
00153 for (int i=x.size(); i--; ) {
00154 GECODE_ES_FAIL(Rel::Lq<IntView>::post(home,y,x[i]));
00155 }
00156 break;
00157 case IRT_LQ:
00158 for (int i=x.size(); i--; ) {
00159 GECODE_ES_FAIL(Rel::Lq<IntView>::post(home,x[i],y));
00160 }
00161 break;
00162 case IRT_GR:
00163 for (int i=x.size(); i--; ) {
00164 GECODE_ES_FAIL(Rel::Le<IntView>::post(home,y,x[i]));
00165 }
00166 break;
00167 case IRT_LE:
00168 for (int i=x.size(); i--; ) {
00169 GECODE_ES_FAIL(Rel::Le<IntView>::post(home,x[i],y));
00170 }
00171 break;
00172 default:
00173 throw UnknownRelation("Int::rel");
00174 }
00175 }
00176
00177
00178 void
00179 rel(Home home, IntVar x0, IntRelType irt, IntVar x1, Reify r,
00180 IntConLevel icl) {
00181 if (home.failed()) return;
00182 switch (irt) {
00183 case IRT_EQ:
00184 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00185 switch (r.mode()) {
00186 case RM_EQV:
00187 GECODE_ES_FAIL((Rel::ReEqDom<IntView,BoolView,RM_EQV>
00188 ::post(home,x0,x1,r.var())));
00189 break;
00190 case RM_IMP:
00191 GECODE_ES_FAIL((Rel::ReEqDom<IntView,BoolView,RM_IMP>
00192 ::post(home,x0,x1,r.var())));
00193 break;
00194 case RM_PMI:
00195 GECODE_ES_FAIL((Rel::ReEqDom<IntView,BoolView,RM_PMI>
00196 ::post(home,x0,x1,r.var())));
00197 break;
00198 default: throw UnknownReifyMode("Int::rel");
00199 }
00200 } else {
00201 switch (r.mode()) {
00202 case RM_EQV:
00203 GECODE_ES_FAIL((Rel::ReEqBnd<IntView,BoolView,RM_EQV>
00204 ::post(home,x0,x1,r.var())));
00205 break;
00206 case RM_IMP:
00207 GECODE_ES_FAIL((Rel::ReEqBnd<IntView,BoolView,RM_IMP>
00208 ::post(home,x0,x1,r.var())));
00209 break;
00210 case RM_PMI:
00211 GECODE_ES_FAIL((Rel::ReEqBnd<IntView,BoolView,RM_PMI>
00212 ::post(home,x0,x1,r.var())));
00213 break;
00214 default: throw UnknownReifyMode("Int::rel");
00215 }
00216 }
00217 break;
00218 case IRT_NQ:
00219 {
00220 NegBoolView n(r.var());
00221 if (icl == ICL_BND) {
00222 switch (r.mode()) {
00223 case RM_EQV:
00224 GECODE_ES_FAIL((Rel::ReEqBnd<IntView,NegBoolView,RM_EQV>
00225 ::post(home,x0,x1,n)));
00226 break;
00227 case RM_IMP:
00228 GECODE_ES_FAIL((Rel::ReEqBnd<IntView,NegBoolView,RM_PMI>
00229 ::post(home,x0,x1,n)));
00230 break;
00231 case RM_PMI:
00232 GECODE_ES_FAIL((Rel::ReEqBnd<IntView,NegBoolView,RM_IMP>
00233 ::post(home,x0,x1,n)));
00234 break;
00235 default: throw UnknownReifyMode("Int::rel");
00236 }
00237 } else {
00238 switch (r.mode()) {
00239 case RM_EQV:
00240 GECODE_ES_FAIL((Rel::ReEqDom<IntView,NegBoolView,RM_EQV>
00241 ::post(home,x0,x1,n)));
00242 break;
00243 case RM_IMP:
00244 GECODE_ES_FAIL((Rel::ReEqDom<IntView,NegBoolView,RM_PMI>
00245 ::post(home,x0,x1,n)));
00246 break;
00247 case RM_PMI:
00248 GECODE_ES_FAIL((Rel::ReEqDom<IntView,NegBoolView,RM_IMP>
00249 ::post(home,x0,x1,n)));
00250 break;
00251 default: throw UnknownReifyMode("Int::rel");
00252 }
00253 }
00254 }
00255 break;
00256 case IRT_GQ:
00257 std::swap(x0,x1);
00258 case IRT_LQ:
00259 switch (r.mode()) {
00260 case RM_EQV:
00261 GECODE_ES_FAIL((Rel::ReLq<IntView,BoolView,RM_EQV>
00262 ::post(home,x0,x1,r.var())));
00263 break;
00264 case RM_IMP:
00265 GECODE_ES_FAIL((Rel::ReLq<IntView,BoolView,RM_IMP>
00266 ::post(home,x0,x1,r.var())));
00267 break;
00268 case RM_PMI:
00269 GECODE_ES_FAIL((Rel::ReLq<IntView,BoolView,RM_PMI>
00270 ::post(home,x0,x1,r.var())));
00271 break;
00272 default: throw UnknownReifyMode("Int::rel");
00273 }
00274 break;
00275 case IRT_LE:
00276 std::swap(x0,x1);
00277 case IRT_GR:
00278 {
00279 NegBoolView n(r.var());
00280 switch (r.mode()) {
00281 case RM_EQV:
00282 GECODE_ES_FAIL((Rel::ReLq<IntView,NegBoolView,RM_EQV>
00283 ::post(home,x0,x1,n)));
00284 break;
00285 case RM_IMP:
00286 GECODE_ES_FAIL((Rel::ReLq<IntView,NegBoolView,RM_PMI>
00287 ::post(home,x0,x1,n)));
00288 break;
00289 case RM_PMI:
00290 GECODE_ES_FAIL((Rel::ReLq<IntView,NegBoolView,RM_IMP>
00291 ::post(home,x0,x1,n)));
00292 break;
00293 default: throw UnknownReifyMode("Int::rel");
00294 }
00295 }
00296 break;
00297 default:
00298 throw UnknownRelation("Int::rel");
00299 }
00300 }
00301
00302 void
00303 rel(Home home, IntVar x, IntRelType irt, int n, Reify r,
00304 IntConLevel icl) {
00305 Limits::check(n,"Int::rel");
00306 if (home.failed()) return;
00307 switch (irt) {
00308 case IRT_EQ:
00309 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00310 switch (r.mode()) {
00311 case RM_EQV:
00312 GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,BoolView,RM_EQV>
00313 ::post(home,x,n,r.var())));
00314 break;
00315 case RM_IMP:
00316 GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,BoolView,RM_IMP>
00317 ::post(home,x,n,r.var())));
00318 break;
00319 case RM_PMI:
00320 GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,BoolView,RM_PMI>
00321 ::post(home,x,n,r.var())));
00322 break;
00323 default: throw UnknownReifyMode("Int::rel");
00324 }
00325 } else {
00326 switch (r.mode()) {
00327 case RM_EQV:
00328 GECODE_ES_FAIL((Rel::ReEqBndInt<IntView,BoolView,RM_EQV>
00329 ::post(home,x,n,r.var())));
00330 break;
00331 case RM_IMP:
00332 GECODE_ES_FAIL((Rel::ReEqBndInt<IntView,BoolView,RM_IMP>
00333 ::post(home,x,n,r.var())));
00334 break;
00335 case RM_PMI:
00336 GECODE_ES_FAIL((Rel::ReEqBndInt<IntView,BoolView,RM_PMI>
00337 ::post(home,x,n,r.var())));
00338 break;
00339 default: throw UnknownReifyMode("Int::rel");
00340 }
00341 }
00342 break;
00343 case IRT_NQ:
00344 {
00345 NegBoolView nb(r.var());
00346 if (icl == ICL_BND) {
00347 switch (r.mode()) {
00348 case RM_EQV:
00349 GECODE_ES_FAIL((Rel::ReEqBndInt<IntView,NegBoolView,RM_EQV>
00350 ::post(home,x,n,nb)));
00351 break;
00352 case RM_IMP:
00353 GECODE_ES_FAIL((Rel::ReEqBndInt<IntView,NegBoolView,RM_PMI>
00354 ::post(home,x,n,nb)));
00355 break;
00356 case RM_PMI:
00357 GECODE_ES_FAIL((Rel::ReEqBndInt<IntView,NegBoolView,RM_IMP>
00358 ::post(home,x,n,nb)));
00359 break;
00360 default: throw UnknownReifyMode("Int::rel");
00361 }
00362 } else {
00363 switch (r.mode()) {
00364 case RM_EQV:
00365 GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,NegBoolView,RM_EQV>
00366 ::post(home,x,n,nb)));
00367 break;
00368 case RM_IMP:
00369 GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,NegBoolView,RM_PMI>
00370 ::post(home,x,n,nb)));
00371 break;
00372 case RM_PMI:
00373 GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,NegBoolView,RM_IMP>
00374 ::post(home,x,n,nb)));
00375 break;
00376 default: throw UnknownReifyMode("Int::rel");
00377 }
00378 }
00379 }
00380 break;
00381 case IRT_LE:
00382 n--;
00383 case IRT_LQ:
00384 switch (r.mode()) {
00385 case RM_EQV:
00386 GECODE_ES_FAIL((Rel::ReLqInt<IntView,BoolView,RM_EQV>
00387 ::post(home,x,n,r.var())));
00388 break;
00389 case RM_IMP:
00390 GECODE_ES_FAIL((Rel::ReLqInt<IntView,BoolView,RM_IMP>
00391 ::post(home,x,n,r.var())));
00392 break;
00393 case RM_PMI:
00394 GECODE_ES_FAIL((Rel::ReLqInt<IntView,BoolView,RM_PMI>
00395 ::post(home,x,n,r.var())));
00396 break;
00397 default: throw UnknownReifyMode("Int::rel");
00398 }
00399 break;
00400 case IRT_GQ:
00401 n--;
00402 case IRT_GR:
00403 {
00404 NegBoolView nb(r.var());
00405 switch (r.mode()) {
00406 case RM_EQV:
00407 GECODE_ES_FAIL((Rel::ReLqInt<IntView,NegBoolView,RM_EQV>
00408 ::post(home,x,n,nb)));
00409 break;
00410 case RM_IMP:
00411 GECODE_ES_FAIL((Rel::ReLqInt<IntView,NegBoolView,RM_PMI>
00412 ::post(home,x,n,nb)));
00413 break;
00414 case RM_PMI:
00415 GECODE_ES_FAIL((Rel::ReLqInt<IntView,NegBoolView,RM_IMP>
00416 ::post(home,x,n,nb)));
00417 break;
00418 default: throw UnknownReifyMode("Int::rel");
00419 }
00420 }
00421 break;
00422 default:
00423 throw UnknownRelation("Int::rel");
00424 }
00425 }
00426
00427 void
00428 rel(Home home, const IntVarArgs& x, IntRelType irt,
00429 IntConLevel icl) {
00430 if (home.failed() || ((irt != IRT_NQ) && (x.size() < 2)))
00431 return;
00432 switch (irt) {
00433 case IRT_EQ:
00434 {
00435 ViewArray<IntView> xv(home,x);
00436 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00437 GECODE_ES_FAIL(Rel::NaryEqDom<IntView>::post(home,xv));
00438 } else {
00439 GECODE_ES_FAIL(Rel::NaryEqBnd<IntView>::post(home,xv));
00440 }
00441 }
00442 break;
00443 case IRT_NQ:
00444 {
00445 ViewArray<IntView> y(home,x);
00446 GECODE_ES_FAIL((Rel::NaryNq<IntView>::post(home,y)));
00447 }
00448 break;
00449 case IRT_LE:
00450 {
00451 ViewArray<IntView> y(home,x);
00452 GECODE_ES_FAIL((Rel::NaryLqLe<IntView,1>::post(home,y)));
00453 }
00454 break;
00455 case IRT_LQ:
00456 {
00457 ViewArray<IntView> y(home,x);
00458 GECODE_ES_FAIL((Rel::NaryLqLe<IntView,0>::post(home,y)));
00459 }
00460 break;
00461 case IRT_GR:
00462 {
00463 ViewArray<IntView> y(home,x.size());
00464 for (int i=x.size(); i--; )
00465 y[i] = x[x.size()-1-i];
00466 GECODE_ES_FAIL((Rel::NaryLqLe<IntView,1>::post(home,y)));
00467 }
00468 for (int i=x.size()-1; i--; )
00469 GECODE_ES_FAIL(Rel::Le<IntView>::post(home,x[i+1],x[i]));
00470 break;
00471 case IRT_GQ:
00472 {
00473 ViewArray<IntView> y(home,x.size());
00474 for (int i=x.size(); i--; )
00475 y[i] = x[x.size()-1-i];
00476 GECODE_ES_FAIL((Rel::NaryLqLe<IntView,0>::post(home,y)));
00477 }
00478 break;
00479 default:
00480 throw UnknownRelation("Int::rel");
00481 }
00482 }
00483
00484 void
00485 rel(Home home, const IntVarArgs& x, IntRelType irt, const IntVarArgs& y,
00486 IntConLevel icl) {
00487 if (home.failed()) return;
00488
00489 switch (irt) {
00490 case IRT_GR:
00491 {
00492 ViewArray<IntView> xv(home,x), yv(home,y);
00493 GECODE_ES_FAIL(Rel::LexLqLe<IntView>::post(home,yv,xv,true));
00494 }
00495 break;
00496 case IRT_LE:
00497 {
00498 ViewArray<IntView> xv(home,x), yv(home,y);
00499 GECODE_ES_FAIL(Rel::LexLqLe<IntView>::post(home,xv,yv,true));
00500 }
00501 break;
00502 case IRT_GQ:
00503 {
00504 ViewArray<IntView> xv(home,x), yv(home,y);
00505 GECODE_ES_FAIL(Rel::LexLqLe<IntView>::post(home,yv,xv,false));
00506 }
00507 break;
00508 case IRT_LQ:
00509 {
00510 ViewArray<IntView> xv(home,x), yv(home,y);
00511 GECODE_ES_FAIL(Rel::LexLqLe<IntView>::post(home,xv,yv,false));
00512 }
00513 break;
00514 case IRT_EQ:
00515 if (x.size() != y.size()) {
00516 home.fail();
00517 } else if ((icl == ICL_DOM) || (icl == ICL_DEF))
00518 for (int i=x.size(); i--; ) {
00519 GECODE_ES_FAIL((Rel::EqDom<IntView,IntView>
00520 ::post(home,x[i],y[i])));
00521 }
00522 else
00523 for (int i=x.size(); i--; ) {
00524 GECODE_ES_FAIL((Rel::EqBnd<IntView,IntView>
00525 ::post(home,x[i],y[i])));
00526 }
00527 break;
00528 case IRT_NQ:
00529 {
00530 ViewArray<IntView> xv(home,x), yv(home,y);
00531 GECODE_ES_FAIL(Rel::LexNq<IntView>::post(home,xv,yv));
00532 }
00533 break;
00534 default:
00535 throw UnknownRelation("Int::rel");
00536 }
00537 }
00538
00539 }
00540
00541