#include "src/models/symbolic/Model.h" namespace storm { namespace models { namespace symbolic { template Model::Model(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::map labelToExpressionMap, boost::optional> const& optionalStateRewardVector, boost::optional> const& optionalTransitionRewardMatrix) : ModelBase(modelType), manager(manager), reachableStates(reachableStates), initialStates(initialStates), transitionMatrix(transitionMatrix), rowVariables(rowVariables), rowExpressionAdapter(rowExpressionAdapter), columnVariables(columnVariables), columnExpressionAdapter(columnExpressionAdapter), rowColumnMetaVariablePairs(rowColumnMetaVariablePairs), labelToExpressionMap(labelToExpressionMap), stateRewardVector(optionalStateRewardVector), transitionRewardMatrix(optionalTransitionRewardMatrix) { // Intentionally left empty. } template uint_fast64_t Model::getNumberOfStates() const { return reachableStates.getNonZeroCount(); } template uint_fast64_t Model::getNumberOfTransitions() const { return transitionMatrix.getNonZeroCount(); } template storm::dd::Dd const& Model::getReachableStates() const { return reachableStates; } template storm::dd::Dd const& Model::getInitialStates() const { return initialStates; } template storm::dd::Dd Model::getStates(std::string const& label) const { return rowExpressionAdapter->translateExpression(labelToExpressionMap.at(label)); } template storm::dd::Dd Model::getStates(storm::expressions::Expression const& expression) const { return rowExpressionAdapter->translateExpression(expression); } template bool Model::hasLabel(std::string const& label) const { return labelToExpressionMap.find(label) != labelToExpressionMap.end(); } template storm::dd::Dd const& Model::getTransitionMatrix() const { return transitionMatrix; } template storm::dd::Dd& Model::getTransitionMatrix() { return transitionMatrix; } template storm::dd::Dd const& Model::getTransitionRewardMatrix() const { return transitionRewardMatrix.get(); } template storm::dd::Dd& Model::getTransitionRewardMatrix() { return transitionRewardMatrix.get(); } template storm::dd::Dd const& Model::getStateRewardVector() const { return stateRewardVector.get(); } template bool Model::hasStateRewards() const { return static_cast(stateRewardVector); } template bool Model::hasTransitionRewards() const { return static_cast(transitionRewardMatrix); } template std::size_t Model::getSizeInBytes() const { return sizeof(*this) + sizeof(DdNode) * (reachableStates.getNodeCount() + initialStates.getNodeCount() + transitionMatrix.getNodeCount()); } template std::set const& Model::getRowVariables() const { return rowVariables; } template std::set const& Model::getColumnVariables() const { return columnVariables; } template void Model::setTransitionMatrix(storm::dd::Dd const& transitionMatrix) { this->transitionMatrix = transitionMatrix; } template std::map const& Model::getLabelToExpressionMap() const { return labelToExpressionMap; } template void Model::printModelInformationToStream(std::ostream& out) const { out << "-------------------------------------------------------------- " << std::endl; out << "Model type: \t" << this->getType() << " (symbolic)" << std::endl; out << "States: \t" << this->getNumberOfStates() << " (" << reachableStates.getNodeCount() << " nodes)" << std::endl; out << "Transitions: \t" << this->getNumberOfTransitions() << " (" << transitionMatrix.getNodeCount() << " nodes)" << std::endl; out << "Variables: \t" << "rows: " << this->rowVariables.size() << ", columns: " << this->columnVariables.size() << std::endl; out << "Labels: \t" << this->labelToExpressionMap.size() << std::endl; for (auto const& label : labelToExpressionMap) { out << " * " << label.first << std::endl; } out << "Size in memory: \t" << (this->getSizeInBytes())/1024 << " kbytes" << std::endl; out << "-------------------------------------------------------------- " << std::endl; } template bool Model::isSymbolicModel() const { return true; } // Explicitly instantiate the template class. template class Model; } // namespace symbolic } // namespace models } // namespace storm