#include "storm/modelchecker/parametric/SparseDtmcParameterLifting.h" #include "storm/adapters/CarlAdapter.h" #include "storm/modelchecker/parametric/SparseDtmcParameterLiftingModelChecker.h" #include "storm/modelchecker/parametric/SparseDtmcInstantiationModelChecker.h" #include "storm/transformer/SparseParametricDtmcSimplifier.h" #include "storm/models/sparse/StandardRewardModel.h" #include "storm/models/sparse/Dtmc.h" #include "SparseMdpParameterLifting.h" namespace storm { namespace modelchecker { namespace parametric { template SparseDtmcParameterLifting::SparseDtmcParameterLifting(SparseModelType const& parametricModel) : ParameterLifting(parametricModel) { // Intentionally left empty } template void SparseDtmcParameterLifting::simplifyParametricModel(CheckTask const& checkTask) { storm::transformer::SparseParametricDtmcSimplifier simplifier(this->parametricModel); if(simplifier.simplify(checkTask.getFormula())) { this->simplifiedModel = simplifier.getSimplifiedModel(); this->currentFormula = simplifier.getSimplifiedFormula(); } else { this->simplifiedModel = nullptr; this->currentFormula = checkTask.getFormula().asSharedPointer(); } } template void SparseDtmcParameterLifting::initializeUnderlyingCheckers() { if (this->settings.applyExactValidation) { STORM_LOG_WARN_COND(!(std::is_same::CoefficientType>::value) , "Exact validation is not necessarry if the original computation is already exact"); this->exactParameterLiftingChecker = std::make_unique::CoefficientType>>(this->getConsideredParametricModel()); } this->parameterLiftingChecker = std::make_unique>(this->getConsideredParametricModel()); this->instantiationChecker = std::make_unique>(this->getConsideredParametricModel()); } template void SparseDtmcParameterLifting::applyHintsToExactChecker() { auto dtmcPLChecker = dynamic_cast*>(this->parameterLiftingChecker.get()); STORM_LOG_ASSERT(dtmcPLChecker, "Underlying Parameter lifting checker has unexpected type"); auto exactDtmcPLChecker = dynamic_cast::CoefficientType>*>(this->exactParameterLiftingChecker.get()); STORM_LOG_ASSERT(exactDtmcPLChecker, "Underlying exact parameter lifting checker has unexpected type"); exactDtmcPLChecker->getCurrentMaxScheduler() = dtmcPLChecker->getCurrentMaxScheduler(); exactDtmcPLChecker->getCurrentMinScheduler() = dtmcPLChecker->getCurrentMinScheduler(); } #ifdef STORM_HAVE_CARL template class SparseDtmcParameterLifting, double>; template class SparseDtmcParameterLifting, storm::RationalNumber>; #endif } // namespace parametric } //namespace modelchecker } //namespace storm