17template<
typename ValueType>
22template<
typename ValueType>
27template<
typename ValueType>
29 return std::numeric_limits<ValueType>::infinity();
32template<
typename ValueType>
34 return a == one<ValueType>();
37template<
typename ValueType>
39 return a == zero<ValueType>();
42template<
typename ValueType>
48bool isNan(
double const& value) {
49 return std::isnan(value);
52template<
typename ValueType>
53bool isApproxEqual(ValueType
const& a, ValueType
const& b, ValueType
const& precision,
bool relative) {
54 ValueType
const absDiff = abs<ValueType>(a - b);
56 return absDiff <= precision *
max(
abs(a),
abs(b));
58 return absDiff <= precision;
62template<
typename ValueType>
64 return a > zero<ValueType>();
67template<
typename ValueType>
69 return a >= zero<ValueType>();
80template<
typename ValueType>
81bool isBetween(ValueType
const& a, ValueType
const& b, ValueType
const& c,
bool strict) {
85 return a < b && b < c;
87 return a <= b && b <= c;
91template<
typename ValueType>
93 return a < convertNumber<ValueType>(1e-12) && a > -convertNumber<ValueType>(1e-12);
96template<
typename ValueType>
98 return a < convertNumber<ValueType>(1.0 + 1e-12) && a > convertNumber<ValueType>(1.0 - 1e-12);
101template<
typename ValueType>
106template<
typename ValueType>
108 return a == infinity<ValueType>();
111template<
typename ValueType>
114 ValueType result = std::modf(number, &iPart);
115 return result == zero<ValueType>();
133template<
typename TargetType,
typename SourceType>
135 return static_cast<TargetType
>(number);
140 return std::llround(number);
145 return std::llround(number);
160 return static_cast<double>(number);
168template<
typename ValueType>
175template<
typename ValueType>
176std::pair<ValueType, ValueType>
minmax(std::vector<ValueType>
const& values) {
177 assert(!values.empty());
178 ValueType
min = values.front();
179 ValueType
max = values.front();
180 for (
auto const& vt : values) {
188 return std::make_pair(
min,
max);
191template<
typename ValueType>
192ValueType
minimum(std::vector<ValueType>
const& values) {
193 assert(!values.empty());
194 ValueType
min = values.front();
195 for (
auto const& vt : values) {
203template<
typename ValueType>
204ValueType
maximum(std::vector<ValueType>
const& values) {
205 assert(!values.empty());
206 ValueType
max = values.front();
207 for (
auto const& vt : values) {
215template<
typename K,
typename ValueType>
216std::pair<ValueType, ValueType>
minmax(std::map<K, ValueType>
const& values) {
217 assert(!values.empty());
218 ValueType
min = values.begin()->second;
219 ValueType
max = values.begin()->second;
220 for (
auto const& vt : values) {
221 if (vt.second <
min) {
224 if (vt.second >
max) {
228 return std::make_pair(
min,
max);
231template<
typename K,
typename ValueType>
232ValueType
minimum(std::map<K, ValueType>
const& values) {
233 return minmax(values).first;
236template<
typename K,
typename ValueType>
237ValueType
maximum(std::map<K, ValueType>
const& values) {
238 return minmax(values).second;
241template<
typename ValueType>
242ValueType
pow(ValueType
const& value, int_fast64_t exponent) {
243 return std::pow(value, exponent);
246template<
typename ValueType>
247ValueType
max(ValueType
const& first, ValueType
const& second) {
248 return std::max(first, second);
251template<
typename ValueType>
252ValueType
min(ValueType
const& first, ValueType
const& second) {
253 return std::min(first, second);
256template<
typename ValueType>
257ValueType
sqrt(ValueType
const& number) {
258 return std::sqrt(number);
261template<
typename ValueType>
262ValueType
abs(ValueType
const& number) {
263 return std::fabs(number);
266template<
typename ValueType>
267ValueType
floor(ValueType
const& number) {
268 return std::floor(number);
271template<
typename ValueType>
272ValueType
ceil(ValueType
const& number) {
273 return std::ceil(number);
276template<
typename ValueType>
277ValueType
round(ValueType
const& number) {
279 return floor<ValueType>(number + storm::utility::convertNumber<ValueType>(0.5));
282template<
typename ValueType>
283ValueType
log(ValueType
const& number) {
284 return std::log(number);
287template<
typename ValueType>
288ValueType
log10(ValueType
const& number) {
289 return std::log10(number);
292template<
typename ValueType>
293ValueType
cos(ValueType
const& number) {
294 return std::cos(number);
297template<
typename ValueType>
298ValueType
sin(ValueType
const& number) {
299 return std::sin(number);
302template<
typename ValueType>
305 ValueType remaining = storm::utility::one<ValueType>() / number;
306 ValueType ten = storm::utility::convertNumber<ValueType>(10);
307 while (remaining >= storm::utility::one<ValueType>()) {
309 remaining = storm::utility::floor<ValueType>(remaining / ten);
314template<
typename ValueType>
319template<
typename IntegerType>
320IntegerType
mod(IntegerType
const& first, IntegerType
const& second) {
321 return std::fmod(first, second);
324template<
typename IntegerType>
325std::pair<IntegerType, IntegerType>
divide(IntegerType
const& dividend, IntegerType
const& divisor) {
326 return std::make_pair(dividend / divisor,
mod(dividend, divisor));
329template<
typename ValueType>
331 std::stringstream ss;
332 ss.precision(std::numeric_limits<ValueType>::max_digits10 + 2);
337#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_CLN)
339storm::ClnRationalNumber
infinity() {
341 return storm::ClnRationalNumber(100000000000);
345bool isOne(storm::ClnRationalNumber
const& a) {
346 return carl::isOne(a);
350bool isZero(storm::ClnRationalNumber
const& a) {
351 return carl::isZero(a);
355bool isInteger(storm::ClnRationalNumber
const& number) {
356 return carl::isInteger(number);
360std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::vector<storm::ClnRationalNumber>
const& values) {
361 assert(!values.empty());
362 storm::ClnRationalNumber
min = values.front();
363 storm::ClnRationalNumber
max = values.front();
364 for (
auto const& vt : values) {
365 if (vt == storm::utility::infinity<storm::ClnRationalNumber>()) {
376 return std::make_pair(
min,
max);
380uint_fast64_t
convertNumber(ClnRationalNumber
const& number) {
381 return carl::toInt<carl::uint>(number);
386 return carl::toInt<carl::sint>(number);
391 return carl::rationalize<ClnRationalNumber>(number);
396 return carl::rationalize<ClnRationalNumber>(number);
400ClnRationalNumber
convertNumber(NumberTraits<ClnRationalNumber>::IntegerType
const& number) {
401 return ClnRationalNumber(number);
405ClnRationalNumber
convertNumber(uint_fast64_t
const& number) {
406 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
407 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::uint
>(number));
411typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
412 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
413 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
417typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(
double const& number) {
418 if (number <
static_cast<double>(std::numeric_limits<uint64_t>::max())) {
419 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<uint64_t
>(number));
421 return carl::round(carl::rationalize<ClnRationalNumber>(number));
427 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
428 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::sint
>(number));
433 return carl::toDouble(number);
438 ClnRationalNumber result;
439 if (carl::try_parse<ClnRationalNumber>(number, result)) {
442 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
446std::pair<ClnRationalNumber, ClnRationalNumber>
asFraction(ClnRationalNumber
const& number) {
447 return std::make_pair(carl::getNum(number), carl::getDenom(number));
451ClnRationalNumber
sqrt(ClnRationalNumber
const& number) {
452 return carl::sqrt(number);
456ClnRationalNumber
abs(storm::ClnRationalNumber
const& number) {
457 return carl::abs(number);
461ClnRationalNumber
floor(storm::ClnRationalNumber
const& number) {
462 return carl::floor(number);
466ClnRationalNumber
ceil(storm::ClnRationalNumber
const& number) {
467 return carl::ceil(number);
471ClnRationalNumber
log(ClnRationalNumber
const& number) {
472 return carl::log(number);
476ClnRationalNumber
log10(ClnRationalNumber
const& number) {
477 return carl::log10(number);
481ClnRationalNumber
cos(ClnRationalNumber
const& number) {
482 return carl::cos(number);
486ClnRationalNumber
sin(ClnRationalNumber
const& number) {
487 return carl::sin(number);
491typename NumberTraits<ClnRationalNumber>::IntegerType
trunc(ClnRationalNumber
const& number) {
492 return cln::truncate1(number);
496typename NumberTraits<ClnRationalNumber>::IntegerType
mod(NumberTraits<ClnRationalNumber>::IntegerType
const& first,
497 NumberTraits<ClnRationalNumber>::IntegerType
const& second) {
498 return carl::mod(first, second);
502std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType>
divide(
503 typename NumberTraits<ClnRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<ClnRationalNumber>::IntegerType
const& divisor) {
504 std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType> result;
505 carl::divide(dividend, divisor, result.first, result.second);
510typename NumberTraits<ClnRationalNumber>::IntegerType
pow(
typename NumberTraits<ClnRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
511 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
512 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
513 return carl::pow(value, exponent);
517ClnRationalNumber
pow(ClnRationalNumber
const& value, int_fast64_t exponent) {
519 return carl::pow(value, exponent);
521 return storm::utility::one<ClnRationalNumber>() / carl::pow(value, -exponent);
526NumberTraits<ClnRationalNumber>::IntegerType
numerator(ClnRationalNumber
const& number) {
527 return carl::getNum(number);
531NumberTraits<ClnRationalNumber>::IntegerType
denominator(ClnRationalNumber
const& number) {
532 return carl::getDenom(number);
536#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_GMP)
538storm::GmpRationalNumber
infinity() {
540 return storm::GmpRationalNumber(100000000000);
544bool isOne(storm::GmpRationalNumber
const& a) {
545 return carl::isOne(a);
549bool isZero(storm::GmpRationalNumber
const& a) {
550 return carl::isZero(a);
554bool isInteger(storm::GmpRationalNumber
const& number) {
555 return carl::isInteger(number);
559std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::vector<storm::GmpRationalNumber>
const& values) {
560 assert(!values.empty());
561 storm::GmpRationalNumber
min = values.front();
562 storm::GmpRationalNumber
max = values.front();
563 for (
auto const& vt : values) {
564 if (vt == storm::utility::infinity<storm::GmpRationalNumber>()) {
575 return std::make_pair(
min,
max);
579std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::map<uint64_t, storm::GmpRationalNumber>
const& values) {
580 assert(!values.empty());
581 storm::GmpRationalNumber
min = values.begin()->second;
582 storm::GmpRationalNumber
max = values.begin()->second;
583 for (
auto const& vt : values) {
584 if (vt.second == storm::utility::infinity<storm::GmpRationalNumber>()) {
587 if (vt.second <
min) {
590 if (vt.second >
max) {
595 return std::make_pair(
min,
max);
599uint_fast64_t
convertNumber(GmpRationalNumber
const& number) {
600 return carl::toInt<carl::uint>(number);
605 return carl::toInt<carl::sint>(number);
610 return carl::rationalize<GmpRationalNumber>(number);
615 return carl::rationalize<GmpRationalNumber>(number);
619GmpRationalNumber
convertNumber(uint_fast64_t
const& number) {
620 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
621 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::uint
>(number));
625GmpRationalNumber
convertNumber(NumberTraits<GmpRationalNumber>::IntegerType
const& number) {
626 return GmpRationalNumber(number);
630typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
631 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
632 return NumberTraits<GmpRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
636typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(
double const& number) {
637 return NumberTraits<GmpRationalNumber>::IntegerType(number);
642 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
643 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::sint
>(number));
648 return carl::toDouble(number);
653 GmpRationalNumber result;
654 if (carl::try_parse<GmpRationalNumber>(number, result)) {
657 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
661std::pair<GmpRationalNumber, GmpRationalNumber>
asFraction(GmpRationalNumber
const& number) {
662 return std::make_pair(carl::getNum(number), carl::getDenom(number));
666GmpRationalNumber
sqrt(GmpRationalNumber
const& number) {
667 return carl::sqrt(number);
671GmpRationalNumber
abs(storm::GmpRationalNumber
const& number) {
672 return carl::abs(number);
676GmpRationalNumber
floor(storm::GmpRationalNumber
const& number) {
677 return carl::floor(number);
681GmpRationalNumber
ceil(storm::GmpRationalNumber
const& number) {
682 return carl::ceil(number);
686GmpRationalNumber
log(GmpRationalNumber
const& number) {
687 return carl::log(number);
691GmpRationalNumber
log10(GmpRationalNumber
const& number) {
692 STORM_LOG_WARN(
"Using log10 for GMP rational numbers is not exact, it converts to doubles internally! Avoid if possible.");
693 return carl::log10(number);
697GmpRationalNumber
cos(GmpRationalNumber
const& number) {
698 return carl::cos(number);
702GmpRationalNumber
sin(GmpRationalNumber
const& number) {
703 return carl::sin(number);
707typename NumberTraits<GmpRationalNumber>::IntegerType
trunc(GmpRationalNumber
const& number) {
708 return carl::getNum(number) / carl::getDenom(number);
712typename NumberTraits<GmpRationalNumber>::IntegerType
mod(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& first,
713 typename NumberTraits<GmpRationalNumber>::IntegerType
const& second) {
714 return carl::mod(first, second);
718std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType>
divide(
719 typename NumberTraits<GmpRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<GmpRationalNumber>::IntegerType
const& divisor) {
720 std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType> result;
721 carl::divide(dividend, divisor, result.first, result.second);
726typename NumberTraits<GmpRationalNumber>::IntegerType
pow(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
727 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
728 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
729 return carl::pow(value, exponent);
733GmpRationalNumber
pow(GmpRationalNumber
const& value, int_fast64_t exponent) {
735 return carl::pow(value, exponent);
737 return storm::utility::one<GmpRationalNumber>() / carl::pow(value, -exponent);
742typename NumberTraits<GmpRationalNumber>::IntegerType
numerator(GmpRationalNumber
const& number) {
743 return carl::getNum(number);
747typename NumberTraits<GmpRationalNumber>::IntegerType
denominator(GmpRationalNumber
const& number) {
748 return carl::getDenom(number);
752#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
754storm::GmpRationalNumber
convertNumber(storm::ClnRationalNumber
const& number) {
755 return carl::parse<storm::GmpRationalNumber>(
to_string(number));
759storm::ClnRationalNumber
convertNumber(storm::GmpRationalNumber
const& number) {
760 return carl::parse<storm::ClnRationalNumber>(
to_string(number));
792 return a.isConstant();
797 return a.isConstant();
802 STORM_LOG_ASSERT(
isZero(precision),
"Approx equal on rational functions is only defined for precision zero");
808 return a.isPointInterval();
814 return a == infinity<storm::RationalFunction>();
824 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(number));
829 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
830 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(
static_cast<carl::sint
>(number)));
833#if defined(STORM_HAVE_CLN)
836 return RationalFunction(convertNumber<storm::RationalFunctionCoefficient>(number));
841 storm::RationalFunctionCoefficient tmp = number.nominatorAsNumber() / number.denominatorAsNumber();
842 return convertNumber<ClnRationalNumber>(tmp);
846#if defined(STORM_HAVE_GMP)
849 return RationalFunction(convertNumber<storm::RationalFunctionCoefficient>(number));
854 return convertNumber<GmpRationalNumber>(number.nominatorAsNumber() / number.denominatorAsNumber());
860 return carl::toInt<carl::uint>(convertNumber<RationalFunctionCoefficient>(func));
865 return carl::toInt<carl::sint>(convertNumber<RationalFunctionCoefficient>(func));
870 return carl::toDouble(convertNumber<RationalFunctionCoefficient>(func));
880 return RationalFunction(convertNumber<RationalFunctionCoefficient>(number));
885 return RationalFunction(convertNumber<RationalFunctionCoefficient>(number));
909 return std::move(value);
914 return a.isConstant() &&
isAlmostZero(convertNumber<RationalFunctionCoefficient>(a));
919 return a.isConstant() &&
isAlmostOne(convertNumber<RationalFunctionCoefficient>(a));
924 return a.isConstant() &&
isNonNegative(convertNumber<RationalFunctionCoefficient>(a));
929 return a.isConstant() &&
isPositive(convertNumber<RationalFunctionCoefficient>(a));
936 return b.isConstant() &&
isBetween(convertNumber<RationalFunctionCoefficient>(a), convertNumber<RationalFunctionCoefficient>(b),
937 convertNumber<RationalFunctionCoefficient>(c), strict);
941std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::vector<storm::RationalFunction>
const&) {
942 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum/maximum for rational functions is not defined.");
947 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
952 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined.");
956std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::map<uint64_t, storm::RationalFunction>
const&) {
957 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum/maximum for rational functions is not defined.");
962 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
967 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined");
973 return carl::pow(value, exponent);
975 return storm::utility::one<RationalFunction>() / carl::pow(value, -exponent);
981 std::stringstream ss;
982 if (f.isConstant()) {
983 if (f.denominator().isOne()) {
984 ss << f.nominatorAsNumber();
986 ss << f.nominatorAsNumber() <<
"/" << f.denominatorAsNumber();
988 }
else if (f.denominator().isOne()) {
989 ss << f.nominatorAsPolynomial().coefficient() * f.nominatorAsPolynomial().polynomial();
991 ss <<
"(" << f.nominatorAsPolynomial() <<
")/(" << f.denominatorAsPolynomial() <<
")";
998 return convertNumber<double>(convertNumber<storm::RationalNumber>(value));
1011#if defined(STORM_HAVE_GMP)
1019 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
1020 return convertNumber<storm::GmpRationalNumber>(number.lower());
1024#if defined(STORM_HAVE_CLN)
1032 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
1033 return convertNumber<storm::ClnRationalNumber>(number.lower());
1039 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
1040 return number.lower();
1045 return interval.abs();
1050 STORM_LOG_ASSERT(precision.isPointInterval(),
"Precision must be a point interval");
1051 return isApproxEqual<double>(a.lower(), b.lower(), precision.center(), relative) &&
1052 isApproxEqual<double>(a.upper(), b.upper(), precision.center(), relative);
1061template bool isOne(
double const& value);
1070template bool isBetween(
double const& a,
double const& b,
double const& c,
bool strict);
1071template bool isApproxEqual(
double const& a,
double const& b,
double const& precision,
bool relative);
1073template std::pair<double, double>
minmax(std::vector<double>
const&);
1074template double minimum(std::vector<double>
const&);
1075template double maximum(std::vector<double>
const&);
1076template std::pair<double, double>
minmax(std::map<uint64_t, double>
const&);
1077template double minimum(std::map<uint64_t, double>
const&);
1078template double maximum(std::map<uint64_t, double>
const&);
1079template double pow(
double const& value, int_fast64_t exponent);
1080template double max(
double const& first,
double const& second);
1081template double min(
double const& first,
double const& second);
1082template double sqrt(
double const& number);
1083template double abs(
double const& number);
1084template double floor(
double const& number);
1085template double ceil(
double const& number);
1086template double round(
double const& number);
1087template double log(
double const& number);
1088template double log10(
double const& number);
1089template double cos(
double const& number);
1090template double sin(
double const& number);
1092template double mod(
double const& first,
double const& second);
1105template bool isApproxEqual(
int const& a,
int const& b,
int const& precision,
bool relative);
1106template bool isBetween(
int const& a,
int const& b,
int const& c,
bool strict);
1109template uint32_t
one();
1110template uint32_t
zero();
1112template bool isOne(uint32_t
const& value);
1118template bool isBetween(uint32_t
const& a, uint32_t
const& b, uint32_t
const& c,
bool strict);
1139#if defined(STORM_HAVE_CLN)
1141template storm::ClnRationalNumber
one();
1143template storm::ClnRationalNumber
zero();
1145template bool isConstant(storm::ClnRationalNumber
const& value);
1146template bool isPositive(storm::ClnRationalNumber
const& value);
1147template bool isNonNegative(storm::ClnRationalNumber
const& value);
1148template bool isInfinity(storm::ClnRationalNumber
const& value);
1149template bool isNan(storm::ClnRationalNumber
const& value);
1150template bool isAlmostZero(storm::ClnRationalNumber
const& value);
1151template bool isAlmostOne(storm::ClnRationalNumber
const& value);
1152template bool isApproxEqual(storm::ClnRationalNumber
const& a, storm::ClnRationalNumber
const& b, storm::ClnRationalNumber
const& precision,
bool relative);
1153template bool isBetween(storm::ClnRationalNumber
const& a, storm::ClnRationalNumber
const& b, storm::ClnRationalNumber
const& c,
bool strict);
1155template storm::ClnRationalNumber
convertNumber(storm::ClnRationalNumber
const& number);
1156template storm::ClnRationalNumber
simplify(storm::ClnRationalNumber value);
1157template std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1158template storm::ClnRationalNumber
minimum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1159template storm::ClnRationalNumber
maximum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1160template storm::ClnRationalNumber
minimum(std::vector<storm::ClnRationalNumber>
const&);
1161template storm::ClnRationalNumber
maximum(std::vector<storm::ClnRationalNumber>
const&);
1162template storm::ClnRationalNumber
max(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1163template storm::ClnRationalNumber
min(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1164template storm::ClnRationalNumber
round(storm::ClnRationalNumber
const& number);
1165template std::string
to_string(storm::ClnRationalNumber
const& value);
1166template uint64_t
numDigits(
const storm::ClnRationalNumber& number);
1169#if defined(STORM_HAVE_GMP)
1171template storm::GmpRationalNumber
one();
1173template storm::GmpRationalNumber
zero();
1175template bool isConstant(storm::GmpRationalNumber
const& value);
1176template bool isPositive(storm::GmpRationalNumber
const& value);
1177template bool isNonNegative(storm::GmpRationalNumber
const& value);
1178template bool isInfinity(storm::GmpRationalNumber
const& value);
1179template bool isNan(storm::GmpRationalNumber
const& value);
1180template bool isAlmostZero(storm::GmpRationalNumber
const& value);
1181template bool isAlmostOne(storm::GmpRationalNumber
const& value);
1182template bool isBetween(storm::GmpRationalNumber
const&, storm::GmpRationalNumber
const&, storm::GmpRationalNumber
const&,
bool);
1183template bool isApproxEqual(storm::GmpRationalNumber
const& a, storm::GmpRationalNumber
const& b, storm::GmpRationalNumber
const& precision,
bool relative);
1185template storm::GmpRationalNumber
convertNumber(storm::GmpRationalNumber
const& number);
1186template storm::GmpRationalNumber
simplify(storm::GmpRationalNumber value);
1187template storm::GmpRationalNumber
minimum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1188template storm::GmpRationalNumber
maximum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1189template storm::GmpRationalNumber
minimum(std::vector<storm::GmpRationalNumber>
const&);
1190template storm::GmpRationalNumber
maximum(std::vector<storm::GmpRationalNumber>
const&);
1191template storm::GmpRationalNumber
max(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1192template storm::GmpRationalNumber
min(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1193template storm::GmpRationalNumber
round(storm::GmpRationalNumber
const& number);
1194template std::string
to_string(storm::GmpRationalNumber
const& value);
1195template uint64_t
numDigits(
const storm::GmpRationalNumber& number);
#define STORM_LOG_WARN(message)
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
ValueType max(ValueType const &first, ValueType const &second)
bool isPositive(ValueType const &a)
bool isOne(ValueType const &a)
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.
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)
bool isAlmostZero(ValueType const &a)
bool isAlmostOne(ValueType const &a)
ValueType floor(ValueType const &number)
std::pair< ValueType, ValueType > asFraction(ValueType const &number)
bool isZero(ValueType const &a)
ValueType minimum(std::vector< ValueType > const &values)
ValueType ceil(ValueType const &number)
bool isInteger(ValueType const &number)
ValueType abs(ValueType const &number)
bool isNan(ValueType const &)
std::string to_string(ValueType const &value)
std::pair< ValueType, ValueType > minmax(std::vector< ValueType > const &values)
bool isNonNegative(ValueType const &a)
NumberTraits< ValueType >::IntegerType trunc(ValueType const &number)
std::pair< IntegerType, IntegerType > divide(IntegerType const ÷nd, 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 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)
ValueType log10(ValueType const &number)
ValueType round(ValueType const &number)
TargetType convertNumber(SourceType const &number)
carl::Interval< double > Interval
Interval type.
carl::RationalFunction< Polynomial, true > RationalFunction