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/cpltset.hh"
00039
00040 namespace Gecode {
00041
00042 void
00043 dom(Space* home, CpltSetVar x, SetRelType r, const IntSet& s) {
00044 Set::Limits::check(s, "CpltSet::dom");
00045 if (home->failed()) return;
00046 CpltSet::CpltSetView bv(x);
00047
00048 switch(r) {
00049 case SRT_EQ:
00050 {
00051 if (s.size() == 1) {
00052 GECODE_ME_FAIL(home, bv.eq(home, s.min(), s.max()));
00053 } else {
00054 IntSetRanges ir(s);
00055 GECODE_ME_FAIL(home,bv.eqI(home, ir));
00056 }
00057 }
00058 break;
00059 case SRT_DISJ:
00060 {
00061 if (s.size() == 1) {
00062 GECODE_ME_FAIL(home,bv.exclude(home, s.min(), s.max()));
00063 } else {
00064 IntSetRanges rd(s);
00065 GECODE_ME_FAIL(home,bv.excludeI(home, rd));
00066 }
00067 }
00068 break;
00069 case SRT_NQ:
00070 {
00071 if (s.size() == 1) {
00072 GECODE_ME_FAIL(home, bv.nq(home, s.min(), s.max()));
00073 } else {
00074 IntSetRanges ir(s);
00075 GECODE_ME_FAIL(home, bv.nqI(home, ir));
00076 }
00077 }
00078 break;
00079 case SRT_SUB:
00080 {
00081 if (s.size() == 1) {
00082 GECODE_ME_FAIL(home,bv.intersect(home, s.min(), s.max()));
00083 } else {
00084 IntSetRanges rd(s);
00085 GECODE_ME_FAIL(home,bv.intersectI(home, rd));
00086 }
00087 }
00088 break;
00089 case SRT_SUP:
00090 {
00091 if (s.size() == 1) {
00092 GECODE_ME_FAIL(home,bv.include(home, s.min(), s.max()));
00093 } else {
00094 IntSetRanges rd(s);
00095 GECODE_ME_FAIL(home,bv.includeI(home, rd));
00096 }
00097 }
00098 break;
00099 case SRT_CMPL:
00100 {
00101 if (s.size() == 1) {
00102 GECODE_ME_FAIL(home,bv.exclude(home, s.min(), s.max()));
00103 GECODE_ME_FAIL(home,
00104 bv.include(home,
00105 Set::Limits::min,
00106 s.min()-1) );
00107 GECODE_ME_FAIL(home,
00108 bv.include(home, s.max()+1,
00109 Set::Limits::max) );
00110 } else {
00111 IntSetRanges rd1(s);
00112 Iter::Ranges::Compl<Set::Limits::min,
00113 Set::Limits::max, IntSetRanges > rdC1(rd1);
00114 GECODE_ME_FAIL(home,bv.includeI(home, rdC1));
00115 IntSetRanges rd2(s);
00116 Iter::Ranges::Compl<Set::Limits::min,
00117 Set::Limits::max, IntSetRanges > rdC2(rd2);
00118 GECODE_ME_FAIL(home,bv.intersectI(home, rdC2));
00119 }
00120 }
00121 break;
00122 default:
00123 {
00124
00125
00126 throw CpltSet::InvalidRelation("rel lex not implemented");
00127 return;
00128 }
00129 }
00130 }
00131
00132 void
00133 dom(Space* home, CpltSetVar x, SetRelType r, int i) {
00134 IntSet d(i,i);
00135 dom(home, x, r, d);
00136 }
00137
00138 void
00139 dom(Space* home, CpltSetVar x, SetRelType r, int i, int j) {
00140 IntSet d(i,j);
00141 dom(home, x, r, d);
00142 }
00143
00144
00145 }
00146
00147