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