#ifndef STORM_UTILITY_CONSTANTSCOMPARATOR_H_ #define STORM_UTILITY_CONSTANTSCOMPARATOR_H_ #ifdef max # undef max #endif #ifdef min # undef min #endif #include #include #include "src/settings/SettingsManager.h" #include "src/adapters/CarlAdapter.h" namespace storm { // Forward-declare MatrixEntry class. namespace storage { template class MatrixEntry; } namespace utility { template ValueType one(); template ValueType zero(); template ValueType infinity(); #ifdef STORM_HAVE_CARL template<> storm::RationalFunction infinity(); #endif template ValueType pow(ValueType const& value, uint_fast64_t exponent); #ifdef STORM_HAVE_CARL template<> RationalFunction pow(RationalFunction const& value, uint_fast64_t exponent); #endif template ValueType simplify(ValueType value); // A class that can be used for comparing constants. template class ConstantsComparator { public: bool isOne(ValueType const& value) const; bool isZero(ValueType const& value) const; bool isEqual(ValueType const& value1, ValueType const& value2) const; }; // For doubles we specialize this class and consider the comparison modulo some predefined precision. template<> class ConstantsComparator { public: ConstantsComparator(); ConstantsComparator(double precision); bool isOne(double const& value) const; bool isZero(double const& value) const; bool isEqual(double const& value1, double const& value2) const; bool isConstant(double const& value) const; private: // The precision used for comparisons. double precision; }; #ifdef STORM_HAVE_CARL template<> RationalFunction& simplify(RationalFunction& value); template<> RationalFunction&& simplify(RationalFunction&& value); template<> class ConstantsComparator { public: bool isOne(storm::RationalFunction const& value) const; bool isZero(storm::RationalFunction const& value) const; bool isEqual(storm::RationalFunction const& value1, storm::RationalFunction const& value2) const; bool isConstant(storm::RationalFunction const& value) const; }; template<> class ConstantsComparator { public: bool isOne(storm::Polynomial const& value) const; bool isZero(storm::Polynomial const& value) const; bool isEqual(storm::Polynomial const& value1, storm::Polynomial const& value2) const; bool isConstant(storm::Polynomial const& value) const; }; #endif template storm::storage::MatrixEntry& simplify(storm::storage::MatrixEntry& matrixEntry); template storm::storage::MatrixEntry&& simplify(storm::storage::MatrixEntry&& matrixEntry); } } #endif /* STORM_UTILITY_CONSTANTSCOMPARATOR_H_ */