Generated on Thu Apr 11 13:59:07 2019 for Gecode by doxygen 1.6.3

element.cpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Guido Tack <tack@gecode.org>
00005  *     Christian Schulte <schulte@gecode.org>
00006  *
00007  *  Copyright:
00008  *     Guido Tack, 2004
00009  *     Christian Schulte, 2004
00010  *
00011  *  This file is part of Gecode, the generic constraint
00012  *  development environment:
00013  *     http://www.gecode.org
00014  *
00015  *  Permission is hereby granted, free of charge, to any person obtaining
00016  *  a copy of this software and associated documentation files (the
00017  *  "Software"), to deal in the Software without restriction, including
00018  *  without limitation the rights to use, copy, modify, merge, publish,
00019  *  distribute, sublicense, and/or sell copies of the Software, and to
00020  *  permit persons to whom the Software is furnished to do so, subject to
00021  *  the following conditions:
00022  *
00023  *  The above copyright notice and this permission notice shall be
00024  *  included in all copies or substantial portions of the Software.
00025  *
00026  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00027  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00028  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00029  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00030  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00031  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00032  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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       // fall through
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       // fall through
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       // fall through
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 // STATISTICS: set-post
00251