@ -1,6 +1,5 @@ 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  <storm-pomdp/analysis/UniqueObservationStates.h> 
  
			
		
	
		
			
				
					# include  "storm/utility/initialize.h" 
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "storm/settings/modules/GeneralSettings.h" 
  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -36,6 +35,9 @@ 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "storm-pomdp/transformer/ApplyFiniteSchedulerToPomdp.h" 
  
			
		
	
		
			
				
					# include  "storm-pomdp/transformer/GlobalPOMDPSelfLoopEliminator.h" 
  
			
		
	
		
			
				
					# include  "storm-pomdp/transformer/GlobalPomdpMecChoiceEliminator.h" 
  
			
		
	
		
			
				
					# include  "storm-pomdp/analysis/UniqueObservationStates.h" 
  
			
		
	
		
			
				
					# include  "storm-pomdp/analysis/QualitativeAnalysis.h" 
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					/*!
  
			
		
	
		
			
				
					 *  Initialize  the  settings  manager .  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -101,14 +103,41 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					        // We should not export here if we are going to do some processing first.
  
			
		
	
		
			
				
					        auto  model  =  storm : : cli : : buildPreprocessExportModelWithValueTypeAndDdlib < storm : : dd : : DdType : : Sylvan ,  storm : : RationalNumber > ( symbolicInput ,  engine ) ;  
			
		
	
		
			
				
					        STORM_LOG_THROW ( model  & &  model - > getType ( )  = =  storm : : models : : ModelType : : Pomdp ,  storm : : exceptions : : WrongFormatException ,  " Expected a POMDP. " ) ;  
			
		
	
		
			
				
					        // CHECK if prop maximizes, only apply in those situations
  
			
		
	
		
			
				
					        std : : shared_ptr < storm : : models : : sparse : : Pomdp < storm : : RationalNumber > >  pomdp  =  model - > template  as < storm : : models : : sparse : : Pomdp < storm : : RationalNumber > > ( ) ;  
			
		
	
		
			
				
					        storm : : transformer : : GlobalPOMDPSelfLoopEliminator < storm : : RationalNumber >  selfLoopEliminator ( * pomdp ) ;  
			
		
	
		
			
				
					        pomdp  =  selfLoopEliminator . transform ( ) ;  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        std : : shared_ptr < storm : : logic : : Formula  const >  formula ;  
			
		
	
		
			
				
					        if  ( ! symbolicInput . properties . empty ( ) )  {  
			
		
	
		
			
				
					            formula  =  symbolicInput . properties . front ( ) . getRawFormula ( ) ;  
			
		
	
		
			
				
					            STORM_PRINT_AND_LOG ( " Analyzing property ' "  < <  * formula  < <  " ' "  < <  std : : endl ) ;  
			
		
	
		
			
				
					            STORM_LOG_WARN_COND ( symbolicInput . properties . size ( )  = =  1 ,  " There is currently no support for multiple properties. All other properties will be ignored. " ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        STORM_PRINT_AND_LOG ( " Analyzing states with unique observation ... "  < <  std : : endl ) ;  
			
		
	
		
			
				
					        storm : : analysis : : UniqueObservationStates < storm : : RationalNumber >  uniqueAnalysis ( * pomdp ) ;  
			
		
	
		
			
				
					        std : : cout  < <  uniqueAnalysis . analyse ( )  < <  std : : endl ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // CHECK if prop maximizes, only apply in those situations
  
			
		
	
		
			
				
					        STORM_PRINT_AND_LOG ( " Eliminating self-loop choices ... " ) ;  
			
		
	
		
			
				
					        uint64_t  oldChoiceCount  =  pomdp - > getNumberOfChoices ( ) ;  
			
		
	
		
			
				
					        storm : : transformer : : GlobalPOMDPSelfLoopEliminator < storm : : RationalNumber >  selfLoopEliminator ( * pomdp ) ;  
			
		
	
		
			
				
					        pomdp  =  selfLoopEliminator . transform ( ) ;  
			
		
	
		
			
				
					        STORM_PRINT_AND_LOG ( oldChoiceCount  -  pomdp - > getNumberOfChoices ( )  < <  "  choices eliminated through self-loop elimination. "  < <  std : : endl ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( formula )  {  
			
		
	
		
			
				
					            if  ( formula - > isProbabilityOperatorFormula ( ) )  {  
			
		
	
		
			
				
					                storm : : analysis : : QualitativeAnalysis < storm : : RationalNumber >  qualitativeAnalysis ( * pomdp ) ;  
			
		
	
		
			
				
					                STORM_PRINT_AND_LOG ( " Computing states with probability 0 ... " ) ;  
			
		
	
		
			
				
					                std : : cout  < <  qualitativeAnalysis . analyseProb0 ( formula - > asProbabilityOperatorFormula ( ) )  < <  std : : endl ;  
			
		
	
		
			
				
					                STORM_PRINT_AND_LOG ( " Computing states with probability 1 ... " ) ;  
			
		
	
		
			
				
					                std : : cout  < <  qualitativeAnalysis . analyseProb1 ( formula - > asProbabilityOperatorFormula ( ) )  < <  std : : endl ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            STORM_PRINT_AND_LOG ( " Eliminating mec choices ... " ) ;  
			
		
	
		
			
				
					            // Todo elimination of mec choices only preserves memoryless schedulers. Selfloop elimination becomes redundant if we do mecChoiceElimination
  
			
		
	
		
			
				
					            oldChoiceCount  =  pomdp - > getNumberOfChoices ( ) ;  
			
		
	
		
			
				
					            storm : : transformer : : GlobalPomdpMecChoiceEliminator < storm : : RationalNumber >  mecChoiceEliminator ( * pomdp ) ;  
			
		
	
		
			
				
					            pomdp  =  mecChoiceEliminator . transform ( * formula ) ;  
			
		
	
		
			
				
					            STORM_PRINT_AND_LOG ( oldChoiceCount  -  pomdp - > getNumberOfChoices ( )  < <  "  choices eliminated through MEC choice elimination. "  < <  std : : endl ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( pomdpSettings . isExportToParametricSet ( ) )  {  
			
		
	
		
			
				
					            storm : : transformer : : ApplyFiniteSchedulerToPomdp < storm : : RationalNumber >  toPMCTransformer ( * pomdp ) ;