@ -113,33 +113,49 @@ namespace storm { 
			
		 
		
	
		
			
				 
				 
				        return  result ;  
				 
				 
				        return  result ;  
			
		 
		
	
		
			
				 
				 
				    }  
				 
				 
				    }  
			
		 
		
	
		
			
				 
				 
				     
				 
				 
				     
			
		 
		
	
		
			
				 
				 
				    template < typename  ValueType >  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				    std : : shared_ptr < storm : : models : : ModelBase >  preprocessModel ( std : : shared_ptr < storm : : models : : ModelBase >  model ,  std : : vector < std : : shared_ptr < storm : : logic : : Formula > >  const &  formulas )  {  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				    template < typename  ModelType >  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				    std : : shared_ptr < ModelType >  performSparseBisimulationMinimization ( std : : shared_ptr < ModelType >  model ,  std : : vector < std : : shared_ptr < storm : : logic : : Formula > >  const &  formulas )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        std : : cout  < <  " Performing bisimulation minimization...  " ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        typename  storm : : storage : : DeterministicModelBisimulationDecomposition < ModelType > : : Options  options ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        if  ( ! formulas . empty ( ) )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            options  =  typename  storm : : storage : : DeterministicModelBisimulationDecomposition < ModelType > : : Options ( * model ,  formulas ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        if  ( storm : : settings : : bisimulationSettings ( ) . isWeakBisimulationSet ( ) )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            options . type  =  storm : : storage : : BisimulationType : : Weak ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            options . bounded  =  false ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				         
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        storm : : storage : : DeterministicModelBisimulationDecomposition < ModelType >  bisimulationDecomposition ( * model ,  options ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        model  =  bisimulationDecomposition . getQuotient ( ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        std : : cout  < <  " done. "  < <  std : : endl  < <  std : : endl ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        return  model ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				    }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				     
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				    template < typename  ModelType ,  typename  ValueType  =  typename  ModelType : : ValueType ,  typename  std : : enable_if < std : : is_base_of < storm : : models : : sparse : : Model < ValueType > ,  ModelType > : : value ,  bool > : : type  =  0 >  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				    std : : shared_ptr < storm : : models : : ModelBase >  preprocessModel ( std : : shared_ptr < ModelType >  model ,  std : : vector < std : : shared_ptr < storm : : logic : : Formula > >  const &  formulas )  {  
			
		 
		
	
		
			
				 
				 
				        if  ( storm : : settings : : generalSettings ( ) . isBisimulationSet ( ) )  {  
				 
				 
				        if  ( storm : : settings : : generalSettings ( ) . isBisimulationSet ( ) )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				             
			
		 
		
	
		
			
				 
				 
				            STORM_LOG_THROW ( model - > isSparseModel ( ) ,  storm : : exceptions : : InvalidSettingsException ,  " Bisimulation minimization is currently only available for sparse models. " ) ;  
				 
				 
				            STORM_LOG_THROW ( model - > isSparseModel ( ) ,  storm : : exceptions : : InvalidSettingsException ,  " Bisimulation minimization is currently only available for sparse models. " ) ;  
			
		 
		
	
		
			
				 
				 
				            std : : shared_ptr < storm : : models : : sparse : : Model < ValueType > >  sparseModel  =  model - > template  as < storm : : models : : sparse : : Model < ValueType > > ( ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				            STORM_LOG_THROW ( model - > getType ( )  = =  storm : : models : : ModelType : : Dtmc  | |  model - > getType ( )  = =  storm : : models : : ModelType : : Ctmc ,  storm : : exceptions : : InvalidSettingsException ,  " Bisimulation minimization is currently only available for DTMCs. " ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				            std : : shared_ptr < storm : : models : : sparse : : Dtmc < ValueType > >  dtmc  =  sparseModel - > template  as < storm : : models : : sparse : : Dtmc < ValueType > > ( ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_THROW ( model - > isOfType ( storm : : models : : ModelType : : Dtmc )  | |  model - > isOfType ( storm : : models : : ModelType : : Ctmc ) ,  storm : : exceptions : : InvalidSettingsException ,  " Bisimulation minimization is currently only available for DTMCs and CTMCs. " ) ;  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				            dtmc - > reduceToStateBasedRewards ( ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            model - > reduceToStateBasedRewards ( ) ;  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				            std : : cout  < <  " Performing bisimulation minimization...  " ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				            typename  storm : : storage : : DeterministicModelBisimulationDecomposition < ValueType > : : Options  options ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				            if  ( ! formulas . empty ( ) )  {  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				                options  =  typename  storm : : storage : : DeterministicModelBisimulationDecomposition < ValueType > : : Options ( * sparseModel ,  formulas ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				            }  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				            if  ( storm : : settings : : bisimulationSettings ( ) . isWeakBisimulationSet ( ) )  {  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				                options . type  =  storm : : storage : : BisimulationType : : Weak ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				                options . bounded  =  false ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            if  ( model - > isOfType ( storm : : models : : ModelType : : Dtmc ) )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                return  performSparseBisimulationMinimization < storm : : models : : sparse : : Dtmc < ValueType > > ( model - > template  as < storm : : models : : sparse : : Dtmc < ValueType > > ( ) ,  formulas ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            }  else  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                return  performSparseBisimulationMinimization < storm : : models : : sparse : : Ctmc < ValueType > > ( model - > template  as < storm : : models : : sparse : : Ctmc < ValueType > > ( ) ,  formulas ) ;  
			
		 
		
	
		
			
				 
				 
				            }  
				 
				 
				            }  
			
		 
		
	
		
			
				 
				 
				             
				 
				 
				             
			
		 
		
	
		
			
				 
				 
				            storm : : storage : : DeterministicModelBisimulationDecomposition < ValueType >  bisimulationDecomposition ( * dtmc ,  options ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				            model  =  bisimulationDecomposition . getQuotient ( ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				            std : : cout  < <  " done. "  < <  std : : endl  < <  std : : endl ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				        }  
				 
				 
				        }  
			
		 
		
	
		
			
				 
				 
				        return  model ;  
				 
				 
				        return  model ;  
			
		 
		
	
		
			
				 
				 
				    }  
				 
				 
				    }  
			
		 
		
	
		
			
				 
				 
				     
				 
				 
				     
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				    template < typename  ModelType ,  storm : : dd : : DdType  DdType  =  ModelType : : DdType ,  typename  std : : enable_if <  std : : is_base_of <  storm : : models : : symbolic : : Model < DdType > ,  ModelType  > : : value ,  bool > : : type  =  0 >  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				    std : : shared_ptr < storm : : models : : ModelBase >  preprocessModel ( std : : shared_ptr < ModelType >  model ,  std : : vector < std : : shared_ptr < storm : : logic : : Formula > >  const &  formulas )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        / /  No  preprocessing  available  yet .  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        return  model ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				    }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				     
			
		 
		
	
		
			
				 
				 
				    template < typename  ValueType >  
				 
				 
				    template < typename  ValueType >  
			
		 
		
	
		
			
				 
				 
				    void  generateCounterexample ( storm : : prism : : Program  const &  program ,  std : : shared_ptr < storm : : models : : sparse : : Model < ValueType > >  model ,  std : : shared_ptr < storm : : logic : : Formula >  const &  formula )  {  
				 
				 
				    void  generateCounterexample ( storm : : prism : : Program  const &  program ,  std : : shared_ptr < storm : : models : : sparse : : Model < ValueType > >  model ,  std : : shared_ptr < storm : : logic : : Formula >  const &  formula )  {  
			
		 
		
	
		
			
				 
				 
				        if  ( storm : : settings : : counterexampleGeneratorSettings ( ) . isMinimalCommandSetGenerationSet ( ) )  {  
				 
				 
				        if  ( storm : : settings : : counterexampleGeneratorSettings ( ) . isMinimalCommandSetGenerationSet ( ) )  {