35 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECTSMATMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_TSVECTSMATMULTEXPR_H_
94 class TSVecTSMatMultExpr :
public SparseVector< TSVecTSMatMultExpr<VT,MT>, true >
95 ,
private TVecMatMultExpr
122 template<
typename T1 >
123 struct UseSMPAssign {
124 enum { value = ( evaluateVector || evaluateMatrix ) };
153 enum { smpAssignable = !evaluateVector && VT::smpAssignable &&
154 !evaluateMatrix && MT::smpAssignable };
192 VectorIterator velem( x.begin() );
193 const VectorIterator vend( x.end() );
194 if( velem == vend ) {
199 MatrixIterator melem( A.begin(index) );
200 const MatrixIterator mend( A.end(index) );
201 if( melem == mend ) {
207 if( velem->index() < melem->index() ) {
209 if( velem == vend )
break;
211 else if( melem->index() < velem->index() ) {
213 if( melem == mend )
break;
216 res = velem->value() * melem->value();
223 if( melem != mend && velem != vend )
226 if( velem->index() < melem->index() ) {
228 if( velem == vend )
break;
230 else if( melem->index() < velem->index() ) {
232 if( melem == mend )
break;
235 res += velem->value() * melem->value();
237 if( velem == vend )
break;
239 if( melem == mend )
break;
254 return mat_.columns();
264 return mat_.columns();
294 template<
typename T >
296 return (
vec_.isAliased( alias ) ||
mat_.isAliased( alias ) );
306 template<
typename T >
308 return (
vec_.isAliased( alias ) ||
mat_.isAliased( alias ) );
341 template<
typename VT1 >
352 LT x(
serial( rhs.vec_ ) );
353 if( x.nonZeros() == 0UL )
return;
356 RT A(
serial( rhs.mat_ ) );
365 TSVecTSMatMultExpr::selectAssignKernel( ~lhs, x, A );
384 template<
typename VT1
387 static inline void selectAssignKernel( VT1& y,
const VT2& x,
const MT1& A )
392 const VectorIterator vend( x.end() );
394 for(
size_t j=0UL; j<A.columns(); ++j )
396 const MatrixIterator mend ( A.end(j) );
397 MatrixIterator melem( A.begin(j) );
399 if( melem == mend )
continue;
401 VectorIterator velem( x.begin() );
404 if( velem->index() < melem->index() ) {
406 if( velem == vend )
break;
408 else if( melem->index() < velem->index() ) {
410 if( melem == mend )
break;
413 y[j] = velem->value() * melem->value();
420 if( velem != vend && melem != mend )
423 if( velem->index() < melem->index() ) {
425 if( velem == vend )
break;
427 else if( melem->index() < velem->index() ) {
429 if( melem == mend )
break;
432 y[j] += velem->value() * melem->value();
434 if( velem == vend )
break;
436 if( melem == mend )
break;
458 template<
typename VT1 >
469 LT x(
serial( rhs.vec_ ) );
470 if( x.nonZeros() == 0UL )
return;
473 RT A(
serial( rhs.mat_ ) );
483 const VectorIterator vend( x.end() );
485 for(
size_t j=0UL; j<A.columns(); ++j )
487 const MatrixIterator mend ( A.end(j) );
488 MatrixIterator melem( A.begin(j) );
490 if( melem == mend )
continue;
492 VectorIterator velem( x.begin() );
497 if( velem->index() < melem->index() ) {
499 if( velem == vend )
break;
501 else if( melem->index() < velem->index() ) {
503 if( melem == mend )
break;
506 accu = velem->value() * melem->value();
513 if( velem != vend && melem != mend )
516 if( velem->index() < melem->index() ) {
518 if( velem == vend )
break;
520 else if( melem->index() < velem->index() ) {
522 if( melem == mend )
break;
525 accu += velem->value() * melem->value();
527 if( velem == vend )
break;
529 if( melem == mend )
break;
535 (~lhs).insert( j, accu );
554 template<
typename VT1 >
562 LT x(
serial( rhs.vec_ ) );
563 if( x.nonZeros() == 0UL )
return;
566 RT A(
serial( rhs.mat_ ) );
575 TSVecTSMatMultExpr::selectAddAssignKernel( ~lhs, x, A );
594 template<
typename VT1
597 static inline void selectAddAssignKernel( VT1& y,
const VT2& x,
const MT1& A )
602 const VectorIterator vend( x.end() );
604 for(
size_t j=0UL; j<A.columns(); ++j )
606 const MatrixIterator mend ( A.end(j) );
607 MatrixIterator melem( A.begin(j) );
609 if( melem == mend )
continue;
611 VectorIterator velem( x.begin() );
614 if( velem->index() < melem->index() ) {
616 if( velem == vend )
break;
618 else if( melem->index() < velem->index() ) {
620 if( melem == mend )
break;
623 y[j] += velem->value() * melem->value();
625 if( velem == vend )
break;
627 if( melem == mend )
break;
652 template<
typename VT1 >
660 LT x(
serial( rhs.vec_ ) );
661 if( x.nonZeros() == 0UL )
return;
664 RT A(
serial( rhs.mat_ ) );
673 TSVecTSMatMultExpr::selectSubAssignKernel( ~lhs, x, A );
692 template<
typename VT1
695 static inline void selectSubAssignKernel( VT1& y,
const VT2& x,
const MT1& A )
700 const VectorIterator vend( x.end() );
702 for(
size_t j=0UL; j<A.columns(); ++j )
704 const MatrixIterator mend ( A.end(j) );
705 MatrixIterator melem( A.begin(j) );
707 if( melem == mend )
continue;
709 VectorIterator velem( x.begin() );
712 if( velem->index() < melem->index() ) {
714 if( velem == vend )
break;
716 else if( melem->index() < velem->index() ) {
718 if( melem == mend )
break;
721 y[j] -= velem->value() * melem->value();
723 if( velem == vend )
break;
725 if( melem == mend )
break;
750 template<
typename VT1 >
761 const ResultType tmp(
serial( rhs ) );
786 template<
typename VT1 >
787 friend inline typename EnableIf< UseSMPAssign<VT1> >::Type
799 if( x.nonZeros() == 0UL )
return;
835 template<
typename VT1 >
836 friend inline typename EnableIf< UseSMPAssign<VT1> >::Type
845 if( x.nonZeros() == 0UL )
return;
881 template<
typename VT1 >
882 friend inline typename EnableIf< UseSMPAssign<VT1> >::Type
891 if( x.nonZeros() == 0UL )
return;
927 template<
typename VT1 >
928 friend inline typename EnableIf< UseSMPAssign<VT1> >::Type
939 const ResultType tmp( rhs );
1002 template<
typename T1
1004 inline const typename DisableIf< Or< IsSymmetric<T2>, IsMatMatMultExpr<T2> >
1005 , TSVecTSMatMultExpr<T1,T2> >::Type
1010 if( (~vec).
size() != (~mat).
rows() )
1011 throw std::invalid_argument(
"Vector and matrix sizes do not match" );
1041 template<
typename T1
1043 inline const typename EnableIf< IsSymmetric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
1044 operator*(
const SparseVector<T1,true>& vec,
const SparseMatrix<T2,true>& mat )
1050 if( (~vec).
size() != (~mat).
rows() )
1051 throw std::invalid_argument(
"Vector and matrix sizes do not match" );
1053 return (~vec) *
trans( ~mat );
1069 template<
typename MT,
typename VT >
1071 :
public Columns<MT>
1087 template<
typename VT,
typename MT,
bool AF >
1092 typedef typename MultExprTrait< typename SubvectorExprTrait<const VT,AF>::Type
1093 ,
typename SubmatrixExprTrait<const MT,AF>::Type >::Type Type;
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: TSVecTSMatMultExpr.h:295
Compile time check whether the given type is a computational expression template.This type trait clas...
Definition: IsComputation.h:89
BLAZE_ALWAYS_INLINE void multAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the multiplication assignment of a matrix to a matrix.
Definition: Matrix.h:879
const DMatDMatMultExpr< T1, T2 > operator*(const DenseMatrix< T1, false > &lhs, const DenseMatrix< T2, false > &rhs)
Multiplication operator for the multiplication of two row-major dense matrices ( ).
Definition: DMatDMatMultExpr.h:8247
Header file for basic type definitions.
MT::CompositeType MCT
Composite type of the right-hand side sparse matrix expression.
Definition: TSVecTSMatMultExpr.h:103
Header file for the SparseVector base class.
bool canSMPAssign() const
Returns whether the expression can be used in SMP assignments.
Definition: TSVecTSMatMultExpr.h:317
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: TSVecTSMatMultExpr.h:133
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:209
const ElementType ReturnType
Return type for expression template evaluations.
Definition: TSVecTSMatMultExpr.h:135
void reset(const DiagonalProxy< MT > &proxy)
Resetting the represented element to the default initial values.
Definition: DiagonalProxy.h:821
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:2507
ResultType::ElementType ElementType
Resulting element type.
Definition: TSVecTSMatMultExpr.h:134
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:261
BLAZE_ALWAYS_INLINE size_t rows(const Matrix< MT, SO > &matrix)
Returns the current number of rows of the matrix.
Definition: Matrix.h:316
const DMatSerialExpr< MT, SO > serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:699
Header file for the Computation base class.
size_t nonZeros() const
Returns an estimation for the number of non-zero elements in the sparse vector.
Definition: TSVecTSMatMultExpr.h:263
Header file for the RequiresEvaluation type trait.
Base class for sparse matrices.The SparseMatrix class is a base class for all sparse matrix classes...
Definition: Forward.h:107
bool isDefault(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is in default state.
Definition: DiagonalProxy.h:861
Constraint on the data type.
Constraint on the data type.
Compile time check to query the requirement to evaluate an expression.Via this type trait it is possi...
Definition: RequiresEvaluation.h:90
MT::ResultType MRT
Result type of the right-hand side sparse matrix expression.
Definition: TSVecTSMatMultExpr.h:101
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:263
TSVecTSMatMultExpr(const VT &vec, const MT &mat)
Constructor for the TSVecTSMatMultExpr class.
Definition: TSVecTSMatMultExpr.h:163
RightOperand mat_
Right-hand side sparse matrix of the multiplication expression.
Definition: TSVecTSMatMultExpr.h:325
Compile time type selection.The SelectType class template selects one of the two given types T1 and T...
Definition: SelectType.h:59
Header file for the DisableIf class template.
Header file for the multiplication trait.
Header file for the IsSymmetric type trait.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
#define BLAZE_CONSTRAINT_MUST_BE_COLUMN_MAJOR_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is not a column-major dense or sparse matri...
Definition: StorageOrder.h:161
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2511
Expression object for sparse vector-sparse matrix multiplications.The TSVecTSMatMultExpr class repres...
Definition: Forward.h:150
Header file for the Or class template.
Header file for the IsMatMatMultExpr type trait class.
BLAZE_ALWAYS_INLINE void assign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the assignment of a matrix to a matrix.
Definition: Matrix.h:635
Header file for the Columns type trait.
LeftOperand vec_
Left-hand side sparse vector of the multiplication expression.
Definition: TSVecTSMatMultExpr.h:324
Base class for N-dimensional dense vectors.The DenseVector class is a base class for all arbitrarily ...
Definition: DenseVector.h:70
MultTrait< VRT, MRT >::Type ResultType
Result type for expression template evaluations.
Definition: TSVecTSMatMultExpr.h:132
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a sparse, N-dimensional vector type...
Definition: SparseVector.h:79
SelectType< evaluateMatrix, const MRT, MCT >::Type RT
Type for the assignment of the right-hand side sparse matrix operand.
Definition: TSVecTSMatMultExpr.h:148
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_NOT_BE_MATMATMULTEXPR_TYPE(T)
Constraint on the data type.In case the given data type T is a matrix/matrix multiplication expressio...
Definition: MatMatMultExpr.h:126
#define BLAZE_CONSTRAINT_MUST_BE_REFERENCE_TYPE(T)
Constraint on the data type.In case the given data type T is not a reference type, a compilation error is created.
Definition: Reference.h:78
const ResultType CompositeType
Data type for composite expression templates.
Definition: TSVecTSMatMultExpr.h:136
Constraints on the storage order of matrix types.
Header file for the SelectType class template.
Header file for all forward declarations for expression class templates.
Constraint on the data type.
TSVecTSMatMultExpr< VT, MT > This
Type of this TSVecTSMatMultExpr instance.
Definition: TSVecTSMatMultExpr.h:131
Header file for the EnableIf class template.
Header file for the serial shim.
EnableIf< IsDenseMatrix< MT1 > >::Type smpSubAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP subtraction assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:160
#define BLAZE_CONSTRAINT_MUST_NOT_BE_SYMMETRIC_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a symmetric matrix type, a compilation error is created.
Definition: Symmetric.h:116
Removal of reference modifiers.The RemoveCV type trait removes any reference modifiers from the given...
Definition: RemoveReference.h:69
Header file for run time assertion macros.
EnableIf< IsDenseMatrix< MT1 > >::Type smpAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:98
Base template for the MultTrait class.
Definition: MultTrait.h:150
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: TSVecTSMatMultExpr.h:307
BLAZE_ALWAYS_INLINE void addAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the addition assignment of a matrix to a matrix.
Definition: Matrix.h:742
Header file for the reset shim.
Constraint on the data type.
SelectType< IsExpression< MT >::value, const MT, const MT & >::Type RightOperand
Composite type of the right-hand side sparse matrix expression.
Definition: TSVecTSMatMultExpr.h:142
Header file for the isDefault shim.
Header file for the TVecMatMultExpr base class.
Header file for the RemoveReference type trait.
SelectType< evaluateVector, const VRT, VCT >::Type LT
Type for the assignment of the left-hand side sparse vector operand.
Definition: TSVecTSMatMultExpr.h:145
#define BLAZE_CONSTRAINT_MUST_FORM_VALID_TVECMATMULTEXPR(T1, T2)
Constraint on the data type.In case the given data types T1 and T2 do not form a valid vector/matrix ...
Definition: TVecMatMultExpr.h:166
const size_t SMP_TSVECSMATMULT_THRESHOLD
SMP sparse vector/row-major sparse matrix multiplication threshold.This threshold specifies when a sp...
Definition: Thresholds.h:644
LeftOperand leftOperand() const
Returns the left-hand side sparse vector operand.
Definition: TSVecTSMatMultExpr.h:273
VT::CompositeType VCT
Composite type of the left-hand side sparse vector expression.
Definition: TSVecTSMatMultExpr.h:102
const DMatTransExpr< MT,!SO > trans(const DenseMatrix< MT, SO > &dm)
Calculation of the transpose of the given dense matrix.
Definition: DMatTransExpr.h:937
Header file for the IsComputation type trait class.
EnableIf< IsDenseMatrix< MT1 > >::Type smpAddAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP addition assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:129
Base class for sparse vectors.The SparseVector class is a base class for all arbitrarily sized (N-dim...
Definition: Forward.h:108
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:157
This ResultType
Result type for expression template evaluations.
Definition: CompressedMatrix.h:2502
#define BLAZE_CONSTRAINT_MUST_BE_ROW_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a row dense or sparse vector type (i...
Definition: TransposeFlag.h:81
SelectType< IsExpression< VT >::value, const VT, const VT & >::Type LeftOperand
Composite type of the left-hand side sparse vector expression.
Definition: TSVecTSMatMultExpr.h:139
Constraint on the data type.
EnableIf< IsDenseVector< VT1 > >::Type smpMultAssign(Vector< VT1, TF1 > &lhs, const Vector< VT2, TF2 > &rhs)
Default implementation of the SMP multiplication assignment of a vector to a dense vector...
Definition: DenseVector.h:189
Header file for the Size type trait.
Header file for the thresholds for matrix/vector and matrix/matrix multiplications.
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression, the program execution is terminated. The BLAZE_INTERNAL_ASSERT macro can be disabled by setting the BLAZE_USER_ASSERTION flag to zero or by defining NDEBUG during the compilation.
Definition: Assert.h:101
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is not a sparse, N-dimensional matrix type...
Definition: SparseMatrix.h:79
ReturnType operator[](size_t index) const
Subscript operator for the direct access to the vector elements.
Definition: TSVecTSMatMultExpr.h:177
Header file for the IsExpression type trait class.
size_t size() const
Returns the current size/dimension of the vector.
Definition: TSVecTSMatMultExpr.h:253
Header file for the FunctionTrace class.
BLAZE_ALWAYS_INLINE void subAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the subtraction assignment of a matrix to matrix.
Definition: Matrix.h:849
RightOperand rightOperand() const
Returns the right-hand side transpose sparse matrix operand.
Definition: TSVecTSMatMultExpr.h:283
VT::ResultType VRT
Result type of the left-hand side sparse vector expression.
Definition: TSVecTSMatMultExpr.h:100