Blaze 3.9
DVecSVecMultExpr.h
Go to the documentation of this file.
1//=================================================================================================
33//=================================================================================================
34
35#ifndef _BLAZE_MATH_EXPRESSIONS_DVECSVECMULTEXPR_H_
36#define _BLAZE_MATH_EXPRESSIONS_DVECSVECMULTEXPR_H_
37
38
39//*************************************************************************************************
40// Includes
41//*************************************************************************************************
42
43#include <iterator>
44#include <utility>
45#include <blaze/math/Aliases.h>
67#include <blaze/util/Assert.h>
68#include <blaze/util/EnableIf.h>
71#include <blaze/util/mpl/If.h>
72#include <blaze/util/mpl/Max.h>
73#include <blaze/util/Types.h>
75
76
77namespace blaze {
78
79//=================================================================================================
80//
81// CLASS DVECSVECMULTEXPR
82//
83//=================================================================================================
84
85//*************************************************************************************************
92template< typename VT1 // Type of the left-hand side dense vector
93 , typename VT2 // Type of the right-hand side sparse vector
94 , bool TF > // Transpose flag
96 : public VecVecMultExpr< SparseVector< DVecSVecMultExpr<VT1,VT2,TF>, TF > >
97 , private Computation
98{
99 private:
100 //**Type definitions****************************************************************************
109 //**********************************************************************************************
110
111 //**Return type evaluation**********************************************************************
113
118 static constexpr bool returnExpr = !IsTemporary_v<RN1> && !IsTemporary_v<RN2>;
119
121 using ExprReturnType = decltype( std::declval<RN1>() * std::declval<RN2>() );
122 //**********************************************************************************************
123
124 //**Evaluation strategy*************************************************************************
126
132 static constexpr bool useAssign = ( RequiresEvaluation_v<VT1> || RequiresEvaluation_v<VT2> );
133
136 template< typename VT >
137 static constexpr bool UseAssign_v = useAssign;
139 //**********************************************************************************************
140
141 public:
142 //**Type definitions****************************************************************************
145
148
152
155
158
160 using LeftOperand = If_t< IsExpression_v<VT1>, const VT1, const VT1& >;
161
163 using RightOperand = If_t< IsExpression_v<VT2>, const VT2, const VT2& >;
164 //**********************************************************************************************
165
166 //**Compilation flags***************************************************************************
168 static constexpr bool smpAssignable = false;
169 //**********************************************************************************************
170
171 //**ConstIterator class definition**************************************************************
175 {
176 public:
177 //**Type definitions*************************************************************************
180
183
184 using IteratorCategory = std::forward_iterator_tag;
188 using DifferenceType = ptrdiff_t;
189
190 // STL iterator requirements
196 //*******************************************************************************************
197
198 //**Constructor******************************************************************************
205 : vec_( vec ) // Left-hand side dense vector expression
206 , it_ ( it ) // Iterator over the elements of the right-hand side sparse vector expression
207 {}
208 //*******************************************************************************************
209
210 //**Prefix increment operator****************************************************************
216 ++it_;
217 return *this;
218 }
219 //*******************************************************************************************
220
221 //**Element access operator******************************************************************
226 inline const Element operator*() const {
227 return Element( vec_[it_->index()] * it_->value(), it_->index() );
228 }
229 //*******************************************************************************************
230
231 //**Element access operator******************************************************************
236 inline const ConstIterator* operator->() const {
237 return this;
238 }
239 //*******************************************************************************************
240
241 //**Value function***************************************************************************
246 inline ReturnType value() const {
247 return vec_[it_->index()] * it_->value();
248 }
249 //*******************************************************************************************
250
251 //**Index function***************************************************************************
256 inline size_t index() const {
257 return it_->index();
258 }
259 //*******************************************************************************************
260
261 //**Equality operator************************************************************************
267 inline bool operator==( const ConstIterator& rhs ) const {
268 return it_ == rhs.it_;
269 }
270 //*******************************************************************************************
271
272 //**Inequality operator**********************************************************************
278 inline bool operator!=( const ConstIterator& rhs ) const {
279 return it_ != rhs.it_;
280 }
281 //*******************************************************************************************
282
283 //**Subtraction operator*********************************************************************
289 inline DifferenceType operator-( const ConstIterator& rhs ) const {
290 return it_ - rhs.it_;
291 }
292 //*******************************************************************************************
293
294 private:
295 //**Member variables*************************************************************************
298 //*******************************************************************************************
299 };
300 //**********************************************************************************************
301
302 //**Constructor*********************************************************************************
308 inline DVecSVecMultExpr( const VT1& lhs, const VT2& rhs ) noexcept
309 : lhs_( lhs ) // Left-hand side dense vector of the multiplication expression
310 , rhs_( rhs ) // Right-hand side sparse vector of the multiplication expression
311 {
312 BLAZE_INTERNAL_ASSERT( lhs.size() == rhs.size(), "Invalid vector sizes" );
313 }
314 //**********************************************************************************************
315
316 //**Subscript operator**************************************************************************
322 inline ReturnType operator[]( size_t index ) const {
323 BLAZE_INTERNAL_ASSERT( index < lhs_.size(), "Invalid vector access index" );
324 return lhs_[index] * rhs_[index];
325 }
326 //**********************************************************************************************
327
328 //**At function*********************************************************************************
335 inline ReturnType at( size_t index ) const {
336 if( index >= lhs_.size() ) {
337 BLAZE_THROW_OUT_OF_RANGE( "Invalid vector access index" );
338 }
339 return (*this)[index];
340 }
341 //**********************************************************************************************
342
343 //**Begin function******************************************************************************
348 inline ConstIterator begin() const {
349 return ConstIterator( lhs_, rhs_.begin() );
350 }
351 //**********************************************************************************************
352
353 //**End function********************************************************************************
358 inline ConstIterator end() const {
359 return ConstIterator( lhs_, rhs_.end() );
360 }
361 //**********************************************************************************************
362
363 //**Size function*******************************************************************************
368 inline size_t size() const noexcept {
369 return lhs_.size();
370 }
371 //**********************************************************************************************
372
373 //**NonZeros function***************************************************************************
378 inline size_t nonZeros() const {
379 return rhs_.nonZeros();
380 }
381 //**********************************************************************************************
382
383 //**Find function*******************************************************************************
389 inline ConstIterator find( size_t index ) const {
391 return ConstIterator( lhs_, rhs_.find( index ) );
392 }
393 //**********************************************************************************************
394
395 //**LowerBound function*************************************************************************
401 inline ConstIterator lowerBound( size_t index ) const {
403 return ConstIterator( lhs_, rhs_.lowerBound( index ) );
404 }
405 //**********************************************************************************************
406
407 //**UpperBound function*************************************************************************
413 inline ConstIterator upperBound( size_t index ) const {
415 return ConstIterator( lhs_, rhs_.upperBound( index ) );
416 }
417 //**********************************************************************************************
418
419 //**Left operand access*************************************************************************
424 inline LeftOperand leftOperand() const noexcept {
425 return lhs_;
426 }
427 //**********************************************************************************************
428
429 //**Right operand access************************************************************************
434 inline RightOperand rightOperand() const noexcept {
435 return rhs_;
436 }
437 //**********************************************************************************************
438
439 //**********************************************************************************************
445 template< typename T >
446 inline bool canAlias( const T* alias ) const noexcept {
447 return ( lhs_.canAlias( alias ) || rhs_.canAlias( alias ) );
448 }
449 //**********************************************************************************************
450
451 //**********************************************************************************************
457 template< typename T >
458 inline bool isAliased( const T* alias ) const noexcept {
459 return ( lhs_.isAliased( alias ) || rhs_.isAliased( alias ) );
460 }
461 //**********************************************************************************************
462
463 private:
464 //**Member variables****************************************************************************
467 //**********************************************************************************************
468
469 //**Assignment to dense vectors*****************************************************************
483 template< typename VT > // Type of the target dense vector
484 friend inline auto assign( DenseVector<VT,TF>& lhs, const DVecSVecMultExpr& rhs )
486 {
488
489 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
490
491 CT1 x( serial( rhs.lhs_ ) ); // Evaluation of the left-hand side dense vector operand
492 CT2 y( serial( rhs.rhs_ ) ); // Evaluation of the right-hand side sparse vector operand
493
494 BLAZE_INTERNAL_ASSERT( x.size() == rhs.lhs_.size(), "Invalid vector size" );
495 BLAZE_INTERNAL_ASSERT( y.size() == rhs.rhs_.size(), "Invalid vector size" );
496 BLAZE_INTERNAL_ASSERT( x.size() == (*lhs).size() , "Invalid vector size" );
497
498 for( auto element=y.begin(); element!=y.end(); ++element )
499 (*lhs)[element->index()] = x[element->index()] * element->value();
500 }
502 //**********************************************************************************************
503
504 //**Assignment to sparse vectors****************************************************************
518 template< typename VT > // Type of the target sparse vector
519 friend inline auto assign( SparseVector<VT,TF>& lhs, const DVecSVecMultExpr& rhs )
521 {
523
524 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
525
526 CT1 x( serial( rhs.lhs_ ) ); // Evaluation of the left-hand side dense vector operand
527 CT2 y( serial( rhs.rhs_ ) ); // Evaluation of the right-hand side sparse vector operand
528
529 BLAZE_INTERNAL_ASSERT( x.size() == rhs.lhs_.size(), "Invalid vector size" );
530 BLAZE_INTERNAL_ASSERT( y.size() == rhs.rhs_.size(), "Invalid vector size" );
531 BLAZE_INTERNAL_ASSERT( x.size() == (*lhs).size() , "Invalid vector size" );
532
533 // Final memory allocation (based on the evaluated operands)
534 (*lhs).reserve( y.nonZeros() );
535
536 // Performing the vector multiplication
537 for( auto element=y.begin(); element!=y.end(); ++element )
538 (*lhs).append( element->index(), x[element->index()] * element->value() );
539 }
541 //**********************************************************************************************
542
543 //**Addition assignment to dense vectors********************************************************
557 template< typename VT > // Type of the target dense vector
558 friend inline auto addAssign( DenseVector<VT,TF>& lhs, const DVecSVecMultExpr& rhs )
559 -> EnableIf_t< UseAssign_v<VT> >
560 {
562
563 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
564
565 CT1 x( serial( rhs.lhs_ ) ); // Evaluation of the left-hand side dense vector operand
566 CT2 y( serial( rhs.rhs_ ) ); // Evaluation of the right-hand side sparse vector operand
567
568 BLAZE_INTERNAL_ASSERT( x.size() == rhs.lhs_.size(), "Invalid vector size" );
569 BLAZE_INTERNAL_ASSERT( y.size() == rhs.rhs_.size(), "Invalid vector size" );
570 BLAZE_INTERNAL_ASSERT( x.size() == (*lhs).size() , "Invalid vector size" );
571
572 for( auto element=y.begin(); element!=y.end(); ++element )
573 (*lhs)[element->index()] += x[element->index()] * element->value();
574 }
576 //**********************************************************************************************
577
578 //**Addition assignment to sparse vectors*******************************************************
579 // No special implementation for the addition assignment to sparse vectors.
580 //**********************************************************************************************
581
582 //**Subtraction assignment to dense vectors*****************************************************
596 template< typename VT > // Type of the target dense vector
597 friend inline auto subAssign( DenseVector<VT,TF>& lhs, const DVecSVecMultExpr& rhs )
598 -> EnableIf_t< UseAssign_v<VT> >
599 {
601
602 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
603
604 CT1 x( serial( rhs.lhs_ ) ); // Evaluation of the left-hand side dense vector operand
605 CT2 y( serial( rhs.rhs_ ) ); // Evaluation of the right-hand side sparse vector operand
606
607 BLAZE_INTERNAL_ASSERT( x.size() == rhs.lhs_.size(), "Invalid vector size" );
608 BLAZE_INTERNAL_ASSERT( y.size() == rhs.rhs_.size(), "Invalid vector size" );
609 BLAZE_INTERNAL_ASSERT( x.size() == (*lhs).size() , "Invalid vector size" );
610
611 for( auto element=y.begin(); element!=y.end(); ++element )
612 (*lhs)[element->index()] -= x[element->index()] * element->value();
613 }
615 //**********************************************************************************************
616
617 //**Subtraction assignment to sparse vectors****************************************************
618 // No special implementation for the subtraction assignment to sparse vectors.
619 //**********************************************************************************************
620
621 //**Multiplication assignment to dense vectors**************************************************
635 template< typename VT > // Type of the target dense vector
636 friend inline auto multAssign( DenseVector<VT,TF>& lhs, const DVecSVecMultExpr& rhs )
637 -> EnableIf_t< UseAssign_v<VT> >
638 {
640
641 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
642
643 CT1 x( serial( rhs.lhs_ ) ); // Evaluation of the left-hand side dense vector operand
644 CT2 y( serial( rhs.rhs_ ) ); // Evaluation of the right-hand side sparse vector operand
645
646 BLAZE_INTERNAL_ASSERT( x.size() == rhs.lhs_.size(), "Invalid vector size" );
647 BLAZE_INTERNAL_ASSERT( y.size() == rhs.rhs_.size(), "Invalid vector size" );
648 BLAZE_INTERNAL_ASSERT( x.size() == (*lhs).size() , "Invalid vector size" );
649
650 const auto end( y.end() );
651 auto begin( y.begin() );
652 size_t i( 0UL );
653
654 for( ; begin!=end; ++begin ) {
655 const size_t index( begin->index() );
656 for( ; i<index; ++i )
657 reset( (*lhs)[i] );
658 (*lhs)[index] *= x[index] * begin->value();
659 ++i;
660 }
661
662 for( ; i<(*lhs).size(); ++i )
663 reset( (*lhs)[i] );
664 }
666 //**********************************************************************************************
667
668 //**Multiplication assignment to sparse vectors*************************************************
669 // No special implementation for the multiplication assignment to sparse vectors.
670 //**********************************************************************************************
671
672 //**Compile time checks*************************************************************************
681 //**********************************************************************************************
682};
683//*************************************************************************************************
684
685
686
687
688//=================================================================================================
689//
690// GLOBAL BINARY ARITHMETIC OPERATORS
691//
692//=================================================================================================
693
694//*************************************************************************************************
707template< typename VT1 // Type of the left-hand side dense vector
708 , typename VT2 // Type of the right-hand side sparse vector
709 , bool TF // Transpose flag
710 , DisableIf_t< IsZero_v<VT2> >* = nullptr >
711inline const DVecSVecMultExpr<VT1,VT2,TF>
712 dvecsvecmult( const DenseVector<VT1,TF>& lhs, const SparseVector<VT2,TF>& rhs )
713{
715
716 BLAZE_INTERNAL_ASSERT( (*lhs).size() == (*rhs).size(), "Invalid vector sizes" );
717
718 return DVecSVecMultExpr<VT1,VT2,TF>( *lhs, *rhs );
719}
721//*************************************************************************************************
722
723
724//*************************************************************************************************
737template< typename VT1 // Type of the left-hand side dense vector
738 , typename VT2 // Type of the right-hand side sparse vector
739 , bool TF // Transpose flag
740 , EnableIf_t< IsZero_v<VT2> >* = nullptr >
741inline decltype(auto)
742 dvecsvecmult( const DenseVector<VT1,TF>& lhs, const SparseVector<VT2,TF>& rhs )
743{
745
746 MAYBE_UNUSED( rhs );
747
748 BLAZE_INTERNAL_ASSERT( (*lhs).size() == (*rhs).size(), "Invalid vector sizes" );
749
750 using ReturnType = const MultTrait_t< ResultType_t<VT1>, ResultType_t<VT2> >;
751
754
755 return ReturnType( (*lhs).size() );
756}
758//*************************************************************************************************
759
760
761//*************************************************************************************************
788template< typename VT1 // Type of the left-hand side dense vector
789 , typename VT2 // Type of the right-hand side sparse vector
790 , bool TF > // Transpose flag
791inline decltype(auto)
792 operator*( const DenseVector<VT1,TF>& lhs, const SparseVector<VT2,TF>& rhs )
793{
795
796 if( (*lhs).size() != (*rhs).size() ) {
797 BLAZE_THROW_INVALID_ARGUMENT( "Vector sizes do not match" );
798 }
799
800 return dvecsvecmult( *lhs, *rhs );
801}
802//*************************************************************************************************
803
804
805
806
807//=================================================================================================
808//
809// SIZE SPECIALIZATIONS
810//
811//=================================================================================================
812
813//*************************************************************************************************
815template< typename VT1, typename VT2, bool TF >
816struct Size< DVecSVecMultExpr<VT1,VT2,TF>, 0UL >
817 : public Max_t< Size<VT1,0UL>, Size<VT2,0UL> >
818{};
820//*************************************************************************************************
821
822} // namespace blaze
823
824#endif
Header file for auxiliary alias declarations.
typename T::CompositeType CompositeType_t
Alias declaration for nested CompositeType type definitions.
Definition: Aliases.h:110
typename T::ReturnType ReturnType_t
Alias declaration for nested ReturnType type definitions.
Definition: Aliases.h:470
typename T::ResultType ResultType_t
Alias declaration for nested ResultType type definitions.
Definition: Aliases.h:450
typename T::ElementType ElementType_t
Alias declaration for nested ElementType type definitions.
Definition: Aliases.h:190
typename T::ConstIterator ConstIterator_t
Alias declaration for nested ConstIterator type definitions.
Definition: Aliases.h:130
typename T::TransposeType TransposeType_t
Alias declaration for nested TransposeType type definitions.
Definition: Aliases.h:550
Header file for run time assertion macros.
Header file for the EnableIf class template.
Header file for the function trace functionality.
Header file for the If class template.
Header file for the IsExpression type trait class.
Header file for the IsTemporary type trait class.
Deactivation of problematic macros.
Header file for the MAYBE_UNUSED function template.
Header file for the multiplication trait.
Header file for the RemoveReference type trait.
Header file for the ValueIndexPair class.
Constraint on the data type.
Iterator over the elements of the dense vector-sparse vector multiplication expression.
Definition: DVecSVecMultExpr.h:175
const ConstIterator * operator->() const
Direct access to the sparse vector element at the current iterator position.
Definition: DVecSVecMultExpr.h:236
size_t index() const
Access to the current index of the sparse element.
Definition: DVecSVecMultExpr.h:256
ConstIterator(LeftOperand vec, IteratorType it)
Constructor for the ConstIterator class.
Definition: DVecSVecMultExpr.h:204
ReturnType value() const
Access to the current value of the sparse element.
Definition: DVecSVecMultExpr.h:246
IteratorCategory iterator_category
The iterator category.
Definition: DVecSVecMultExpr.h:191
Element ValueType
Type of the underlying pointers.
Definition: DVecSVecMultExpr.h:185
DifferenceType operator-(const ConstIterator &rhs) const
Calculating the number of elements between two expression iterators.
Definition: DVecSVecMultExpr.h:289
ConstIterator & operator++()
Pre-increment operator.
Definition: DVecSVecMultExpr.h:215
ValueType & ReferenceType
Reference return type.
Definition: DVecSVecMultExpr.h:187
LeftOperand vec_
Left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:296
ValueIndexPair< ElementType > Element
Element type of the sparse vector expression.
Definition: DVecSVecMultExpr.h:179
const Element operator*() const
Direct access to the sparse vector element at the current iterator position.
Definition: DVecSVecMultExpr.h:226
DifferenceType difference_type
Difference between two iterators.
Definition: DVecSVecMultExpr.h:195
ValueType * PointerType
Pointer return type.
Definition: DVecSVecMultExpr.h:186
std::forward_iterator_tag IteratorCategory
The iterator category.
Definition: DVecSVecMultExpr.h:184
bool operator!=(const ConstIterator &rhs) const
Inequality comparison between two ConstIterator objects.
Definition: DVecSVecMultExpr.h:278
bool operator==(const ConstIterator &rhs) const
Equality comparison between two ConstIterator objects.
Definition: DVecSVecMultExpr.h:267
ConstIterator_t< RemoveReference_t< RightOperand > > IteratorType
Iterator type of the sparse vector expression.
Definition: DVecSVecMultExpr.h:182
IteratorType it_
Iterator over the elements of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:297
ptrdiff_t DifferenceType
Difference between two iterators.
Definition: DVecSVecMultExpr.h:188
Expression object for dense vector-sparse vector multiplications.
Definition: DVecSVecMultExpr.h:98
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: DVecSVecMultExpr.h:446
ConstIterator begin() const
Returns an iterator to the first non-zero element of the sparse vector.
Definition: DVecSVecMultExpr.h:348
ResultType_t< VT2 > RT2
Result type of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:102
ConstIterator find(size_t index) const
Searches for a specific vector element.
Definition: DVecSVecMultExpr.h:389
RightOperand rightOperand() const noexcept
Returns the right-hand side sparse vector operand.
Definition: DVecSVecMultExpr.h:434
CompositeType_t< VT2 > CT2
Composite type of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:106
If_t< IsExpression_v< VT1 >, const VT1, const VT1 & > LeftOperand
Composite type of the left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:160
MultTrait_t< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: DVecSVecMultExpr.h:149
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: DVecSVecMultExpr.h:458
ConstIterator upperBound(size_t index) const
Returns an iterator to the first index greater then the given index.
Definition: DVecSVecMultExpr.h:413
decltype(std::declval< RN1 >() *std::declval< RN2 >()) ExprReturnType
Expression return type for the subscript operator.
Definition: DVecSVecMultExpr.h:121
If_t< useAssign, const ResultType, const DVecSVecMultExpr & > CompositeType
Data type for composite expression templates.
Definition: DVecSVecMultExpr.h:157
CompositeType_t< VT1 > CT1
Composite type of the left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:105
ConstIterator lowerBound(size_t index) const
Returns an iterator to the first index not less then the given index.
Definition: DVecSVecMultExpr.h:401
ReturnType at(size_t index) const
Checked access to the vector elements.
Definition: DVecSVecMultExpr.h:335
TransposeType_t< VT2 > TT2
Transpose type of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:108
DVecSVecMultExpr(const VT1 &lhs, const VT2 &rhs) noexcept
Constructor for the DVecSVecMultExpr class.
Definition: DVecSVecMultExpr.h:308
static constexpr bool useAssign
Compilation switch for the evaluation strategy of the multiplication expression.
Definition: DVecSVecMultExpr.h:132
ConstIterator end() const
Returns an iterator just past the last non-zero element of the sparse vector.
Definition: DVecSVecMultExpr.h:358
LeftOperand lhs_
Left-hand side dense vector of the multiplication expression.
Definition: DVecSVecMultExpr.h:465
const If_t< returnExpr, ExprReturnType, ElementType > ReturnType
Return type for expression template evaluations.
Definition: DVecSVecMultExpr.h:154
size_t size() const noexcept
Returns the current size/dimension of the vector.
Definition: DVecSVecMultExpr.h:368
ElementType_t< ResultType > ElementType
Resulting element type.
Definition: DVecSVecMultExpr.h:151
size_t nonZeros() const
Returns the number of non-zero elements in the sparse vector.
Definition: DVecSVecMultExpr.h:378
ReturnType_t< VT1 > RN1
Return type of the left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:103
RightOperand rhs_
Right-hand side sparse vector of the multiplication expression.
Definition: DVecSVecMultExpr.h:466
static constexpr bool smpAssignable
Compilation switch for the expression template assignment strategy.
Definition: DVecSVecMultExpr.h:168
TransposeType_t< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: DVecSVecMultExpr.h:150
If_t< IsExpression_v< VT2 >, const VT2, const VT2 & > RightOperand
Composite type of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:163
TransposeType_t< VT1 > TT1
Transpose type of the left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:107
ReturnType operator[](size_t index) const
Subscript operator for the direct access to the vector elements.
Definition: DVecSVecMultExpr.h:322
ResultType_t< VT1 > RT1
Result type of the left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:101
LeftOperand leftOperand() const noexcept
Returns the left-hand side dense vector operand.
Definition: DVecSVecMultExpr.h:424
ReturnType_t< VT2 > RN2
Return type of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:104
static constexpr bool returnExpr
Compilation switch for the selection of the subscript operator return type.
Definition: DVecSVecMultExpr.h:118
Base class for N-dimensional dense vectors.
Definition: DenseVector.h:77
Base class for sparse vectors.
Definition: SparseVector.h:72
Index-value-pair for sparse vectors and matrices.
Definition: ValueIndexPair.h:75
Constraint on the data type.
Constraint on the data type.
Constraint on the data type.
Constraint on the data type.
Header file for the Computation base class.
Header file for the SparseVector base class.
Header file for the VecVecMultExpr base class.
decltype(auto) serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:812
#define BLAZE_CONSTRAINT_MUST_NOT_REQUIRE_EVALUATION(T)
Constraint on the data type.
Definition: RequiresEvaluation.h:81
#define BLAZE_CONSTRAINT_MUST_BE_VECTOR_WITH_TRANSPOSE_FLAG(T, TF)
Constraint on the data type.
Definition: TransposeFlag.h:63
#define BLAZE_CONSTRAINT_MUST_FORM_VALID_VECVECMULTEXPR(T1, T2)
Constraint on the data type.
Definition: VecVecMultExpr.h:104
#define BLAZE_CONSTRAINT_MUST_NOT_BE_ZERO_TYPE(T)
Constraint on the data type.
Definition: Zero.h:81
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_VECTOR_TYPE(T)
Constraint on the data type.
Definition: SparseVector.h:61
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_VECTOR_TYPE(T)
Constraint on the data type.
Definition: DenseVector.h:61
#define BLAZE_CONSTRAINT_MUST_BE_ZERO_TYPE(T)
Constraint on the data type.
Definition: Zero.h:61
typename MultTrait< T1, T2 >::Type MultTrait_t
Auxiliary alias declaration for the MultTrait class template.
Definition: MultTrait.h:165
constexpr void reset(Matrix< MT, SO > &matrix)
Resetting the given matrix.
Definition: Matrix.h:806
If_t< Less_t< T1, T2 >::value, T2, T1 > Max_t
Compile time value evaluation.
Definition: Max.h:73
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.
Definition: Assert.h:101
typename EnableIf< Condition, T >::Type EnableIf_t
Auxiliary type for the EnableIf class template.
Definition: EnableIf.h:138
constexpr void MAYBE_UNUSED(const Args &...)
Suppression of unused parameter warnings.
Definition: MaybeUnused.h:81
typename If< Condition >::template Type< T1, T2 > If_t
Auxiliary alias template for the If class template.
Definition: If.h:108
#define BLAZE_THROW_OUT_OF_RANGE(MESSAGE)
Macro for the emission of a std::out_of_range exception.
Definition: Exception.h:331
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.
Definition: Exception.h:235
#define BLAZE_FUNCTION_TRACE
Function trace macro.
Definition: FunctionTrace.h:94
Header file for the exception macros of the math module.
Constraint on the data type.
Header file for all forward declarations for expression class templates.
Header file for the Size type trait.
Header file for the reset shim.
Header file for the serial shim.
Base class for all compute expression templates.
Definition: Computation.h:68
Base class for all vector/vector multiplication expression templates.
Definition: VecVecMultExpr.h:68
Header file for the IsZero type trait.
Header file for the RequiresEvaluation type trait.
Header file for basic type definitions.
Header file for the Max_t alias template.