#include "storm-pars/modelchecker/region/ValidatingSparseDtmcParameterLiftingModelChecker.h" #include "storm-pars/transformer/SparseParametricDtmcSimplifier.h" #include "storm/models/sparse/Dtmc.h" #include "storm/utility/macros.h" #include "storm/exceptions/UnexpectedException.h" namespace storm { namespace modelchecker { template ValidatingSparseDtmcParameterLiftingModelChecker::ValidatingSparseDtmcParameterLiftingModelChecker() { // Intentionally left empty } template void ValidatingSparseDtmcParameterLiftingModelChecker::specify(Environment const& env, std::shared_ptr parametricModel, CheckTask const& checkTask) { STORM_LOG_ASSERT(this->canHandle(parametricModel, checkTask), "specified model and formula can not be handled by this."); auto dtmc = parametricModel->template as(); auto simplifier = storm::transformer::SparseParametricDtmcSimplifier(*dtmc); if (!simplifier.simplify(checkTask.getFormula())) { STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Simplifying the model was not successfull."); } auto simplifiedTask = checkTask.substituteFormula(*simplifier.getSimplifiedFormula()); impreciseChecker.specify(env, simplifier.getSimplifiedModel(), simplifiedTask, true); preciseChecker.specify(env, simplifier.getSimplifiedModel(), simplifiedTask, true); } template SparseParameterLiftingModelChecker& ValidatingSparseDtmcParameterLiftingModelChecker::getImpreciseChecker() { return impreciseChecker; } template SparseParameterLiftingModelChecker const& ValidatingSparseDtmcParameterLiftingModelChecker::getImpreciseChecker() const { return impreciseChecker; } template SparseParameterLiftingModelChecker& ValidatingSparseDtmcParameterLiftingModelChecker::getPreciseChecker() { return preciseChecker; } template SparseParameterLiftingModelChecker const& ValidatingSparseDtmcParameterLiftingModelChecker::getPreciseChecker() const { return preciseChecker; } template void ValidatingSparseDtmcParameterLiftingModelChecker::applyHintsToPreciseChecker() { if (impreciseChecker.getCurrentMaxScheduler()) { preciseChecker.getCurrentMaxScheduler() = impreciseChecker.getCurrentMaxScheduler()->template toValueType(); } if (impreciseChecker.getCurrentMinScheduler()) { preciseChecker.getCurrentMinScheduler() = impreciseChecker.getCurrentMinScheduler()->template toValueType(); } } template class ValidatingSparseDtmcParameterLiftingModelChecker, double, storm::RationalNumber>; } }