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>::IdxViewArray iv(home, x);
00072 GECODE_ES_FAIL(
00073 (Element::ElementUnion<SetView,SetView>::
00074 post(home,z,iv,y)));
00075 }
00076 break;
00077 case SOT_INTER:
00078 {
00079 Set::Element::ElementIntersection<SetView,SetView>::IdxViewArray
00080 iv(home, x);
00081 GECODE_ES_FAIL(
00082 (Element::ElementIntersection<SetView,SetView>::
00083 post(home,z,iv,y,universe)));
00084 }
00085 break;
00086 case SOT_MINUS:
00087 throw IllegalOperation("Set::element");
00088 break;
00089 default:
00090 throw UnknownOperation("Set::element");
00091 }
00092 }
00093
00094 void
00095 element(Home home, SetOpType op, const IntSetArgs& x, SetVar y, SetVar z,
00096 const IntSet& universe) {
00097 if (home.failed()) return;
00098
00099 switch (op) {
00100 case SOT_DUNION:
00101 {
00102 Set::Element::ElementDisjoint<ConstSetView,SetView>::IdxViewArray
00103 iv(home, x.size());
00104 for (int i=x.size(); i--;) {
00105 iv[i].idx = i; iv[i].view = ConstSetView(home, x[i]);
00106 }
00107 GECODE_ES_FAIL((Element::ElementDisjoint<ConstSetView,SetView>::
00108 post(home,iv,y)));
00109 }
00110
00111 case SOT_UNION:
00112 {
00113 SharedArray<IntSet> s(x.size());
00114 for (int i=s.size(); i--;)
00115 new (&s[i]) IntSet(x[i]);
00116 GECODE_ES_FAIL(
00117 (Element::ElementUnionConst<SetView,SetView>::
00118 post(home,z,s,y)));
00119 }
00120 break;
00121 case SOT_INTER:
00122 {
00123 Set::Element::ElementIntersection<ConstSetView,SetView>::IdxViewArray
00124 iv(home, x.size());
00125 for (int i=x.size(); i--;) {
00126 iv[i].idx = i; iv[i].view = ConstSetView(home, x[i]);
00127 }
00128 GECODE_ES_FAIL(
00129 (Element::ElementIntersection<ConstSetView,SetView>::
00130 post(home,z,iv,y,universe)));
00131 }
00132 break;
00133 case SOT_MINUS:
00134 throw IllegalOperation("Set::element");
00135 break;
00136 default:
00137 throw UnknownOperation("Set::element");
00138 }
00139
00140 }
00141
00142 void
00143 element(Home home, const SetVarArgs& x, IntVar y, SetVar z) {
00144 if (x.size() == 0)
00145 throw Set::TooFewArguments("Set::element");
00146 if (home.failed()) return;
00147 Set::Element::ElementUnion<SetView,SingletonView>::IdxViewArray iv(home, x);
00148 SetView zv(z);
00149
00150 Int::IntView yv(y);
00151 SingletonView single(yv);
00152 GECODE_ES_FAIL((Element::ElementUnion<SetView,
00153 SingletonView>::post(home, z, iv, single)));
00154 }
00155
00156 void
00157 element(Home home, const IntSetArgs& s, IntVar y, SetVar z) {
00158 if (s.size() == 0)
00159 throw Set::TooFewArguments("Set::element");
00160 for (int i=s.size(); i--;)
00161 Set::Limits::check(s[i], "Set::element");
00162 if (home.failed()) return;
00163 SetView zv(z);
00164 SharedArray<IntSet> x(s.size());
00165 for (int i=s.size(); i--;)
00166 new (&x[i]) IntSet(s[i]);
00167
00168 Int::IntView yv(y);
00169 SingletonView single(yv);
00170 GECODE_ES_FAIL((Element::ElementUnionConst<SetView,
00171 SingletonView>::post(home, z, x, single)));
00172 }
00173
00174
00175 namespace {
00176 IntVar
00177 pair(Home home, IntVar x, int w, IntVar y, int h) {
00178 IntVar xy(home,0,w*h-1);
00179 if (Int::Element::Pair::post(home,x,y,xy,w,h) != ES_OK)
00180 home.fail();
00181 return xy;
00182 }
00183 }
00184
00185 void
00186 element(Home home, const IntSetArgs& a,
00187 IntVar x, int w, IntVar y, int h, SetVar z) {
00188 if (a.size() == 0)
00189 throw Set::TooFewArguments("Set::element");
00190 if (a.size() != w*h)
00191 throw Set::ArgumentSizeMismatch("Set::element");
00192 if (home.failed()) return;
00193 element(home, a, pair(home,x,w,y,h), z);
00194 }
00195
00196 void
00197 element(Home home, const SetVarArgs& a,
00198 IntVar x, int w, IntVar y, int h, SetVar z) {
00199 if (a.size() == 0)
00200 throw Set::TooFewArguments("Set::element");
00201 if (a.size() != w*h)
00202 throw Set::ArgumentSizeMismatch("Set::element");
00203 if (home.failed()) return;
00204 element(home, a, pair(home,x,w,y,h), z);
00205 }
00206
00207 }
00208
00209
00210