Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
constants.cpp
Go to the documentation of this file.
2
3#include <cmath>
4#include <numeric>
5
16
17namespace storm {
18namespace utility {
19
20template<typename ValueType>
21ValueType one() {
22 return ValueType(1);
23}
24
25template<typename ValueType>
26ValueType zero() {
27 return ValueType(0);
28}
29
30template<typename ValueType>
31ValueType infinity() {
32 // std::numeric_limits<T>::infinity() is zero for types that have no infinity, so asking for the infinity of an
33 // integral type used to silently yield zero. Reject it instead.
34 static_assert(!std::numeric_limits<ValueType>::is_integer, "There is no infinity for integral types.");
35 return std::numeric_limits<ValueType>::infinity();
36}
37
38template<typename ValueType>
39bool isOne(ValueType const& a) {
40 return a == one<ValueType>();
41}
42
43template<typename ValueType>
44bool isZero(ValueType const& a) {
45 return a == zero<ValueType>();
46}
47
48template<typename ValueType>
49bool isNan(ValueType const&) {
50 return false;
51}
52
53template<>
54bool isNan(double const& value) {
55 return std::isnan(value);
56}
57
58template<typename ValueType>
59bool isApproxEqual(ValueType const& a, ValueType const& b, ValueType const& precision, bool relative) {
60 ValueType const absDiff = abs<ValueType>(a - b);
61 if (relative) {
62 return absDiff <= precision * max(abs(a), abs(b));
63 } else {
64 return absDiff <= precision;
65 }
66}
67
68template<typename ValueType>
69bool isPositive(ValueType const& a) {
70 return a > zero<ValueType>();
71}
72
73template<typename ValueType>
74bool isNonNegative(ValueType const& a) {
75 return a >= zero<ValueType>();
76}
77
86template<typename ValueType>
87bool isBetween(ValueType const& a, ValueType const& b, ValueType const& c, bool strict) {
88 STORM_LOG_ASSERT(isConstant(a), "Checking whether something is between two values is only sensible on constants.");
89 STORM_LOG_ASSERT(isConstant(c), "Checking whether something is between two values is only sensible on constants.");
90 if (strict) {
91 return a < b && b < c;
92 } else {
93 return a <= b && b <= c;
94 }
95}
96
97template<typename ValueType>
98bool isAlmostZero(ValueType const& a) {
99 return a < convertNumber<ValueType>(1e-12) && a > -convertNumber<ValueType>(1e-12);
100}
101
102template<typename ValueType>
103bool isAlmostOne(ValueType const& a) {
104 return a < convertNumber<ValueType>(1.0 + 1e-12) && a > convertNumber<ValueType>(1.0 - 1e-12);
105}
106
107template<typename ValueType>
108bool isConstant(ValueType const&) {
109 return true;
110}
111
112template<typename ValueType>
113bool isInfinity(ValueType const& a) {
114 if constexpr (std::numeric_limits<ValueType>::is_integer) {
115 // Integral types have no infinity, so no value of them is infinite.
116 return false;
117 } else {
118 return a == infinity<ValueType>();
119 }
120}
121
122template<typename ValueType>
123bool isInteger(ValueType const& number) {
124 ValueType iPart;
125 ValueType result = std::modf(number, &iPart);
126 return result == zero<ValueType>();
127}
128
129template<>
130bool isInteger(int const&) {
131 return true;
132}
133
134template<>
135bool isInteger(uint32_t const&) {
136 return true;
137}
138
139template<>
141 return true;
142}
143
144template<typename TargetType, typename SourceType>
145TargetType convertNumber(SourceType const& number) {
146 return static_cast<TargetType>(number);
147}
148
149template<>
150uint_fast64_t convertNumber(double const& number) {
151 return std::llround(number);
152}
153
154template<>
155int_fast64_t convertNumber(double const& number) {
156 return std::llround(number);
157}
158
159template<>
160double convertNumber(uint_fast64_t const& number) {
161 return number;
162}
163
164template<>
165double convertNumber(double const& number) {
166 return number;
167}
168
169template<>
170double convertNumber(long long const& number) {
171 return static_cast<double>(number);
172}
173
174template<>
176 return static_cast<storm::storage::sparse::state_type>(number);
177}
178
179template<typename ValueType>
180ValueType simplify(ValueType value) {
181 // In the general case, we don't do anything here, but merely return the value. If something else is
182 // supposed to happen here, the templated function can be specialized for this particular type.
183 return value;
184}
185
186template<typename ValueType>
187std::pair<ValueType, ValueType> minmax(std::vector<ValueType> const& values) {
188 STORM_LOG_ASSERT(!values.empty(), "Expected non-empty values.");
189 ValueType min = values.front();
190 ValueType max = values.front();
191 for (auto const& vt : values) {
192 if (vt < min) {
193 min = vt;
194 }
195 if (vt > max) {
196 max = vt;
197 }
198 }
199 return std::make_pair(min, max);
200}
201
202template<typename ValueType>
203ValueType minimum(std::vector<ValueType> const& values) {
204 STORM_LOG_ASSERT(!values.empty(), "Expected non-empty values.");
205 ValueType min = values.front();
206 for (auto const& vt : values) {
207 if (vt < min) {
208 min = vt;
209 }
210 }
211 return min;
212}
213
214template<typename ValueType>
215ValueType maximum(std::vector<ValueType> const& values) {
216 STORM_LOG_ASSERT(!values.empty(), "Expected non-empty values.");
217 ValueType max = values.front();
218 for (auto const& vt : values) {
219 if (vt > max) {
220 max = vt;
221 }
222 }
223 return max;
224}
225
226template<typename K, typename ValueType>
227std::pair<ValueType, ValueType> minmax(std::map<K, ValueType> const& values) {
228 STORM_LOG_ASSERT(!values.empty(), "Expected non-empty values.");
229 ValueType min = values.begin()->second;
230 ValueType max = values.begin()->second;
231 for (auto const& vt : values) {
232 if (vt.second < min) {
233 min = vt.second;
234 }
235 if (vt.second > max) {
236 max = vt.second;
237 }
238 }
239 return std::make_pair(min, max);
240}
241
242template<typename K, typename ValueType>
243ValueType minimum(std::map<K, ValueType> const& values) {
244 return minmax(values).first;
245}
246
247template<typename K, typename ValueType>
248ValueType maximum(std::map<K, ValueType> const& values) {
249 return minmax(values).second;
250}
251
252template<typename ValueType>
253ValueType pow(ValueType const& value, int_fast64_t exponent) {
254 return std::pow(value, exponent);
255}
256
257template<typename ValueType>
258ValueType max(ValueType const& first, ValueType const& second) {
259 return std::max(first, second);
260}
261
262template<typename ValueType>
263ValueType min(ValueType const& first, ValueType const& second) {
264 return std::min(first, second);
265}
266
267template<typename ValueType>
268ValueType sqrt(ValueType const& number) {
269 return std::sqrt(number);
270}
271
272template<typename ValueType>
273ValueType abs(ValueType const& number) {
274 return std::fabs(number);
275}
276
277template<typename ValueType>
278ValueType floor(ValueType const& number) {
279 return std::floor(number);
280}
281
282template<typename ValueType>
283ValueType ceil(ValueType const& number) {
284 return std::ceil(number);
285}
286
287template<typename ValueType>
288ValueType round(ValueType const& number) {
289 // Rounding towards infinity
291}
292
293template<typename ValueType>
294ValueType log(ValueType const& number) {
295 return std::log(number);
296}
297
298template<typename ValueType>
299ValueType log10(ValueType const& number) {
300 return std::log10(number);
301}
302
303template<typename ValueType>
304ValueType cos(ValueType const& number) {
305 return std::cos(number);
306}
307
308template<typename ValueType>
309ValueType sin(ValueType const& number) {
310 return std::sin(number);
311}
312
313template<typename ValueType>
314uint64_t numDigits(ValueType const& number) {
315 auto numDigits = 0;
316 ValueType remaining = storm::utility::one<ValueType>() / number;
318 while (remaining >= storm::utility::one<ValueType>()) {
319 ++numDigits;
320 remaining = storm::utility::floor<ValueType>(remaining / ten);
321 }
322 return numDigits;
323}
324
325template<typename ValueType>
326uint64_t bitsize(ValueType const& number) {
327 if constexpr (std::is_same_v<ValueType, uint64_t>) {
328 return std::bit_width(number);
329 } else {
330 if (storm::utility::isZero(number)) {
331 return 0;
332 } else {
333 // GMPs sizeinbase returns 1 if number is zero.
334 // see https://gmplib.org/manual/Miscellaneous-Integer-Functions
335 return carl::bitsize(number);
336 }
337 }
338}
339
340template<typename ValueType>
341typename NumberTraits<ValueType>::IntegerType trunc(ValueType const& number) {
342 return static_cast<typename NumberTraits<ValueType>::IntegerType>(std::trunc(number));
343}
344
345template<typename IntegerType>
346IntegerType mod(IntegerType const& first, IntegerType const& second) {
347 return std::fmod(first, second);
348}
349
350template<typename IntegerType>
351std::pair<IntegerType, IntegerType> divide(IntegerType const& dividend, IntegerType const& divisor) {
352 return std::make_pair(dividend / divisor, mod(dividend, divisor));
353}
354
355template<typename IntegerType>
356IntegerType gcd(IntegerType const& first, IntegerType const& second) {
357 return std::gcd(first, second);
358}
359
360template<typename IntegerType>
361IntegerType lcm(IntegerType const& first, IntegerType const& second) {
362 return std::lcm(first, second);
363}
364
365template<typename ValueType>
366std::string to_string(ValueType const& value) {
367 std::stringstream ss;
368 ss.precision(std::numeric_limits<ValueType>::max_digits10 + 2);
369 ss << value;
370 return ss.str();
371}
372
373#if defined(STORM_HAVE_CLN)
374template<>
375storm::ClnRationalNumber infinity() {
377 "storm::utility::infinity<storm::ClnRationalNumber>, which returns the literal 100000000000 rather than an infinity. Hold the value in a "
378 "storm::utility::ExtendedValueType<storm::ClnRationalNumber> instead.");
379 // FIXME: this should be treated more properly.
380 return storm::ClnRationalNumber(100000000000);
381}
382
383template<>
384bool isOne(storm::ClnRationalNumber const& a) {
385 return carl::isOne(a);
386}
387
388template<>
389bool isZero(storm::ClnRationalNumber const& a) {
390 return carl::isZero(a);
391}
392
393template<>
394bool isInteger(storm::ClnRationalNumber const& number) {
395 return carl::isInteger(number);
396}
397
398template<>
399std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber> minmax(std::vector<storm::ClnRationalNumber> const& values) {
400 STORM_LOG_ASSERT(!values.empty(), "Expected non-empty values.");
401 storm::ClnRationalNumber min = values.front();
402 storm::ClnRationalNumber max = values.front();
403 for (auto const& vt : values) {
405 max = vt;
406 } else {
407 if (vt < min) {
408 min = vt;
409 }
410 if (vt > max) {
411 max = vt;
412 }
413 }
414 }
415 return std::make_pair(min, max);
416}
417
418template<>
419uint_fast64_t convertNumber(ClnRationalNumber const& number) {
420 return carl::toInt<carl::uint>(number);
421}
422
423template<>
424int_fast64_t convertNumber(ClnRationalNumber const& number) {
425 return carl::toInt<carl::sint>(number);
426}
427
428template<>
429ClnRationalNumber convertNumber(double const& number) {
430 return carl::rationalize<ClnRationalNumber>(number);
431}
432
433template<>
434ClnRationalNumber convertNumber(int const& number) {
435 return carl::rationalize<ClnRationalNumber>(number);
436}
437
438template<>
439ClnRationalNumber convertNumber(NumberTraits<ClnRationalNumber>::IntegerType const& number) {
440 return ClnRationalNumber(number);
441}
442
443template<>
444ClnRationalNumber convertNumber(uint_fast64_t const& number) {
445 STORM_LOG_ASSERT(static_cast<carl::uint>(number) == number, "Rationalizing failed, because the number is too large.");
446 return carl::rationalize<ClnRationalNumber>(static_cast<carl::uint>(number));
447}
448
449template<>
450int64_t convertNumber(NumberTraits<ClnRationalNumber>::IntegerType const& number) {
451 return carl::toInt<carl::sint>(number);
452}
453
454template<>
455typename NumberTraits<ClnRationalNumber>::IntegerType convertNumber(uint_fast64_t const& number) {
456 STORM_LOG_ASSERT(static_cast<unsigned long int>(number) == number, "Conversion failed, because the number is too large.");
457 return NumberTraits<ClnRationalNumber>::IntegerType(static_cast<unsigned long int>(number));
458}
459
460template<>
461typename NumberTraits<ClnRationalNumber>::IntegerType convertNumber(int_fast64_t const& number) {
462 STORM_LOG_ASSERT(static_cast<long int>(number) == number, "Conversion failed, because the number is too large.");
463 return NumberTraits<ClnRationalNumber>::IntegerType(static_cast<long int>(number));
464}
465
466template<>
467typename NumberTraits<ClnRationalNumber>::IntegerType convertNumber(double const& number) {
468 if (number < static_cast<double>(std::numeric_limits<uint64_t>::max())) {
469 return NumberTraits<ClnRationalNumber>::IntegerType(static_cast<uint64_t>(number));
470 } else {
471 return carl::round(carl::rationalize<ClnRationalNumber>(number));
472 }
473}
474
475template<>
476ClnRationalNumber convertNumber(int_fast64_t const& number) {
477 STORM_LOG_ASSERT(static_cast<carl::sint>(number) == number, "Rationalizing failed, because the number is too large.");
478 return carl::rationalize<ClnRationalNumber>(static_cast<carl::sint>(number));
479}
480
481template<>
482double convertNumber(ClnRationalNumber const& number) {
483 return carl::toDouble(number);
484}
485
486template<>
487bool tryParseNumber(std::string const& input, ClnRationalNumber& result) {
488 return carl::try_parse<ClnRationalNumber>(input, result);
489}
490
491template<>
492ClnRationalNumber convertNumber(std::string const& number) {
493 ClnRationalNumber result;
494 if (tryParseNumber(number, result)) {
495 return result;
496 }
497 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Unable to parse '" << number << "' as a rational number.");
498}
499
500template<>
501ClnRationalNumber sqrt(ClnRationalNumber const& number) {
502 return carl::sqrt(number);
503}
504
505template<>
506ClnRationalNumber abs(storm::ClnRationalNumber const& number) {
507 return carl::abs(number);
508}
509
510template<>
511ClnRationalNumber floor(storm::ClnRationalNumber const& number) {
512 return carl::floor(number);
513}
514
515template<>
516ClnRationalNumber ceil(storm::ClnRationalNumber const& number) {
517 return carl::ceil(number);
518}
519
520template<>
521ClnRationalNumber log(ClnRationalNumber const& number) {
522 return carl::log(number);
523}
524
525template<>
526ClnRationalNumber log10(ClnRationalNumber const& number) {
527 return carl::log10(number);
528}
529
530template<>
531ClnRationalNumber cos(ClnRationalNumber const& number) {
532 return carl::cos(number);
533}
534
535template<>
536ClnRationalNumber sin(ClnRationalNumber const& number) {
537 return carl::sin(number);
538}
539
540template<>
541typename NumberTraits<ClnRationalNumber>::IntegerType trunc(ClnRationalNumber const& number) {
542 return cln::truncate1(number);
543}
544
545template<>
546typename NumberTraits<ClnRationalNumber>::IntegerType mod(NumberTraits<ClnRationalNumber>::IntegerType const& first,
547 NumberTraits<ClnRationalNumber>::IntegerType const& second) {
548 return carl::mod(first, second);
549}
550
551template<>
552std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType, typename NumberTraits<ClnRationalNumber>::IntegerType> divide(
553 typename NumberTraits<ClnRationalNumber>::IntegerType const& dividend, typename NumberTraits<ClnRationalNumber>::IntegerType const& divisor) {
554 std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType, typename NumberTraits<ClnRationalNumber>::IntegerType> result;
555 carl::divide(dividend, divisor, result.first, result.second);
556 return result;
557}
558
559template<>
560typename NumberTraits<ClnRationalNumber>::IntegerType gcd(typename NumberTraits<ClnRationalNumber>::IntegerType const& first,
561 typename NumberTraits<ClnRationalNumber>::IntegerType const& second) {
562 return carl::gcd(first, second);
563}
564
565template<>
566typename NumberTraits<ClnRationalNumber>::IntegerType lcm(typename NumberTraits<ClnRationalNumber>::IntegerType const& first,
567 typename NumberTraits<ClnRationalNumber>::IntegerType const& second) {
568 return carl::lcm(first, second);
569}
570
571template<>
572typename NumberTraits<ClnRationalNumber>::IntegerType pow(typename NumberTraits<ClnRationalNumber>::IntegerType const& value, int_fast64_t exponent) {
573 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
574 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
575 return carl::pow(value, exponent);
576}
577
578template<>
579ClnRationalNumber pow(ClnRationalNumber const& value, int_fast64_t exponent) {
580 if (exponent >= 0) {
581 return carl::pow(value, exponent);
582 } else {
583 return storm::utility::one<ClnRationalNumber>() / carl::pow(value, -exponent);
584 }
585}
586
587template<>
588NumberTraits<ClnRationalNumber>::IntegerType numerator(ClnRationalNumber const& number) {
589 return carl::getNum(number);
590}
591
592template<>
593NumberTraits<ClnRationalNumber>::IntegerType denominator(ClnRationalNumber const& number) {
594 return carl::getDenom(number);
595}
596#endif
597
598#if defined(STORM_HAVE_GMP)
599template<>
600storm::GmpRationalNumber infinity() {
602 "storm::utility::infinity<storm::GmpRationalNumber>, which returns the literal 100000000000 rather than an infinity. Hold the value in a "
603 "storm::utility::ExtendedValueType<storm::GmpRationalNumber> instead.");
604 // FIXME: this should be treated more properly.
605 return storm::GmpRationalNumber(100000000000);
606}
607
608template<>
609bool isOne(storm::GmpRationalNumber const& a) {
610 return carl::isOne(a);
611}
612
613template<>
614bool isZero(storm::GmpRationalNumber const& a) {
615 return carl::isZero(a);
616}
617
618template<>
619bool isInteger(storm::GmpRationalNumber const& number) {
620 return carl::isInteger(number);
621}
622
623template<>
624std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber> minmax(std::vector<storm::GmpRationalNumber> const& values) {
625 STORM_LOG_ASSERT(!values.empty(), "Expected non-empty values.");
626 storm::GmpRationalNumber min = values.front();
627 storm::GmpRationalNumber max = values.front();
628 for (auto const& vt : values) {
630 max = vt;
631 } else {
632 if (vt < min) {
633 min = vt;
634 }
635 if (vt > max) {
636 max = vt;
637 }
638 }
639 }
640 return std::make_pair(min, max);
641}
642
643template<>
644std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber> minmax(std::map<uint64_t, storm::GmpRationalNumber> const& values) {
645 STORM_LOG_ASSERT(!values.empty(), "Expected non-empty values.");
646 storm::GmpRationalNumber min = values.begin()->second;
647 storm::GmpRationalNumber max = values.begin()->second;
648 for (auto const& vt : values) {
650 max = vt.second;
651 } else {
652 if (vt.second < min) {
653 min = vt.second;
654 }
655 if (vt.second > max) {
656 max = vt.second;
657 }
658 }
659 }
660 return std::make_pair(min, max);
661}
662
663template<>
664uint_fast64_t convertNumber(GmpRationalNumber const& number) {
665 return carl::toInt<carl::uint>(number);
666}
667
668template<>
669int_fast64_t convertNumber(GmpRationalNumber const& number) {
670 return carl::toInt<carl::sint>(number);
671}
672
673template<>
674GmpRationalNumber convertNumber(double const& number) {
675 return carl::rationalize<GmpRationalNumber>(number);
676}
677
678template<>
679GmpRationalNumber convertNumber(int const& number) {
680 return carl::rationalize<GmpRationalNumber>(number);
681}
682
683template<>
684GmpRationalNumber convertNumber(uint_fast64_t const& number) {
685 STORM_LOG_ASSERT(static_cast<carl::uint>(number) == number, "Rationalizing failed, because the number is too large.");
686 return carl::rationalize<GmpRationalNumber>(static_cast<carl::uint>(number));
687}
688
689template<>
690GmpRationalNumber convertNumber(NumberTraits<GmpRationalNumber>::IntegerType const& number) {
691 return GmpRationalNumber(number);
692}
693
694template<>
695int64_t convertNumber(NumberTraits<GmpRationalNumber>::IntegerType const& number) {
696 return carl::toInt<carl::sint>(number);
697}
698
699template<>
700typename NumberTraits<GmpRationalNumber>::IntegerType convertNumber(uint_fast64_t const& number) {
701 STORM_LOG_ASSERT(static_cast<unsigned long int>(number) == number, "Conversion failed, because the number is too large.");
702 return NumberTraits<GmpRationalNumber>::IntegerType(static_cast<unsigned long int>(number));
703}
704
705template<>
706typename NumberTraits<GmpRationalNumber>::IntegerType convertNumber(int_fast64_t const& number) {
707 STORM_LOG_ASSERT(static_cast<long int>(number) == number, "Conversion failed, because the number is too large.");
708 return NumberTraits<GmpRationalNumber>::IntegerType(static_cast<long int>(number));
709}
710
711template<>
712typename NumberTraits<GmpRationalNumber>::IntegerType convertNumber(double const& number) {
713 return NumberTraits<GmpRationalNumber>::IntegerType(number);
714}
715
716template<>
717GmpRationalNumber convertNumber(int_fast64_t const& number) {
718 STORM_LOG_ASSERT(static_cast<carl::sint>(number) == number, "Rationalizing failed, because the number is too large.");
719 return carl::rationalize<GmpRationalNumber>(static_cast<carl::sint>(number));
720}
721
722template<>
723double convertNumber(GmpRationalNumber const& number) {
724 return carl::toDouble(number);
725}
726
727template<>
728bool tryParseNumber(std::string const& input, GmpRationalNumber& result) {
729 return carl::try_parse<GmpRationalNumber>(input, result);
730}
731
732template<>
733GmpRationalNumber convertNumber(std::string const& number) {
734 GmpRationalNumber result;
735 if (tryParseNumber(number, result)) {
736 return result;
737 }
738 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Unable to parse '" << number << "' as a rational number.");
739}
740
741template<>
742GmpRationalNumber sqrt(GmpRationalNumber const& number) {
743 return carl::sqrt(number);
744}
745
746template<>
747GmpRationalNumber abs(storm::GmpRationalNumber const& number) {
748 return carl::abs(number);
749}
750
751template<>
752GmpRationalNumber floor(storm::GmpRationalNumber const& number) {
753 return carl::floor(number);
754}
755
756template<>
757GmpRationalNumber ceil(storm::GmpRationalNumber const& number) {
758 return carl::ceil(number);
759}
760
761template<>
762GmpRationalNumber log(GmpRationalNumber const& number) {
763 return carl::log(number);
764}
765
766template<>
767GmpRationalNumber log10(GmpRationalNumber const& number) {
768 STORM_LOG_WARN("Using log10 for GMP rational numbers is not exact, it converts to doubles internally! Avoid if possible.");
769 return carl::log10(number);
770}
771
772template<>
773GmpRationalNumber cos(GmpRationalNumber const& number) {
774 return carl::cos(number);
775}
776
777template<>
778GmpRationalNumber sin(GmpRationalNumber const& number) {
779 return carl::sin(number);
780}
781
782template<>
783typename NumberTraits<GmpRationalNumber>::IntegerType trunc(GmpRationalNumber const& number) {
784 return carl::getNum(number) / carl::getDenom(number);
785}
786
787template<>
788typename NumberTraits<GmpRationalNumber>::IntegerType mod(typename NumberTraits<GmpRationalNumber>::IntegerType const& first,
789 typename NumberTraits<GmpRationalNumber>::IntegerType const& second) {
790 return carl::mod(first, second);
791}
792
793template<>
794std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType, typename NumberTraits<GmpRationalNumber>::IntegerType> divide(
795 typename NumberTraits<GmpRationalNumber>::IntegerType const& dividend, typename NumberTraits<GmpRationalNumber>::IntegerType const& divisor) {
796 std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType, typename NumberTraits<GmpRationalNumber>::IntegerType> result;
797 carl::divide(dividend, divisor, result.first, result.second);
798 return result;
799}
800
801template<>
802typename NumberTraits<GmpRationalNumber>::IntegerType gcd(typename NumberTraits<GmpRationalNumber>::IntegerType const& first,
803 typename NumberTraits<GmpRationalNumber>::IntegerType const& second) {
804 return carl::gcd(first, second);
805}
806
807template<>
808typename NumberTraits<GmpRationalNumber>::IntegerType lcm(typename NumberTraits<GmpRationalNumber>::IntegerType const& first,
809 typename NumberTraits<GmpRationalNumber>::IntegerType const& second) {
810 return carl::lcm(first, second);
811}
812
813template<>
814typename NumberTraits<GmpRationalNumber>::IntegerType pow(typename NumberTraits<GmpRationalNumber>::IntegerType const& value, int_fast64_t exponent) {
815 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
816 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
817 return carl::pow(value, exponent);
818}
819
820template<>
821GmpRationalNumber pow(GmpRationalNumber const& value, int_fast64_t exponent) {
822 if (exponent >= 0) {
823 return carl::pow(value, exponent);
824 } else {
825 return storm::utility::one<GmpRationalNumber>() / carl::pow(value, -exponent);
826 }
827}
828
829template<>
830typename NumberTraits<GmpRationalNumber>::IntegerType numerator(GmpRationalNumber const& number) {
831 return carl::getNum(number);
832}
833
834template<>
835typename NumberTraits<GmpRationalNumber>::IntegerType denominator(GmpRationalNumber const& number) {
836 return carl::getDenom(number);
837}
838#endif
839
840#if defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
841template<>
842storm::GmpRationalNumber convertNumber(storm::ClnRationalNumber const& number) {
843 return carl::parse<storm::GmpRationalNumber>(to_string(number));
844}
845
846template<>
847storm::ClnRationalNumber convertNumber(storm::GmpRationalNumber const& number) {
848 return carl::parse<storm::ClnRationalNumber>(to_string(number));
849}
850#endif
851
852template<>
855 "storm::utility::infinity<storm::RationalFunction>, which returns the literal 100000000000 rather than an infinity. Hold the value in a "
856 "storm::utility::ExtendedValueType<storm::RationalFunction> instead.");
857 // FIXME: this should be treated more properly.
859}
860
861template<>
863 return a.isOne();
864}
865
866template<>
867bool isOne(storm::Polynomial const& a) {
868 return a.isOne();
869}
870
871template<>
873 return a.isZero();
874}
875
876template<>
877bool isZero(storm::Polynomial const& a) {
878 return a.isZero();
879}
880
881template<>
883 return a.isConstant();
884}
885
886template<>
888 return a.isConstant();
889}
890
891template<>
892bool isApproxEqual(storm::RationalFunction const& a, storm::RationalFunction const& b, storm::RationalFunction const& precision, bool relative) {
893 STORM_LOG_ASSERT(isZero(precision), "Approx equal on rational functions is only defined for precision zero.");
894 return a == b;
895}
896
897template<>
899 return a.isPointInterval();
900}
901
902template<>
904 return a.isPointInterval();
905}
906
907template<>
909 // FIXME: this should be treated more properly.
911}
912
913template<>
915 return storm::utility::isConstant(func) && storm::utility::isOne(func.denominator());
916}
917
918template<>
919RationalFunction convertNumber(double const& number) {
920 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(number));
921}
922
923template<>
924RationalFunction convertNumber(int_fast64_t const& number) {
925 STORM_LOG_ASSERT(static_cast<carl::sint>(number) == number, "Rationalizing failed, because the number is too large.");
926 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(static_cast<carl::sint>(number)));
927}
928
929#if defined(STORM_HAVE_CLN)
930template<>
931RationalFunction convertNumber(ClnRationalNumber const& number) {
933}
934
935template<>
936ClnRationalNumber convertNumber(RationalFunction const& number) {
937 storm::RationalFunctionCoefficient tmp = number.nominatorAsNumber() / number.denominatorAsNumber();
939}
940#endif
941
942#if defined(STORM_HAVE_GMP)
943template<>
944RationalFunction convertNumber(GmpRationalNumber const& number) {
946}
947
948template<>
949GmpRationalNumber convertNumber(RationalFunction const& number) {
950 return convertNumber<GmpRationalNumber>(number.nominatorAsNumber() / number.denominatorAsNumber());
951}
952#endif
953
954template<>
955carl::uint convertNumber(RationalFunction const& func) {
956 return carl::toInt<carl::uint>(convertNumber<RationalFunctionCoefficient>(func));
957}
958
959template<>
960carl::sint convertNumber(RationalFunction const& func) {
961 return carl::toInt<carl::sint>(convertNumber<RationalFunctionCoefficient>(func));
962}
963
964template<>
965double convertNumber(RationalFunction const& func) {
966 return carl::toDouble(convertNumber<RationalFunctionCoefficient>(func));
967}
968
969template<>
971 return number;
972}
973
974template<>
978
979template<>
983
984template<>
986
987template<>
989
990template<>
992 value.simplify();
993 return value;
994}
995
996template<>
998 value.simplify();
999 return value;
1000}
1001
1002template<>
1004 value.simplify();
1005 return std::move(value);
1006}
1007
1008template<>
1012
1013template<>
1015 return a.isConstant() && isAlmostOne(convertNumber<RationalFunctionCoefficient>(a));
1016}
1017
1018template<>
1022
1023template<>
1025 return a.isConstant() && isPositive(convertNumber<RationalFunctionCoefficient>(a));
1026}
1027
1028template<>
1030 STORM_LOG_ASSERT(a.isConstant(), "Lower bound must be a constant.");
1031 STORM_LOG_ASSERT(c.isConstant(), "Upper bound must be a constant.");
1034}
1035
1036template<>
1037std::pair<storm::RationalFunction, storm::RationalFunction> minmax(std::vector<storm::RationalFunction> const&) {
1038 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Minimum/maximum for rational functions is not defined.");
1039}
1040
1041template<>
1042storm::RationalFunction minimum(std::vector<storm::RationalFunction> const&) {
1043 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Minimum for rational functions is not defined.");
1044}
1045
1046template<>
1047storm::RationalFunction maximum(std::vector<storm::RationalFunction> const&) {
1048 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Maximum for rational functions is not defined.");
1049}
1050
1051template<>
1052std::pair<storm::RationalFunction, storm::RationalFunction> minmax(std::map<uint64_t, storm::RationalFunction> const&) {
1053 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Maximum/maximum for rational functions is not defined.");
1054}
1055
1056template<>
1057storm::RationalFunction minimum(std::map<uint64_t, storm::RationalFunction> const&) {
1058 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Minimum for rational functions is not defined.");
1059}
1060
1061template<>
1062storm::RationalFunction maximum(std::map<uint64_t, storm::RationalFunction> const&) {
1063 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Maximum for rational functions is not defined.");
1064}
1065
1066template<>
1067RationalFunction pow(RationalFunction const& value, int_fast64_t exponent) {
1068 if (exponent >= 0) {
1069 return carl::pow(value, exponent);
1070 } else {
1071 return storm::utility::one<RationalFunction>() / carl::pow(value, -exponent);
1072 }
1073}
1074
1075template<>
1076std::string to_string(RationalFunction const& f) {
1077 std::stringstream ss;
1078 if (f.isConstant()) {
1079 if (f.denominator().isOne()) {
1080 ss << f.nominatorAsNumber();
1081 } else {
1082 ss << f.nominatorAsNumber() << "/" << f.denominatorAsNumber();
1083 }
1084 } else if (f.denominator().isOne()) {
1085 ss << f.nominatorAsPolynomial().coefficient() * f.nominatorAsPolynomial().polynomial();
1086 } else {
1087 ss << "(" << f.nominatorAsPolynomial() << ")/(" << f.denominatorAsPolynomial() << ")";
1088 }
1089 return ss.str();
1090}
1091
1092template<>
1093double convertNumber(std::string const& value) {
1095}
1096
1097template<>
1098storm::Interval convertNumber(double const& number) {
1099 return storm::Interval(number);
1100}
1101
1102template<>
1103storm::Interval convertNumber(uint64_t const& number) {
1104 return storm::Interval(convertNumber<double>(number));
1105}
1106
1107template<>
1111
1112template<>
1116
1117#if defined(STORM_HAVE_GMP)
1118template<>
1119storm::Interval convertNumber(storm::GmpRationalNumber const& n) {
1121}
1122
1123template<>
1124storm::GmpRationalNumber convertNumber(storm::Interval const& number) {
1125 STORM_LOG_ASSERT(number.isPointInterval(), "Interval must be a point interval to convert.");
1126 return convertNumber<storm::GmpRationalNumber>(number.lower());
1127}
1128
1129template<>
1130storm::RationalInterval convertNumber(storm::GmpRationalNumber const& n) {
1132}
1133
1134template<>
1135storm::GmpRationalNumber convertNumber(storm::RationalInterval const& number) {
1136 STORM_LOG_ASSERT(number.isPointInterval(), "Interval must be a point interval to convert.");
1137 return convertNumber<storm::GmpRationalNumber>(number.lower());
1138}
1139#endif
1140
1141#if defined(STORM_HAVE_CLN)
1142template<>
1143storm::Interval convertNumber(storm::ClnRationalNumber const& n) {
1145}
1146
1147template<>
1148storm::ClnRationalNumber convertNumber(storm::Interval const& number) {
1149 STORM_LOG_ASSERT(number.isPointInterval(), "Interval must be a point interval to convert.");
1150 return convertNumber<storm::ClnRationalNumber>(number.lower());
1151}
1152
1153template<>
1154storm::RationalInterval convertNumber(storm::ClnRationalNumber const& n) {
1156}
1157
1158template<>
1159storm::ClnRationalNumber convertNumber(storm::RationalInterval const& number) {
1160 STORM_LOG_ASSERT(number.isPointInterval(), "Interval must be a point interval to convert.");
1161 return convertNumber<storm::ClnRationalNumber>(number.lower());
1162}
1163#endif
1164
1165template<>
1166double convertNumber(storm::Interval const& number) {
1167 STORM_LOG_ASSERT(number.isPointInterval(), "Interval must be a point interval to convert.");
1168 return number.lower();
1169}
1170
1171template<>
1173 STORM_LOG_ASSERT(number.isPointInterval(), "Rational interval must be a point interval to convert.");
1174 return convertNumber<double>(number.lower());
1175}
1176
1177template<>
1182
1183template<>
1188
1189template<>
1191 return interval.abs();
1192}
1193
1194template<>
1195storm::Interval pow(storm::Interval const& value, int_fast64_t exponent) {
1196 if (exponent >= 0) {
1197 return value.pow(exponent);
1198 } else {
1199 return storm::utility::one<storm::Interval>() / value.pow(-exponent);
1200 }
1201}
1202
1203template<>
1204bool isApproxEqual(storm::Interval const& a, storm::Interval const& b, storm::Interval const& precision, bool relative) {
1205 STORM_LOG_ASSERT(precision.isPointInterval(), "Precision must be a point interval.");
1206 return isApproxEqual<double>(a.lower(), b.lower(), precision.center(), relative) &&
1207 isApproxEqual<double>(a.upper(), b.upper(), precision.center(), relative);
1208}
1209
1210template<>
1211bool isApproxEqual(storm::RationalInterval const& a, storm::RationalInterval const& b, storm::RationalInterval const& precision, bool relative) {
1212 STORM_LOG_ASSERT(precision.isPointInterval(), "Precision must be a point interval.");
1213 return isApproxEqual<storm::RationalNumber>(a.lower(), b.lower(), precision.center(), relative) &&
1214 isApproxEqual<storm::RationalNumber>(a.upper(), b.upper(), precision.center(), relative);
1215}
1216
1217template<>
1219 return interval.abs();
1220}
1221
1222template<>
1223storm::RationalInterval pow(storm::RationalInterval const& value, int_fast64_t exponent) {
1224 if (exponent >= 0) {
1225 return value.pow(exponent);
1226 } else {
1227 return storm::utility::one<storm::RationalInterval>() / value.pow(-exponent);
1228 }
1229}
1230
1231// Explicit instantiations.
1232
1233// double
1234template double one();
1235template double zero();
1236template double infinity();
1237template bool isOne(double const& value);
1238template bool isZero(double const& value);
1239template bool isNonNegative(double const& value);
1240template bool isPositive(double const& value);
1241template bool isAlmostZero(double const& value);
1242template bool isAlmostOne(double const& value);
1243template bool isConstant(double const& value);
1244template bool isInfinity(double const& value);
1245template bool isInteger(double const& number);
1246template bool isBetween(double const& a, double const& b, double const& c, bool strict);
1247template bool isApproxEqual(double const& a, double const& b, double const& precision, bool relative);
1248template double simplify(double value);
1249template std::pair<double, double> minmax(std::vector<double> const&);
1250template double minimum(std::vector<double> const&);
1251template double maximum(std::vector<double> const&);
1252template std::pair<double, double> minmax(std::map<uint64_t, double> const&);
1253template double minimum(std::map<uint64_t, double> const&);
1254template double maximum(std::map<uint64_t, double> const&);
1255template double pow(double const& value, int_fast64_t exponent);
1256template double max(double const& first, double const& second);
1257template double min(double const& first, double const& second);
1258template double sqrt(double const& number);
1259template double abs(double const& number);
1260template double floor(double const& number);
1261template double ceil(double const& number);
1262template double round(double const& number);
1263template double log(double const& number);
1264template double log10(double const& number);
1265template double cos(double const& number);
1266template double sin(double const& number);
1267template typename NumberTraits<double>::IntegerType trunc(double const& number);
1268template double mod(double const& first, double const& second);
1269template std::string to_string(double const& value);
1270
1271// int
1272template int one();
1273template int zero();
1274template bool isOne(int const& value);
1275template bool isZero(int const& value);
1276template bool isConstant(int const& value);
1277template bool isInfinity(int const& value);
1278template bool isNonNegative(int const& value);
1279template bool isPositive(int const& value);
1280template bool isApproxEqual(int const& a, int const& b, int const& precision, bool relative);
1281template bool isBetween(int const& a, int const& b, int const& c, bool strict);
1282
1283// uint32_t
1284template uint32_t one();
1285template uint32_t zero();
1286template bool isOne(uint32_t const& value);
1287template bool isZero(uint32_t const& value);
1288template bool isConstant(uint32_t const& value);
1289template bool isNonNegative(uint32_t const& value);
1290template bool isPositive(uint32_t const& value);
1291template bool isInfinity(uint32_t const& value);
1292template bool isBetween(uint32_t const& a, uint32_t const& b, uint32_t const& c, bool strict);
1293
1294// storm::storage::sparse::state_type
1298 storm::storage::sparse::state_type const& precision, bool relative);
1299template bool isOne(storm::storage::sparse::state_type const& value);
1300template bool isZero(storm::storage::sparse::state_type const& value);
1306 bool strict);
1307template uint64_t bitsize(storm::storage::sparse::state_type const& number);
1308
1309// int64_t
1310template int64_t zero();
1311template int64_t one();
1312template int64_t convertNumber(int64_t const&);
1313
1314// other instantiations
1315template unsigned long convertNumber(long const&);
1316template double convertNumber(long const&);
1317
1318#if defined(STORM_HAVE_CLN)
1319// Instantiations for (CLN) rational number.
1320template storm::ClnRationalNumber one();
1322template storm::ClnRationalNumber zero();
1325template bool isConstant(storm::ClnRationalNumber const& value);
1326template bool isPositive(storm::ClnRationalNumber const& value);
1327template bool isNonNegative(storm::ClnRationalNumber const& value);
1328template bool isInfinity(storm::ClnRationalNumber const& value);
1329template bool isNan(storm::ClnRationalNumber const& value);
1330template bool isAlmostZero(storm::ClnRationalNumber const& value);
1331template bool isAlmostOne(storm::ClnRationalNumber const& value);
1332template bool isApproxEqual(storm::ClnRationalNumber const& a, storm::ClnRationalNumber const& b, storm::ClnRationalNumber const& precision, bool relative);
1333template bool isBetween(storm::ClnRationalNumber const& a, storm::ClnRationalNumber const& b, storm::ClnRationalNumber const& c, bool strict);
1335template storm::ClnRationalNumber convertNumber(storm::ClnRationalNumber const& number);
1336template storm::ClnRationalNumber simplify(storm::ClnRationalNumber value);
1337template std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber> minmax(std::map<uint64_t, storm::ClnRationalNumber> const&);
1338template storm::ClnRationalNumber minimum(std::map<uint64_t, storm::ClnRationalNumber> const&);
1339template storm::ClnRationalNumber maximum(std::map<uint64_t, storm::ClnRationalNumber> const&);
1340template storm::ClnRationalNumber minimum(std::vector<storm::ClnRationalNumber> const&);
1341template storm::ClnRationalNumber maximum(std::vector<storm::ClnRationalNumber> const&);
1342template storm::ClnRationalNumber max(storm::ClnRationalNumber const& first, storm::ClnRationalNumber const& second);
1343template storm::ClnRationalNumber min(storm::ClnRationalNumber const& first, storm::ClnRationalNumber const& second);
1344template storm::ClnRationalNumber round(storm::ClnRationalNumber const& number);
1345template std::string to_string(storm::ClnRationalNumber const& value);
1346template uint64_t numDigits(const storm::ClnRationalNumber& number);
1347template uint64_t bitsize(storm::ClnIntegerNumber const& number);
1348#endif
1349
1350#if defined(STORM_HAVE_GMP)
1351// Instantiations for (GMP) rational number.
1352template storm::GmpRationalNumber one();
1354template storm::GmpRationalNumber zero();
1357template bool isConstant(storm::GmpRationalNumber const& value);
1358template bool isPositive(storm::GmpRationalNumber const& value);
1359template bool isNonNegative(storm::GmpRationalNumber const& value);
1360template bool isInfinity(storm::GmpRationalNumber const& value);
1361template bool isNan(storm::GmpRationalNumber const& value);
1362template bool isAlmostZero(storm::GmpRationalNumber const& value);
1363template bool isAlmostOne(storm::GmpRationalNumber const& value);
1364template bool isBetween(storm::GmpRationalNumber const&, storm::GmpRationalNumber const&, storm::GmpRationalNumber const&, bool);
1365template bool isApproxEqual(storm::GmpRationalNumber const& a, storm::GmpRationalNumber const& b, storm::GmpRationalNumber const& precision, bool relative);
1367template storm::GmpRationalNumber convertNumber(storm::GmpRationalNumber const& number);
1368template storm::GmpRationalNumber simplify(storm::GmpRationalNumber value);
1369template storm::GmpRationalNumber minimum(std::map<uint64_t, storm::GmpRationalNumber> const&);
1370template storm::GmpRationalNumber maximum(std::map<uint64_t, storm::GmpRationalNumber> const&);
1371template storm::GmpRationalNumber minimum(std::vector<storm::GmpRationalNumber> const&);
1372template storm::GmpRationalNumber maximum(std::vector<storm::GmpRationalNumber> const&);
1373template storm::GmpRationalNumber max(storm::GmpRationalNumber const& first, storm::GmpRationalNumber const& second);
1374template storm::GmpRationalNumber min(storm::GmpRationalNumber const& first, storm::GmpRationalNumber const& second);
1375template storm::GmpRationalNumber round(storm::GmpRationalNumber const& number);
1376template std::string to_string(storm::GmpRationalNumber const& value);
1377template uint64_t numDigits(const storm::GmpRationalNumber& number);
1378template uint64_t bitsize(storm::GmpIntegerNumber const& number);
1379#endif
1380
1381// Instantiations for rational function.
1382template RationalFunction one();
1383template RationalFunction zero();
1384
1385template bool isNan(RationalFunction const&);
1386
1387// Instantiations for polynomials.
1388template Polynomial one();
1389template Polynomial zero();
1390
1391// Instantiations for intervals.
1392template Interval one();
1393template Interval zero();
1394template bool isOne(Interval const& value);
1395template bool isZero(Interval const& value);
1396template bool isInfinity(Interval const& value);
1397template bool isAlmostZero(Interval const& value);
1398template bool isNonNegative(Interval const& value);
1399template bool isPositive(Interval const& value);
1400template bool isBetween(Interval const&, Interval const&, Interval const& value, bool);
1401template Interval convertNumber(Interval const&);
1402
1403template std::string to_string(storm::Interval const& value);
1404
1405// Instantiations for rational intervals.
1406template RationalInterval one();
1407template RationalInterval zero();
1408template bool isOne(RationalInterval const& value);
1409template bool isZero(RationalInterval const& value);
1410template bool isInfinity(RationalInterval const& value);
1411template bool isAlmostZero(RationalInterval const& value);
1412template bool isNonNegative(RationalInterval const& value);
1413template bool isPositive(RationalInterval const& value);
1414template bool isBetween(RationalInterval const&, RationalInterval const&, RationalInterval const& value, bool);
1416
1417template std::string to_string(storm::RationalInterval const& value);
1418
1419// Instantiations for the value types extended with the infinities.
1420template std::pair<storm::ExtendedRationalNumber, storm::ExtendedRationalNumber> minmax(std::vector<storm::ExtendedRationalNumber> const& values);
1421template storm::ExtendedRationalNumber minimum(std::vector<storm::ExtendedRationalNumber> const& values);
1422template storm::ExtendedRationalNumber maximum(std::vector<storm::ExtendedRationalNumber> const& values);
1423template std::pair<storm::ExtendedRationalNumber, storm::ExtendedRationalNumber> minmax(std::map<uint64_t, storm::ExtendedRationalNumber> const& values);
1424template storm::ExtendedRationalNumber minimum(std::map<uint64_t, storm::ExtendedRationalNumber> const& values);
1425template storm::ExtendedRationalNumber maximum(std::map<uint64_t, storm::ExtendedRationalNumber> const& values);
1426
1427template std::pair<storm::ExtendedRationalFunction, storm::ExtendedRationalFunction> minmax(std::vector<storm::ExtendedRationalFunction> const& values);
1428template storm::ExtendedRationalFunction minimum(std::vector<storm::ExtendedRationalFunction> const& values);
1429template storm::ExtendedRationalFunction maximum(std::vector<storm::ExtendedRationalFunction> const& values);
1430template std::pair<storm::ExtendedRationalFunction, storm::ExtendedRationalFunction> minmax(std::map<uint64_t, storm::ExtendedRationalFunction> const& values);
1431template storm::ExtendedRationalFunction minimum(std::map<uint64_t, storm::ExtendedRationalFunction> const& values);
1432template storm::ExtendedRationalFunction maximum(std::map<uint64_t, storm::ExtendedRationalFunction> const& values);
1433} // namespace utility
1434} // namespace storm
#define STORM_LOG_WARN(message)
Definition logging.h:35
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:9
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:39
#define STORM_LOG_DEPRECATED(message)
Definition macros.h:24
ValueType max(ValueType const &first, ValueType const &second)
bool isPositive(ValueType const &a)
Definition constants.cpp:69
bool isOne(ValueType const &a)
Definition constants.cpp:39
NumberTraits< RationalType >::IntegerType denominator(RationalType const &number)
NumberTraits< RationalType >::IntegerType numerator(RationalType const &number)
bool isConstant(ValueType const &)
ValueType simplify(ValueType value)
bool isBetween(ValueType const &a, ValueType const &b, ValueType const &c, bool strict)
Compare whether a <= b <= c or a < b < c, based on the strictness parameter.
Definition constants.cpp:87
ValueType min(ValueType const &first, ValueType const &second)
ValueType sin(ValueType const &number)
bool isApproxEqual(ValueType const &a, ValueType const &b, ValueType const &precision, bool relative)
Definition constants.cpp:59
bool isAlmostZero(ValueType const &a)
Definition constants.cpp:98
bool isAlmostOne(ValueType const &a)
ValueType floor(ValueType const &number)
IntegerType lcm(IntegerType const &first, IntegerType const &second)
bool isZero(ValueType const &a)
Definition constants.cpp:44
ValueType minimum(std::vector< ValueType > const &values)
ValueType ceil(ValueType const &number)
bool isInteger(ValueType const &number)
ValueType abs(ValueType const &number)
ValueType zero()
Definition constants.cpp:26
ValueType infinity()
Definition constants.cpp:31
IntegerType gcd(IntegerType const &first, IntegerType const &second)
bool isNan(ValueType const &)
Definition constants.cpp:49
std::string to_string(ValueType const &value)
std::pair< ValueType, ValueType > minmax(std::vector< ValueType > const &values)
bool isNonNegative(ValueType const &a)
Definition constants.cpp:74
NumberTraits< ValueType >::IntegerType trunc(ValueType const &number)
std::pair< IntegerType, IntegerType > divide(IntegerType const &dividend, IntegerType const &divisor)
(Integer-)Divides the dividend by the divisor and returns the result plus the remainder.
IntegerType mod(IntegerType const &first, IntegerType const &second)
ValueType pow(ValueType const &value, int_fast64_t exponent)
ValueType one()
Definition constants.cpp:21
ValueType log(ValueType const &number)
ValueType maximum(std::vector< ValueType > const &values)
ValueType cos(ValueType const &number)
ValueType sqrt(ValueType const &number)
uint64_t numDigits(ValueType const &number)
bool isInfinity(ValueType const &a)
uint64_t bitsize(ValueType const &number)
Returns the minimum number of bits to represent the given number.
ValueType log10(ValueType const &number)
ValueType round(ValueType const &number)
bool tryParseNumber(std::string const &input, RationalType &result)
Tries to parse a number from its string representation.
TargetType convertNumber(SourceType const &number)
carl::Interval< storm::RationalNumber > RationalInterval
storm::utility::ExtendedValueType< RationalNumber > ExtendedRationalNumber
The rational number type extended with the two infinities.
carl::Interval< double > Interval
Interval type.
carl::FactorizedPolynomial< RawPolynomial > Polynomial
carl::RationalFunction< Polynomial, true > RationalFunction
typename detail::IntervalMetaProgrammingHelper< ValueType >::BaseType IntervalBaseType
Helper to access the type in which interval boundaries are stored.
storm::utility::ExtendedValueType< RationalFunction > ExtendedRationalFunction
The rational function type extended with the two infinities.