@ -197,13 +197,14 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					        storm : : cli : : setUrgentOptions ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					        typedef  double  VT ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        auto  const &  coreSettings  =  storm : : settings : : getModule < storm : : settings : : modules : : CoreSettings > ( ) ;  
			
		
	
		
			
				
					        auto  const &  pomdpSettings  =  storm : : settings : : getModule < storm : : settings : : modules : : POMDPSettings > ( ) ;  
			
		
	
		
			
				
					        auto  const  & general  =  storm : : settings : : getModule < storm : : settings : : modules : : GeneralSettings > ( ) ;  
			
		
	
		
			
				
					        auto  const  & debug  =  storm : : settings : : getModule < storm : : settings : : modules : : DebugSettings > ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( general . isVerboseSet ( ) )  {  
			
		
	
		
			
				
					            storm : : utility : : setLogLevel ( l3pp : : LogLevel : : INFO ) ;  
			
		
	
		
			
				
					        }  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -222,8 +223,8 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					        auto  model  =  storm : : cli : : buildPreprocessExportModelWithValueTypeAndDdlib < storm : : dd : : DdType : : Sylvan ,  double > ( symbolicInput ,  engine ) ;  
			
		
	
		
			
				
					        STORM_LOG_THROW ( model  & &  model - > getType ( )  = =  storm : : models : : ModelType : : Pomdp ,  storm : : exceptions : : WrongFormatException ,  " Expected a POMDP. " ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        std : : shared_ptr < storm : : models : : sparse : : Pomdp < storm : : RationalNumber > >  pomdp  =  model - > template  as < storm : : models : : sparse : : Pomdp < storm : : RationalNumber > > ( ) ;  
			
		
	
		
			
				
					        storm : : transformer : : MakePOMDPCanonic < storm : : RationalNumber >  makeCanonic ( * pomdp ) ;  
			
		
	
		
			
				
					        std : : shared_ptr < storm : : models : : sparse : : Pomdp < VT > >  pomdp  =  model - > template  as < storm : : models : : sparse : : Pomdp < VT > > ( ) ;  
			
		
	
		
			
				
					        storm : : transformer : : MakePOMDPCanonic < VT >  makeCanonic ( * pomdp ) ;  
			
		
	
		
			
				
					        pomdp  =  makeCanonic . transform ( ) ;  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        std : : shared_ptr < storm : : logic : : Formula  const >  formula ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -235,7 +236,7 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( pomdpSettings . isAnalyzeUniqueObservationsSet ( ) )  {  
			
		
	
		
			
				
					            STORM_PRINT_AND_LOG ( " Analyzing states with unique observation ... "  < <  std : : endl ) ;  
			
		
	
		
			
				
					            storm : : analysis : : UniqueObservationStates < double >  uniqueAnalysis ( * pomdp ) ;  
			
		
	
		
			
				
					            storm : : analysis : : UniqueObservationStates < VT >  uniqueAnalysis ( * pomdp ) ;  
			
		
	
		
			
				
					            std : : cout  < <  uniqueAnalysis . analyse ( )  < <  std : : endl ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -261,12 +262,12 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					                if  ( pomdpSettings . isSelfloopReductionSet ( )  & &  ! storm : : solver : : minimize ( formula - > asProbabilityOperatorFormula ( ) . getOptimalityType ( ) ) )  {  
			
		
	
		
			
				
					                    STORM_PRINT_AND_LOG ( " Eliminating self-loop choices ... " ) ;  
			
		
	
		
			
				
					                    uint64_t  oldChoiceCount  =  pomdp - > getNumberOfChoices ( ) ;  
			
		
	
		
			
				
					                    storm : : transformer : : GlobalPOMDPSelfLoopEliminator < double >  selfLoopEliminator ( * pomdp ) ;  
			
		
	
		
			
				
					                    storm : : transformer : : GlobalPOMDPSelfLoopEliminator < VT >  selfLoopEliminator ( * pomdp ) ;  
			
		
	
		
			
				
					                    pomdp  =  selfLoopEliminator . transform ( ) ;  
			
		
	
		
			
				
					                    STORM_PRINT_AND_LOG ( oldChoiceCount  -  pomdp - > getNumberOfChoices ( )  < <  "  choices eliminated through self-loop elimination. "  < <  std : : endl ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                if  ( pomdpSettings . isQualitativeReductionSet ( ) )  {  
			
		
	
		
			
				
					                    storm : : analysis : : QualitativeAnalysis < double >  qualitativeAnalysis ( * pomdp ) ;  
			
		
	
		
			
				
					                    storm : : analysis : : QualitativeAnalysis < VT >  qualitativeAnalysis ( * pomdp ) ;  
			
		
	
		
			
				
					                    STORM_PRINT_AND_LOG ( " Computing states with probability 0 ... " ) ;  
			
		
	
		
			
				
					                    prob0States  =  qualitativeAnalysis . analyseProb0 ( formula - > asProbabilityOperatorFormula ( ) ) ;  
			
		
	
		
			
				
					                    std : : cout  < <  * prob0States  < <  std : : endl ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -276,15 +277,15 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					                    std : : cout  < <  * prob1States  < <  std : : endl ;  
			
		
	
		
			
				
					                    STORM_PRINT_AND_LOG ( "  done. "  < <  std : : endl ) ;  
			
		
	
		
			
				
					                    //std::cout << "actual reduction not yet implemented..." << std::endl;
  
			
		
	
		
			
				
					                    storm : : pomdp : : transformer : : KnownProbabilityTransformer < double >  kpt  =  storm : : pomdp : : transformer : : KnownProbabilityTransformer < double > ( ) ;  
			
		
	
		
			
				
					                    storm : : pomdp : : transformer : : KnownProbabilityTransformer < VT >  kpt  =  storm : : pomdp : : transformer : : KnownProbabilityTransformer < double > ( ) ;  
			
		
	
		
			
				
					                    pomdp  =  kpt . transform ( * pomdp ,  * prob0States ,  * prob1States ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                if  ( pomdpSettings . isGridApproximationSet ( ) )  {  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    storm : : pomdp : : modelchecker : : ApproximatePOMDPModelchecker < double >  checker  =  storm : : pomdp : : modelchecker : : ApproximatePOMDPModelchecker < double > ( ) ;  
			
		
	
		
			
				
					                    auto  overRes  =  storm : : utility : : one < double > ( ) ;  
			
		
	
		
			
				
					                    auto  underRes  =  storm : : utility : : zero < double > ( ) ;  
			
		
	
		
			
				
					                    std : : unique_ptr < storm : : pomdp : : modelchecker : : POMDPCheckResult < double > >  result ;  
			
		
	
		
			
				
					                    storm : : pomdp : : modelchecker : : ApproximatePOMDPModelchecker < VT >  checker  =  storm : : pomdp : : modelchecker : : ApproximatePOMDPModelchecker < double > ( ) ;  
			
		
	
		
			
				
					                    auto  overRes  =  storm : : utility : : one < VT > ( ) ;  
			
		
	
		
			
				
					                    auto  underRes  =  storm : : utility : : zero < VT > ( ) ;  
			
		
	
		
			
				
					                    std : : unique_ptr < storm : : pomdp : : modelchecker : : POMDPCheckResult < VT > >  result ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    result  =  checker . refineReachabilityProbability ( * pomdp ,  targetObservationSet ,  probFormula . getOptimalityType ( )  = =  storm : : OptimizationDirection : : Minimize ,  
			
		
	
		
			
				
					                                                                   pomdpSettings . getGridResolution ( ) ,  pomdpSettings . getExplorationThreshold ( ) ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -306,10 +307,10 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					                    storm : : expressions : : ExpressionManager  expressionManager ;  
			
		
	
		
			
				
					                    std : : shared_ptr < storm : : utility : : solver : : SmtSolverFactory >  smtSolverFactory  =  std : : make_shared < storm : : utility : : solver : : Z3SmtSolverFactory > ( ) ;  
			
		
	
		
			
				
					                    if  ( pomdpSettings . getMemlessSearchMethod ( )  = =  " ccd16memless " )  {  
			
		
	
		
			
				
					                        storm : : pomdp : : QualitativeStrategySearchNaive < double >  memlessSearch ( * pomdp ,  targetObservationSet ,  targetStates ,  badStates ,  smtSolverFactory ) ;  
			
		
	
		
			
				
					                        storm : : pomdp : : QualitativeStrategySearchNaive < VT >  memlessSearch ( * pomdp ,  targetObservationSet ,  targetStates ,  badStates ,  smtSolverFactory ) ;  
			
		
	
		
			
				
					                        memlessSearch . findNewStrategyForSomeState ( 5 ) ;  
			
		
	
		
			
				
					                    }  else  if  ( pomdpSettings . getMemlessSearchMethod ( )  = =  " iterative " )  {  
			
		
	
		
			
				
					                        storm : : pomdp : : MemlessStrategySearchQualitative < double >  memlessSearch ( * pomdp ,  targetObservationSet ,  targetStates ,  badStates ,  smtSolverFactory ) ;  
			
		
	
		
			
				
					                        storm : : pomdp : : MemlessStrategySearchQualitative < VT >  memlessSearch ( * pomdp ,  targetObservationSet ,  targetStates ,  badStates ,  smtSolverFactory ) ;  
			
		
	
		
			
				
					                        memlessSearch . findNewStrategyForSomeState ( 5 ) ;  
			
		
	
		
			
				
					                    }  else  {  
			
		
	
		
			
				
					                        STORM_LOG_ERROR ( " This method is not implemented. " ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -321,7 +322,7 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					                if  ( pomdpSettings . isSelfloopReductionSet ( )  & &  storm : : solver : : minimize ( formula - > asRewardOperatorFormula ( ) . getOptimalityType ( ) ) )  {  
			
		
	
		
			
				
					                    STORM_PRINT_AND_LOG ( " Eliminating self-loop choices ... " ) ;  
			
		
	
		
			
				
					                    uint64_t  oldChoiceCount  =  pomdp - > getNumberOfChoices ( ) ;  
			
		
	
		
			
				
					                    storm : : transformer : : GlobalPOMDPSelfLoopEliminator < double >  selfLoopEliminator ( * pomdp ) ;  
			
		
	
		
			
				
					                    storm : : transformer : : GlobalPOMDPSelfLoopEliminator < VT >  selfLoopEliminator ( * pomdp ) ;  
			
		
	
		
			
				
					                    pomdp  =  selfLoopEliminator . transform ( ) ;  
			
		
	
		
			
				
					                    STORM_PRINT_AND_LOG ( oldChoiceCount  -  pomdp - > getNumberOfChoices ( )  < <  "  choices eliminated through self-loop elimination. "  < <  std : : endl ) ;  
			
		
	
		
			
				
					                }  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -367,10 +368,10 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					                                    " The formula is not supported by the grid approximation " ) ;  
			
		
	
		
			
				
					                    STORM_LOG_ASSERT ( ! targetObservationSet . empty ( ) ,  " The set of target observations is empty! " ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    storm : : pomdp : : modelchecker : : ApproximatePOMDPModelchecker < double >  checker  =  storm : : pomdp : : modelchecker : : ApproximatePOMDPModelchecker < double > ( ) ;  
			
		
	
		
			
				
					                    auto  overRes  =  storm : : utility : : one < double > ( ) ;  
			
		
	
		
			
				
					                    auto  underRes  =  storm : : utility : : zero < double > ( ) ;  
			
		
	
		
			
				
					                    std : : unique_ptr < storm : : pomdp : : modelchecker : : POMDPCheckResult < double > >  result ;  
			
		
	
		
			
				
					                    storm : : pomdp : : modelchecker : : ApproximatePOMDPModelchecker < VT >  checker  =  storm : : pomdp : : modelchecker : : ApproximatePOMDPModelchecker < double > ( ) ;  
			
		
	
		
			
				
					                    auto  overRes  =  storm : : utility : : one < VT > ( ) ;  
			
		
	
		
			
				
					                    auto  underRes  =  storm : : utility : : zero < VT > ( ) ;  
			
		
	
		
			
				
					                    std : : unique_ptr < storm : : pomdp : : modelchecker : : POMDPCheckResult < VT > >  result ;  
			
		
	
		
			
				
					                    result  =  checker . computeReachabilityReward ( * pomdp ,  targetObservationSet ,  
			
		
	
		
			
				
					                                                               rewFormula . getOptimalityType ( )  = =  
			
		
	
		
			
				
					                                                               storm : : OptimizationDirection : : Minimize ,  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -384,7 +385,7 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					                STORM_PRINT_AND_LOG ( " Computing the unfolding for memory bound  "  < <  pomdpSettings . getMemoryBound ( )  < <  "  and memory pattern ' "  < <  storm : : storage : : toString ( pomdpSettings . getMemoryPattern ( ) )  < <  " ' ... " ) ;  
			
		
	
		
			
				
					                storm : : storage : : PomdpMemory  memory  =  storm : : storage : : PomdpMemoryBuilder ( ) . build ( pomdpSettings . getMemoryPattern ( ) ,  pomdpSettings . getMemoryBound ( ) ) ;  
			
		
	
		
			
				
					                std : : cout  < <  memory . toString ( )  < <  std : : endl ;  
			
		
	
		
			
				
					                storm : : transformer : : PomdpMemoryUnfolder < double >  memoryUnfolder ( * pomdp ,  memory ) ;  
			
		
	
		
			
				
					                storm : : transformer : : PomdpMemoryUnfolder < VT >  memoryUnfolder ( * pomdp ,  memory ) ;  
			
		
	
		
			
				
					                pomdp  =  memoryUnfolder . transform ( ) ;  
			
		
	
		
			
				
					                STORM_PRINT_AND_LOG ( "  done. "  < <  std : : endl ) ;  
			
		
	
		
			
				
					                pomdp - > printModelInformationToStream ( std : : cout ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -398,7 +399,7 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					                STORM_PRINT_AND_LOG ( " Eliminating mec choices ... " ) ;  
			
		
	
		
			
				
					                // Note: Elimination of mec choices only preserves memoryless schedulers.
  
			
		
	
		
			
				
					                uint64_t  oldChoiceCount  =  pomdp - > getNumberOfChoices ( ) ;  
			
		
	
		
			
				
					                storm : : transformer : : GlobalPomdpMecChoiceEliminator < double >  mecChoiceEliminator ( * pomdp ) ;  
			
		
	
		
			
				
					                storm : : transformer : : GlobalPomdpMecChoiceEliminator < VT >  mecChoiceEliminator ( * pomdp ) ;  
			
		
	
		
			
				
					                pomdp  =  mecChoiceEliminator . transform ( * formula ) ;  
			
		
	
		
			
				
					                STORM_PRINT_AND_LOG ( "  done. "  < <  std : : endl ) ;  
			
		
	
		
			
				
					                STORM_PRINT_AND_LOG ( oldChoiceCount  -  pomdp - > getNumberOfChoices ( )  < <  "  choices eliminated through MEC choice elimination. "  < <  std : : endl ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -408,10 +409,10 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					            if  ( pomdpSettings . isTransformBinarySet ( )  | |  pomdpSettings . isTransformSimpleSet ( ) )  {  
			
		
	
		
			
				
					                if  ( pomdpSettings . isTransformSimpleSet ( ) )  {  
			
		
	
		
			
				
					                    STORM_PRINT_AND_LOG ( " Transforming the POMDP to a simple POMDP. " ) ;  
			
		
	
		
			
				
					                    pomdp  =  storm : : transformer : : BinaryPomdpTransformer < double > ( ) . transform ( * pomdp ,  true ) ;  
			
		
	
		
			
				
					                    pomdp  =  storm : : transformer : : BinaryPomdpTransformer < VT > ( ) . transform ( * pomdp ,  true ) ;  
			
		
	
		
			
				
					                }  else  {  
			
		
	
		
			
				
					                    STORM_PRINT_AND_LOG ( " Transforming the POMDP to a binary POMDP. " ) ;  
			
		
	
		
			
				
					                    pomdp  =  storm : : transformer : : BinaryPomdpTransformer < double > ( ) . transform ( * pomdp ,  false ) ;  
			
		
	
		
			
				
					                    pomdp  =  storm : : transformer : : BinaryPomdpTransformer < VT > ( ) . transform ( * pomdp ,  false ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                pomdp - > printModelInformationToStream ( std : : cout ) ;  
			
		
	
		
			
				
					                STORM_PRINT_AND_LOG ( "  done. "  < <  std : : endl ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -420,7 +421,7 @@ int main(const int argc, const char** argv) { 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  ( pomdpSettings . isExportToParametricSet ( ) )  {  
			
		
	
		
			
				
					                STORM_PRINT_AND_LOG ( " Transforming memoryless POMDP to pMC... " ) ;  
			
		
	
		
			
				
					                storm : : transformer : : ApplyFiniteSchedulerToPomdp < double >  toPMCTransformer ( * pomdp ) ;  
			
		
	
		
			
				
					                storm : : transformer : : ApplyFiniteSchedulerToPomdp < VT >  toPMCTransformer ( * pomdp ) ;  
			
		
	
		
			
				
					                std : : string  transformMode  =  pomdpSettings . getFscApplicationTypeString ( ) ;  
			
		
	
		
			
				
					                auto  pmc  =  toPMCTransformer . transform ( storm : : transformer : : parsePomdpFscApplicationMode ( transformMode ) ) ;  
			
		
	
		
			
				
					                STORM_PRINT_AND_LOG ( "  done. "  < <  std : : endl ) ;