35 #ifndef _BLAZE_MATH_EXPRESSIONS_TSMATTSMATMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_TSMATTSMATMULTEXPR_H_
106 template<
typename MT1
108 class TSMatTSMatMultExpr :
public SparseMatrix< TSMatTSMatMultExpr<MT1,MT2>, true >
109 ,
private MatMatMultExpr
110 ,
private Computation
136 template<
typename MT >
137 struct UseSMPAssign {
138 enum { value = ( evaluateLeft || evaluateRight ) };
162 enum { smpAssignable = !evaluateLeft && MT1::smpAssignable &&
163 !evaluateRight && MT2::smpAssignable };
196 if(
lhs_.columns() == 0UL )
205 const ConstIterator end( B.end(j) );
206 ConstIterator element( B.begin(j) );
213 tmp =
lhs_(i,element->index()) * element->value();
215 for( ; element!=end; ++element )
216 tmp +=
lhs_(i,element->index()) * element->value();
222 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
247 return rhs_.columns();
299 template<
typename T >
301 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
311 template<
typename T >
313 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
346 template<
typename MT
365 TSMatTSMatMultExpr::selectAssignKernel( ~lhs, A, B );
384 template<
typename MT3
387 static inline void selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
392 for(
size_t j=0UL; j<C.columns(); ++j ) {
393 const RightIterator rend( B.end(j) );
394 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
395 const LeftIterator lend( A.end( relem->index() ) );
396 for( LeftIterator lelem=A.begin( relem->index() ); lelem!=lend; ++lelem )
400 C(lelem->index(),j) = lelem->value() * relem->value();
403 C(lelem->index(),j) += lelem->value() * relem->value();
425 template<
typename MT >
437 (~lhs).reserve( tmp.nonZeros() );
456 template<
typename MT >
478 size_t nonzeros( 0UL );
480 for(
size_t j=0UL; j<(~lhs).
columns(); ++j ) {
481 const RightIterator rend( B.end(j) );
482 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
483 nonzeros += A.nonZeros( relem->index() );
487 if( nonzeros > (~lhs).rows() * (~lhs).
columns() ) {
491 (~lhs).reserve( nonzeros );
496 std::vector<byte> valid ( (~lhs).
rows(), 0 );
497 std::vector<size_t> indices( (~lhs).
rows(), 0UL );
498 size_t minIndex(
inf ), maxIndex( 0UL );
500 for(
size_t j=0UL; j<(~lhs).
columns(); ++j )
502 const RightIterator rend( B.end(j) );
503 for( RightIterator relem=B.begin(j); relem!=rend; ++relem )
505 const LeftIterator lend( A.end( relem->index() ) );
506 for( LeftIterator lelem=A.begin( relem->index() ); lelem!=lend; ++lelem )
508 if( !valid[lelem->index()] ) {
509 values[lelem->index()] = lelem->value() * relem->value();
510 valid [lelem->index()] = 1;
511 indices[nonzeros] = lelem->index();
513 if( lelem->index() < minIndex ) minIndex = lelem->index();
514 if( lelem->index() > maxIndex ) maxIndex = lelem->index();
517 values[lelem->index()] += lelem->value() * relem->value();
528 if( ( nonzeros + nonzeros ) < ( maxIndex - minIndex ) )
530 std::sort( indices.begin(), indices.begin() + nonzeros );
532 for(
size_t i=0UL; i<nonzeros; ++i )
534 const size_t index( indices[i] );
536 (~lhs).append( index, j, values[index] );
537 reset( values[index] );
540 reset( valid [index] );
544 for(
size_t i=minIndex; i<=maxIndex; ++i )
547 (~lhs).append( i, j, values[i] );
560 (~lhs).finalize( j );
579 template<
typename MT
598 TSMatTSMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
617 template<
typename MT3
620 static inline void selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
625 for(
size_t j=0UL; j<C.columns(); ++j ) {
626 const RightIterator rend( B.end(j) );
627 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
628 const LeftIterator lend( A.end( relem->index() ) );
629 for( LeftIterator lelem=A.begin( relem->index() ); lelem!=lend; ++lelem ) {
630 C(lelem->index(),j) += lelem->value() * relem->value();
655 template<
typename MT
677 TSMatTSMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
696 template<
typename MT3
699 static inline void selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
704 for(
size_t j=0UL; j<C.columns(); ++j ) {
705 const RightIterator rend( B.end(j) );
706 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
707 const LeftIterator lend( A.end( relem->index() ) );
708 for( LeftIterator lelem=A.begin( relem->index() ); lelem!=lend; ++lelem ) {
709 C(lelem->index(),j) -= lelem->value() * relem->value();
744 template<
typename MT
746 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
784 template<
typename MT >
785 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
823 template<
typename MT
825 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
867 template<
typename MT
869 friend inline typename EnableIf< UseSMPAssign<MT> >::Type
951 template<
typename T1
953 inline const TSMatTSMatMultExpr<T1,T2>
959 throw std::invalid_argument(
"Matrix sizes do not match" );
976 template<
typename MT1,
typename MT2,
typename VT >
981 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
982 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
983 IsDenseVector<VT>::value && IsColumnVector<VT>::value
984 ,
typename TSMatDVecMultExprTrait< MT1, typename TSMatDVecMultExprTrait<MT2,VT>::Type >::Type
985 , INVALID_TYPE >::Type Type;
994 template<
typename MT1,
typename MT2,
typename VT >
999 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1000 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1001 IsSparseVector<VT>::value && IsColumnVector<VT>::value
1002 ,
typename TSMatDVecMultExprTrait< MT1, typename TSMatDVecMultExprTrait<MT2,VT>::Type >::Type
1003 , INVALID_TYPE >::Type Type;
1012 template<
typename VT,
typename MT1,
typename MT2 >
1017 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1018 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1019 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
1020 ,
typename TDVecTSMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
1021 , INVALID_TYPE >::Type Type;
1030 template<
typename VT,
typename MT1,
typename MT2 >
1035 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
1036 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1037 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
1038 ,
typename TSVecTSMatMultExprTrait< typename TSVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
1039 , INVALID_TYPE >::Type Type;
1048 template<
typename MT1,
typename MT2,
bool AF >
1053 typedef typename MultExprTrait< typename SubmatrixExprTrait<const MT1,AF>::Type
1054 ,
typename SubmatrixExprTrait<const MT2,AF>::Type >::Type Type;
1063 template<
typename MT1,
typename MT2 >
1068 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
1077 template<
typename MT1,
typename MT2 >
1082 typedef typename MultExprTrait< MT1, typename ColumnExprTrait<const MT2>::Type >::Type Type;
void reset(DynamicMatrix< Type, SO > &m)
Resetting the given dense matrix.
Definition: DynamicMatrix.h:4599
Header file for the UNUSED_PARAMETER function template.
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
MT2::CompositeType CT2
Composite type of the right-hand side sparse matrix expression.
Definition: TSMatTSMatMultExpr.h:117
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
bool canSMPAssign() const
Returns whether the expression can be used in SMP assignments.
Definition: TSMatTSMatMultExpr.h:322
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
Header file for the ColumnExprTrait class template.
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: TSMatTSMatMultExpr.h:148
const ElementType ReturnType
Return type for expression template evaluations.
Definition: TSMatTSMatMultExpr.h:150
Header file for the IsColumnMajorMatrix type trait.
MT1::ResultType RT1
Result type of the left-hand side sparse matrix expression.
Definition: TSMatTSMatMultExpr.h:114
Header file for the TSVecTSMatMultExprTrait class template.
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
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: TSMatTSMatMultExpr.h:187
void UNUSED_PARAMETER(const T1 &)
Suppression of unused parameter warnings.
Definition: Unused.h:84
LeftOperand leftOperand() const
Returns the left-hand side transpose sparse matrix operand.
Definition: TSMatTSMatMultExpr.h:278
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
TSMatTSMatMultExpr(const MT1 &lhs, const MT2 &rhs)
Constructor for the TSMatTSMatMultExpr class.
Definition: TSMatTSMatMultExpr.h:172
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: TSMatTSMatMultExpr.h:300
Header file for the Computation base class.
Header file for the MatMatMultExpr base class.
Header file for the RequiresEvaluation type trait.
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
RightOperand rightOperand() const
Returns the right-hand side transpose sparse matrix operand.
Definition: TSMatTSMatMultExpr.h:288
Header file for the SparseMatrix base class.
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
RightOperand rhs_
Right-hand side sparse matrix of the multiplication expression.
Definition: TSMatTSMatMultExpr.h:330
size_t columns() const
Returns the current number of columns of the matrix.
Definition: TSMatTSMatMultExpr.h:246
size_t nonZeros(size_t i) const
Returns the number of non-zero elements in the specified row.
Definition: TSMatTSMatMultExpr.h:267
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 multiplication trait.
LeftOperand lhs_
Left-hand side sparse matrix of the multiplication expression.
Definition: TSMatTSMatMultExpr.h:329
const size_t SMP_TSMATTSMATMULT_THRESHOLD
SMP column-major sparse matrix/column-major sparse matrix multiplication threshold.This threshold specifies when a column-major sparse matrix/column-major sparse matrix multiplication can be executed in parallel. 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:1179
#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
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2412
MultTrait< RT1, RT2 >::Type ResultType
Result type for expression template evaluations.
Definition: TSMatTSMatMultExpr.h:146
Header file for the TDVecTSMatMultExprTrait class template.
Header file for the TSMatDVecMultExprTrait class template.
Numerical infinity for built-in data types.
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
ResultType::OppositeType OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: TSMatTSMatMultExpr.h:147
Expression object for transpose sparse matrix-transpose sparse matrix multiplications.The TSMatTSMatMultExpr class represents the compile time expression for multiplications between two column-major sparse matrices.
Definition: Forward.h:145
Constraint on the data type.
Constraints on the storage order of matrix types.
Constraint on the data type.
size_t nonZeros() const
Returns the number of non-zero elements in the sparse matrix.
Definition: TSMatTSMatMultExpr.h:256
Header file for the SelectType class template.
Header file for the RowExprTrait class template.
Header file for all forward declarations for expression class templates.
Constraint on the data type.
Header file for the EnableIf class template.
Header file for the serial shim.
Header file for the byte type.
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
SelectType< IsExpression< MT1 >::value, const MT1, const MT1 & >::Type LeftOperand
Composite type of the left-hand side sparse matrix expression.
Definition: TSMatTSMatMultExpr.h:154
Compile time check for resizable data types.This type trait tests whether the given data type is a re...
Definition: IsResizable.h:75
Header file for the IsSparseVector type trait.
Header file for the SubmatrixExprTrait class template.
Removal of reference modifiers.The RemoveCV type trait removes any reference modifiers from the given...
Definition: RemoveReference.h:69
TSMatTSMatMultExpr< MT1, MT2 > This
Type of this TSMatTSMatMultExpr instance.
Definition: TSMatTSMatMultExpr.h:145
size_t rows() const
Returns the current number of rows of the matrix.
Definition: TSMatTSMatMultExpr.h:236
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
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
ResultType::ElementType ElementType
Resulting element type.
Definition: TSMatTSMatMultExpr.h:149
Header file for the isDefault shim.
MT2::ResultType RT2
Result type of the right-hand side sparse matrix expression.
Definition: TSMatTSMatMultExpr.h:115
const Infinity inf
Global Infinity instance.The blaze::inf instance can be used wherever a built-in data type is expecte...
Definition: Infinity.h:1098
const ResultType CompositeType
Data type for composite expression templates.
Definition: TSMatTSMatMultExpr.h:151
Header file for the RemoveReference type trait.
MT1::CompositeType CT1
Composite type of the left-hand side sparse matrix expression.
Definition: TSMatTSMatMultExpr.h:116
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: TSMatTSMatMultExpr.h:312
Header file for the IsComputation type trait class.
Header file for the IsBuiltin type trait.
#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 IsColumnVector type trait.
Header file for the IsResizable type trait.
SelectType< IsExpression< MT2 >::value, const MT2, const MT2 & >::Type RightOperand
Composite type of the right-hand side sparse matrix expression.
Definition: TSMatTSMatMultExpr.h:157
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
#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 TSMatSVecMultExprTrait class template.
Header file for the FunctionTrace class.