21template<
typename ValueType>
26template<
typename ValueType>
31template<
typename ValueType>
33 return std::numeric_limits<ValueType>::infinity();
36template<
typename ValueType>
38 return a == one<ValueType>();
41template<
typename ValueType>
43 return a == zero<ValueType>();
46template<
typename ValueType>
52bool isNan(
double const& value) {
53 return std::isnan(value);
56template<
typename ValueType>
58 return a < convertNumber<ValueType>(1e-12) && a > -convertNumber<ValueType>(1e-12);
61template<
typename ValueType>
63 return a < convertNumber<ValueType>(1.0 + 1e-12) && a > convertNumber<ValueType>(1.0 - 1e-12);
66template<
typename ValueType>
71template<
typename ValueType>
73 return a == infinity<ValueType>();
76template<
typename ValueType>
79 ValueType result = std::modf(number, &iPart);
80 return result == zero<ValueType>();
98template<
typename TargetType,
typename SourceType>
100 return static_cast<TargetType
>(number);
105 return std::llround(number);
110 return std::llround(number);
125 return static_cast<double>(number);
133template<
typename ValueType>
140template<
typename ValueType>
141std::pair<ValueType, ValueType>
minmax(std::vector<ValueType>
const& values) {
142 assert(!values.empty());
143 ValueType
min = values.front();
144 ValueType
max = values.front();
145 for (
auto const& vt : values) {
153 return std::make_pair(
min,
max);
156template<
typename ValueType>
157ValueType
minimum(std::vector<ValueType>
const& values) {
158 assert(!values.empty());
159 ValueType
min = values.front();
160 for (
auto const& vt : values) {
168template<
typename ValueType>
169ValueType
maximum(std::vector<ValueType>
const& values) {
170 assert(!values.empty());
171 ValueType
max = values.front();
172 for (
auto const& vt : values) {
180template<
typename K,
typename ValueType>
181std::pair<ValueType, ValueType>
minmax(std::map<K, ValueType>
const& values) {
182 assert(!values.empty());
183 ValueType
min = values.begin()->second;
184 ValueType
max = values.begin()->second;
185 for (
auto const& vt : values) {
186 if (vt.second <
min) {
189 if (vt.second >
max) {
193 return std::make_pair(
min,
max);
196template<
typename K,
typename ValueType>
197ValueType
minimum(std::map<K, ValueType>
const& values) {
198 return minmax(values).first;
201template<
typename K,
typename ValueType>
202ValueType
maximum(std::map<K, ValueType>
const& values) {
203 return minmax(values).second;
206template<
typename ValueType>
207ValueType
pow(ValueType
const& value, int_fast64_t exponent) {
208 return std::pow(value, exponent);
211template<
typename ValueType>
212ValueType
max(ValueType
const& first, ValueType
const& second) {
213 return std::max(first, second);
216template<
typename ValueType>
217ValueType
min(ValueType
const& first, ValueType
const& second) {
218 return std::min(first, second);
221template<
typename ValueType>
222ValueType
sqrt(ValueType
const& number) {
223 return std::sqrt(number);
226template<
typename ValueType>
227ValueType
abs(ValueType
const& number) {
228 return std::fabs(number);
231template<
typename ValueType>
232ValueType
floor(ValueType
const& number) {
233 return std::floor(number);
236template<
typename ValueType>
237ValueType
ceil(ValueType
const& number) {
238 return std::ceil(number);
241template<
typename ValueType>
242ValueType
round(ValueType
const& number) {
244 return floor<ValueType>(number + storm::utility::convertNumber<ValueType>(0.5));
247template<
typename ValueType>
248ValueType
log(ValueType
const& number) {
249 return std::log(number);
252template<
typename ValueType>
253ValueType
log10(ValueType
const& number) {
254 return std::log10(number);
257template<
typename ValueType>
258ValueType
cos(ValueType
const& number) {
259 return std::cos(number);
262template<
typename ValueType>
263ValueType
sin(ValueType
const& number) {
264 return std::sin(number);
267template<
typename ValueType>
270 ValueType remaining = storm::utility::one<ValueType>() / number;
271 ValueType ten = storm::utility::convertNumber<ValueType>(10);
272 while (remaining >= storm::utility::one<ValueType>()) {
274 remaining = storm::utility::floor<ValueType>(remaining / ten);
279template<
typename ValueType>
284template<
typename IntegerType>
285IntegerType
mod(IntegerType
const& first, IntegerType
const& second) {
286 return std::fmod(first, second);
289template<
typename IntegerType>
290std::pair<IntegerType, IntegerType>
divide(IntegerType
const& dividend, IntegerType
const& divisor) {
291 return std::make_pair(dividend / divisor,
mod(dividend, divisor));
294template<
typename ValueType>
296 std::stringstream ss;
297 ss.precision(std::numeric_limits<ValueType>::max_digits10 + 2);
302#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_CLN)
304storm::ClnRationalNumber
infinity() {
306 return storm::ClnRationalNumber(100000000000);
310bool isOne(storm::ClnRationalNumber
const& a) {
311 return carl::isOne(a);
315bool isZero(storm::ClnRationalNumber
const& a) {
316 return carl::isZero(a);
320bool isInteger(storm::ClnRationalNumber
const& number) {
321 return carl::isInteger(number);
325std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::vector<storm::ClnRationalNumber>
const& values) {
326 assert(!values.empty());
327 storm::ClnRationalNumber
min = values.front();
328 storm::ClnRationalNumber
max = values.front();
329 for (
auto const& vt : values) {
330 if (vt == storm::utility::infinity<storm::ClnRationalNumber>()) {
341 return std::make_pair(
min,
max);
345uint_fast64_t
convertNumber(ClnRationalNumber
const& number) {
346 return carl::toInt<carl::uint>(number);
351 return carl::toInt<carl::sint>(number);
356 return carl::rationalize<ClnRationalNumber>(number);
361 return carl::rationalize<ClnRationalNumber>(number);
365ClnRationalNumber
convertNumber(NumberTraits<ClnRationalNumber>::IntegerType
const& number) {
366 return ClnRationalNumber(number);
370ClnRationalNumber
convertNumber(uint_fast64_t
const& number) {
371 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
372 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::uint
>(number));
376typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
377 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
378 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
382typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(
double const& number) {
383 if (number <
static_cast<double>(std::numeric_limits<uint64_t>::max())) {
384 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<uint64_t
>(number));
386 return carl::round(carl::rationalize<ClnRationalNumber>(number));
392 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
393 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::sint
>(number));
398 return carl::toDouble(number);
403 ClnRationalNumber result;
404 if (carl::try_parse<ClnRationalNumber>(number, result)) {
407 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
411std::pair<ClnRationalNumber, ClnRationalNumber>
asFraction(ClnRationalNumber
const& number) {
412 return std::make_pair(carl::getNum(number), carl::getDenom(number));
416ClnRationalNumber
sqrt(ClnRationalNumber
const& number) {
417 return carl::sqrt(number);
421ClnRationalNumber
abs(storm::ClnRationalNumber
const& number) {
422 return carl::abs(number);
426ClnRationalNumber
floor(storm::ClnRationalNumber
const& number) {
427 return carl::floor(number);
431ClnRationalNumber
ceil(storm::ClnRationalNumber
const& number) {
432 return carl::ceil(number);
436ClnRationalNumber
log(ClnRationalNumber
const& number) {
437 return carl::log(number);
441ClnRationalNumber
log10(ClnRationalNumber
const& number) {
442 return carl::log10(number);
446ClnRationalNumber
cos(ClnRationalNumber
const& number) {
447 return carl::cos(number);
451ClnRationalNumber
sin(ClnRationalNumber
const& number) {
452 return carl::sin(number);
456typename NumberTraits<ClnRationalNumber>::IntegerType
trunc(ClnRationalNumber
const& number) {
457 return cln::truncate1(number);
461typename NumberTraits<ClnRationalNumber>::IntegerType
mod(NumberTraits<ClnRationalNumber>::IntegerType
const& first,
462 NumberTraits<ClnRationalNumber>::IntegerType
const& second) {
463 return carl::mod(first, second);
467std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType>
divide(
468 typename NumberTraits<ClnRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<ClnRationalNumber>::IntegerType
const& divisor) {
469 std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType> result;
470 carl::divide(dividend, divisor, result.first, result.second);
475typename NumberTraits<ClnRationalNumber>::IntegerType
pow(
typename NumberTraits<ClnRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
476 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
477 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
478 return carl::pow(value, exponent);
482ClnRationalNumber
pow(ClnRationalNumber
const& value, int_fast64_t exponent) {
484 return carl::pow(value, exponent);
486 return storm::utility::one<ClnRationalNumber>() / carl::pow(value, -exponent);
491NumberTraits<ClnRationalNumber>::IntegerType
numerator(ClnRationalNumber
const& number) {
492 return carl::getNum(number);
496NumberTraits<ClnRationalNumber>::IntegerType
denominator(ClnRationalNumber
const& number) {
497 return carl::getDenom(number);
501#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_GMP)
503storm::GmpRationalNumber
infinity() {
505 return storm::GmpRationalNumber(100000000000);
509bool isOne(storm::GmpRationalNumber
const& a) {
510 return carl::isOne(a);
514bool isZero(storm::GmpRationalNumber
const& a) {
515 return carl::isZero(a);
519bool isInteger(storm::GmpRationalNumber
const& number) {
520 return carl::isInteger(number);
524std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::vector<storm::GmpRationalNumber>
const& values) {
525 assert(!values.empty());
526 storm::GmpRationalNumber
min = values.front();
527 storm::GmpRationalNumber
max = values.front();
528 for (
auto const& vt : values) {
529 if (vt == storm::utility::infinity<storm::GmpRationalNumber>()) {
540 return std::make_pair(
min,
max);
544std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::map<uint64_t, storm::GmpRationalNumber>
const& values) {
545 assert(!values.empty());
546 storm::GmpRationalNumber
min = values.begin()->second;
547 storm::GmpRationalNumber
max = values.begin()->second;
548 for (
auto const& vt : values) {
549 if (vt.second == storm::utility::infinity<storm::GmpRationalNumber>()) {
552 if (vt.second <
min) {
555 if (vt.second >
max) {
560 return std::make_pair(
min,
max);
564uint_fast64_t
convertNumber(GmpRationalNumber
const& number) {
565 return carl::toInt<carl::uint>(number);
570 return carl::toInt<carl::sint>(number);
575 return carl::rationalize<GmpRationalNumber>(number);
580 return carl::rationalize<GmpRationalNumber>(number);
584GmpRationalNumber
convertNumber(uint_fast64_t
const& number) {
585 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
586 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::uint
>(number));
590GmpRationalNumber
convertNumber(NumberTraits<GmpRationalNumber>::IntegerType
const& number) {
591 return GmpRationalNumber(number);
595typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
596 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
597 return NumberTraits<GmpRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
601typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(
double const& number) {
602 return NumberTraits<GmpRationalNumber>::IntegerType(number);
607 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
608 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::sint
>(number));
613 return carl::toDouble(number);
618 GmpRationalNumber result;
619 if (carl::try_parse<GmpRationalNumber>(number, result)) {
622 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
626std::pair<GmpRationalNumber, GmpRationalNumber>
asFraction(GmpRationalNumber
const& number) {
627 return std::make_pair(carl::getNum(number), carl::getDenom(number));
631GmpRationalNumber
sqrt(GmpRationalNumber
const& number) {
632 return carl::sqrt(number);
636GmpRationalNumber
abs(storm::GmpRationalNumber
const& number) {
637 return carl::abs(number);
641GmpRationalNumber
floor(storm::GmpRationalNumber
const& number) {
642 return carl::floor(number);
646GmpRationalNumber
ceil(storm::GmpRationalNumber
const& number) {
647 return carl::ceil(number);
651GmpRationalNumber
log(GmpRationalNumber
const& number) {
652 return carl::log(number);
656GmpRationalNumber
log10(GmpRationalNumber
const& number) {
657 STORM_LOG_WARN(
"Using log10 for GMP rational numbers is not exact, it converts to doubles internally! Avoid if possible.");
658 return carl::log10(number);
662GmpRationalNumber
cos(GmpRationalNumber
const& number) {
663 return carl::cos(number);
667GmpRationalNumber
sin(GmpRationalNumber
const& number) {
668 return carl::sin(number);
672typename NumberTraits<GmpRationalNumber>::IntegerType
trunc(GmpRationalNumber
const& number) {
673 return carl::getNum(number) / carl::getDenom(number);
677typename NumberTraits<GmpRationalNumber>::IntegerType
mod(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& first,
678 typename NumberTraits<GmpRationalNumber>::IntegerType
const& second) {
679 return carl::mod(first, second);
683std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType>
divide(
684 typename NumberTraits<GmpRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<GmpRationalNumber>::IntegerType
const& divisor) {
685 std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType> result;
686 carl::divide(dividend, divisor, result.first, result.second);
691typename NumberTraits<GmpRationalNumber>::IntegerType
pow(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
692 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
693 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
694 return carl::pow(value, exponent);
698GmpRationalNumber
pow(GmpRationalNumber
const& value, int_fast64_t exponent) {
700 return carl::pow(value, exponent);
702 return storm::utility::one<GmpRationalNumber>() / carl::pow(value, -exponent);
707typename NumberTraits<GmpRationalNumber>::IntegerType
numerator(GmpRationalNumber
const& number) {
708 return carl::getNum(number);
712typename NumberTraits<GmpRationalNumber>::IntegerType
denominator(GmpRationalNumber
const& number) {
713 return carl::getDenom(number);
717#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
719storm::GmpRationalNumber
convertNumber(storm::ClnRationalNumber
const& number) {
720 return carl::parse<storm::GmpRationalNumber>(
to_string(number));
724storm::ClnRationalNumber
convertNumber(storm::GmpRationalNumber
const& number) {
725 return carl::parse<storm::ClnRationalNumber>(
to_string(number));
729#ifdef STORM_HAVE_CARL
758 return a.isConstant();
763 return a.isConstant();
768 return a.isPointInterval();
774 return a == infinity<storm::RationalFunction>();
784 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(number));
789 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
790 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(
static_cast<carl::sint
>(number)));
793#if defined(STORM_HAVE_CLN)
796 return RationalFunction(convertNumber<storm::RationalFunctionCoefficient>(number));
801 storm::RationalFunctionCoefficient tmp = number.nominatorAsNumber() / number.denominatorAsNumber();
802 return convertNumber<ClnRationalNumber>(tmp);
806#if defined(STORM_HAVE_GMP)
809 return RationalFunction(convertNumber<storm::RationalFunctionCoefficient>(number));
814 return convertNumber<GmpRationalNumber>(number.nominatorAsNumber() / number.denominatorAsNumber());
820 return carl::toInt<carl::uint>(convertNumber<RationalFunctionCoefficient>(func));
825 return carl::toInt<carl::sint>(convertNumber<RationalFunctionCoefficient>(func));
830 return carl::toDouble(convertNumber<RationalFunctionCoefficient>(func));
840 return RationalFunction(convertNumber<RationalFunctionCoefficient>(number));
845 return RationalFunction(convertNumber<RationalFunctionCoefficient>(number));
869 return std::move(value);
874 return a.isConstant() &&
isAlmostZero(convertNumber<RationalFunctionCoefficient>(a));
879 return a.isConstant() &&
isAlmostOne(convertNumber<RationalFunctionCoefficient>(a));
883std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::vector<storm::RationalFunction>
const&) {
884 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum/maximum for rational functions is not defined.");
889 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
894 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined.");
898std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::map<uint64_t, storm::RationalFunction>
const&) {
899 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum/maximum for rational functions is not defined.");
904 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
909 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined");
915 return carl::pow(value, exponent);
917 return storm::utility::one<RationalFunction>() / carl::pow(value, -exponent);
923 std::stringstream ss;
924 if (f.isConstant()) {
925 if (f.denominator().isOne()) {
926 ss << f.nominatorAsNumber();
928 ss << f.nominatorAsNumber() <<
"/" << f.denominatorAsNumber();
930 }
else if (f.denominator().isOne()) {
931 ss << f.nominatorAsPolynomial().coefficient() * f.nominatorAsPolynomial().polynomial();
933 ss <<
"(" << f.nominatorAsPolynomial() <<
")/(" << f.denominatorAsPolynomial() <<
")";
942 return convertNumber<double>(convertNumber<storm::RationalNumber>(value));
955#if defined(STORM_HAVE_GMP)
963 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
964 return convertNumber<storm::GmpRationalNumber>(number.lower());
968#if defined(STORM_HAVE_CLN)
976 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
977 return convertNumber<storm::ClnRationalNumber>(number.lower());
983 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
984 return number.lower();
989 return interval.abs();
998template bool isOne(
double const& value);
999template bool isZero(
double const& value);
1006template std::pair<double, double>
minmax(std::vector<double>
const&);
1007template double minimum(std::vector<double>
const&);
1008template double maximum(std::vector<double>
const&);
1009template std::pair<double, double>
minmax(std::map<uint64_t, double>
const&);
1010template double minimum(std::map<uint64_t, double>
const&);
1011template double maximum(std::map<uint64_t, double>
const&);
1012template double pow(
double const& value, int_fast64_t exponent);
1013template double max(
double const& first,
double const& second);
1014template double min(
double const& first,
double const& second);
1015template double sqrt(
double const& number);
1016template double abs(
double const& number);
1017template double floor(
double const& number);
1018template double ceil(
double const& number);
1019template double round(
double const& number);
1020template double log(
double const& number);
1021template double log10(
double const& number);
1022template double cos(
double const& number);
1023template double sin(
double const& number);
1025template double mod(
double const& first,
double const& second);
1038template uint32_t
one();
1039template uint32_t
zero();
1041template bool isOne(uint32_t
const& value);
1059#if defined(STORM_HAVE_CLN)
1061template storm::ClnRationalNumber
one();
1063template storm::ClnRationalNumber
zero();
1065template bool isConstant(storm::ClnRationalNumber
const& value);
1066template bool isInfinity(storm::ClnRationalNumber
const& value);
1067template bool isNan(storm::ClnRationalNumber
const& value);
1068template bool isAlmostZero(storm::ClnRationalNumber
const& value);
1069template bool isAlmostOne(storm::ClnRationalNumber
const& value);
1071template storm::ClnRationalNumber
convertNumber(storm::ClnRationalNumber
const& number);
1072template storm::ClnRationalNumber
simplify(storm::ClnRationalNumber value);
1073template std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1074template storm::ClnRationalNumber
minimum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1075template storm::ClnRationalNumber
maximum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1076template storm::ClnRationalNumber
minimum(std::vector<storm::ClnRationalNumber>
const&);
1077template storm::ClnRationalNumber
maximum(std::vector<storm::ClnRationalNumber>
const&);
1078template storm::ClnRationalNumber
max(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1079template storm::ClnRationalNumber
min(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1080template storm::ClnRationalNumber
round(storm::ClnRationalNumber
const& number);
1081template std::string
to_string(storm::ClnRationalNumber
const& value);
1082template uint64_t
numDigits(
const storm::ClnRationalNumber& number);
1085#if defined(STORM_HAVE_GMP)
1087template storm::GmpRationalNumber
one();
1089template storm::GmpRationalNumber
zero();
1091template bool isConstant(storm::GmpRationalNumber
const& value);
1092template bool isInfinity(storm::GmpRationalNumber
const& value);
1093template bool isNan(storm::GmpRationalNumber
const& value);
1094template bool isAlmostZero(storm::GmpRationalNumber
const& value);
1095template bool isAlmostOne(storm::GmpRationalNumber
const& value);
1097template storm::GmpRationalNumber
convertNumber(storm::GmpRationalNumber
const& number);
1098template storm::GmpRationalNumber
simplify(storm::GmpRationalNumber value);
1099template storm::GmpRationalNumber
minimum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1100template storm::GmpRationalNumber
maximum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1101template storm::GmpRationalNumber
minimum(std::vector<storm::GmpRationalNumber>
const&);
1102template storm::GmpRationalNumber
maximum(std::vector<storm::GmpRationalNumber>
const&);
1103template storm::GmpRationalNumber
max(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1104template storm::GmpRationalNumber
min(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1105template storm::GmpRationalNumber
round(storm::GmpRationalNumber
const& number);
1106template std::string
to_string(storm::GmpRationalNumber
const& value);
1107template uint64_t
numDigits(
const storm::GmpRationalNumber& number);
1110#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
1113#ifdef STORM_HAVE_CARL
#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 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)
ValueType min(ValueType const &first, ValueType const &second)
ValueType sin(ValueType const &number)
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)
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