#include "src/models/symbolic/NondeterministicModel.h" #include "src/storage/dd/CuddDdManager.h" #include "src/storage/dd/CuddAdd.h" #include "src/storage/dd/CuddBdd.h" #include "src/models/symbolic/StandardRewardModel.h" namespace storm { namespace models { namespace symbolic { template NondeterministicModel::NondeterministicModel(storm::models::ModelType const& modelType, std::shared_ptr> manager, storm::dd::Bdd reachableStates, storm::dd::Bdd initialStates, storm::dd::Add transitionMatrix, std::set const& rowVariables, std::shared_ptr> rowExpressionAdapter, std::set const& columnVariables, std::shared_ptr> columnExpressionAdapter, std::vector> const& rowColumnMetaVariablePairs, std::set const& nondeterminismVariables, std::map labelToExpressionMap, std::unordered_map const& rewardModels) : Model(modelType, manager, reachableStates, initialStates, transitionMatrix, rowVariables, rowExpressionAdapter, columnVariables, columnExpressionAdapter, rowColumnMetaVariablePairs, labelToExpressionMap, rewardModels), nondeterminismVariables(nondeterminismVariables) { // Prepare the mask of illegal nondeterministic choices. illegalMask = transitionMatrix.notZero().existsAbstract(this->getColumnVariables()); illegalMask = !illegalMask && reachableStates; } template uint_fast64_t NondeterministicModel::getNumberOfChoices() const { std::set rowAndNondeterminsmVariables; std::set_union(this->getNondeterminismVariables().begin(), this->getNondeterminismVariables().end(), this->getRowVariables().begin(), this->getRowVariables().end(), std::inserter(rowAndNondeterminsmVariables, rowAndNondeterminsmVariables.begin())); storm::dd::Add tmp = this->getTransitionMatrix().notZero().existsAbstract(this->getColumnVariables()).toAdd().sumAbstract(rowAndNondeterminsmVariables); return static_cast(tmp.getValue()); } template std::set const& NondeterministicModel::getNondeterminismVariables() const { return nondeterminismVariables; } template storm::dd::Bdd const& NondeterministicModel::getIllegalMask() const { return illegalMask; } template void NondeterministicModel::printModelInformationToStream(std::ostream& out) const { this->printModelInformationHeaderToStream(out); out << "Choices: \t" << this->getNumberOfChoices() << std::endl; this->printModelInformationFooterToStream(out); } template void NondeterministicModel::printDdVariableInformationToStream(std::ostream& out) const { uint_fast64_t nondeterminismVariableCount = 0; for (auto const& metaVariable : this->getNondeterminismVariables()) { nondeterminismVariableCount += this->getManager().getMetaVariable(metaVariable).getNumberOfDdVariables(); } Model::printDdVariableInformationToStream(out); out << ", nondeterminism: " << this->getNondeterminismVariables().size() << " meta variables (" << nondeterminismVariableCount << " DD variables)"; } // Explicitly instantiate the template class. template class NondeterministicModel; } // namespace symbolic } // namespace models } // namespace storm