35 #ifndef _BLAZE_MATH_EXPRESSIONS_TSMATSMATMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_TSMATSMATMULTEXPR_H_
118 template<
typename MT1
120 class TSMatSMatMultExpr :
public SparseMatrix< TSMatSMatMultExpr<MT1,MT2>, true >
121 ,
private MatMatMultExpr
122 ,
private Computation
151 template<
typename T1,
typename T2,
typename T3 >
152 struct CanExploitSymmetry {
153 enum { value = ( IsRowMajorMatrix<T1>::value && IsSymmetric<T2>::value ) ||
154 ( IsColumnMajorMatrix<T1>::value && IsSymmetric<T3>::value ) };
166 template<
typename T1,
typename T2,
typename T3 >
167 struct IsEvaluationRequired {
168 enum { value = ( evaluateLeft || evaluateRight ) &&
169 !CanExploitSymmetry<T1,T2,T2>::value };
193 enum { smpAssignable = !evaluateLeft && MT1::smpAssignable &&
194 !evaluateRight && MT2::smpAssignable };
224 if(
lhs_.columns() != 0UL )
231 tmp =
lhs_(i,kbegin) *
rhs_(kbegin,j);
232 for(
size_t k=kbegin+1UL; k<kend; ++k ) {
257 return rhs_.columns();
309 template<
typename T >
311 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
321 template<
typename T >
323 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
356 template<
typename MT
366 CT1 A(
serial( rhs.lhs_ ) );
367 CT2 B(
serial( rhs.rhs_ ) );
376 TSMatSMatMultExpr::selectAssignKernel( ~lhs, A, B );
395 template<
typename MT3
398 static inline void selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
403 for(
size_t j=0UL; j<A.columns(); ++j ) {
404 const LeftIterator lend( A.end(j) );
405 for( LeftIterator lelem=A.begin(j); lelem!=lend; ++lelem ) {
406 const RightIterator rend( B.end(j) );
407 for( RightIterator relem=B.begin(j); relem!=rend; ++relem )
410 isDefault( C(lelem->index(),relem->index()) ) ) {
411 C(lelem->index(),relem->index()) = lelem->value() * relem->value();
414 C(lelem->index(),relem->index()) += lelem->value() * relem->value();
436 template<
typename MT >
437 friend inline typename DisableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
450 assign( ~lhs, tmp * rhs.rhs_ );
468 template<
typename MT >
469 friend inline typename DisableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
480 assign( ~lhs, rhs.lhs_ * tmp );
500 template<
typename MT >
501 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
531 template<
typename MT >
532 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
558 template<
typename MT
560 friend inline typename DisableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
568 CT1 A(
serial( rhs.lhs_ ) );
569 CT2 B(
serial( rhs.rhs_ ) );
578 TSMatSMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
597 template<
typename MT3
600 static inline void selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
605 for(
size_t j=0UL; j<A.columns(); ++j ) {
606 const LeftIterator lend( A.end(j) );
607 for( LeftIterator lelem=A.begin(j); lelem!=lend; ++lelem ) {
608 const RightIterator rend( B.end(j) );
609 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
610 C(lelem->index(),relem->index()) += lelem->value() * relem->value();
633 template<
typename MT >
634 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
664 template<
typename MT >
665 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
695 template<
typename MT
704 CT1 A(
serial( rhs.lhs_ ) );
705 CT2 B(
serial( rhs.rhs_ ) );
714 TSMatSMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
733 template<
typename MT3
736 static inline void selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
741 for(
size_t j=0UL; j<A.columns(); ++j ) {
742 const LeftIterator lend( A.end(j) );
743 for( LeftIterator lelem=A.begin(j); lelem!=lend; ++lelem ) {
744 const RightIterator rend( B.end(j) );
745 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
746 C(lelem->index(),relem->index()) -= lelem->value() * relem->value();
769 template<
typename MT >
770 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
800 template<
typename MT >
801 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
842 template<
typename MT
844 friend inline typename EnableIf< IsEvaluationRequired<MT,MT1,MT2> >::Type
882 template<
typename MT >
883 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
913 template<
typename MT >
914 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
943 template<
typename MT
945 friend inline typename EnableIf< IsEvaluationRequired<MT,MT1,MT2> >::Type
983 template<
typename MT >
984 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
1014 template<
typename MT >
1015 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
1048 template<
typename MT
1050 friend inline typename EnableIf< IsEvaluationRequired<MT,MT1,MT2> >::Type
1088 template<
typename MT >
1089 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
1119 template<
typename MT >
1120 friend inline typename EnableIf< CanExploitSymmetry<MT,MT1,MT2> >::Type
1196 template<
typename T1
1198 inline const TSMatSMatMultExpr<T1,T2>
1204 throw std::invalid_argument(
"Matrix sizes do not match" );
1221 template<
typename MT1,
typename MT2 >
1239 template<
typename MT1,
typename MT2 >
1241 :
public Columns<MT2>
1257 template<
typename MT1,
typename MT2 >
1259 :
public IsTrue< And< IsLower<MT1>, IsLower<MT2> >::value >
1275 template<
typename MT1,
typename MT2 >
1277 :
public IsTrue< And< IsUniLower<MT1>, IsUniLower<MT2> >::value >
1293 template<
typename MT1,
typename MT2 >
1295 :
public IsTrue< Or< And< IsStrictlyLower<MT1>, IsLower<MT2> >
1296 , And< IsStrictlyLower<MT2>, IsLower<MT1> > >::value >
1312 template<
typename MT1,
typename MT2 >
1314 :
public IsTrue< And< IsUpper<MT1>, IsUpper<MT2> >::value >
1330 template<
typename MT1,
typename MT2 >
1332 :
public IsTrue< And< IsUniUpper<MT1>, IsUniUpper<MT2> >::value >
1348 template<
typename MT1,
typename MT2 >
1350 :
public IsTrue< Or< And< IsStrictlyUpper<MT1>, IsUpper<MT2> >
1351 , And< IsStrictlyUpper<MT2>, IsUpper<MT1> > >::value >
1367 template<
typename MT1,
typename MT2,
typename VT >
1372 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1373 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1374 IsDenseVector<VT>::value && IsColumnVector<VT>::value
1375 ,
typename TSMatDVecMultExprTrait< MT1, typename SMatDVecMultExprTrait<MT2,VT>::Type >::Type
1376 , INVALID_TYPE >::Type Type;
1385 template<
typename MT1,
typename MT2,
typename VT >
1390 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1391 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1392 IsSparseVector<VT>::value && IsColumnVector<VT>::value
1393 ,
typename TSMatDVecMultExprTrait< MT1, typename SMatDVecMultExprTrait<MT2,VT>::Type >::Type
1394 , INVALID_TYPE >::Type Type;
1403 template<
typename VT,
typename MT1,
typename MT2 >
1408 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1409 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1410 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
1411 ,
typename TDVecSMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
1412 , INVALID_TYPE >::Type Type;
1421 template<
typename VT,
typename MT1,
typename MT2 >
1426 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
1427 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1428 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
1429 ,
typename TDVecSMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
1430 , INVALID_TYPE >::Type Type;
1439 template<
typename MT1,
typename MT2,
bool AF >
1444 typedef typename MultExprTrait< typename SubmatrixExprTrait<const MT1,AF>::Type
1445 ,
typename SubmatrixExprTrait<const MT2,AF>::Type >::Type Type;
1454 template<
typename MT1,
typename MT2 >
1459 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
1468 template<
typename MT1,
typename MT2 >
1473 typedef typename MultExprTrait< MT1, typename ColumnExprTrait<const MT2>::Type >::Type Type;
const MT::ElementType max(const DenseMatrix< MT, SO > &dm)
Returns the largest element of the dense matrix.
Definition: DenseMatrix.h:1649
Header file for the SMatDVecMultExprTrait class template.
Header file for the Rows type trait.
Header file for the UNUSED_PARAMETER function template.
Header file for the IsUniUpper type trait.
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:8247
SelectType< IsExpression< MT1 >::value, const MT1, const MT1 & >::Type LeftOperand
Composite type of the left-hand side sparse matrix expression.
Definition: TSMatSMatMultExpr.h:185
Header file for basic type definitions.
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: TSMatSMatMultExpr.h:179
Header file for the IsSparseMatrix type trait.
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:209
Header file for the ColumnExprTrait class template.
Header file for the IsColumnMajorMatrix type trait.
Header file for the TSVecTSMatMultExprTrait class template.
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:2507
Header file for the IsRowVector type trait.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:261
void UNUSED_PARAMETER(const T1 &)
Suppression of unused parameter warnings.
Definition: Unused.h:81
Header file for the And class template.
Compile time check for lower triangular matrices.This type trait tests whether or not the given templ...
Definition: IsLower.h:90
Header file for the TDVecSMatMultExprTrait class template.
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: TSMatSMatMultExpr.h:310
const DMatSerialExpr< MT, SO > serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:699
bool canSMPAssign() const
Returns whether the expression can be used in SMP assignments.
Definition: TSMatSMatMultExpr.h:332
Header file for the Computation base class.
Header file for the MatMatMultExpr base class.
Compile time check for upper triangular matrices.This type trait tests whether or not the given templ...
Definition: IsUpper.h:90
Header file for the RequiresEvaluation type trait.
Header file for the TSVecSMatMultExprTrait class template.
Header file for the IsUniLower type trait.
CompressedMatrix< Type, false > OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: CompressedMatrix.h:2503
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
bool isDefault(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is in default state.
Definition: DiagonalProxy.h:861
MT2::CompositeType CT2
Composite type of the right-hand side sparse matrix expression.
Definition: TSMatSMatMultExpr.h:129
const size_t SMP_TSMATSMATMULT_THRESHOLD
SMP column-major sparse matrix/row-major sparse matrix multiplication threshold.This threshold specif...
Definition: Thresholds.h:1156
size_t nonZeros(size_t i) const
Returns the number of non-zero elements in the specified row.
Definition: TSMatSMatMultExpr.h:277
Header file for the SparseMatrix base class.
SelectType< IsExpression< MT2 >::value, const MT2, const MT2 & >::Type RightOperand
Composite type of the right-hand side sparse matrix expression.
Definition: TSMatSMatMultExpr.h:188
Constraint on the data type.
Header file for the MultExprTrait class template.
const ElementType ReturnType
Return type for expression template evaluations.
Definition: TSMatSMatMultExpr.h:181
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.
Header file for the IsStrictlyUpper type trait.
Header file for the IsSymmetric type trait.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
size_t rows() const
Returns the current number of rows of the matrix.
Definition: TSMatSMatMultExpr.h:246
#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:2511
RightOperand rightOperand() const
Returns the right-hand side sparse matrix operand.
Definition: TSMatSMatMultExpr.h:298
Header file for the Or class template.
Header file for the TDVecTSMatMultExprTrait class template.
const MT::ElementType min(const DenseMatrix< MT, SO > &dm)
Returns the smallest element of the dense matrix.
Definition: DenseMatrix.h:1602
TSMatSMatMultExpr< MT1, MT2 > This
Type of this TSMatSMatMultExpr instance.
Definition: TSMatSMatMultExpr.h:176
BLAZE_ALWAYS_INLINE 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:635
Header file for the Columns type trait.
Header file for the TSMatDVecMultExprTrait class template.
Header file for the IsLower type trait.
LeftOperand leftOperand() const
Returns the left-hand side transpose sparse matrix operand.
Definition: TSMatSMatMultExpr.h:288
TSMatSMatMultExpr(const MT1 &lhs, const MT2 &rhs)
Constructor for the TSMatSMatMultExpr class.
Definition: TSMatSMatMultExpr.h:203
Header file for the SMatSVecMultExprTrait class template.
Constraints on the storage order of matrix types.
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 complete DynamicVector implementation.
Header file for the EnableIf class template.
Header file for the IsStrictlyLower type trait.
Header file for the serial shim.
#define BLAZE_CONSTRAINT_MUST_FORM_VALID_MATMATMULTEXPR(T1, T2)
Constraint on the data type.In case the given data types T1 and T2 do not form a valid matrix/matrix ...
Definition: MatMatMultExpr.h:165
Compile time check for resizable data types.This type trait tests whether the given data type is a re...
Definition: IsResizable.h:75
size_t nonZeros() const
Returns the number of non-zero elements in the sparse matrix.
Definition: TSMatSMatMultExpr.h:266
EnableIf< IsDenseMatrix< MT1 > >::Type smpSubAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP subtraction assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:160
Header file for the IsSparseVector type trait.
#define BLAZE_CONSTRAINT_MUST_NOT_BE_SYMMETRIC_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a symmetric matrix type, a compilation error is created.
Definition: Symmetric.h:116
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
MultTrait< RT1, RT2 >::Type ResultType
Result type for expression template evaluations.
Definition: TSMatSMatMultExpr.h:177
Header file for run time assertion macros.
size_t columns() const
Returns the current number of columns of the matrix.
Definition: TSMatSMatMultExpr.h:256
EnableIf< IsDenseMatrix< MT1 > >::Type smpAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:98
Utility type for generic codes.
Base template for the MultTrait class.
Definition: MultTrait.h:150
ResultType::ElementType ElementType
Resulting element type.
Definition: TSMatSMatMultExpr.h:180
BLAZE_ALWAYS_INLINE 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:742
MT1::CompositeType CT1
Composite type of the left-hand side sparse matrix expression.
Definition: TSMatSMatMultExpr.h:128
ResultType::OppositeType OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: TSMatSMatMultExpr.h:178
const ResultType CompositeType
Data type for composite expression templates.
Definition: TSMatSMatMultExpr.h:182
Header file for the isDefault shim.
Constraint on the data type.
Expression object for transpose sparse matrix-sparse matrix multiplications.The TSMatSMatMultExpr cla...
Definition: Forward.h:140
Substitution Failure Is Not An Error (SFINAE) class.The DisableIf class template is an auxiliary tool...
Definition: DisableIf.h:184
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: TSMatSMatMultExpr.h:322
Header file for the IsRowMajorMatrix type trait.
LeftOperand lhs_
Left-hand side sparse matrix of the multiplication expression.
Definition: TSMatSMatMultExpr.h:339
const DMatTransExpr< MT,!SO > trans(const DenseMatrix< MT, SO > &dm)
Calculation of the transpose of the given dense matrix.
Definition: DMatTransExpr.h:937
Header file for the IsComputation type trait class.
EnableIf< IsDenseMatrix< MT1 > >::Type smpAddAssign(Matrix< 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:129
#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:2502
Header file for the IsTrue value trait.
MT1::ResultType RT1
Result type of the left-hand side sparse matrix expression.
Definition: TSMatSMatMultExpr.h:126
Header file for the IsUpper type trait.
Header file for the IsColumnVector type trait.
Constraint on the data type.
RightOperand rhs_
Right-hand side sparse matrix of the multiplication expression.
Definition: TSMatSMatMultExpr.h:340
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: TSMatSMatMultExpr.h:218
Header file for the IsResizable type trait.
MT2::ResultType RT2
Result type of the right-hand side sparse matrix expression.
Definition: TSMatSMatMultExpr.h:127
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.
BLAZE_ALWAYS_INLINE 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:849