@ -1165,7 +1165,7 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  result ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ValueType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        void  SparseMatrix < ValueType > : : multiplyWithVector ( std : : vector < ValueType >  const &  vector ,  std : : vector < ValueType > &  result )  const  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# ifdef STORM_HAVE_INTELTBB 
  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -1178,59 +1178,60 @@ namespace storm { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            return  multiplyWithVectorSequential ( vector ,  result ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# endif 
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ValueType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        void  SparseMatrix < ValueType > : : multiplyWithVectorSequential ( std : : vector < ValueType >  const &  vector ,  std : : vector < ValueType > &  result )  const  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            const_iterator  it  =  this - > begin ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            const_iterator  ite ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            std : : vector < index_type > : : const_iterator  rowIterator  =  rowIndications . begin ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            typename  std : : vector < ValueType > : : iterator  resultIterator  =  result . begin ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            typename  std : : vector < ValueType > : : iterator  resultIteratorEnd  =  result . end ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					             
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // If the vector to multiply with and the target vector are actually the same, we need an auxiliary variable
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            // to store the intermediate result.
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( & vector  = =  & result )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                for  ( ;  resultIterator  ! =  resultIteratorEnd ;  + + rowIterator ,  + + resultIterator )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    ValueType  tmpValue  =  storm : : utility : : zero < ValueType > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                     
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    for  ( ite  =  this - > begin ( )  +  * ( rowIterator  +  1 ) ;  it  ! =  ite ;  + + it )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        tmpValue  + =  it - > getValue ( )  *  vector [ it - > getColumn ( ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    * resultIterator  =  tmpValue ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_WARN ( " Matrix-vector-multiplication invoked but the target vector uses the same memory as the input vector. This requires to allocate auxiliary memory. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : vector < ValueType >  tmpVector ( this - > getRowCount ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                multiplyWithVectorSequential ( vector ,  tmpVector ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                result  =  std : : move ( tmpVector ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                const_iterator  it  =  this - > begin ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                const_iterator  ite ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : vector < index_type > : : const_iterator  rowIterator  =  rowIndications . begin ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                typename  std : : vector < ValueType > : : iterator  resultIterator  =  result . begin ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                typename  std : : vector < ValueType > : : iterator  resultIteratorEnd  =  result . end ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                for  ( ;  resultIterator  ! =  resultIteratorEnd ;  + + rowIterator ,  + + resultIterator )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    * resultIterator  =  storm : : utility : : zero < ValueType > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                     
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    for  ( ite  =  this - > begin ( )  +  * ( rowIterator  +  1 ) ;  it  ! =  ite ;  + + it )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                        * resultIterator  + =  it - > getValue ( )  *  vector [ it - > getColumn ( ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					          
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# ifdef STORM_HAVE_INTELTBB 
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        template < typename  ValueType >  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        void  SparseMatrix < ValueType > : : multiplyWithVectorParallel ( std : : vector < ValueType >  const &  vector ,  std : : vector < ValueType > &  result )  const  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            tbb : : parallel_for ( tbb : : blocked_range < index_type > ( 0 ,  result . size ( ) ,  10 ) ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                              [ & ]  ( tbb : : blocked_range < index_type >  const &  range )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  index_type  startRow  =  range . begin ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  index_type  endRow  =  range . end ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  const_iterator  it  =  this - > begin ( startRow ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  const_iterator  ite ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  std : : vector < index_type > : : const_iterator  rowIterator  =  this - > rowIndications . begin ( )  +  startRow ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  std : : vector < index_type > : : const_iterator  rowIteratorEnd  =  this - > rowIndications . begin ( )  +  endRow ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  typename  std : : vector < ValueType > : : iterator  resultIterator  =  result . begin ( )  +  startRow ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  typename  std : : vector < ValueType > : : iterator  resultIteratorEnd  =  result . begin ( )  +  endRow ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  for  ( ;  resultIterator  ! =  resultIteratorEnd ;  + + rowIterator ,  + + resultIterator )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      * resultIterator  =  storm : : utility : : zero < ValueType > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                       
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      for  ( ite  =  this - > begin ( )  +  * ( rowIterator  +  1 ) ;  it  ! =  ite ;  + + it )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                          * resultIterator  + =  it - > getValue ( )  *  vector [ it - > getColumn ( ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            if  ( & vector  = =  & result )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                STORM_LOG_WARN ( " Matrix-vector-multiplication invoked but the target vector uses the same memory as the input vector. This requires to allocate auxiliary memory. " ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                std : : vector < ValueType >  tmpVector ( this - > getRowCount ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                multiplyWithVectorParallel ( vector ,  tmpVector ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                result  =  std : : move ( tmpVector ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  else  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                tbb : : parallel_for ( tbb : : blocked_range < index_type > ( 0 ,  result . size ( ) ,  10 ) ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  [ & ]  ( tbb : : blocked_range < index_type >  const &  range )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      index_type  startRow  =  range . begin ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      index_type  endRow  =  range . end ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      const_iterator  it  =  this - > begin ( startRow ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      const_iterator  ite ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      std : : vector < index_type > : : const_iterator  rowIterator  =  this - > rowIndications . begin ( )  +  startRow ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      std : : vector < index_type > : : const_iterator  rowIteratorEnd  =  this - > rowIndications . begin ( )  +  endRow ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      typename  std : : vector < ValueType > : : iterator  resultIterator  =  result . begin ( )  +  startRow ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      typename  std : : vector < ValueType > : : iterator  resultIteratorEnd  =  result . begin ( )  +  endRow ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      for  ( ;  resultIterator  ! =  resultIteratorEnd ;  + + rowIterator ,  + + resultIterator )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                          * resultIterator  =  storm : : utility : : zero < ValueType > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                          for  ( ite  =  this - > begin ( )  +  * ( rowIterator  +  1 ) ;  it  ! =  ite ;  + + it )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                              * resultIterator  + =  it - > getValue ( )  *  vector [ it - > getColumn ( ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                          }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                      }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                              } ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					                                  } ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					            }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					# endif