Generated on Thu Mar 22 10:39:36 2012 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  *  Last modified:
00012  *     $Date: 2011-09-06 10:05:16 +0200 (Tue, 06 Sep 2011) $ by $Author: tack $
00013  *     $Revision: 12391 $
00014  *
00015  *  This file is part of Gecode, the generic constraint
00016  *  development environment:
00017  *     http://www.gecode.org
00018  *
00019  *  Permission is hereby granted, free of charge, to any person obtaining
00020  *  a copy of this software and associated documentation files (the
00021  *  "Software"), to deal in the Software without restriction, including
00022  *  without limitation the rights to use, copy, modify, merge, publish,
00023  *  distribute, sublicense, and/or sell copies of the Software, and to
00024  *  permit persons to whom the Software is furnished to do so, subject to
00025  *  the following conditions:
00026  *
00027  *  The above copyright notice and this permission notice shall be
00028  *  included in all copies or substantial portions of the Software.
00029  *
00030  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00031  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00032  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00033  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00034  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00035  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00036  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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       // fall through
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       // fall through
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       // fall through
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 // STATISTICS: set-post
00255