@ -255,10 +255,6 @@ namespace storm { 
			
		
	
		
			
				
					                        STORM_LOG_THROW ( propertyStructure . count ( " reward-instants " )  = =  0 ,  storm : : exceptions : : NotSupportedException ,  " Storm does not support to have a step-instant and a reward-instant in  "  +  context ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                        storm : : expressions : : Expression  stepInstantExpr  =  parseExpression ( propertyStructure . at ( " step-instant " ) ,  " Step instant in  "  +  context ,  globalVars ,  constants ) ;  
			
		
	
		
			
				
					                        STORM_LOG_THROW ( ! stepInstantExpr . containsVariables ( ) ,  storm : : exceptions : : NotSupportedException ,  " Storm only allows constant step-instants " ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                        int64_t  stepInstant  =  stepInstantExpr . evaluateAsInt ( ) ;  
			
		
	
		
			
				
					                        STORM_LOG_THROW ( stepInstant  > =  0 ,  storm : : exceptions : : InvalidJaniException ,  " Only non-negative step-instants are allowed " ) ;  
			
		
	
		
			
				
					                        if ( ! accTime  & &  ! accSteps )  {  
			
		
	
		
			
				
					                            if  ( rewExpr . isVariable ( ) )  {  
			
		
	
		
			
				
					                                std : : string  rewardName  =  rewExpr . getVariables ( ) . begin ( ) - > getName ( ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -280,8 +276,6 @@ namespace storm { 
			
		
	
		
			
				
					                        storm : : expressions : : Expression  timeInstantExpr  =  parseExpression ( propertyStructure . at ( " time-instant " ) ,  " time instant in  "  +  context ,  globalVars ,  constants ) ;  
			
		
	
		
			
				
					                        STORM_LOG_THROW ( ! timeInstantExpr . containsVariables ( ) ,  storm : : exceptions : : NotSupportedException ,  " Storm only allows constant time-instants " ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                        double  timeInstant  =  timeInstantExpr . evaluateAsDouble ( ) ;  
			
		
	
		
			
				
					                        STORM_LOG_THROW ( timeInstant  > =  0 ,  storm : : exceptions : : InvalidJaniException ,  " Only non-negative time-instants are allowed " ) ;  
			
		
	
		
			
				
					                        if ( ! accTime  & &  ! accSteps )  {  
			
		
	
		
			
				
					                            if  ( rewExpr . isVariable ( ) )  {  
			
		
	
		
			
				
					                                std : : string  rewardName  =  rewExpr . getVariables ( ) . begin ( ) - > getName ( ) ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -317,8 +311,6 @@ namespace storm { 
			
		
	
		
			
				
					                            STORM_LOG_THROW ( ( rewInstAccTime  & &  ! rewInstAccSteps )  | |  ( ! rewInstAccTime  & &  rewInstAccSteps ) ,  storm : : exceptions : : NotSupportedException ,  " Storm only allows to accumulate either over time or over steps in  "  +  context ) ;  
			
		
	
		
			
				
					                            storm : : expressions : : Expression  rewInstantExpr  =  parseExpression ( rewInst . at ( " instant " ) ,  " reward instant in  "  +  context ,  globalVars ,  constants ) ;  
			
		
	
		
			
				
					                            STORM_LOG_THROW ( ! rewInstantExpr . containsVariables ( ) ,  storm : : exceptions : : NotSupportedException ,  " Storm only allows constant time-instants " ) ;  
			
		
	
		
			
				
					                            double  rewInstant  =  rewInstantExpr . evaluateAsDouble ( ) ;  
			
		
	
		
			
				
					                            STORM_LOG_THROW ( rewInstant  > =  0 ,  storm : : exceptions : : InvalidJaniException ,  " Only non-negative reward-instants are allowed " ) ;  
			
		
	
		
			
				
					                            bounds . emplace_back ( false ,  rewInstantExpr ) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                        if  ( rewExpr . isVariable ( ) )  {  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -376,39 +368,40 @@ namespace storm { 
			
		
	
		
			
				
					                        args . push_back ( args [ 0 ] ) ;  
			
		
	
		
			
				
					                        args [ 0 ]  =  storm : : logic : : BooleanLiteralFormula : : getTrueFormula ( ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                     
			
		
	
		
			
				
					                    std : : vector < boost : : optional < storm : : logic : : TimeBound > >  lowerBounds ,  upperBounds ;  
			
		
	
		
			
				
					                    std : : vector < storm : : logic : : TimeBoundReference >  tbReferences ;  
			
		
	
		
			
				
					                    if  ( propertyStructure . count ( " step-bounds " )  >  0 )  {  
			
		
	
		
			
				
					                        storm : : jani : : PropertyInterval  pi  =  parsePropertyInterval ( propertyStructure . at ( " step-bounds " ) ) ;  
			
		
	
		
			
				
					                        boost : : optional < storm : : logic : : TimeBound >  lowerBound ,  upperBound ;  
			
		
	
		
			
				
					                        if  ( pi . hasLowerBound ( ) )  {  
			
		
	
		
			
				
					                            int64_t  lowerBoundInt  =  pi . lowerBound . evaluateAsInt ( ) ;  
			
		
	
		
			
				
					                            STORM_LOG_THROW ( lowerBoundInt  > =  0 ,  storm : : exceptions : : InvalidJaniException ,  " Step-bounds cannot be negative " ) ;   
			
		
	
		
			
				
					                            lowerBound  =  storm : : logic  : : TimeBound ( pi . l owerBou ndStrict ,  pi . low erBound ) ;  
			
		
	
		
			
				
					                            lowerBounds . push_back ( storm : : logic : : TimeBound ( pi . lowerBoundStrict ,  pi . lowerBound ) ) ;  
			
		
	
		
			
				
					                        }  else  {  
			
		
	
		
			
				
					                            lowerBounds . push_back ( boost  : : n one) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                        if  ( pi . hasUpperBound ( ) )  {  
			
		
	
		
			
				
					                            int64_t  upperBoundInt  =  pi . upperBound . evaluateAsInt ( ) ;  
			
		
	
		
			
				
					                            STORM_LOG_THROW ( upperBoundInt  > =  0 ,  storm : : exceptions : : InvalidJaniException ,  " Step-bounds cannot be negative " ) ;   
			
		
	
		
			
				
					                            upperBound  =  storm : : logic  : : TimeBound ( pi . upperB ou ndStrict ,  pi . upp erBound ) ;  
			
		
	
		
			
				
					                            upperBounds . push_back ( storm : : logic : : TimeBound ( pi . upperBoundStrict ,  pi . upperBound ) ) ;  
			
		
	
		
			
				
					                        }  else  {  
			
		
	
		
			
				
					                            upperBounds . push_back ( boost  : : n one) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                        return  std : : make_shared < storm : : logic : : BoundedUntilFormula  const > ( args [ 0 ] ,  args [ 1 ] ,  lowerBound ,  upperBound ,  storm : : logic : : TimeBoundReference ( storm : : logic : : TimeBoundType : : Steps ) ) ;  
			
		
	
		
			
				
					                    }  else  if  ( propertyStructure . count ( " time-bounds " )  >  0 )  {  
			
		
	
		
			
				
					                        tbReferences . emplace_back ( storm : : logic : : TimeBoundType : : Steps ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                    if  ( propertyStructure . count ( " time-bounds " )  >  0 )  {  
			
		
	
		
			
				
					                        storm : : jani : : PropertyInterval  pi  =  parsePropertyInterval ( propertyStructure . at ( " time-bounds " ) ) ;  
			
		
	
		
			
				
					                        boost : : optional < storm : : logic : : TimeBound >  lowerBound ,  upperBound ;  
			
		
	
		
			
				
					                        if  ( pi . hasLowerBound ( ) )  {  
			
		
	
		
			
				
					                            double  lowerBoundDouble  =  pi . lowerBound . evaluateAsInt ( ) ;  
			
		
	
		
			
				
					                            STORM_LOG_THROW ( lowerBoundDouble  > =  0 ,  storm : : exceptions : : InvalidJaniException ,  " time-bounds cannot be negative " ) ;   
			
		
	
		
			
				
					                            lowerBound  =  storm : : logic  : : TimeBound ( pi . l owerBou ndStrict ,  pi . low erBound ) ;  
			
		
	
		
			
				
					                            lowerBounds . push_back ( storm : : logic : : TimeBound ( pi . lowerBoundStrict ,  pi . lowerBound ) ) ;  
			
		
	
		
			
				
					                        }  else  {  
			
		
	
		
			
				
					                            lowerBounds . push_back ( boost  : : n one) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                        if  ( pi . hasUpperBound ( ) )  {  
			
		
	
		
			
				
					                            double  upperBoundDouble  =  pi . upperBound . evaluateAsInt ( ) ;  
			
		
	
		
			
				
					                            STORM_LOG_THROW ( upperBoundDouble  > =  0 ,  storm : : exceptions : : InvalidJaniException ,  " time-bounds cannot be negative " ) ;   
			
		
	
		
			
				
					                            upperBound  =  storm : : logic  : : TimeBound ( pi . upperB ou ndStrict ,  pi . upp erBound ) ;  
			
		
	
		
			
				
					                            upperBounds . push_back ( storm : : logic : : TimeBound ( pi . upperBoundStrict ,  pi . upperBound ) ) ;  
			
		
	
		
			
				
					                        }  else  {  
			
		
	
		
			
				
					                            upperBounds . push_back ( boost  : : n one) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                        return  std : : make_shared < storm : : logic : : BoundedUntilFormula  const > ( args [ 0 ] ,  args [ 1 ] ,  lowerBound ,  upperBound ,  storm : : logic : : TimeBoundReference ( storm : : logic : : TimeBoundType : : Time ) ) ;  
			
		
	
		
			
				
					                         
			
		
	
		
			
				
					                    }  else  if  ( propertyStructure . count ( " reward-bounds " )  >  0  )  {  
			
		
	
		
			
				
					                        std : : vector < boost : : optional < storm : : logic : : TimeBound > >  lowerBounds ;  
			
		
	
		
			
				
					                        std : : vector < boost : : optional < storm : : logic : : TimeBound > >  upperBounds ;  
			
		
	
		
			
				
					                        std : : vector < storm : : logic : : TimeBoundReference >  tbReferences ;  
			
		
	
		
			
				
					                        tbReferences . emplace_back ( storm : : logic : : TimeBoundType : : Time ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                    if  ( propertyStructure . count ( " reward-bounds " )  >  0  )  {  
			
		
	
		
			
				
					                        for  ( auto  const &  rbStructure  :  propertyStructure . at ( " reward-bounds " ) )  {  
			
		
	
		
			
				
					                            storm : : jani : : PropertyInterval  pi  =  parsePropertyInterval ( rbStructure . at ( " bounds " ) ) ;  
			
		
	
		
			
				
					                            STORM_LOG_THROW ( rbStructure . count ( " exp " )  = =  1 ,  storm : : exceptions : : InvalidJaniException ,  " Expecting reward-expression for operator  "  < <  opString  < <  "  in   "  < <  context ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -416,13 +409,6 @@ namespace storm { 
			
		
	
		
			
				
					                            STORM_LOG_THROW ( rewExpr . isVariable ( ) ,  storm : : exceptions : : NotSupportedException ,  " Storm currently does not support complex reward expressions. " ) ;  
			
		
	
		
			
				
					                            std : : string  rewardName  =  rewExpr . getVariables ( ) . begin ( ) - > getName ( ) ;  
			
		
	
		
			
				
					                            STORM_LOG_WARN ( " Reward-type (steps, time) is deduced from model type. " ) ;  
			
		
	
		
			
				
					                            double  lowerBound  =  0.0 ;  
			
		
	
		
			
				
					                            if ( pi . hasLowerBound ( ) )  {  
			
		
	
		
			
				
					                                lowerBound  =  pi . lowerBound . evaluateAsDouble ( ) ;  
			
		
	
		
			
				
					                            }  
			
		
	
		
			
				
					                            double  upperBound  =  pi . upperBound . evaluateAsDouble ( ) ;  
			
		
	
		
			
				
					                            STORM_LOG_THROW ( lowerBound  > =  0 ,  storm : : exceptions : : InvalidJaniException ,  " (Lower) time-bounds cannot be negative " ) ;  
			
		
	
		
			
				
					                            STORM_LOG_THROW ( upperBound  > =  0 ,  storm : : exceptions : : InvalidJaniException ,  " (Upper) time-bounds cannot be negative " ) ;  
			
		
	
		
			
				
					                            if  ( pi . hasLowerBound ( ) )  {  
			
		
	
		
			
				
					                                lowerBounds . push_back ( storm : : logic : : TimeBound ( pi . lowerBoundStrict ,  pi . lowerBound ) ) ;  
			
		
	
		
			
				
					                            }  else  {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -435,11 +421,10 @@ namespace storm { 
			
		
	
		
			
				
					                            }  
			
		
	
		
			
				
					                            tbReferences . push_back ( storm : : logic : : TimeBoundReference ( rewardName ) ) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                        auto  res  =  std : : make_shared < storm : : logic : : BoundedUntilFormula  const > ( args [ 0 ] ,  args [ 1 ] ,  lowerBounds ,  upperBounds ,  tbReferences ) ;  
			
		
	
		
			
				
					                        return  res ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                    if  ( args [ 0 ] - > isTrueFormula ( ) )  {  
			
		
	
		
			
				
					                    if  ( ! tbReferences . empty ( ) )  {  
			
		
	
		
			
				
					                        return  std : : make_shared < storm : : logic : : BoundedUntilFormula  const > ( args [ 0 ] ,  args [ 1 ] ,  lowerBounds ,  upperBounds ,  tbReferences ) ;  
			
		
	
		
			
				
					                    }  else  if  ( args [ 0 ] - > isTrueFormula ( ) )  {  
			
		
	
		
			
				
					                        return  std : : make_shared < storm : : logic : : EventuallyFormula  const > ( args [ 1 ] ,  formulaContext ) ;  
			
		
	
		
			
				
					                    }  else  {  
			
		
	
		
			
				
					                        return  std : : make_shared < storm : : logic : : UntilFormula  const > ( args [ 0 ] ,  args [ 1 ] ) ;