diff --git a/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp b/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp index 8e9564ad6..2d377564d 100644 --- a/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp +++ b/src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp @@ -128,8 +128,13 @@ namespace storm { storm::storage::BitVector maybeStates = ~psiStates & ~infinityStates; // If the initial state is known to have 0 reward or an infinite reward value, we can directly return the result. - STORM_LOG_THROW(model.getInitialStates().isDisjointFrom(infinityStates), storm::exceptions::IllegalArgumentException, "Initial state has infinite reward."); - if (!model.getInitialStates().isDisjointFrom(psiStates)) { + if (infinityStates.get(initialState)) { + STORM_LOG_DEBUG("The reward of all initial states was found in a preprocessing step."); + // This is a work around, because not all (e.g. storm::RationalFunction) data types can represent an + // infinity value. + return std::unique_ptr(new ExplicitQuantitativeCheckResult(initialState, storm::utility::infinity())); + } + if (psiStates.get(initialState)) { STORM_LOG_DEBUG("The reward of all initial states was found in a preprocessing step."); return std::unique_ptr(new ExplicitQuantitativeCheckResult(initialState, storm::utility::zero())); } @@ -538,17 +543,9 @@ namespace storm { // Now, we return the value for the only initial state. STORM_LOG_DEBUG("Simplifying and returning result."); if (stateRewards) { -// if (storm::settings::parametricSettings().isSimplifySet()) { -// return storm::utility::simplify(stateRewards.get()[*initialStates.begin()]); -// } else { - return storm::utility::simplify(stateRewards.get()[*initialStates.begin()]); -// } + return storm::utility::simplify(stateRewards.get()[*initialStates.begin()]); } else { -// if (storm::settings::parametricSettings().isSimplifySet()) { -// return storm::utility::simplify(oneStepProbabilities[*initialStates.begin()]); -// } else { - return oneStepProbabilities[*initialStates.begin()]; -// } + return oneStepProbabilities[*initialStates.begin()]; } } diff --git a/src/storage/expressions/ToRationalFunctionVisitor.cpp b/src/storage/expressions/ToRationalFunctionVisitor.cpp index 4e6516095..187474663 100644 --- a/src/storage/expressions/ToRationalFunctionVisitor.cpp +++ b/src/storage/expressions/ToRationalFunctionVisitor.cpp @@ -48,6 +48,9 @@ namespace storm { default: STORM_LOG_ASSERT(false, "Illegal operator type."); } + + // Return a dummy. This point must, however, never be reached. + return boost::any(); } template @@ -89,9 +92,7 @@ namespace storm { template boost::any ToRationalFunctionVisitor::visit(DoubleLiteralExpression const& expression) { - std::stringstream str; - str << std::fixed << std::setprecision(3) << expression.getValue(); - return RationalFunctionType(carl::rationalize(str.str())); + return RationalFunctionType(carl::rationalize(expression.getValue())); } template class ToRationalFunctionVisitor; diff --git a/src/utility/ConstantsComparator.cpp b/src/utility/ConstantsComparator.cpp index ac05599a0..6fbc296da 100644 --- a/src/utility/ConstantsComparator.cpp +++ b/src/utility/ConstantsComparator.cpp @@ -21,6 +21,14 @@ namespace storm { return std::numeric_limits::infinity(); } +#ifdef STORM_HAVE_CARL + template<> + storm::RationalFunction infinity() { + // FIXME: this does not work. + return storm::RationalFunction(carl::rationalize(std::numeric_limits::infinity())); + } +#endif + template ValueType pow(ValueType const& value, uint_fast64_t exponent) { return std::pow(value, exponent); @@ -188,6 +196,7 @@ namespace storm { template RationalFunction one(); template RationalFunction zero(); + template storm::RationalFunction infinity(); template RationalFunction pow(RationalFunction const& value, uint_fast64_t exponent); diff --git a/src/utility/ConstantsComparator.h b/src/utility/ConstantsComparator.h index 2c45c9f8f..358b217c9 100644 --- a/src/utility/ConstantsComparator.h +++ b/src/utility/ConstantsComparator.h @@ -33,6 +33,11 @@ namespace storm { template ValueType infinity(); +#ifdef STORM_HAVE_CARL + template<> + storm::RationalFunction infinity(); +#endif + template ValueType pow(ValueType const& value, uint_fast64_t exponent); diff --git a/src/utility/cli.h b/src/utility/cli.h index f82da0994..cae78c1a8 100644 --- a/src/utility/cli.h +++ b/src/utility/cli.h @@ -86,8 +86,6 @@ namespace storm { auto loglevel = storm::settings::debugSettings().isTraceSet() ? log4cplus::TRACE_LOG_LEVEL : storm::settings::debugSettings().isDebugSet() ? log4cplus::DEBUG_LOG_LEVEL : log4cplus::WARN_LOG_LEVEL; logger.setLogLevel(loglevel); consoleLogAppender->setThreshold(loglevel); - - } /*!