@ -1,39 +1,35 @@ 
		
	
		
			
				# include  "storm/logic/RewardAccumulationEliminationVisitor.h" 
 # include  "storm/logic/RewardAccumulationEliminationVisitor.h" 
  
		
	
		
			
				# include  "storm/logic/Formulas.h" 
 # include  "storm/logic/Formulas.h" 
  
		
	
		
			
				
 
		
	
		
			
				# include  "storm/storage/jani/Model.h" 
  
		
	
		
			
				# include  "storm/storage/jani/traverser/AssignmentsFinder.h" 
  
		
	
		
			
				# include  "storm/utility/macros.h" 
 # include  "storm/utility/macros.h" 
  
		
	
		
			
				
 
		
	
		
			
				# include  "storm/exceptions/UnexpectedException.h" 
 # include  "storm/exceptions/UnexpectedException.h" 
  
		
	
		
			
				# include  "storm/exceptions/InvalidPropertyException.h" 
 # include  "storm/exceptions/InvalidPropertyException.h" 
  
		
	
		
			
				# include  "storm/storage/dd/DdManager.h" 
  
		
	
		
			
				# include  "storm/storage/dd/Add.h" 
  
		
	
		
			
				# include  "storm/storage/dd/Bdd.h" 
  
		
	
		
			
				
 
		
	
		
			
				# include  "storm/models/sparse/StandardRewardModel.h" 
  
		
	
		
			
				# include  "storm/models/symbolic/StandardRewardModel.h" 
  
		
	
		
			
				
 
		
	
		
			
				namespace  storm  { namespace  storm  {  
		
	
		
			
				    namespace  logic  {     namespace  logic  {  
		
	
		
			
				
 
		
	
		
			
				        template  < class  RewardModelType >  
		
	
		
			
				        RewardAccumulationEliminationVisitor < RewardModelType > : : RewardAccumulationEliminationVisitor ( std : : unordered_map < std : : string ,  RewardModelType >  const &  rewardModels ,  storm : : models : : ModelType  const &  modelType )  :  rewardModels ( rewardModels )  {  
		
	
		
			
				            if  ( modelType  = =  storm : : models : : ModelType : : Dtmc  | |  modelType  = =  storm : : models : : ModelType : : Mdp  | |  modelType  = =  storm : : models : : ModelType : : S2pg )  {  
		
	
		
			
				                isDiscreteTimeModel  =  true ;  
		
	
		
			
				            }  else  if  ( modelType  = =  storm : : models : : ModelType : : Ctmc  | |  modelType  = =  storm : : models : : ModelType : : MarkovAutomaton )  {  
		
	
		
			
				                isDiscreteTimeModel  =  false ;  
		
	
		
			
				            }  else  {  
		
	
		
			
				                STORM_LOG_THROW ( false ,  storm : : exceptions : : UnexpectedException ,  " Unhandled model type  "  < <  modelType  < <  " . " ) ;  
		
	
		
			
				            }  
		
	
		
			
				        RewardAccumulationEliminationVisitor : : RewardAccumulationEliminationVisitor ( storm : : jani : : Model  const &  model )  :  model ( model )  {  
		
	
		
			
				            // Intentionally left empty
  
		
	
		
			
				        }         }  
		
	
		
			
				                 
		
	
		
			
				        template  < class  RewardModelType >  
		
	
		
			
				        std : : shared_ptr < Formula >  RewardAccumulationEliminationVisitor < RewardModelType > : : eliminateRewardAccumulations ( Formula  const &  f )  const  {  
		
	
		
			
				        std : : shared_ptr < Formula >  RewardAccumulationEliminationVisitor : : eliminateRewardAccumulations ( Formula  const &  f )  const  {  
		
	
		
			
				            boost : : any  result  =  f . accept ( * this ,  boost : : any ( ) ) ;             boost : : any  result  =  f . accept ( * this ,  boost : : any ( ) ) ;  
		
	
		
			
				            return  boost : : any_cast < std : : shared_ptr < Formula > > ( result ) ;             return  boost : : any_cast < std : : shared_ptr < Formula > > ( result ) ;  
		
	
		
			
				        }         }  
		
	
		
			
				                 
		
	
		
			
				        template  < class  RewardModelType >  
		
	
		
			
				        boost : : any  RewardAccumulationEliminationVisitor < RewardModelType > : : visit ( BoundedUntilFormula  const &  f ,  boost : : any  const &  data )  const  {  
		
	
		
			
				        void  RewardAccumulationEliminationVisitor : : eliminateRewardAccumulations ( std : : vector < storm : : jani : : Property > &  properties )  const  {  
		
	
		
			
				            for  ( auto &  p  :  properties )  {  
		
	
		
			
				                auto  formula  =  eliminateRewardAccumulations ( * p . getFilter ( ) . getFormula ( ) ) ;  
		
	
		
			
				                auto  states  =  eliminateRewardAccumulations ( * p . getFilter ( ) . getStatesFormula ( ) ) ;  
		
	
		
			
				                storm : : jani : : FilterExpression  fe ( formula ,  p . getFilter ( ) . getFilterType ( ) ,  states ) ;  
		
	
		
			
				                p  =  storm : : jani : : Property ( p . getName ( ) ,  storm : : jani : : FilterExpression ( formula ,  p . getFilter ( ) . getFilterType ( ) ,  states ) ,  p . getComment ( ) ) ;  
		
	
		
			
				            }  
		
	
		
			
				        }  
		
	
		
			
				         
		
	
		
			
				        boost : : any  RewardAccumulationEliminationVisitor : : visit ( BoundedUntilFormula  const &  f ,  boost : : any  const &  data )  const  {  
		
	
		
			
				            std : : vector < boost : : optional < TimeBound > >  lowerBounds ,  upperBounds ;             std : : vector < boost : : optional < TimeBound > >  lowerBounds ,  upperBounds ;  
		
	
		
			
				            std : : vector < TimeBoundReference >  timeBoundReferences ;             std : : vector < TimeBoundReference >  timeBoundReferences ;  
		
	
		
			
				            for  ( uint64_t  i  =  0 ;  i  <  f . getDimension ( ) ;  + + i )  {             for  ( uint64_t  i  =  0 ;  i  <  f . getDimension ( ) ;  + + i )  {  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -68,8 +64,7 @@ namespace storm { 
		
	
		
			
				            }             }  
		
	
		
			
				        }         }  
		
	
		
			
				                 
		
	
		
			
				        template  < class  RewardModelType >  
		
	
		
			
				        boost : : any  RewardAccumulationEliminationVisitor < RewardModelType > : : visit ( CumulativeRewardFormula  const &  f ,  boost : : any  const &  data )  const  {  
		
	
		
			
				        boost : : any  RewardAccumulationEliminationVisitor : : visit ( CumulativeRewardFormula  const &  f ,  boost : : any  const &  data )  const  {  
		
	
		
			
				            boost : : optional < storm : : logic : : RewardAccumulation >  rewAcc ;             boost : : optional < storm : : logic : : RewardAccumulation >  rewAcc ;  
		
	
		
			
				            STORM_LOG_THROW ( ! data . empty ( ) ,  storm : : exceptions : : UnexpectedException ,  " Formula  "  < <  f  < <  "  does not seem to be a subformula of a reward operator. " ) ;             STORM_LOG_THROW ( ! data . empty ( ) ,  storm : : exceptions : : UnexpectedException ,  " Formula  "  < <  f  < <  "  does not seem to be a subformula of a reward operator. " ) ;  
		
	
		
			
				            auto  rewName  =  boost : : any_cast < boost : : optional < std : : string > > ( data ) ;             auto  rewName  =  boost : : any_cast < boost : : optional < std : : string > > ( data ) ;  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -91,14 +86,13 @@ namespace storm { 
		
	
		
			
				            return  std : : static_pointer_cast < Formula > ( std : : make_shared < CumulativeRewardFormula > ( bounds ,  timeBoundReferences ,  rewAcc ) ) ;             return  std : : static_pointer_cast < Formula > ( std : : make_shared < CumulativeRewardFormula > ( bounds ,  timeBoundReferences ,  rewAcc ) ) ;  
		
	
		
			
				        }         }  
		
	
		
			
				                 
		
	
		
			
				        template  < class  RewardModelType >  
		
	
		
			
				        boost : : any  RewardAccumulationEliminationVisitor < RewardModelType > : : visit ( EventuallyFormula  const &  f ,  boost : : any  const &  data )  const  {  
		
	
		
			
				        boost : : any  RewardAccumulationEliminationVisitor : : visit ( EventuallyFormula  const &  f ,  boost : : any  const &  data )  const  {  
		
	
		
			
				           std : : shared_ptr < Formula >  subformula  =  boost : : any_cast < std : : shared_ptr < Formula > > ( f . getSubformula ( ) . accept ( * this ,  data ) ) ;            std : : shared_ptr < Formula >  subformula  =  boost : : any_cast < std : : shared_ptr < Formula > > ( f . getSubformula ( ) . accept ( * this ,  data ) ) ;  
		
	
		
			
				            if  ( f . hasRewardAccumulation ( ) )  {             if  ( f . hasRewardAccumulation ( ) )  {  
		
	
		
			
				                if  ( f . isTimePathFormula ( ) )  {                 if  ( f . isTimePathFormula ( ) )  {  
		
	
		
			
				                    if  ( isDiscreteTimeModel  & &  ( ( ! f . getRewardAccumulation ( ) . isExitSet ( )  & &  ! f . getRewardAccumulation ( ) . isStepsSet ( ) )  | |  ( f . getRewardAccumulation ( ) . isStepsSet ( )  & &  f . getRewardAccumulation ( ) . isExitSet ( ) ) ) )  {  
		
	
		
			
				                    if  ( model . isDiscreteTimeModel ( ) & &  ( ( ! f . getRewardAccumulation ( ) . isExitSet ( )  & &  ! f . getRewardAccumulation ( ) . isStepsSet ( ) )  | |  ( f . getRewardAccumulation ( ) . isStepsSet ( )  & &  f . getRewardAccumulation ( ) . isExitSet ( ) ) ) )  {  
		
	
		
			
				                        return  std : : static_pointer_cast < Formula > ( std : : make_shared < EventuallyFormula > ( subformula ,  f . getContext ( ) ,  f . getRewardAccumulation ( ) ) ) ;                         return  std : : static_pointer_cast < Formula > ( std : : make_shared < EventuallyFormula > ( subformula ,  f . getContext ( ) ,  f . getRewardAccumulation ( ) ) ) ;  
		
	
		
			
				                    }  else  if  ( ! isDiscreteTimeModel  & &  ( ! f . getRewardAccumulation ( ) . isTimeSet ( )  | |  f . getRewardAccumulation ( ) . isExitSet ( )  | |  f . getRewardAccumulation ( ) . isStepsSet ( ) ) )  {  
		
	
		
			
				                    }  else  if  ( ! model . isDiscreteTimeModel ( ) & &  ( ! f . getRewardAccumulation ( ) . isTimeSet ( )  | |  f . getRewardAccumulation ( ) . isExitSet ( )  | |  f . getRewardAccumulation ( ) . isStepsSet ( ) ) )  {  
		
	
		
			
				                        return  std : : static_pointer_cast < Formula > ( std : : make_shared < EventuallyFormula > ( subformula ,  f . getContext ( ) ,  f . getRewardAccumulation ( ) ) ) ;                         return  std : : static_pointer_cast < Formula > ( std : : make_shared < EventuallyFormula > ( subformula ,  f . getContext ( ) ,  f . getRewardAccumulation ( ) ) ) ;  
		
	
		
			
				                    }                     }  
		
	
		
			
				                }  else  if  ( f . isRewardPathFormula ( ) )  {                 }  else  if  ( f . isRewardPathFormula ( ) )  {  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -112,14 +106,12 @@ namespace storm { 
		
	
		
			
				            return  std : : static_pointer_cast < Formula > ( std : : make_shared < EventuallyFormula > ( subformula ,  f . getContext ( ) ) ) ;             return  std : : static_pointer_cast < Formula > ( std : : make_shared < EventuallyFormula > ( subformula ,  f . getContext ( ) ) ) ;  
		
	
		
			
				        }         }  
		
	
		
			
				                 
		
	
		
			
				        template  < class  RewardModelType >  
		
	
		
			
				        boost : : any  RewardAccumulationEliminationVisitor < RewardModelType > : : visit ( RewardOperatorFormula  const &  f ,  boost : : any  const &  data )  const  {  
		
	
		
			
				        boost : : any  RewardAccumulationEliminationVisitor : : visit ( RewardOperatorFormula  const &  f ,  boost : : any  const &  data )  const  {  
		
	
		
			
				            std : : shared_ptr < Formula >  subformula  =  boost : : any_cast < std : : shared_ptr < Formula > > ( f . getSubformula ( ) . accept ( * this ,  f . getOptionalRewardModelName ( ) ) ) ;             std : : shared_ptr < Formula >  subformula  =  boost : : any_cast < std : : shared_ptr < Formula > > ( f . getSubformula ( ) . accept ( * this ,  f . getOptionalRewardModelName ( ) ) ) ;  
		
	
		
			
				            return  std : : static_pointer_cast < Formula > ( std : : make_shared < RewardOperatorFormula > ( subformula ,  f . getOptionalRewardModelName ( ) ,  f . getOperatorInformation ( ) ) ) ;             return  std : : static_pointer_cast < Formula > ( std : : make_shared < RewardOperatorFormula > ( subformula ,  f . getOptionalRewardModelName ( ) ,  f . getOperatorInformation ( ) ) ) ;  
		
	
		
			
				        }         }  
		
	
		
			
				                 
		
	
		
			
				        template  < class  RewardModelType >  
		
	
		
			
				        boost : : any  RewardAccumulationEliminationVisitor < RewardModelType > : : visit ( TotalRewardFormula  const &  f ,  boost : : any  const &  data )  const  {  
		
	
		
			
				        boost : : any  RewardAccumulationEliminationVisitor : : visit ( TotalRewardFormula  const &  f ,  boost : : any  const &  data )  const  {  
		
	
		
			
				            STORM_LOG_THROW ( ! data . empty ( ) ,  storm : : exceptions : : UnexpectedException ,  " Formula  "  < <  f  < <  "  does not seem to be a subformula of a reward operator. " ) ;             STORM_LOG_THROW ( ! data . empty ( ) ,  storm : : exceptions : : UnexpectedException ,  " Formula  "  < <  f  < <  "  does not seem to be a subformula of a reward operator. " ) ;  
		
	
		
			
				            auto  rewName  =  boost : : any_cast < boost : : optional < std : : string > > ( data ) ;             auto  rewName  =  boost : : any_cast < boost : : optional < std : : string > > ( data ) ;  
		
	
		
			
				            if  ( f . hasRewardAccumulation ( )  | |  canEliminate ( f . getRewardAccumulation ( ) ,  rewName ) )  {             if  ( f . hasRewardAccumulation ( )  | |  canEliminate ( f . getRewardAccumulation ( ) ,  rewName ) )  {  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -129,23 +121,22 @@ namespace storm { 
		
	
		
			
				            }             }  
		
	
		
			
				        }         }  
		
	
		
			
				                 
		
	
		
			
				        template  < class  RewardModelType >  
		
	
		
			
				        bool  RewardAccumulationEliminationVisitor < RewardModelType > : : canEliminate ( storm : : logic : : RewardAccumulation  const &  accumulation ,  boost : : optional < std : : string >  rewardModelName )  const  {  
		
	
		
			
				            auto  rewModelIt  =  rewardModels . end ( ) ;  
		
	
		
			
				            if  ( rewardModelName . is_initialized ( ) ) {  
		
	
		
			
				                rewModelIt  =  rewardModels . find ( rewardModelName . get ( ) ) ;  
		
	
		
			
				                STORM_LOG_THROW ( rewModelIt  ! =  rewardModels . end ( ) ,  storm : : exceptions : : InvalidPropertyException ,  " Unable to find reward model with name  "  < <  rewardModelName . get ( ) ) ;  
		
	
		
			
				            }  else  if  ( rewardModels . size ( )  = =  1 )  {  
		
	
		
			
				                rewModelIt  =  rewardModels . begin ( ) ;  
		
	
		
			
				            }  else  {  
		
	
		
			
				                STORM_LOG_THROW ( false ,  storm : : exceptions : : InvalidPropertyException ,  " Multiple reward models were defined but no reward model name was given for at least one property. " ) ;  
		
	
		
			
				        bool  RewardAccumulationEliminationVisitor : : canEliminate ( storm : : logic : : RewardAccumulation  const &  accumulation ,  boost : : optional < std : : string >  rewardModelName )  const  {  
		
	
		
			
				            STORM_LOG_THROW ( rewardModelName . is_initialized ( ) ,  storm : : exceptions : : InvalidPropertyException ,  " Unable to find transient variable with for unique reward model. " ) ;  
		
	
		
			
				            storm : : jani : : AssignmentsFinder : : ResultType  assignmentKinds ;  
		
	
		
			
				            STORM_LOG_THROW ( model . hasGlobalVariable ( rewardModelName . get ( ) ) ,  storm : : exceptions : : InvalidPropertyException ,  " Unable to find transient variable with name  "  < <  rewardModelName . get ( )  < <  " . " ) ;  
		
	
		
			
				            storm : : jani : : Variable  const &  transientVar  =  model . getGlobalVariable ( rewardModelName . get ( ) ) ;  
		
	
		
			
				            if  ( transientVar . getInitExpression ( ) . containsVariables ( )  | |  ! storm : : utility : : isZero ( transientVar . getInitExpression ( ) . evaluateAsRational ( ) ) )  {  
		
	
		
			
				                assignmentKinds . hasLocationAssignment  =  true ;  
		
	
		
			
				                assignmentKinds . hasEdgeAssignment  =  true ;  
		
	
		
			
				                assignmentKinds . hasEdgeDestinationAssignment  =  true ;  
		
	
		
			
				            }             }  
		
	
		
			
				            RewardModelType  const &  rewardModel  =  rewModelIt - > second ;  
		
	
		
			
				            if  ( ( rewardModel . hasStateActionRewards ( )  | |  rewardModel . hasTransitionRewards ( ) )  & &  ! accumulation . isStepsSet ( ) )  {  
		
	
		
			
				            assignmentKinds  =  storm : : jani : : AssignmentsFinder ( ) . find ( model ,  transientVar ) ;  
		
	
		
			
				            if  ( ( assignmentKinds . hasEdgeAssignment  | |  assignmentKinds . hasEdgeDestinationAssignment )  & &  ! accumulation . isStepsSet ( ) )  {  
		
	
		
			
				                return  false ;                 return  false ;  
		
	
		
			
				            }             }  
		
	
		
			
				            if  ( rewardModel . hasStateRewards ( ) )  {  
		
	
		
			
				                if  ( isDiscreteTimeModel )  {  
		
	
		
			
				            if  ( assignmentKinds . hasLocationAssignment )  {  
		
	
		
			
				                if  ( model . isDiscreteTimeModel ( ) )  {  
		
	
		
			
				                    if  ( ! accumulation . isExitSet ( ) )  {                     if  ( ! accumulation . isExitSet ( ) )  {  
		
	
		
			
				                        return  false ;                         return  false ;  
		
	
		
			
				                    }                     }  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -158,16 +149,5 @@ namespace storm { 
		
	
		
			
				            }             }  
		
	
		
			
				            return  true ;             return  true ;  
		
	
		
			
				        }         }  
		
	
		
			
				         
		
	
		
			
				        template  class  RewardAccumulationEliminationVisitor < storm : : models : : sparse : : StandardRewardModel < double > > ;  
		
	
		
			
				        template  class  RewardAccumulationEliminationVisitor < storm : : models : : sparse : : StandardRewardModel < storm : : RationalNumber > > ;  
		
	
		
			
				        template  class  RewardAccumulationEliminationVisitor < storm : : models : : sparse : : StandardRewardModel < storm : : RationalFunction > > ;  
		
	
		
			
				        template  class  RewardAccumulationEliminationVisitor < storm : : models : : sparse : : StandardRewardModel < storm : : Interval > > ;  
		
	
		
			
				         
		
	
		
			
				        template  class  RewardAccumulationEliminationVisitor < storm : : models : : symbolic : : StandardRewardModel < storm : : dd : : DdType : : CUDD ,  double > > ;  
		
	
		
			
				        template  class  RewardAccumulationEliminationVisitor < storm : : models : : symbolic : : StandardRewardModel < storm : : dd : : DdType : : Sylvan ,  double > > ;  
		
	
		
			
				        template  class  RewardAccumulationEliminationVisitor < storm : : models : : symbolic : : StandardRewardModel < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber > > ;  
		
	
		
			
				        template  class  RewardAccumulationEliminationVisitor < storm : : models : : symbolic : : StandardRewardModel < storm : : dd : : DdType : : Sylvan ,  storm : : RationalFunction > > ;  
		
	
		
			
				
 
		
	
		
			
				    }     }  
		
	
		
			
				} }