Generated on Tue Apr 18 10:21:38 2017 for Gecode by doxygen 1.6.3

dom.cpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Christian Schulte <schulte@gecode.org>
00005  *
00006  *  Copyright:
00007  *     Christian Schulte, 2004
00008  *
00009  *  Last modified:
00010  *     $Date: 2016-05-23 22:18:23 +0200 (Mon, 23 May 2016) $ by $Author: schulte $
00011  *     $Revision: 15073 $
00012  *
00013  *  This file is part of Gecode, the generic constraint
00014  *  development environment:
00015  *     http://www.gecode.org
00016  *
00017  *  Permission is hereby granted, free of charge, to any person obtaining
00018  *  a copy of this software and associated documentation files (the
00019  *  "Software"), to deal in the Software without restriction, including
00020  *  without limitation the rights to use, copy, modify, merge, publish,
00021  *  distribute, sublicense, and/or sell copies of the Software, and to
00022  *  permit persons to whom the Software is furnished to do so, subject to
00023  *  the following conditions:
00024  *
00025  *  The above copyright notice and this permission notice shall be
00026  *  included in all copies or substantial portions of the Software.
00027  *
00028  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00029  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00030  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00031  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00032  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00033  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00034  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00035  *
00036  */
00037 
00038 
00039 #include <gecode/int/dom.hh>
00040 #include <gecode/int/rel.hh>
00041 
00042 namespace Gecode {
00043 
00044   void
00045   dom(Home home, IntVar x, int n, IntPropLevel) {
00046     using namespace Int;
00047     Limits::check(n,"Int::dom");
00048     GECODE_POST;
00049     IntView xv(x);
00050     GECODE_ME_FAIL(xv.eq(home,n));
00051   }
00052 
00053   void
00054   dom(Home home, const IntVarArgs& x, int n, IntPropLevel) {
00055     using namespace Int;
00056     Limits::check(n,"Int::dom");
00057     GECODE_POST;
00058     for (int i=x.size(); i--; ) {
00059       IntView xv(x[i]);
00060       GECODE_ME_FAIL(xv.eq(home,n));
00061     }
00062   }
00063 
00064   void
00065   dom(Home home, IntVar x, int min, int max, IntPropLevel) {
00066     using namespace Int;
00067     Limits::check(min,"Int::dom");
00068     Limits::check(max,"Int::dom");
00069     GECODE_POST;
00070     IntView xv(x);
00071     GECODE_ME_FAIL(xv.gq(home,min));
00072     GECODE_ME_FAIL(xv.lq(home,max));
00073   }
00074 
00075   void
00076   dom(Home home, const IntVarArgs& x, int min, int max, IntPropLevel) {
00077     using namespace Int;
00078     Limits::check(min,"Int::dom");
00079     Limits::check(max,"Int::dom");
00080     GECODE_POST;
00081     for (int i=x.size(); i--; ) {
00082       IntView xv(x[i]);
00083       GECODE_ME_FAIL(xv.gq(home,min));
00084       GECODE_ME_FAIL(xv.lq(home,max));
00085     }
00086   }
00087 
00088   void
00089   dom(Home home, IntVar x, const IntSet& is, IntPropLevel) {
00090     using namespace Int;
00091     Limits::check(is.min(),"Int::dom");
00092     Limits::check(is.max(),"Int::dom");
00093     GECODE_POST;
00094     IntView xv(x);
00095     IntSetRanges ris(is);
00096     GECODE_ME_FAIL(xv.inter_r(home,ris,false));
00097   }
00098 
00099   void
00100   dom(Home home, const IntVarArgs& x, const IntSet& is, IntPropLevel) {
00101     using namespace Int;
00102     Limits::check(is.min(),"Int::dom");
00103     Limits::check(is.max(),"Int::dom");
00104     GECODE_POST;
00105     for (int i = x.size(); i--; ) {
00106       IntSetRanges ris(is);
00107       IntView xv(x[i]);
00108       GECODE_ME_FAIL(xv.inter_r(home,ris,false));
00109     }
00110   }
00111 
00112   void
00113   dom(Home home, IntVar x, int n, Reify r, IntPropLevel) {
00114     using namespace Int;
00115     Limits::check(n,"Int::dom");
00116     GECODE_POST;
00117     switch (r.mode()) {
00118     case RM_EQV:
00119       GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,BoolView,RM_EQV>
00120                       ::post(home,x,n,r.var())));
00121       break;
00122     case RM_IMP:
00123       GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,BoolView,RM_IMP>
00124                       ::post(home,x,n,r.var())));
00125       break;
00126     case RM_PMI:
00127       GECODE_ES_FAIL((Rel::ReEqDomInt<IntView,BoolView,RM_PMI>
00128                       ::post(home,x,n,r.var())));
00129       break;
00130     default: throw UnknownReifyMode("Int::dom");
00131     }
00132   }
00133 
00134   void
00135   dom(Home home, IntVar x, int min, int max, Reify r, IntPropLevel) {
00136     using namespace Int;
00137     Limits::check(min,"Int::dom");
00138     Limits::check(max,"Int::dom");
00139     GECODE_POST;
00140     switch (r.mode()) {
00141     case RM_EQV:
00142       GECODE_ES_FAIL((Dom::ReRange<IntView,RM_EQV>
00143                       ::post(home,x,min,max,r.var())));
00144       break;
00145     case RM_IMP:
00146       GECODE_ES_FAIL((Dom::ReRange<IntView,RM_IMP>
00147                       ::post(home,x,min,max,r.var())));
00148       break;
00149     case RM_PMI:
00150       GECODE_ES_FAIL((Dom::ReRange<IntView,RM_PMI>
00151                       ::post(home,x,min,max,r.var())));
00152       break;
00153     default: throw UnknownReifyMode("Int::dom");
00154     }
00155   }
00156 
00157 
00158   void
00159   dom(Home home, IntVar x, const IntSet& is, Reify r, IntPropLevel) {
00160     using namespace Int;
00161     Limits::check(is.min(),"Int::dom");
00162     Limits::check(is.max(),"Int::dom");
00163     GECODE_POST;
00164     switch (r.mode()) {
00165     case RM_EQV:
00166       GECODE_ES_FAIL((Dom::ReIntSet<IntView,RM_EQV>::post(home,x,is,r.var())));
00167       break;
00168     case RM_IMP:
00169       GECODE_ES_FAIL((Dom::ReIntSet<IntView,RM_IMP>::post(home,x,is,r.var())));
00170       break;
00171     case RM_PMI:
00172       GECODE_ES_FAIL((Dom::ReIntSet<IntView,RM_PMI>::post(home,x,is,r.var())));
00173       break;
00174     default: throw UnknownReifyMode("Int::dom");
00175     }
00176   }
00177 
00178   void
00179   dom(Home home, IntVar x, IntVar d, IntPropLevel) {
00180     using namespace Int;
00181     GECODE_POST;
00182     IntView xv(x), dv(d);
00183     if (!same(xv,dv)) {
00184       ViewRanges<IntView> r(dv);
00185       GECODE_ME_FAIL(xv.inter_r(home,r,false));
00186     }
00187   }
00188 
00189   void
00190   dom(Home home, BoolVar x, BoolVar d, IntPropLevel) {
00191     using namespace Int;
00192     GECODE_POST;
00193     if (d.one())
00194       GECODE_ME_FAIL(BoolView(x).one(home));
00195     else if (d.zero())
00196       GECODE_ME_FAIL(BoolView(x).zero(home));
00197   }
00198 
00199   void
00200   dom(Home home, const IntVarArgs& x, const IntVarArgs& d, IntPropLevel) {
00201     using namespace Int;
00202     if (x.size() != d.size())
00203       throw ArgumentSizeMismatch("Int::dom");
00204     for (int i=x.size(); i--; ) {
00205       GECODE_POST;
00206       IntView xv(x[i]), dv(d[i]);
00207       if (!same(xv,dv)) {
00208         ViewRanges<IntView> r(dv);
00209         GECODE_ME_FAIL(xv.inter_r(home,r,false));
00210       }
00211     }
00212   }
00213 
00214   void
00215   dom(Home home, const BoolVarArgs& x, const BoolVarArgs& d, IntPropLevel) {
00216     using namespace Int;
00217     if (x.size() != d.size())
00218       throw ArgumentSizeMismatch("Int::dom");
00219     for (int i=x.size(); i--; ) {
00220       GECODE_POST;
00221       if (d[i].one())
00222         GECODE_ME_FAIL(BoolView(x[i]).one(home));
00223       else if (d[i].zero())
00224         GECODE_ME_FAIL(BoolView(x[i]).zero(home));
00225     }
00226   }
00227 
00228 }
00229 
00230 // STATISTICS: int-post
00231