35 #ifndef _BLAZE_MATH_EXPRESSIONS_TSMATTDMATMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_TSMATTDMATMULTEXPR_H_
102 template<
typename MT1
104 class TSMatTDMatMultExpr :
public DenseMatrix< TSMatTDMatMultExpr<MT1,MT2>, true >
105 ,
private MatMatMultExpr
106 ,
private Computation
134 template<
typename MT >
135 struct UseSMPAssign {
136 enum { value = ( evaluateLeft || evaluateRight ) };
147 template<
typename T1,
typename T2,
typename T3 >
148 struct UseOptimizedKernel {
149 enum { value = !IsResizable<typename T1::ElementType>::value };
159 template<
typename T1,
typename T2,
typename T3 >
160 struct UseDefaultKernel {
161 enum { value = !UseOptimizedKernel<T1,T2,T3>::value };
191 enum { vectorizable = 0 };
194 enum { smpAssignable = !evaluateLeft && MT1::smpAssignable &&
195 !evaluateRight && MT2::smpAssignable };
225 if(
lhs_.columns() != 0UL ) {
227 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
255 return rhs_.columns();
285 template<
typename T >
287 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
297 template<
typename T >
299 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
309 return rhs_.isAligned();
342 template<
typename MT
361 TSMatTDMatMultExpr::selectAssignKernel( ~lhs, A, B );
381 template<
typename MT3
385 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
391 const size_t block( 64UL );
393 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
394 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
395 for(
size_t i=0UL; i<A.columns(); ++i ) {
396 const ConstIterator end( A.end(i) );
397 ConstIterator element( A.begin(i) );
398 for( ; element!=end; ++element ) {
399 for(
size_t j=jj; j<jend; ++j ) {
401 C(element->index(),j) = element->value() * B(i,j);
403 C(element->index(),j) += element->value() * B(i,j);
427 template<
typename MT3
430 static inline typename EnableIf< UseOptimizedKernel<MT3,MT4,MT5> >::Type
431 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
435 const size_t block( IsRowMajorMatrix<MT3>::value ? 128UL : 64UL );
437 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
438 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
439 for(
size_t i=0UL; i<A.rows(); ++i ) {
440 for(
size_t j=jj; j<jend; ++j ) {
444 for(
size_t i=0UL; i<A.columns(); ++i )
446 const ConstIterator end( A.end(i) );
447 ConstIterator element( A.begin(i) );
449 const size_t nonzeros( A.nonZeros(i) );
451 const size_t kend( nonzeros &
size_t(-4) );
454 for(
size_t k=0UL; k<kend; k+=4UL ) {
455 const size_t i1( element->index() );
456 const ET1 v1( element->value() );
458 const size_t i2( element->index() );
459 const ET1 v2( element->value() );
461 const size_t i3( element->index() );
462 const ET1 v3( element->value() );
464 const size_t i4( element->index() );
465 const ET1 v4( element->value() );
468 for(
size_t j=jj; j<jend; ++j ) {
469 C(i1,j) += v1 * B(i,j);
470 C(i2,j) += v2 * B(i,j);
471 C(i3,j) += v3 * B(i,j);
472 C(i4,j) += v4 * B(i,j);
476 for( ; element!=end; ++element ) {
477 for(
size_t j=jj; j<jend; ++j ) {
478 C(element->index(),j) += element->value() * B(i,j);
500 template<
typename MT
506 typedef typename SelectType< SO, ResultType, OppositeType >::Type TmpType;
518 const TmpType tmp(
serial( rhs ) );
537 template<
typename MT
556 TSMatTDMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
575 template<
typename MT3
578 static inline void selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
582 const size_t block( IsRowMajorMatrix<MT3>::value ? 128UL : 64UL );
584 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
585 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
586 for(
size_t i=0UL; i<A.columns(); ++i )
588 const ConstIterator end( A.end(i) );
589 ConstIterator element( A.begin(i) );
591 const size_t nonzeros( A.nonZeros(i) );
593 const size_t kend( nonzeros &
size_t(-4) );
596 for(
size_t k=0UL; k<kend; k+=4UL ) {
597 const size_t i1( element->index() );
598 const ET1 v1( element->value() );
600 const size_t i2( element->index() );
601 const ET1 v2( element->value() );
603 const size_t i3( element->index() );
604 const ET1 v3( element->value() );
606 const size_t i4( element->index() );
607 const ET1 v4( element->value() );
610 for(
size_t j=jj; j<jend; ++j ) {
611 C(i1,j) += v1 * B(i,j);
612 C(i2,j) += v2 * B(i,j);
613 C(i3,j) += v3 * B(i,j);
614 C(i4,j) += v4 * B(i,j);
618 for( ; element!=end; ++element ) {
619 for(
size_t j=jj; j<jend; ++j ) {
620 C(element->index(),j) += element->value() * B(i,j);
646 template<
typename MT
665 TSMatTDMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
684 template<
typename MT3
687 static inline void selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
691 const size_t block( IsRowMajorMatrix<MT3>::value ? 128UL : 64UL );
693 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
694 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
695 for(
size_t i=0UL; i<A.columns(); ++i )
697 const ConstIterator end( A.end(i) );
698 ConstIterator element( A.begin(i) );
700 const size_t nonzeros( A.nonZeros(i) );
702 const size_t kend( nonzeros &
size_t(-4) );
705 for(
size_t k=0UL; k<kend; k+=4UL ) {
706 const size_t i1( element->index() );
707 const ET1 v1( element->value() );
709 const size_t i2( element->index() );
710 const ET1 v2( element->value() );
712 const size_t i3( element->index() );
713 const ET1 v3( element->value() );
715 const size_t i4( element->index() );
716 const ET1 v4( element->value() );
719 for(
size_t j=jj; j<jend; ++j ) {
720 C(i1,j) -= v1 * B(i,j);
721 C(i2,j) -= v2 * B(i,j);
722 C(i3,j) -= v3 * B(i,j);
723 C(i4,j) -= v4 * B(i,j);
727 for( ; element!=end; ++element ) {
728 for(
size_t j=jj; j<jend; ++j ) {
729 C(element->index(),j) -= element->value() * B(i,j);
765 template<
typename MT
767 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
805 template<
typename MT
807 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
812 typedef typename SelectType< SO, ResultType, OppositeType >::Type TmpType;
824 const TmpType tmp( rhs );
845 template<
typename MT
847 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
889 template<
typename MT
891 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
975 template<
typename T1
977 inline const TSMatTDMatMultExpr<T1,T2>
983 throw std::invalid_argument(
"Matrix sizes do not match" );
1000 template<
typename MT1,
typename MT2,
typename VT >
1005 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1006 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1007 IsDenseVector<VT>::value && IsColumnVector<VT>::value
1008 ,
typename TSMatDVecMultExprTrait< MT1, typename TDMatDVecMultExprTrait<MT2,VT>::Type >::Type
1009 , INVALID_TYPE >::Type Type;
1018 template<
typename MT1,
typename MT2,
typename VT >
1023 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1024 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1025 IsSparseVector<VT>::value && IsColumnVector<VT>::value
1026 ,
typename TSMatDVecMultExprTrait< MT1, typename TDMatSVecMultExprTrait<MT2,VT>::Type >::Type
1027 , INVALID_TYPE >::Type Type;
1036 template<
typename VT,
typename MT1,
typename MT2 >
1041 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1042 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1043 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
1044 ,
typename TDVecTDMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
1045 , INVALID_TYPE >::Type Type;
1054 template<
typename VT,
typename MT1,
typename MT2 >
1059 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
1060 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1061 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
1062 ,
typename TSVecTDMatMultExprTrait< typename TSVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
1063 , INVALID_TYPE >::Type Type;
1072 template<
typename MT1,
typename MT2,
bool AF >
1077 typedef typename MultExprTrait< typename SubmatrixExprTrait<const MT1,AF>::Type
1078 ,
typename SubmatrixExprTrait<const MT2,AF>::Type >::Type Type;
1087 template<
typename MT1,
typename MT2 >
1092 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
1101 template<
typename MT1,
typename MT2 >
1106 typedef typename MultExprTrait< MT1, typename ColumnExprTrait<const MT2>::Type >::Type Type;
size_t columns() const
Returns the current number of columns of the matrix.
Definition: TSMatTDMatMultExpr.h:254
Compile time check whether the given type is a computational expression template.This type trait clas...
Definition: IsComputation.h:89
size_t rows() const
Returns the current number of rows of the matrix.
Definition: TSMatTDMatMultExpr.h:244
void reset(DynamicMatrix< Type, SO > &m)
Resetting the given dense matrix.
Definition: DynamicMatrix.h:4599
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:4329
Expression object for transpose sparse matrix-transpose dense matrix multiplications.The TSMatTDMatMultExpr class represents the compile time expression for multiplications between a column-major sparse matrix and a column-major dense matrix.
Definition: Forward.h:143
TSMatTDMatMultExpr(const MT1 &lhs, const MT2 &rhs)
Constructor for the TSMatTDMatMultExpr class.
Definition: TSMatTDMatMultExpr.h:204
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:152
Header file for the IsSparseMatrix type trait.
bool isDefault(const DynamicMatrix< Type, SO > &m)
Returns whether the given dense matrix is in default state.
Definition: DynamicMatrix.h:4642
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:199
#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.
LeftOperand leftOperand() const
Returns the left-hand side transpose sparse matrix operand.
Definition: TSMatTDMatMultExpr.h:264
Header file for the IsColumnMajorMatrix type trait.
Header file for the TSVecTSMatMultExprTrait class template.
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:2408
Header file for the IsRowVector type trait.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:251
TSMatTDMatMultExpr< MT1, MT2 > This
Type of this TSMatTDMatMultExpr instance.
Definition: TSMatTDMatMultExpr.h:168
const DMatSerialExpr< MT, SO > serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:690
Header file for the Computation base class.
Header file for the MatMatMultExpr base class.
MultTrait< RT1, RT2 >::Type ResultType
Result type for expression template evaluations.
Definition: TSMatTDMatMultExpr.h:169
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:107
ResultType::OppositeType OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: TSMatTDMatMultExpr.h:170
SelectType< evaluateRight, const RT2, CT2 >::Type RT
Type for the assignment of the right-hand side dense matrix operand.
Definition: TSMatTDMatMultExpr.h:186
const ElementType ReturnType
Return type for expression template evaluations.
Definition: TSMatTDMatMultExpr.h:173
MT1::ResultType RT1
Result type of the left-hand side sparse matrix expression.
Definition: TSMatTDMatMultExpr.h:110
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:122
Compile time check to query the requirement to evaluate an expression.Via this type trait it is possi...
Definition: RequiresEvaluation.h:90
RT1::ElementType ET1
Element type of the left-hand side dense matrix expression.
Definition: TSMatTDMatMultExpr.h:112
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.
const size_t SMP_TSMATTDMATMULT_THRESHOLD
SMP column-major sparse matrix/column-major dense matrix multiplication threshold.This threshold specifies when a column-major sparse matrix/column-major dense matrix multiplication can be executed in parallel. In case the number of rows/columns of the target matrix is larger or equal to this threshold, the operation is executed in parallel. If the number of rows/columns is below this threshold the operation is executed single-threaded.
Definition: Thresholds.h:1087
Header file for the multiplication trait.
#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
Header file for the TSVecTDMatMultExprTrait class template.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2412
Header file for the TDMatSVecMultExprTrait class template.
Header file for the TDVecTSMatMultExprTrait class template.
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:271
SelectType< evaluateLeft, const RT1, CT1 >::Type LT
Type for the assignment of the left-hand side sparse matrix operand.
Definition: TSMatTDMatMultExpr.h:183
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: TSMatTDMatMultExpr.h:286
#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
ResultType::ElementType ElementType
Resulting element type.
Definition: TSMatTDMatMultExpr.h:172
MT2::ResultType RT2
Result type of the right-hand side dense matrix expression.
Definition: TSMatTDMatMultExpr.h:111
RightOperand rhs_
Right-hand side dense matrix of the multiplication expression.
Definition: TSMatTDMatMultExpr.h:326
Constraints on the storage order of matrix types.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2406
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.
MT1::CompositeType CT1
Composite type of the left-hand side sparse matrix expression.
Definition: TSMatTDMatMultExpr.h:114
SelectType< IsExpression< MT1 >::value, const MT1, const MT1 & >::Type LeftOperand
Composite type of the left-hand side sparse matrix expression.
Definition: TSMatTDMatMultExpr.h:177
Header file for the EnableIf class template.
Header file for the serial shim.
RightOperand rightOperand() const
Returns the right-hand side transpose dense matrix operand.
Definition: TSMatTDMatMultExpr.h:274
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:92
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
Header file for run time assertion macros.
Utility type for generic codes.
Base template for the MultTrait class.
Definition: MultTrait.h:141
MT2::CompositeType CT2
Composite type of the right-hand side dense matrix expression.
Definition: TSMatTDMatMultExpr.h:115
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: TSMatTDMatMultExpr.h:219
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:301
Substitution Failure Is Not An Error (SFINAE) class.The EnableIf class template is an auxiliary tool ...
Definition: EnableIf.h:184
Header file for the reset shim.
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:331
Header file for the isDefault shim.
bool canSMPAssign() const
Returns whether the expression can be used in SMP assignments.
Definition: TSMatTDMatMultExpr.h:318
Header file for the RemoveReference type trait.
#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 isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: TSMatTDMatMultExpr.h:298
RT2::ElementType ET2
Element type of the right-hand side sparse matrix expression.
Definition: TSMatTDMatMultExpr.h:113
const ResultType CompositeType
Data type for composite expression templates.
Definition: TSMatTDMatMultExpr.h:174
Header file for the IsComputation type trait class.
Header file for the TDMatDVecMultExprTrait 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:2403
Header file for basic type definitions.
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: TSMatTDMatMultExpr.h:171
Header file for the IsColumnVector type trait.
SelectType< IsExpression< MT2 >::value, const MT2, const MT2 & >::Type RightOperand
Composite type of the right-hand side dense matrix expression.
Definition: TSMatTDMatMultExpr.h:180
bool isAligned() const
Returns whether the operands of the expression are properly aligned in memory.
Definition: TSMatTDMatMultExpr.h:308
Header file for the IsResizable 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
Header file for the TDVecTDMatMultExprTrait class template.
#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
Header file for the IsExpression type trait class.
Header file for the FunctionTrace class.
LeftOperand lhs_
Left-hand side sparse matrix of the multiplication expression.
Definition: TSMatTDMatMultExpr.h:325