this repo has no description
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2/*
3 * Main authors:
4 * Vincent Barichard <Vincent.Barichard@univ-angers.fr>
5 *
6 * Contributing authors:
7 * Christian Schulte <schulte@gecode.org>
8 *
9 * Copyright:
10 * Christian Schulte, 2012
11 * Vincent Barichard, 2012
12 *
13 * This file is part of Gecode, the generic constraint
14 * development environment:
15 * http://www.gecode.org
16 *
17 * Permission is hereby granted, free of charge, to any person obtaining
18 * a copy of this software and associated documentation files (the
19 * "Software"), to deal in the Software without restriction, including
20 * without limitation the rights to use, copy, modify, merge, publish,
21 * distribute, sublicense, and/or sell copies of the Software, and to
22 * permit persons to whom the Software is furnished to do so, subject to
23 * the following conditions:
24 *
25 * The above copyright notice and this permission notice shall be
26 * included in all copies or substantial portions of the Software.
27 *
28 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
31 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
32 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
33 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
34 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 *
36 */
37
38namespace Gecode {
39
40 /*
41 * Floating point value: member functions
42 *
43 */
44 forceinline
45 FloatVal::FloatVal(void) {}
46 forceinline
47 FloatVal::FloatVal(const FloatNum& n) : x(n) {}
48 forceinline
49 FloatVal::FloatVal(const FloatNum& l, const FloatNum& u) : x(l,u) {}
50 forceinline
51 FloatVal::FloatVal(const FloatValImpType& i) : x(i) {}
52 forceinline
53 FloatVal::FloatVal(const FloatVal& v) : x(v.x) {}
54
55 forceinline FloatVal&
56 FloatVal::operator =(const FloatNum& n) {
57 x = n; return *this;
58 }
59 forceinline FloatVal&
60 FloatVal::operator =(const FloatVal& v) {
61 x = v.x; return *this;
62 }
63
64 forceinline void
65 FloatVal::assign(FloatNum const &l, FloatNum const &u) {
66 x.assign(l,u);
67 }
68
69 forceinline FloatNum
70 FloatVal::min(void) const {
71 return x.lower();
72 }
73 forceinline FloatNum
74 FloatVal::max(void) const {
75 return x.upper();
76 }
77 forceinline FloatNum
78 FloatVal::size(void) const {
79 return gecode_boost::numeric::width(x);
80 }
81 forceinline FloatNum
82 FloatVal::med(void) const {
83 return gecode_boost::numeric::median(x);
84 }
85
86 forceinline bool
87 FloatVal::tight(void) const {
88 return (gecode_boost::numeric::singleton(x) ||
89 (nextafter(x.lower(),x.upper()) == x.upper()));
90 }
91 forceinline bool
92 FloatVal::singleton(void) const {
93 return gecode_boost::numeric::singleton(x);
94 }
95 forceinline bool
96 FloatVal::in(FloatNum n) const {
97 return gecode_boost::numeric::in(n,x);
98 }
99 forceinline bool
100 FloatVal::zero_in(void) const {
101 return gecode_boost::numeric::zero_in(x);
102 }
103
104 forceinline FloatVal
105 FloatVal::hull(FloatNum x, FloatNum y) {
106 FloatVal h(x,y); return h;
107 }
108 forceinline FloatVal
109 FloatVal::pi_half(void) {
110 FloatVal p(gecode_boost::numeric::interval_lib::pi_half<FloatValImpType>());
111 return p;
112 }
113 forceinline FloatVal
114 FloatVal::pi(void) {
115 FloatVal p(gecode_boost::numeric::interval_lib::pi<FloatValImpType>());
116 return p;
117 }
118 forceinline FloatVal
119 FloatVal::pi_twice(void) {
120 FloatVal p(gecode_boost::numeric::interval_lib::pi_twice<FloatValImpType>());
121 return p;
122 }
123
124 forceinline FloatVal&
125 FloatVal::operator +=(const FloatNum& n) {
126 x += n; return *this;
127 }
128 forceinline FloatVal&
129 FloatVal::operator -=(const FloatNum& n) {
130 x -= n; return *this;
131 }
132 forceinline FloatVal&
133 FloatVal::operator *=(const FloatNum& n) {
134 x *= n; return *this;
135 }
136 forceinline FloatVal&
137 FloatVal::operator /=(const FloatNum& n) {
138 x /= n; return *this;
139 }
140
141 forceinline FloatVal&
142 FloatVal::operator +=(const FloatVal& v) {
143 x += v.x; return *this;
144 }
145 forceinline FloatVal&
146 FloatVal::operator -=(const FloatVal& v) {
147 x -= v.x; return *this;
148 }
149 forceinline FloatVal&
150 FloatVal::operator *=(const FloatVal& v) {
151 x *= v.x; return *this;
152 }
153 forceinline FloatVal&
154 FloatVal::operator /=(const FloatVal& v) {
155 x /= v.x; return *this;
156 }
157
158 /*
159 * Operators and functions on float values
160 *
161 */
162
163 forceinline FloatVal
164 operator +(const FloatVal& x) {
165 return FloatVal(+x.x);
166 }
167 forceinline FloatVal
168 operator -(const FloatVal& x) {
169 FloatNum mmi = (x.min() == 0.0) ? 0.0 : -x.min();
170 FloatNum mma = (x.max() == 0.0) ? 0.0 :-x.max();
171 return FloatVal(mma,mmi);
172 }
173 forceinline FloatVal
174 operator +(const FloatVal& x, const FloatVal& y) {
175 return FloatVal(x.x+y.x);
176 }
177 forceinline FloatVal
178 operator +(const FloatVal& x, const FloatNum& y) {
179 return FloatVal(x.x+y);
180 }
181 forceinline FloatVal
182 operator +(const FloatNum& x, const FloatVal& y) {
183 return FloatVal(x+y.x);
184 }
185
186 forceinline FloatVal
187 operator -(const FloatVal& x, const FloatVal& y) {
188 return FloatVal(x.x-y.x);
189 }
190 forceinline FloatVal
191 operator -(const FloatVal& x, const FloatNum& y) {
192 return FloatVal(x.x-y);
193 }
194 forceinline FloatVal
195 operator -(const FloatNum& x, const FloatVal& y) {
196 return FloatVal(x-y.x);
197 }
198
199 forceinline FloatVal
200 operator *(const FloatVal& x, const FloatVal& y) {
201 return FloatVal(x.x*y.x);
202 }
203 forceinline FloatVal
204 operator *(const FloatVal& x, const FloatNum& y) {
205 return FloatVal(x.x*y);
206 }
207 forceinline FloatVal
208 operator *(const FloatNum& x, const FloatVal& y) {
209 return FloatVal(x*y.x);
210 }
211
212 forceinline FloatVal
213 operator /(const FloatVal& x, const FloatVal& y) {
214 return FloatVal(x.x/y.x);
215 }
216 forceinline FloatVal
217 operator /(const FloatVal& x, const FloatNum& y) {
218 return FloatVal(x.x/y);
219 }
220 forceinline FloatVal
221 operator /(const FloatNum& x, const FloatVal& y) {
222 return FloatVal(x/y.x);
223 }
224
225 inline bool
226 operator <(const FloatVal& x, const FloatVal& y) {
227 try {
228 return x.x < y.x;
229 } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
230 return false;
231 }
232 }
233 inline bool
234 operator <(const FloatVal& x, const FloatNum& y) {
235 try {
236 return x.x < y;
237 } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
238 return false;
239 }
240 }
241
242 inline bool
243 operator <=(const FloatVal& x, const FloatVal& y) {
244 try {
245 return x.x <= y.x;
246 } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
247 return false;
248 }
249 }
250 inline bool
251 operator <=(const FloatVal& x, const FloatNum& y) {
252 try {
253 return x.x <= y;
254 } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
255 return false;
256 }
257 }
258
259 inline bool
260 operator >(const FloatVal& x, const FloatVal& y) {
261 try {
262 return x.x > y.x;
263 } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
264 return false;
265 }
266 }
267 inline bool
268 operator >(const FloatVal& x, const FloatNum& y) {
269 try {
270 return x.x > y;
271 } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
272 return false;
273 }
274 }
275
276 inline bool
277 operator >=(const FloatVal& x, const FloatVal& y) {
278 try {
279 return x.x >= y.x;
280 } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
281 return false;
282 }
283 }
284 inline bool
285 operator >=(const FloatVal& x, const FloatNum& y) {
286 try {
287 return x.x >= y;
288 } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
289 return false;
290 }
291 }
292
293 inline bool
294 operator ==(const FloatVal& x, const FloatVal& y) {
295 try {
296 return x.x == y.x;
297 } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
298 return false;
299 }
300 }
301 inline bool
302 operator ==(const FloatVal& x, const FloatNum& y) {
303 if (!gecode_boost::numeric::interval_lib::checking_strict<FloatNum>
304 ::is_empty(x.x.lower(), x.x.upper())) {
305 if ((x.x.lower() == y) && (x.x.upper() == y))
306 return true;
307 }
308 if (((x.x.lower() == y) &&
309 (nextafter(x.x.lower(),x.x.upper()) == x.x.upper())) ||
310 ((x.x.upper() == y) &&
311 (nextafter(x.x.upper(),x.x.lower()) == x.x.lower())))
312 return true;
313 return false;
314 }
315
316 inline bool
317 operator !=(const FloatVal& x, const FloatVal& y) {
318 try {
319 return x.x != y.x;
320 } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
321 return false;
322 }
323 }
324 inline bool
325 operator !=(const FloatVal& x, const FloatNum& y) {
326 try {
327 return x.x != y;
328 } catch (gecode_boost::numeric::interval_lib::comparison_error&) {
329 return false;
330 }
331 }
332
333 forceinline bool
334 operator <(const FloatNum& x, const FloatVal& y) {
335 return y > x;
336 }
337 forceinline bool
338 operator <=(const FloatNum& x, const FloatVal& y) {
339 return y >= x;
340 }
341 forceinline bool
342 operator >(const FloatNum& x, const FloatVal& y) {
343 return y < x;
344 }
345 forceinline bool
346 operator >=(const FloatNum& x, const FloatVal& y) {
347 return y <= x;
348 }
349 forceinline bool
350 operator ==(const FloatNum& x, const FloatVal& y) {
351 return y == x;
352 }
353 forceinline bool
354 operator !=(const FloatNum& x, const FloatVal& y) {
355 return y != x;
356 }
357
358 template<class Char, class Traits>
359 std::basic_ostream<Char,Traits>&
360 operator <<(std::basic_ostream<Char,Traits>& os, const FloatVal& x) {
361 return os << '[' << x.min() << ".." << x.max() << ']';
362 }
363
364 forceinline FloatVal
365 abs(const FloatVal& x) {
366 return FloatVal(abs(x.x));
367 }
368 forceinline FloatVal
369 sqrt(const FloatVal& x) {
370 return FloatVal(sqrt(x.x));
371 }
372 forceinline FloatVal
373 sqr(const FloatVal& x) {
374 return FloatVal(square(x.x));
375 }
376 forceinline FloatVal
377 pow(const FloatVal& x, int n) {
378 return FloatVal(pow(x.x,n));
379 }
380 forceinline FloatVal
381 nroot(const FloatVal& x, int n) {
382 return FloatVal(nth_root(x.x,n));
383 }
384
385 forceinline FloatVal
386 max(const FloatVal& x, const FloatVal& y) {
387 return FloatVal(max(x.x,y.x));
388 }
389 forceinline FloatVal
390 max(const FloatVal& x, const FloatNum& y) {
391 return FloatVal(max(x.x,y));
392 }
393 forceinline FloatVal
394 max(const FloatNum& x, const FloatVal& y) {
395 return FloatVal(max(x,y.x));
396 }
397 forceinline FloatVal
398 min(const FloatVal& x, const FloatVal& y) {
399 return FloatVal(min(x.x,y.x));
400 }
401 forceinline FloatVal
402 min(const FloatVal& x, const FloatNum& y) {
403 return FloatVal(min(x.x,y));
404 }
405 forceinline FloatVal
406 min(const FloatNum& x, const FloatVal& y) {
407 return FloatVal(min(x,y.x));
408 }
409
410#ifdef GECODE_HAS_MPFR
411
412 forceinline FloatVal
413 exp(const FloatVal& x) {
414 return FloatVal(exp(x.x));
415 }
416 forceinline FloatVal
417 log(const FloatVal& x) {
418 return FloatVal(log(x.x));
419 }
420
421 forceinline FloatVal
422 fmod(const FloatVal& x, const FloatVal& y) {
423 return FloatVal(fmod(x.x,y.x));
424 }
425 forceinline FloatVal
426 fmod(const FloatVal& x, const FloatNum& y) {
427 return FloatVal(fmod(x.x,y));
428 }
429 forceinline FloatVal
430 fmod(const FloatNum& x, const FloatVal& y) {
431 return FloatVal(fmod(x,y.x));
432 }
433
434 forceinline FloatVal
435 sin(const FloatVal& x) {
436 return FloatVal(sin(x.x));
437 }
438 forceinline FloatVal
439 cos(const FloatVal& x) {
440 return FloatVal(cos(x.x));
441 }
442 forceinline FloatVal
443 tan(const FloatVal& x) {
444 return FloatVal(tan(x.x));
445 }
446 forceinline FloatVal
447 asin(const FloatVal& x) {
448 return FloatVal(asin(x.x));
449 }
450 forceinline FloatVal
451 acos(const FloatVal& x) {
452 return FloatVal(acos(x.x));
453 }
454 forceinline FloatVal
455 atan(const FloatVal& x) {
456 return FloatVal(atan(x.x));
457 }
458
459 forceinline FloatVal
460 sinh(const FloatVal& x) {
461 return FloatVal(sinh(x.x));
462 }
463 forceinline FloatVal
464 cosh(const FloatVal& x) {
465 return FloatVal(cosh(x.x));
466 }
467 forceinline FloatVal
468 tanh(const FloatVal& x) {
469 return FloatVal(tanh(x.x));
470 }
471 forceinline FloatVal
472 asinh(const FloatVal& x) {
473 return FloatVal(asinh(x.x));
474 }
475 forceinline FloatVal
476 acosh(const FloatVal& x) {
477 return FloatVal(acosh(x.x));
478 }
479 forceinline FloatVal
480 atanh(const FloatVal& x) {
481 return FloatVal(atanh(x.x));
482 }
483
484#endif
485}
486
487namespace Gecode { namespace Float {
488
489 forceinline bool
490 subset(const FloatVal& x, const FloatVal& y) {
491 return subset(x.x,y.x);
492 }
493 forceinline bool
494 proper_subset(const FloatVal& x, const FloatVal& y) {
495 return proper_subset(x.x,y.x);
496 }
497 forceinline bool
498 overlap(const FloatVal& x, const FloatVal& y) {
499 return overlap(x.x,y.x);
500 }
501
502 forceinline FloatVal
503 intersect(const FloatVal& x, const FloatVal& y) {
504 return FloatVal(intersect(x.x,y.x));
505 }
506 forceinline FloatVal
507 hull(const FloatVal& x, const FloatVal& y) {
508 return FloatVal(hull(x.x,y.x));
509 }
510 forceinline FloatVal
511 hull(const FloatVal& x, const FloatNum& y) {
512 return FloatVal(hull(x.x,y));
513 }
514 forceinline FloatVal
515 hull(const FloatNum& x, const FloatVal& y) {
516 return FloatVal(hull(x,y.x));
517 }
518 forceinline FloatVal
519 hull(const FloatNum& x, const FloatNum& y) {
520 return FloatVal(x,y);
521 }
522
523}}
524
525// STATISTICS: float-var
526