#pragma once #include #include #include #include "storm/modelchecker/parametric/SparseParameterLiftingModelChecker.h" #include "storm/storage/BitVector.h" #include "storm/storage/SparseMatrix.h" #include "storm/storage/sparse/StateType.h" #include "storm/utility/solver.h" #include "storm/transformer/ParameterLifter.h" #include "storm/storage/TotalScheduler.h" namespace storm { namespace modelchecker { namespace parametric { template class SparseMdpParameterLiftingModelChecker : public SparseParameterLiftingModelChecker { public: SparseMdpParameterLiftingModelChecker(SparseModelType const& parametricModel); SparseMdpParameterLiftingModelChecker(SparseModelType const& parametricModel, std::unique_ptr>&& solverFactory); virtual bool canHandle(CheckTask const& checkTask) const override; boost::optional& getCurrentMinScheduler(); boost::optional& getCurrentMaxScheduler(); boost::optional& getCurrentPlayer1Scheduler(); protected: virtual void specifyBoundedUntilFormula(CheckTask const& checkTask) override; virtual void specifyUntilFormula(CheckTask const& checkTask) override; virtual void specifyReachabilityRewardFormula(CheckTask const& checkTask) override; virtual void specifyCumulativeRewardFormula(CheckTask const& checkTask) override; virtual std::unique_ptr computeQuantitativeValues(storm::storage::ParameterRegion const& region, storm::solver::OptimizationDirection const& dirForParameters) override; virtual void reset() override; private: void computePlayer1Matrix(); storm::storage::BitVector maybeStates; std::vector resultsForNonMaybeStates; boost::optional stepBound; storm::storage::SparseMatrix player1Matrix; std::unique_ptr> parameterLifter; std::unique_ptr> solverFactory; // Results from the most recent solver call. boost::optional minSched, maxSched; boost::optional player1Sched; std::vector x; boost::optional lowerResultBound, upperResultBound; bool applyPreviousResultAsHint; }; } } }