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 #include <gecode/set/element.hh>
00041
00042 namespace Gecode {
00043
00044 namespace Int { namespace Element {
00045 template<>
00047 class ViewToVarArg<Gecode::Set::ConstSetView> {
00048 public:
00049 typedef IntSetArgs argtype;
00050 };
00051 }}
00052
00053 using namespace Gecode::Set;
00054
00055 void
00056 element(Home home, SetOpType op, const SetVarArgs& x, SetVar y, SetVar z,
00057 const IntSet& universe) {
00058 if (home.failed()) return;
00059
00060 switch (op) {
00061 case SOT_DUNION:
00062 {
00063 Set::Element::ElementDisjoint<SetView,SetView>::IdxViewArray
00064 iv(home, x);
00065 GECODE_ES_FAIL((Element::ElementDisjoint<SetView,SetView>::
00066 post(home,iv,y)));
00067 }
00068
00069 case SOT_UNION:
00070 {
00071 Set::Element::ElementUnion<SetView,SetView,SetView>::IdxViewArray
00072 iv(home, x);
00073 GECODE_ES_FAIL(
00074 (Element::ElementUnion<SetView,SetView,SetView>::
00075 post(home,iv,y,z)));
00076 }
00077 break;
00078 case SOT_INTER:
00079 {
00080 Set::Element::ElementIntersection<SetView,SetView,SetView>::IdxViewArray
00081 iv(home, x);
00082 GECODE_ES_FAIL(
00083 (Element::ElementIntersection<SetView,SetView,SetView>::
00084 post(home,iv,y,z,universe)));
00085 }
00086 break;
00087 case SOT_MINUS:
00088 throw IllegalOperation("Set::element");
00089 break;
00090 default:
00091 throw UnknownOperation("Set::element");
00092 }
00093 }
00094
00095 void
00096 element(Home home, SetOpType op, const IntVarArgs& x, SetVar y, SetVar z,
00097 const IntSet& universe) {
00098 if (home.failed()) return;
00099
00100 switch (op) {
00101 case SOT_DUNION:
00102 {
00103 Set::Element::ElementDisjoint<SingletonView,SetView>::IdxViewArray
00104 iv(home, x);
00105 GECODE_ES_FAIL((Element::ElementDisjoint<SingletonView,SetView>
00106 ::post(home,iv,y)));
00107 }
00108
00109 case SOT_UNION:
00110 {
00111 Set::Element::ElementUnion<SingletonView,SetView,SetView>::IdxViewArray
00112 iv(home, x);
00113 GECODE_ES_FAIL(
00114 (Element::ElementUnion<SingletonView,SetView,SetView>::
00115 post(home,iv,y,z)));
00116 }
00117 break;
00118 case SOT_INTER:
00119 {
00120 Set::Element::ElementIntersection<SingletonView,SetView,
00121 SetView>::IdxViewArray iv(home, x);
00122 GECODE_ES_FAIL(
00123 (Element::ElementIntersection<SingletonView,SetView,
00124 SetView>::post(home,iv,y,z,universe)));
00125 }
00126 break;
00127 case SOT_MINUS:
00128 throw IllegalOperation("Set::element");
00129 break;
00130 default:
00131 throw UnknownOperation("Set::element");
00132 }
00133 }
00134
00135 void
00136 element(Home home, SetOpType op, const IntSetArgs& x, SetVar y, SetVar z,
00137 const IntSet& universe) {
00138 if (home.failed()) return;
00139
00140 switch (op) {
00141 case SOT_DUNION:
00142 {
00143 Set::Element::ElementDisjoint<ConstSetView,SetView>::IdxViewArray
00144 iv(home, x.size());
00145 for (int i=x.size(); i--;) {
00146 iv[i].idx = i; iv[i].view = ConstSetView(home, x[i]);
00147 }
00148 GECODE_ES_FAIL((Element::ElementDisjoint<ConstSetView,SetView>::
00149 post(home,iv,y)));
00150 }
00151
00152 case SOT_UNION:
00153 {
00154 GECODE_ES_FAIL(
00155 (Element::ElementUnionConst<SetView,SetView>::
00156 post(home,z,x,y)));
00157 }
00158 break;
00159 case SOT_INTER:
00160 {
00161 Set::Element::ElementIntersection<ConstSetView,
00162 SetView,SetView>::IdxViewArray iv(home, x.size());
00163 for (int i=x.size(); i--;) {
00164 iv[i].idx = i; iv[i].view = ConstSetView(home, x[i]);
00165 }
00166 GECODE_ES_FAIL(
00167 (Element::ElementIntersection<ConstSetView,SetView,SetView>::
00168 post(home,iv,y,z,universe)));
00169 }
00170 break;
00171 case SOT_MINUS:
00172 throw IllegalOperation("Set::element");
00173 break;
00174 default:
00175 throw UnknownOperation("Set::element");
00176 }
00177
00178 }
00179
00180 void
00181 element(Home home, SetOpType op, const IntArgs& x, SetVar y, SetVar z,
00182 const IntSet& universe) {
00183 IntSetArgs xs(x.size());
00184 for (int i=x.size(); i--;)
00185 xs[i]=IntSet(x[i],x[i]);
00186 element(home,op,xs,y,z,universe);
00187 }
00188
00189 void
00190 element(Home home, const SetVarArgs& x, IntVar y, SetVar z) {
00191 if (x.size() == 0)
00192 throw Set::TooFewArguments("Set::element");
00193 if (home.failed()) return;
00194 Set::Element::ElementUnion<SetView,SingletonView,SetView>::IdxViewArray
00195 iv(home, x);
00196 SetView zv(z);
00197
00198 Int::IntView yv(y);
00199 SingletonView single(yv);
00200 GECODE_ES_FAIL((Element::ElementUnion<SetView,SingletonView,SetView>
00201 ::post(home, iv, single,zv)));
00202 }
00203
00204 void
00205 element(Home home, const IntSetArgs& x, IntVar y, SetVar z) {
00206 if (x.size() == 0)
00207 throw Set::TooFewArguments("Set::element");
00208 for (int i=x.size(); i--;)
00209 Set::Limits::check(x[i], "Set::element");
00210 if (home.failed()) return;
00211 SetView zv(z);
00212
00213 Int::IntView yv(y);
00214 SingletonView single(yv);
00215 GECODE_ES_FAIL((Element::ElementUnionConst<SetView,
00216 SingletonView>::post(home, z, x, single)));
00217 }
00218
00219
00220 namespace {
00221 IntVar
00222 pair(Home home, IntVar x, int w, IntVar y, int h) {
00223 IntVar xy(home,0,w*h-1);
00224 if (Int::Element::Pair::post(home,x,y,xy,w,h) != ES_OK)
00225 home.fail();
00226 return xy;
00227 }
00228 }
00229
00230 void
00231 element(Home home, const IntSetArgs& a,
00232 IntVar x, int w, IntVar y, int h, SetVar z) {
00233 if (a.size() == 0)
00234 throw Set::TooFewArguments("Set::element");
00235 if (a.size() != w*h)
00236 throw Set::ArgumentSizeMismatch("Set::element");
00237 if (home.failed()) return;
00238 element(home, a, pair(home,x,w,y,h), z);
00239 }
00240
00241 void
00242 element(Home home, const SetVarArgs& a,
00243 IntVar x, int w, IntVar y, int h, SetVar z) {
00244 if (a.size() == 0)
00245 throw Set::TooFewArguments("Set::element");
00246 if (a.size() != w*h)
00247 throw Set::ArgumentSizeMismatch("Set::element");
00248 if (home.failed()) return;
00249 element(home, a, pair(home,x,w,y,h), z);
00250 }
00251
00252 }
00253
00254
00255