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

float.hpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Filip Konvicka <filip.konvicka@logis.cz>
00005  *     Lubomir Moric <lubomir.moric@logis.cz>
00006  *     Vincent Barichard <Vincent.Barichard@univ-angers.fr>
00007  *
00008  *  Contributing authors:
00009  *     Christian Schulte <schulte@gecode.org>
00010  *
00011  *  Copyright:
00012  *     LOGIS, s.r.o., 2008
00013  *     Christian Schulte, 2010
00014  *     Vincent Barichard, 2012
00015  *
00016  *  Last modified:
00017  *     $Date: 2017-02-21 06:45:56 +0100 (Tue, 21 Feb 2017) $ by $Author: schulte $
00018  *     $Revision: 15465 $
00019  *
00020  *  This file is part of Gecode, the generic constraint
00021  *  development environment:
00022  *     http://www.gecode.org
00023  *
00024  *  Permission is hereby granted, free of charge, to any person obtaining
00025  *  a copy of this software and associated documentation files (the
00026  *  "Software"), to deal in the Software without restriction, including
00027  *  without limitation the rights to use, copy, modify, merge, publish,
00028  *  distribute, sublicense, and/or sell copies of the Software, and to
00029  *  permit persons to whom the Software is furnished to do so, subject to
00030  *  the following conditions:
00031  *
00032  *  The above copyright notice and this permission notice shall be
00033  *  included in all copies or substantial portions of the Software.
00034  *
00035  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00036  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00037  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00038  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00039  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00040  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00041  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00042  *
00043  */
00044 
00045 namespace Gecode { namespace Float {
00046 
00047   /*
00048    * Creation of new variable implementations
00049    *
00050    */
00051 
00052   forceinline
00053   FloatVarImp::FloatVarImp(Space& home, const FloatVal& d)
00054     : FloatVarImpBase(home), dom(d) {}
00055 
00056   forceinline
00057   FloatVarImp::FloatVarImp(Space& home, bool share, FloatVarImp& x)
00058     : FloatVarImpBase(home, share, x), dom(x.dom) {}
00059 
00060 
00061   /*
00062    * Operations on float variable implementations
00063    *
00064    */
00065 
00066   forceinline FloatVal
00067   FloatVarImp::domain(void) const {
00068     return dom;
00069   }
00070   forceinline FloatNum
00071   FloatVarImp::min(void) const {
00072     return dom.min();
00073   }
00074   forceinline FloatNum
00075   FloatVarImp::max(void) const {
00076     return dom.max();
00077   }
00078   forceinline FloatVal
00079   FloatVarImp::val(void) const {
00080     return dom;
00081   }
00082   forceinline FloatNum
00083   FloatVarImp::med(void) const {
00084     return dom.med();
00085   }
00086 
00087   forceinline bool
00088   FloatVarImp::assigned(void) const {
00089     return dom.tight();
00090   }
00091 
00092   forceinline FloatNum
00093   FloatVarImp::size(void) const {
00094     return dom.size();
00095   }
00096 
00097 
00098   /*
00099    * Tests
00100    *
00101    */
00102 
00103   forceinline bool
00104   FloatVarImp::zero_in(void) const {
00105     return dom.zero_in();
00106   }
00107   forceinline bool
00108   FloatVarImp::in(FloatNum n) const {
00109     return dom.in(n);
00110   }
00111   forceinline bool
00112   FloatVarImp::in(const FloatVal& n) const {
00113     return subset(n,dom);
00114   }
00115 
00116 
00117   /*
00118    * Support for delta information
00119    *
00120    */
00121   forceinline FloatNum
00122   FloatVarImp::min(const Delta& d) {
00123     return static_cast<const FloatDelta&>(d).min();
00124   }
00125   forceinline FloatNum
00126   FloatVarImp::max(const Delta& d) {
00127     return static_cast<const FloatDelta&>(d).max();
00128   }
00129 
00130 
00131   /*
00132    * Tell operations (to be inlined: performing bounds checks first)
00133    *
00134    */
00135 
00136   forceinline ModEvent
00137   FloatVarImp::gq(Space& home, FloatNum n) {
00138     if (n > dom.max())  return fail(home);
00139     if ((n <= dom.min()) || assigned()) return ME_FLOAT_NONE;
00140     FloatDelta d(dom.min(),n);
00141     ModEvent me = ME_FLOAT_BND;
00142     dom = intersect(dom,FloatVal(n,dom.max()));
00143     if (assigned()) me = ME_FLOAT_VAL;
00144     GECODE_ASSUME((me == ME_FLOAT_VAL) |
00145                   (me == ME_FLOAT_BND));
00146     return notify(home,me,d);
00147   }
00148   forceinline ModEvent
00149   FloatVarImp::gq(Space& home, const FloatVal& n) {
00150     if (n.min() > dom.max())  return fail(home);
00151     if ((n.min() <= dom.min()) || assigned()) return ME_FLOAT_NONE;
00152     FloatDelta d(dom.min(),n.min());
00153     ModEvent me = ME_FLOAT_BND;
00154     dom = intersect(dom,FloatVal(n.min(),dom.max()));
00155     if (assigned()) me = ME_FLOAT_VAL;
00156     GECODE_ASSUME((me == ME_FLOAT_VAL) |
00157                   (me == ME_FLOAT_BND));
00158     return notify(home,me,d);
00159   }
00160 
00161 
00162   forceinline ModEvent
00163   FloatVarImp::lq(Space& home, FloatNum n) {
00164     if (n < dom.min())  return fail(home);
00165     if ((n >= dom.max()) || assigned()) return ME_FLOAT_NONE;
00166     FloatDelta d(n,dom.max());
00167     ModEvent me = ME_FLOAT_BND;
00168     dom = intersect(dom,FloatVal(dom.min(),n));
00169     if (assigned()) me = ME_FLOAT_VAL;
00170     GECODE_ASSUME((me == ME_FLOAT_VAL) |
00171                   (me == ME_FLOAT_BND));
00172     return notify(home,me,d);
00173   }
00174   forceinline ModEvent
00175   FloatVarImp::lq(Space& home, const FloatVal& n) {
00176     if (n.max() < dom.min())  return fail(home);
00177     if ((n.max() >= dom.max()) || assigned()) return ME_FLOAT_NONE;
00178     FloatDelta d(n.max(),dom.max());
00179     ModEvent me = ME_FLOAT_BND;
00180     dom = intersect(dom,FloatVal(dom.min(),n.max()));
00181     if (assigned()) me = ME_FLOAT_VAL;
00182     GECODE_ASSUME((me == ME_FLOAT_VAL) |
00183                   (me == ME_FLOAT_BND));
00184     return notify(home,me,d);
00185   }
00186 
00187 
00188   forceinline ModEvent
00189   FloatVarImp::eq(Space& home, FloatNum n) {
00190     if (!dom.in(n))
00191       return fail(home);
00192     if (assigned())
00193       return ME_FLOAT_NONE;
00194     FloatDelta d;
00195     dom = n;
00196     return notify(home,ME_FLOAT_VAL,d);
00197   }
00198   forceinline ModEvent
00199   FloatVarImp::eq(Space& home, const FloatVal& n) {
00200     if (!overlap(dom,n))
00201       return fail(home);
00202     if (assigned() || subset(dom,n))
00203       return ME_FLOAT_NONE;
00204     FloatDelta d;
00205     ModEvent me = ME_FLOAT_BND;
00206     dom = intersect(dom,n);
00207     if (assigned()) me = ME_FLOAT_VAL;
00208     GECODE_ASSUME((me == ME_FLOAT_VAL) |
00209                   (me == ME_FLOAT_BND));
00210     return notify(home,me,d);
00211   }
00212 
00213 
00214   /*
00215    * Copying a variable
00216    *
00217    */
00218 
00219   forceinline FloatVarImp*
00220   FloatVarImp::copy(Space& home, bool share) {
00221     return copied() ? static_cast<FloatVarImp*>(forward())
00222       : perform_copy(home,share);
00223   }
00224 
00226   forceinline FloatVarImp*
00227   FloatVarImp::perform_copy(Space& home, bool share) {
00228     return new (home) FloatVarImp(home, share, *this);
00229   }
00230 
00231   forceinline ModEventDelta
00232   FloatVarImp::med(ModEvent me) {
00233     return FloatVarImpBase::med(me);
00234   }
00235 
00236 }}
00237 
00238 // STATISTICS: float-var