#include "storm/models/symbolic/MarkovAutomaton.h" #include "storm/storage/dd/DdManager.h" #include "storm/storage/dd/Add.h" #include "storm/storage/dd/Bdd.h" #include "storm/models/symbolic/StandardRewardModel.h" #include "storm/adapters/RationalFunctionAdapter.h" namespace storm { namespace models { namespace symbolic { template MarkovAutomaton::MarkovAutomaton(std::shared_ptr> manager, storm::dd::Bdd markovianMarker, storm::dd::Bdd reachableStates, storm::dd::Bdd initialStates, storm::dd::Bdd deadlockStates, storm::dd::Add transitionMatrix, std::set const& rowVariables, std::shared_ptr> rowExpressionAdapter, std::set const& columnVariables, std::vector> const& rowColumnMetaVariablePairs, std::set const& nondeterminismVariables, std::map labelToExpressionMap, std::unordered_map const& rewardModels) : NondeterministicModel(storm::models::ModelType::MarkovAutomaton, manager, reachableStates, initialStates, deadlockStates, transitionMatrix, rowVariables, rowExpressionAdapter, columnVariables, rowColumnMetaVariablePairs, nondeterminismVariables, labelToExpressionMap, rewardModels), markovianMarker(markovianMarker) { // Compute all Markovian info. computeMarkovianInfo(); } template MarkovAutomaton::MarkovAutomaton(std::shared_ptr> manager, storm::dd::Bdd markovianMarker, storm::dd::Bdd reachableStates, storm::dd::Bdd initialStates, storm::dd::Bdd deadlockStates, storm::dd::Add transitionMatrix, std::set const& rowVariables, std::set const& columnVariables, std::vector> const& rowColumnMetaVariablePairs, std::set const& nondeterminismVariables, std::map> labelToBddMap, std::unordered_map const& rewardModels) : NondeterministicModel(storm::models::ModelType::MarkovAutomaton, manager, reachableStates, initialStates, deadlockStates, transitionMatrix, rowVariables, columnVariables, rowColumnMetaVariablePairs, nondeterminismVariables, labelToBddMap, rewardModels), markovianMarker(markovianMarker) { // Compute all Markovian info. computeMarkovianInfo(); } template void MarkovAutomaton::computeMarkovianInfo() { // Compute the Markovian choices. this->markovianChoices = this->getQualitativeTransitionMatrix() && this->markovianMarker; // Compute the Markovian states. this->markovianStates = markovianChoices.existsAbstract(this->getNondeterminismVariables()); // Compute the probabilistic states. std::set columnAndNondeterminsmVariables; std::set_union(this->getColumnVariables().begin(), this->getColumnVariables().end(), this->getNondeterminismVariables().begin(), this->getNondeterminismVariables().end(), std::inserter(columnAndNondeterminsmVariables, columnAndNondeterminsmVariables.begin())); this->probabilisticStates = (this->getQualitativeTransitionMatrix() && !markovianMarker).existsAbstract(columnAndNondeterminsmVariables); // Compute the vector of exit rates. this->exitRateVector = (this->getTransitionMatrix() * this->markovianMarker.template toAdd()).sumAbstract(columnAndNondeterminsmVariables); // Modify the transition matrix so all choices are probabilistic and the Markovian choices additionally // have a rate. this->transitionMatrix = this->transitionMatrix / this->markovianChoices.ite(this->exitRateVector, this->getManager().template getAddOne()); } template storm::dd::Bdd const& MarkovAutomaton::getMarkovianMarker() const { return this->markovianMarker; } template storm::dd::Bdd const& MarkovAutomaton::getMarkovianStates() const { return this->markovianStates; } template storm::dd::Bdd const& MarkovAutomaton::getMarkovianChoices() const { return this->markovianChoices; } template storm::dd::Bdd const& MarkovAutomaton::getProbabilisticStates() const { return this->markovianStates; } template bool MarkovAutomaton::hasHybridStates() const { return !(this->probabilisticStates && this->markovianStates).isZero(); } template bool MarkovAutomaton::isClosed() { return !this->hasHybridStates(); } template MarkovAutomaton MarkovAutomaton::close() { // Create the new transition matrix by deleting all Markovian transitions from probabilistic states. storm::dd::Add newTransitionMatrix = this->probabilisticStates.ite(this->getTransitionMatrix() * (!this->getMarkovianMarker()).template toAdd(), this->getTransitionMatrix()); return MarkovAutomaton(this->getManagerAsSharedPointer(), this->getMarkovianMarker(), this->getReachableStates(), this->getInitialStates(), this->getDeadlockStates(), newTransitionMatrix, this->getRowVariables(), this->getRowExpressionAdapter(), this->getColumnVariables(), this->getRowColumnMetaVariablePairs(), this->getNondeterminismVariables(), this->getLabelToExpressionMap(), this->getRewardModels()); } template storm::dd::Add const& MarkovAutomaton::getExitRateVector() const { return this->exitRateVector; } // Explicitly instantiate the template class. template class MarkovAutomaton; template class MarkovAutomaton; template class MarkovAutomaton; template class MarkovAutomaton; } // namespace symbolic } // namespace models } // namespace storm