#pragma once #include #include #include #include "storm-pars/transformer/ParameterLifter.h" #include "storm-pars/modelchecker/region/SparseParameterLiftingModelChecker.h" #include "storm-pars/modelchecker/instantiation/SparseMdpInstantiationModelChecker.h" #include "storm/storage/BitVector.h" #include "storm/storage/SparseMatrix.h" #include "storm/storage/sparse/StateType.h" #include "storm/solver/GameSolver.h" #include "storm/storage/Scheduler.h" namespace storm { namespace modelchecker { template class SparseMdpParameterLiftingModelChecker : public SparseParameterLiftingModelChecker { public: SparseMdpParameterLiftingModelChecker(); SparseMdpParameterLiftingModelChecker(std::unique_ptr>&& solverFactory); virtual ~SparseMdpParameterLiftingModelChecker() = default; virtual bool canHandle(std::shared_ptr parametricModel, CheckTask const& checkTask) const override; virtual void specify(Environment const& env, std::shared_ptr parametricModel, CheckTask const& checkTask, bool generateRegionSplitEstimates = false, bool allowModelSimplification = true) override; void specify_internal(Environment const& env, std::shared_ptr parametricModel, CheckTask const& checkTask, bool generateRegionSplitEstimates, bool skipModelSimplification); boost::optional> getCurrentMinScheduler(); boost::optional> getCurrentMaxScheduler(); boost::optional> getCurrentPlayer1Scheduler(); protected: virtual void specifyBoundedUntilFormula(Environment const& env, CheckTask const& checkTask) override; virtual void specifyUntilFormula(Environment const& env, CheckTask const& checkTask) override; virtual void specifyReachabilityRewardFormula(Environment const& env, CheckTask const& checkTask) override; virtual void specifyCumulativeRewardFormula(Environment const& env, CheckTask const& checkTask) override; virtual storm::modelchecker::SparseInstantiationModelChecker& getInstantiationChecker() override; virtual std::unique_ptr computeQuantitativeValues(Environment const& env, storm::storage::ParameterRegion const& region, storm::solver::OptimizationDirection const& dirForParameters, std::shared_ptr::VariableType>> localMonotonicityResult = nullptr) override; virtual void reset() override; private: void computePlayer1Matrix(boost::optional const& selectedRows = boost::none); storm::storage::BitVector maybeStates; std::vector resultsForNonMaybeStates; boost::optional stepBound; std::unique_ptr> instantiationChecker; storm::storage::SparseMatrix player1Matrix; std::unique_ptr> parameterLifter; std::unique_ptr> solverFactory; // Results from the most recent solver call. boost::optional> minSchedChoices, maxSchedChoices; boost::optional> player1SchedChoices; std::vector x; boost::optional lowerResultBound, upperResultBound; bool applyPreviousResultAsHint; }; } }