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
138 template<
typename T1,
typename T2,
typename T3 >
139 struct UseSMPAssignKernel {
140 enum { value = evaluateLeft || evaluateRight };
151 template<
typename T1,
typename T2,
typename T3 >
152 struct UseOptimizedKernel {
153 enum { value = !UseSMPAssignKernel<T1,T2,T3>::value &&
154 !IsResizable<typename T1::ElementType>::value };
164 template<
typename T1,
typename T2,
typename T3 >
165 struct UseDefaultKernel {
166 enum { value = !UseSMPAssignKernel<T1,T2,T3>::value &&
167 !UseOptimizedKernel<T1,T2,T3>::value };
197 enum { vectorizable = 0 };
200 enum { smpAssignable = !evaluateLeft && !evaluateRight };
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);
506 template<
typename MT3
509 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
510 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
530 template<
typename MT
536 typedef typename SelectType< SO, ResultType, OppositeType >::Type TmpType;
548 const TmpType tmp( rhs );
567 template<
typename MT
586 TSMatDMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
605 template<
typename MT3
608 static inline typename DisableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
609 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
613 const size_t block( IsRowMajorMatrix<MT3>::value ? 256UL : 8UL );
615 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
616 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
617 for(
size_t i=0UL; i<A.columns(); ++i )
619 const ConstIterator end( A.end(i) );
620 ConstIterator element( A.begin(i) );
622 const size_t nonzeros( A.nonZeros(i) );
624 const size_t kend( nonzeros &
size_t(-4) );
627 for(
size_t k=0UL; k<kend; k+=4UL ) {
628 const size_t i1( element->index() );
629 const ET1 v1( element->value() );
631 const size_t i2( element->index() );
632 const ET1 v2( element->value() );
634 const size_t i3( element->index() );
635 const ET1 v3( element->value() );
637 const size_t i4( element->index() );
638 const ET1 v4( element->value() );
641 for(
size_t j=jj; j<jend; ++j ) {
642 C(i1,j) += v1 * B(i,j);
643 C(i2,j) += v2 * B(i,j);
644 C(i3,j) += v3 * B(i,j);
645 C(i4,j) += v4 * B(i,j);
649 for( ; element!=end; ++element ) {
650 for(
size_t j=jj; j<jend; ++j ) {
651 C(element->index(),j) += element->value() * B(i,j);
674 template<
typename MT3
677 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
678 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
702 template<
typename MT
721 TSMatDMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
740 template<
typename MT3
743 static inline typename DisableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
744 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
748 const size_t block( IsRowMajorMatrix<MT3>::value ? 256UL : 8UL );
750 for(
size_t jj=0UL; jj<B.columns(); jj+=block ) {
751 const size_t jend( ( jj+block > B.columns() )?( B.columns() ):( jj+block ) );
752 for(
size_t i=0UL; i<A.columns(); ++i )
754 const ConstIterator end( A.end(i) );
755 ConstIterator element( A.begin(i) );
757 const size_t nonzeros( A.nonZeros(i) );
759 const size_t kend( nonzeros &
size_t(-4) );
762 for(
size_t k=0UL; k<kend; k+=4UL ) {
763 const size_t i1( element->index() );
764 const ET1 v1( element->value() );
766 const size_t i2( element->index() );
767 const ET1 v2( element->value() );
769 const size_t i3( element->index() );
770 const ET1 v3( element->value() );
772 const size_t i4( element->index() );
773 const ET1 v4( element->value() );
776 for(
size_t j=jj; j<jend; ++j ) {
777 C(i1,j) -= v1 * B(i,j);
778 C(i2,j) -= v2 * B(i,j);
779 C(i3,j) -= v3 * B(i,j);
780 C(i4,j) -= v4 * B(i,j);
784 for( ; element!=end; ++element ) {
785 for(
size_t j=jj; j<jend; ++j ) {
786 C(element->index(),j) -= element->value() * B(i,j);
809 template<
typename MT3
812 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
813 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
883 template<
typename T1
885 inline const TSMatDMatMultExpr<T1,T2>
891 throw std::invalid_argument(
"Matrix sizes do not match" );
908 template<
typename MT1,
typename MT2,
typename VT >
909 struct TDMatDVecMultExprTrait< TSMatDMatMultExpr<MT1,MT2>, VT >
913 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
914 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
915 IsDenseVector<VT>::value && IsColumnVector<VT>::value
916 ,
typename TSMatDVecMultExprTrait< MT1, typename DMatDVecMultExprTrait<MT2,VT>::Type >::Type
917 , INVALID_TYPE >::Type Type;
926 template<
typename MT1,
typename MT2,
typename VT >
927 struct TDMatSVecMultExprTrait< TSMatDMatMultExpr<MT1,MT2>, VT >
931 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
932 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
933 IsSparseVector<VT>::value && IsColumnVector<VT>::value
934 ,
typename TSMatDVecMultExprTrait< MT1, typename DMatSVecMultExprTrait<MT2,VT>::Type >::Type
935 , INVALID_TYPE >::Type Type;
944 template<
typename VT,
typename MT1,
typename MT2 >
945 struct TDVecTDMatMultExprTrait< VT, TSMatDMatMultExpr<MT1,MT2> >
949 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
950 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
951 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
952 ,
typename TDVecDMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
953 , INVALID_TYPE >::Type Type;
962 template<
typename VT,
typename MT1,
typename MT2 >
963 struct TSVecTDMatMultExprTrait< VT, TSMatDMatMultExpr<MT1,MT2> >
967 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
968 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
969 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
970 ,
typename TDVecDMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
971 , INVALID_TYPE >::Type Type;
980 template<
typename MT1,
typename MT2,
bool AF >
981 struct SubmatrixExprTrait< TSMatDMatMultExpr<MT1,MT2>, AF >
985 typedef typename MultExprTrait< typename SubmatrixExprTrait<const MT1,AF>::Type
986 ,
typename SubmatrixExprTrait<const MT2,AF>::Type >::Type Type;
995 template<
typename MT1,
typename MT2 >
996 struct RowExprTrait< TSMatDMatMultExpr<MT1,MT2> >
1000 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
1009 template<
typename MT1,
typename MT2 >
1010 struct ColumnExprTrait< TSMatDMatMultExpr<MT1,MT2> >
1014 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:176
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
MultTrait< RT1, RT2 >::Type ResultType
Result type for expression template evaluations.
Definition: TSMatDMatMultExpr.h:175
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.
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:174
Header file for the IsColumnMajorMatrix type trait.
Header file for the TSVecTSMatMultExprTrait class template.
Header file for the sparse matrix SMP implementation.
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:2384
Header file for the IsRowVector type trait.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:249
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:177
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:104
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:121
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:189
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:2388
Header file for the TDMatSVecMultExprTrait class template.
Header file for the TDVecTSMatMultExprTrait class template.
Header file for the dense matrix SMP implementation.
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:179
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:192
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:186
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.
SelectType< IsExpression< MT1 >::value, const MT1, const MT1 & >::Type LeftOperand
Composite type of the left-hand side sparse matrix expression.
Definition: TSMatDMatMultExpr.h:183
Header file for the IsDenseMatrix type trait.
Header file for the EnableIf class template.
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:91
const ResultType CompositeType
Data type for composite expression templates.
Definition: TSMatDMatMultExpr.h:180
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:179
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: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
const size_t SMP_TSMATDMATMULT_THRESHOLD
SMP column-major sparse matrix/row-major dense matrix multiplication threshold.This threshold represe...
Definition: Thresholds.h:563
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:133
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:2379
ResultType::ElementType ElementType
Resulting element type.
Definition: TSMatDMatMultExpr.h:178
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.
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.
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.