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 r, int n, IntConLevel) {
00049 Limits::check(n,"Int::rel");
00050 if (home.failed()) return;
00051 IntView x(x0);
00052 switch (r) {
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 r, int n, IntConLevel) {
00065 Limits::check(n,"Int::rel");
00066 if (home.failed()) return;
00067 switch (r) {
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 r, IntVar x1, IntConLevel icl) {
00105 if (home.failed()) return;
00106 switch (r) {
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 r, IntVar y,
00131 IntConLevel icl) {
00132 if (home.failed()) return;
00133 switch (r) {
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 r, IntVar x1, BoolVar b,
00180 IntConLevel icl) {
00181 if (home.failed()) return;
00182 switch (r) {
00183 case IRT_EQ:
00184 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00185 GECODE_ES_FAIL((Rel::ReEqDom<IntView,BoolView>::post(home,x0,x1,b)));
00186 } else {
00187 GECODE_ES_FAIL((Rel::ReEqBnd<IntView,BoolView>::post(home,x0,x1,b)));
00188 }
00189 break;
00190 case IRT_NQ:
00191 {
00192 NegBoolView n(b);
00193 if (icl == ICL_BND) {
00194 GECODE_ES_FAIL((Rel::ReEqBnd<IntView,NegBoolView>
00195 ::post(home,x0,x1,n)));
00196 } else {
00197 GECODE_ES_FAIL((Rel::ReEqDom<IntView,NegBoolView>
00198 ::post(home,x0,x1,n)));
00199 }
00200 }
00201 break;
00202 case IRT_GQ:
00203 std::swap(x0,x1);
00204 case IRT_LQ:
00205 GECODE_ES_FAIL((Rel::ReLq<IntView,BoolView>::post(home,x0,x1,b)));
00206 break;
00207 case IRT_LE:
00208 std::swap(x0,x1);
00209 case IRT_GR:
00210 {
00211 NegBoolView n(b);
00212 GECODE_ES_FAIL((Rel::ReLq<IntView,NegBoolView>::post(home,x0,x1,n)));
00213 }
00214 break;
00215 default:
00216 throw UnknownRelation("Int::rel");
00217 }
00218 }
00219
00220 void
00221 rel(Home home, IntVar x, IntRelType r, int n, BoolVar b,
00222 IntConLevel icl) {
00223 Limits::check(n,"Int::rel");
00224 if (home.failed()) return;
00225 switch (r) {
00226 case IRT_EQ:
00227 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00228 GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,BoolView>
00229 ::post(home,x,n,b)));
00230 } else {
00231 GECODE_ES_FAIL((Rel::ReEqBndInt<IntView,BoolView>
00232 ::post(home,x,n,b)));
00233 }
00234 break;
00235 case IRT_NQ:
00236 {
00237 NegBoolView nb(b);
00238 if (icl == ICL_BND) {
00239 GECODE_ES_FAIL((Rel::ReEqBndInt<IntView,NegBoolView>
00240 ::post(home,x,n,nb)));
00241 } else {
00242 GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,NegBoolView>
00243 ::post(home,x,n,nb)));
00244 }
00245 }
00246 break;
00247 case IRT_LE:
00248 n--;
00249 case IRT_LQ:
00250 GECODE_ES_FAIL((Rel::ReLqInt<IntView,BoolView>
00251 ::post(home,x,n,b)));
00252 break;
00253 case IRT_GQ:
00254 n--;
00255 case IRT_GR:
00256 {
00257 NegBoolView nb(b);
00258 GECODE_ES_FAIL((Rel::ReLqInt<IntView,NegBoolView>
00259 ::post(home,x,n,nb)));
00260 }
00261 break;
00262 default:
00263 throw UnknownRelation("Int::rel");
00264 }
00265 }
00266
00267 void
00268 rel(Home home, const IntVarArgs& x, IntRelType r,
00269 IntConLevel icl) {
00270 if (home.failed() || ((r != IRT_NQ) && (x.size() < 2)))
00271 return;
00272 switch (r) {
00273 case IRT_EQ:
00274 {
00275 ViewArray<IntView> xv(home,x);
00276 if ((icl == ICL_DOM) || (icl == ICL_DEF)) {
00277 GECODE_ES_FAIL(Rel::NaryEqDom<IntView>::post(home,xv));
00278 } else {
00279 GECODE_ES_FAIL(Rel::NaryEqBnd<IntView>::post(home,xv));
00280 }
00281 }
00282 break;
00283 case IRT_NQ:
00284 {
00285 ViewArray<IntView> y(home,x);
00286 GECODE_ES_FAIL((Rel::NaryNq<IntView>::post(home,y)));
00287 }
00288 break;
00289 case IRT_LE:
00290 {
00291 ViewArray<IntView> y(home,x);
00292 GECODE_ES_FAIL((Rel::NaryLqLe<IntView,1>::post(home,y)));
00293 }
00294 break;
00295 case IRT_LQ:
00296 {
00297 ViewArray<IntView> y(home,x);
00298 GECODE_ES_FAIL((Rel::NaryLqLe<IntView,0>::post(home,y)));
00299 }
00300 break;
00301 case IRT_GR:
00302 {
00303 ViewArray<IntView> y(home,x.size());
00304 for (int i=x.size(); i--; )
00305 y[i] = x[x.size()-1-i];
00306 GECODE_ES_FAIL((Rel::NaryLqLe<IntView,1>::post(home,y)));
00307 }
00308 for (int i=x.size()-1; i--; )
00309 GECODE_ES_FAIL(Rel::Le<IntView>::post(home,x[i+1],x[i]));
00310 break;
00311 case IRT_GQ:
00312 {
00313 ViewArray<IntView> y(home,x.size());
00314 for (int i=x.size(); i--; )
00315 y[i] = x[x.size()-1-i];
00316 GECODE_ES_FAIL((Rel::NaryLqLe<IntView,0>::post(home,y)));
00317 }
00318 break;
00319 default:
00320 throw UnknownRelation("Int::rel");
00321 }
00322 }
00323
00324 void
00325 rel(Home home, const IntVarArgs& x, IntRelType r, const IntVarArgs& y,
00326 IntConLevel icl) {
00327 if (home.failed()) return;
00328
00329 switch (r) {
00330 case IRT_GR:
00331 {
00332 ViewArray<IntView> xv(home,x), yv(home,y);
00333 GECODE_ES_FAIL(Rel::LexLqLe<IntView>::post(home,yv,xv,true));
00334 }
00335 break;
00336 case IRT_LE:
00337 {
00338 ViewArray<IntView> xv(home,x), yv(home,y);
00339 GECODE_ES_FAIL(Rel::LexLqLe<IntView>::post(home,xv,yv,true));
00340 }
00341 break;
00342 case IRT_GQ:
00343 {
00344 ViewArray<IntView> xv(home,x), yv(home,y);
00345 GECODE_ES_FAIL(Rel::LexLqLe<IntView>::post(home,yv,xv,false));
00346 }
00347 break;
00348 case IRT_LQ:
00349 {
00350 ViewArray<IntView> xv(home,x), yv(home,y);
00351 GECODE_ES_FAIL(Rel::LexLqLe<IntView>::post(home,xv,yv,false));
00352 }
00353 break;
00354 case IRT_EQ:
00355 if (x.size() != y.size()) {
00356 home.fail();
00357 } else if ((icl == ICL_DOM) || (icl == ICL_DEF))
00358 for (int i=x.size(); i--; ) {
00359 GECODE_ES_FAIL((Rel::EqDom<IntView,IntView>
00360 ::post(home,x[i],y[i])));
00361 }
00362 else
00363 for (int i=x.size(); i--; ) {
00364 GECODE_ES_FAIL((Rel::EqBnd<IntView,IntView>
00365 ::post(home,x[i],y[i])));
00366 }
00367 break;
00368 case IRT_NQ:
00369 {
00370 ViewArray<IntView> xv(home,x), yv(home,y);
00371 GECODE_ES_FAIL(Rel::LexNq<IntView>::post(home,xv,yv));
00372 }
00373 break;
00374 default:
00375 throw UnknownRelation("Int::rel");
00376 }
00377 }
00378
00379 }
00380
00381