#include "src/models/symbolic/NondeterministicModel.h" namespace storm { namespace models { namespace symbolic { template NondeterministicModel::NondeterministicModel(storm::models::ModelType const& modelType, std::shared_ptr> manager, storm::dd::Dd reachableStates, storm::dd::Dd initialStates, storm::dd::Dd 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, boost::optional> const& optionalStateRewardVector, boost::optional> const& optionalTransitionRewardMatrix) : Model(modelType, manager, reachableStates, initialStates, transitionMatrix, rowVariables, rowExpressionAdapter, columnVariables, columnExpressionAdapter, rowColumnMetaVariablePairs, labelToExpressionMap, optionalStateRewardVector, optionalTransitionRewardMatrix), 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::Dd tmp = this->getTransitionMatrix().notZero().existsAbstract(this->getColumnVariables()).toMtbdd().sumAbstract(rowAndNondeterminsmVariables); return static_cast(tmp.getValue()); } template std::set const& NondeterministicModel::getNondeterminismVariables() const { return nondeterminismVariables; } template storm::dd::Dd const& NondeterministicModel::getIllegalMask() const { return illegalMask; } template void NondeterministicModel::printModelInformationToStream(std::ostream& out) const { out << "-------------------------------------------------------------- " << std::endl; out << "Model type: \t" << this->getType() << " (symbolic)" << std::endl; out << "States: \t" << this->getNumberOfStates() << " (" << this->getReachableStates().getNodeCount() << " nodes)" << std::endl; out << "Transitions: \t" << this->getNumberOfTransitions() << " (" << this->getTransitionMatrix().getNodeCount() << " nodes)" << std::endl; out << "Choices: \t" << this->getNumberOfChoices() << std::endl; out << "Variables: \t" << "rows: " << this->getRowVariables().size() << ", columns: " << this->getColumnVariables().size() << ", nondeterminism: " << this->getNondeterminismVariables().size() << std::endl; out << "Labels: \t" << this->getLabelToExpressionMap().size() << std::endl; for (auto const& label : this->getLabelToExpressionMap()) { out << " * " << label.first << std::endl; } out << "Size in memory: \t" << (this->getSizeInBytes())/1024 << " kbytes" << std::endl; out << "-------------------------------------------------------------- " << std::endl; } // Explicitly instantiate the template class. template class NondeterministicModel; } // namespace symbolic } // namespace models } // namespace storm