@ -11,6 +11,7 @@
# include "storm/exceptions/InvalidJaniException.h"
# include "storm/exceptions/NotImplementedException.h"
# include "storm/exceptions/InvalidPropertyException.h"
# include "storm/storage/expressions/RationalLiteralExpression.h"
# include "storm/storage/expressions/IntegerLiteralExpression.h"
@ -29,6 +30,7 @@
# include "storm/storage/jani/AutomatonComposition.h"
# include "storm/storage/jani/ParallelComposition.h"
# include "storm/storage/jani/Property.h"
# include "storm/storage/jani/traverser/AssignmentsFinder.h"
namespace storm {
namespace jani {
@ -153,6 +155,24 @@ namespace storm {
return iDecl ;
}
modernjson : : json FormulaToJaniJson : : constructRewardAccumulation ( storm : : logic : : RewardAccumulation const & rewardAccumulation , std : : string const & rewardModelName ) const {
storm : : jani : : Variable const & transientVar = model . getGlobalVariable ( rewardModelName ) ;
storm : : jani : : AssignmentsFinder : : ResultType assignmentKinds ;
STORM_LOG_THROW ( model . hasGlobalVariable ( rewardModelName ) , storm : : exceptions : : InvalidPropertyException , " Unable to find transient variable with name " < < rewardModelName < < " . " ) ;
if ( transientVar . getInitExpression ( ) . containsVariables ( ) | | ! storm : : utility : : isZero ( transientVar . getInitExpression ( ) . evaluateAsRational ( ) ) ) {
assignmentKinds . hasLocationAssignment = true ;
assignmentKinds . hasEdgeAssignment = true ;
assignmentKinds . hasEdgeDestinationAssignment = true ;
}
assignmentKinds = storm : : jani : : AssignmentsFinder ( ) . find ( model , transientVar ) ;
bool steps = rewardAccumulation . isStepsSet ( ) & & ( assignmentKinds . hasEdgeAssignment | | assignmentKinds . hasEdgeDestinationAssignment ) ;
bool time = rewardAccumulation . isTimeSet ( ) & & ! model . isDiscreteTimeModel ( ) & & assignmentKinds . hasLocationAssignment ;
bool exit = rewardAccumulation . isExitSet ( ) & & assignmentKinds . hasLocationAssignment ;
return constructRewardAccumulation ( storm : : logic : : RewardAccumulation ( steps , time , exit ) ) ;
}
modernjson : : json FormulaToJaniJson : : constructRewardAccumulation ( storm : : logic : : RewardAccumulation const & rewardAccumulation ) const {
std : : vector < std : : string > res ;
if ( rewardAccumulation . isStepsSet ( ) ) {
@ -168,11 +188,11 @@ namespace storm {
return res ;
}
modernjson : : json FormulaToJaniJson : : constructStandardRewardAccumulation ( ) const {
modernjson : : json FormulaToJaniJson : : constructStandardRewardAccumulation ( std : : string const & rewardModelName ) const {
if ( model . isDiscreteTimeModel ( ) ) {
return constructRewardAccumulation ( storm : : logic : : RewardAccumulation ( true , false , true ) ) ;
return constructRewardAccumulation ( storm : : logic : : RewardAccumulation ( true , false , true ) , rewardModelName ) ;
} else {
return constructRewardAccumulation ( storm : : logic : : RewardAccumulation ( true , true , false ) ) ;
return constructRewardAccumulation ( storm : : logic : : RewardAccumulation ( true , true , false ) , rewardModelName ) ;
}
}
@ -241,9 +261,9 @@ namespace storm {
modernjson : : json rewbound ;
rewbound [ " exp " ] = tbr . getRewardName ( ) ;
if ( tbr . hasRewardAccumulation ( ) ) {
rewbound [ " accumulate " ] = constructRewardAccumulation ( tbr . getRewardAccumulation ( ) ) ;
rewbound [ " accumulate " ] = constructRewardAccumulation ( tbr . getRewardAccumulation ( ) , tbr . getRewardName ( ) ) ;
} else {
rewbound [ " accumulate " ] = constructStandardRewardAccumulation ( ) ;
rewbound [ " accumulate " ] = constructStandardRewardAccumulation ( tbr . getRewardName ( ) ) ;
}
rewbound [ " bounds " ] = propertyInterval ;
rewardBounds . push_back ( std : : move ( rewbound ) ) ;
@ -469,18 +489,18 @@ namespace storm {
if ( f . getSubformula ( ) . isEventuallyFormula ( ) ) {
opDecl [ " left " ] [ " reach " ] = boost : : any_cast < modernjson : : json > ( f . getSubformula ( ) . asEventuallyFormula ( ) . getSubformula ( ) . accept ( * this , data ) ) ;
if ( f . getSubformula ( ) . asEventuallyFormula ( ) . hasRewardAccumulation ( ) ) {
opDecl [ " left " ] [ " accumulate " ] = constructRewardAccumulation ( f . getSubformula ( ) . asEventuallyFormula ( ) . getRewardAccumulation ( ) ) ;
opDecl [ " left " ] [ " accumulate " ] = constructRewardAccumulation ( f . getSubformula ( ) . asEventuallyFormula ( ) . getRewardAccumulation ( ) , rewardModelName ) ;
} else {
opDecl [ " left " ] [ " accumulate " ] = constructStandardRewardAccumulation ( ) ;
opDecl [ " left " ] [ " accumulate " ] = constructStandardRewardAccumulation ( rewardModelName ) ;
}
} else if ( f . getSubformula ( ) . isCumulativeRewardFormula ( ) ) {
// TODO: support for reward bounded formulas
STORM_LOG_WARN_COND ( ! f . getSubformula ( ) . asCumulativeRewardFormula ( ) . getTimeBoundReference ( ) . isRewardBound ( ) , " Export for reward bounded cumulative reward formulas currently unsupported. " ) ;
opDecl [ " left " ] [ instantName ] = buildExpression ( f . getSubformula ( ) . asCumulativeRewardFormula ( ) . getBound ( ) , model . getConstants ( ) , model . getGlobalVariables ( ) ) ;
if ( f . getSubformula ( ) . asCumulativeRewardFormula ( ) . hasRewardAccumulation ( ) ) {
opDecl [ " left " ] [ " accumulate " ] = constructRewardAccumulation ( f . getSubformula ( ) . asCumulativeRewardFormula ( ) . getRewardAccumulation ( ) ) ;
opDecl [ " left " ] [ " accumulate " ] = constructRewardAccumulation ( f . getSubformula ( ) . asCumulativeRewardFormula ( ) . getRewardAccumulation ( ) , rewardModelName ) ;
} else {
opDecl [ " left " ] [ " accumulate " ] = constructStandardRewardAccumulation ( ) ;
opDecl [ " left " ] [ " accumulate " ] = constructStandardRewardAccumulation ( rewardModelName ) ;
}
} else if ( f . getSubformula ( ) . isInstantaneousRewardFormula ( ) ) {
opDecl [ " left " ] [ instantName ] = buildExpression ( f . getSubformula ( ) . asInstantaneousRewardFormula ( ) . getBound ( ) , model . getConstants ( ) , model . getGlobalVariables ( ) ) ;
@ -499,18 +519,18 @@ namespace storm {
if ( f . getSubformula ( ) . isEventuallyFormula ( ) ) {
opDecl [ " reach " ] = boost : : any_cast < modernjson : : json > ( f . getSubformula ( ) . asEventuallyFormula ( ) . getSubformula ( ) . accept ( * this , data ) ) ;
if ( f . getSubformula ( ) . asEventuallyFormula ( ) . hasRewardAccumulation ( ) ) {
opDecl [ " accumulate " ] = constructRewardAccumulation ( f . getSubformula ( ) . asEventuallyFormula ( ) . getRewardAccumulation ( ) ) ;
opDecl [ " accumulate " ] = constructRewardAccumulation ( f . getSubformula ( ) . asEventuallyFormula ( ) . getRewardAccumulation ( ) , rewardModelName ) ;
} else {
opDecl [ " accumulate " ] = constructStandardRewardAccumulation ( ) ;
opDecl [ " accumulate " ] = constructStandardRewardAccumulation ( rewardModelName ) ;
}
} else if ( f . getSubformula ( ) . isCumulativeRewardFormula ( ) ) {
// TODO: support for reward bounded formulas
STORM_LOG_WARN_COND ( ! f . getSubformula ( ) . asCumulativeRewardFormula ( ) . getTimeBoundReference ( ) . isRewardBound ( ) , " Export for reward bounded cumulative reward formulas currently unsupported. " ) ;
opDecl [ instantName ] = buildExpression ( f . getSubformula ( ) . asCumulativeRewardFormula ( ) . getBound ( ) , model . getConstants ( ) , model . getGlobalVariables ( ) ) ;
if ( f . getSubformula ( ) . asCumulativeRewardFormula ( ) . hasRewardAccumulation ( ) ) {
opDecl [ " accumulate " ] = constructRewardAccumulation ( f . getSubformula ( ) . asCumulativeRewardFormula ( ) . getRewardAccumulation ( ) ) ;
opDecl [ " accumulate " ] = constructRewardAccumulation ( f . getSubformula ( ) . asCumulativeRewardFormula ( ) . getRewardAccumulation ( ) , rewardModelName ) ;
} else {
opDecl [ " accumulate " ] = constructStandardRewardAccumulation ( ) ;
opDecl [ " accumulate " ] = constructStandardRewardAccumulation ( rewardModelName ) ;
}
} else if ( f . getSubformula ( ) . isInstantaneousRewardFormula ( ) ) {
opDecl [ instantName ] = buildExpression ( f . getSubformula ( ) . asInstantaneousRewardFormula ( ) . getBound ( ) , model . getConstants ( ) , model . getGlobalVariables ( ) ) ;