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
00040
00041 #include <gecode/set.hh>
00042 #include <gecode/set/rel.hh>
00043
00044 namespace Gecode {
00045
00046 void
00047 dom(Home home, SetVar s, SetRelType r, int i) {
00048 Set::Limits::check(i, "Set::dom");
00049 IntSet d(i,i);
00050 dom(home, s, r, d);
00051 }
00052
00053 void
00054 dom(Home home, SetVar s, SetRelType r, int i, int j) {
00055 Set::Limits::check(i, "Set::dom");
00056 Set::Limits::check(j, "Set::dom");
00057 IntSet d(i,j);
00058 dom(home, s, r, d);
00059 }
00060
00061 void
00062 dom(Home home, SetVar s, SetRelType r, const IntSet& is) {
00063 Set::Limits::check(is, "Set::dom");
00064 if (home.failed()) return;
00065
00066 Set::SetView _s(s);
00067
00068 switch (r) {
00069 case SRT_EQ:
00070 {
00071 if (is.ranges() == 1) {
00072 GECODE_ME_FAIL(_s.include(home, is.min(), is.max()));
00073 GECODE_ME_FAIL(_s.intersect(home, is.min(), is.max()));
00074 } else {
00075 IntSetRanges rd1(is);
00076 GECODE_ME_FAIL(_s.includeI(home, rd1));
00077 IntSetRanges rd2(is);
00078 GECODE_ME_FAIL(_s.intersectI(home, rd2));
00079 }
00080 }
00081 break;
00082 case SRT_LQ:
00083 {
00084 Set::ConstSetView cv(home, is);
00085 GECODE_ES_FAIL(
00086 (Set::Rel::Lq<Set::SetView,Set::ConstSetView,false>
00087 ::post(home,s,cv)));
00088 }
00089 break;
00090 case SRT_LE:
00091 {
00092 Set::ConstSetView cv(home, is);
00093 GECODE_ES_FAIL(
00094 (Set::Rel::Lq<Set::SetView,Set::ConstSetView,true>
00095 ::post(home,s,cv)));
00096 }
00097 break;
00098 case SRT_GQ:
00099 {
00100 Set::ConstSetView cv(home, is);
00101 GECODE_ES_FAIL(
00102 (Set::Rel::Lq<Set::ConstSetView,Set::SetView,false>
00103 ::post(home,cv,s)));
00104 }
00105 break;
00106 case SRT_GR:
00107 {
00108 Set::ConstSetView cv(home, is);
00109 GECODE_ES_FAIL(
00110 (Set::Rel::Lq<Set::ConstSetView,Set::SetView,true>
00111 ::post(home,cv,s)));
00112 }
00113 break;
00114 case SRT_DISJ:
00115 {
00116 if (is.ranges() == 1) {
00117 GECODE_ME_FAIL(_s.exclude(home, is.min(), is.max()));
00118 } else {
00119 IntSetRanges rd(is);
00120 GECODE_ME_FAIL(_s.excludeI(home, rd));
00121 }
00122 }
00123 break;
00124 case SRT_NQ:
00125 {
00126 Set::ConstSetView cv(home, is);
00127 GECODE_ES_FAIL(
00128 (Set::Rel::DistinctDoit<Set::SetView>::post(home, s,
00129 cv)));
00130 }
00131 break;
00132 case SRT_SUB:
00133 {
00134 if (is.ranges() == 1) {
00135 GECODE_ME_FAIL(_s.intersect(home, is.min(), is.max()));
00136 } else {
00137 IntSetRanges rd(is);
00138 GECODE_ME_FAIL(_s.intersectI(home, rd));
00139 }
00140 }
00141 break;
00142 case SRT_SUP:
00143 {
00144 if (is.ranges() == 1) {
00145 GECODE_ME_FAIL(_s.include(home, is.min(), is.max()));
00146 } else {
00147 IntSetRanges rd(is);
00148 GECODE_ME_FAIL(_s.includeI(home, rd));
00149 }
00150 }
00151 break;
00152 case SRT_CMPL:
00153 {
00154 if (is.ranges() == 1) {
00155 GECODE_ME_FAIL(_s.exclude(home, is.min(), is.max()));
00156 GECODE_ME_FAIL(
00157 _s.include(home,
00158 Set::Limits::min,
00159 is.min()-1) );
00160 GECODE_ME_FAIL(
00161 _s.include(home, is.max()+1,
00162 Set::Limits::max) );
00163 } else {
00164 IntSetRanges rd1(is);
00165 Set::RangesCompl<IntSetRanges > rdC1(rd1);
00166 GECODE_ME_FAIL(_s.includeI(home, rdC1));
00167 IntSetRanges rd2(is);
00168 Set::RangesCompl<IntSetRanges > rdC2(rd2);
00169 GECODE_ME_FAIL(_s.intersectI(home, rdC2));
00170 }
00171 }
00172 break;
00173 default:
00174 throw Set::UnknownRelation("Set::dom");
00175 }
00176 }
00177
00178 void
00179 dom(Home home, SetVar s, SetRelType r, int i, BoolVar b) {
00180 Set::Limits::check(i, "Set::dom");
00181 IntSet d(i,i);
00182 dom(home, s, r, d, b);
00183 }
00184
00185 void
00186 dom(Home home, SetVar s, SetRelType r, int i, int j, BoolVar b) {
00187 Set::Limits::check(i, "Set::dom");
00188 Set::Limits::check(j, "Set::dom");
00189 IntSet d(i,j);
00190 dom(home, s, r, d, b);
00191 }
00192
00193 void
00194 dom(Home home, SetVar s, SetRelType r, const IntSet& is, BoolVar b) {
00195 Set::Limits::check(is, "Set::dom");
00196 if (home.failed()) return;
00197 switch (r) {
00198 case SRT_EQ:
00199 {
00200 Set::ConstSetView cv(home, is);
00201 GECODE_ES_FAIL(
00202 (Set::Rel::ReEq<Set::SetView,
00203 Set::ConstSetView>::post(home, s, cv, b)));
00204 }
00205 break;
00206 case SRT_LQ:
00207 {
00208 Set::ConstSetView cv(home, is);
00209 GECODE_ES_FAIL(
00210 (Set::Rel::ReLq<Set::SetView,Set::ConstSetView,false>
00211 ::post(home,s,cv,b)));
00212 }
00213 break;
00214 case SRT_LE:
00215 {
00216 Set::ConstSetView cv(home, is);
00217 GECODE_ES_FAIL(
00218 (Set::Rel::ReLq<Set::SetView,Set::ConstSetView,true>
00219 ::post(home,s,cv,b)));
00220 }
00221 break;
00222 case SRT_GQ:
00223 {
00224 Set::ConstSetView cv(home, is);
00225 GECODE_ES_FAIL(
00226 (Set::Rel::ReLq<Set::ConstSetView,Set::SetView,false>
00227 ::post(home,cv,s,b)));
00228 }
00229 break;
00230 case SRT_GR:
00231 {
00232 Set::ConstSetView cv(home, is);
00233 GECODE_ES_FAIL(
00234 (Set::Rel::ReLq<Set::ConstSetView,Set::SetView,true>
00235 ::post(home,cv,s,b)));
00236 }
00237 break;
00238 case SRT_NQ:
00239 {
00240 BoolVar notb(home,0,1);
00241 rel(home, b, IRT_NQ, notb);
00242 Set::ConstSetView cv(home, is);
00243 GECODE_ES_FAIL(
00244 (Set::Rel::ReEq<Set::SetView,
00245 Set::ConstSetView>::post(home, s, cv, notb)));
00246 }
00247 break;
00248 case SRT_SUB:
00249 {
00250 Set::ConstSetView cv(home, is);
00251 GECODE_ES_FAIL(
00252 (Set::Rel::ReSubset<Set::SetView,Set::ConstSetView>
00253 ::post(home, s, cv, b)));
00254 }
00255 break;
00256 case SRT_SUP:
00257 {
00258 Set::ConstSetView cv(home, is);
00259 GECODE_ES_FAIL(
00260 (Set::Rel::ReSubset<Set::ConstSetView,Set::SetView>
00261 ::post(home, cv, s, b)));
00262 }
00263 break;
00264 case SRT_DISJ:
00265 {
00266
00267
00268
00269
00270 IntSetRanges dr1(is);
00271 Set::RangesCompl<IntSetRanges > dc1(dr1);
00272 IntSet dcompl(dc1);
00273 Set::ConstSetView cvcompl(home, dcompl);
00274 GECODE_ES_FAIL(
00275 (Set::Rel::ReSubset<Set::SetView,Set::ConstSetView>
00276 ::post(home, s, cvcompl, b)));
00277 }
00278 break;
00279 case SRT_CMPL:
00280 {
00281 Set::SetView sv(s);
00282
00283 IntSetRanges dr1(is);
00284 Set::RangesCompl<IntSetRanges> dc1(dr1);
00285 IntSet dcompl(dc1);
00286 Set::ConstSetView cvcompl(home, dcompl);
00287
00288 GECODE_ES_FAIL(
00289 (Set::Rel::ReEq<Set::SetView,Set::ConstSetView>
00290 ::post(home, sv, cvcompl, b)));
00291 }
00292 break;
00293 default:
00294 throw Set::UnknownRelation("Set::dom");
00295 }
00296 }
00297
00298 }
00299
00300