@ -2,6 +2,8 @@ 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  <type_traits>  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "storm/environment/Environment.h"  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "storm/modelchecker/prctl/SparseDtmcPrctlModelChecker.h"  
			
		
	
		
			
				
					# include  "storm/modelchecker/prctl/HybridDtmcPrctlModelChecker.h"  
			
		
	
		
			
				
					# include  "storm/modelchecker/prctl/SymbolicDtmcPrctlModelChecker.h"  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -47,9 +49,9 @@ namespace storm { 
			
		
	
		
			
				
					            std : : vector < storm : : expressions : : Expression >  constraints ;  
			
		
	
		
			
				
					            std : : vector < std : : vector < storm : : expressions : : Expression > >  injectedRefinementPredicates ;  
			
		
	
		
			
				
					        } ;  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  double > : : value  | |  std : : is_same < ValueType ,  storm : : RationalNumber > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( storm : : storage : : SymbolicModelDescription  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task ,  AbstractionRefinementOptions  const &  options  =  AbstractionRefinementOptions ( ) )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  double > : : value  | |  std : : is_same < ValueType ,  storm : : RationalNumber > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( storm : : Environment  const &  env ,  storm : : storage : : SymbolicModelDescription  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task ,  AbstractionRefinementOptions  const &  options  =  AbstractionRefinementOptions ( ) )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( model . getModelType ( )  = =  storm : : storage : : SymbolicModelDescription : : ModelType : : DTMC  | |  model . getModelType ( )  = =  storm : : storage : : SymbolicModelDescription : : ModelType : : MDP ,  storm : : exceptions : : NotSupportedException ,  " Can only treat DTMCs/MDPs using the abstraction refinement engine. " ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -59,50 +61,75 @@ namespace storm { 
			
		
	
		
			
				
					            if  ( model . getModelType ( )  = =  storm : : storage : : SymbolicModelDescription : : ModelType : : DTMC )  {  
			
		
	
		
			
				
					                storm : : modelchecker : : GameBasedMdpModelChecker < DdType ,  storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > >  modelchecker ( model ,  modelCheckerOptions ) ;  
			
		
	
		
			
				
					                if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  else  if  ( model . getModelType ( )  = =  storm : : storage : : SymbolicModelDescription : : ModelType : : MDP )  {  
			
		
	
		
			
				
					                storm : : modelchecker : : GameBasedMdpModelChecker < DdType ,  storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  modelchecker ( model ,  modelCheckerOptions ) ;  
			
		
	
		
			
				
					                if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  else  {  
			
		
	
		
			
				
					                STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The model type is currently not supported. " ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  double > : : value  | |  std : : is_same < ValueType ,  storm : : RationalNumber > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( storm : : storage : : SymbolicModelDescription  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task ,  AbstractionRefinementOptions  const &  options  =  AbstractionRefinementOptions ( ) )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithAbstractionRefinementEngine < DdType ,  ValueType > ( env ,  model ,  task ,  options ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  double > : : value  & &  ! std : : is_same < ValueType ,  storm : : RationalNumber > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( storm : : storage : : SymbolicModelDescription  const & ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const & ,  AbstractionRefinementOptions  const &  =  AbstractionRefinementOptions ( ) )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  double > : : value  & &  ! std : : is_same < ValueType ,  storm : : RationalNumber > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( storm : : Environment  const &  env ,  storm : : storage : : SymbolicModelDescription  const & ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const & ,  AbstractionRefinementOptions  const &  =  AbstractionRefinementOptions ( ) )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " Abstraction-refinement engine does not support data type. " ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  double > : : value  & &  ! std : : is_same < ValueType ,  storm : : RationalNumber > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( storm : : storage : : SymbolicModelDescription  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task ,  AbstractionRefinementOptions  const &  options  =  AbstractionRefinementOptions ( ) )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithAbstractionRefinementEngine < DdType ,  ValueType > ( env ,  model ,  task ,  options ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Dtmc )  {  
			
		
	
		
			
				
					                storm : : modelchecker : : BisimulationAbstractionRefinementModelChecker < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > >  modelchecker ( * model - > template  as < storm : : models : : symbolic : : Dtmc < DdType ,  double > > ( ) ) ;  
			
		
	
		
			
				
					                if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Mdp )  {  
			
		
	
		
			
				
					                storm : : modelchecker : : BisimulationAbstractionRefinementModelChecker < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  modelchecker ( * model - > template  as < storm : : models : : symbolic : : Mdp < DdType ,  double > > ( ) ) ;  
			
		
	
		
			
				
					                if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  else  {  
			
		
	
		
			
				
					                STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The model type is not supported by the dd engine. " ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithAbstractionRefinementEngine < DdType ,  ValueType > ( env ,  model ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( storm : : Environment  const & ,  std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const & ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const & )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " Abstraction-refinement engine does not support data type. " ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithAbstractionRefinementEngine ( std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithAbstractionRefinementEngine < DdType ,  ValueType > ( env ,  model ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithExplorationEngine ( storm : : storage : : SymbolicModelDescription  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithExplorationEngine ( storm : : Environment  const &  env ,  storm : : storage : : SymbolicModelDescription  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( model . isPrismProgram ( ) ,  storm : : exceptions : : NotSupportedException ,  " Exploration engine is currently only applicable to PRISM models. " ) ;  
			
		
	
		
			
				
					            storm : : prism : : Program  const &  program  =  model . asPrismProgram ( ) ;  
			
		
	
		
			
				
					            STORM_LOG_THROW ( program . getModelType ( )  = =  storm : : prism : : Program : : ModelType : : DTMC  | |  program . getModelType ( )  = =  storm : : prism : : Program : : ModelType : : MDP ,  storm : : exceptions : : NotSupportedException ,  " Currently exploration-based verification is only available for DTMCs and MDPs. " ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -111,71 +138,107 @@ namespace storm { 
			
		
	
		
			
				
					            if  ( program . getModelType ( )  = =  storm : : prism : : Program : : ModelType : : DTMC )  {  
			
		
	
		
			
				
					                storm : : modelchecker : : SparseExplorationModelChecker < storm : : models : : sparse : : Dtmc < ValueType > >  checker ( program ) ;  
			
		
	
		
			
				
					                if  ( checker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                    result  =  checker . check ( task ) ;  
			
		
	
		
			
				
					                    result  =  checker . check ( env ,  task ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  else  {  
			
		
	
		
			
				
					                storm : : modelchecker : : SparseExplorationModelChecker < storm : : models : : sparse : : Mdp < ValueType > >  checker ( program ) ;  
			
		
	
		
			
				
					                if  ( checker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                    result  =  checker . check ( task ) ;  
			
		
	
		
			
				
					                    result  =  checker . check ( env ,  task ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithExplorationEngine ( storm : : storage : : SymbolicModelDescription  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithExplorationEngine ( env ,  model ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithExplorationEngine ( storm : : storage : : SymbolicModelDescription  const & ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const & )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithExplorationEngine ( storm : : Environment  const & ,  storm : : storage : : SymbolicModelDescription  const & ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const & )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " Exploration engine does not support data type. " ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : Dtmc < ValueType > >  const &  dtmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  double > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithExplorationEngine ( storm : : storage : : SymbolicModelDescription  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithExplorationEngine ( env ,  model ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithSparseEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : sparse : : Dtmc < ValueType > >  const &  dtmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            if  ( storm : : settings : : getModule < storm : : settings : : modules : : CoreSettings > ( ) . getEquationSolver ( )  = =  storm : : solver : : EquationSolverType : : Elimination  & &  storm : : settings : : getModule < storm : : settings : : modules : : EliminationSettings > ( ) . isUseDedicatedModelCheckerSet ( ) )  {  
			
		
	
		
			
				
					                storm : : modelchecker : : SparseDtmcEliminationModelChecker < storm : : models : : sparse : : Dtmc < ValueType > >  modelchecker ( * dtmc ) ;  
			
		
	
		
			
				
					                if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  else  {  
			
		
	
		
			
				
					                storm : : modelchecker : : SparseDtmcPrctlModelChecker < storm : : models : : sparse : : Dtmc < ValueType > >  modelchecker ( * dtmc ) ;  
			
		
	
		
			
				
					                if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                    result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : Ctmc < ValueType > >  const &  ctmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : Dtmc < ValueType > >  const &  dtmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithSparseEngine ( env ,  dtmc ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithSparseEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : sparse : : Ctmc < ValueType > >  const &  ctmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            storm : : modelchecker : : SparseCtmcCslModelChecker < storm : : models : : sparse : : Ctmc < ValueType > >  modelchecker ( * ctmc ) ;  
			
		
	
		
			
				
					            if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : Mdp < ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : Ctmc < ValueType > >  const &  ctmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithSparseEngine ( env ,  ctmc ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : sparse : : Mdp < ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < ValueType > >  modelchecker ( * mdp ) ;  
			
		
	
		
			
				
					            if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : Mdp < ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : Mdp < ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithSparseEngine ( env ,  mdp ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : sparse : : Mdp < ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            storm : : modelchecker : : SparsePropositionalModelChecker < storm : : models : : sparse : : Mdp < ValueType > >  modelchecker ( * mdp ) ;  
			
		
	
		
			
				
					            if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : MarkovAutomaton < ValueType > >  const &  ma ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : Mdp < ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithSparseEngine ( env ,  mdp ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : sparse : : MarkovAutomaton < ValueType > >  const &  ma ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            / /  Close  the  MA ,  if  it  is  not  already  closed .  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -186,120 +249,192 @@ namespace storm { 
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            storm : : modelchecker : : SparseMarkovAutomatonCslModelChecker < storm : : models : : sparse : : MarkovAutomaton < ValueType > >  modelchecker ( * ma ) ;  
			
		
	
		
			
				
					            if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : MarkovAutomaton < ValueType > >  const &  ma ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : MarkovAutomaton < ValueType > >  const &  ma ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithSparseEngine ( env ,  ma ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( storm : : Environment  const & ,  std : : shared_ptr < storm : : models : : sparse : : MarkovAutomaton < ValueType > >  const &  ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " Sparse engine cannot verify MAs with this data type. " ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : Model < ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : MarkovAutomaton < ValueType > >  const &  ma ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithSparseEngine ( env ,  ma ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithSparseEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : sparse : : Model < ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Dtmc )  {  
			
		
	
		
			
				
					                result  =  verifyWithSparseEngine ( model - > template  as < storm : : models : : sparse : : Dtmc < ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					                result  =  verifyWithSparseEngine ( env ,  model - > template  as < storm : : models : : sparse : : Dtmc < ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					            }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Mdp )  {  
			
		
	
		
			
				
					                result  =  verifyWithSparseEngine ( model - > template  as < storm : : models : : sparse : : Mdp < ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					                result  =  verifyWithSparseEngine ( env ,  model - > template  as < storm : : models : : sparse : : Mdp < ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					            }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Ctmc )  {  
			
		
	
		
			
				
					                result  =  verifyWithSparseEngine ( model - > template  as < storm : : models : : sparse : : Ctmc < ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					                result  =  verifyWithSparseEngine ( env ,  model - > template  as < storm : : models : : sparse : : Ctmc < ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					            }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : MarkovAutomaton )  {  
			
		
	
		
			
				
					                result  =  verifyWithSparseEngine ( model - > template  as < storm : : models : : sparse : : MarkovAutomaton < ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					                result  =  verifyWithSparseEngine ( env ,  model - > template  as < storm : : models : : sparse : : MarkovAutomaton < ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					            }  else  {  
			
		
	
		
			
				
					                STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The model type  "  < <  model - > getType ( )  < <  "  is not supported. " ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : sparse : : Model < ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithSparseEngine ( env ,  model ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > >  const &  dtmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithHybridEngine ( storm : : Environment  const &  env ,  st d : : shared_ptr < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > >  const &  dtmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            storm : : modelchecker : : HybridDtmcPrctlModelChecker < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > >  modelchecker ( * dtmc ) ;  
			
		
	
		
			
				
					            if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : symbolic : : Ctmc < DdType ,  ValueType > >  const &  ctmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > >  const &  dtmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithHybridEngine ( env ,  dtmc ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithHybridEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : symbolic : : Ctmc < DdType ,  ValueType > >  const &  ctmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            storm : : modelchecker : : HybridCtmcCslModelChecker < storm : : models : : symbolic : : Ctmc < DdType ,  ValueType > >  modelchecker ( * ctmc ) ;  
			
		
	
		
			
				
					            if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : symbolic : : Ctmc < DdType ,  ValueType > >  const &  ctmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithHybridEngine ( env ,  ctmc ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithHybridEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            storm : : modelchecker : : HybridMdpPrctlModelChecker < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  modelchecker ( * mdp ) ;  
			
		
	
		
			
				
					            if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithHybridEngine ( env ,  mdp ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const & ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const & )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithHybridEngine ( storm : : Environment  const &  ,  st d : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const & ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const & )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " Hybrid engine cannot verify MDPs with this data type. " ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithHybridEngine ( env ,  mdp ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithHybridEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Dtmc )  {  
			
		
	
		
			
				
					                result  =  verifyWithHybridEngine ( model - > template  as < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					                result  =  verifyWithHybridEngine ( env ,  model - > template  as < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					            }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Ctmc )  {  
			
		
	
		
			
				
					                result  =  verifyWithHybridEngine ( model - > template  as < storm : : models : : symbolic : : Ctmc < DdType ,  ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					                result  =  verifyWithHybridEngine ( env ,  model - > template  as < storm : : models : : symbolic : : Ctmc < DdType ,  ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					            }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Mdp )  {  
			
		
	
		
			
				
					                result  =  verifyWithHybridEngine ( model - > template  as < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					                result  =  verifyWithHybridEngine ( env ,  model - > template  as < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					            }  else  {  
			
		
	
		
			
				
					                STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The model type is not supported by the hybrid engine. " ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithDdEngine ( std : : shared_ptr < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > >  const &  dtmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithHybridEngine ( env ,  model ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithDdEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > >  const &  dtmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            storm : : modelchecker : : SymbolicDtmcPrctlModelChecker < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > >  modelchecker ( * dtmc ) ;  
			
		
	
		
			
				
					            if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithDdEngine ( std : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithDdEngine ( std : : shared_ptr < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > >  const &  dtmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithDdEngine ( env ,  dtmc ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithDdEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            storm : : modelchecker : : SymbolicMdpPrctlModelChecker < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  modelchecker ( * mdp ) ;  
			
		
	
		
			
				
					            if  ( modelchecker . canHandle ( task ) )  {  
			
		
	
		
			
				
					                result  =  modelchecker . check ( task ) ;  
			
		
	
		
			
				
					                result  =  modelchecker . check ( env ,  task ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					          
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithDdEngine ( std : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const & ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const & )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < ! std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithDdEngine ( std : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithDdEngine ( env ,  mdp ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithDdEngine ( storm : : Environment  const & ,  std : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const & ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const & )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " Dd engine cannot verify MDPs with this data type. " ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithDdEngine ( std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					        typename  std : : enable_if < std : : is_same < ValueType ,  storm : : RationalFunction > : : value ,  std : : unique_ptr < storm : : modelchecker : : CheckResult > > : : type  verifyWithDdEngine ( std : : shared_ptr < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > >  const &  mdp ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithDdEngine ( env ,  mdp ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithDdEngine ( storm : : Environment  const &  env ,  std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
			
		
	
		
			
				
					            if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Dtmc )  {  
			
		
	
		
			
				
					                result  =  verifyWithDdEngine ( model - > template  as < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					                result  =  verifyWithDdEngine ( env ,  model - > template  as < storm : : models : : symbolic : : Dtmc < DdType ,  ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					            }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Mdp )  {  
			
		
	
		
			
				
					                result  =  verifyWithDdEngine ( model - > template  as < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					                result  =  verifyWithDdEngine ( env ,  model - > template  as < storm : : models : : symbolic : : Mdp < DdType ,  ValueType > > ( ) ,  task ) ;  
			
		
	
		
			
				
					            }  else  {  
			
		
	
		
			
				
					                STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The model type is not supported by the dd engine. " ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType ,  typename  ValueType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithDdEngine ( std : : shared_ptr < storm : : models : : symbolic : : Model < DdType ,  ValueType > >  const &  model ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  ValueType >  const &  task )  {  
			
		
	
		
			
				
					            Environment  env ;  
			
		
	
		
			
				
					            return  verifyWithDdEngine ( env ,  model ,  task ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					}