35 #ifndef _BLAZE_MATH_EXPRESSIONS_TSMATDMATMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_TSMATDMATMULTEXPR_H_
107 template<
typename MT1
109 class TSMatDMatMultExpr :
public DenseMatrix< TSMatDMatMultExpr<MT1,MT2>, true >
110 ,
private MatMatMultExpr
111 ,
private Computation
139 template<
typename MT >
140 struct UseSMPAssign {
141 enum { value = ( evaluateLeft || evaluateRight ) };
152 template<
typename T1,
typename T2,
typename T3 >
153 struct UseOptimizedKernel {
154 enum { value = !IsResizable<typename T1::ElementType>::value };
164 template<
typename T1,
typename T2,
typename T3 >
165 struct UseDefaultKernel {
166 enum { value = !UseOptimizedKernel<T1,T2,T3>::value };
196 enum { vectorizable = 0 };
199 enum { smpAssignable = !evaluateLeft && MT1::smpAssignable &&
200 !evaluateRight && MT2::smpAssignable };
230 if(
lhs_.columns() != 0UL ) {
232 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
260 return rhs_.columns();
290 template<
typename T >
292 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
302 template<
typename T >
304 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
314 return rhs_.isAligned();
347 template<
typename MT
366 TSMatDMatMultExpr::selectAssignKernel( ~lhs, A, B );
386 template<
typename MT3
390 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
398 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
399 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
400 for(
size_t i=0UL; i<A.columns(); ++i ) {
401 const ConstIterator end( A.end(i) );
402 ConstIterator element( A.begin(i) );
403 for( ; element!=end; ++element ) {
404 for(
size_t j=jj; j<jend; ++j ) {
406 C(element->index(),j) = element->value() * B(i,j);
408 C(element->index(),j) += element->value() * B(i,j);
432 template<
typename MT3
435 static inline typename EnableIf< UseOptimizedKernel<MT3,MT4,MT5> >::Type
436 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
440 const size_t block( IsRowMajorMatrix<MT3>::value ? 256UL : 8UL );
442 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
443 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
444 for(
size_t i=0UL; i<A.rows(); ++i ) {
445 for(
size_t j=jj; j<jend; ++j ) {
449 for(
size_t i=0UL; i<A.columns(); ++i )
451 const ConstIterator end( A.end(i) );
452 ConstIterator element( A.begin(i) );
454 const size_t nonzeros( A.nonZeros(i) );
456 const size_t kend( nonzeros &
size_t(-4) );
459 for(
size_t k=0UL; k<kend; k+=4UL ) {
460 const size_t i1( element->index() );
461 const ET1 v1( element->value() );
463 const size_t i2( element->index() );
464 const ET1 v2( element->value() );
466 const size_t i3( element->index() );
467 const ET1 v3( element->value() );
469 const size_t i4( element->index() );
470 const ET1 v4( element->value() );
473 for(
size_t j=jj; j<jend; ++j ) {
474 C(i1,j) += v1 * B(i,j);
475 C(i2,j) += v2 * B(i,j);
476 C(i3,j) += v3 * B(i,j);
477 C(i4,j) += v4 * B(i,j);
481 for( ; element!=end; ++element ) {
482 for(
size_t j=jj; j<jend; ++j ) {
483 C(element->index(),j) += element->value() * B(i,j);
505 template<
typename MT
511 typedef typename SelectType< SO, ResultType, OppositeType >::Type TmpType;
523 const TmpType tmp(
serial( rhs ) );
542 template<
typename MT
561 TSMatDMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
580 template<
typename MT3
583 static inline void selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
587 const size_t block( IsRowMajorMatrix<MT3>::value ? 256UL : 8UL );
589 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
590 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
591 for(
size_t i=0UL; i<A.columns(); ++i )
593 const ConstIterator end( A.end(i) );
594 ConstIterator element( A.begin(i) );
596 const size_t nonzeros( A.nonZeros(i) );
598 const size_t kend( nonzeros &
size_t(-4) );
601 for(
size_t k=0UL; k<kend; k+=4UL ) {
602 const size_t i1( element->index() );
603 const ET1 v1( element->value() );
605 const size_t i2( element->index() );
606 const ET1 v2( element->value() );
608 const size_t i3( element->index() );
609 const ET1 v3( element->value() );
611 const size_t i4( element->index() );
612 const ET1 v4( element->value() );
615 for(
size_t j=jj; j<jend; ++j ) {
616 C(i1,j) += v1 * B(i,j);
617 C(i2,j) += v2 * B(i,j);
618 C(i3,j) += v3 * B(i,j);
619 C(i4,j) += v4 * B(i,j);
623 for( ; element!=end; ++element ) {
624 for(
size_t j=jj; j<jend; ++j ) {
625 C(element->index(),j) += element->value() * B(i,j);
651 template<
typename MT
670 TSMatDMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
689 template<
typename MT3
692 static inline void selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
696 const size_t block( IsRowMajorMatrix<MT3>::value ? 256UL : 8UL );
698 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
699 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
700 for(
size_t i=0UL; i<A.columns(); ++i )
702 const ConstIterator end( A.end(i) );
703 ConstIterator element( A.begin(i) );
705 const size_t nonzeros( A.nonZeros(i) );
707 const size_t kend( nonzeros &
size_t(-4) );
710 for(
size_t k=0UL; k<kend; k+=4UL ) {
711 const size_t i1( element->index() );
712 const ET1 v1( element->value() );
714 const size_t i2( element->index() );
715 const ET1 v2( element->value() );
717 const size_t i3( element->index() );
718 const ET1 v3( element->value() );
720 const size_t i4( element->index() );
721 const ET1 v4( element->value() );
724 for(
size_t j=jj; j<jend; ++j ) {
725 C(i1,j) -= v1 * B(i,j);
726 C(i2,j) -= v2 * B(i,j);
727 C(i3,j) -= v3 * B(i,j);
728 C(i4,j) -= v4 * B(i,j);
732 for( ; element!=end; ++element ) {
733 for(
size_t j=jj; j<jend; ++j ) {
734 C(element->index(),j) -= element->value() * B(i,j);
770 template<
typename MT
772 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
810 template<
typename MT
812 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
817 typedef typename SelectType< SO, ResultType, OppositeType >::Type TmpType;
829 const TmpType tmp( rhs );
850 template<
typename MT
852 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
894 template<
typename MT
896 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
982 template<
typename T1
984 inline const TSMatDMatMultExpr<T1,T2>
990 throw std::invalid_argument(
"Matrix sizes do not match" );
1007 template<
typename MT1,
typename MT2,
typename VT >
1012 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1013 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1014 IsDenseVector<VT>::value && IsColumnVector<VT>::value
1015 ,
typename TSMatDVecMultExprTrait< MT1, typename DMatDVecMultExprTrait<MT2,VT>::Type >::Type
1016 , INVALID_TYPE >::Type Type;
1025 template<
typename MT1,
typename MT2,
typename VT >
1030 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1031 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1032 IsSparseVector<VT>::value && IsColumnVector<VT>::value
1033 ,
typename TSMatDVecMultExprTrait< MT1, typename DMatSVecMultExprTrait<MT2,VT>::Type >::Type
1034 , INVALID_TYPE >::Type Type;
1043 template<
typename VT,
typename MT1,
typename MT2 >
1048 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1049 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1050 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
1051 ,
typename TDVecDMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
1052 , INVALID_TYPE >::Type Type;
1061 template<
typename VT,
typename MT1,
typename MT2 >
1066 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
1067 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1068 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
1069 ,
typename TDVecDMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
1070 , INVALID_TYPE >::Type Type;
1079 template<
typename MT1,
typename MT2,
bool AF >
1084 typedef typename MultExprTrait< typename SubmatrixExprTrait<const MT1,AF>::Type
1085 ,
typename SubmatrixExprTrait<const MT2,AF>::Type >::Type Type;
1094 template<
typename MT1,
typename MT2 >
1099 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
1108 template<
typename MT1,
typename MT2 >
1113 typedef typename MultExprTrait< MT1, typename ColumnExprTrait<const MT2>::Type >::Type Type;
Compile time check whether the given type is a computational expression template.This type trait clas...
Definition: IsComputation.h:89
ResultType::OppositeType OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: TSMatDMatMultExpr.h:175
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
MultTrait< RT1, RT2 >::Type ResultType
Result type for expression template evaluations.
Definition: TSMatDMatMultExpr.h:174
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.
size_t columns() const
Returns the current number of columns of the matrix.
Definition: TSMatDMatMultExpr.h:259
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: TSMatDMatMultExpr.h:291
TSMatDMatMultExpr< MT1, MT2 > This
Type of this TSMatDMatMultExpr instance.
Definition: TSMatDMatMultExpr.h:173
Header file for the IsColumnMajorMatrix type trait.
Header file for the TSVecTSMatMultExprTrait class template.
bool isAligned() const
Returns whether the operands of the expression are properly aligned in memory.
Definition: TSMatDMatMultExpr.h:313
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
LeftOperand leftOperand() const
Returns the left-hand side transpose sparse matrix operand.
Definition: TSMatDMatMultExpr.h:269
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: TSMatDMatMultExpr.h:176
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.
MT1::CompositeType CT1
Composite type of the left-hand side sparse matrix expression.
Definition: TSMatDMatMultExpr.h:119
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
LeftOperand lhs_
Left-hand side sparse matrix of the multiplication expression.
Definition: TSMatDMatMultExpr.h:330
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: TSMatDMatMultExpr.h:303
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
SelectType< evaluateLeft, const RT1, CT1 >::Type LT
Type for the assignment of the left-hand side sparse matrix operand.
Definition: TSMatDMatMultExpr.h:188
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.
bool canSMPAssign() const
Returns whether the expression can be used in SMP assignments.
Definition: TSMatDMatMultExpr.h:323
RT2::ElementType ET2
Element type of the right-hand side sparse matrix expression.
Definition: TSMatDMatMultExpr.h:118
Header file for the multiplication trait.
RightOperand rhs_
Right-hand side dense matrix of the multiplication expression.
Definition: TSMatDMatMultExpr.h:331
MT2::CompositeType CT2
Composite type of the right-hand side dense matrix expression.
Definition: TSMatDMatMultExpr.h:120
Compile time check for row-major matrix types.This type trait tests whether or not the given template...
Definition: IsRowMajorMatrix.h:104
#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
RightOperand rightOperand() const
Returns the right-hand side dense matrix operand.
Definition: TSMatDMatMultExpr.h:279
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.
MT1::ResultType RT1
Result type of the left-hand side sparse matrix expression.
Definition: TSMatDMatMultExpr.h:115
Header file for the DenseMatrix base class.
Header file for the TSMatDVecMultExprTrait class template.
TSMatDMatMultExpr(const MT1 &lhs, const MT2 &rhs)
Constructor for the TSMatDMatMultExpr class.
Definition: TSMatDMatMultExpr.h:209
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
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: TSMatDMatMultExpr.h:224
SelectType< evaluateRight, const RT2, CT2 >::Type RT
Type for the assignment of the right-hand side dense matrix operand.
Definition: TSMatDMatMultExpr.h:191
const size_t SMP_TSMATDMATMULT_THRESHOLD
SMP column-major sparse matrix/row-major dense matrix multiplication threshold.This threshold specifi...
Definition: Thresholds.h:1064
Header file for the DMatDVecMultExprTrait class template.
#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
MT2::ResultType RT2
Result type of the right-hand side dense matrix expression.
Definition: TSMatDMatMultExpr.h:116
SelectType< IsExpression< MT2 >::value, const MT2, const MT2 & >::Type RightOperand
Composite type of the right-hand side dense matrix expression.
Definition: TSMatDMatMultExpr.h:185
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.
SelectType< IsExpression< MT1 >::value, const MT1, const MT1 & >::Type LeftOperand
Composite type of the left-hand side sparse matrix expression.
Definition: TSMatDMatMultExpr.h:182
Header file for the IsDenseMatrix type trait.
Header file for the EnableIf class template.
Header file for the serial shim.
RT1::ElementType ET1
Element type of the left-hand side dense matrix expression.
Definition: TSMatDMatMultExpr.h:117
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
const ResultType CompositeType
Data type for composite expression templates.
Definition: TSMatDMatMultExpr.h:179
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
const ElementType ReturnType
Return type for expression template evaluations.
Definition: TSMatDMatMultExpr.h:178
Header file for run time assertion macros.
Utility type for generic codes.
Base template for the MultTrait class.
Definition: MultTrait.h:141
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.
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.
size_t rows() const
Returns the current number of rows of the matrix.
Definition: TSMatDMatMultExpr.h:249
Header file for the IsRowMajorMatrix type trait.
Header file for the IsComputation type trait class.
Expression object for transpose sparse matrix-dense matrix multiplications.The TSMatDMatMultExpr clas...
Definition: Forward.h:137
Header file for the TDVecDMatMultExprTrait class template.
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
ResultType::ElementType ElementType
Resulting element type.
Definition: TSMatDMatMultExpr.h:177
Header file for basic type definitions.
Header file for the TSVecDMatMultExprTrait class template.
Header file for the DMatSVecMultExprTrait class template.
Header file for the IsColumnVector type trait.
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.