@ -54,7 +54,6 @@ namespace storm { 
		
	
		
			
				                    STORM_LOG_THROW ( ! sawType ,  storm : : exceptions : : WrongFormatException ,  " Type declared twice " ) ;                     STORM_LOG_THROW ( ! sawType ,  storm : : exceptions : : WrongFormatException ,  " Type declared twice " ) ;  
		
	
		
			
				                    type  =  storm : : models : : getModelType ( line . substr ( 7 ) ) ;                     type  =  storm : : models : : getModelType ( line . substr ( 7 ) ) ;  
		
	
		
			
				                    STORM_LOG_TRACE ( " Model type:  "  < <  type ) ;                     STORM_LOG_TRACE ( " Model type:  "  < <  type ) ;  
		
	
		
			
				                    STORM_LOG_THROW ( type  ! =  storm : : models : : ModelType : : MarkovAutomaton ,  storm : : exceptions : : NotSupportedException ,  " Markov Automata in DRN format are not supported (unclear indication of Markovian Choices in DRN format) " ) ;  
		
	
		
			
				                    STORM_LOG_THROW ( type  ! =  storm : : models : : ModelType : : S2pg ,  storm : : exceptions : : NotSupportedException ,  " Stochastic Two Player Games in DRN format are not supported. " ) ;                     STORM_LOG_THROW ( type  ! =  storm : : models : : ModelType : : S2pg ,  storm : : exceptions : : NotSupportedException ,  " Stochastic Two Player Games in DRN format are not supported. " ) ;  
		
	
		
			
				                    sawType  =  true ;                     sawType  =  true ;  
		
	
		
			
				
 
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -107,15 +106,21 @@ namespace storm { 
		
	
		
			
				            // Initialize
             // Initialize
  
		
	
		
			
				            auto  modelComponents  =  std : : make_shared < storm : : storage : : sparse : : ModelComponents < ValueType ,  RewardModelType > > ( ) ;             auto  modelComponents  =  std : : make_shared < storm : : storage : : sparse : : ModelComponents < ValueType ,  RewardModelType > > ( ) ;  
		
	
		
			
				            bool  nonDeterministic  =  ( type  = =  storm : : models : : ModelType : : Mdp  | |  type  = =  storm : : models : : ModelType : : MarkovAutomaton ) ;             bool  nonDeterministic  =  ( type  = =  storm : : models : : ModelType : : Mdp  | |  type  = =  storm : : models : : ModelType : : MarkovAutomaton ) ;  
		
	
		
			
				            bool  continousTime  =  ( type  = =  storm : : models : : ModelType : : Ctmc  | |  type  = =  storm : : models : : ModelType : : MarkovAutomaton ) ;  
		
	
		
			
				            storm : : storage : : SparseMatrixBuilder < ValueType >  builder  =  storm : : storage : : SparseMatrixBuilder < ValueType > ( 0 ,  0 ,  0 ,  false ,  nonDeterministic ,  0 ) ;             storm : : storage : : SparseMatrixBuilder < ValueType >  builder  =  storm : : storage : : SparseMatrixBuilder < ValueType > ( 0 ,  0 ,  0 ,  false ,  nonDeterministic ,  0 ) ;  
		
	
		
			
				            modelComponents - > stateLabeling  =  storm : : models : : sparse : : StateLabeling ( stateSize ) ;             modelComponents - > stateLabeling  =  storm : : models : : sparse : : StateLabeling ( stateSize ) ;  
		
	
		
			
				            std : : vector < std : : vector < ValueType > >  stateRewards ;             std : : vector < std : : vector < ValueType > >  stateRewards ;  
		
	
		
			
				             
		
	
		
			
				            if  ( continousTime )  {  
		
	
		
			
				                modelComponents - > exitRates  =  std : : vector < ValueType > ( stateSize ) ;  
		
	
		
			
				                if  ( type  = =  storm : : models : : ModelType : : MarkovAutomaton )  {  
		
	
		
			
				                    modelComponents - > markovianStates  =  storm : : storage : : BitVector ( stateSize ) ;  
		
	
		
			
				                }  
		
	
		
			
				            }  
		
	
		
			
				            // We parse rates for continuous time models.
             // We parse rates for continuous time models.
  
		
	
		
			
				            if  ( type  = =  storm : : models : : ModelType : : Ctmc )  {             if  ( type  = =  storm : : models : : ModelType : : Ctmc )  {  
		
	
		
			
				                modelComponents - > rateTransitions  =  true ;                 modelComponents - > rateTransitions  =  true ;  
		
	
		
			
				            }             }  
		
	
		
			
				             
		
	
		
			
				
  
		
	
		
			
				            // Iterate over all lines
             // Iterate over all lines
  
		
	
		
			
				            std : : string  line ;             std : : string  line ;  
		
	
		
			
				            size_t  row  =  0 ;             size_t  row  =  0 ;  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -131,34 +136,66 @@ namespace storm { 
		
	
		
			
				                    }  else  {                     }  else  {  
		
	
		
			
				                        + + state ;                         + + state ;  
		
	
		
			
				                    }                     }  
		
	
		
			
				                    line  =  line . substr ( 6 ) ;  
		
	
		
			
				                    size_t  parsedId ;  
		
	
		
			
				                    size_t  posId  =  line . find ( "   " ) ;  
		
	
		
			
				                    if  ( posId  ! =  std : : string : : npos )  {  
		
	
		
			
				                        parsedId  =  NumberParser < size_t > : : parse ( 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  rewardsStr  =  line . substr ( 1 ,  posEndReward - 1 ) ;  
		
	
		
			
				                            STORM_LOG_TRACE ( " State rewards:  "  < <  rewardsStr ) ;  
		
	
		
			
				                            std : : vector < std : : string >  rewards ;  
		
	
		
			
				                            boost : : split ( rewards ,  rewardsStr ,  boost : : is_any_of ( " , " ) ) ;  
		
	
		
			
				                            if  ( stateRewards . size ( )  <  rewards . size ( ) )  {  
		
	
		
			
				                                stateRewards . resize ( rewards . size ( ) ,  std : : vector < ValueType > ( stateSize ,  storm : : utility : : zero < ValueType > ( ) ) ) ;  
		
	
		
			
				                            }  
		
	
		
			
				                            auto  stateRewardsIt  =  stateRewards . begin ( ) ;  
		
	
		
			
				                            for  ( auto  const &  rew  :  rewards )  {  
		
	
		
			
				                                ( * stateRewardsIt ) [ state ]  =  valueParser . parseValue ( rew ) ;  
		
	
		
			
				                                + + stateRewardsIt ;  
		
	
		
			
				                            }  
		
	
		
			
				                            line  =  line . substr ( posEndReward + 1 ) ;  
		
	
		
			
				                    STORM_LOG_TRACE ( " New state  "  < <  state ) ;  
		
	
		
			
				
 
		
	
		
			
				                    // Parse state id
  
		
	
		
			
				                    line  =  line . substr ( 6 ) ;  // Remove "state "
  
		
	
		
			
				                    std : : string  curString  =  line ;  
		
	
		
			
				                    size_t  posEnd  =  line . find ( "   " ) ;  
		
	
		
			
				                    if  ( posEnd  ! =  std : : string : : npos )  {  
		
	
		
			
				                        curString  =  line . substr ( 0 ,  posEnd ) ;  
		
	
		
			
				                        line  =  line . substr ( posEnd + 1 ) ;  
		
	
		
			
				                    }  else  {  
		
	
		
			
				                        line  =  " " ;  
		
	
		
			
				                    }  
		
	
		
			
				                    size_t  parsedId  =  NumberParser < size_t > : : parse ( curString ) ;  
		
	
		
			
				                    STORM_LOG_ASSERT ( state  = =  parsedId ,  " State ids do not correspond. " ) ;  
		
	
		
			
				                    if  ( nonDeterministic )  {  
		
	
		
			
				                        STORM_LOG_TRACE ( " new Row Group starts at  "  < <  row  < <  " . " ) ;  
		
	
		
			
				                        builder . newRowGroup ( row ) ;  
		
	
		
			
				                    }  
		
	
		
			
				
 
		
	
		
			
				                    if  ( type  = =  storm : : models : : ModelType : : Ctmc  | |  type  = =  storm : : models : : ModelType : : MarkovAutomaton )  {  
		
	
		
			
				                        // Parse exit rate for CTMC or MA
  
		
	
		
			
				                        STORM_LOG_THROW ( boost : : starts_with ( line ,  " ! " ) ,  storm : : exceptions : : WrongFormatException ,  " Exit rate missing. " ) ;  
		
	
		
			
				                        line  =  line . substr ( 1 ) ;  //Remove "!"
  
		
	
		
			
				                        curString  =  line ;  
		
	
		
			
				                        posEnd  =  line . find ( "   " ) ;  
		
	
		
			
				                        if  ( posEnd  ! =  std : : string : : npos )  {  
		
	
		
			
				                            curString  =  line . substr ( 0 ,  posEnd ) ;  
		
	
		
			
				                            line  =  line . substr ( posEnd + 1 ) ;  
		
	
		
			
				                        }  else  {  
		
	
		
			
				                            line  =  " " ;  
		
	
		
			
				                        }  
		
	
		
			
				                        ValueType  exitRate  =  valueParser . parseValue ( curString ) ;  
		
	
		
			
				                        if  ( type  = =  storm : : models : : ModelType : : MarkovAutomaton  & &  ! storm : : utility : : isZero < ValueType > ( exitRate ) )  {  
		
	
		
			
				                            modelComponents - > markovianStates . get ( ) . set ( state ) ;  
		
	
		
			
				                        }  
		
	
		
			
				                        STORM_LOG_TRACE ( " Exit rate  "  < <  exitRate ) ;  
		
	
		
			
				                        modelComponents - > exitRates . get ( ) [ state ]  =  exitRate ;  
		
	
		
			
				                    }  
		
	
		
			
				
 
		
	
		
			
				                    if  ( boost : : starts_with ( line ,  " [ " ) )  {  
		
	
		
			
				                        // Parse rewards
  
		
	
		
			
				                        size_t  posEndReward  =  line . find ( ' ] ' ) ;  
		
	
		
			
				                        STORM_LOG_THROW ( posEndReward  ! =  std : : string : : npos ,  storm : : exceptions : : WrongFormatException ,  " ] missing. " ) ;  
		
	
		
			
				                        std : : string  rewardsStr  =  line . substr ( 1 ,  posEndReward - 1 ) ;  
		
	
		
			
				                        STORM_LOG_TRACE ( " State rewards:  "  < <  rewardsStr ) ;  
		
	
		
			
				                        std : : vector < std : : string >  rewards ;  
		
	
		
			
				                        boost : : split ( rewards ,  rewardsStr ,  boost : : is_any_of ( " , " ) ) ;  
		
	
		
			
				                        if  ( stateRewards . size ( )  <  rewards . size ( ) )  {  
		
	
		
			
				                            stateRewards . resize ( rewards . size ( ) ,  std : : vector < ValueType > ( stateSize ,  storm : : utility : : zero < ValueType > ( ) ) ) ;  
		
	
		
			
				                        }                         }  
		
	
		
			
				                        // Check for labels
  
		
	
		
			
				                        auto  stateRewardsIt  =  stateRewards . begin ( ) ;  
		
	
		
			
				                        for  ( auto  const &  rew  :  rewards )  {  
		
	
		
			
				                            ( * stateRewardsIt ) [ state ]  =  valueParser . parseValue ( rew ) ;  
		
	
		
			
				                            + + stateRewardsIt ;  
		
	
		
			
				                        }  
		
	
		
			
				                        line  =  line . substr ( posEndReward + 1 ) ;  
		
	
		
			
				                    }  
		
	
		
			
				
 
		
	
		
			
				                    // Parse labels
  
		
	
		
			
				                    if  ( ! line . empty ( ) )  {  
		
	
		
			
				                        std : : vector < std : : string >  labels ;                         std : : vector < std : : string >  labels ;  
		
	
		
			
				                        boost : : split ( labels ,  line ,  boost : : is_any_of ( "   " ) ) ;                         boost : : split ( labels ,  line ,  boost : : is_any_of ( "   " ) ) ;  
		
	
		
			
				                        for  ( std : : string  label  :  labels )  {                         for  ( std : : string  label  :  labels )  {  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -166,18 +203,10 @@ namespace storm { 
		
	
		
			
				                                modelComponents - > stateLabeling . addLabel ( label ) ;                                 modelComponents - > stateLabeling . addLabel ( label ) ;  
		
	
		
			
				                            }                             }  
		
	
		
			
				                            modelComponents - > stateLabeling . addLabelToState ( label ,  state ) ;                             modelComponents - > stateLabeling . addLabelToState ( label ,  state ) ;  
		
	
		
			
				                            STORM_LOG_TRACE ( " New label:  "  < <  label ) ;  
		
	
		
			
				                            STORM_LOG_TRACE ( " New label: '  "  < <  label  < <  " ' "  ) ;  
		
	
		
			
				                        }                         }  
		
	
		
			
				                    }  else  {  
		
	
		
			
				                        // Only state id given
  
		
	
		
			
				                        parsedId  =  NumberParser < size_t > : : parse ( line ) ;  
		
	
		
			
				                    }  
		
	
		
			
				                    STORM_LOG_TRACE ( " New state  "  < <  state ) ;  
		
	
		
			
				                    STORM_LOG_ASSERT ( state  = =  parsedId ,  " State ids do not correspond. " ) ;  
		
	
		
			
				                    if  ( nonDeterministic )  {  
		
	
		
			
				                        STORM_LOG_TRACE ( " new Row Group starts at  "  < <  row  < <  " . " ) ;  
		
	
		
			
				                        builder . newRowGroup ( row ) ;  
		
	
		
			
				                    }                     }  
		
	
		
			
				
 
		
	
		
			
				                }  else  if  ( boost : : starts_with ( line ,  " \t action  " ) )  {                 }  else  if  ( boost : : starts_with ( line ,  " \t action  " ) )  {  
		
	
		
			
				                    // New action
                     // New action
  
		
	
		
			
				                    if  ( firstAction )  {                     if  ( firstAction )  {