@ -3,6 +3,8 @@ 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "src/utility/storm.h"  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "src/exceptions/NotImplementedException.h"  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					namespace  storm  {  
			
		
	
		
			
				
					    namespace  cli  {  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -47,6 +49,11 @@ namespace storm { 
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					# endif  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType >  
			
		
	
		
			
				
					        void  verifySymbolicModelWithAbstractionRefinementEngine ( storm : : prism : : Program  const &  program ,  std : : vector < std : : shared_ptr < storm : : logic : : Formula > >  const &  formulas )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotImplementedException ,  " Abstraction Refinement is not yet implemented. " ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        template < storm : : dd : : DdType  DdType >  
			
		
	
		
			
				
					        void  verifySymbolicModelWithHybridEngine ( std : : shared_ptr < storm : : models : : symbolic : : Model < DdType > >  model ,  std : : vector < std : : shared_ptr < storm : : logic : : Formula > >  const &  formulas )  {  
			
		
	
		
			
				
					            for  ( auto  const &  formula  :  formulas )  {  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -108,50 +115,56 @@ namespace storm { 
			
		
	
		
			
				
					     
			
		
	
		
			
				
					        template < typename  ValueType ,  storm : : dd : : DdType  LibraryType >  
			
		
	
		
			
				
					        void  buildAndCheckSymbolicModel ( storm : : prism : : Program  const &  program ,  std : : vector < std : : shared_ptr < storm : : logic : : Formula > >  const &  formulas )  {  
			
		
	
		
			
				
					            storm : : storage : : ModelProgramPair  modelProgramPair  =  buildSymbolicModel < ValueType ,  LibraryType > ( program ,  formulas ) ;  
			
		
	
		
			
				
					            STORM_LOG_THROW ( modelProgramPair . model  ! =  nullptr ,  storm : : exceptions : : InvalidStateException ,  " Model could not be constructed for an unknown reason. " ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            / /  Preprocess  the  model  if  needed .  
			
		
	
		
			
				
					            BRANCH_ON_MODELTYPE ( modelProgramPair . model ,  modelProgramPair . model ,  ValueType ,  LibraryType ,  preprocessModel ,  formulas ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            / /  Print  some  information  about  the  model .  
			
		
	
		
			
				
					            modelProgramPair . model - > printModelInformationToStream ( std : : cout ) ;  
			
		
	
		
			
				
					            storm : : settings : : modules : : GeneralSettings  const &  settings  =  storm : : settings : : generalSettings ( ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            / /  Verify  the  model ,  if  a  formula  was  given .  
			
		
	
		
			
				
					            if  ( ! formulas . empty ( ) )  {  
			
		
	
		
			
				
					                / /  There  may  be  constants  of  the  model  appearing  in  the  formulas ,  so  we  replace  all  their  occurrences  
			
		
	
		
			
				
					                / /  by  their  definitions  in  the  translated  program .  
			
		
	
		
			
				
					            if  ( settings . getEngine ( )  = =  storm : : settings : : modules : : GeneralSettings : : Engine : : AbstractionRefinement )  {  
			
		
	
		
			
				
					                verifySymbolicModelWithAbstractionRefinementEngine ( program ,  formulas ) ;  
			
		
	
		
			
				
					            }  else  {  
			
		
	
		
			
				
					                storm : : storage : : ModelProgramPair  modelProgramPair  =  buildSymbolicModel < ValueType ,  LibraryType > ( program ,  formulas ) ;  
			
		
	
		
			
				
					                STORM_LOG_THROW ( modelProgramPair . model  ! =  nullptr ,  storm : : exceptions : : InvalidStateException ,  " Model could not be constructed for an unknown reason. " ) ;  
			
		
	
		
			
				
					                 
			
		
	
		
			
				
					                / /  Start  by  building  a  mapping  from  constants  of  the  ( translated )  model  to  their  defining  expressions .  
			
		
	
		
			
				
					                std : : map < storm : : expressions : : Variable ,  storm : : expressions : : Expression >  constantSubstitution ;  
			
		
	
		
			
				
					                for  ( auto  const &  constant  :  modelProgramPair . program . getConstants ( ) )  {  
			
		
	
		
			
				
					                    if  ( constant . isDefined ( ) )  {  
			
		
	
		
			
				
					                        constantSubstitution . emplace ( constant . getExpressionVariable ( ) ,  constant . getExpression ( ) ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                / /  Preprocess  the  model  if  needed .  
			
		
	
		
			
				
					                BRANCH_ON_MODELTYPE ( modelProgramPair . model ,  modelProgramPair . model ,  ValueType ,  LibraryType ,  preprocessModel ,  formulas ) ;  
			
		
	
		
			
				
					                 
			
		
	
		
			
				
					                std : : vector < std : : shared_ptr < storm : : logic : : Formula > >  preparedFormulas ;  
			
		
	
		
			
				
					                for  ( auto  const &  formula  :  formulas )  {  
			
		
	
		
			
				
					                    preparedFormulas . emplace_back ( formula - > substitute ( constantSubstitution ) ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                / /  Print  some  information  about  the  model .  
			
		
	
		
			
				
					                modelProgramPair . model - > printModelInformationToStream ( std : : cout ) ;  
			
		
	
		
			
				
					                 
			
		
	
		
			
				
					                if  ( modelProgramPair . model - > isSparseModel ( ) )  {  
			
		
	
		
			
				
					                    if ( storm : : settings : : generalSettings ( ) . isCounterexampleSet ( ) )  {  
			
		
	
		
			
				
					                        / /  If  we  were  requested  to  generate  a  counterexample ,  we  now  do  so  for  each  formula .  
			
		
	
		
			
				
					                        for ( auto  const &  formula  :  preparedFormulas )  {  
			
		
	
		
			
				
					                            generateCounterexample < ValueType > ( program ,  modelProgramPair . model - > as < storm : : models : : sparse : : Model < ValueType > > ( ) ,  formula ) ;  
			
		
	
		
			
				
					                / /  Verify  the  model ,  if  a  formula  was  given .  
			
		
	
		
			
				
					                if  ( ! formulas . empty ( ) )  {  
			
		
	
		
			
				
					                    / /  There  may  be  constants  of  the  model  appearing  in  the  formulas ,  so  we  replace  all  their  occurrences  
			
		
	
		
			
				
					                    / /  by  their  definitions  in  the  translated  program .  
			
		
	
		
			
				
					                     
			
		
	
		
			
				
					                    / /  Start  by  building  a  mapping  from  constants  of  the  ( translated )  model  to  their  defining  expressions .  
			
		
	
		
			
				
					                    std : : map < storm : : expressions : : Variable ,  storm : : expressions : : Expression >  constantSubstitution ;  
			
		
	
		
			
				
					                    for  ( auto  const &  constant  :  modelProgramPair . program . getConstants ( ) )  {  
			
		
	
		
			
				
					                        if  ( constant . isDefined ( ) )  {  
			
		
	
		
			
				
					                            constantSubstitution . emplace ( constant . getExpressionVariable ( ) ,  constant . getExpression ( ) ) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  else  {  
			
		
	
		
			
				
					                        verifySparseModel < ValueType > ( modelProgramPair . model - > as < storm : : models : : sparse : : Model < ValueType > > ( ) ,  preparedFormulas ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  else  if  ( modelProgramPair . model - > isSymbolicModel ( ) )  {  
			
		
	
		
			
				
					                    if  ( storm : : settings : : generalSettings ( ) . getEngine ( )  = =  storm : : settings : : modules : : GeneralSettings : : Engine : : Hybrid )  {  
			
		
	
		
			
				
					                        verifySymbolicModelWithHybridEngine ( modelProgramPair . model - > as < storm : : models : : symbolic : : Model < LibraryType > > ( ) ,  preparedFormulas ) ;  
			
		
	
		
			
				
					                     
			
		
	
		
			
				
					                    std : : vector < std : : shared_ptr < storm : : logic : : Formula > >  preparedFormulas ;  
			
		
	
		
			
				
					                    for  ( auto  const &  formula  :  formulas )  {  
			
		
	
		
			
				
					                        preparedFormulas . emplace_back ( formula - > substitute ( constantSubstitution ) ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                     
			
		
	
		
			
				
					                    if  ( modelProgramPair . model - > isSparseModel ( ) )  {  
			
		
	
		
			
				
					                        if ( settings . isCounterexampleSet ( ) )  {  
			
		
	
		
			
				
					                            / /  If  we  were  requested  to  generate  a  counterexample ,  we  now  do  so  for  each  formula .  
			
		
	
		
			
				
					                            for ( auto  const &  formula  :  preparedFormulas )  {  
			
		
	
		
			
				
					                                generateCounterexample < ValueType > ( program ,  modelProgramPair . model - > as < storm : : models : : sparse : : Model < ValueType > > ( ) ,  formula ) ;  
			
		
	
		
			
				
					                            }  
			
		
	
		
			
				
					                        }  else  {  
			
		
	
		
			
				
					                            verifySparseModel < ValueType > ( modelProgramPair . model - > as < storm : : models : : sparse : : Model < ValueType > > ( ) ,  preparedFormulas ) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  else  if  ( modelProgramPair . model - > isSymbolicModel ( ) )  {  
			
		
	
		
			
				
					                        if  ( settings . getEngine ( )  = =  storm : : settings : : modules : : GeneralSettings : : Engine : : Hybrid )  {  
			
		
	
		
			
				
					                            verifySymbolicModelWithHybridEngine ( modelProgramPair . model - > as < storm : : models : : symbolic : : Model < LibraryType > > ( ) ,  preparedFormulas ) ;  
			
		
	
		
			
				
					                        }  else  {  
			
		
	
		
			
				
					                            verifySymbolicModelWithSymbolicEngine ( modelProgramPair . model - > as < storm : : models : : symbolic : : Model < LibraryType > > ( ) ,  preparedFormulas ) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  else  {  
			
		
	
		
			
				
					                        verifySymbolicModelWithSymbolicEngine ( modelProgramPair . model - > as < storm : : models : : symbolic : : Model < LibraryType > > ( ) ,  preparedFormulas ) ;  
			
		
	
		
			
				
					                        STORM_LOG_THROW ( false ,  storm : : exceptions : : InvalidSettingsException ,  " Invalid input model type. " ) ;  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  else  {  
			
		
	
		
			
				
					                    STORM_LOG_THROW ( false ,  storm : : exceptions : : InvalidSettingsException ,  " Invalid input model type. " ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					        }