Browse Source
			
			
			Added a traverser that finds out, whether a given reward model has state/action/transition rewards
			
			
				main
			
			
		
		Added a traverser that finds out, whether a given reward model has state/action/transition rewards
	
		
	
			
			
				main
			
			
		
				 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