20template<
typename ValueType>
25template<
typename ValueType>
30template<
typename ValueType>
32 return std::numeric_limits<ValueType>::infinity();
35template<
typename ValueType>
37 return a == one<ValueType>();
40template<
typename ValueType>
42 return a == zero<ValueType>();
45template<
typename ValueType>
51bool isNan(
double const& value) {
52 return std::isnan(value);
55template<
typename ValueType>
57 return a < convertNumber<ValueType>(1e-12) && a > -convertNumber<ValueType>(1e-12);
60template<
typename ValueType>
62 return a < convertNumber<ValueType>(1.0 + 1e-12) && a > convertNumber<ValueType>(1.0 - 1e-12);
65template<
typename ValueType>
70template<
typename ValueType>
72 return a == infinity<ValueType>();
75template<
typename ValueType>
78 ValueType result = std::modf(number, &iPart);
79 return result == zero<ValueType>();
97template<
typename TargetType,
typename SourceType>
99 return static_cast<TargetType
>(number);
104 return std::llround(number);
109 return std::llround(number);
124 return static_cast<double>(number);
132template<
typename ValueType>
139template<
typename ValueType>
140std::pair<ValueType, ValueType>
minmax(std::vector<ValueType>
const& values) {
141 assert(!values.empty());
142 ValueType
min = values.front();
143 ValueType
max = values.front();
144 for (
auto const& vt : values) {
152 return std::make_pair(
min,
max);
155template<
typename ValueType>
156ValueType
minimum(std::vector<ValueType>
const& values) {
157 assert(!values.empty());
158 ValueType
min = values.front();
159 for (
auto const& vt : values) {
167template<
typename ValueType>
168ValueType
maximum(std::vector<ValueType>
const& values) {
169 assert(!values.empty());
170 ValueType
max = values.front();
171 for (
auto const& vt : values) {
179template<
typename K,
typename ValueType>
180std::pair<ValueType, ValueType>
minmax(std::map<K, ValueType>
const& values) {
181 assert(!values.empty());
182 ValueType
min = values.begin()->second;
183 ValueType
max = values.begin()->second;
184 for (
auto const& vt : values) {
185 if (vt.second <
min) {
188 if (vt.second >
max) {
192 return std::make_pair(
min,
max);
195template<
typename K,
typename ValueType>
196ValueType
minimum(std::map<K, ValueType>
const& values) {
197 return minmax(values).first;
200template<
typename K,
typename ValueType>
201ValueType
maximum(std::map<K, ValueType>
const& values) {
202 return minmax(values).second;
205template<
typename ValueType>
206ValueType
pow(ValueType
const& value, int_fast64_t exponent) {
207 return std::pow(value, exponent);
210template<
typename ValueType>
211ValueType
max(ValueType
const& first, ValueType
const& second) {
212 return std::max(first, second);
215template<
typename ValueType>
216ValueType
min(ValueType
const& first, ValueType
const& second) {
217 return std::min(first, second);
220template<
typename ValueType>
221ValueType
sqrt(ValueType
const& number) {
222 return std::sqrt(number);
225template<
typename ValueType>
226ValueType
abs(ValueType
const& number) {
227 return std::fabs(number);
230template<
typename ValueType>
231ValueType
floor(ValueType
const& number) {
232 return std::floor(number);
235template<
typename ValueType>
236ValueType
ceil(ValueType
const& number) {
237 return std::ceil(number);
240template<
typename ValueType>
241ValueType
round(ValueType
const& number) {
243 return floor<ValueType>(number + storm::utility::convertNumber<ValueType>(0.5));
246template<
typename ValueType>
247ValueType
log(ValueType
const& number) {
248 return std::log(number);
251template<
typename ValueType>
252ValueType
log10(ValueType
const& number) {
253 return std::log10(number);
256template<
typename ValueType>
257ValueType
cos(ValueType
const& number) {
258 return std::cos(number);
261template<
typename ValueType>
262ValueType
sin(ValueType
const& number) {
263 return std::sin(number);
266template<
typename ValueType>
271template<
typename IntegerType>
272IntegerType
mod(IntegerType
const& first, IntegerType
const& second) {
273 return std::fmod(first, second);
276template<
typename IntegerType>
277std::pair<IntegerType, IntegerType>
divide(IntegerType
const& dividend, IntegerType
const& divisor) {
278 return std::make_pair(dividend / divisor,
mod(dividend, divisor));
281template<
typename ValueType>
283 std::stringstream ss;
284 ss.precision(std::numeric_limits<ValueType>::max_digits10 + 2);
289#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_CLN)
291storm::ClnRationalNumber
infinity() {
293 return storm::ClnRationalNumber(100000000000);
297bool isOne(storm::ClnRationalNumber
const& a) {
298 return carl::isOne(a);
302bool isZero(storm::ClnRationalNumber
const& a) {
303 return carl::isZero(a);
307bool isInteger(storm::ClnRationalNumber
const& number) {
308 return carl::isInteger(number);
312std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::vector<storm::ClnRationalNumber>
const& values) {
313 assert(!values.empty());
314 storm::ClnRationalNumber
min = values.front();
315 storm::ClnRationalNumber
max = values.front();
316 for (
auto const& vt : values) {
317 if (vt == storm::utility::infinity<storm::ClnRationalNumber>()) {
328 return std::make_pair(
min,
max);
332uint_fast64_t
convertNumber(ClnRationalNumber
const& number) {
333 return carl::toInt<carl::uint>(number);
338 return carl::toInt<carl::sint>(number);
343 return carl::rationalize<ClnRationalNumber>(number);
348 return carl::rationalize<ClnRationalNumber>(number);
352ClnRationalNumber
convertNumber(NumberTraits<ClnRationalNumber>::IntegerType
const& number) {
353 return ClnRationalNumber(number);
357ClnRationalNumber
convertNumber(uint_fast64_t
const& number) {
358 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
359 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::uint
>(number));
363typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
364 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
365 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
369typename NumberTraits<ClnRationalNumber>::IntegerType
convertNumber(
double const& number) {
370 if (number <
static_cast<double>(std::numeric_limits<uint64_t>::max())) {
371 return NumberTraits<ClnRationalNumber>::IntegerType(
static_cast<uint64_t
>(number));
373 return carl::round(carl::rationalize<ClnRationalNumber>(number));
379 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
380 return carl::rationalize<ClnRationalNumber>(
static_cast<carl::sint
>(number));
385 return carl::toDouble(number);
390 ClnRationalNumber result;
391 if (carl::try_parse<ClnRationalNumber>(number, result)) {
394 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
398std::pair<ClnRationalNumber, ClnRationalNumber>
asFraction(ClnRationalNumber
const& number) {
399 return std::make_pair(carl::getNum(number), carl::getDenom(number));
403ClnRationalNumber
sqrt(ClnRationalNumber
const& number) {
404 return carl::sqrt(number);
408ClnRationalNumber
abs(storm::ClnRationalNumber
const& number) {
409 return carl::abs(number);
413ClnRationalNumber
floor(storm::ClnRationalNumber
const& number) {
414 return carl::floor(number);
418ClnRationalNumber
ceil(storm::ClnRationalNumber
const& number) {
419 return carl::ceil(number);
423ClnRationalNumber
log(ClnRationalNumber
const& number) {
424 return carl::log(number);
428ClnRationalNumber
log10(ClnRationalNumber
const& number) {
429 return carl::log10(number);
433ClnRationalNumber
cos(ClnRationalNumber
const& number) {
434 return carl::cos(number);
438ClnRationalNumber
sin(ClnRationalNumber
const& number) {
439 return carl::sin(number);
443typename NumberTraits<ClnRationalNumber>::IntegerType
trunc(ClnRationalNumber
const& number) {
444 return cln::truncate1(number);
448typename NumberTraits<ClnRationalNumber>::IntegerType
mod(NumberTraits<ClnRationalNumber>::IntegerType
const& first,
449 NumberTraits<ClnRationalNumber>::IntegerType
const& second) {
450 return carl::mod(first, second);
454std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType>
divide(
455 typename NumberTraits<ClnRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<ClnRationalNumber>::IntegerType
const& divisor) {
456 std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType,
typename NumberTraits<ClnRationalNumber>::IntegerType> result;
457 carl::divide(dividend, divisor, result.first, result.second);
462typename NumberTraits<ClnRationalNumber>::IntegerType
pow(
typename NumberTraits<ClnRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
463 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
464 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
465 return carl::pow(value, exponent);
469ClnRationalNumber
pow(ClnRationalNumber
const& value, int_fast64_t exponent) {
471 return carl::pow(value, exponent);
473 return storm::utility::one<ClnRationalNumber>() / carl::pow(value, -exponent);
478NumberTraits<ClnRationalNumber>::IntegerType
numerator(ClnRationalNumber
const& number) {
479 return carl::getNum(number);
483NumberTraits<ClnRationalNumber>::IntegerType
denominator(ClnRationalNumber
const& number) {
484 return carl::getDenom(number);
488#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_GMP)
490storm::GmpRationalNumber
infinity() {
492 return storm::GmpRationalNumber(100000000000);
496bool isOne(storm::GmpRationalNumber
const& a) {
497 return carl::isOne(a);
501bool isZero(storm::GmpRationalNumber
const& a) {
502 return carl::isZero(a);
506bool isInteger(storm::GmpRationalNumber
const& number) {
507 return carl::isInteger(number);
511std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::vector<storm::GmpRationalNumber>
const& values) {
512 assert(!values.empty());
513 storm::GmpRationalNumber
min = values.front();
514 storm::GmpRationalNumber
max = values.front();
515 for (
auto const& vt : values) {
516 if (vt == storm::utility::infinity<storm::GmpRationalNumber>()) {
527 return std::make_pair(
min,
max);
531std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber>
minmax(std::map<uint64_t, storm::GmpRationalNumber>
const& values) {
532 assert(!values.empty());
533 storm::GmpRationalNumber
min = values.begin()->second;
534 storm::GmpRationalNumber
max = values.begin()->second;
535 for (
auto const& vt : values) {
536 if (vt.second == storm::utility::infinity<storm::GmpRationalNumber>()) {
539 if (vt.second <
min) {
542 if (vt.second >
max) {
547 return std::make_pair(
min,
max);
551uint_fast64_t
convertNumber(GmpRationalNumber
const& number) {
552 return carl::toInt<carl::uint>(number);
557 return carl::toInt<carl::sint>(number);
562 return carl::rationalize<GmpRationalNumber>(number);
567 return carl::rationalize<GmpRationalNumber>(number);
571GmpRationalNumber
convertNumber(uint_fast64_t
const& number) {
572 STORM_LOG_ASSERT(
static_cast<carl::uint
>(number) == number,
"Rationalizing failed, because the number is too large.");
573 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::uint
>(number));
577GmpRationalNumber
convertNumber(NumberTraits<GmpRationalNumber>::IntegerType
const& number) {
578 return GmpRationalNumber(number);
582typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(uint_fast64_t
const& number) {
583 STORM_LOG_ASSERT(
static_cast<unsigned long int>(number) == number,
"Conversion failed, because the number is too large.");
584 return NumberTraits<GmpRationalNumber>::IntegerType(
static_cast<unsigned long int>(number));
588typename NumberTraits<GmpRationalNumber>::IntegerType
convertNumber(
double const& number) {
589 return NumberTraits<GmpRationalNumber>::IntegerType(number);
594 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
595 return carl::rationalize<GmpRationalNumber>(
static_cast<carl::sint
>(number));
600 return carl::toDouble(number);
605 GmpRationalNumber result;
606 if (carl::try_parse<GmpRationalNumber>(number, result)) {
609 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Unable to parse '" << number <<
"' as a rational number.");
613std::pair<GmpRationalNumber, GmpRationalNumber>
asFraction(GmpRationalNumber
const& number) {
614 return std::make_pair(carl::getNum(number), carl::getDenom(number));
618GmpRationalNumber
sqrt(GmpRationalNumber
const& number) {
619 return carl::sqrt(number);
623GmpRationalNumber
abs(storm::GmpRationalNumber
const& number) {
624 return carl::abs(number);
628GmpRationalNumber
floor(storm::GmpRationalNumber
const& number) {
629 return carl::floor(number);
633GmpRationalNumber
ceil(storm::GmpRationalNumber
const& number) {
634 return carl::ceil(number);
638GmpRationalNumber
log(GmpRationalNumber
const& number) {
639 return carl::log(number);
643GmpRationalNumber
log10(GmpRationalNumber
const& number) {
644 return carl::log10(number);
648GmpRationalNumber
cos(GmpRationalNumber
const& number) {
649 return carl::cos(number);
653GmpRationalNumber
sin(GmpRationalNumber
const& number) {
654 return carl::sin(number);
658typename NumberTraits<GmpRationalNumber>::IntegerType
trunc(GmpRationalNumber
const& number) {
659 return carl::getNum(number) / carl::getDenom(number);
663typename NumberTraits<GmpRationalNumber>::IntegerType
mod(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& first,
664 typename NumberTraits<GmpRationalNumber>::IntegerType
const& second) {
665 return carl::mod(first, second);
669std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType>
divide(
670 typename NumberTraits<GmpRationalNumber>::IntegerType
const& dividend,
typename NumberTraits<GmpRationalNumber>::IntegerType
const& divisor) {
671 std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType,
typename NumberTraits<GmpRationalNumber>::IntegerType> result;
672 carl::divide(dividend, divisor, result.first, result.second);
677typename NumberTraits<GmpRationalNumber>::IntegerType
pow(
typename NumberTraits<GmpRationalNumber>::IntegerType
const& value, int_fast64_t exponent) {
678 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
679 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
680 return carl::pow(value, exponent);
684GmpRationalNumber
pow(GmpRationalNumber
const& value, int_fast64_t exponent) {
686 return carl::pow(value, exponent);
688 return storm::utility::one<GmpRationalNumber>() / carl::pow(value, -exponent);
693typename NumberTraits<GmpRationalNumber>::IntegerType
numerator(GmpRationalNumber
const& number) {
694 return carl::getNum(number);
698typename NumberTraits<GmpRationalNumber>::IntegerType
denominator(GmpRationalNumber
const& number) {
699 return carl::getDenom(number);
703#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
705storm::GmpRationalNumber
convertNumber(storm::ClnRationalNumber
const& number) {
706 return carl::parse<storm::GmpRationalNumber>(
to_string(number));
710storm::ClnRationalNumber
convertNumber(storm::GmpRationalNumber
const& number) {
711 return carl::parse<storm::ClnRationalNumber>(
to_string(number));
715#ifdef STORM_HAVE_CARL
744 return a.isConstant();
749 return a.isConstant();
754 return a.isPointInterval();
760 return a == infinity<storm::RationalFunction>();
770 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(number));
775 STORM_LOG_ASSERT(
static_cast<carl::sint
>(number) == number,
"Rationalizing failed, because the number is too large.");
776 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(
static_cast<carl::sint
>(number)));
779#if defined(STORM_HAVE_CLN)
782 return RationalFunction(convertNumber<storm::RationalFunctionCoefficient>(number));
787 storm::RationalFunctionCoefficient tmp = number.nominatorAsNumber() / number.denominatorAsNumber();
788 return convertNumber<ClnRationalNumber>(tmp);
792#if defined(STORM_HAVE_GMP)
795 return RationalFunction(convertNumber<storm::RationalFunctionCoefficient>(number));
800 return convertNumber<GmpRationalNumber>(number.nominatorAsNumber() / number.denominatorAsNumber());
806 return carl::toInt<carl::uint>(convertNumber<RationalFunctionCoefficient>(func));
811 return carl::toInt<carl::sint>(convertNumber<RationalFunctionCoefficient>(func));
816 return carl::toDouble(convertNumber<RationalFunctionCoefficient>(func));
826 return RationalFunction(convertNumber<RationalFunctionCoefficient>(number));
831 return RationalFunction(convertNumber<RationalFunctionCoefficient>(number));
855 return std::move(value);
860 return a.isConstant() &&
isAlmostZero(convertNumber<RationalFunctionCoefficient>(a));
865 return a.isConstant() &&
isAlmostOne(convertNumber<RationalFunctionCoefficient>(a));
869std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::vector<storm::RationalFunction>
const&) {
870 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum/maximum for rational functions is not defined.");
875 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
880 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined.");
884std::pair<storm::RationalFunction, storm::RationalFunction>
minmax(std::map<uint64_t, storm::RationalFunction>
const&) {
885 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum/maximum for rational functions is not defined.");
890 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Minimum for rational functions is not defined.");
895 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Maximum for rational functions is not defined");
901 return carl::pow(value, exponent);
903 return storm::utility::one<RationalFunction>() / carl::pow(value, -exponent);
909 std::stringstream ss;
910 if (f.isConstant()) {
911 if (f.denominator().isOne()) {
912 ss << f.nominatorAsNumber();
914 ss << f.nominatorAsNumber() <<
"/" << f.denominatorAsNumber();
916 }
else if (f.denominator().isOne()) {
917 ss << f.nominatorAsPolynomial().coefficient() * f.nominatorAsPolynomial().polynomial();
919 ss <<
"(" << f.nominatorAsPolynomial() <<
")/(" << f.denominatorAsPolynomial() <<
")";
928 return convertNumber<double>(convertNumber<storm::RationalNumber>(value));
943 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
944 return convertNumber<storm::RationalNumber>(number.lower());
949 STORM_LOG_ASSERT(number.isPointInterval(),
"Interval must be a point interval to convert");
950 return number.lower();
955 return interval.abs();
964template bool isOne(
double const& value);
965template bool isZero(
double const& value);
972template std::pair<double, double>
minmax(std::vector<double>
const&);
973template double minimum(std::vector<double>
const&);
974template double maximum(std::vector<double>
const&);
975template std::pair<double, double>
minmax(std::map<uint64_t, double>
const&);
976template double minimum(std::map<uint64_t, double>
const&);
977template double maximum(std::map<uint64_t, double>
const&);
978template double pow(
double const& value, int_fast64_t exponent);
979template double max(
double const& first,
double const& second);
980template double min(
double const& first,
double const& second);
981template double sqrt(
double const& number);
982template double abs(
double const& number);
983template double floor(
double const& number);
984template double ceil(
double const& number);
985template double round(
double const& number);
986template double log(
double const& number);
987template double log10(
double const& number);
988template double cos(
double const& number);
989template double sin(
double const& number);
991template double mod(
double const& first,
double const& second);
998template bool isOne(
int const& value);
1004template uint32_t
one();
1005template uint32_t
zero();
1007template bool isOne(uint32_t
const& value);
1025#if defined(STORM_HAVE_CLN)
1027template storm::ClnRationalNumber
one();
1029template storm::ClnRationalNumber
zero();
1031template bool isConstant(storm::ClnRationalNumber
const& value);
1032template bool isInfinity(storm::ClnRationalNumber
const& value);
1033template bool isNan(storm::ClnRationalNumber
const& value);
1034template bool isAlmostZero(storm::ClnRationalNumber
const& value);
1035template bool isAlmostOne(storm::ClnRationalNumber
const& value);
1037template storm::ClnRationalNumber
convertNumber(storm::ClnRationalNumber
const& number);
1038template storm::ClnRationalNumber
simplify(storm::ClnRationalNumber value);
1039template std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber>
minmax(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1040template storm::ClnRationalNumber
minimum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1041template storm::ClnRationalNumber
maximum(std::map<uint64_t, storm::ClnRationalNumber>
const&);
1042template storm::ClnRationalNumber
minimum(std::vector<storm::ClnRationalNumber>
const&);
1043template storm::ClnRationalNumber
maximum(std::vector<storm::ClnRationalNumber>
const&);
1044template storm::ClnRationalNumber
max(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1045template storm::ClnRationalNumber
min(storm::ClnRationalNumber
const& first, storm::ClnRationalNumber
const& second);
1046template storm::ClnRationalNumber
round(storm::ClnRationalNumber
const& number);
1047template std::string
to_string(storm::ClnRationalNumber
const& value);
1050#if defined(STORM_HAVE_GMP)
1052template storm::GmpRationalNumber
one();
1054template storm::GmpRationalNumber
zero();
1056template bool isConstant(storm::GmpRationalNumber
const& value);
1057template bool isInfinity(storm::GmpRationalNumber
const& value);
1058template bool isNan(storm::GmpRationalNumber
const& value);
1059template bool isAlmostZero(storm::GmpRationalNumber
const& value);
1060template bool isAlmostOne(storm::GmpRationalNumber
const& value);
1062template storm::GmpRationalNumber
convertNumber(storm::GmpRationalNumber
const& number);
1063template storm::GmpRationalNumber
simplify(storm::GmpRationalNumber value);
1064template storm::GmpRationalNumber
minimum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1065template storm::GmpRationalNumber
maximum(std::map<uint64_t, storm::GmpRationalNumber>
const&);
1066template storm::GmpRationalNumber
minimum(std::vector<storm::GmpRationalNumber>
const&);
1067template storm::GmpRationalNumber
maximum(std::vector<storm::GmpRationalNumber>
const&);
1068template storm::GmpRationalNumber
max(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1069template storm::GmpRationalNumber
min(storm::GmpRationalNumber
const& first, storm::GmpRationalNumber
const& second);
1070template storm::GmpRationalNumber
round(storm::GmpRationalNumber
const& number);
1071template std::string
to_string(storm::GmpRationalNumber
const& value);
1074#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
1077#ifdef STORM_HAVE_CARL
#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)
bool isInfinity(ValueType const &a)
ValueType log10(ValueType const &number)
ValueType round(ValueType const &number)
TargetType convertNumber(SourceType const &number)
carl::Interval< double > Interval
carl::RationalFunction< Polynomial, true > RationalFunction