35 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATTDMATMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_SMATTDMATMULTEXPR_H_
107 template<
typename MT1
109 class SMatTDMatMultExpr :
public DenseMatrix< SMatTDMatMultExpr<MT1,MT2>, false >
110 ,
private MatMatMultExpr
111 ,
private Computation
138 template<
typename T1,
typename T2,
typename T3 >
139 struct UseSMPAssignKernel {
140 enum { value = evaluateLeft || evaluateRight };
170 enum { vectorizable = 0 };
173 enum { smpAssignable = !evaluateLeft && !evaluateRight };
206 if(
lhs_.columns() == 0UL )
215 const ConstIterator end( A.end(i) );
216 ConstIterator element( A.begin(i) );
223 tmp = element->value() *
rhs_(element->index(),j);
225 for( ; element!=end; ++element )
226 tmp += element->value() *
rhs_(element->index(),j);
232 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
257 return rhs_.columns();
287 template<
typename T >
289 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
299 template<
typename T >
301 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
311 return rhs_.isAligned();
343 template<
typename MT
362 SMatTDMatMultExpr::selectAssignKernel( ~lhs, A, B );
381 template<
typename MT3
385 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
389 const size_t block( 256UL );
391 const size_t jend( B.columns() &
size_t(-4) );
394 for(
size_t ii=0UL; ii<A.rows(); ii+=block ) {
395 const size_t iend( ( ii+block > A.rows() )?( A.rows() ):( ii+block ) );
396 for(
size_t j=0UL; j<jend; j+=4UL ) {
397 for(
size_t i=ii; i<iend; ++i ) {
398 const ConstIterator end( A.end(i) );
399 ConstIterator element( A.begin(i) );
401 C(i,j ) = element->value() * B(element->index(),j );
402 C(i,j+1UL) = element->value() * B(element->index(),j+1UL);
403 C(i,j+2UL) = element->value() * B(element->index(),j+2UL);
404 C(i,j+3UL) = element->value() * B(element->index(),j+3UL);
406 for( ; element!=end; ++element ) {
407 C(i,j ) += element->value() * B(element->index(),j );
408 C(i,j+1UL) += element->value() * B(element->index(),j+1UL);
409 C(i,j+2UL) += element->value() * B(element->index(),j+2UL);
410 C(i,j+3UL) += element->value() * B(element->index(),j+3UL);
421 for(
size_t j=jend; j<B.columns(); ++j ) {
422 for(
size_t i=ii; i<iend; ++i ) {
423 const ConstIterator end( A.end(i) );
424 ConstIterator element( A.begin(i) );
426 C(i,j) = element->value() * B(element->index(),j);
428 for( ; element!=end; ++element ) {
429 C(i,j) += element->value() * B(element->index(),j);
456 template<
typename MT3
459 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
460 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
479 template<
typename MT
485 typedef typename SelectType< SO, OppositeType, ResultType >::Type TmpType;
497 const TmpType tmp( rhs );
516 template<
typename MT
535 SMatTDMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
554 template<
typename MT3
557 static inline typename DisableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
558 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
562 const size_t block( 256UL );
564 const size_t jend( B.columns() & size_t(-4) );
567 for(
size_t ii=0UL; ii<A.rows(); ii+=block ) {
568 const size_t iend( ( ii+block > A.rows() )?( A.rows() ):( ii+block ) );
569 for(
size_t j=0UL; j<jend; j+=4UL ) {
570 for(
size_t i=ii; i<iend; ++i ) {
571 const ConstIterator end( A.end(i) );
572 ConstIterator element( A.begin(i) );
573 for( ; element!=end; ++element ) {
574 C(i,j ) += element->value() * B(element->index(),j );
575 C(i,j+1UL) += element->value() * B(element->index(),j+1UL);
576 C(i,j+2UL) += element->value() * B(element->index(),j+2UL);
577 C(i,j+3UL) += element->value() * B(element->index(),j+3UL);
581 for(
size_t j=jend; j<B.columns(); ++j ) {
582 for(
size_t i=ii; i<iend; ++i ) {
583 const ConstIterator end( A.end(i) );
584 ConstIterator element( A.begin(i) );
585 for( ; element!=end; ++element ) {
586 C(i,j) += element->value() * B(element->index(),j);
609 template<
typename MT3
612 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
613 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
637 template<
typename MT
656 SMatTDMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
675 template<
typename MT3
678 static inline typename DisableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
679 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
683 const size_t block( 256UL );
685 const size_t jend( B.columns() & size_t(-4) );
688 for(
size_t ii=0UL; ii<A.rows(); ii+=block ) {
689 const size_t iend( ( ii+block > A.rows() )?( A.rows() ):( ii+block ) );
690 for(
size_t j=0UL; j<jend; j+=4UL ) {
691 for(
size_t i=ii; i<iend; ++i ) {
692 const ConstIterator end( A.end(i) );
693 ConstIterator element( A.begin(i) );
694 for( ; element!=end; ++element ) {
695 C(i,j ) -= element->value() * B(element->index(),j );
696 C(i,j+1UL) -= element->value() * B(element->index(),j+1UL);
697 C(i,j+2UL) -= element->value() * B(element->index(),j+2UL);
698 C(i,j+3UL) -= element->value() * B(element->index(),j+3UL);
702 for(
size_t j=jend; j<B.columns(); ++j ) {
703 for(
size_t i=ii; i<iend; ++i ) {
704 const ConstIterator end( A.end(i) );
705 ConstIterator element( A.begin(i) );
706 for( ; element!=end; ++element ) {
707 C(i,j) -= element->value() * B(element->index(),j);
730 template<
typename MT3
733 static inline typename EnableIf< UseSMPAssignKernel<MT3,MT4,MT5> >::Type
734 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
804 template<
typename T1
806 inline const SMatTDMatMultExpr<T1,T2>
812 throw std::invalid_argument(
"Matrix sizes do not match" );
829 template<
typename MT1,
typename MT2,
typename VT >
830 struct DMatDVecMultExprTrait< SMatTDMatMultExpr<MT1,MT2>, VT >
834 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
835 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
836 IsDenseVector<VT>::value && IsColumnVector<VT>::value
837 ,
typename SMatDVecMultExprTrait< MT1, typename TDMatDVecMultExprTrait<MT2,VT>::Type >::Type
838 , INVALID_TYPE >::Type Type;
847 template<
typename MT1,
typename MT2,
typename VT >
848 struct DMatSVecMultExprTrait< SMatTDMatMultExpr<MT1,MT2>, VT >
852 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
853 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
854 IsSparseVector<VT>::value && IsColumnVector<VT>::value
855 ,
typename SMatDVecMultExprTrait< MT1, typename TDMatSVecMultExprTrait<MT2,VT>::Type >::Type
856 , INVALID_TYPE >::Type Type;
865 template<
typename VT,
typename MT1,
typename MT2 >
866 struct TDVecDMatMultExprTrait< VT, SMatTDMatMultExpr<MT1,MT2> >
870 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
871 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
872 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
873 ,
typename TDVecTDMatMultExprTrait< typename TDVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
874 , INVALID_TYPE >::Type Type;
883 template<
typename VT,
typename MT1,
typename MT2 >
884 struct TSVecDMatMultExprTrait< VT, SMatTDMatMultExpr<MT1,MT2> >
888 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
889 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
890 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
891 ,
typename TSVecTDMatMultExprTrait< typename TSVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
892 , INVALID_TYPE >::Type Type;
901 template<
typename MT1,
typename MT2,
bool AF >
902 struct SubmatrixExprTrait< SMatTDMatMultExpr<MT1,MT2>, AF >
906 typedef typename MultExprTrait< typename SubmatrixExprTrait<const MT1,AF>::Type
907 ,
typename SubmatrixExprTrait<const MT2,AF>::Type >::Type Type;
916 template<
typename MT1,
typename MT2 >
917 struct RowExprTrait< SMatTDMatMultExpr<MT1,MT2> >
921 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
930 template<
typename MT1,
typename MT2 >
931 struct ColumnExprTrait< SMatTDMatMultExpr<MT1,MT2> >
935 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
SelectType< IsExpression< MT1 >::value, const MT1, const MT1 & >::Type LeftOperand
Composite type of the left-hand side sparse matrix expression.
Definition: SMatTDMatMultExpr.h:156
const ElementType ReturnType
Return type for expression template evaluations.
Definition: SMatTDMatMultExpr.h:152
Header file for the SMatDVecMultExprTrait class template.
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
MT1::CompositeType CT1
Composite type of the left-hand side sparse matrix expression.
Definition: SMatTDMatMultExpr.h:119
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.
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:197
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: SMatTDMatMultExpr.h:288
MultTrait< RT1, RT2 >::Type ResultType
Result type for expression template evaluations.
Definition: SMatTDMatMultExpr.h:148
#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.
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
const ResultType CompositeType
Data type for composite expression templates.
Definition: SMatTDMatMultExpr.h:153
Header file for the TDVecSMatMultExprTrait class template.
LeftOperand lhs_
Left-hand side sparse matrix of the multiplication expression.
Definition: SMatTDMatMultExpr.h:327
Header file for the Computation base class.
SelectType< evaluateLeft, const RT1, CT1 >::Type LT
Type for the assignment of the left-hand side sparse matrix operand.
Definition: SMatTDMatMultExpr.h:162
Header file for the MatMatMultExpr base class.
MT1::ResultType RT1
Result type of the left-hand side sparse matrix expression.
Definition: SMatTDMatMultExpr.h:115
SMatTDMatMultExpr< MT1, MT2 > This
Type of this SMatTDMatMultExpr instance.
Definition: SMatTDMatMultExpr.h:147
Header file for the RequiresEvaluation type trait.
MT2::ResultType RT2
Result type of the right-hand side dense matrix expression.
Definition: SMatTDMatMultExpr.h:116
Header file for the TSVecSMatMultExprTrait class template.
RightOperand rightOperand() const
Returns the right-hand side transpose dense matrix operand.
Definition: SMatTDMatMultExpr.h:276
size_t columns() const
Returns the current number of columns of the matrix.
Definition: SMatTDMatMultExpr.h:256
const size_t SMP_SMATTDMATMULT_THRESHOLD
SMP row-major sparse matrix/column-major dense matrix multiplication threshold.This threshold represe...
Definition: Thresholds.h:550
SMatTDMatMultExpr(const MT1 &lhs, const MT2 &rhs)
Constructor for the SMatTDMatMultExpr class.
Definition: SMatTDMatMultExpr.h:182
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.
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
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.
bool isAligned() const
Returns whether the operands of the expression are properly aligned in memory.
Definition: SMatTDMatMultExpr.h:310
#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 dense matrix SMP implementation.
Header file for the DenseMatrix base class.
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
Header file for the DMatDVecMultExprTrait class template.
size_t rows() const
Returns the current number of rows of the matrix.
Definition: SMatTDMatMultExpr.h:246
Expression object for sparse matrix-transpose dense matrix multiplications.The SMatTDMatMultExpr clas...
Definition: Forward.h:97
#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.
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.
Header file for the EnableIf class template.
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: SMatTDMatMultExpr.h:150
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
RT1::ElementType ET1
Element type of the left-hand side dense matrix expression.
Definition: SMatTDMatMultExpr.h:117
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.
RT2::ElementType ET2
Element type of the right-hand side sparse matrix expression.
Definition: SMatTDMatMultExpr.h:118
Utility type for generic codes.
Base template for the MultTrait class.
Definition: MultTrait.h:141
bool canSMPAssign() const
Returns whether the expression can be used in SMP assignments.
Definition: SMatTDMatMultExpr.h:320
SelectType< IsExpression< MT2 >::value, const MT2, const MT2 & >::Type RightOperand
Composite type of the right-hand side dense matrix expression.
Definition: SMatTDMatMultExpr.h:159
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
LeftOperand leftOperand() const
Returns the left-hand side sparse matrix operand.
Definition: SMatTDMatMultExpr.h:266
Header file for the reset shim.
MT2::CompositeType CT2
Composite type of the right-hand side dense matrix expression.
Definition: SMatTDMatMultExpr.h:120
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
ResultType::ElementType ElementType
Resulting element type.
Definition: SMatTDMatMultExpr.h:151
ResultType::OppositeType OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: SMatTDMatMultExpr.h:149
Header file for the RemoveReference type trait.
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.
SelectType< evaluateRight, const RT2, CT2 >::Type RT
Type for the assignment of the right-hand side dense matrix operand.
Definition: SMatTDMatMultExpr.h:165
Header file for the IsRowMajorMatrix type trait.
Header file for the IsComputation type trait class.
RightOperand rhs_
Right-hand side dense matrix of the multiplication expression.
Definition: SMatTDMatMultExpr.h:328
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
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.
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: SMatTDMatMultExpr.h:197
Header file for the DMatSVecMultExprTrait class template.
Header file for the IsColumnVector type trait.
Size type of the Blaze library.
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
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: SMatTDMatMultExpr.h:300
Header file for the IsExpression type trait class.
Header file for the FunctionTrace class.