Generated on Fri May 13 2011 22:41:17 for Gecode by doxygen 1.7.1

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: 2010-06-07 14:18:14 +0200 (Mon, 07 Jun 2010) $ by $Author: tack $
00013  *     $Revision: 11048 $
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>::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       // fall through
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 // STATISTICS: set-post
00210