#include "storm-pars/modelchecker/region/ValidatingSparseMdpParameterLiftingModelChecker.h" #include "storm-pars/transformer/SparseParametricMdpSimplifier.h" #include "storm/models/sparse/Mdp.h" #include "storm/utility/macros.h" #include "storm/exceptions/UnexpectedException.h" namespace storm { namespace modelchecker { template ValidatingSparseMdpParameterLiftingModelChecker::ValidatingSparseMdpParameterLiftingModelChecker() { // Intentionally left empty } template void ValidatingSparseMdpParameterLiftingModelChecker::specify(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 mdp = parametricModel->template as(); auto simplifier = storm::transformer::SparseParametricMdpSimplifier(*mdp); 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(simplifier.getSimplifiedModel(), simplifiedTask, true); preciseChecker.specify(simplifier.getSimplifiedModel(), simplifiedTask, true); } template SparseParameterLiftingModelChecker& ValidatingSparseMdpParameterLiftingModelChecker::getImpreciseChecker() { return impreciseChecker; } template SparseParameterLiftingModelChecker const& ValidatingSparseMdpParameterLiftingModelChecker::getImpreciseChecker() const { return impreciseChecker; } template SparseParameterLiftingModelChecker& ValidatingSparseMdpParameterLiftingModelChecker::getPreciseChecker() { return preciseChecker; } template SparseParameterLiftingModelChecker const& ValidatingSparseMdpParameterLiftingModelChecker::getPreciseChecker() const { return preciseChecker; } template void ValidatingSparseMdpParameterLiftingModelChecker::applyHintsToPreciseChecker() { if (impreciseChecker.getCurrentMaxScheduler()) { preciseChecker.getCurrentMaxScheduler() = impreciseChecker.getCurrentMaxScheduler()->template toValueType(); } if (impreciseChecker.getCurrentMinScheduler()) { preciseChecker.getCurrentMinScheduler() = impreciseChecker.getCurrentMinScheduler()->template toValueType(); } if (impreciseChecker.getCurrentPlayer1Scheduler()) { preciseChecker.getCurrentPlayer1Scheduler() = impreciseChecker.getCurrentPlayer1Scheduler()->template toValueType(); } } template class ValidatingSparseMdpParameterLiftingModelChecker, double, storm::RationalNumber>; } }