#ifndef STORM_MODELCHECKER_CSL_SPARSEMARKOVAUTOMATONCSLMODELCHECKER_H_ #define STORM_MODELCHECKER_CSL_SPARSEMARKOVAUTOMATONCSLMODELCHECKER_H_ #include "src/modelchecker/AbstractModelChecker.h" #include "src/modelchecker/prctl/SparseMdpPrctlModelChecker.h" #include "src/models/sparse/MarkovAutomaton.h" #include "src/storage/MaximalEndComponentDecomposition.h" #include "src/solver/NondeterministicLinearEquationSolver.h" #include "src/utility/solver.h" namespace storm { namespace modelchecker { template class SparseMarkovAutomatonCslModelChecker : public AbstractModelChecker { public: explicit SparseMarkovAutomatonCslModelChecker(storm::models::sparse::MarkovAutomaton const& model, std::unique_ptr>&& nondeterministicLinearEquationSolver); explicit SparseMarkovAutomatonCslModelChecker(storm::models::sparse::MarkovAutomaton const& model); // The implemented methods of the AbstractModelChecker interface. virtual bool canHandle(storm::logic::Formula const& formula) const override; virtual std::unique_ptr computeBoundedUntilProbabilities(storm::logic::BoundedUntilFormula const& pathFormula, bool qualitative = false, boost::optional const& optimalityType = boost::optional()) override; virtual std::unique_ptr computeUntilProbabilities(storm::logic::UntilFormula const& pathFormula, bool qualitative = false, boost::optional const& optimalityType = boost::optional()) override; virtual std::unique_ptr computeReachabilityRewards(storm::logic::ReachabilityRewardFormula const& rewardPathFormula, bool qualitative = false, boost::optional const& optimalityType = boost::optional()) override; virtual std::unique_ptr computeLongRunAverage(storm::logic::StateFormula const& stateFormula, bool qualitative = false, boost::optional const& optimalityType = boost::optional()) override; virtual std::unique_ptr computeExpectedTimes(storm::logic::EventuallyFormula const& eventuallyFormula, bool qualitative = false, boost::optional const& optimalityType = boost::optional()); virtual std::unique_ptr checkBooleanLiteralFormula(storm::logic::BooleanLiteralFormula const& stateFormula) override; virtual std::unique_ptr checkAtomicLabelFormula(storm::logic::AtomicLabelFormula const& stateFormula) override; private: // The methods that perform the actual checking. std::vector computeBoundedUntilProbabilitiesHelper(bool minimize, storm::storage::BitVector const& psiStates, std::pair const& boundsPair) const; static void computeBoundedReachabilityProbabilities(bool minimize, storm::storage::SparseMatrix const& transitionMatrix, std::vector const& exitRates, storm::storage::BitVector const& markovianStates, storm::storage::BitVector const& goalStates, storm::storage::BitVector const& markovianNonGoalStates, storm::storage::BitVector const& probabilisticNonGoalStates, std::vector& markovianNonGoalValues, std::vector& probabilisticNonGoalValues, ValueType delta, uint_fast64_t numberOfSteps, storm::utility::solver::NondeterministicLinearEquationSolverFactory const& nondeterministicLinearEquationSolverFactory); std::vector computeUntilProbabilitiesHelper(bool minimize, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates, bool qualitative) const; std::vector computeReachabilityRewardsHelper(bool minimize, storm::storage::BitVector const& psiStates, bool qualitative) const; std::vector computeLongRunAverageHelper(bool minimize, storm::storage::BitVector const& psiStates, bool qualitative) const; std::vector computeExpectedTimesHelper(bool minimize, storm::storage::BitVector const& psiStates, bool qualitative) const; /*! * Computes the long-run average value for the given maximal end component of a Markov automaton. * * @param minimize Sets whether the long-run average is to be minimized or maximized. * @param transitionMatrix The transition matrix of the underlying Markov automaton. * @param nondeterministicChoiceIndices A vector indicating at which row the choice of a given state begins. * @param markovianStates A bit vector storing all markovian states. * @param exitRates A vector with exit rates for all states. Exit rates of probabilistic states are assumed to be zero. * @param goalStates A bit vector indicating which states are to be considered as goal states. * @param mec The maximal end component to consider for computing the long-run average. * @param mecIndex The index of the MEC. * @return The long-run average of being in a goal state for the given MEC. */ static ValueType computeLraForMaximalEndComponent(bool minimize, storm::storage::SparseMatrix const& transitionMatrix, std::vector const& nondeterministicChoiceIndices, storm::storage::BitVector const& markovianStates, std::vector const& exitRates, storm::storage::BitVector const& goalStates, storm::storage::MaximalEndComponent const& mec, uint_fast64_t mecIndex = 0); /*! * Computes the expected reward that is gained from each state before entering any of the goal states. * * @param minimize Indicates whether minimal or maximal rewards are to be computed. * @param goalStates The goal states that define until which point rewards are gained. * @param stateRewards A vector that defines the reward gained in each state. For probabilistic states, this is an instantaneous reward * that is fully gained and for Markovian states the actually gained reward is dependent on the expected time to stay in the * state, i.e. it is gouverned by the exit rate of the state. * @return A vector that contains the expected reward for each state of the model. */ std::vector computeExpectedRewards(bool minimize, storm::storage::BitVector const& goalStates, std::vector const& stateRewards) const; // The model this model checker is supposed to analyze. storm::models::sparse::MarkovAutomaton const& model; // An object that is used for retrieving solvers for systems of linear equations that are the result of nondeterministic choices. std::unique_ptr> nondeterministicLinearEquationSolverFactory; }; } } #endif /* STORM_MODELCHECKER_CSL_SPARSEMARKOVAUTOMATONCSLMODELCHECKER_H_ */