#pragma once #include #include #include #include "storm-pars/transformer/ParameterLifter.h" #include "storm-pars/modelchecker/region/SparseParameterLiftingModelChecker.h" #include "storm-pars/modelchecker/instantiation/SparseDtmcInstantiationModelChecker.h" #include "storm/storage/BitVector.h" #include "storm/storage/Scheduler.h" #include "storm/solver/MinMaxLinearEquationSolver.h" #include "storm/logic/FragmentSpecification.h" namespace storm { namespace modelchecker { template class SparseDtmcParameterLiftingModelChecker : public SparseParameterLiftingModelChecker { public: SparseDtmcParameterLiftingModelChecker(); SparseDtmcParameterLiftingModelChecker(std::unique_ptr>&& solverFactory); virtual ~SparseDtmcParameterLiftingModelChecker() = default; virtual bool canHandle(std::shared_ptr parametricModel, CheckTask const& checkTask) const override; virtual void specify(std::shared_ptr parametricModel, CheckTask const& checkTask) override; void specify(std::shared_ptr parametricModel, CheckTask const& checkTask, bool skipModelSimplification); boost::optional> getCurrentMinScheduler(); boost::optional> getCurrentMaxScheduler(); 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 storm::modelchecker::SparseInstantiationModelChecker& getInstantiationChecker() override; virtual std::unique_ptr computeQuantitativeValues(storm::storage::ParameterRegion const& region, storm::solver::OptimizationDirection const& dirForParameters) override; virtual void reset() override; private: storm::storage::BitVector maybeStates; std::vector resultsForNonMaybeStates; boost::optional stepBound; std::unique_ptr> instantiationChecker; std::unique_ptr> parameterLifter; std::unique_ptr> solverFactory; bool solvingRequiresUpperRewardBounds; // Results from the most recent solver call. boost::optional> minSchedChoices, maxSchedChoices; std::vector x; boost::optional lowerResultBound, upperResultBound; }; } }