You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
9.4 KiB
167 lines
9.4 KiB
#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 <storm::dd::DdType Type, typename ValueType>
|
|
StandardRewardModel<Type, ValueType>::StandardRewardModel(boost::optional<storm::dd::Add<Type, ValueType>> const& stateRewardVector, boost::optional<storm::dd::Add<Type, ValueType>> const& stateActionRewardVector, boost::optional<storm::dd::Add<Type, ValueType>> const& transitionRewardMatrix) : optionalStateRewardVector(stateRewardVector), optionalStateActionRewardVector(stateActionRewardVector), optionalTransitionRewardMatrix(transitionRewardMatrix) {
|
|
// Intentionally left empty.
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
bool StandardRewardModel<Type, ValueType>::empty() const {
|
|
return !(this->hasStateRewards() || this->hasStateActionRewards() || this->hasTransitionRewards());
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
bool StandardRewardModel<Type, ValueType>::hasStateRewards() const {
|
|
return static_cast<bool>(this->optionalStateRewardVector);
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
bool StandardRewardModel<Type, ValueType>::hasOnlyStateRewards() const {
|
|
return this->hasStateRewards() && !this->hasStateActionRewards() && !this->hasTransitionRewards();
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
storm::dd::Add<Type, ValueType> const& StandardRewardModel<Type, ValueType>::getStateRewardVector() const {
|
|
return this->optionalStateRewardVector.get();
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
storm::dd::Add<Type, ValueType>& StandardRewardModel<Type, ValueType>::getStateRewardVector() {
|
|
return this->optionalStateRewardVector.get();
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
boost::optional<storm::dd::Add<Type, ValueType>> const& StandardRewardModel<Type, ValueType>::getOptionalStateRewardVector() const {
|
|
return this->optionalStateRewardVector;
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
bool StandardRewardModel<Type, ValueType>::hasStateActionRewards() const {
|
|
return static_cast<bool>(this->optionalStateActionRewardVector);
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
storm::dd::Add<Type, ValueType> const& StandardRewardModel<Type, ValueType>::getStateActionRewardVector() const {
|
|
return this->optionalStateActionRewardVector.get();
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
storm::dd::Add<Type, ValueType>& StandardRewardModel<Type, ValueType>::getStateActionRewardVector() {
|
|
return this->optionalStateActionRewardVector.get();
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
boost::optional<storm::dd::Add<Type, ValueType>> const& StandardRewardModel<Type, ValueType>::getOptionalStateActionRewardVector() const {
|
|
return this->optionalStateActionRewardVector;
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
bool StandardRewardModel<Type, ValueType>::hasTransitionRewards() const {
|
|
return static_cast<bool>(this->optionalTransitionRewardMatrix);
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
storm::dd::Add<Type, ValueType> const& StandardRewardModel<Type, ValueType>::getTransitionRewardMatrix() const {
|
|
return this->optionalTransitionRewardMatrix.get();
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
storm::dd::Add<Type, ValueType>& StandardRewardModel<Type, ValueType>::getTransitionRewardMatrix() {
|
|
return this->optionalTransitionRewardMatrix.get();
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
boost::optional<storm::dd::Add<Type, ValueType>> const& StandardRewardModel<Type, ValueType>::getOptionalTransitionRewardMatrix() const {
|
|
return this->optionalTransitionRewardMatrix;
|
|
}
|
|
|
|
template <storm::dd::DdType Type, typename ValueType>
|
|
storm::dd::Add<Type, ValueType> StandardRewardModel<Type, ValueType>::getTotalRewardVector(storm::dd::Add<Type, ValueType> const& filterAdd, storm::dd::Add<Type, ValueType> const& transitionMatrix, std::set<storm::expressions::Variable> const& columnVariables) const {
|
|
storm::dd::Add<Type, ValueType> result = transitionMatrix.getDdManager().template getAddZero<ValueType>();
|
|
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::DdType Type, typename ValueType>
|
|
storm::dd::Add<Type, ValueType> StandardRewardModel<Type, ValueType>::getTotalRewardVector(storm::dd::Add<Type, ValueType> const& transitionMatrix, std::set<storm::expressions::Variable> const& columnVariables) const {
|
|
storm::dd::Add<Type, ValueType> result = transitionMatrix.getDdManager().template getAddZero<ValueType>();
|
|
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::DdType Type, typename ValueType>
|
|
storm::dd::Add<Type, ValueType> StandardRewardModel<Type, ValueType>::getTotalRewardVector(storm::dd::Add<Type, ValueType> const& transitionMatrix, std::set<storm::expressions::Variable> const& columnVariables, storm::dd::Add<Type, ValueType> const& weights, bool scaleTransAndActions) const {
|
|
storm::dd::Add<Type, ValueType> result = transitionMatrix.getDdManager().template getAddZero<ValueType>();
|
|
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 <storm::dd::DdType Type, typename ValueType>
|
|
StandardRewardModel<Type, ValueType>& StandardRewardModel<Type, ValueType>::operator*=(storm::dd::Add<Type, ValueType> 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 <storm::dd::DdType Type, typename ValueType>
|
|
StandardRewardModel<Type, ValueType> StandardRewardModel<Type, ValueType>::divideStateRewardVector(storm::dd::Add<Type, ValueType> const& divisor) const {
|
|
boost::optional<storm::dd::Add<Type, ValueType>> modifiedStateRewardVector;
|
|
if (this->hasStateRewards()) {
|
|
modifiedStateRewardVector = this->optionalStateRewardVector.get() / divisor;
|
|
}
|
|
return StandardRewardModel<Type, ValueType>(modifiedStateRewardVector, this->optionalStateActionRewardVector, this->optionalTransitionRewardMatrix);
|
|
}
|
|
|
|
template class StandardRewardModel<storm::dd::DdType::CUDD, double>;
|
|
template class StandardRewardModel<storm::dd::DdType::Sylvan, double>;
|
|
|
|
template class StandardRewardModel<storm::dd::DdType::Sylvan, storm::RationalFunction>;
|
|
|
|
}
|
|
}
|
|
}
|