@ -113,33 +113,49 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        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 ( ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            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 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					     
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    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 >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					    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 ( ) )  {