35 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATTDMATMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_SMATTDMATMULTEXPR_H_
106 template<
typename MT1
108 class SMatTDMatMultExpr :
public DenseMatrix< SMatTDMatMultExpr<MT1,MT2>, false >
109 ,
private MatMatMultExpr
110 ,
private Computation
138 template<
typename MT >
139 struct UseSMPAssign {
140 enum { value = ( evaluateLeft || evaluateRight ) };
170 enum { vectorizable = 0 };
173 enum { smpAssignable = !evaluateLeft && MT1::smpAssignable &&
174 !evaluateRight && MT2::smpAssignable };
207 if(
lhs_.columns() == 0UL )
216 const ConstIterator end( A.end(i) );
217 ConstIterator element( A.begin(i) );
224 tmp = element->value() *
rhs_(element->index(),j);
226 for( ; element!=end; ++element )
227 tmp += element->value() *
rhs_(element->index(),j);
233 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
258 return rhs_.columns();
288 template<
typename T >
290 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
300 template<
typename T >
302 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
312 return rhs_.isAligned();
344 template<
typename MT
363 SMatTDMatMultExpr::selectAssignKernel( ~lhs, A, B );
382 template<
typename MT3
385 static inline void 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);
454 template<
typename MT
460 typedef typename SelectType< SO, OppositeType, ResultType >::Type TmpType;
472 const TmpType tmp(
serial( rhs ) );
491 template<
typename MT
510 SMatTDMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
529 template<
typename MT3
532 static inline void selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
536 const size_t block( 256UL );
538 const size_t jend( B.columns() & size_t(-4) );
541 for(
size_t ii=0UL; ii<A.rows(); ii+=block ) {
542 const size_t iend( ( ii+block > A.rows() )?( A.rows() ):( ii+block ) );
543 for(
size_t j=0UL; j<jend; j+=4UL ) {
544 for(
size_t i=ii; i<iend; ++i ) {
545 const ConstIterator end( A.end(i) );
546 ConstIterator element( A.begin(i) );
547 for( ; element!=end; ++element ) {
548 C(i,j ) += element->value() * B(element->index(),j );
549 C(i,j+1UL) += element->value() * B(element->index(),j+1UL);
550 C(i,j+2UL) += element->value() * B(element->index(),j+2UL);
551 C(i,j+3UL) += element->value() * B(element->index(),j+3UL);
555 for(
size_t j=jend; j<B.columns(); ++j ) {
556 for(
size_t i=ii; i<iend; ++i ) {
557 const ConstIterator end( A.end(i) );
558 ConstIterator element( A.begin(i) );
559 for( ; element!=end; ++element ) {
560 C(i,j) += element->value() * B(element->index(),j);
586 template<
typename MT
605 SMatTDMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
624 template<
typename MT3
627 static inline void selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
631 const size_t block( 256UL );
633 const size_t jend( B.columns() & size_t(-4) );
636 for(
size_t ii=0UL; ii<A.rows(); ii+=block ) {
637 const size_t iend( ( ii+block > A.rows() )?( A.rows() ):( ii+block ) );
638 for(
size_t j=0UL; j<jend; j+=4UL ) {
639 for(
size_t i=ii; i<iend; ++i ) {
640 const ConstIterator end( A.end(i) );
641 ConstIterator element( A.begin(i) );
642 for( ; element!=end; ++element ) {
643 C(i,j ) -= element->value() * B(element->index(),j );
644 C(i,j+1UL) -= element->value() * B(element->index(),j+1UL);
645 C(i,j+2UL) -= element->value() * B(element->index(),j+2UL);
646 C(i,j+3UL) -= element->value() * B(element->index(),j+3UL);
650 for(
size_t j=jend; j<B.columns(); ++j ) {
651 for(
size_t i=ii; i<iend; ++i ) {
652 const ConstIterator end( A.end(i) );
653 ConstIterator element( A.begin(i) );
654 for( ; element!=end; ++element ) {
655 C(i,j) -= element->value() * B(element->index(),j);
691 template<
typename MT
693 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
731 template<
typename MT
733 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
738 typedef typename SelectType< SO, OppositeType, ResultType >::Type TmpType;
750 const TmpType tmp( rhs );
771 template<
typename MT
773 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
815 template<
typename MT
817 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
903 template<
typename T1
905 inline const SMatTDMatMultExpr<T1,T2>
911 throw std::invalid_argument(
"Matrix sizes do not match" );
928 template<
typename MT1,
typename MT2,
typename VT >
933 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
934 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
935 IsDenseVector<VT>::value && IsColumnVector<VT>::value
936 ,
typename SMatDVecMultExprTrait< MT1, typename TDMatDVecMultExprTrait<MT2,VT>::Type >::Type
937 , INVALID_TYPE >::Type Type;
946 template<
typename MT1,
typename MT2,
typename VT >
951 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
952 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
953 IsSparseVector<VT>::value && IsColumnVector<VT>::value
954 ,
typename SMatDVecMultExprTrait< MT1, typename TDMatSVecMultExprTrait<MT2,VT>::Type >::Type
955 , INVALID_TYPE >::Type Type;
964 template<
typename VT,
typename MT1,
typename MT2 >
969 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
970 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
971 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
972 ,
typename TDVecTDMatMultExprTrait< typename TDVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
973 , INVALID_TYPE >::Type Type;
982 template<
typename VT,
typename MT1,
typename MT2 >
987 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
988 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
989 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
990 ,
typename TSVecTDMatMultExprTrait< typename TSVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
991 , INVALID_TYPE >::Type Type;
1000 template<
typename MT1,
typename MT2,
bool AF >
1005 typedef typename MultExprTrait< typename SubmatrixExprTrait<const MT1,AF>::Type
1006 ,
typename SubmatrixExprTrait<const MT2,AF>::Type >::Type Type;
1015 template<
typename MT1,
typename MT2 >
1020 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
1029 template<
typename MT1,
typename MT2 >
1034 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: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
MT1::CompositeType CT1
Composite type of the left-hand side sparse matrix expression.
Definition: SMatTDMatMultExpr.h:118
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.
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:199
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: SMatTDMatMultExpr.h:289
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.
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
const ResultType CompositeType
Data type for composite expression templates.
Definition: SMatTDMatMultExpr.h:153
Header file for the TDVecSMatMultExprTrait class template.
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
LeftOperand lhs_
Left-hand side sparse matrix of the multiplication expression.
Definition: SMatTDMatMultExpr.h:328
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:114
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:115
Header file for the TSVecSMatMultExprTrait class template.
RightOperand rightOperand() const
Returns the right-hand side transpose dense matrix operand.
Definition: SMatTDMatMultExpr.h:277
size_t columns() const
Returns the current number of columns of the matrix.
Definition: SMatTDMatMultExpr.h:257
SMatTDMatMultExpr(const MT1 &lhs, const MT2 &rhs)
Constructor for the SMatTDMatMultExpr class.
Definition: SMatTDMatMultExpr.h:183
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
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
const size_t SMP_SMATTDMATMULT_THRESHOLD
SMP row-major sparse matrix/column-major dense matrix multiplication threshold.This threshold specifi...
Definition: Thresholds.h:1041
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:311
#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 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:271
Header file for the DMatDVecMultExprTrait class template.
size_t rows() const
Returns the current number of rows of the matrix.
Definition: SMatTDMatMultExpr.h:247
Expression object for sparse matrix-transpose dense matrix multiplications.The SMatTDMatMultExpr clas...
Definition: Forward.h:100
#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: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.
Header file for the EnableIf class template.
Header file for the serial shim.
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:92
RT1::ElementType ET1
Element type of the left-hand side dense matrix expression.
Definition: SMatTDMatMultExpr.h:116
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:117
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:321
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:301
LeftOperand leftOperand() const
Returns the left-hand side sparse matrix operand.
Definition: SMatTDMatMultExpr.h:267
Header file for the reset shim.
MT2::CompositeType CT2
Composite type of the right-hand side dense matrix expression.
Definition: SMatTDMatMultExpr.h:119
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
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.
#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:329
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
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:198
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.
#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:301
Header file for the IsExpression type trait class.
Header file for the FunctionTrace class.