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

val.hpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Vincent Barichard <Vincent.Barichard@univ-angers.fr>
00005  *
00006  *  Contributing authors:
00007  *     Christian Schulte <schulte@gecode.org>
00008  *
00009  *  Copyright:
00010  *     Christian Schulte, 2012
00011  *     Vincent Barichard, 2012
00012  *
00013  *  Last modified:
00014  *     $Date: 2016-06-20 16:44:21 +0200 (Mon, 20 Jun 2016) $ by $Author: schulte $
00015  *     $Revision: 15120 $
00016  *
00017  *  This file is part of Gecode, the generic constraint
00018  *  development environment:
00019  *     http://www.gecode.org
00020  *
00021  *  Permission is hereby granted, free of charge, to any person obtaining
00022  *  a copy of this software and associated documentation files (the
00023  *  "Software"), to deal in the Software without restriction, including
00024  *  without limitation the rights to use, copy, modify, merge, publish,
00025  *  distribute, sublicense, and/or sell copies of the Software, and to
00026  *  permit persons to whom the Software is furnished to do so, subject to
00027  *  the following conditions:
00028  *
00029  *  The above copyright notice and this permission notice shall be
00030  *  included in all copies or substantial portions of the Software.
00031  *
00032  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00033  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00034  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00035  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00036  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00037  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00038  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00039  *
00040  */
00041 
00042 namespace Gecode {
00043 
00044   /*
00045    * Floating point value: member functions
00046    *
00047    */
00048   forceinline
00049   FloatVal::FloatVal(void) {}
00050   forceinline
00051   FloatVal::FloatVal(const FloatNum& n) : x(n) {}
00052   forceinline
00053   FloatVal::FloatVal(const FloatNum& l, const FloatNum& u) : x(l,u) {}
00054   forceinline
00055   FloatVal::FloatVal(const FloatValImpType& i) : x(i) {}
00056   forceinline
00057   FloatVal::FloatVal(const FloatVal& v) : x(v.x) {}
00058 
00059   forceinline FloatVal&
00060   FloatVal::operator =(const FloatNum& n) {
00061     x = n; return *this;
00062   }
00063   forceinline FloatVal&
00064   FloatVal::operator =(const FloatVal& v) {
00065     x = v.x; return *this;
00066   }
00067 
00068   forceinline void
00069   FloatVal::assign(FloatNum const &l, FloatNum const &u) {
00070     x.assign(l,u);
00071   }
00072 
00073   forceinline FloatNum
00074   FloatVal::min(void) const {
00075     return x.lower();
00076   }
00077   forceinline FloatNum
00078   FloatVal::max(void) const {
00079     return x.upper();
00080   }
00081   forceinline FloatNum
00082   FloatVal::size(void) const {
00083     return gecode_boost::numeric::width(x);
00084   }
00085   forceinline FloatNum
00086   FloatVal::med(void) const {
00087     return gecode_boost::numeric::median(x);
00088   }
00089 
00090   forceinline bool
00091   FloatVal::tight(void) const {
00092     return (gecode_boost::numeric::singleton(x) ||
00093             (nextafter(x.lower(),x.upper()) == x.upper()));
00094   }
00095   forceinline bool
00096   FloatVal::singleton(void) const {
00097     return gecode_boost::numeric::singleton(x);
00098   }
00099   forceinline bool
00100   FloatVal::in(FloatNum n) const {
00101     return gecode_boost::numeric::in(n,x);
00102   }
00103   forceinline bool
00104   FloatVal::zero_in(void) const {
00105     return gecode_boost::numeric::zero_in(x);
00106   }
00107 
00108   forceinline FloatVal
00109   FloatVal::hull(FloatNum x, FloatNum y) {
00110     FloatVal h(x,y); return h;
00111   }
00112   forceinline FloatVal
00113   FloatVal::pi_half(void) {
00114     FloatVal p(gecode_boost::numeric::interval_lib::pi_half<FloatValImpType>());
00115     return p;
00116   }
00117   forceinline FloatVal
00118   FloatVal::pi(void) {
00119     FloatVal p(gecode_boost::numeric::interval_lib::pi<FloatValImpType>());
00120     return p;
00121   }
00122   forceinline FloatVal
00123   FloatVal::pi_twice(void) {
00124     FloatVal p(gecode_boost::numeric::interval_lib::pi_twice<FloatValImpType>());
00125     return p;
00126   }
00127 
00128   forceinline FloatVal&
00129   FloatVal::operator +=(const FloatNum& n) {
00130     x += n; return *this;
00131   }
00132   forceinline FloatVal&
00133   FloatVal::operator -=(const FloatNum& n) {
00134     x -= n; return *this;
00135   }
00136   forceinline FloatVal&
00137   FloatVal::operator *=(const FloatNum& n) {
00138     x *= n; return *this;
00139   }
00140   forceinline FloatVal&
00141   FloatVal::operator /=(const FloatNum& n) {
00142     x /= n; return *this;
00143   }
00144 
00145   forceinline FloatVal&
00146   FloatVal::operator +=(const FloatVal& v) {
00147     x += v.x; return *this;
00148   }
00149   forceinline FloatVal&
00150   FloatVal::operator -=(const FloatVal& v) {
00151     x -= v.x; return *this;
00152   }
00153   forceinline FloatVal&
00154   FloatVal::operator *=(const FloatVal& v) {
00155     x *= v.x; return *this;
00156   }
00157   forceinline FloatVal&
00158   FloatVal::operator /=(const FloatVal& v) {
00159     x /= v.x; return *this;
00160   }
00161 
00162   /*
00163    * Operators and functions on float values
00164    *
00165    */
00166 
00167   forceinline FloatVal
00168   operator +(const FloatVal& x) {
00169     return FloatVal(+x.x);
00170   }
00171   forceinline FloatVal
00172   operator -(const FloatVal& x) {
00173     FloatNum mmi = (x.min() == 0.0) ? 0.0 : -x.min();
00174     FloatNum mma = (x.max() == 0.0) ? 0.0 :-x.max();
00175     return FloatVal(mma,mmi);
00176   }
00177   forceinline FloatVal
00178   operator +(const FloatVal& x, const FloatVal& y) {
00179     return FloatVal(x.x+y.x);
00180   }
00181   forceinline FloatVal
00182   operator +(const FloatVal& x, const FloatNum& y) {
00183     return FloatVal(x.x+y);
00184   }
00185   forceinline FloatVal
00186   operator +(const FloatNum& x, const FloatVal& y) {
00187     return FloatVal(x+y.x);
00188   }
00189 
00190   forceinline FloatVal
00191   operator -(const FloatVal& x, const FloatVal& y) {
00192     return FloatVal(x.x-y.x);
00193   }
00194   forceinline FloatVal
00195   operator -(const FloatVal& x, const FloatNum& y) {
00196     return FloatVal(x.x-y);
00197   }
00198   forceinline FloatVal
00199   operator -(const FloatNum& x, const FloatVal& y) {
00200     return FloatVal(x-y.x);
00201   }
00202 
00203   forceinline FloatVal
00204   operator *(const FloatVal& x, const FloatVal& y) {
00205     return FloatVal(x.x*y.x);
00206   }
00207   forceinline FloatVal
00208   operator *(const FloatVal& x, const FloatNum& y) {
00209     return FloatVal(x.x*y);
00210   }
00211   forceinline FloatVal
00212   operator *(const FloatNum& x, const FloatVal& y) {
00213     return FloatVal(x*y.x);
00214   }
00215 
00216   forceinline FloatVal
00217   operator /(const FloatVal& x, const FloatVal& y) {
00218     return FloatVal(x.x/y.x);
00219   }
00220   forceinline FloatVal
00221   operator /(const FloatVal& x, const FloatNum& y) {
00222     return FloatVal(x.x/y);
00223   }
00224   forceinline FloatVal
00225   operator /(const FloatNum& x, const FloatVal& y) {
00226     return FloatVal(x/y.x);
00227   }
00228 
00229   inline bool
00230   operator <(const FloatVal& x, const FloatVal& y) {
00231     try {
00232       return x.x < y.x;
00233     } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
00234       return false;
00235     }
00236   }
00237   inline bool
00238   operator <(const FloatVal& x, const FloatNum& y) {
00239     try {
00240       return x.x < y;
00241     } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
00242       return false;
00243     }
00244   }
00245 
00246   inline bool
00247   operator <=(const FloatVal& x, const FloatVal& y) {
00248     try {
00249       return x.x <= y.x;
00250     } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
00251       return false;
00252     }
00253   }
00254   inline bool
00255   operator <=(const FloatVal& x, const FloatNum& y) {
00256     try {
00257       return x.x <= y;
00258     } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
00259       return false;
00260     }
00261   }
00262 
00263   inline bool
00264   operator >(const FloatVal& x, const FloatVal& y) {
00265     try {
00266       return x.x > y.x;
00267     } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
00268       return false;
00269     }
00270   }
00271   inline bool
00272   operator >(const FloatVal& x, const FloatNum& y) {
00273     try {
00274       return x.x > y;
00275     } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
00276       return false;
00277     }
00278   }
00279 
00280   inline bool
00281   operator >=(const FloatVal& x, const FloatVal& y) {
00282     try {
00283       return x.x >= y.x;
00284     } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
00285       return false;
00286     }
00287   }
00288   inline bool
00289   operator >=(const FloatVal& x, const FloatNum& y) {
00290     try {
00291       return x.x >= y;
00292     } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
00293       return false;
00294     }
00295   }
00296 
00297   inline bool
00298   operator ==(const FloatVal& x, const FloatVal& y) {
00299     try {
00300       return x.x == y.x;
00301     } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
00302       return false;
00303     }
00304   }
00305   inline bool
00306   operator ==(const FloatVal& x, const FloatNum& y) {
00307     if (!gecode_boost::numeric::interval_lib::checking_strict<FloatNum>
00308         ::is_empty(x.x.lower(), x.x.upper())) {
00309       if ((x.x.lower() == y) && (x.x.upper() == y))
00310         return true;
00311       }
00312     if (((x.x.lower() == y) &&
00313          (nextafter(x.x.lower(),x.x.upper()) == x.x.upper())) ||
00314         ((x.x.upper() == y) &&
00315          (nextafter(x.x.upper(),x.x.lower()) == x.x.lower())))
00316       return true;
00317     return false;
00318   }
00319 
00320   inline bool
00321   operator !=(const FloatVal& x, const FloatVal& y) {
00322     try {
00323       return x.x != y.x;
00324     } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
00325       return false;
00326     }
00327   }
00328   inline bool
00329   operator !=(const FloatVal& x, const FloatNum& y) {
00330     try {
00331       return x.x != y;
00332     } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
00333       return false;
00334     }
00335   }
00336 
00337   forceinline bool
00338   operator <(const FloatNum& x, const FloatVal& y) {
00339     return y > x;
00340   }
00341   forceinline bool
00342   operator <=(const FloatNum& x, const FloatVal& y) {
00343     return y >= x;
00344   }
00345   forceinline bool
00346   operator >(const FloatNum& x, const FloatVal& y) {
00347     return y < x;
00348   }
00349   forceinline bool
00350   operator >=(const FloatNum& x, const FloatVal& y) {
00351     return y <= x;
00352   }
00353   forceinline bool
00354   operator ==(const FloatNum& x, const FloatVal& y) {
00355     return y == x;
00356   }
00357   forceinline bool
00358   operator !=(const FloatNum& x, const FloatVal& y) {
00359     return y != x;
00360   }
00361 
00362   template<class Char, class Traits>
00363   std::basic_ostream<Char,Traits>&
00364   operator <<(std::basic_ostream<Char,Traits>& os, const FloatVal& x) {
00365     return os << x.x;
00366   }
00367 
00368   forceinline FloatVal
00369   abs(const FloatVal& x) {
00370     return FloatVal(abs(x.x));
00371   }
00372   forceinline FloatVal
00373   sqrt(const FloatVal& x) {
00374     return FloatVal(sqrt(x.x));
00375   }
00376   forceinline FloatVal
00377   sqr(const FloatVal& x) {
00378     return FloatVal(square(x.x));
00379   }
00380   forceinline FloatVal
00381   pow(const FloatVal& x, int n) {
00382     return FloatVal(pow(x.x,n));
00383   }
00384   forceinline FloatVal
00385   nroot(const FloatVal& x, int n) {
00386     return FloatVal(nth_root(x.x,n));
00387   }
00388 
00389   forceinline FloatVal
00390   max(const FloatVal& x, const FloatVal& y) {
00391     return FloatVal(max(x.x,y.x));
00392   }
00393   forceinline FloatVal
00394   max(const FloatVal& x, const FloatNum& y) {
00395     return FloatVal(max(x.x,y));
00396   }
00397   forceinline FloatVal
00398   max(const FloatNum& x, const FloatVal& y) {
00399     return FloatVal(max(x,y.x));
00400   }
00401   forceinline FloatVal
00402   min(const FloatVal& x, const FloatVal& y) {
00403     return FloatVal(min(x.x,y.x));
00404   }
00405   forceinline FloatVal
00406   min(const FloatVal& x, const FloatNum& y) {
00407     return FloatVal(min(x.x,y));
00408   }
00409   forceinline FloatVal
00410   min(const FloatNum& x, const FloatVal& y) {
00411     return FloatVal(min(x,y.x));
00412   }
00413 
00414 #ifdef GECODE_HAS_MPFR
00415 
00416   forceinline FloatVal
00417   exp(const FloatVal& x) {
00418     return FloatVal(exp(x.x));
00419   }
00420   forceinline FloatVal
00421   log(const FloatVal& x) {
00422     return FloatVal(log(x.x));
00423   }
00424 
00425   forceinline FloatVal
00426   fmod(const FloatVal& x, const FloatVal& y) {
00427     return FloatVal(fmod(x.x,y.x));
00428   }
00429   forceinline FloatVal
00430   fmod(const FloatVal& x, const FloatNum& y) {
00431     return FloatVal(fmod(x.x,y));
00432   }
00433   forceinline FloatVal
00434   fmod(const FloatNum& x, const FloatVal& y) {
00435     return FloatVal(fmod(x,y.x));
00436   }
00437 
00438   forceinline FloatVal
00439   sin(const FloatVal& x) {
00440     return FloatVal(sin(x.x));
00441   }
00442   forceinline FloatVal
00443   cos(const FloatVal& x) {
00444     return FloatVal(cos(x.x));
00445   }
00446   forceinline FloatVal
00447   tan(const FloatVal& x) {
00448     return FloatVal(tan(x.x));
00449   }
00450   forceinline FloatVal
00451   asin(const FloatVal& x) {
00452     return FloatVal(asin(x.x));
00453   }
00454   forceinline FloatVal
00455   acos(const FloatVal& x) {
00456     return FloatVal(acos(x.x));
00457   }
00458   forceinline FloatVal
00459   atan(const FloatVal& x) {
00460     return FloatVal(atan(x.x));
00461   }
00462 
00463   forceinline FloatVal
00464   sinh(const FloatVal& x) {
00465     return FloatVal(sinh(x.x));
00466   }
00467   forceinline FloatVal
00468   cosh(const FloatVal& x) {
00469     return FloatVal(cosh(x.x));
00470   }
00471   forceinline FloatVal
00472   tanh(const FloatVal& x) {
00473     return FloatVal(tanh(x.x));
00474   }
00475   forceinline FloatVal
00476   asinh(const FloatVal& x) {
00477     return FloatVal(asinh(x.x));
00478   }
00479   forceinline FloatVal
00480   acosh(const FloatVal& x) {
00481     return FloatVal(acosh(x.x));
00482   }
00483   forceinline FloatVal
00484   atanh(const FloatVal& x) {
00485     return FloatVal(atanh(x.x));
00486   }
00487 
00488 #endif
00489 }
00490 
00491 namespace Gecode { namespace Float {
00492 
00493   forceinline bool
00494   subset(const FloatVal& x, const FloatVal& y) {
00495     return subset(x.x,y.x);
00496   }
00497   forceinline bool
00498   proper_subset(const FloatVal& x, const FloatVal& y) {
00499     return proper_subset(x.x,y.x);
00500   }
00501   forceinline bool
00502   overlap(const FloatVal& x, const FloatVal& y) {
00503     return overlap(x.x,y.x);
00504   }
00505 
00506   forceinline FloatVal
00507   intersect(const FloatVal& x, const FloatVal& y) {
00508     return FloatVal(intersect(x.x,y.x));
00509   }
00510   forceinline FloatVal
00511   hull(const FloatVal& x, const FloatVal& y) {
00512     return FloatVal(hull(x.x,y.x));
00513   }
00514   forceinline FloatVal
00515   hull(const FloatVal& x, const FloatNum& y) {
00516     return FloatVal(hull(x.x,y));
00517   }
00518   forceinline FloatVal
00519   hull(const FloatNum& x, const FloatVal& y) {
00520     return FloatVal(hull(x,y.x));
00521   }
00522   forceinline FloatVal
00523   hull(const FloatNum& x, const FloatNum& y) {
00524     return FloatVal(x,y);
00525   }
00526 
00527 }}
00528 
00529 // STATISTICS: float-var
00530