18template<
typename ValueType>
23template<
typename ValueType>
28template<
typename ValueType>
30 return std::numeric_limits<ValueType>::infinity();
33template<
typename ValueType>
35 return a == one<ValueType>();
38template<
typename ValueType>
40 return a == zero<ValueType>();
43template<
typename ValueType>
49bool isNan(
double const& value) {
50 return std::isnan(value);
53template<
typename ValueType>
54bool isApproxEqual(ValueType
const& a, ValueType
const& b, ValueType
const& precision,
bool relative) {
55 ValueType
const absDiff = abs<ValueType>(a - b);
57 return absDiff <= precision *
max(
abs(a),
abs(b));
59 return absDiff <= precision;
63template<
typename ValueType>
65 return a > zero<ValueType>();
68template<
typename ValueType>
70 return a >= zero<ValueType>();
81template<
typename ValueType>
82bool isBetween(ValueType
const& a, ValueType
const& b, ValueType
const& c,
bool strict) {
86 return a < b && b < c;
88 return a <= b && b <= c;
92template<
typename ValueType>
94 return a < convertNumber<ValueType>(1e-12) && a > -convertNumber<ValueType>(1e-12);
97template<
typename ValueType>
99 return a < convertNumber<ValueType>(1.0 + 1e-12) && a > convertNumber<ValueType>(1.0 - 1e-12);
102template<
typename ValueType>
107template<
typename ValueType>
109 return a == infinity<ValueType>();
112template<
typename ValueType>
115 ValueType result = std::modf(number, &iPart);
116 return result == zero<ValueType>();
134template<
typename TargetType,
typename SourceType>
136 return static_cast<TargetType
>(number);
141 return std::llround(number);
146 return std::llround(number);
161 return static_cast<double>(number);
169template<
typename ValueType>
176template<
typename ValueType>
177std::pair<ValueType, ValueType>
minmax(std::vector<ValueType>
const& values) {
178 assert(!values.empty());
179 ValueType
min = values.front();
180 ValueType
max = values.front();
181 for (
auto const& vt : values) {
189 return std::make_pair(
min,
max);
192template<
typename ValueType>
193ValueType
minimum(std::vector<ValueType>
const& values) {
194 assert(!values.empty());
195 ValueType
min = values.front();
196 for (
auto const& vt : values) {
204template<
typename ValueType>
205ValueType
maximum(std::vector<ValueType>
const& values) {
206 assert(!values.empty());
207 ValueType
max = values.front();
208 for (
auto const& vt : values) {
216template<
typename K,
typename ValueType>
217std::pair<ValueType, ValueType>
minmax(std::map<K, ValueType>
const& values) {
218 assert(!values.empty());
219 ValueType
min = values.begin()->second;
220 ValueType
max = values.begin()->second;
221 for (
auto const& vt : values) {
222 if (vt.second <
min) {
225 if (vt.second >
max) {
229 return std::make_pair(
min,
max);
232template<
typename K,
typename ValueType>
233ValueType
minimum(std::map<K, ValueType>
const& values) {
234 return minmax(values).first;
237template<
typename K,
typename ValueType>
238ValueType
maximum(std::map<K, ValueType>
const& values) {
239 return minmax(values).second;
242template<
typename ValueType>
243ValueType
pow(ValueType
const& value, int_fast64_t exponent) {
244 return std::pow(value, exponent);
247template<
typename ValueType>
248ValueType
max(ValueType
const& first, ValueType
const& second) {
249 return std::max(first, second);
252template<
typename ValueType>
253ValueType
min(ValueType
const& first, ValueType
const& second) {
254 return std::min(first, second);
257template<
typename ValueType>
258ValueType
sqrt(ValueType
const& number) {
259 return std::sqrt(number);
262template<
typename ValueType>
263ValueType
abs(ValueType
const& number) {
264 return std::fabs(number);
267template<
typename ValueType>
268ValueType
floor(ValueType
const& number) {
269 return std::floor(number);
272template<
typename ValueType>
273ValueType
ceil(ValueType
const& number) {
274 return std::ceil(number);
277template<
typename ValueType>
278ValueType
round(ValueType
const& number) {
280 return floor<ValueType>(number + storm::utility::convertNumber<ValueType>(0.5));
283template<
typename ValueType>
284ValueType
log(ValueType
const& number) {
285 return std::log(number);
288template<
typename ValueType>
289ValueType
log10(ValueType
const& number) {
290 return std::log10(number);
293template<
typename ValueType>
294ValueType
cos(ValueType
const& number) {
295 return std::cos(number);
298template<
typename ValueType>
299ValueType
sin(ValueType
const& number) {
300 return std::sin(number);
303template<
typename ValueType>
306 ValueType remaining = storm::utility::one<ValueType>() / number;
307 ValueType ten = storm::utility::convertNumber<ValueType>(10);
308 while (remaining >= storm::utility::one<ValueType>()) {
310 remaining = storm::utility::floor<ValueType>(remaining / ten);
315template<
typename ValueType>
320template<
typename IntegerType>
321IntegerType
mod(IntegerType
const& first, IntegerType
const& second) {
322 return std::fmod(first, second);
325template<
typename IntegerType>
326std::pair<IntegerType, IntegerType>
divide(IntegerType
const& dividend, IntegerType
const& divisor) {
327 return std::make_pair(dividend / divisor,
mod(dividend, divisor));
330template<
typename ValueType>
332 std::stringstream ss;
333 ss.precision(std::numeric_limits<ValueType>::max_digits10 + 2);
338#if defined(STORM_HAVE_CLN)
340storm::ClnRationalNumber
infinity() {
342 return storm::ClnRationalNumber(100000000000);
346bool isOne(storm::ClnRationalNumber
const& a) {
347 return carl::isOne(a);
351bool isZero(storm::ClnRationalNumber
const& a) {
352 return carl::isZero(a);
356bool isInteger(storm::ClnRationalNumber
const& number) {
357 return carl::isInteger(number);
361std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::vector<storm::ClnRationalNumber>
const& values) {
362 assert(!values.empty());
363 storm::ClnRationalNumber
min = values.front();
364 storm::ClnRationalNumber
max = values.front();
365 for (
auto const& vt : values) {
366 if (vt == storm::utility::infinity<storm::ClnRationalNumber>()) {
377 return std::make_pair(
min,
max);
381uint_fast64_t
convertNumber(ClnRationalNumber
const& number) {
382 return carl::toInt<carl::uint>(number);
387 return carl::toInt<carl::sint>(number);
392 return carl::rationalize<ClnRationalNumber>(number);
397 return carl::rationalize<ClnRationalNumber>(number);
401ClnRationalNumber
convertNumber(NumberTraits<ClnRationalNumber>::IntegerType
const& number) {
402 return ClnRationalNumber(number);
406ClnRationalNumber
convertNumber(uint_fast64_t
const& number) {
407 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
408 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::uint
>(number));
412typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
413 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
414 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
418typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(
double const& number) {
419 if (number <
static_cast<double>(std::numeric_limits<uint64_t>::max())) {
420 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<uint64_t
>(number));
422 return carl::round(carl::rationalize<ClnRationalNumber>(number));
428 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
429 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::sint
>(number));
434 return carl::toDouble(number);
439 ClnRationalNumber result;
440 if (carl::try_parse<ClnRationalNumber>(number, result)) {
443 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
447std::pair<ClnRationalNumber, ClnRationalNumber>
asFraction(ClnRationalNumber
const& number) {
448 return std::make_pair(carl::getNum(number), carl::getDenom(number));
452ClnRationalNumber
sqrt(ClnRationalNumber
const& number) {
453 return carl::sqrt(number);
457ClnRationalNumber
abs(storm::ClnRationalNumber
const& number) {
458 return carl::abs(number);
462ClnRationalNumber
floor(storm::ClnRationalNumber
const& number) {
463 return carl::floor(number);
467ClnRationalNumber
ceil(storm::ClnRationalNumber
const& number) {
468 return carl::ceil(number);
472ClnRationalNumber
log(ClnRationalNumber
const& number) {
473 return carl::log(number);
477ClnRationalNumber
log10(ClnRationalNumber
const& number) {
478 return carl::log10(number);
482ClnRationalNumber
cos(ClnRationalNumber
const& number) {
483 return carl::cos(number);
487ClnRationalNumber
sin(ClnRationalNumber
const& number) {
488 return carl::sin(number);
492typename NumberTraits<ClnRationalNumber>::IntegerType
trunc(ClnRationalNumber
const& number) {
493 return cln::truncate1(number);
497typename NumberTraits<ClnRationalNumber>::IntegerType
mod(NumberTraits<ClnRationalNumber>::IntegerType
const& first,
498 NumberTraits<ClnRationalNumber>::IntegerType
const& second) {
499 return carl::mod(first, second);
503std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType>
divide(
504 typename NumberTraits<ClnRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<ClnRationalNumber>::IntegerType
const& divisor) {
505 std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType> result;
506 carl::divide(dividend, divisor, result.first, result.second);
511typename NumberTraits<ClnRationalNumber>::IntegerType
pow(
typename NumberTraits<ClnRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
512 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
513 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
514 return carl::pow(value, exponent);
518ClnRationalNumber
pow(ClnRationalNumber
const& value, int_fast64_t exponent) {
520 return carl::pow(value, exponent);
522 return storm::utility::one<ClnRationalNumber>() / carl::pow(value, -exponent);
527NumberTraits<ClnRationalNumber>::IntegerType
numerator(ClnRationalNumber
const& number) {
528 return carl::getNum(number);
532NumberTraits<ClnRationalNumber>::IntegerType
denominator(ClnRationalNumber
const& number) {
533 return carl::getDenom(number);
537#if defined(STORM_HAVE_GMP)
539storm::GmpRationalNumber
infinity() {
541 return storm::GmpRationalNumber(100000000000);
545bool isOne(storm::GmpRationalNumber
const& a) {
546 return carl::isOne(a);
550bool isZero(storm::GmpRationalNumber
const& a) {
551 return carl::isZero(a);
555bool isInteger(storm::GmpRationalNumber
const& number) {
556 return carl::isInteger(number);
560std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::vector<storm::GmpRationalNumber>
const& values) {
561 assert(!values.empty());
562 storm::GmpRationalNumber
min = values.front();
563 storm::GmpRationalNumber
max = values.front();
564 for (
auto const& vt : values) {
565 if (vt == storm::utility::infinity<storm::GmpRationalNumber>()) {
576 return std::make_pair(
min,
max);
580std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::map<uint64_t, storm::GmpRationalNumber>
const& values) {
581 assert(!values.empty());
582 storm::GmpRationalNumber
min = values.begin()->second;
583 storm::GmpRationalNumber
max = values.begin()->second;
584 for (
auto const& vt : values) {
585 if (vt.second == storm::utility::infinity<storm::GmpRationalNumber>()) {
588 if (vt.second <
min) {
591 if (vt.second >
max) {
596 return std::make_pair(
min,
max);
600uint_fast64_t
convertNumber(GmpRationalNumber
const& number) {
601 return carl::toInt<carl::uint>(number);
606 return carl::toInt<carl::sint>(number);
611 return carl::rationalize<GmpRationalNumber>(number);
616 return carl::rationalize<GmpRationalNumber>(number);
620GmpRationalNumber
convertNumber(uint_fast64_t
const& number) {
621 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
622 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::uint
>(number));
626GmpRationalNumber
convertNumber(NumberTraits<GmpRationalNumber>::IntegerType
const& number) {
627 return GmpRationalNumber(number);
631typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
632 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
633 return NumberTraits<GmpRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
637typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(
double const& number) {
638 return NumberTraits<GmpRationalNumber>::IntegerType(number);
643 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
644 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::sint
>(number));
649 return carl::toDouble(number);
654 GmpRationalNumber result;
655 if (carl::try_parse<GmpRationalNumber>(number, result)) {
658 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
662std::pair<GmpRationalNumber, GmpRationalNumber>
asFraction(GmpRationalNumber
const& number) {
663 return std::make_pair(carl::getNum(number), carl::getDenom(number));
667GmpRationalNumber
sqrt(GmpRationalNumber
const& number) {
668 return carl::sqrt(number);
672GmpRationalNumber
abs(storm::GmpRationalNumber
const& number) {
673 return carl::abs(number);
677GmpRationalNumber
floor(storm::GmpRationalNumber
const& number) {
678 return carl::floor(number);
682GmpRationalNumber
ceil(storm::GmpRationalNumber
const& number) {
683 return carl::ceil(number);
687GmpRationalNumber
log(GmpRationalNumber
const& number) {
688 return carl::log(number);
692GmpRationalNumber
log10(GmpRationalNumber
const& number) {
693 STORM_LOG_WARN(
"Using log10 for GMP rational numbers is not exact, it converts to doubles internally! Avoid if possible.");
694 return carl::log10(number);
698GmpRationalNumber
cos(GmpRationalNumber
const& number) {
699 return carl::cos(number);
703GmpRationalNumber
sin(GmpRationalNumber
const& number) {
704 return carl::sin(number);
708typename NumberTraits<GmpRationalNumber>::IntegerType
trunc(GmpRationalNumber
const& number) {
709 return carl::getNum(number) / carl::getDenom(number);
713typename NumberTraits<GmpRationalNumber>::IntegerType
mod(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& first,
714 typename NumberTraits<GmpRationalNumber>::IntegerType
const& second) {
715 return carl::mod(first, second);
719std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType>
divide(
720 typename NumberTraits<GmpRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<GmpRationalNumber>::IntegerType
const& divisor) {
721 std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType> result;
722 carl::divide(dividend, divisor, result.first, result.second);
727typename NumberTraits<GmpRationalNumber>::IntegerType
pow(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
728 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
729 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
730 return carl::pow(value, exponent);
734GmpRationalNumber
pow(GmpRationalNumber
const& value, int_fast64_t exponent) {
736 return carl::pow(value, exponent);
738 return storm::utility::one<GmpRationalNumber>() / carl::pow(value, -exponent);
743typename NumberTraits<GmpRationalNumber>::IntegerType
numerator(GmpRationalNumber
const& number) {
744 return carl::getNum(number);
748typename NumberTraits<GmpRationalNumber>::IntegerType
denominator(GmpRationalNumber
const& number) {
749 return carl::getDenom(number);
753#if defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
755storm::GmpRationalNumber
convertNumber(storm::ClnRationalNumber
const& number) {
756 return carl::parse<storm::GmpRationalNumber>(
to_string(number));
760storm::ClnRationalNumber
convertNumber(storm::GmpRationalNumber
const& number) {
761 return carl::parse<storm::ClnRationalNumber>(
to_string(number));
793 return a.isConstant();
798 return a.isConstant();
803 STORM_LOG_ASSERT(
isZero(precision),
"Approx equal on rational functions is only defined for precision zero");
809 return a.isPointInterval();
815 return a == infinity<storm::RationalFunction>();
825 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(number));
830 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
831 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(
static_cast<carl::sint
>(number)));
834#if defined(STORM_HAVE_CLN)
837 return RationalFunction(convertNumber<storm::RationalFunctionCoefficient>(number));
842 storm::RationalFunctionCoefficient tmp = number.nominatorAsNumber() / number.denominatorAsNumber();
843 return convertNumber<ClnRationalNumber>(tmp);
847#if defined(STORM_HAVE_GMP)
850 return RationalFunction(convertNumber<storm::RationalFunctionCoefficient>(number));
855 return convertNumber<GmpRationalNumber>(number.nominatorAsNumber() / number.denominatorAsNumber());
861 return carl::toInt<carl::uint>(convertNumber<RationalFunctionCoefficient>(func));
866 return carl::toInt<carl::sint>(convertNumber<RationalFunctionCoefficient>(func));
871 return carl::toDouble(convertNumber<RationalFunctionCoefficient>(func));
881 return RationalFunction(convertNumber<RationalFunctionCoefficient>(number));
886 return RationalFunction(convertNumber<RationalFunctionCoefficient>(number));
910 return std::move(value);
915 return a.isConstant() &&
isAlmostZero(convertNumber<RationalFunctionCoefficient>(a));
920 return a.isConstant() &&
isAlmostOne(convertNumber<RationalFunctionCoefficient>(a));
925 return a.isConstant() &&
isNonNegative(convertNumber<RationalFunctionCoefficient>(a));
930 return a.isConstant() &&
isPositive(convertNumber<RationalFunctionCoefficient>(a));
937 return b.isConstant() &&
isBetween(convertNumber<RationalFunctionCoefficient>(a), convertNumber<RationalFunctionCoefficient>(b),
938 convertNumber<RationalFunctionCoefficient>(c), strict);
942std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::vector<storm::RationalFunction>
const&) {
943 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum/maximum for rational functions is not defined.");
948 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
953 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined.");
957std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::map<uint64_t, storm::RationalFunction>
const&) {
958 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum/maximum for rational functions is not defined.");
963 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
968 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined");
974 return carl::pow(value, exponent);
976 return storm::utility::one<RationalFunction>() / carl::pow(value, -exponent);
982 std::stringstream ss;
983 if (f.isConstant()) {
984 if (f.denominator().isOne()) {
985 ss << f.nominatorAsNumber();
987 ss << f.nominatorAsNumber() <<
"/" << f.denominatorAsNumber();
989 }
else if (f.denominator().isOne()) {
990 ss << f.nominatorAsPolynomial().coefficient() * f.nominatorAsPolynomial().polynomial();
992 ss <<
"(" << f.nominatorAsPolynomial() <<
")/(" << f.denominatorAsPolynomial() <<
")";
999 return convertNumber<double>(convertNumber<storm::RationalNumber>(value));
1012#if defined(STORM_HAVE_GMP)
1020 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
1021 return convertNumber<storm::GmpRationalNumber>(number.lower());
1025#if defined(STORM_HAVE_CLN)
1033 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
1034 return convertNumber<storm::ClnRationalNumber>(number.lower());
1040 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
1041 return number.lower();
1046 return interval.abs();
1051 STORM_LOG_ASSERT(precision.isPointInterval(),
"Precision must be a point interval");
1052 return isApproxEqual<double>(a.lower(), b.lower(), precision.center(), relative) &&
1053 isApproxEqual<double>(a.upper(), b.upper(), precision.center(), relative);
1062template bool isOne(
double const& value);
1071template bool isBetween(
double const& a,
double const& b,
double const& c,
bool strict);
1072template bool isApproxEqual(
double const& a,
double const& b,
double const& precision,
bool relative);
1074template std::pair<double, double>
minmax(std::vector<double>
const&);
1075template double minimum(std::vector<double>
const&);
1076template double maximum(std::vector<double>
const&);
1077template std::pair<double, double>
minmax(std::map<uint64_t, double>
const&);
1078template double minimum(std::map<uint64_t, double>
const&);
1079template double maximum(std::map<uint64_t, double>
const&);
1080template double pow(
double const& value, int_fast64_t exponent);
1081template double max(
double const& first,
double const& second);
1082template double min(
double const& first,
double const& second);
1083template double sqrt(
double const& number);
1084template double abs(
double const& number);
1085template double floor(
double const& number);
1086template double ceil(
double const& number);
1087template double round(
double const& number);
1088template double log(
double const& number);
1089template double log10(
double const& number);
1090template double cos(
double const& number);
1091template double sin(
double const& number);
1093template double mod(
double const& first,
double const& second);
1106template bool isApproxEqual(
int const& a,
int const& b,
int const& precision,
bool relative);
1107template bool isBetween(
int const& a,
int const& b,
int const& c,
bool strict);
1110template uint32_t
one();
1111template uint32_t
zero();
1113template bool isOne(uint32_t
const& value);
1119template bool isBetween(uint32_t
const& a, uint32_t
const& b, uint32_t
const& c,
bool strict);
1140#if defined(STORM_HAVE_CLN)
1142template storm::ClnRationalNumber
one();
1144template storm::ClnRationalNumber
zero();
1146template bool isConstant(storm::ClnRationalNumber
const& value);
1147template bool isPositive(storm::ClnRationalNumber
const& value);
1148template bool isNonNegative(storm::ClnRationalNumber
const& value);
1149template bool isInfinity(storm::ClnRationalNumber
const& value);
1150template bool isNan(storm::ClnRationalNumber
const& value);
1151template bool isAlmostZero(storm::ClnRationalNumber
const& value);
1152template bool isAlmostOne(storm::ClnRationalNumber
const& value);
1153template bool isApproxEqual(storm::ClnRationalNumber
const& a, storm::ClnRationalNumber
const& b, storm::ClnRationalNumber
const& precision,
bool relative);
1154template bool isBetween(storm::ClnRationalNumber
const& a, storm::ClnRationalNumber
const& b, storm::ClnRationalNumber
const& c,
bool strict);
1156template storm::ClnRationalNumber
convertNumber(storm::ClnRationalNumber
const& number);
1157template storm::ClnRationalNumber
simplify(storm::ClnRationalNumber value);
1158template std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1159template storm::ClnRationalNumber
minimum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1160template storm::ClnRationalNumber
maximum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1161template storm::ClnRationalNumber
minimum(std::vector<storm::ClnRationalNumber>
const&);
1162template storm::ClnRationalNumber
maximum(std::vector<storm::ClnRationalNumber>
const&);
1163template storm::ClnRationalNumber
max(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1164template storm::ClnRationalNumber
min(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1165template storm::ClnRationalNumber
round(storm::ClnRationalNumber
const& number);
1166template std::string
to_string(storm::ClnRationalNumber
const& value);
1167template uint64_t
numDigits(
const storm::ClnRationalNumber& number);
1170#if defined(STORM_HAVE_GMP)
1172template storm::GmpRationalNumber
one();
1174template storm::GmpRationalNumber
zero();
1176template bool isConstant(storm::GmpRationalNumber
const& value);
1177template bool isPositive(storm::GmpRationalNumber
const& value);
1178template bool isNonNegative(storm::GmpRationalNumber
const& value);
1179template bool isInfinity(storm::GmpRationalNumber
const& value);
1180template bool isNan(storm::GmpRationalNumber
const& value);
1181template bool isAlmostZero(storm::GmpRationalNumber
const& value);
1182template bool isAlmostOne(storm::GmpRationalNumber
const& value);
1183template bool isBetween(storm::GmpRationalNumber
const&, storm::GmpRationalNumber
const&, storm::GmpRationalNumber
const&,
bool);
1184template bool isApproxEqual(storm::GmpRationalNumber
const& a, storm::GmpRationalNumber
const& b, storm::GmpRationalNumber
const& precision,
bool relative);
1186template storm::GmpRationalNumber
convertNumber(storm::GmpRationalNumber
const& number);
1187template storm::GmpRationalNumber
simplify(storm::GmpRationalNumber value);
1188template storm::GmpRationalNumber
minimum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1189template storm::GmpRationalNumber
maximum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1190template storm::GmpRationalNumber
minimum(std::vector<storm::GmpRationalNumber>
const&);
1191template storm::GmpRationalNumber
maximum(std::vector<storm::GmpRationalNumber>
const&);
1192template storm::GmpRationalNumber
max(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1193template storm::GmpRationalNumber
min(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1194template storm::GmpRationalNumber
round(storm::GmpRationalNumber
const& number);
1195template std::string
to_string(storm::GmpRationalNumber
const& value);
1196template 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