#include "src/utility/ConstantsComparator.h" #include "src/storage/sparse/StateType.h" namespace storm { namespace utility { template ValueType one() { return ValueType(1); } template ValueType zero() { return ValueType(0); } template ValueType infinity() { return std::numeric_limits::infinity(); } template<> double simplify(double value) { // In the general case, we don't to anything here, but merely return the value. If something else is // supposed to happen here, the templated function can be specialized for this particular type. return value; } template bool ConstantsComparator::isOne(ValueType const& value) const { return value == one(); } template bool ConstantsComparator::isZero(ValueType const& value) const { return value == zero(); } template bool ConstantsComparator::isEqual(ValueType const& value1, ValueType const& value2) const { return value1 == value2; } ConstantsComparator::ConstantsComparator() : precision(storm::settings::generalSettings().getPrecision()) { // Intentionally left empty. } ConstantsComparator::ConstantsComparator(double precision) : precision(precision) { // Intentionally left empty. } bool ConstantsComparator::isOne(double const& value) const { return std::abs(value - one()) <= precision; } bool ConstantsComparator::isZero(double const& value) const { return std::abs(value) <= precision; } bool ConstantsComparator::isEqual(double const& value1, double const& value2) const { return std::abs(value1 - value2) <= precision; } bool ConstantsComparator::isConstant(double const& value) const { return true; } #ifdef PARAMETRIC_SYSTEMS template<> RationalFunction simplify(RationalFunction value) { value.simplify(); return value; } template<> RationalFunction& simplify(RationalFunction& value) { value.simplify(); return value; } template<> RationalFunction&& simplify(RationalFunction&& value) { value.simplify(); return std::move(value); } bool ConstantsComparator::isOne(storm::RationalFunction const& value) const { return value.isOne(); } bool ConstantsComparator::isZero(storm::RationalFunction const& value) const { return value.isZero(); } bool ConstantsComparator::isEqual(storm::RationalFunction const& value1, storm::RationalFunction const& value2) const { return value1 == value2; } bool ConstantsComparator::isConstant(storm::RationalFunction const& value) const { return value.isConstant(); } bool ConstantsComparator::isOne(storm::Polynomial const& value) const { return value.isOne(); } bool ConstantsComparator::isZero(storm::Polynomial const& value) const { return value.isZero(); } bool ConstantsComparator::isEqual(storm::Polynomial const& value1, storm::Polynomial const& value2) const { return value1 == value2; } bool ConstantsComparator::isConstant(storm::Polynomial const& value) const { return value.isConstant(); } #endif template storm::storage::MatrixEntry& simplify(storm::storage::MatrixEntry& matrixEntry) { simplify(matrixEntry.getValue()); return matrixEntry; } template class ConstantsComparator; template class ConstantsComparator; template class ConstantsComparator; template double one(); template double zero(); template double infinity(); template RationalFunction one(); template RationalFunction zero(); template Polynomial one(); template Polynomial zero(); template double simplify(double value); template RationalFunction simplify(RationalFunction value); template RationalFunction& simplify(RationalFunction& value); template RationalFunction&& simplify(RationalFunction&& value); template storm::storage::MatrixEntry& simplify(storm::storage::MatrixEntry& matrixEntry); template storm::storage::MatrixEntry& simplify(storm::storage::MatrixEntry& matrixEntry); } }