00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "gecode/int/rel.hh"
00025
00026 #include <algorithm>
00027
00028 namespace Gecode {
00029
00030 using namespace Int;
00031
00032 void
00033 rel(Space* home, IntVar x0, IntRelType r, int n, IntConLevel) {
00034 if (home->failed()) return;
00035 IntView x(x0);
00036 switch (r) {
00037 case IRT_EQ:
00038 GECODE_ME_FAIL(home,x.eq(home,n)); break;
00039 case IRT_NQ:
00040 GECODE_ME_FAIL(home,x.nq(home,n)); break;
00041 case IRT_LQ:
00042 GECODE_ME_FAIL(home,x.lq(home,n)); break;
00043 case IRT_LE:
00044 GECODE_ME_FAIL(home,x.le(home,n)); break;
00045 case IRT_GQ:
00046 GECODE_ME_FAIL(home,x.gq(home,n)); break;
00047 case IRT_GR:
00048 GECODE_ME_FAIL(home,x.gr(home,n)); break;
00049 default:
00050 throw UnknownRelation("Int::rel");
00051 }
00052 }
00053
00054 void
00055 rel(Space* home, IntVar x0, IntRelType r, IntVar x1, IntConLevel icl) {
00056 if (home->failed()) return;
00057 switch (r) {
00058 case IRT_EQ:
00059 if (icl == ICL_BND) {
00060 GECODE_ES_FAIL(home,(Rel::EqBnd<IntView,IntView>::post(home,x0,x1)));
00061 } else {
00062 GECODE_ES_FAIL(home,(Rel::EqDom<IntView,IntView>::post(home,x0,x1)));
00063 }
00064 break;
00065 case IRT_NQ:
00066 GECODE_ES_FAIL(home,Rel::Nq<IntView>::post(home,x0,x1)); break;
00067 case IRT_GQ:
00068 std::swap(x0,x1);
00069 case IRT_LQ:
00070 GECODE_ES_FAIL(home,Rel::Lq<IntView>::post(home,x0,x1)); break;
00071 case IRT_GR:
00072 std::swap(x0,x1);
00073 case IRT_LE:
00074 GECODE_ES_FAIL(home,Rel::Le<IntView>::post(home,x0,x1)); break;
00075 default:
00076 throw UnknownRelation("Int::rel");
00077 }
00078 }
00079
00080
00081 void
00082 rel(Space* home, IntVar x0, IntRelType r, IntVar x1, BoolVar b,
00083 IntConLevel icl) {
00084 if (home->failed()) return;
00085 switch (r) {
00086 case IRT_EQ:
00087 if (icl == ICL_BND) {
00088 GECODE_ES_FAIL(home,(Rel::ReEqBnd<IntView,BoolView>
00089 ::post(home,x0,x1,b)));
00090 } else {
00091 GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,BoolView>
00092 ::post(home,x0,x1,b)));
00093 }
00094 break;
00095 case IRT_NQ:
00096 {
00097 NegBoolView n(b);
00098 if (icl == ICL_BND) {
00099 GECODE_ES_FAIL(home,(Rel::ReEqBnd<IntView,NegBoolView>
00100 ::post(home,x0,x1,n)));
00101 } else {
00102 GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,NegBoolView>
00103 ::post(home,x0,x1,n)));
00104 }
00105 }
00106 break;
00107 case IRT_GQ:
00108 std::swap(x0,x1);
00109 case IRT_LQ:
00110 GECODE_ES_FAIL(home,(Rel::ReLq<IntView,BoolView>::post(home,x0,x1,b)));
00111 break;
00112 case IRT_LE:
00113 std::swap(x0,x1);
00114 case IRT_GR:
00115 {
00116 NegBoolView n(b);
00117 GECODE_ES_FAIL(home,(Rel::ReLq<IntView,NegBoolView>::post(home,x0,x1,n)));
00118 }
00119 break;
00120 default:
00121 throw UnknownRelation("Int::rel");
00122 }
00123 }
00124
00125 void
00126 rel(Space* home, IntVar x, IntRelType r, int n, BoolVar b,
00127 IntConLevel icl) {
00128 if (home->failed()) return;
00129 switch (r) {
00130 case IRT_EQ:
00131 if (icl == ICL_BND) {
00132 GECODE_ES_FAIL(home,(Rel::ReEqBndInt<IntView,BoolView>
00133 ::post(home,x,n,b)));
00134 } else {
00135 GECODE_ES_FAIL(home,(Rel::ReEqDomInt<IntView,BoolView>
00136 ::post(home,x,n,b)));
00137 }
00138 break;
00139 case IRT_NQ:
00140 {
00141 NegBoolView nb(b);
00142 if (icl == ICL_BND) {
00143 GECODE_ES_FAIL(home,(Rel::ReEqBndInt<IntView,NegBoolView>
00144 ::post(home,x,n,nb)));
00145 } else {
00146 GECODE_ES_FAIL(home,(Rel::ReEqDomInt<IntView,NegBoolView>
00147 ::post(home,x,n,nb)));
00148 }
00149 }
00150 break;
00151 case IRT_LE:
00152 n--;
00153 case IRT_LQ:
00154 GECODE_ES_FAIL(home,(Rel::ReLqInt<IntView,BoolView>
00155 ::post(home,x,n,b)));
00156 break;
00157 case IRT_GQ:
00158 n--;
00159 case IRT_GR:
00160 {
00161 NegBoolView nb(b);
00162 GECODE_ES_FAIL(home,(Rel::ReLqInt<IntView,NegBoolView>
00163 ::post(home,x,n,nb)));
00164 }
00165 break;
00166 default:
00167 throw UnknownRelation("Int::rel");
00168 }
00169 }
00170
00171 void
00172 eq(Space* home, IntVar x0, IntVar x1, IntConLevel icl) {
00173 if (home->failed()) return;
00174 if (icl == ICL_BND) {
00175 GECODE_ES_FAIL(home,(Rel::EqBnd<IntView,IntView>::post(home,x0,x1)));
00176 } else {
00177 GECODE_ES_FAIL(home,(Rel::EqDom<IntView,IntView>::post(home,x0,x1)));
00178 }
00179 }
00180
00181 void
00182 eq(Space* home, IntVar x0, int n, IntConLevel) {
00183 if (home->failed()) return;
00184 IntView x(x0);
00185 GECODE_ME_FAIL(home,x.eq(home,n));
00186 }
00187
00188 void
00189 eq(Space* home, IntVar x0, IntVar x1, BoolVar b, IntConLevel icl) {
00190 if (home->failed()) return;
00191 if (icl == ICL_BND) {
00192 GECODE_ES_FAIL(home,(Rel::ReEqBnd<IntView,BoolView>::post(home,x0,x1,b)));
00193 } else {
00194 GECODE_ES_FAIL(home,(Rel::ReEqDom<IntView,BoolView>::post(home,x0,x1,b)));
00195 }
00196 }
00197
00198 void
00199 eq(Space* home, IntVar x, int n, BoolVar b, IntConLevel icl) {
00200 if (home->failed()) return;
00201 if (icl == ICL_BND) {
00202 GECODE_ES_FAIL(home,(Rel::ReEqBndInt<IntView,BoolView>::post(home,x,n,b)));
00203 } else {
00204 GECODE_ES_FAIL(home,(Rel::ReEqDomInt<IntView,BoolView>::post(home,x,n,b)));
00205 }
00206 }
00207
00208 void
00209 eq(Space* home, const IntVarArgs& x, IntConLevel icl) {
00210 if (home->failed()) return;
00211 ViewArray<IntView> xv(home,x);
00212 if (icl == ICL_BND) {
00213 GECODE_ES_FAIL(home,Rel::NaryEqBnd<IntView>::post(home,xv));
00214 } else {
00215 GECODE_ES_FAIL(home,Rel::NaryEqDom<IntView>::post(home,xv));
00216 }
00217 }
00218
00219
00220 void
00221 rel(Space* home, const IntVarArgs& x, IntRelType r, const IntVarArgs& y,
00222 IntConLevel icl) {
00223 if (x.size() != y.size())
00224 throw ArgumentSizeMismatch("Int::rel");
00225 if (home->failed()) return;
00226
00227 switch (r) {
00228 case IRT_GR:
00229 {
00230 ViewArray<ViewTuple<IntView,2> > xy(home,x.size());
00231 for (int i = x.size(); i--; ) {
00232 xy[i][0]=y[i]; xy[i][1]=x[i];
00233 }
00234 GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xy,true));
00235 }
00236 break;
00237 case IRT_LE:
00238 {
00239 ViewArray<ViewTuple<IntView,2> > xy(home,x.size());
00240 for (int i = x.size(); i--; ) {
00241 xy[i][0]=x[i]; xy[i][1]=y[i];
00242 }
00243 GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xy,true));
00244 }
00245 break;
00246 case IRT_GQ:
00247 {
00248 ViewArray<ViewTuple<IntView,2> > xy(home,x.size());
00249 for (int i = x.size(); i--; ) {
00250 xy[i][0]=y[i]; xy[i][1]=x[i];
00251 }
00252 GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xy,false));
00253 }
00254 break;
00255 case IRT_LQ:
00256 {
00257 ViewArray<ViewTuple<IntView,2> > xy(home,x.size());
00258 for (int i = x.size(); i--; ) {
00259 xy[i][0]=x[i]; xy[i][1]=y[i];
00260 }
00261 GECODE_ES_FAIL(home,Rel::Lex<IntView>::post(home,xy,false));
00262 }
00263 break;
00264 case IRT_EQ:
00265 if (icl == ICL_BND)
00266 for (int i=x.size(); i--; ) {
00267 GECODE_ES_FAIL(home,(Rel::EqBnd<IntView,IntView>
00268 ::post(home,x[i],y[i])));
00269 }
00270 else
00271 for (int i=x.size(); i--; ) {
00272 GECODE_ES_FAIL(home,(Rel::EqDom<IntView,IntView>
00273 ::post(home,x[i],y[i])));
00274 }
00275 break;
00276 case IRT_NQ:
00277 {
00278 ViewArray<ViewTuple<IntView,2> > xy(home,x.size());
00279 for (int i = x.size(); i--; ) {
00280 xy[i][0]=x[i]; xy[i][1]=y[i];
00281 }
00282 GECODE_ES_FAIL(home,Rel::NaryNq<IntView>::post(home,xy));
00283 }
00284 break;
00285 default:
00286 throw UnknownRelation("Int::rel");
00287 }
00288 }
00289
00290 }
00291
00292
00293