18template<
typename ValueType>
23template<
typename ValueType>
28template<
typename ValueType>
32 static_assert(!std::numeric_limits<ValueType>::is_integer,
"There is no infinity for integral types.");
33 return std::numeric_limits<ValueType>::infinity();
36template<
typename ValueType>
41template<
typename ValueType>
46template<
typename ValueType>
52bool isNan(
double const& value) {
53 return std::isnan(value);
56template<
typename ValueType>
57bool isApproxEqual(ValueType
const& a, ValueType
const& b, ValueType
const& precision,
bool relative) {
60 return absDiff <= precision *
max(
abs(a),
abs(b));
62 return absDiff <= precision;
66template<
typename ValueType>
71template<
typename ValueType>
84template<
typename ValueType>
85bool isBetween(ValueType
const& a, ValueType
const& b, ValueType
const& c,
bool strict) {
89 return a < b && b < c;
91 return a <= b && b <= c;
95template<
typename ValueType>
100template<
typename ValueType>
105template<
typename ValueType>
110template<
typename ValueType>
112 if constexpr (std::numeric_limits<ValueType>::is_integer) {
120template<
typename ValueType>
123 ValueType result = std::modf(number, &iPart);
142template<
typename TargetType,
typename SourceType>
144 return static_cast<TargetType
>(number);
149 return std::llround(number);
154 return std::llround(number);
169 return static_cast<double>(number);
177template<
typename ValueType>
184template<
typename ValueType>
185std::pair<ValueType, ValueType>
minmax(std::vector<ValueType>
const& values) {
187 ValueType
min = values.front();
188 ValueType
max = values.front();
189 for (
auto const& vt : values) {
197 return std::make_pair(
min,
max);
200template<
typename ValueType>
201ValueType
minimum(std::vector<ValueType>
const& values) {
203 ValueType
min = values.front();
204 for (
auto const& vt : values) {
212template<
typename ValueType>
213ValueType
maximum(std::vector<ValueType>
const& values) {
215 ValueType
max = values.front();
216 for (
auto const& vt : values) {
224template<
typename K,
typename ValueType>
225std::pair<ValueType, ValueType>
minmax(std::map<K, ValueType>
const& values) {
227 ValueType
min = values.begin()->second;
228 ValueType
max = values.begin()->second;
229 for (
auto const& vt : values) {
230 if (vt.second <
min) {
233 if (vt.second >
max) {
237 return std::make_pair(
min,
max);
240template<
typename K,
typename ValueType>
241ValueType
minimum(std::map<K, ValueType>
const& values) {
242 return minmax(values).first;
245template<
typename K,
typename ValueType>
246ValueType
maximum(std::map<K, ValueType>
const& values) {
247 return minmax(values).second;
250template<
typename ValueType>
251ValueType
pow(ValueType
const& value, int_fast64_t exponent) {
252 return std::pow(value, exponent);
255template<
typename ValueType>
256ValueType
max(ValueType
const& first, ValueType
const& second) {
257 return std::max(first, second);
260template<
typename ValueType>
261ValueType
min(ValueType
const& first, ValueType
const& second) {
262 return std::min(first, second);
265template<
typename ValueType>
266ValueType
sqrt(ValueType
const& number) {
267 return std::sqrt(number);
270template<
typename ValueType>
271ValueType
abs(ValueType
const& number) {
272 return std::fabs(number);
275template<
typename ValueType>
276ValueType
floor(ValueType
const& number) {
277 return std::floor(number);
280template<
typename ValueType>
281ValueType
ceil(ValueType
const& number) {
282 return std::ceil(number);
285template<
typename ValueType>
286ValueType
round(ValueType
const& number) {
291template<
typename ValueType>
292ValueType
log(ValueType
const& number) {
293 return std::log(number);
296template<
typename ValueType>
297ValueType
log10(ValueType
const& number) {
298 return std::log10(number);
301template<
typename ValueType>
302ValueType
cos(ValueType
const& number) {
303 return std::cos(number);
306template<
typename ValueType>
307ValueType
sin(ValueType
const& number) {
308 return std::sin(number);
311template<
typename ValueType>
323template<
typename ValueType>
325 if constexpr (std::is_same_v<ValueType, uint64_t>) {
326 return std::bit_width(number);
333 return carl::bitsize(number);
338template<
typename ValueType>
343template<
typename IntegerType>
345 return std::fmod(first, second);
348template<
typename IntegerType>
350 return std::make_pair(dividend / divisor,
mod(dividend, divisor));
353template<
typename ValueType>
355 std::stringstream ss;
356 ss.precision(std::numeric_limits<ValueType>::max_digits10 + 2);
361#if defined(STORM_HAVE_CLN)
363storm::ClnRationalNumber
infinity() {
365 return storm::ClnRationalNumber(100000000000);
369bool isOne(storm::ClnRationalNumber
const& a) {
370 return carl::isOne(a);
374bool isZero(storm::ClnRationalNumber
const& a) {
375 return carl::isZero(a);
379bool isInteger(storm::ClnRationalNumber
const& number) {
380 return carl::isInteger(number);
384std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::vector<storm::ClnRationalNumber>
const& values) {
386 storm::ClnRationalNumber
min = values.front();
387 storm::ClnRationalNumber
max = values.front();
388 for (
auto const& vt : values) {
400 return std::make_pair(
min,
max);
404uint_fast64_t
convertNumber(ClnRationalNumber
const& number) {
405 return carl::toInt<carl::uint>(number);
410 return carl::toInt<carl::sint>(number);
415 return carl::rationalize<ClnRationalNumber>(number);
420 return carl::rationalize<ClnRationalNumber>(number);
424ClnRationalNumber
convertNumber(NumberTraits<ClnRationalNumber>::IntegerType
const& number) {
425 return ClnRationalNumber(number);
429ClnRationalNumber
convertNumber(uint_fast64_t
const& number) {
430 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
431 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::uint
>(number));
435int64_t
convertNumber(NumberTraits<ClnRationalNumber>::IntegerType
const& number) {
436 return carl::toInt<carl::sint>(number);
440typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
441 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
442 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
446typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(int_fast64_t
const& number) {
447 STORM_LOG_ASSERT(
static_cast<long int>(number) == number,
"Conversion failed, because the number is too large.");
448 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<long int>(number));
452typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(
double const& number) {
453 if (number <
static_cast<double>(std::numeric_limits<uint64_t>::max())) {
454 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<uint64_t
>(number));
456 return carl::round(carl::rationalize<ClnRationalNumber>(number));
462 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
463 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::sint
>(number));
468 return carl::toDouble(number);
473 ClnRationalNumber result;
474 if (carl::try_parse<ClnRationalNumber>(number, result)) {
477 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
481std::pair<ClnRationalNumber, ClnRationalNumber>
asFraction(ClnRationalNumber
const& number) {
482 return std::make_pair(carl::getNum(number), carl::getDenom(number));
486ClnRationalNumber
sqrt(ClnRationalNumber
const& number) {
487 return carl::sqrt(number);
491ClnRationalNumber
abs(storm::ClnRationalNumber
const& number) {
492 return carl::abs(number);
496ClnRationalNumber
floor(storm::ClnRationalNumber
const& number) {
497 return carl::floor(number);
501ClnRationalNumber
ceil(storm::ClnRationalNumber
const& number) {
502 return carl::ceil(number);
506ClnRationalNumber
log(ClnRationalNumber
const& number) {
507 return carl::log(number);
511ClnRationalNumber
log10(ClnRationalNumber
const& number) {
512 return carl::log10(number);
516ClnRationalNumber
cos(ClnRationalNumber
const& number) {
517 return carl::cos(number);
521ClnRationalNumber
sin(ClnRationalNumber
const& number) {
522 return carl::sin(number);
526typename NumberTraits<ClnRationalNumber>::IntegerType
trunc(ClnRationalNumber
const& number) {
527 return cln::truncate1(number);
531typename NumberTraits<ClnRationalNumber>::IntegerType
mod(NumberTraits<ClnRationalNumber>::IntegerType
const& first,
532 NumberTraits<ClnRationalNumber>::IntegerType
const& second) {
533 return carl::mod(first, second);
537std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType>
divide(
538 typename NumberTraits<ClnRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<ClnRationalNumber>::IntegerType
const& divisor) {
539 std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType> result;
540 carl::divide(dividend, divisor, result.first, result.second);
545typename NumberTraits<ClnRationalNumber>::IntegerType
pow(
typename NumberTraits<ClnRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
546 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
547 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
548 return carl::pow(value, exponent);
552ClnRationalNumber
pow(ClnRationalNumber
const& value, int_fast64_t exponent) {
554 return carl::pow(value, exponent);
561NumberTraits<ClnRationalNumber>::IntegerType
numerator(ClnRationalNumber
const& number) {
562 return carl::getNum(number);
566NumberTraits<ClnRationalNumber>::IntegerType
denominator(ClnRationalNumber
const& number) {
567 return carl::getDenom(number);
571#if defined(STORM_HAVE_GMP)
573storm::GmpRationalNumber
infinity() {
575 return storm::GmpRationalNumber(100000000000);
579bool isOne(storm::GmpRationalNumber
const& a) {
580 return carl::isOne(a);
584bool isZero(storm::GmpRationalNumber
const& a) {
585 return carl::isZero(a);
589bool isInteger(storm::GmpRationalNumber
const& number) {
590 return carl::isInteger(number);
594std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::vector<storm::GmpRationalNumber>
const& values) {
596 storm::GmpRationalNumber
min = values.front();
597 storm::GmpRationalNumber
max = values.front();
598 for (
auto const& vt : values) {
610 return std::make_pair(
min,
max);
614std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::map<uint64_t, storm::GmpRationalNumber>
const& values) {
616 storm::GmpRationalNumber
min = values.begin()->second;
617 storm::GmpRationalNumber
max = values.begin()->second;
618 for (
auto const& vt : values) {
622 if (vt.second <
min) {
625 if (vt.second >
max) {
630 return std::make_pair(
min,
max);
634uint_fast64_t
convertNumber(GmpRationalNumber
const& number) {
635 return carl::toInt<carl::uint>(number);
640 return carl::toInt<carl::sint>(number);
645 return carl::rationalize<GmpRationalNumber>(number);
650 return carl::rationalize<GmpRationalNumber>(number);
654GmpRationalNumber
convertNumber(uint_fast64_t
const& number) {
655 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
656 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::uint
>(number));
660GmpRationalNumber
convertNumber(NumberTraits<GmpRationalNumber>::IntegerType
const& number) {
661 return GmpRationalNumber(number);
665int64_t
convertNumber(NumberTraits<GmpRationalNumber>::IntegerType
const& number) {
666 return carl::toInt<carl::sint>(number);
670typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
671 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
672 return NumberTraits<GmpRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
676typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(int_fast64_t
const& number) {
677 STORM_LOG_ASSERT(
static_cast<long int>(number) == number,
"Conversion failed, because the number is too large.");
678 return NumberTraits<GmpRationalNumber>::IntegerType(
static_cast<long int>(number));
682typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(
double const& number) {
683 return NumberTraits<GmpRationalNumber>::IntegerType(number);
688 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
689 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::sint
>(number));
694 return carl::toDouble(number);
699 GmpRationalNumber result;
700 if (carl::try_parse<GmpRationalNumber>(number, result)) {
703 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
707std::pair<GmpRationalNumber, GmpRationalNumber>
asFraction(GmpRationalNumber
const& number) {
708 return std::make_pair(carl::getNum(number), carl::getDenom(number));
712GmpRationalNumber
sqrt(GmpRationalNumber
const& number) {
713 return carl::sqrt(number);
717GmpRationalNumber
abs(storm::GmpRationalNumber
const& number) {
718 return carl::abs(number);
722GmpRationalNumber
floor(storm::GmpRationalNumber
const& number) {
723 return carl::floor(number);
727GmpRationalNumber
ceil(storm::GmpRationalNumber
const& number) {
728 return carl::ceil(number);
732GmpRationalNumber
log(GmpRationalNumber
const& number) {
733 return carl::log(number);
737GmpRationalNumber
log10(GmpRationalNumber
const& number) {
738 STORM_LOG_WARN(
"Using log10 for GMP rational numbers is not exact, it converts to doubles internally! Avoid if possible.");
739 return carl::log10(number);
743GmpRationalNumber
cos(GmpRationalNumber
const& number) {
744 return carl::cos(number);
748GmpRationalNumber
sin(GmpRationalNumber
const& number) {
749 return carl::sin(number);
753typename NumberTraits<GmpRationalNumber>::IntegerType
trunc(GmpRationalNumber
const& number) {
754 return carl::getNum(number) / carl::getDenom(number);
758typename NumberTraits<GmpRationalNumber>::IntegerType
mod(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& first,
759 typename NumberTraits<GmpRationalNumber>::IntegerType
const& second) {
760 return carl::mod(first, second);
764std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType>
divide(
765 typename NumberTraits<GmpRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<GmpRationalNumber>::IntegerType
const& divisor) {
766 std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType> result;
767 carl::divide(dividend, divisor, result.first, result.second);
772typename NumberTraits<GmpRationalNumber>::IntegerType
pow(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
773 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
774 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
775 return carl::pow(value, exponent);
779GmpRationalNumber
pow(GmpRationalNumber
const& value, int_fast64_t exponent) {
781 return carl::pow(value, exponent);
788typename NumberTraits<GmpRationalNumber>::IntegerType
numerator(GmpRationalNumber
const& number) {
789 return carl::getNum(number);
793typename NumberTraits<GmpRationalNumber>::IntegerType
denominator(GmpRationalNumber
const& number) {
794 return carl::getDenom(number);
798#if defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
800storm::GmpRationalNumber
convertNumber(storm::ClnRationalNumber
const& number) {
801 return carl::parse<storm::GmpRationalNumber>(
to_string(number));
805storm::ClnRationalNumber
convertNumber(storm::GmpRationalNumber
const& number) {
806 return carl::parse<storm::ClnRationalNumber>(
to_string(number));
838 return a.isConstant();
843 return a.isConstant();
848 STORM_LOG_ASSERT(
isZero(precision),
"Approx equal on rational functions is only defined for precision zero.");
854 return a.isPointInterval();
859 return a.isPointInterval();
875 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(number));
880 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
881 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(
static_cast<carl::sint
>(number)));
884#if defined(STORM_HAVE_CLN)
892 storm::RationalFunctionCoefficient tmp = number.nominatorAsNumber() / number.denominatorAsNumber();
897#if defined(STORM_HAVE_GMP)
960 return std::move(value);
992std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::vector<storm::RationalFunction>
const&) {
993 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum/maximum for rational functions is not defined.");
998 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
1003 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined.");
1007std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::map<uint64_t, storm::RationalFunction>
const&) {
1008 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum/maximum for rational functions is not defined.");
1013 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
1018 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined.");
1023 if (exponent >= 0) {
1024 return carl::pow(value, exponent);
1032 std::stringstream ss;
1033 if (f.isConstant()) {
1034 if (f.denominator().isOne()) {
1035 ss << f.nominatorAsNumber();
1037 ss << f.nominatorAsNumber() <<
"/" << f.denominatorAsNumber();
1039 }
else if (f.denominator().isOne()) {
1040 ss << f.nominatorAsPolynomial().coefficient() * f.nominatorAsPolynomial().polynomial();
1042 ss <<
"(" << f.nominatorAsPolynomial() <<
")/(" << f.denominatorAsPolynomial() <<
")";
1072#if defined(STORM_HAVE_GMP)
1080 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert.");
1091 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert.");
1096#if defined(STORM_HAVE_CLN)
1104 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert.");
1115 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert.");
1122 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert.");
1123 return number.lower();
1128 STORM_LOG_ASSERT(number.isPointInterval(),
"Rational interval must be a point interval to convert.");
1146 return interval.abs();
1151 STORM_LOG_ASSERT(precision.isPointInterval(),
"Precision must be a point interval.");
1158 STORM_LOG_ASSERT(precision.isPointInterval(),
"Precision must be a point interval.");
1165 return interval.abs();
1174template bool isOne(
double const& value);
1183template bool isBetween(
double const& a,
double const& b,
double const& c,
bool strict);
1184template bool isApproxEqual(
double const& a,
double const& b,
double const& precision,
bool relative);
1186template std::pair<double, double>
minmax(std::vector<double>
const&);
1187template double minimum(std::vector<double>
const&);
1188template double maximum(std::vector<double>
const&);
1189template std::pair<double, double>
minmax(std::map<uint64_t, double>
const&);
1190template double minimum(std::map<uint64_t, double>
const&);
1191template double maximum(std::map<uint64_t, double>
const&);
1192template double pow(
double const& value, int_fast64_t exponent);
1193template double max(
double const& first,
double const& second);
1194template double min(
double const& first,
double const& second);
1195template double sqrt(
double const& number);
1196template double abs(
double const& number);
1197template double floor(
double const& number);
1198template double ceil(
double const& number);
1199template double round(
double const& number);
1200template double log(
double const& number);
1201template double log10(
double const& number);
1202template double cos(
double const& number);
1203template double sin(
double const& number);
1205template double mod(
double const& first,
double const& second);
1217template bool isApproxEqual(
int const& a,
int const& b,
int const& precision,
bool relative);
1218template bool isBetween(
int const& a,
int const& b,
int const& c,
bool strict);
1221template uint32_t
one();
1222template uint32_t
zero();
1223template bool isOne(uint32_t
const& value);
1229template bool isBetween(uint32_t
const& a, uint32_t
const& b, uint32_t
const& c,
bool strict);
1247template int64_t
zero();
1248template int64_t
one();
1255#if defined(STORM_HAVE_CLN)
1257template storm::ClnRationalNumber
one();
1259template storm::ClnRationalNumber
zero();
1262template bool isConstant(storm::ClnRationalNumber
const& value);
1263template bool isPositive(storm::ClnRationalNumber
const& value);
1264template bool isNonNegative(storm::ClnRationalNumber
const& value);
1265template bool isInfinity(storm::ClnRationalNumber
const& value);
1266template bool isNan(storm::ClnRationalNumber
const& value);
1267template bool isAlmostZero(storm::ClnRationalNumber
const& value);
1268template bool isAlmostOne(storm::ClnRationalNumber
const& value);
1269template bool isApproxEqual(storm::ClnRationalNumber
const& a, storm::ClnRationalNumber
const& b, storm::ClnRationalNumber
const& precision,
bool relative);
1270template bool isBetween(storm::ClnRationalNumber
const& a, storm::ClnRationalNumber
const& b, storm::ClnRationalNumber
const& c,
bool strict);
1272template storm::ClnRationalNumber
convertNumber(storm::ClnRationalNumber
const& number);
1273template storm::ClnRationalNumber
simplify(storm::ClnRationalNumber value);
1274template std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1275template storm::ClnRationalNumber
minimum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1276template storm::ClnRationalNumber
maximum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1277template storm::ClnRationalNumber
minimum(std::vector<storm::ClnRationalNumber>
const&);
1278template storm::ClnRationalNumber
maximum(std::vector<storm::ClnRationalNumber>
const&);
1279template storm::ClnRationalNumber
max(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1280template storm::ClnRationalNumber
min(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1281template storm::ClnRationalNumber
round(storm::ClnRationalNumber
const& number);
1282template std::string
to_string(storm::ClnRationalNumber
const& value);
1283template uint64_t
numDigits(
const storm::ClnRationalNumber& number);
1284template uint64_t
bitsize(storm::ClnIntegerNumber
const& number);
1287#if defined(STORM_HAVE_GMP)
1289template storm::GmpRationalNumber
one();
1291template storm::GmpRationalNumber
zero();
1294template bool isConstant(storm::GmpRationalNumber
const& value);
1295template bool isPositive(storm::GmpRationalNumber
const& value);
1296template bool isNonNegative(storm::GmpRationalNumber
const& value);
1297template bool isInfinity(storm::GmpRationalNumber
const& value);
1298template bool isNan(storm::GmpRationalNumber
const& value);
1299template bool isAlmostZero(storm::GmpRationalNumber
const& value);
1300template bool isAlmostOne(storm::GmpRationalNumber
const& value);
1301template bool isBetween(storm::GmpRationalNumber
const&, storm::GmpRationalNumber
const&, storm::GmpRationalNumber
const&,
bool);
1302template bool isApproxEqual(storm::GmpRationalNumber
const& a, storm::GmpRationalNumber
const& b, storm::GmpRationalNumber
const& precision,
bool relative);
1304template storm::GmpRationalNumber
convertNumber(storm::GmpRationalNumber
const& number);
1305template storm::GmpRationalNumber
simplify(storm::GmpRationalNumber value);
1306template storm::GmpRationalNumber
minimum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1307template storm::GmpRationalNumber
maximum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1308template storm::GmpRationalNumber
minimum(std::vector<storm::GmpRationalNumber>
const&);
1309template storm::GmpRationalNumber
maximum(std::vector<storm::GmpRationalNumber>
const&);
1310template storm::GmpRationalNumber
max(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1311template storm::GmpRationalNumber
min(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1312template storm::GmpRationalNumber
round(storm::GmpRationalNumber
const& number);
1313template std::string
to_string(storm::GmpRationalNumber
const& value);
1314template uint64_t
numDigits(
const storm::GmpRationalNumber& number);
1315template uint64_t
bitsize(storm::GmpIntegerNumber
const& 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)
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)
TargetType convertNumber(SourceType const &number)
carl::Interval< storm::RationalNumber > RationalInterval
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.