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, 2013
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/float/rel.hh>
00040 
00041 namespace Gecode {
00042 
00043   void
00044   dom(Home home, FloatVar x, FloatVal n) {
00045     using namespace Float;
00046     Limits::check(n,"Float::dom");
00047     GECODE_POST;
00048     FloatView xv(x);
00049     GECODE_ME_FAIL(xv.eq(home,n));
00050   }
00051 
00052   void
00053   dom(Home home, const FloatVarArgs& x, FloatVal n) {
00054     using namespace Float;
00055     Limits::check(n,"Float::dom");
00056     GECODE_POST;
00057     for (int i=x.size(); i--; ) {
00058       FloatView xv(x[i]);
00059       GECODE_ME_FAIL(xv.eq(home,n));
00060     }
00061   }
00062 
00063   void
00064   dom(Home home, FloatVar x, FloatNum min, FloatNum max) {
00065     using namespace Float;
00066     Limits::check(min,"Float::dom");
00067     Limits::check(max,"Float::dom");
00068     GECODE_POST;
00069     FloatView xv(x);
00070     GECODE_ME_FAIL(xv.gq(home,min));
00071     GECODE_ME_FAIL(xv.lq(home,max));
00072   }
00073 
00074   void
00075   dom(Home home, const FloatVarArgs& x, FloatNum min, FloatNum max) {
00076     using namespace Float;
00077     Limits::check(min,"Float::dom");
00078     Limits::check(max,"Float::dom");
00079     GECODE_POST;
00080     for (int i=x.size(); i--; ) {
00081       FloatView xv(x[i]);
00082       GECODE_ME_FAIL(xv.gq(home,min));
00083       GECODE_ME_FAIL(xv.lq(home,max));
00084     }
00085   }
00086 
00087   void
00088   dom(Home home, FloatVar x, FloatVal n, Reify r) {
00089     using namespace Float;
00090     Limits::check(n,"Float::dom");
00091     GECODE_POST;
00092     switch (r.mode()) {
00093     case RM_EQV:
00094       GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::BoolView,RM_EQV>
00095                       ::post(home,x,n,r.var())));
00096       break;
00097     case RM_IMP:
00098       GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::BoolView,RM_IMP>
00099                       ::post(home,x,n,r.var())));
00100       break;
00101     case RM_PMI:
00102       GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::BoolView,RM_PMI>
00103                       ::post(home,x,n,r.var())));
00104       break;
00105     default: throw Int::UnknownReifyMode("Float::dom");
00106     }
00107   }
00108 
00109   void
00110   dom(Home home, FloatVar x, FloatNum min, FloatNum max, Reify r) {
00111     using namespace Float;
00112     if (min > max) {
00113       Int::BoolView b(r.var());
00114       switch (r.mode()) {
00115       case RM_EQV:
00116       case RM_IMP:
00117         GECODE_ME_FAIL(b.zero(home));
00118         break;
00119       case RM_PMI:
00120         break;
00121       default: throw Int::UnknownReifyMode("Float::dom");
00122       }
00123     } else {
00124       FloatVal n(min,max);
00125       dom(home,x,n,r);
00126     }
00127   }
00128 
00129   void
00130   dom(Home home, FloatVar x, FloatVar d) {
00131     using namespace Float;
00132     GECODE_POST;
00133     FloatView xv(x), dv(d);
00134     if (!same(xv,dv)) {
00135       GECODE_ME_FAIL(xv.lq(home,dv.max()));
00136       GECODE_ME_FAIL(xv.gq(home,dv.min()));
00137     }
00138   }
00139 
00140   void
00141   dom(Home home, const FloatVarArgs& x, const FloatVarArgs& d) {
00142     using namespace Float;
00143     if (x.size() != d.size())
00144       throw ArgumentSizeMismatch("Float::dom");
00145     for (int i=x.size(); i--; ) {
00146       GECODE_POST;
00147       FloatView xv(x[i]), dv(d[i]);
00148       if (!same(xv,dv)) {
00149         GECODE_ME_FAIL(xv.lq(home,dv.max()));
00150         GECODE_ME_FAIL(xv.gq(home,dv.min()));
00151       }
00152     }
00153   }
00154 
00155 }
00156 
00157 // STATISTICS: float-post
00158