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 #include <gecode/int/dom.hh>
00040 #include <gecode/int/rel.hh>
00041
00042 namespace Gecode {
00043
00044 void
00045 dom(Home home, IntVar x, int n, IntConLevel) {
00046 using namespace Int;
00047 Limits::check(n,"Int::dom");
00048 if (home.failed()) return;
00049 IntView xv(x);
00050 GECODE_ME_FAIL(xv.eq(home,n));
00051 }
00052
00053 void
00054 dom(Home home, const IntVarArgs& x, int n, IntConLevel) {
00055 using namespace Int;
00056 Limits::check(n,"Int::dom");
00057 if (home.failed()) return;
00058 for (int i=x.size(); i--; ) {
00059 IntView xv(x[i]);
00060 GECODE_ME_FAIL(xv.eq(home,n));
00061 }
00062 }
00063
00064 void
00065 dom(Home home, IntVar x, int min, int max, IntConLevel) {
00066 using namespace Int;
00067 Limits::check(min,"Int::dom");
00068 Limits::check(max,"Int::dom");
00069 if (home.failed()) return;
00070 IntView xv(x);
00071 GECODE_ME_FAIL(xv.gq(home,min));
00072 GECODE_ME_FAIL(xv.lq(home,max));
00073 }
00074
00075 void
00076 dom(Home home, const IntVarArgs& x, int min, int max, IntConLevel) {
00077 using namespace Int;
00078 Limits::check(min,"Int::dom");
00079 Limits::check(max,"Int::dom");
00080 if (home.failed()) return;
00081 for (int i=x.size(); i--; ) {
00082 IntView xv(x[i]);
00083 GECODE_ME_FAIL(xv.gq(home,min));
00084 GECODE_ME_FAIL(xv.lq(home,max));
00085 }
00086 }
00087
00088 void
00089 dom(Home home, IntVar x, const IntSet& is, IntConLevel) {
00090 using namespace Int;
00091 Limits::check(is.min(),"Int::dom");
00092 Limits::check(is.max(),"Int::dom");
00093 if (home.failed()) return;
00094 IntView xv(x);
00095 IntSetRanges ris(is);
00096 GECODE_ME_FAIL(xv.inter_r(home,ris,false));
00097 }
00098
00099 void
00100 dom(Home home, const IntVarArgs& x, const IntSet& is, IntConLevel) {
00101 using namespace Int;
00102 Limits::check(is.min(),"Int::dom");
00103 Limits::check(is.max(),"Int::dom");
00104 if (home.failed()) return;
00105 for (int i = x.size(); i--; ) {
00106 IntSetRanges ris(is);
00107 IntView xv(x[i]);
00108 GECODE_ME_FAIL(xv.inter_r(home,ris,false));
00109 }
00110 }
00111
00112 void
00113 dom(Home home, IntVar x, int n, Reify r, IntConLevel) {
00114 using namespace Int;
00115 Limits::check(n,"Int::dom");
00116 if (home.failed()) return;
00117 switch (r.mode()) {
00118 case RM_EQV:
00119 GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,BoolView,RM_EQV>
00120 ::post(home,x,n,r.var())));
00121 break;
00122 case RM_IMP:
00123 GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,BoolView,RM_IMP>
00124 ::post(home,x,n,r.var())));
00125 break;
00126 case RM_PMI:
00127 GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,BoolView,RM_PMI>
00128 ::post(home,x,n,r.var())));
00129 break;
00130 default: throw UnknownReifyMode("Int::dom");
00131 }
00132 }
00133
00134 void
00135 dom(Home home, IntVar x, int min, int max, Reify r, IntConLevel) {
00136 using namespace Int;
00137 Limits::check(min,"Int::dom");
00138 Limits::check(max,"Int::dom");
00139 if (home.failed()) return;
00140 switch (r.mode()) {
00141 case RM_EQV:
00142 GECODE_ES_FAIL((Dom::ReRange<IntView,RM_EQV>
00143 ::post(home,x,min,max,r.var())));
00144 break;
00145 case RM_IMP:
00146 GECODE_ES_FAIL((Dom::ReRange<IntView,RM_IMP>
00147 ::post(home,x,min,max,r.var())));
00148 break;
00149 case RM_PMI:
00150 GECODE_ES_FAIL((Dom::ReRange<IntView,RM_PMI>
00151 ::post(home,x,min,max,r.var())));
00152 break;
00153 default: throw UnknownReifyMode("Int::dom");
00154 }
00155 }
00156
00157
00158 void
00159 dom(Home home, IntVar x, const IntSet& is, Reify r, IntConLevel) {
00160 using namespace Int;
00161 Limits::check(is.min(),"Int::dom");
00162 Limits::check(is.max(),"Int::dom");
00163 if (home.failed()) return;
00164 switch (r.mode()) {
00165 case RM_EQV:
00166 GECODE_ES_FAIL((Dom::ReIntSet<IntView,RM_EQV>::post(home,x,is,r.var())));
00167 break;
00168 case RM_IMP:
00169 GECODE_ES_FAIL((Dom::ReIntSet<IntView,RM_IMP>::post(home,x,is,r.var())));
00170 break;
00171 case RM_PMI:
00172 GECODE_ES_FAIL((Dom::ReIntSet<IntView,RM_PMI>::post(home,x,is,r.var())));
00173 break;
00174 default: throw UnknownReifyMode("Int::dom");
00175 }
00176 }
00177
00178 void
00179 dom(Home home, IntVar x, IntVar d, IntConLevel) {
00180 using namespace Int;
00181 if (home.failed()) return;
00182 IntView xv(x), dv(d);
00183 if (!same(xv,dv)) {
00184 ViewRanges<IntView> r(dv);
00185 GECODE_ME_FAIL(xv.inter_r(home,r,false));
00186 }
00187 }
00188
00189 void
00190 dom(Home home, BoolVar x, BoolVar d, IntConLevel) {
00191 using namespace Int;
00192 if (home.failed()) return;
00193 if (d.one())
00194 GECODE_ME_FAIL(BoolView(x).one(home));
00195 else if (d.zero())
00196 GECODE_ME_FAIL(BoolView(x).zero(home));
00197 }
00198
00199 void
00200 dom(Home home, const IntVarArgs& x, const IntVarArgs& d, IntConLevel) {
00201 using namespace Int;
00202 if (x.size() != d.size())
00203 throw ArgumentSizeMismatch("Int::dom");
00204 for (int i=x.size(); i--; ) {
00205 if (home.failed()) return;
00206 IntView xv(x[i]), dv(d[i]);
00207 if (!same(xv,dv)) {
00208 ViewRanges<IntView> r(dv);
00209 GECODE_ME_FAIL(xv.inter_r(home,r,false));
00210 }
00211 }
00212 }
00213
00214 void
00215 dom(Home home, const BoolVarArgs& x, const BoolVarArgs& d, IntConLevel) {
00216 using namespace Int;
00217 if (x.size() != d.size())
00218 throw ArgumentSizeMismatch("Int::dom");
00219 for (int i=x.size(); i--; ) {
00220 if (home.failed()) return;
00221 if (d[i].one())
00222 GECODE_ME_FAIL(BoolView(x[i]).one(home));
00223 else if (d[i].zero())
00224 GECODE_ME_FAIL(BoolView(x[i]).zero(home));
00225 }
00226 }
00227
00228 }
00229
00230
00231