35 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATTSMATMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_DMATTSMATMULTEXPR_H_
104 template<
typename MT1
135 template<
typename T1,
typename T2,
typename T3 >
136 struct UseSMPAssignKernel {
137 enum { value = evaluateLeft || evaluateRight };
167 enum { vectorizable = 0 };
170 enum { smpAssignable = !evaluateLeft && !evaluateRight };
203 if(
lhs_.columns() == 0UL )
211 const ConstIterator end( B.end(j) );
212 ConstIterator element( B.begin(j) );
219 tmp =
lhs_(i,element->index()) * element->value();
221 for( ; element!=end; ++element )
222 tmp +=
lhs_(i,element->index()) * element->value();
228 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
253 return rhs_.columns();
283 template<
typename T >
285 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
295 template<
typename T >
297 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
307 return lhs_.isAligned();
340 template<
typename MT
356 DMatTSMatMultExpr::selectAssignKernel( ~lhs, A, B );
375 template<
typename MT3
379 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
383 for(
size_t i=0UL; i<C.rows(); ++i ) {
384 for(
size_t j=0UL; j<C.columns(); ++j )
386 ConstIterator element( B.begin(j) );
387 const ConstIterator end( B.end(j) );
389 if( element == end ) {
394 C(i,j) = A(i,element->index()) * element->value();
396 for( ; element!=end; ++element )
397 C(i,j) += A(i,element->index()) * element->value();
418 template<
typename MT3
421 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
422 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
442 template<
typename MT
448 typedef typename SelectType< SO, OppositeType, ResultType >::Type TmpType;
460 const TmpType tmp( rhs );
479 template<
typename MT
495 DMatTSMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
514 template<
typename MT3
517 static inline typename DisableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
518 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
522 for(
size_t i=0UL; i<C.rows(); ++i ) {
523 for(
size_t j=0UL; j<C.columns(); ++j )
525 ConstIterator element( B.begin(j) );
526 const ConstIterator end( B.end(j) );
528 for( ; element!=end; ++element )
529 C(i,j) += A(i,element->index()) * element->value();
550 template<
typename MT3
553 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
554 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
578 template<
typename MT
594 DMatTSMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
613 template<
typename MT3
616 static inline typename DisableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
617 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
621 for(
size_t i=0UL; i<C.rows(); ++i ) {
622 for(
size_t j=0UL; j<C.columns(); ++j )
624 ConstIterator element( B.begin(j) );
625 const ConstIterator end( B.end(j) );
627 for( ; element!=end; ++element )
628 C(i,j) -= A(i,element->index()) * element->value();
649 template<
typename MT3
652 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
653 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
722 template<
typename T1
724 inline const DMatTSMatMultExpr<T1,T2>
730 throw std::invalid_argument(
"Matrix sizes do not match" );
747 template<
typename MT1,
typename MT2,
typename VT >
748 struct DMatDVecMultExprTrait< DMatTSMatMultExpr<MT1,MT2>, VT >
752 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
753 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
754 IsDenseVector<VT>::value && IsColumnVector<VT>::value
755 ,
typename DMatDVecMultExprTrait< MT1, typename TSMatDVecMultExprTrait<MT2,VT>::Type >::Type
756 , INVALID_TYPE >::Type Type;
765 template<
typename MT1,
typename MT2,
typename VT >
766 struct DMatSVecMultExprTrait< DMatTSMatMultExpr<MT1,MT2>, VT >
770 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
771 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
772 IsSparseVector<VT>::value && IsColumnVector<VT>::value
773 ,
typename DMatSVecMultExprTrait< MT1, typename TSMatSVecMultExprTrait<MT2,VT>::Type >::Type
774 , INVALID_TYPE >::Type Type;
783 template<
typename VT,
typename MT1,
typename MT2 >
784 struct TDVecDMatMultExprTrait< VT, DMatTSMatMultExpr<MT1,MT2> >
788 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
789 IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
790 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
791 ,
typename TDVecTSMatMultExprTrait< typename TDVecDMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
792 , INVALID_TYPE >::Type Type;
801 template<
typename VT,
typename MT1,
typename MT2 >
802 struct TSVecDMatMultExprTrait< VT, DMatTSMatMultExpr<MT1,MT2> >
806 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
807 IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
808 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
809 ,
typename TDVecTSMatMultExprTrait< typename TSVecDMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
810 , INVALID_TYPE >::Type Type;
819 template<
typename MT1,
typename MT2,
bool AF >
820 struct SubmatrixExprTrait< DMatTSMatMultExpr<MT1,MT2>, AF >
824 typedef typename MultExprTrait< typename SubmatrixExprTrait<const MT1,AF>::Type
825 ,
typename SubmatrixExprTrait<const MT2,AF>::Type >::Type Type;
834 template<
typename MT1,
typename MT2 >
835 struct RowExprTrait< DMatTSMatMultExpr<MT1,MT2> >
839 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
848 template<
typename MT1,
typename MT2 >
849 struct ColumnExprTrait< DMatTSMatMultExpr<MT1,MT2> >
853 typedef typename MultExprTrait< MT1, typename ColumnExprTrait<const MT2>::Type >::Type Type;
ResultType::ElementType ElementType
Resulting element type.
Definition: DMatTSMatMultExpr.h:148
Compile time check whether the given type is a computational expression template.This type trait clas...
Definition: IsComputation.h:89
void reset(DynamicMatrix< Type, SO > &m)
Resetting the given dense matrix.
Definition: DynamicMatrix.h:4579
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: DMatTSMatMultExpr.h:194
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:4075
SelectType< IsExpression< MT1 >::value, const MT1, const MT1 & >::Type LeftOperand
Composite type of the left-hand side dense matrix expression.
Definition: DMatTSMatMultExpr.h:153
MT2::CompositeType CT2
Composite type of the right-hand side sparse matrix expression.
Definition: DMatTSMatMultExpr.h:117
void smpSubAssign(DenseMatrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP subtraction assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:151
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: DMatTSMatMultExpr.h:284
Header file for the IsSparseMatrix type trait.
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:197
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is not a dense, N-dimensional matrix type...
Definition: DenseMatrix.h:79
Header file for the ColumnExprTrait class template.
Header file for the IsColumnMajorMatrix type trait.
Header file for the sparse matrix SMP implementation.
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: DMatTSMatMultExpr.h:147
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:2384
Header file for the IsRowVector type trait.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:249
Header file for the Computation base class.
Header file for the MatMatMultExpr base class.
Header file for the RequiresEvaluation type trait.
LeftOperand leftOperand() const
Returns the left-hand side dense matrix operand.
Definition: DMatTSMatMultExpr.h:262
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:70
Base class for sparse matrices.The SparseMatrix class is a base class for all sparse matrix classes...
Definition: Forward.h:104
Constraint on the data type.
const ResultType CompositeType
Data type for composite expression templates.
Definition: DMatTSMatMultExpr.h:150
Constraint on the data type.
Constraint on the data type.
Header file for the MultExprTrait class template.
void smpAddAssign(DenseMatrix< 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:121
Compile time check to query the requirement to evaluate an expression.Via this type trait it is possi...
Definition: RequiresEvaluation.h:90
bool isAligned() const
Returns whether the operands of the expression are properly aligned in memory.
Definition: DMatTSMatMultExpr.h:306
DMatTSMatMultExpr(const MT1 &lhs, const MT2 &rhs)
Constructor for the DMatTSMatMultExpr class.
Definition: DMatTSMatMultExpr.h:179
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.
size_t rows() const
Returns the current number of rows of the matrix.
Definition: DMatTSMatMultExpr.h:242
#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
MT1::CompositeType CT1
Composite type of the left-hand side dense matrix expression.
Definition: DMatTSMatMultExpr.h:116
const size_t SMP_DMATTSMATMULT_THRESHOLD
SMP row-major dense matrix/column-major sparse matrix multiplication threshold.This threshold represe...
Definition: Thresholds.h:498
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2388
Header file for the TDVecTSMatMultExprTrait class template.
Header file for the dense matrix SMP implementation.
Header file for the DenseMatrix base class.
Header file for the TSMatDVecMultExprTrait class template.
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:179
RT2::ElementType ET2
Element type of the right-hand side sparse matrix expression.
Definition: DMatTSMatMultExpr.h:115
SelectType< evaluateLeft, const RT1, CT1 >::Type LT
Type for the assignment of the left-hand side dense matrix operand.
Definition: DMatTSMatMultExpr.h:159
Header file for the DMatDVecMultExprTrait class template.
MT1::ResultType RT1
Result type of the left-hand side dense matrix expression.
Definition: DMatTSMatMultExpr.h:112
ResultType::OppositeType OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: DMatTSMatMultExpr.h:146
#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
Constraints on the storage order of matrix types.
RT1::ElementType ET1
Element type of the left-hand side dense matrix expression.
Definition: DMatTSMatMultExpr.h:114
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2382
RightOperand rhs_
Right-hand side sparse matrix of the multiplication expression.
Definition: DMatTSMatMultExpr.h:324
Header file for the SelectType class template.
Header file for the RowExprTrait class template.
Header file for all forward declarations for expression class templates.
Header file for the IsDenseMatrix type trait.
Header file for the EnableIf class template.
void smpAssign(DenseMatrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:91
Base class for all matrix/matrix multiplication expression templates.The MatMatMultExpr class serves ...
Definition: MatMatMultExpr.h:65
Header file for the IsSparseVector type trait.
Header file for the SubmatrixExprTrait class template.
#define BLAZE_CONSTRAINT_MUST_BE_ROW_MAJOR_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is not a row-major dense or sparse matrix t...
Definition: StorageOrder.h:81
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.
Utility type for generic codes.
Base template for the MultTrait class.
Definition: MultTrait.h:141
const ElementType ReturnType
Return type for expression template evaluations.
Definition: DMatTSMatMultExpr.h:149
MultTrait< RT1, RT2 >::Type ResultType
Result type for expression template evaluations.
Definition: DMatTSMatMultExpr.h:145
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:209
RightOperand rightOperand() const
Returns the right-hand side transpose sparse matrix operand.
Definition: DMatTSMatMultExpr.h:272
Header file for the reset shim.
SelectType< evaluateRight, const RT2, CT2 >::Type RT
Type for the assignment of the right-hand side sparse matrix operand.
Definition: DMatTSMatMultExpr.h:162
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:239
Expression object for dense matrix-transpose sparse matrix multiplications.The DMatTSMatMultExpr clas...
Definition: DMatTSMatMultExpr.h:106
Header file for the RemoveReference type trait.
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: DMatTSMatMultExpr.h:296
Substitution Failure Is Not An Error (SFINAE) class.The DisableIf class template is an auxiliary tool...
Definition: DisableIf.h:184
#define BLAZE_CONSTRAINT_MATRICES_MUST_HAVE_SAME_STORAGE_ORDER(T1, T2)
Constraint on the data type.In case either of the two given data types T1 or T2 is not a matrix type ...
Definition: StorageOrder.h:283
Header file for the IsDenseVector type trait.
bool canSMPAssign() const
Returns whether the expression can be used in SMP assignments.
Definition: DMatTSMatMultExpr.h:316
LeftOperand lhs_
Left-hand side dense matrix of the multiplication expression.
Definition: DMatTSMatMultExpr.h:323
Header file for the IsRowMajorMatrix type trait.
Header file for the IsComputation type trait class.
Base class for all compute expression templates.The Computation class serves as a tag for all computa...
Definition: Computation.h:59
Header file for the TDVecDMatMultExprTrait class template.
#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:2379
size_t columns(const Matrix< MT, SO > &m)
Returns the current number of columns of the matrix.
Definition: Matrix.h:154
Header file for basic type definitions.
Header file for the TSVecDMatMultExprTrait class template.
size_t columns() const
Returns the current number of columns of the matrix.
Definition: DMatTSMatMultExpr.h:252
MT2::ResultType RT2
Result type of the right-hand side sparse matrix expression.
Definition: DMatTSMatMultExpr.h:113
Header file for the DMatSVecMultExprTrait class template.
Header file for the IsColumnVector type trait.
Header file for the thresholds for matrix/vector and matrix/matrix multiplications.
size_t rows(const Matrix< MT, SO > &m)
Returns the current number of rows of the matrix.
Definition: Matrix.h:138
#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
DMatTSMatMultExpr< MT1, MT2 > This
Type of this DMatTSMatMultExpr instance.
Definition: DMatTSMatMultExpr.h:144
#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
SelectType< IsExpression< MT2 >::value, const MT2, const MT2 & >::Type RightOperand
Composite type of the right-hand side sparse matrix expression.
Definition: DMatTSMatMultExpr.h:156
Header file for the IsExpression type trait class.
Header file for the TSMatSVecMultExprTrait class template.
Header file for the FunctionTrace class.