00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 namespace Gecode {
00043
00044
00045
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(FloatVal::hull(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
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 forceinline 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 forceinline 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 forceinline 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 forceinline 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 forceinline 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 forceinline 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 forceinline 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 forceinline 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 forceinline 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 forceinline 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 forceinline 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 forceinline 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(hull(x,y));
00525 }
00526
00527 }}
00528
00529
00530