#include "storm/models/symbolic/StandardRewardModel.h" #include "storm/storage/dd/DdManager.h" #include "storm/storage/dd/Add.h" #include "storm/storage/dd/Bdd.h" #include "storm/adapters/CarlAdapter.h" namespace storm { namespace models { namespace symbolic { template StandardRewardModel::StandardRewardModel(boost::optional> const& stateRewardVector, boost::optional> const& stateActionRewardVector, boost::optional> const& transitionRewardMatrix) : optionalStateRewardVector(stateRewardVector), optionalStateActionRewardVector(stateActionRewardVector), optionalTransitionRewardMatrix(transitionRewardMatrix) { // Intentionally left empty. } template bool StandardRewardModel::empty() const { return !(this->hasStateRewards() || this->hasStateActionRewards() || this->hasTransitionRewards()); } template bool StandardRewardModel::hasStateRewards() const { return static_cast(this->optionalStateRewardVector); } template bool StandardRewardModel::hasOnlyStateRewards() const { return this->hasStateRewards() && !this->hasStateActionRewards() && !this->hasTransitionRewards(); } template storm::dd::Add const& StandardRewardModel::getStateRewardVector() const { return this->optionalStateRewardVector.get(); } template storm::dd::Add& StandardRewardModel::getStateRewardVector() { return this->optionalStateRewardVector.get(); } template boost::optional> const& StandardRewardModel::getOptionalStateRewardVector() const { return this->optionalStateRewardVector; } template bool StandardRewardModel::hasStateActionRewards() const { return static_cast(this->optionalStateActionRewardVector); } template storm::dd::Add const& StandardRewardModel::getStateActionRewardVector() const { return this->optionalStateActionRewardVector.get(); } template storm::dd::Add& StandardRewardModel::getStateActionRewardVector() { return this->optionalStateActionRewardVector.get(); } template boost::optional> const& StandardRewardModel::getOptionalStateActionRewardVector() const { return this->optionalStateActionRewardVector; } template bool StandardRewardModel::hasTransitionRewards() const { return static_cast(this->optionalTransitionRewardMatrix); } template storm::dd::Add const& StandardRewardModel::getTransitionRewardMatrix() const { return this->optionalTransitionRewardMatrix.get(); } template storm::dd::Add& StandardRewardModel::getTransitionRewardMatrix() { return this->optionalTransitionRewardMatrix.get(); } template boost::optional> const& StandardRewardModel::getOptionalTransitionRewardMatrix() const { return this->optionalTransitionRewardMatrix; } template storm::dd::Add StandardRewardModel::getTotalRewardVector(storm::dd::Add const& filterAdd, storm::dd::Add const& transitionMatrix, std::set const& columnVariables) const { storm::dd::Add result = transitionMatrix.getDdManager().template getAddZero(); if (this->hasStateRewards()) { result += filterAdd * optionalStateRewardVector.get(); } if (this->hasStateActionRewards()) { result += filterAdd * optionalStateActionRewardVector.get(); } if (this->hasTransitionRewards()) { result += (transitionMatrix * this->getTransitionRewardMatrix()).sumAbstract(columnVariables); } return result; } template storm::dd::Add StandardRewardModel::getTotalRewardVector(storm::dd::Add const& transitionMatrix, std::set const& columnVariables) const { storm::dd::Add result = transitionMatrix.getDdManager().template getAddZero(); if (this->hasStateRewards()) { result += optionalStateRewardVector.get(); } if (this->hasStateActionRewards()) { result += optionalStateActionRewardVector.get(); } if (this->hasTransitionRewards()) { result += (transitionMatrix * this->getTransitionRewardMatrix()).sumAbstract(columnVariables); } return result; } template storm::dd::Add StandardRewardModel::getTotalRewardVector(storm::dd::Add const& transitionMatrix, std::set const& columnVariables, storm::dd::Add const& weights, bool scaleTransAndActions) const { storm::dd::Add result = transitionMatrix.getDdManager().template getAddZero(); if (this->hasStateRewards()) { result += optionalStateRewardVector.get(); } if (this->hasStateActionRewards()) { result += optionalStateActionRewardVector.get() * weights; } if (this->hasTransitionRewards()) { if (scaleTransAndActions) { result += weights * (transitionMatrix * this->getTransitionRewardMatrix()).sumAbstract(columnVariables); } else { result += (transitionMatrix * this->getTransitionRewardMatrix()).sumAbstract(columnVariables); } } return result; } template StandardRewardModel& StandardRewardModel::operator*=(storm::dd::Add const& filter) { if (this->hasStateRewards()) { this->optionalStateRewardVector.get() *= filter; } if (this->hasStateActionRewards()) { this->optionalStateActionRewardVector.get() *= filter; } if (this->hasTransitionRewards()) { this->optionalTransitionRewardMatrix.get() *= filter; } return *this; } template StandardRewardModel StandardRewardModel::divideStateRewardVector(storm::dd::Add const& divisor) const { boost::optional> modifiedStateRewardVector; if (this->hasStateRewards()) { modifiedStateRewardVector = this->optionalStateRewardVector.get() / divisor; } return StandardRewardModel(modifiedStateRewardVector, this->optionalStateActionRewardVector, this->optionalTransitionRewardMatrix); } template class StandardRewardModel; template class StandardRewardModel; template class StandardRewardModel; } } }