18template<
typename ValueType>
23template<
typename ValueType>
28template<
typename ValueType>
30 return std::numeric_limits<ValueType>::infinity();
33template<
typename ValueType>
38template<
typename 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) {
57 return absDiff <= precision *
max(
abs(a),
abs(b));
59 return absDiff <= precision;
63template<
typename ValueType>
68template<
typename 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>
97template<
typename ValueType>
102template<
typename ValueType>
107template<
typename ValueType>
112template<
typename ValueType>
115 ValueType result = std::modf(number, &iPart);
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) {
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>
315template<
typename ValueType>
317 if constexpr (std::is_same_v<ValueType, uint64_t>) {
318 return std::bit_width(number);
325 return carl::bitsize(number);
330template<
typename ValueType>
335template<
typename IntegerType>
337 return std::fmod(first, second);
340template<
typename IntegerType>
342 return std::make_pair(dividend / divisor,
mod(dividend, divisor));
345template<
typename ValueType>
347 std::stringstream ss;
348 ss.precision(std::numeric_limits<ValueType>::max_digits10 + 2);
353#if defined(STORM_HAVE_CLN)
355storm::ClnRationalNumber
infinity() {
357 return storm::ClnRationalNumber(100000000000);
361bool isOne(storm::ClnRationalNumber
const& a) {
362 return carl::isOne(a);
366bool isZero(storm::ClnRationalNumber
const& a) {
367 return carl::isZero(a);
371bool isInteger(storm::ClnRationalNumber
const& number) {
372 return carl::isInteger(number);
376std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::vector<storm::ClnRationalNumber>
const& values) {
377 assert(!values.empty());
378 storm::ClnRationalNumber
min = values.front();
379 storm::ClnRationalNumber
max = values.front();
380 for (
auto const& vt : values) {
392 return std::make_pair(
min,
max);
396uint_fast64_t
convertNumber(ClnRationalNumber
const& number) {
397 return carl::toInt<carl::uint>(number);
402 return carl::toInt<carl::sint>(number);
407 return carl::rationalize<ClnRationalNumber>(number);
412 return carl::rationalize<ClnRationalNumber>(number);
416ClnRationalNumber
convertNumber(NumberTraits<ClnRationalNumber>::IntegerType
const& number) {
417 return ClnRationalNumber(number);
421ClnRationalNumber
convertNumber(uint_fast64_t
const& number) {
422 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
423 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::uint
>(number));
427typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
428 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
429 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
433typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(int_fast64_t
const& number) {
434 STORM_LOG_ASSERT(
static_cast<long int>(number) == number,
"Conversion failed, because the number is too large.");
435 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<long int>(number));
439typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(
double const& number) {
440 if (number <
static_cast<double>(std::numeric_limits<uint64_t>::max())) {
441 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<uint64_t
>(number));
443 return carl::round(carl::rationalize<ClnRationalNumber>(number));
449 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
450 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::sint
>(number));
455 return carl::toDouble(number);
460 ClnRationalNumber result;
461 if (carl::try_parse<ClnRationalNumber>(number, result)) {
464 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
468std::pair<ClnRationalNumber, ClnRationalNumber>
asFraction(ClnRationalNumber
const& number) {
469 return std::make_pair(carl::getNum(number), carl::getDenom(number));
473ClnRationalNumber
sqrt(ClnRationalNumber
const& number) {
474 return carl::sqrt(number);
478ClnRationalNumber
abs(storm::ClnRationalNumber
const& number) {
479 return carl::abs(number);
483ClnRationalNumber
floor(storm::ClnRationalNumber
const& number) {
484 return carl::floor(number);
488ClnRationalNumber
ceil(storm::ClnRationalNumber
const& number) {
489 return carl::ceil(number);
493ClnRationalNumber
log(ClnRationalNumber
const& number) {
494 return carl::log(number);
498ClnRationalNumber
log10(ClnRationalNumber
const& number) {
499 return carl::log10(number);
503ClnRationalNumber
cos(ClnRationalNumber
const& number) {
504 return carl::cos(number);
508ClnRationalNumber
sin(ClnRationalNumber
const& number) {
509 return carl::sin(number);
513typename NumberTraits<ClnRationalNumber>::IntegerType
trunc(ClnRationalNumber
const& number) {
514 return cln::truncate1(number);
518typename NumberTraits<ClnRationalNumber>::IntegerType
mod(NumberTraits<ClnRationalNumber>::IntegerType
const& first,
519 NumberTraits<ClnRationalNumber>::IntegerType
const& second) {
520 return carl::mod(first, second);
524std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType>
divide(
525 typename NumberTraits<ClnRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<ClnRationalNumber>::IntegerType
const& divisor) {
526 std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType> result;
527 carl::divide(dividend, divisor, result.first, result.second);
532typename NumberTraits<ClnRationalNumber>::IntegerType
pow(
typename NumberTraits<ClnRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
533 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
534 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
535 return carl::pow(value, exponent);
539ClnRationalNumber
pow(ClnRationalNumber
const& value, int_fast64_t exponent) {
541 return carl::pow(value, exponent);
548NumberTraits<ClnRationalNumber>::IntegerType
numerator(ClnRationalNumber
const& number) {
549 return carl::getNum(number);
553NumberTraits<ClnRationalNumber>::IntegerType
denominator(ClnRationalNumber
const& number) {
554 return carl::getDenom(number);
558#if defined(STORM_HAVE_GMP)
560storm::GmpRationalNumber
infinity() {
562 return storm::GmpRationalNumber(100000000000);
566bool isOne(storm::GmpRationalNumber
const& a) {
567 return carl::isOne(a);
571bool isZero(storm::GmpRationalNumber
const& a) {
572 return carl::isZero(a);
576bool isInteger(storm::GmpRationalNumber
const& number) {
577 return carl::isInteger(number);
581std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::vector<storm::GmpRationalNumber>
const& values) {
582 assert(!values.empty());
583 storm::GmpRationalNumber
min = values.front();
584 storm::GmpRationalNumber
max = values.front();
585 for (
auto const& vt : values) {
597 return std::make_pair(
min,
max);
601std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::map<uint64_t, storm::GmpRationalNumber>
const& values) {
602 assert(!values.empty());
603 storm::GmpRationalNumber
min = values.begin()->second;
604 storm::GmpRationalNumber
max = values.begin()->second;
605 for (
auto const& vt : values) {
609 if (vt.second <
min) {
612 if (vt.second >
max) {
617 return std::make_pair(
min,
max);
621uint_fast64_t
convertNumber(GmpRationalNumber
const& number) {
622 return carl::toInt<carl::uint>(number);
627 return carl::toInt<carl::sint>(number);
632 return carl::rationalize<GmpRationalNumber>(number);
637 return carl::rationalize<GmpRationalNumber>(number);
641GmpRationalNumber
convertNumber(uint_fast64_t
const& number) {
642 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
643 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::uint
>(number));
647GmpRationalNumber
convertNumber(NumberTraits<GmpRationalNumber>::IntegerType
const& number) {
648 return GmpRationalNumber(number);
652typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
653 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
654 return NumberTraits<GmpRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
658typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(int_fast64_t
const& number) {
659 STORM_LOG_ASSERT(
static_cast<long int>(number) == number,
"Conversion failed, because the number is too large.");
660 return NumberTraits<GmpRationalNumber>::IntegerType(
static_cast<long int>(number));
664typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(
double const& number) {
665 return NumberTraits<GmpRationalNumber>::IntegerType(number);
670 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
671 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::sint
>(number));
676 return carl::toDouble(number);
681 GmpRationalNumber result;
682 if (carl::try_parse<GmpRationalNumber>(number, result)) {
685 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
689std::pair<GmpRationalNumber, GmpRationalNumber>
asFraction(GmpRationalNumber
const& number) {
690 return std::make_pair(carl::getNum(number), carl::getDenom(number));
694GmpRationalNumber
sqrt(GmpRationalNumber
const& number) {
695 return carl::sqrt(number);
699GmpRationalNumber
abs(storm::GmpRationalNumber
const& number) {
700 return carl::abs(number);
704GmpRationalNumber
floor(storm::GmpRationalNumber
const& number) {
705 return carl::floor(number);
709GmpRationalNumber
ceil(storm::GmpRationalNumber
const& number) {
710 return carl::ceil(number);
714GmpRationalNumber
log(GmpRationalNumber
const& number) {
715 return carl::log(number);
719GmpRationalNumber
log10(GmpRationalNumber
const& number) {
720 STORM_LOG_WARN(
"Using log10 for GMP rational numbers is not exact, it converts to doubles internally! Avoid if possible.");
721 return carl::log10(number);
725GmpRationalNumber
cos(GmpRationalNumber
const& number) {
726 return carl::cos(number);
730GmpRationalNumber
sin(GmpRationalNumber
const& number) {
731 return carl::sin(number);
735typename NumberTraits<GmpRationalNumber>::IntegerType
trunc(GmpRationalNumber
const& number) {
736 return carl::getNum(number) / carl::getDenom(number);
740typename NumberTraits<GmpRationalNumber>::IntegerType
mod(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& first,
741 typename NumberTraits<GmpRationalNumber>::IntegerType
const& second) {
742 return carl::mod(first, second);
746std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType>
divide(
747 typename NumberTraits<GmpRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<GmpRationalNumber>::IntegerType
const& divisor) {
748 std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType> result;
749 carl::divide(dividend, divisor, result.first, result.second);
754typename NumberTraits<GmpRationalNumber>::IntegerType
pow(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
755 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
756 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
757 return carl::pow(value, exponent);
761GmpRationalNumber
pow(GmpRationalNumber
const& value, int_fast64_t exponent) {
763 return carl::pow(value, exponent);
770typename NumberTraits<GmpRationalNumber>::IntegerType
numerator(GmpRationalNumber
const& number) {
771 return carl::getNum(number);
775typename NumberTraits<GmpRationalNumber>::IntegerType
denominator(GmpRationalNumber
const& number) {
776 return carl::getDenom(number);
780#if defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
782storm::GmpRationalNumber
convertNumber(storm::ClnRationalNumber
const& number) {
783 return carl::parse<storm::GmpRationalNumber>(
to_string(number));
787storm::ClnRationalNumber
convertNumber(storm::GmpRationalNumber
const& number) {
788 return carl::parse<storm::ClnRationalNumber>(
to_string(number));
820 return a.isConstant();
825 return a.isConstant();
830 STORM_LOG_ASSERT(
isZero(precision),
"Approx equal on rational functions is only defined for precision zero");
836 return a.isPointInterval();
841 return a.isPointInterval();
857 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(number));
862 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
863 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(
static_cast<carl::sint
>(number)));
866#if defined(STORM_HAVE_CLN)
874 storm::RationalFunctionCoefficient tmp = number.nominatorAsNumber() / number.denominatorAsNumber();
879#if defined(STORM_HAVE_GMP)
942 return std::move(value);
974std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::vector<storm::RationalFunction>
const&) {
975 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum/maximum for rational functions is not defined.");
980 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
985 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined.");
989std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::map<uint64_t, storm::RationalFunction>
const&) {
990 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum/maximum for rational functions is not defined.");
995 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
1000 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined");
1005 if (exponent >= 0) {
1006 return carl::pow(value, exponent);
1014 std::stringstream ss;
1015 if (f.isConstant()) {
1016 if (f.denominator().isOne()) {
1017 ss << f.nominatorAsNumber();
1019 ss << f.nominatorAsNumber() <<
"/" << f.denominatorAsNumber();
1021 }
else if (f.denominator().isOne()) {
1022 ss << f.nominatorAsPolynomial().coefficient() * f.nominatorAsPolynomial().polynomial();
1024 ss <<
"(" << f.nominatorAsPolynomial() <<
")/(" << f.denominatorAsPolynomial() <<
")";
1054#if defined(STORM_HAVE_GMP)
1062 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
1073 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
1078#if defined(STORM_HAVE_CLN)
1086 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
1097 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
1104 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
1105 return number.lower();
1110 STORM_LOG_ASSERT(number.isPointInterval(),
"Rational interval must be a point interval to convert");
1128 return interval.abs();
1133 STORM_LOG_ASSERT(precision.isPointInterval(),
"Precision must be a point interval");
1140 STORM_LOG_ASSERT(precision.isPointInterval(),
"Precision must be a point interval");
1147 return interval.abs();
1156template bool isOne(
double const& value);
1165template bool isBetween(
double const& a,
double const& b,
double const& c,
bool strict);
1166template bool isApproxEqual(
double const& a,
double const& b,
double const& precision,
bool relative);
1168template std::pair<double, double>
minmax(std::vector<double>
const&);
1169template double minimum(std::vector<double>
const&);
1170template double maximum(std::vector<double>
const&);
1171template std::pair<double, double>
minmax(std::map<uint64_t, double>
const&);
1172template double minimum(std::map<uint64_t, double>
const&);
1173template double maximum(std::map<uint64_t, double>
const&);
1174template double pow(
double const& value, int_fast64_t exponent);
1175template double max(
double const& first,
double const& second);
1176template double min(
double const& first,
double const& second);
1177template double sqrt(
double const& number);
1178template double abs(
double const& number);
1179template double floor(
double const& number);
1180template double ceil(
double const& number);
1181template double round(
double const& number);
1182template double log(
double const& number);
1183template double log10(
double const& number);
1184template double cos(
double const& number);
1185template double sin(
double const& number);
1187template double mod(
double const& first,
double const& second);
1200template bool isApproxEqual(
int const& a,
int const& b,
int const& precision,
bool relative);
1201template bool isBetween(
int const& a,
int const& b,
int const& c,
bool strict);
1204template uint32_t
one();
1205template uint32_t
zero();
1207template bool isOne(uint32_t
const& value);
1213template bool isBetween(uint32_t
const& a, uint32_t
const& b, uint32_t
const& c,
bool strict);
1235#if defined(STORM_HAVE_CLN)
1237template storm::ClnRationalNumber
one();
1239template storm::ClnRationalNumber
zero();
1241template bool isConstant(storm::ClnRationalNumber
const& value);
1242template bool isPositive(storm::ClnRationalNumber
const& value);
1243template bool isNonNegative(storm::ClnRationalNumber
const& value);
1244template bool isInfinity(storm::ClnRationalNumber
const& value);
1245template bool isNan(storm::ClnRationalNumber
const& value);
1246template bool isAlmostZero(storm::ClnRationalNumber
const& value);
1247template bool isAlmostOne(storm::ClnRationalNumber
const& value);
1248template bool isApproxEqual(storm::ClnRationalNumber
const& a, storm::ClnRationalNumber
const& b, storm::ClnRationalNumber
const& precision,
bool relative);
1249template bool isBetween(storm::ClnRationalNumber
const& a, storm::ClnRationalNumber
const& b, storm::ClnRationalNumber
const& c,
bool strict);
1251template storm::ClnRationalNumber
convertNumber(storm::ClnRationalNumber
const& number);
1252template storm::ClnRationalNumber
simplify(storm::ClnRationalNumber value);
1253template std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1254template storm::ClnRationalNumber
minimum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1255template storm::ClnRationalNumber
maximum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1256template storm::ClnRationalNumber
minimum(std::vector<storm::ClnRationalNumber>
const&);
1257template storm::ClnRationalNumber
maximum(std::vector<storm::ClnRationalNumber>
const&);
1258template storm::ClnRationalNumber
max(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1259template storm::ClnRationalNumber
min(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1260template storm::ClnRationalNumber
round(storm::ClnRationalNumber
const& number);
1261template std::string
to_string(storm::ClnRationalNumber
const& value);
1262template uint64_t
numDigits(
const storm::ClnRationalNumber& number);
1263template uint64_t
bitsize(storm::ClnIntegerNumber
const& number);
1266#if defined(STORM_HAVE_GMP)
1268template storm::GmpRationalNumber
one();
1270template storm::GmpRationalNumber
zero();
1272template bool isConstant(storm::GmpRationalNumber
const& value);
1273template bool isPositive(storm::GmpRationalNumber
const& value);
1274template bool isNonNegative(storm::GmpRationalNumber
const& value);
1275template bool isInfinity(storm::GmpRationalNumber
const& value);
1276template bool isNan(storm::GmpRationalNumber
const& value);
1277template bool isAlmostZero(storm::GmpRationalNumber
const& value);
1278template bool isAlmostOne(storm::GmpRationalNumber
const& value);
1279template bool isBetween(storm::GmpRationalNumber
const&, storm::GmpRationalNumber
const&, storm::GmpRationalNumber
const&,
bool);
1280template bool isApproxEqual(storm::GmpRationalNumber
const& a, storm::GmpRationalNumber
const& b, storm::GmpRationalNumber
const& precision,
bool relative);
1282template storm::GmpRationalNumber
convertNumber(storm::GmpRationalNumber
const& number);
1283template storm::GmpRationalNumber
simplify(storm::GmpRationalNumber value);
1284template storm::GmpRationalNumber
minimum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1285template storm::GmpRationalNumber
maximum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1286template storm::GmpRationalNumber
minimum(std::vector<storm::GmpRationalNumber>
const&);
1287template storm::GmpRationalNumber
maximum(std::vector<storm::GmpRationalNumber>
const&);
1288template storm::GmpRationalNumber
max(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1289template storm::GmpRationalNumber
min(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1290template storm::GmpRationalNumber
round(storm::GmpRationalNumber
const& number);
1291template std::string
to_string(storm::GmpRationalNumber
const& value);
1292template uint64_t
numDigits(
const storm::GmpRationalNumber& number);
1293template 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.