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
133 template<
typename T1,
typename T2,
typename T3 >
134 struct UseSMPAssignKernel {
135 enum { value = evaluateLeft || evaluateRight };
146 template<
typename T1,
typename T2,
typename T3 >
147 struct UseOptimizedKernel {
148 enum { value = !UseSMPAssignKernel<T1,T2,T3>::value &&
149 !IsResizable<typename T1::ElementType>::value };
159 template<
typename T1,
typename T2,
typename T3 >
160 struct UseDefaultKernel {
161 enum { value = !UseSMPAssignKernel<T1,T2,T3>::value &&
162 !UseOptimizedKernel<T1,T2,T3>::value };
192 enum { vectorizable = 0 };
195 enum { smpAssignable = !evaluateLeft && !evaluateRight };
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);
501 template<
typename MT3
504 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
505 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
525 template<
typename MT
531 typedef typename SelectType< SO, ResultType, OppositeType >::Type TmpType;
543 const TmpType tmp( rhs );
562 template<
typename MT
581 TSMatTDMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
600 template<
typename MT3
603 static inline typename DisableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
604 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
608 const size_t block( IsRowMajorMatrix<MT3>::value ? 128UL : 64UL );
610 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
611 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
612 for(
size_t i=0UL; i<A.columns(); ++i )
614 const ConstIterator end( A.end(i) );
615 ConstIterator element( A.begin(i) );
617 const size_t nonzeros( A.nonZeros(i) );
619 const size_t kend( nonzeros &
size_t(-4) );
622 for(
size_t k=0UL; k<kend; k+=4UL ) {
623 const size_t i1( element->index() );
624 const ET1 v1( element->value() );
626 const size_t i2( element->index() );
627 const ET1 v2( element->value() );
629 const size_t i3( element->index() );
630 const ET1 v3( element->value() );
632 const size_t i4( element->index() );
633 const ET1 v4( element->value() );
636 for(
size_t j=jj; j<jend; ++j ) {
637 C(i1,j) += v1 * B(i,j);
638 C(i2,j) += v2 * B(i,j);
639 C(i3,j) += v3 * B(i,j);
640 C(i4,j) += v4 * B(i,j);
644 for( ; element!=end; ++element ) {
645 for(
size_t j=jj; j<jend; ++j ) {
646 C(element->index(),j) += element->value() * B(i,j);
669 template<
typename MT3
672 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
673 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
697 template<
typename MT
716 TSMatTDMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
735 template<
typename MT3
738 static inline typename DisableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
739 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
743 const size_t block( IsRowMajorMatrix<MT3>::value ? 128UL : 64UL );
745 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
746 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
747 for(
size_t i=0UL; i<A.columns(); ++i )
749 const ConstIterator end( A.end(i) );
750 ConstIterator element( A.begin(i) );
752 const size_t nonzeros( A.nonZeros(i) );
754 const size_t kend( nonzeros &
size_t(-4) );
757 for(
size_t k=0UL; k<kend; k+=4UL ) {
758 const size_t i1( element->index() );
759 const ET1 v1( element->value() );
761 const size_t i2( element->index() );
762 const ET1 v2( element->value() );
764 const size_t i3( element->index() );
765 const ET1 v3( element->value() );
767 const size_t i4( element->index() );
768 const ET1 v4( element->value() );
771 for(
size_t j=jj; j<jend; ++j ) {
772 C(i1,j) -= v1 * B(i,j);
773 C(i2,j) -= v2 * B(i,j);
774 C(i3,j) -= v3 * B(i,j);
775 C(i4,j) -= v4 * B(i,j);
779 for( ; element!=end; ++element ) {
780 for(
size_t j=jj; j<jend; ++j ) {
781 C(element->index(),j) -= element->value() * B(i,j);
804 template<
typename MT3
807 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
808 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
876 template<
typename T1
878 inline const TSMatTDMatMultExpr<T1,T2>
884 throw std::invalid_argument(
"Matrix sizes do not match" );
901 template<
typename MT1,
typename MT2,
typename VT >
902 struct TDMatDVecMultExprTrait< TSMatTDMatMultExpr<MT1,MT2>, VT >
906 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
907 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
908 IsDenseVector<VT>::value && IsColumnVector<VT>::value
909 ,
typename TSMatDVecMultExprTrait< MT1, typename TDMatDVecMultExprTrait<MT2,VT>::Type >::Type
910 , INVALID_TYPE >::Type Type;
919 template<
typename MT1,
typename MT2,
typename VT >
920 struct TDMatSVecMultExprTrait< TSMatTDMatMultExpr<MT1,MT2>, VT >
924 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
925 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
926 IsSparseVector<VT>::value && IsColumnVector<VT>::value
927 ,
typename TSMatDVecMultExprTrait< MT1, typename TDMatSVecMultExprTrait<MT2,VT>::Type >::Type
928 , INVALID_TYPE >::Type Type;
937 template<
typename VT,
typename MT1,
typename MT2 >
938 struct TDVecTDMatMultExprTrait< VT, TSMatTDMatMultExpr<MT1,MT2> >
942 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
943 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
944 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
945 ,
typename TDVecTDMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
946 , INVALID_TYPE >::Type Type;
955 template<
typename VT,
typename MT1,
typename MT2 >
956 struct TSVecTDMatMultExprTrait< VT, TSMatTDMatMultExpr<MT1,MT2> >
960 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
961 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
962 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
963 ,
typename TSVecTDMatMultExprTrait< typename TSVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
964 , INVALID_TYPE >::Type Type;
973 template<
typename MT1,
typename MT2,
bool AF >
974 struct SubmatrixExprTrait< TSMatTDMatMultExpr<MT1,MT2>, AF >
978 typedef typename MultExprTrait< typename SubmatrixExprTrait<const MT1,AF>::Type
979 ,
typename SubmatrixExprTrait<const MT2,AF>::Type >::Type Type;
988 template<
typename MT1,
typename MT2 >
989 struct RowExprTrait< TSMatTDMatMultExpr<MT1,MT2> >
993 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
1002 template<
typename MT1,
typename MT2 >
1003 struct ColumnExprTrait< TSMatTDMatMultExpr<MT1,MT2> >
1007 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:4579
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
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:139
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:151
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:4622
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.
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.
Header file for the sparse matrix SMP implementation.
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
TSMatTDMatMultExpr< MT1, MT2 > This
Type of this TSMatTDMatMultExpr instance.
Definition: TSMatTDMatMultExpr.h:169
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:170
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
ResultType::OppositeType OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: TSMatTDMatMultExpr.h:171
SelectType< evaluateRight, const RT2, CT2 >::Type RT
Type for the assignment of the right-hand side dense matrix operand.
Definition: TSMatTDMatMultExpr.h:187
const ElementType ReturnType
Return type for expression template evaluations.
Definition: TSMatTDMatMultExpr.h:174
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:121
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.
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:2388
Header file for the TDMatSVecMultExprTrait class template.
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
SelectType< evaluateLeft, const RT1, CT1 >::Type LT
Type for the assignment of the left-hand side sparse matrix operand.
Definition: TSMatTDMatMultExpr.h:184
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:173
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:2382
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:178
Header file for the EnableIf class template.
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:91
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:209
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:239
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 size_t SMP_TSMATTDMATMULT_THRESHOLD
SMP column-major sparse matrix/column-major dense matrix multiplication threshold.This threshold represents the system-specific threshold for a parallel column-major sparse matrix/column-major dense matrix multiplication. 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:576
const ResultType CompositeType
Data type for composite expression templates.
Definition: TSMatTDMatMultExpr.h:175
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: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.
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: TSMatTDMatMultExpr.h:172
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:181
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.
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
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