Browse Source
Added a traverser that finds out, whether a given reward model has state/action/transition rewards
tempestpy_adaptions
Added a traverser that finds out, whether a given reward model has state/action/transition rewards
tempestpy_adaptions
TimQu
6 years ago
2 changed files with 159 additions and 0 deletions
-
100src/storm/storage/jani/traverser/RewardModelInformation.cpp
-
59src/storm/storage/jani/traverser/RewardModelInformation.h
@ -0,0 +1,100 @@ |
|||
#include "storm/storage/jani/traverser/RewardModelInformation.h"
|
|||
|
|||
#include "storm/storage/expressions/Expression.h"
|
|||
#include "storm/storage/expressions/Variable.h"
|
|||
#include "storm/storage/jani/Model.h"
|
|||
|
|||
namespace storm { |
|||
namespace jani { |
|||
|
|||
RewardModelInformation::RewardModelInformation(bool hasStateRewards, bool hasActionRewards, bool hasTransitionRewards) : stateRewards(hasStateRewards), actionRewards(hasActionRewards), transitionRewards(hasTransitionRewards) { |
|||
// Intentionally left empty
|
|||
} |
|||
|
|||
RewardModelInformation::RewardModelInformation(Model const& model, std::string const& rewardModelNameIdentifier) : RewardModelInformation(model, model.getRewardModelExpression(rewardModelNameIdentifier)) { |
|||
// Intentionally left empty
|
|||
} |
|||
|
|||
RewardModelInformation::RewardModelInformation(Model const& model, storm::expressions::Expression const& rewardModelExpression) : stateRewards(false), actionRewards(false), transitionRewards(false), destinationDependendRewards(false) { |
|||
auto variablesInRewardExpression = rewardExpression.getVariables(); |
|||
std::map<storm::expressions::Variable, storm::expressions::Expression> initialSubstitution; |
|||
for (auto const& v : variablesInRewardExpression) { |
|||
STORM_LOG_ASSERT(model.hasGlobalVariable(v.getName()), "Unable to find global variable " << v.getName() << " occurring in a reward expression."); |
|||
auto const& janiVar = model.getGlobalVariable(v.getName()); |
|||
if (janiVar.hasInitExpression()) { |
|||
initialSubstitution.emplace(v, janiVar.getInitExpression()); |
|||
} |
|||
} |
|||
auto initExpr = storm::jani::substituteJaniExpression(rewardExpression, initialSubstitution); |
|||
if (initExpr.containsVariables() || !storm::utility::isZero(initExpr.evaluateAsRational())) { |
|||
stateRewards = true; |
|||
actionRewards = true; |
|||
transitionRewards = true; |
|||
} |
|||
traverse(model, &variablesInRewardExpression); |
|||
} |
|||
|
|||
void RewardModelInformation::traverse(Location const& location, boost::any const& data) { |
|||
auto const& vars = *boost::any_cast<std::set<storm::expressions::Variable>*>(data); |
|||
if (!hasStateRewards()) { |
|||
for (auto const& assignment : location.getAssignments().getTransientAssignments()) { |
|||
storm::jani::Variable const& assignedVariable = assignment.lValueIsArrayAccess() ? assignment.getLValue().getArray() : assignment.getVariable(); |
|||
if (vars.count(assignedVariable.getExpressionVariable()) > 0) { |
|||
stateRewards = true; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
void RewardModelInformation::traverse(TemplateEdge const& templateEdge, boost::any const& data) { |
|||
auto const& vars = *boost::any_cast<std::set<storm::expressions::Variable>*>(data); |
|||
if (!hasActionRewards()) { |
|||
for (auto const& assignment : templateEdge.getAssignments().getTransientAssignments()) { |
|||
storm::jani::Variable const& assignedVariable = assignment.lValueIsArrayAccess() ? assignment.getLValue().getArray() : assignment.getVariable(); |
|||
if (vars.count(assignedVariable.getExpressionVariable()) > 0) { |
|||
actionRewards = true; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
for (auto const& dest : templateEdge.getDestinations()) { |
|||
traverse(dest, data); |
|||
} |
|||
} |
|||
|
|||
void RewardModelInformation::traverse(TemplateEdgeDestination const& templateEdgeDestination, boost::any const& data) { |
|||
auto const& vars = *boost::any_cast<std::set<storm::expressions::Variable>*>(data); |
|||
if (!hasTransitionRewards()) { |
|||
for (auto const& assignment : templateEdgeDestination.getOrderedAssignments().getTransientAssignments()) { |
|||
storm::jani::Variable const& assignedVariable = assignment.lValueIsArrayAccess() ? assignment.getLValue().getArray() : assignment.getVariable(); |
|||
if (vars.count(assignedVariable.getExpressionVariable()) > 0) { |
|||
transitionRewards = true; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
RewardModelInformation RewardModelInformation::join(RewardModelInformation const& other) const { |
|||
return RewardModelInformation(this->hasStateRewards() || other.hasStateRewards(), |
|||
this->hasActionRewards() || other.hasActionRewards(), |
|||
this->hasTransitionRewards() || other.hasTransitionRewards()); |
|||
} |
|||
|
|||
bool RewardModelInformation::hasStateRewards () const { |
|||
return stateRewards; |
|||
} |
|||
|
|||
bool RewardModelInformation::hasActionRewards () const { |
|||
return actionRewards; |
|||
} |
|||
|
|||
bool RewardModelInformation::hasTransitionRewards () const { |
|||
return transitionReward; |
|||
} |
|||
|
|||
|
|||
} |
|||
} |
|||
|
@ -0,0 +1,59 @@ |
|||
#pragma once |
|||
|
|||
|
|||
#include <boost/any.hpp> |
|||
|
|||
#include "storm/storage/jani/traverser/JaniTraverser.h" |
|||
|
|||
namespace storm { |
|||
|
|||
namespace expressions { |
|||
class Variable; |
|||
class Expression; |
|||
} |
|||
|
|||
namespace jani { |
|||
|
|||
class Model; |
|||
|
|||
class RewardModelInformation : public ConstJaniTraverser { |
|||
public: |
|||
|
|||
RewardModelInformation(bool hasStateRewards, bool hasActionRewards, bool hasTransitionRewards); |
|||
RewardModelInformation(storm::jani::Model const& janiModel, std::string const& rewardModelNameIdentifier); |
|||
RewardModelInformation(storm::jani::Model const& janiModel, storm::expressions::Expression const& rewardModelExpression); |
|||
|
|||
virtual ~RewardModelInformation() = default; |
|||
using ConstJaniTraverser::traverse; |
|||
|
|||
virtual void traverse(Location const& location, boost::any const& data) override; |
|||
virtual void traverse(TemplateEdge const& templateEdge, boost::any const& data) override; |
|||
virtual void traverse(TemplateEdgeDestination const& TemplateEdgeDestination, boost::any const& data) override; |
|||
|
|||
/*! |
|||
* Returns the resulting information when joining the two reward models |
|||
*/ |
|||
RewardModelInformation join(RewardModelInformation const& other) const; |
|||
|
|||
/*! |
|||
* Returns true iff the given reward model has state rewards |
|||
*/ |
|||
bool hasStateRewards () const; |
|||
|
|||
/*! |
|||
* Returns true iff the given reward model has action rewards |
|||
*/ |
|||
bool hasActionRewards () const; |
|||
|
|||
/*! |
|||
* Returns true iff the given reward model has transition rewards |
|||
*/ |
|||
bool hasTransitionRewards () const; |
|||
|
|||
bool stateRewards; |
|||
bool actionRewards; |
|||
bool transitionRewards; |
|||
}; |
|||
} |
|||
} |
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue