@ -19,6 +19,9 @@ namespace storm { 
		
	
		
			
				
 
		
	
		
			
				            template < typename  SparseModelType >             template < typename  SparseModelType >  
		
	
		
			
				            std : : shared_ptr < SparseModelType >  SparseModelNondeterministicMemoryProduct < SparseModelType > : : build ( )  const  {             std : : shared_ptr < SparseModelType >  SparseModelNondeterministicMemoryProduct < SparseModelType > : : build ( )  const  {  
		
	
		
			
				                // For Markov automata, we can not introduce nondeterminism at Markovian states.
  
		
	
		
			
				                // We could introduce new intermediate probabilistic states, however that is not supported yet.
  
		
	
		
			
				                STORM_LOG_THROW ( ! model . isOfType ( storm : : models : : ModelType : : MarkovAutomaton ) ,  storm : : exceptions : : NotSupportedException ,  " Nondeterministic memory product not supported for Markov automata as this would introduce nondeterminism at Markovian states. " ) ;  
		
	
		
			
				                // For simplicity we first build the 'full' product of model and memory (with model.numStates * memory.numStates states).
                 // For simplicity we first build the 'full' product of model and memory (with model.numStates * memory.numStates states).
  
		
	
		
			
				                storm : : storage : : sparse : : ModelComponents < ValueType >  components ;                 storm : : storage : : sparse : : ModelComponents < ValueType >  components ;  
		
	
		
			
				                components . transitionMatrix  =  buildTransitions ( ) ;                 components . transitionMatrix  =  buildTransitions ( ) ;  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -34,12 +37,13 @@ namespace storm { 
		
	
		
			
				                for  ( auto  const &  rewModel  :  model . getRewardModels ( ) )  {                 for  ( auto  const &  rewModel  :  model . getRewardModels ( ) )  {  
		
	
		
			
				                    components . rewardModels . emplace ( rewModel . first ,  buildRewardModel ( rewModel . second ,  reachableStates ) ) ;                     components . rewardModels . emplace ( rewModel . first ,  buildRewardModel ( rewModel . second ,  reachableStates ) ) ;  
		
	
		
			
				                }                 }  
		
	
		
			
				                /* Markov automata are not supported (This code would introduce nondeterminism at Markovian states...)
  
		
	
		
			
				                if  ( model . isOfType ( storm : : models : : ModelType : : MarkovAutomaton ) )  {                 if  ( model . isOfType ( storm : : models : : ModelType : : MarkovAutomaton ) )  {  
		
	
		
			
				                    STORM_LOG_ASSERT ( ( std : : is_same < SparseModelType ,  storm : : models : : sparse : : MarkovAutomaton < ValueType > > : : value ) ,  " Model has unexpected type. " ) ;                     STORM_LOG_ASSERT ( ( std : : is_same < SparseModelType ,  storm : : models : : sparse : : MarkovAutomaton < ValueType > > : : value ) ,  " Model has unexpected type. " ) ;  
		
	
		
			
				                    auto  ma  =  model . template  as < storm : : models : : sparse : : MarkovAutomaton < ValueType > > ( ) ;                     auto  ma  =  model . template  as < storm : : models : : sparse : : MarkovAutomaton < ValueType > > ( ) ;  
		
	
		
			
				                    components . exitRates  =  buildExitRateVector ( * ma ,  reachableStates ) ;                     components . exitRates  =  buildExitRateVector ( * ma ,  reachableStates ) ;  
		
	
		
			
				                    components . markovianStates  =  buildMarkovianStateLabeling ( * ma ,  reachableStates ) ;                     components . markovianStates  =  buildMarkovianStateLabeling ( * ma ,  reachableStates ) ;  
		
	
		
			
				                }  
		
	
		
			
				                }  */   
		
	
		
			
				                return  std : : make_shared < SparseModelType > ( std : : move ( components ) ) ;                 return  std : : make_shared < SparseModelType > ( std : : move ( components ) ) ;  
		
	
		
			
				            }             }  
		
	
		
			
				                 
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -132,6 +136,7 @@ namespace storm { 
		
	
		
			
				                return  storm : : models : : sparse : : StandardRewardModel < ValueType > ( std : : move ( stateRewards ) ,  std : : move ( actionRewards ) ) ;                 return  storm : : models : : sparse : : StandardRewardModel < ValueType > ( std : : move ( stateRewards ) ,  std : : move ( actionRewards ) ) ;  
		
	
		
			
				            }             }  
		
	
		
			
				                 
		
	
		
			
				            /* Markov Automata currently not supported.
  
		
	
		
			
				            template < typename  SparseModelType >             template < typename  SparseModelType >  
		
	
		
			
				            std : : vector < typename  SparseModelNondeterministicMemoryProduct < SparseModelType > : : ValueType >  SparseModelNondeterministicMemoryProduct < SparseModelType > : : buildExitRateVector ( storm : : models : : sparse : : MarkovAutomaton < ValueType >  const &  modelAsMA ,  storm : : storage : : BitVector  const &  reachableStates )  const  {             std : : vector < typename  SparseModelNondeterministicMemoryProduct < SparseModelType > : : ValueType >  SparseModelNondeterministicMemoryProduct < SparseModelType > : : buildExitRateVector ( storm : : models : : sparse : : MarkovAutomaton < ValueType >  const &  modelAsMA ,  storm : : storage : : BitVector  const &  reachableStates )  const  {  
		
	
		
			
				                std : : vector < ValueType >  res ;                 std : : vector < ValueType >  res ;  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -162,7 +167,7 @@ namespace storm { 
		
	
		
			
				                }                 }  
		
	
		
			
				                assert ( currReachableState  = =  reachableStates . getNumberOfSetBits ( ) ) ;                 assert ( currReachableState  = =  reachableStates . getNumberOfSetBits ( ) ) ;  
		
	
		
			
				                return  res ;                 return  res ;  
		
	
		
			
				            }  
		
	
		
			
				            } */  
		
	
		
			
				
 
		
	
		
			
				            template < typename  SparseModelType >             template < typename  SparseModelType >  
		
	
		
			
				            uint64_t  SparseModelNondeterministicMemoryProduct < SparseModelType > : : getProductState ( uint64_t  modelState ,  uint64_t  memoryState )  const  {             uint64_t  SparseModelNondeterministicMemoryProduct < SparseModelType > : : getProductState ( uint64_t  modelState ,  uint64_t  memoryState )  const  {