20template<
typename ValueType>
25template<
typename ValueType>
30template<
typename ValueType>
34 static_assert(!std::numeric_limits<ValueType>::is_integer,
"There is no infinity for integral types.");
35 return std::numeric_limits<ValueType>::infinity();
38template<
typename ValueType>
43template<
typename ValueType>
48template<
typename ValueType>
54bool isNan(
double const& value) {
55 return std::isnan(value);
58template<
typename ValueType>
59bool isApproxEqual(ValueType
const& a, ValueType
const& b, ValueType
const& precision,
bool relative) {
62 return absDiff <= precision *
max(
abs(a),
abs(b));
64 return absDiff <= precision;
68template<
typename ValueType>
73template<
typename ValueType>
86template<
typename ValueType>
87bool isBetween(ValueType
const& a, ValueType
const& b, ValueType
const& c,
bool strict) {
91 return a < b && b < c;
93 return a <= b && b <= c;
97template<
typename ValueType>
102template<
typename ValueType>
107template<
typename ValueType>
112template<
typename ValueType>
114 if constexpr (std::numeric_limits<ValueType>::is_integer) {
122template<
typename ValueType>
125 ValueType result = std::modf(number, &iPart);
144template<
typename TargetType,
typename SourceType>
146 return static_cast<TargetType
>(number);
151 return std::llround(number);
156 return std::llround(number);
171 return static_cast<double>(number);
179template<
typename ValueType>
186template<
typename ValueType>
187std::pair<ValueType, ValueType>
minmax(std::vector<ValueType>
const& values) {
189 ValueType
min = values.front();
190 ValueType
max = values.front();
191 for (
auto const& vt : values) {
199 return std::make_pair(
min,
max);
202template<
typename ValueType>
203ValueType
minimum(std::vector<ValueType>
const& values) {
205 ValueType
min = values.front();
206 for (
auto const& vt : values) {
214template<
typename ValueType>
215ValueType
maximum(std::vector<ValueType>
const& values) {
217 ValueType
max = values.front();
218 for (
auto const& vt : values) {
226template<
typename K,
typename ValueType>
227std::pair<ValueType, ValueType>
minmax(std::map<K, ValueType>
const& values) {
229 ValueType
min = values.begin()->second;
230 ValueType
max = values.begin()->second;
231 for (
auto const& vt : values) {
232 if (vt.second <
min) {
235 if (vt.second >
max) {
239 return std::make_pair(
min,
max);
242template<
typename K,
typename ValueType>
243ValueType
minimum(std::map<K, ValueType>
const& values) {
244 return minmax(values).first;
247template<
typename K,
typename ValueType>
248ValueType
maximum(std::map<K, ValueType>
const& values) {
249 return minmax(values).second;
252template<
typename ValueType>
253ValueType
pow(ValueType
const& value, int_fast64_t exponent) {
254 return std::pow(value, exponent);
257template<
typename ValueType>
258ValueType
max(ValueType
const& first, ValueType
const& second) {
259 return std::max(first, second);
262template<
typename ValueType>
263ValueType
min(ValueType
const& first, ValueType
const& second) {
264 return std::min(first, second);
267template<
typename ValueType>
268ValueType
sqrt(ValueType
const& number) {
269 return std::sqrt(number);
272template<
typename ValueType>
273ValueType
abs(ValueType
const& number) {
274 return std::fabs(number);
277template<
typename ValueType>
278ValueType
floor(ValueType
const& number) {
279 return std::floor(number);
282template<
typename ValueType>
283ValueType
ceil(ValueType
const& number) {
284 return std::ceil(number);
287template<
typename ValueType>
288ValueType
round(ValueType
const& number) {
293template<
typename ValueType>
294ValueType
log(ValueType
const& number) {
295 return std::log(number);
298template<
typename ValueType>
299ValueType
log10(ValueType
const& number) {
300 return std::log10(number);
303template<
typename ValueType>
304ValueType
cos(ValueType
const& number) {
305 return std::cos(number);
308template<
typename ValueType>
309ValueType
sin(ValueType
const& number) {
310 return std::sin(number);
313template<
typename ValueType>
325template<
typename ValueType>
327 if constexpr (std::is_same_v<ValueType, uint64_t>) {
328 return std::bit_width(number);
335 return carl::bitsize(number);
340template<
typename ValueType>
345template<
typename IntegerType>
347 return std::fmod(first, second);
350template<
typename IntegerType>
352 return std::make_pair(dividend / divisor,
mod(dividend, divisor));
355template<
typename IntegerType>
357 return std::gcd(first, second);
360template<
typename IntegerType>
362 return std::lcm(first, second);
365template<
typename ValueType>
367 std::stringstream ss;
368 ss.precision(std::numeric_limits<ValueType>::max_digits10 + 2);
373#if defined(STORM_HAVE_CLN)
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.");
380 return storm::ClnRationalNumber(100000000000);
384bool isOne(storm::ClnRationalNumber
const& a) {
385 return carl::isOne(a);
389bool isZero(storm::ClnRationalNumber
const& a) {
390 return carl::isZero(a);
394bool isInteger(storm::ClnRationalNumber
const& number) {
395 return carl::isInteger(number);
399std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::vector<storm::ClnRationalNumber>
const& values) {
401 storm::ClnRationalNumber
min = values.front();
402 storm::ClnRationalNumber
max = values.front();
403 for (
auto const& vt : values) {
415 return std::make_pair(
min,
max);
419uint_fast64_t
convertNumber(ClnRationalNumber
const& number) {
420 return carl::toInt<carl::uint>(number);
425 return carl::toInt<carl::sint>(number);
430 return carl::rationalize<ClnRationalNumber>(number);
435 return carl::rationalize<ClnRationalNumber>(number);
439ClnRationalNumber
convertNumber(NumberTraits<ClnRationalNumber>::IntegerType
const& number) {
440 return ClnRationalNumber(number);
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));
450int64_t
convertNumber(NumberTraits<ClnRationalNumber>::IntegerType
const& number) {
451 return carl::toInt<carl::sint>(number);
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));
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));
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));
471 return carl::round(carl::rationalize<ClnRationalNumber>(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));
483 return carl::toDouble(number);
487bool tryParseNumber(std::string
const& input, ClnRationalNumber& result) {
488 return carl::try_parse<ClnRationalNumber>(input, result);
493 ClnRationalNumber result;
497 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
501ClnRationalNumber
sqrt(ClnRationalNumber
const& number) {
502 return carl::sqrt(number);
506ClnRationalNumber
abs(storm::ClnRationalNumber
const& number) {
507 return carl::abs(number);
511ClnRationalNumber
floor(storm::ClnRationalNumber
const& number) {
512 return carl::floor(number);
516ClnRationalNumber
ceil(storm::ClnRationalNumber
const& number) {
517 return carl::ceil(number);
521ClnRationalNumber
log(ClnRationalNumber
const& number) {
522 return carl::log(number);
526ClnRationalNumber
log10(ClnRationalNumber
const& number) {
527 return carl::log10(number);
531ClnRationalNumber
cos(ClnRationalNumber
const& number) {
532 return carl::cos(number);
536ClnRationalNumber
sin(ClnRationalNumber
const& number) {
537 return carl::sin(number);
541typename NumberTraits<ClnRationalNumber>::IntegerType
trunc(ClnRationalNumber
const& number) {
542 return cln::truncate1(number);
546typename NumberTraits<ClnRationalNumber>::IntegerType
mod(NumberTraits<ClnRationalNumber>::IntegerType
const& first,
547 NumberTraits<ClnRationalNumber>::IntegerType
const& second) {
548 return carl::mod(first, second);
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);
560typename NumberTraits<ClnRationalNumber>::IntegerType
gcd(
typename NumberTraits<ClnRationalNumber>::IntegerType
const& first,
561 typename NumberTraits<ClnRationalNumber>::IntegerType
const& second) {
562 return carl::gcd(first, second);
566typename NumberTraits<ClnRationalNumber>::IntegerType
lcm(
typename NumberTraits<ClnRationalNumber>::IntegerType
const& first,
567 typename NumberTraits<ClnRationalNumber>::IntegerType
const& second) {
568 return carl::lcm(first, second);
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);
579ClnRationalNumber
pow(ClnRationalNumber
const& value, int_fast64_t exponent) {
581 return carl::pow(value, exponent);
588NumberTraits<ClnRationalNumber>::IntegerType
numerator(ClnRationalNumber
const& number) {
589 return carl::getNum(number);
593NumberTraits<ClnRationalNumber>::IntegerType
denominator(ClnRationalNumber
const& number) {
594 return carl::getDenom(number);
598#if defined(STORM_HAVE_GMP)
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.");
605 return storm::GmpRationalNumber(100000000000);
609bool isOne(storm::GmpRationalNumber
const& a) {
610 return carl::isOne(a);
614bool isZero(storm::GmpRationalNumber
const& a) {
615 return carl::isZero(a);
619bool isInteger(storm::GmpRationalNumber
const& number) {
620 return carl::isInteger(number);
624std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::vector<storm::GmpRationalNumber>
const& values) {
626 storm::GmpRationalNumber
min = values.front();
627 storm::GmpRationalNumber
max = values.front();
628 for (
auto const& vt : values) {
640 return std::make_pair(
min,
max);
644std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::map<uint64_t, storm::GmpRationalNumber>
const& values) {
646 storm::GmpRationalNumber
min = values.begin()->second;
647 storm::GmpRationalNumber
max = values.begin()->second;
648 for (
auto const& vt : values) {
652 if (vt.second <
min) {
655 if (vt.second >
max) {
660 return std::make_pair(
min,
max);
664uint_fast64_t
convertNumber(GmpRationalNumber
const& number) {
665 return carl::toInt<carl::uint>(number);
670 return carl::toInt<carl::sint>(number);
675 return carl::rationalize<GmpRationalNumber>(number);
680 return carl::rationalize<GmpRationalNumber>(number);
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));
690GmpRationalNumber
convertNumber(NumberTraits<GmpRationalNumber>::IntegerType
const& number) {
691 return GmpRationalNumber(number);
695int64_t
convertNumber(NumberTraits<GmpRationalNumber>::IntegerType
const& number) {
696 return carl::toInt<carl::sint>(number);
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));
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));
712typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(
double const& number) {
713 return NumberTraits<GmpRationalNumber>::IntegerType(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));
724 return carl::toDouble(number);
728bool tryParseNumber(std::string
const& input, GmpRationalNumber& result) {
729 return carl::try_parse<GmpRationalNumber>(input, result);
734 GmpRationalNumber result;
738 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
742GmpRationalNumber
sqrt(GmpRationalNumber
const& number) {
743 return carl::sqrt(number);
747GmpRationalNumber
abs(storm::GmpRationalNumber
const& number) {
748 return carl::abs(number);
752GmpRationalNumber
floor(storm::GmpRationalNumber
const& number) {
753 return carl::floor(number);
757GmpRationalNumber
ceil(storm::GmpRationalNumber
const& number) {
758 return carl::ceil(number);
762GmpRationalNumber
log(GmpRationalNumber
const& number) {
763 return carl::log(number);
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);
773GmpRationalNumber
cos(GmpRationalNumber
const& number) {
774 return carl::cos(number);
778GmpRationalNumber
sin(GmpRationalNumber
const& number) {
779 return carl::sin(number);
783typename NumberTraits<GmpRationalNumber>::IntegerType
trunc(GmpRationalNumber
const& number) {
784 return carl::getNum(number) / carl::getDenom(number);
788typename NumberTraits<GmpRationalNumber>::IntegerType
mod(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& first,
789 typename NumberTraits<GmpRationalNumber>::IntegerType
const& second) {
790 return carl::mod(first, second);
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);
802typename NumberTraits<GmpRationalNumber>::IntegerType
gcd(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& first,
803 typename NumberTraits<GmpRationalNumber>::IntegerType
const& second) {
804 return carl::gcd(first, second);
808typename NumberTraits<GmpRationalNumber>::IntegerType
lcm(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& first,
809 typename NumberTraits<GmpRationalNumber>::IntegerType
const& second) {
810 return carl::lcm(first, second);
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);
821GmpRationalNumber
pow(GmpRationalNumber
const& value, int_fast64_t exponent) {
823 return carl::pow(value, exponent);
830typename NumberTraits<GmpRationalNumber>::IntegerType
numerator(GmpRationalNumber
const& number) {
831 return carl::getNum(number);
835typename NumberTraits<GmpRationalNumber>::IntegerType
denominator(GmpRationalNumber
const& number) {
836 return carl::getDenom(number);
840#if defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
842storm::GmpRationalNumber
convertNumber(storm::ClnRationalNumber
const& number) {
843 return carl::parse<storm::GmpRationalNumber>(
to_string(number));
847storm::ClnRationalNumber
convertNumber(storm::GmpRationalNumber
const& number) {
848 return carl::parse<storm::ClnRationalNumber>(
to_string(number));
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.");
883 return a.isConstant();
888 return a.isConstant();
893 STORM_LOG_ASSERT(
isZero(precision),
"Approx equal on rational functions is only defined for precision zero.");
899 return a.isPointInterval();
904 return a.isPointInterval();
920 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(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)));
929#if defined(STORM_HAVE_CLN)
937 storm::RationalFunctionCoefficient tmp = number.nominatorAsNumber() / number.denominatorAsNumber();
942#if defined(STORM_HAVE_GMP)
1005 return std::move(value);
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.");
1043 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
1048 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined.");
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.");
1058 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
1063 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined.");
1068 if (exponent >= 0) {
1069 return carl::pow(value, exponent);
1077 std::stringstream ss;
1078 if (f.isConstant()) {
1079 if (f.denominator().isOne()) {
1080 ss << f.nominatorAsNumber();
1082 ss << f.nominatorAsNumber() <<
"/" << f.denominatorAsNumber();
1084 }
else if (f.denominator().isOne()) {
1085 ss << f.nominatorAsPolynomial().coefficient() * f.nominatorAsPolynomial().polynomial();
1087 ss <<
"(" << f.nominatorAsPolynomial() <<
")/(" << f.denominatorAsPolynomial() <<
")";
1117#if defined(STORM_HAVE_GMP)
1125 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert.");
1136 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert.");
1141#if defined(STORM_HAVE_CLN)
1149 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert.");
1160 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert.");
1167 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert.");
1168 return number.lower();
1173 STORM_LOG_ASSERT(number.isPointInterval(),
"Rational interval must be a point interval to convert.");
1191 return interval.abs();
1196 if (exponent >= 0) {
1197 return value.pow(exponent);
1205 STORM_LOG_ASSERT(precision.isPointInterval(),
"Precision must be a point interval.");
1212 STORM_LOG_ASSERT(precision.isPointInterval(),
"Precision must be a point interval.");
1219 return interval.abs();
1224 if (exponent >= 0) {
1225 return value.pow(exponent);
1237template bool isOne(
double const& value);
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);
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);
1268template double mod(
double const& first,
double const& second);
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);
1284template uint32_t
one();
1285template uint32_t
zero();
1286template bool isOne(uint32_t
const& value);
1292template bool isBetween(uint32_t
const& a, uint32_t
const& b, uint32_t
const& c,
bool strict);
1310template int64_t
zero();
1311template int64_t
one();
1318#if defined(STORM_HAVE_CLN)
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);
1350#if defined(STORM_HAVE_GMP)
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);
1420template std::pair<storm::ExtendedRationalNumber, storm::ExtendedRationalNumber>
minmax(std::vector<storm::ExtendedRationalNumber>
const& values);
1423template std::pair<storm::ExtendedRationalNumber, storm::ExtendedRationalNumber>
minmax(std::map<uint64_t, storm::ExtendedRationalNumber>
const& values);
1427template std::pair<storm::ExtendedRationalFunction, storm::ExtendedRationalFunction>
minmax(std::vector<storm::ExtendedRationalFunction>
const& values);
1430template std::pair<storm::ExtendedRationalFunction, storm::ExtendedRationalFunction>
minmax(std::map<uint64_t, storm::ExtendedRationalFunction>
const& values);
#define STORM_LOG_WARN(message)
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
#define STORM_LOG_DEPRECATED(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)
IntegerType lcm(IntegerType const &first, IntegerType const &second)
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)
IntegerType gcd(IntegerType const &first, IntegerType const &second)
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)
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.