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(Space* home, IntVar x0, IntRelType r, int n,
00049 IntConLevel, PropKind) {
00050 Limits::check(n,"Int::rel");
00051 if (home->failed()) return;
00052 IntView x(x0);
00053 switch (r) {
00054 case IRT_EQ: GECODE_ME_FAIL(home,x.eq(home,n)); break;
00055 case IRT_NQ: GECODE_ME_FAIL(home,x.nq(home,n)); break;
00056 case IRT_LQ: GECODE_ME_FAIL(home,x.lq(home,n)); break;
00057 case IRT_LE: GECODE_ME_FAIL(home,x.le(home,n)); break;
00058 case IRT_GQ: GECODE_ME_FAIL(home,x.gq(home,n)); break;
00059 case IRT_GR: GECODE_ME_FAIL(home,x.gr(home,n)); break;
00060 default: throw UnknownRelation("Int::rel");
00061 }
00062 }
00063
00064 void
00065 rel(Space* home, const IntVarArgs& x, IntRelType r, int n,
00066 IntConLevel, PropKind) {
00067 Limits::check(n,"Int::rel");
00068 if (home->failed()) return;
00069 switch (r) {
00070 case IRT_EQ:
00071 for (int i=x.size(); i--; ) {
00072 IntView xi(x[i]); GECODE_ME_FAIL(home,xi.eq(home,n));
00073 }
00074 break;
00075 case IRT_NQ:
00076 for (int i=x.size(); i--; ) {
00077 IntView xi(x[i]); GECODE_ME_FAIL(home,xi.nq(home,n));
00078 }
00079 break;
00080 case IRT_LQ:
00081 for (int i=x.size(); i--; ) {
00082 IntView xi(x[i]); GECODE_ME_FAIL(home,xi.lq(home,n));
00083 }
00084 break;
00085 case IRT_LE:
00086 for (int i=x.size(); i--; ) {
00087 IntView xi(x[i]); GECODE_ME_FAIL(home,xi.le(home,n));
00088 }
00089 break;
00090 case IRT_GQ:
00091 for (int i=x.size(); i--; ) {
00092 IntView xi(x[i]); GECODE_ME_FAIL(home,xi.gq(home,n));
00093 }
00094 break;
00095 case IRT_GR:
00096 for (int i=x.size(); i--; ) {
00097 IntView xi(x[i]); GECODE_ME_FAIL(home,xi.gr(home,n));
00098 }
00099 break;
00100 default:
00101 throw UnknownRelation("Int::rel");
00102 }
00103 }
00104
00105 void
00106 rel(Space* home, IntVar x0, IntRelType r, IntVar x1,
00107 IntConLevel icl, PropKind) {
00108 if (home->failed()) return;
00109 switch (r) {
00110 case IRT_EQ:
00111 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00112 GECODE_ES_FAIL(home,(Rel::EqDom<IntView,IntView>::post(home,x0,x1)));
00113 } else {
00114 GECODE_ES_FAIL(home,(Rel::EqBnd<IntView,IntView>::post(home,x0,x1)));
00115 }
00116 break;
00117 case IRT_NQ:
00118 GECODE_ES_FAIL(home,Rel::Nq<IntView>::post(home,x0,x1)); break;
00119 case IRT_GQ:
00120 std::swap(x0,x1);
00121 case IRT_LQ:
00122 GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,x0,x1)); break;
00123 case IRT_GR:
00124 std::swap(x0,x1);
00125 case IRT_LE:
00126 GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,x0,x1)); break;
00127 default:
00128 throw UnknownRelation("Int::rel");
00129 }
00130 }
00131
00132 void
00133 rel(Space* home, const IntVarArgs& x, IntRelType r, IntVar y,
00134 IntConLevel icl, PropKind) {
00135 if (home->failed()) return;
00136 switch (r) {
00137 case IRT_EQ:
00138 {
00139 ViewArray<IntView> xv(home,x.size()+1);
00140 xv[x.size()]=y;
00141 for (int i=x.size(); i--; )
00142 xv[i]=x[i];
00143 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00144 GECODE_ES_FAIL(home,Rel::NaryEqDom<IntView>::post(home,xv));
00145 } else {
00146 GECODE_ES_FAIL(home,Rel::NaryEqBnd<IntView>::post(home,xv));
00147 }
00148 }
00149 break;
00150 case IRT_NQ:
00151 for (int i=x.size(); i--; ) {
00152 GECODE_ES_FAIL(home,Rel::Nq<IntView>::post(home,x[i],y));
00153 }
00154 break;
00155 case IRT_GQ:
00156 for (int i=x.size(); i--; ) {
00157 GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,y,x[i]));
00158 }
00159 break;
00160 case IRT_LQ:
00161 for (int i=x.size(); i--; ) {
00162 GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,x[i],y));
00163 }
00164 break;
00165 case IRT_GR:
00166 for (int i=x.size(); i--; ) {
00167 GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,y,x[i]));
00168 }
00169 break;
00170 case IRT_LE:
00171 for (int i=x.size(); i--; ) {
00172 GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,x[i],y));
00173 }
00174 break;
00175 default:
00176 throw UnknownRelation("Int::rel");
00177 }
00178 }
00179
00180
00181 void
00182 rel(Space* home, IntVar x0, IntRelType r, IntVar x1, BoolVar b,
00183 IntConLevel icl, PropKind) {
00184 if (home->failed()) return;
00185 switch (r) {
00186 case IRT_EQ:
00187 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00188 GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,BoolView>
00189 ::post(home,x0,x1,b)));
00190 } else {
00191 GECODE_ES_FAIL(home,(Rel::ReEqBnd<IntView,BoolView>
00192 ::post(home,x0,x1,b)));
00193 }
00194 break;
00195 case IRT_NQ:
00196 {
00197 NegBoolView n(b);
00198 if (icl == ICL_BND) {
00199 GECODE_ES_FAIL(home,(Rel::ReEqBnd<IntView,NegBoolView>
00200 ::post(home,x0,x1,n)));
00201 } else {
00202 GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,NegBoolView>
00203 ::post(home,x0,x1,n)));
00204 }
00205 }
00206 break;
00207 case IRT_GQ:
00208 std::swap(x0,x1);
00209 case IRT_LQ:
00210 GECODE_ES_FAIL(home,(Rel::ReLq<IntView,BoolView>::post(home,x0,x1,b)));
00211 break;
00212 case IRT_LE:
00213 std::swap(x0,x1);
00214 case IRT_GR:
00215 {
00216 NegBoolView n(b);
00217 GECODE_ES_FAIL(home,(Rel::ReLq<IntView,NegBoolView>::post(home,x0,x1,n)));
00218 }
00219 break;
00220 default:
00221 throw UnknownRelation("Int::rel");
00222 }
00223 }
00224
00225 void
00226 rel(Space* home, IntVar x, IntRelType r, int n, BoolVar b,
00227 IntConLevel icl, PropKind) {
00228 Limits::check(n,"Int::rel");
00229 if (home->failed()) return;
00230 switch (r) {
00231 case IRT_EQ:
00232 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00233 GECODE_ES_FAIL(home,(Rel::ReEqDomInt<IntView,BoolView>
00234 ::post(home,x,n,b)));
00235 } else {
00236 GECODE_ES_FAIL(home,(Rel::ReEqBndInt<IntView,BoolView>
00237 ::post(home,x,n,b)));
00238 }
00239 break;
00240 case IRT_NQ:
00241 {
00242 NegBoolView nb(b);
00243 if (icl == ICL_BND) {
00244 GECODE_ES_FAIL(home,(Rel::ReEqBndInt<IntView,NegBoolView>
00245 ::post(home,x,n,nb)));
00246 } else {
00247 GECODE_ES_FAIL(home,(Rel::ReEqDomInt<IntView,NegBoolView>
00248 ::post(home,x,n,nb)));
00249 }
00250 }
00251 break;
00252 case IRT_LE:
00253 n--;
00254 case IRT_LQ:
00255 GECODE_ES_FAIL(home,(Rel::ReLqInt<IntView,BoolView>
00256 ::post(home,x,n,b)));
00257 break;
00258 case IRT_GQ:
00259 n--;
00260 case IRT_GR:
00261 {
00262 NegBoolView nb(b);
00263 GECODE_ES_FAIL(home,(Rel::ReLqInt<IntView,NegBoolView>
00264 ::post(home,x,n,nb)));
00265 }
00266 break;
00267 default:
00268 throw UnknownRelation("Int::rel");
00269 }
00270 }
00271
00272 void
00273 rel(Space* home, const IntVarArgs& x, IntRelType r,
00274 IntConLevel icl, PropKind) {
00275 if (home->failed() || (x.size() < 2)) return;
00276 switch (r) {
00277 case IRT_EQ:
00278 {
00279 ViewArray<IntView> xv(home,x);
00280 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00281 GECODE_ES_FAIL(home,Rel::NaryEqDom<IntView>::post(home,xv));
00282 } else {
00283 GECODE_ES_FAIL(home,Rel::NaryEqBnd<IntView>::post(home,xv));
00284 }
00285 }
00286 break;
00287 case IRT_NQ:
00288 distinct(home,x,icl);
00289 break;
00290 case IRT_LE:
00291 for (int i=x.size()-1; i--; )
00292 GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,x[i],x[i+1]));
00293 break;
00294 case IRT_LQ:
00295 for (int i=x.size()-1; i--; )
00296 GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,x[i],x[i+1]));
00297 break;
00298 case IRT_GR:
00299 for (int i=x.size()-1; i--; )
00300 GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,x[i+1],x[i]));
00301 break;
00302 case IRT_GQ:
00303 for (int i=x.size()-1; i--; )
00304 GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,x[i+1],x[i]));
00305 break;
00306 default:
00307 throw UnknownRelation("Int::rel");
00308 }
00309 }
00310
00311 void
00312 rel(Space* home, const IntVarArgs& x, IntRelType r, const IntVarArgs& y,
00313 IntConLevel icl, PropKind) {
00314 if (x.size() != y.size())
00315 throw ArgumentSizeMismatch("Int::rel");
00316 if (home->failed()) return;
00317
00318 switch (r) {
00319 case IRT_GR:
00320 {
00321 ViewArray<IntView> xv(home,x), yv(home,y);
00322 GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,yv,xv,true));
00323 }
00324 break;
00325 case IRT_LE:
00326 {
00327 ViewArray<IntView> xv(home,x), yv(home,y);
00328 GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xv,yv,true));
00329 }
00330 break;
00331 case IRT_GQ:
00332 {
00333 ViewArray<IntView> xv(home,x), yv(home,y);
00334 GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,yv,xv,false));
00335 }
00336 break;
00337 case IRT_LQ:
00338 {
00339 ViewArray<IntView> xv(home,x), yv(home,y);
00340 GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xv,yv,false));
00341 }
00342 break;
00343 case IRT_EQ:
00344 if ((icl == ICL_DOM) || (icl == ICL_DEF))
00345 for (int i=x.size(); i--; ) {
00346 GECODE_ES_FAIL(home,(Rel::EqDom<IntView,IntView>
00347 ::post(home,x[i],y[i])));
00348 }
00349 else
00350 for (int i=x.size(); i--; ) {
00351 GECODE_ES_FAIL(home,(Rel::EqBnd<IntView,IntView>
00352 ::post(home,x[i],y[i])));
00353 }
00354 break;
00355 case IRT_NQ:
00356 {
00357 ViewArray<BoolView> b(home,x.size());
00358 for (int i=x.size(); i--; ) {
00359 BoolVar bi(home,0,1); b[i]=bi;
00360 NegBoolView n(b[i]);
00361 GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,NegBoolView>
00362 ::post(home,x[i],y[i],n)));
00363 }
00364 GECODE_ES_FAIL(home,Bool::NaryOrTrue<BoolView>::post(home,b));
00365 }
00366 break;
00367 default:
00368 throw UnknownRelation("Int::rel");
00369 }
00370 }
00371
00372 namespace {
00373 using namespace Int;
00374 GECODE_REGISTER2(Rel::EqBnd<IntView,IntView>);
00375 GECODE_REGISTER2(Rel::EqBnd<IntView,ConstIntView>);
00376 GECODE_REGISTER2(Rel::EqBnd<BoolView,ConstIntView>);
00377 GECODE_REGISTER2(Rel::EqBnd<BoolView,BoolView>);
00378 GECODE_REGISTER2(Rel::EqBnd<MinusView,IntView>);
00379 GECODE_REGISTER2(Rel::EqBnd<MinusView,MinusView>);
00380
00381 GECODE_REGISTER2(Rel::EqDom<IntView,IntView>);
00382 GECODE_REGISTER2(Rel::EqDom<IntView,ConstIntView>);
00383 GECODE_REGISTER2(Rel::EqDom<MinusView,IntView>);
00384
00385 GECODE_REGISTER1(Rel::NaryEqBnd<IntView>);
00386 GECODE_REGISTER1(Rel::NaryEqDom<IntView>);
00387
00388 GECODE_REGISTER2(Rel::ReEqDomInt<IntView,NegBoolView>);
00389 GECODE_REGISTER2(Rel::ReEqDomInt<IntView,BoolView>);
00390 GECODE_REGISTER2(Rel::ReEqDom<IntView,NegBoolView>);
00391 GECODE_REGISTER2(Rel::ReEqDom<IntView,BoolView>);
00392
00393 GECODE_REGISTER2(Rel::ReEqBndInt<IntView,NegBoolView>);
00394 GECODE_REGISTER2(Rel::ReEqBndInt<IntView,BoolView>);
00395 GECODE_REGISTER2(Rel::ReEqBnd<IntView,NegBoolView>);
00396 GECODE_REGISTER2(Rel::ReEqBnd<IntView,BoolView>);
00397
00398 GECODE_REGISTER1(Rel::Nq<BoolView>);
00399 GECODE_REGISTER1(Rel::Nq<IntView>);
00400 GECODE_REGISTER1(Rel::Nq<OffsetView>);
00401
00402 GECODE_REGISTER1(Rel::Lq<BoolView>);
00403 GECODE_REGISTER1(Rel::Lq<IntView>);
00404 GECODE_REGISTER1(Rel::Lq<MinusView>);
00405 GECODE_REGISTER1(Rel::Le<BoolView>);
00406 GECODE_REGISTER1(Rel::Le<IntView>);
00407 GECODE_REGISTER2(Rel::ReLq<IntView, NegBoolView>);
00408 GECODE_REGISTER2(Rel::ReLq<IntView, BoolView>);
00409 GECODE_REGISTER2(Rel::ReLqInt<IntView, NegBoolView>);
00410 GECODE_REGISTER2(Rel::ReLqInt<IntView, BoolView>);
00411
00412 GECODE_REGISTER1(Rel::Lex<BoolView>);
00413 GECODE_REGISTER1(Rel::Lex<IntView>);
00414
00415 }
00416
00417 }
00418
00419
00420