@ -1,24 +1,51 @@ 
			
		 
		
	
		
			
				 
				 
				# include  "storm/parser/DirectEncodingParser.h" 
  
				 
				 
				# include  "storm/parser/DirectEncodingParser.h" 
  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				# include  <cstdio> 
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				# include  <cstring> 
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				# include  <cstdint> 
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				# include  <clocale> 
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				# include  <iostream> 
  
				 
				 
				# include  <iostream> 
  
			
		 
		
	
		
			
				 
				 
				# include  <string> 
  
				 
				 
				# include  <string> 
  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				# include  "storm/models/sparse/MarkovAutomaton.h" 
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				# include  "storm/models/sparse/Ctmc.h" 
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				# include  "storm/exceptions/FileIoException.h" 
  
				 
				 
				# include  "storm/exceptions/FileIoException.h" 
  
			
		 
		
	
		
			
				 
				 
				# include  "storm/exceptions/WrongFormatException.h" 
  
				 
				 
				# include  "storm/exceptions/WrongFormatException.h" 
  
			
		 
		
	
		
			
				 
				 
				# include  "storm/exceptions/InvalidArgumentException.h" 
  
				 
				 
				# include  "storm/exceptions/InvalidArgumentException.h" 
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				# include  "storm/exceptions/NotSupportedException.h" 
  
			
		 
		
	
		
			
				 
				 
				# include  "storm/settings/SettingsManager.h" 
  
				 
				 
				# include  "storm/settings/SettingsManager.h" 
  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				# include  "storm/adapters/CarlAdapter.h" 
  
				 
				 
				# include  "storm/adapters/CarlAdapter.h" 
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				# include  "storm/utility/constants.h" 
  
			
		 
		
	
		
			
				 
				 
				# include  "storm/utility/macros.h" 
  
				 
				 
				# include  "storm/utility/macros.h" 
  
			
		 
		
	
		
			
				 
				 
				# include  "storm/utility/file.h" 
  
				 
				 
				# include  "storm/utility/file.h" 
  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				namespace  storm  {  
				 
				 
				namespace  storm  {  
			
		 
		
	
		
			
				 
				 
				    namespace  parser  {  
				 
				 
				    namespace  parser  {  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        template < >  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        void  ValueParser < double > : : addParameter ( std : : string  const &  parameter )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " Parameters are not supported in this build. " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        template < >  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        void  ValueParser < storm : : RationalFunction > : : addParameter ( std : : string  const &  parameter )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            //STORM_LOG_THROW((std::is_same<ValueType, storm::RationalFunction>::value), storm::exceptions::NotSupportedException, "Parameters only allowed when using rational functions.");
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            storm : : expressions : : Variable  var  =  manager - > declareRationalVariable ( parameter ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            identifierMapping . emplace ( var . getName ( ) ,  var ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            parser . setIdentifierMapping ( identifierMapping ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_TRACE ( " Added parameter:  "  < <  var . getName ( ) ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        template < >  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        double  ValueParser < double > : : parseValue ( std : : string  const &  value )  const  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            return  boost : : lexical_cast < double > ( value ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        template < >  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        storm : : RationalFunction  ValueParser < storm : : RationalFunction > : : parseValue ( std : : string  const &  value )  const  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            storm : : RationalFunction  rationalFunction  =  evaluator . asRational ( parser . parseFromString ( value ) ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_TRACE ( " Parsed expression:  "  < <  rationalFunction ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            return  rationalFunction ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				        template < typename  ValueType ,  typename  RewardModelType >  
				 
				 
				        template < typename  ValueType ,  typename  RewardModelType >  
			
		 
		
	
		
			
				 
				 
				        std : : shared_ptr < storm : : models : : sparse : : Model < ValueType ,  RewardModelType > >  DirectEncodingParser < ValueType ,  RewardModelType > : : parseModel ( std : : string  const &  filename )  {  
				 
				 
				        std : : shared_ptr < storm : : models : : sparse : : Model < ValueType ,  RewardModelType > >  DirectEncodingParser < ValueType ,  RewardModelType > : : parseModel ( std : : string  const &  filename )  {  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
	
		
			
				
					
					
					
						
							 
						 
					
				 
				@ -29,17 +56,47 @@ namespace storm { 
			
		 
		
	
		
			
				 
				 
				            std : : string  line ;  
				 
				 
				            std : : string  line ;  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				            // Initialize
  
				 
				 
				            // Initialize
  
			
		 
		
	
		
			
				 
				 
				            storm : : models : : ModelType  type ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            ValueParser < ValueType >  valueParser ;  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				            // Iterate over all lines
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				            while  ( std : : getline ( file ,  line ) )  {  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				                STORM_LOG_TRACE ( " Parsing:  "  < <  line ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            // Parse header
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            std : : getline ( file ,  line ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_THROW ( line  = =  " // Exported by storm " ,  storm : : exceptions : : WrongFormatException ,  " Expected header information. " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            std : : getline ( file ,  line ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_THROW ( boost : : starts_with ( line ,  " // Original model type:  " ) ,  storm : : exceptions : : WrongFormatException ,  " Expected header information. " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            // Parse model type
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            std : : getline ( file ,  line ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_THROW ( boost : : starts_with ( line ,  " @type:  " ) ,  storm : : exceptions : : WrongFormatException ,  " Expected model type. " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            storm : : models : : ModelType  type  =  storm : : models : : getModelType ( line . substr ( 7 ) ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_TRACE ( " Model type:  "  < <  type ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            // Parse parameters
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            std : : getline ( file ,  line ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_THROW ( line  = =  " @parameters " ,  storm : : exceptions : : WrongFormatException ,  " Expected parameter declaration. " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            std : : getline ( file ,  line ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            if  ( line  ! =  " " )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                std : : vector < std : : string >  parameters ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                boost : : split ( parameters ,  line ,  boost : : is_any_of ( "   " ) ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                for  ( std : : string  parameter  :  parameters )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    STORM_LOG_TRACE ( " New parameter:  "  < <  parameter ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    valueParser . addParameter ( parameter ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                }  
			
		 
		
	
		
			
				 
				 
				            }  
				 
				 
				            }  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            // Parse no. states
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            std : : getline ( file ,  line ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_THROW ( line  = =  " @nr_states " ,  storm : : exceptions : : WrongFormatException ,  " Expected number of states. " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            std : : getline ( file ,  line ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            size_t  nrStates  =  boost : : lexical_cast < size_t > ( line ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_TRACE ( " Model type:  "  < <  type ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            std : : getline ( file ,  line ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_THROW ( line  = =  " @model " ,  storm : : exceptions : : WrongFormatException ,  " Expected model declaration. " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            // Construct transition matrix
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            std : : shared_ptr < ModelComponents >  modelComponents  =  parseStates ( file ,  type ,  nrStates ,  valueParser ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				            // Done parsing
  
				 
				 
				            // Done parsing
  
			
		 
		
	
		
			
				 
				 
				            storm : : utility : : closeFile ( file ) ;  
				 
				 
				            storm : : utility : : closeFile ( file ) ;  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				            // Build model
  
				 
				 
				            // Build model
  
			
		 
		
	
		
			
				 
				 
				            switch  ( type )  {  
				 
				 
				            switch  ( type )  {  
			
		 
		
	
		
			
				 
				 
				                case  storm : : models : : ModelType : : Dtmc :  
				 
				 
				                case  storm : : models : : ModelType : : Dtmc :  
			
		 
		
	
	
		
			
				
					
					
					
						
							 
						 
					
				 
				@ -48,7 +105,7 @@ namespace storm { 
			
		 
		
	
		
			
				 
				 
				                }  
				 
				 
				                }  
			
		 
		
	
		
			
				 
				 
				                case  storm : : models : : ModelType : : Ctmc :  
				 
				 
				                case  storm : : models : : ModelType : : Ctmc :  
			
		 
		
	
		
			
				 
				 
				                {  
				 
				 
				                {  
			
		 
		
	
		
			
				 
				 
				                    STORM_LOG_THROW ( false ,  storm : : exceptions : : FileIoException ,  " CTMC not supported. " ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    return  std : : make_shared < storm : : models : : sparse : : Ctmc < ValueType ,  RewardModelType > > ( std : : move ( modelComponents - > transitionMatrix ) ,  std : : move ( modelComponents - > stateLabeling ) ,  std : : move ( modelComponents - > rewardModels ) ,  std : : move ( modelComponents - > choiceLabeling ) ) ;  
			
		 
		
	
		
			
				 
				 
				                }  
				 
				 
				                }  
			
		 
		
	
		
			
				 
				 
				                case  storm : : models : : ModelType : : Mdp :  
				 
				 
				                case  storm : : models : : ModelType : : Mdp :  
			
		 
		
	
		
			
				 
				 
				                {  
				 
				 
				                {  
			
		 
		
	
	
		
			
				
					
					
					
						
							 
						 
					
				 
				@ -56,13 +113,103 @@ namespace storm { 
			
		 
		
	
		
			
				 
				 
				                }  
				 
				 
				                }  
			
		 
		
	
		
			
				 
				 
				                case  storm : : models : : ModelType : : MarkovAutomaton :  
				 
				 
				                case  storm : : models : : ModelType : : MarkovAutomaton :  
			
		 
		
	
		
			
				 
				 
				                {  
				 
				 
				                {  
			
		 
		
	
		
			
				 
				 
				                    STORM_LOG_THROW ( false ,  storm : : exceptions : : FileIoException ,  " MA not supported. " ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    return  std : : make_shared < storm : : models : : sparse : : MarkovAutomaton < ValueType ,  RewardModelType > > ( std : : move ( modelComponents - > transitionMatrix ) ,  std : : move ( modelComponents - > stateLabeling ) ,  std : : move ( modelComponents - > markovianStates ) ,  std : : move ( modelComponents - > exitRates ) ) ;  
			
		 
		
	
		
			
				 
				 
				                }  
				 
				 
				                }  
			
		 
		
	
		
			
				 
				 
				                default :  
				 
				 
				                default :  
			
		 
		
	
		
			
				 
				 
				                    STORM_LOG_THROW ( false ,  storm : : exceptions : : FileIoException ,  " Unknown/Unhandled model type  "  < <  type  < <  "  which cannot be parsed. " ) ;  
				 
				 
				                    STORM_LOG_THROW ( false ,  storm : : exceptions : : FileIoException ,  " Unknown/Unhandled model type  "  < <  type  < <  "  which cannot be parsed. " ) ;  
			
		 
		
	
		
			
				 
				 
				            }  
				 
				 
				            }  
			
		 
		
	
		
			
				 
				 
				        }  
				 
				 
				        }  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        template < typename  ValueType ,  typename  RewardModelType >  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        std : : shared_ptr < typename  DirectEncodingParser < ValueType ,  RewardModelType > : : ModelComponents >  DirectEncodingParser < ValueType ,  RewardModelType > : : parseStates ( std : : istream &  file ,  storm : : models : : ModelType  type ,  size_t  stateSize ,  ValueParser < ValueType >  const &  valueParser )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            // Initialize
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            std : : shared_ptr < ModelComponents >  modelComponents  =  std : : make_shared < ModelComponents > ( ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            modelComponents - > nonDeterministic  =  ( type  = =  storm : : models : : ModelType : : Mdp  | |  type  = =  storm : : models : : ModelType : : MarkovAutomaton ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            storm : : storage : : SparseMatrixBuilder < ValueType >  builder  =  storm : : storage : : SparseMatrixBuilder < ValueType > ( 0 ,  0 ,  0 ,  false ,  modelComponents - > nonDeterministic ,  0 ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            // Iterate over all lines
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            std : : string  line ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            size_t  row  =  0 ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            size_t  state  =  0 ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            bool  first  =  true ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            while  ( std : : getline ( file ,  line ) )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                STORM_LOG_TRACE ( " Parsing:  "  < <  line ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                if  ( boost : : starts_with ( line ,  " state  " ) )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    // New state
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    line  =  line . substr ( 6 ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    size_t  parsedId ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    size_t  posId  =  line . find ( "   " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    if  ( posId  ! =  std : : string : : npos )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        parsedId  =  boost : : lexical_cast < size_t > ( line . substr ( 0 ,  posId ) ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        // Parse rewards and labels
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        line  =  line . substr ( posId + 1 ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        // Check for rewards
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        if  ( boost : : starts_with ( line ,  " [ " ) )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                            // Rewards found
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                            size_t  posEndReward  =  line . find ( ' ] ' ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                            STORM_LOG_THROW ( posEndReward  ! =  std : : string : : npos ,  storm : : exceptions : : WrongFormatException ,  " ] missing. " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                            std : : string  rewards  =  line . substr ( 1 ,  posEndReward - 1 ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                            STORM_LOG_TRACE ( " State rewards:  "  < <  rewards ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                            // TODO save rewards
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                            line  =  line . substr ( posEndReward + 1 ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        // Check for labels
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        std : : vector < std : : string >  labels ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        boost : : split ( labels ,  line ,  boost : : is_any_of ( "   " ) ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        if  ( ! labels . empty ( ) )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                            STORM_LOG_TRACE ( " Labels:  "  < <  labels ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    }  else  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        // Only state id given
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        parsedId  =  boost : : lexical_cast < size_t > ( line ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    STORM_LOG_TRACE ( " New state  "  < <  state  < <  "   "  < <  parsedId ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    STORM_LOG_ASSERT ( state  = =  parsedId ,  " State ids do not correspond. " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    if  ( modelComponents - > nonDeterministic )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        builder . newRowGroup ( row ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    + + state ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                }  else  if  ( boost : : starts_with ( line ,  " \t action  " ) )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    // New action
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    line  =  line . substr ( 8 ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    STORM_LOG_TRACE ( " New action:  "  < <  row ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    // Check for rewards
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    if  ( boost : : starts_with ( line ,  " [ " ) )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        // Rewards found
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        size_t  posEndReward  =  line . find ( ' ] ' ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        STORM_LOG_THROW ( posEndReward  ! =  std : : string : : npos ,  storm : : exceptions : : WrongFormatException ,  " ] missing. " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        std : : string  rewards  =  line . substr ( 1 ,  posEndReward - 1 ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        STORM_LOG_TRACE ( " Transition rewards:  "  < <  rewards ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        // TODO save rewards
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        line  =  line . substr ( posEndReward + 1 ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    // TODO import choice labeling when the export works
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    if  ( first )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        first  =  false ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    }  else  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                        + + row ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                }  else  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    // New transition
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    size_t  posColon  =  line . find ( " : " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    STORM_LOG_ASSERT ( posColon  ! =  std : : string : : npos ,  " ':' not found. " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    size_t  target  =  boost : : lexical_cast < size_t > ( line . substr ( 2 ,  posColon - 3 ) ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    std : : string  valueStr  =  line . substr ( posColon + 2 ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    ValueType  value  =  valueParser . parseValue ( valueStr ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    STORM_LOG_TRACE ( " Transition  "  < <  state  < <  "  ->  "  < <  target  < <  " :  "  < <  value ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                    builder . addNextValue ( state ,  target ,  value ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				                }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_TRACE ( " Finished parsing " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            modelComponents - > transitionMatrix  =  builder . build ( stateSize ,  stateSize ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            STORM_LOG_TRACE ( " Built matrix " ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				            return  modelComponents ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        }  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				        // Template instantiations.
  
			
		 
		
	
		
			
				 
				 
				        template  class  DirectEncodingParser < double > ;  
				 
				 
				        template  class  DirectEncodingParser < double > ;  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				# ifdef STORM_HAVE_CARL 
  
				 
				 
				# ifdef STORM_HAVE_CARL