@ -46,10 +46,10 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template < storm : : dd : : DdType  DdType ,  typename  ValueType ,  typename  std : : enable_if < storm : : NumberTraits < ValueType > : : SupportsExponential ,  int > : : type >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < DdType ,  ValueType >  const &  model ,  storm : : dd : : Add < DdType ,  ValueType >  const &  transitionMatrix ,  storm : : dd : : Bdd < DdType >  const &  markovianStates ,  storm : : dd : : Add < DdType ,  ValueType >  const &  exitRateVector ,  storm : : dd : : Bdd < DdType >  const &  psiStates ,  bool  qualitative ,  double  lowerBound ,  double  upperBound )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < DdType ,  ValueType >  const &  model ,  storm : : dd : : Add < DdType ,  ValueType >  const &  transitionMatrix ,  storm : : dd : : Bdd < DdType >  const &  markovianStates ,  storm : : dd : : Add < DdType ,  ValueType >  const &  exitRateVector ,  storm : : dd : : Bdd < DdType >  const &  phiStates ,  storm : : dd : : Bdd < DdType >  const &  p siStates ,  bool  qualitative ,  double  lowerBound ,  double  upperBound )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // If the time bounds are [0, inf], we rather call untimed reachability.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( storm : : utility : : isZero ( lowerBound )  & &  upperBound  = =  storm : : utility : : infinity < ValueType > ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    return  storm : : modelchecker : : helper : : HybridMdpPrctlHelper < DdType ,  ValueType > : : computeUntilProbabilities ( env ,  dir ,  model ,  transitionMatrix ,  psiStates . getDdManager ( ) . getBddOne ( )  ,  psiStates ,  qualitative ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    return  storm : : modelchecker : : helper : : HybridMdpPrctlHelper < DdType ,  ValueType > : : computeUntilProbabilities ( env ,  dir ,  model ,  transitionMatrix ,  phiStates  ,  psiStates ,  qualitative ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                // If the interval is of the form [0,0], we can return the result directly
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( storm : : utility : : isZero ( upperBound ) )  {  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -66,12 +66,12 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                conversionWatch . stop ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_INFO ( " Converting symbolic matrix to explicit representation done in  "  < <  conversionWatch . getTimeInMilliseconds ( )  < <  " ms. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                auto  explicitResult  =  storm : : modelchecker : : helper : : SparseMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( env ,  dir ,  explicitTransitionMatrix ,  explicitExitRateVector ,  markovianStates . toVector ( odd ) ,  psiStates . toVector ( odd ) ,  { lowerBound ,  upperBound } ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                auto  explicitResult  =  storm : : modelchecker : : helper : : SparseMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( env ,  dir ,  explicitTransitionMatrix ,  explicitExitRateVector ,  markovianStates . toVector ( odd ) ,  phiStates . toVector ( odd ) ,  p siStates . toVector ( odd ) ,  { lowerBound ,  upperBound } ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                return  std : : unique_ptr < CheckResult > ( new  HybridQuantitativeCheckResult < DdType ,  ValueType > ( model . getReachableStates ( ) ,  model . getManager ( ) . getBddZero ( ) ,  model . getManager ( ) . template  getAddZero < ValueType > ( ) ,  model . getReachableStates ( ) ,  std : : move ( odd ) ,  std : : move ( explicitResult ) ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template < storm : : dd : : DdType  DdType ,  typename  ValueType ,  typename  std : : enable_if < ! storm : : NumberTraits < ValueType > : : SupportsExponential ,  int > : : type >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment  const & ,  OptimizationDirection ,  storm : : models : : symbolic : : MarkovAutomaton < DdType ,  ValueType >  const & ,  storm : : dd : : Add < DdType ,  ValueType >  const & ,  storm : : dd : : Bdd < DdType >  const & ,  storm : : dd : : Add < DdType ,  ValueType >  const & ,  storm : : dd : : Bdd < DdType >  const & ,  bool ,  double ,  double )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment  const & ,  OptimizationDirection ,  storm : : models : : symbolic : : MarkovAutomaton < DdType ,  ValueType >  const & ,  storm : : dd : : Add < DdType ,  ValueType >  const & ,  storm : : dd : : Bdd < DdType >  const & ,  storm : : dd : : Add < DdType ,  ValueType >  const & ,  storm : : dd : : Bdd < DdType >  const & ,  storm : : dd : : Bdd < DdType >  const & ,  bool ,  double ,  double )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_THROW ( false ,  storm : : exceptions : : InvalidOperationException ,  " Computing bounded until probabilities is unsupported for this value type. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -127,19 +127,19 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Cudd, double.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeReachabilityRewards ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : CUDD ,  double >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : CUDD ,  double >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : CUDD ,  double >  const &  exitRateVector ,  typename  storm : : models : : symbolic : : Model < storm : : dd : : DdType : : CUDD ,  double > : : RewardModelType  const &  rewardModel ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  targetStates ,  bool  qualitative ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : CUDD ,  double >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : CUDD ,  double >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : CUDD ,  double >  const &  exitRateVector ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  psiStates ,  bool  qualitative ,  double  lowerBound ,  double  upperBound ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : CUDD ,  double >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : CUDD ,  double >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : CUDD ,  double >  const &  exitRateVector ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  phiStates ,   storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  p siStates ,  bool  qualitative ,  double  lowerBound ,  double  upperBound ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : CUDD ,  double >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : CUDD ,  double >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : CUDD ,  double >  const &  exitRateVector ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  psiStates ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : CUDD ,  double >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : CUDD ,  double >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : CUDD ,  double >  const &  exitRateVector ,  typename  storm : : models : : symbolic : : Model < storm : : dd : : DdType : : CUDD ,  double > : : RewardModelType  const &  rewardModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Sylvan, double.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeReachabilityRewards ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan ,  double >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  double >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  double >  const &  exitRateVector ,  typename  storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan ,  double > : : RewardModelType  const &  rewardModel ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  targetStates ,  bool  qualitative ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan ,  double >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  double >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  double >  const &  exitRateVector ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  psiStates ,  bool  qualitative ,  double  lowerBound ,  double  upperBound ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan ,  double >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  double >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  double >  const &  exitRateVector ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  phiStates ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  p siStates ,  bool  qualitative ,  double  lowerBound ,  double  upperBound ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan ,  double >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  double >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  double >  const &  exitRateVector ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  psiStates ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan ,  double >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  double >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  double >  const &  exitRateVector ,  typename  storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan ,  double > : : RewardModelType  const &  rewardModel ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // Sylvan, rational number.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeReachabilityRewards ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  exitRateVector ,  typename  storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber > : : RewardModelType  const &  rewardModel ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  targetStates ,  bool  qualitative ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  exitRateVector ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  psiStates ,  bool  qualitative ,  double  lowerBound ,  double  upperBound ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  exitRateVector ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  phiStates ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  p siStates ,  bool  qualitative ,  double  lowerBound ,  double  upperBound ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  exitRateVector ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  psiStates ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            template  std : : unique_ptr < CheckResult >  HybridMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( Environment  const &  env ,  OptimizationDirection  dir ,  storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  model ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  transitionMatrix ,  storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan >  const &  markovianStates ,  storm : : dd : : Add < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber >  const &  exitRateVector ,  typename  storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber > : : RewardModelType  const &  rewardModel ) ;