@ -262,26 +262,45 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    template < typename  ValueType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifySparseModel  ( std : : shared_ptr < storm : : models : : sparse : : Model < ValueType > >  model ,  std : : shared_ptr < storm : : logic : : Formula  const >  const &  formula ,  bool  onlyInitialStatesRelevant  =  false )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifySparseDtmc  ( std : : shared_ptr < storm : : models : : sparse : : Dtmc < ValueType > >  dtmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula >  const &  task )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        storm : : modelchecker : : CheckTask < storm : : logic : : Formula >  task ( * formula ,  onlyInitialStatesRelevant ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Dtmc )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : shared_ptr < storm : : models : : sparse : : Dtmc < ValueType > >  dtmc  =  model - > template  as < storm : : models : : sparse : : Dtmc < ValueType > > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            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 ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The property  "  < <  * formula  < <  "  is not supported by the dedicated elimination model checker. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        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 ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : modelchecker : : SparseDtmcPrctlModelChecker < storm : : models : : sparse : : Dtmc < ValueType > >  modelchecker ( * dtmc ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( modelchecker . canHandle ( task ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    result  =  modelchecker . check ( task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The property  "  < <  * formula  < <  "  is not supported. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The property  "  < <  task . getFormula ( )  < <  "  is not supported by the dedicated elimination model checker. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : modelchecker : : SparseDtmcPrctlModelChecker < storm : : models : : sparse : : Dtmc < ValueType > >  modelchecker ( * dtmc ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( modelchecker . canHandle ( task ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                result  =  modelchecker . check ( task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The property  "  < <  task . getFormula ( )  < <  "  is not supported. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        return  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					     
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    template < typename  ValueType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifySparseCtmc ( std : : shared_ptr < storm : : models : : sparse : : Ctmc < ValueType > >  ctmc ,  storm : : modelchecker : : CheckTask < storm : : logic : : Formula >  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 ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The property  "  < <  task . getFormula ( )  < <  "  is not supported. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        return  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    template < typename  ValueType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifySparseModel ( std : : shared_ptr < storm : : models : : sparse : : Model < ValueType > >  model ,  std : : shared_ptr < storm : : logic : : Formula  const >  const &  formula ,  bool  onlyInitialStatesRelevant  =  false )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        storm : : modelchecker : : CheckTask < storm : : logic : : Formula >  task ( * formula ,  onlyInitialStatesRelevant ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Dtmc )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            result  =  verifySparseDtmc ( model - > template  as < storm : : models : : sparse : : Dtmc < ValueType > > ( ) ,  task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Mdp )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : shared_ptr < storm : : models : : sparse : : Mdp < ValueType > >  mdp  =  model - > template  as < storm : : models : : sparse : : Mdp < ValueType > > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# ifdef STORM_HAVE_CUDA  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -297,10 +316,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            result  =  modelchecker . check ( task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# endif  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Ctmc )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : shared_ptr < storm : : models : : sparse : : Ctmc < ValueType > >  ctmc  =  model - > template  as < storm : : models : : sparse : : Ctmc < ValueType > > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            storm : : modelchecker : : SparseCtmcCslModelChecker < storm : : models : : sparse : : Ctmc < ValueType > >  modelchecker ( * ctmc ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            result  =  modelchecker . check ( task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            result  =  verifySparseCtmc ( model - > template  as < storm : : models : : sparse : : Ctmc < ValueType > > ( ) ,  task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : MarkovAutomaton )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : shared_ptr < storm : : models : : sparse : : MarkovAutomaton < ValueType > >  ma  =  model - > template  as < storm : : models : : sparse : : MarkovAutomaton < ValueType > > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            / /  Close  the  MA ,  if  it  is  not  already  closed .  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -322,23 +338,9 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Dtmc )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : shared_ptr < storm : : models : : sparse : : Dtmc < storm : : RationalNumber > >  dtmc  =  model - > template  as < storm : : models : : sparse : : Dtmc < storm : : RationalNumber > > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            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 < storm : : RationalNumber > >  modelchecker ( * dtmc ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( modelchecker . canHandle ( task ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    result  =  modelchecker . check ( task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The property  "  < <  * formula  < <  "  is not supported by the dedicated elimination model checker. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : modelchecker : : SparseDtmcPrctlModelChecker < storm : : models : : sparse : : Dtmc < storm : : RationalNumber > >  modelchecker ( * dtmc ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( modelchecker . canHandle ( task ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    result  =  modelchecker . check ( task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The property  "  < <  * formula  < <  "  is not supported. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            result  =  verifySparseDtmc ( model - > template  as < storm : : models : : sparse : : Dtmc < storm : : RationalNumber > > ( ) ,  task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Ctmc )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            result  =  verifySparseCtmc ( model - > template  as < storm : : models : : sparse : : Ctmc < storm : : RationalNumber > > ( ) ,  task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_ASSERT ( false ,  " Illegal model type. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -368,23 +370,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Dtmc )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : shared_ptr < storm : : models : : sparse : : Dtmc < storm : : RationalFunction > >  dtmc  =  model - > template  as < storm : : models : : sparse : : Dtmc < storm : : RationalFunction > > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            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 < storm : : RationalFunction > >  modelchecker ( * dtmc ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( modelchecker . canHandle ( task ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    result  =  modelchecker . check ( task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The property  "  < <  * formula  < <  "  is not supported by the dedicated elimination model checker. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                storm : : modelchecker : : SparseDtmcPrctlModelChecker < storm : : models : : sparse : : Dtmc < storm : : RationalFunction > >  modelchecker ( * dtmc ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                if  ( modelchecker . canHandle ( task ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    result  =  modelchecker . check ( task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The property  "  < <  * formula  < <  "  is not supported. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            result  =  verifySparseDtmc ( model - > template  as < storm : : models : : sparse : : Dtmc < storm : : RationalFunction > > ( ) ,  task ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  else  if  ( model - > getType ( )  = =  storm : : models : : ModelType : : Mdp )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : shared_ptr < storm : : models : : sparse : : Mdp < storm : : RationalFunction > >  mdp  =  model - > template  as < storm : : models : : sparse : : Mdp < storm : : RationalFunction > > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " The parametric engine currently does not support MDPs. " ) ;