35#ifndef _BLAZE_MATH_EXPRESSIONS_DMATTDMATADDEXPR_H_
36#define _BLAZE_MATH_EXPRESSIONS_DMATTDMATADDEXPR_H_
93 :
public MatMatAddExpr< DenseMatrix< DMatTDMatAddExpr<MT1,MT2>, false > >
113 static constexpr bool returnExpr = ( !IsTemporary_v<RN1> && !IsTemporary_v<RN2> );
128 ( RequiresEvaluation_v<MT1> || RequiresEvaluation_v<MT2> || !
returnExpr );
132 template<
typename MT >
133 static constexpr bool UseAssign_v =
useAssign;
145 template<
typename MT >
146 static constexpr bool UseSMPAssign_v =
147 ( ( !MT1::smpAssignable || !MT2::smpAssignable ) &&
useAssign );
182 static constexpr bool smpAssignable = ( MT1::smpAssignable && MT2::smpAssignable );
223 if( i >=
lhs_.rows() ) {
226 if( j >=
lhs_.columns() ) {
238 inline size_t rows() const noexcept {
249 return lhs_.columns();
279 template<
typename T >
280 inline bool canAlias(
const T* alias )
const noexcept {
281 return ( IsExpression_v<MT1> && ( RequiresEvaluation_v<MT1> ?
lhs_.isAliased( alias ) :
lhs_.canAlias( alias ) ) ) ||
282 ( IsExpression_v<MT2> && ( RequiresEvaluation_v<MT2> ?
rhs_.isAliased( alias ) :
rhs_.canAlias( alias ) ) );
292 template<
typename T >
293 inline bool isAliased(
const T* alias )
const noexcept {
294 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
304 return lhs_.isAligned() &&
rhs_.isAligned();
314 return lhs_.canSMPAssign() ||
rhs_.canSMPAssign() ||
315 (
rows() *
columns() >= SMP_DMATTDMATADD_THRESHOLD );
339 template<
typename MT
349 constexpr size_t block( BLOCK_SIZE );
351 const size_t m( rhs.rows() );
352 const size_t n( rhs.columns() );
354 for(
size_t ii=0UL; ii<m; ii+=block ) {
355 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
356 for(
size_t jj=0UL; jj<n; jj+=block ) {
357 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
358 for(
size_t i=ii; i<iend; ++i ) {
359 for(
size_t j=jj; j<jend; ++j ) {
360 (*lhs)(i,j) = rhs.lhs_(i,j) + rhs.rhs_(i,j);
383 template<
typename MT
393 if( !IsOperation_v<MT1> &&
isSame( *lhs, rhs.lhs_ ) ) {
394 addAssign( *lhs, rhs.rhs_ );
396 else if( !IsOperation_v<MT2> &&
isSame( *lhs, rhs.rhs_ ) ) {
397 addAssign( *lhs, rhs.lhs_ );
399 else if( !RequiresEvaluation_v<MT2> ) {
400 assign ( *lhs, rhs.rhs_ );
401 addAssign( *lhs, rhs.lhs_ );
404 assign ( *lhs, rhs.lhs_ );
405 addAssign( *lhs, rhs.rhs_ );
423 template<
typename MT
425 friend inline void assign( SparseMatrix<MT,SO>& lhs,
const DMatTDMatAddExpr& rhs )
429 using TmpType = If_t< SO, OppositeType, ResultType >;
441 const TmpType tmp(
serial( rhs ) );
461 template<
typename MT
463 friend inline auto addAssign( DenseMatrix<MT,SO>& lhs,
const DMatTDMatAddExpr& rhs )
464 -> DisableIf_t< UseAssign_v<MT> >
471 constexpr size_t block( BLOCK_SIZE );
473 const size_t m( rhs.rows() );
474 const size_t n( rhs.columns() );
476 for(
size_t ii=0UL; ii<m; ii+=block ) {
477 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
478 for(
size_t jj=0UL; jj<n; jj+=block ) {
479 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
480 for(
size_t i=ii; i<iend; ++i ) {
481 for(
size_t j=jj; j<jend; ++j ) {
482 (*lhs)(i,j) += rhs.lhs_(i,j) + rhs.rhs_(i,j);
505 template<
typename MT
507 friend inline auto addAssign( DenseMatrix<MT,SO>& lhs,
const DMatTDMatAddExpr& rhs )
508 -> EnableIf_t< UseAssign_v<MT> >
515 if( !RequiresEvaluation_v<MT2> ) {
516 addAssign( *lhs, rhs.rhs_ );
517 addAssign( *lhs, rhs.lhs_ );
520 addAssign( *lhs, rhs.lhs_ );
521 addAssign( *lhs, rhs.rhs_ );
545 template<
typename MT
547 friend inline auto subAssign( DenseMatrix<MT,SO>& lhs,
const DMatTDMatAddExpr& rhs )
548 -> DisableIf_t< UseAssign_v<MT> >
555 constexpr size_t block( BLOCK_SIZE );
557 const size_t m( rhs.rows() );
558 const size_t n( rhs.columns() );
560 for(
size_t ii=0UL; ii<m; ii+=block ) {
561 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
562 for(
size_t jj=0UL; jj<n; jj+=block ) {
563 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
564 for(
size_t i=ii; i<iend; ++i ) {
565 for(
size_t j=jj; j<jend; ++j ) {
566 (*lhs)(i,j) -= rhs.lhs_(i,j) + rhs.rhs_(i,j);
589 template<
typename MT
591 friend inline auto subAssign( DenseMatrix<MT,SO>& lhs,
const DMatTDMatAddExpr& rhs )
592 -> EnableIf_t< UseAssign_v<MT> >
599 if( !RequiresEvaluation_v<MT2> ) {
600 subAssign( *lhs, rhs.rhs_ );
601 subAssign( *lhs, rhs.lhs_ );
604 subAssign( *lhs, rhs.lhs_ );
605 subAssign( *lhs, rhs.rhs_ );
630 template<
typename MT
632 friend inline auto schurAssign( DenseMatrix<MT,SO>& lhs,
const DMatTDMatAddExpr& rhs )
633 -> DisableIf_t< UseAssign_v<MT> >
645 schurAssign( *lhs, tmp );
676 template<
typename MT
679 -> EnableIf_t< UseSMPAssign_v<MT> >
686 if( !IsOperation_v<MT1> &&
isSame( *lhs, rhs.lhs_ ) ) {
689 else if( !IsOperation_v<MT2> &&
isSame( *lhs, rhs.rhs_ ) ) {
692 else if( !RequiresEvaluation_v<MT2> ) {
718 template<
typename MT
721 -> EnableIf_t< UseSMPAssign_v<MT> >
725 using TmpType = If_t< SO, OppositeType, ResultType >;
737 const TmpType tmp( rhs );
758 template<
typename MT
761 -> EnableIf_t< UseSMPAssign_v<MT> >
768 if( !RequiresEvaluation_v<MT2> ) {
799 template<
typename MT
802 -> EnableIf_t< UseSMPAssign_v<MT> >
809 if( !RequiresEvaluation_v<MT2> ) {
840 template<
typename MT
843 -> EnableIf_t< UseSMPAssign_v<MT> >
906template<
typename MT1
908 , EnableIf_t< !IsSymmetric_v<MT1> && !IsSymmetric_v<MT2> >* =
nullptr >
909inline const DMatTDMatAddExpr<MT1,MT2>
910 dmattdmatadd(
const DenseMatrix<MT1,false>& lhs,
const DenseMatrix<MT2,true>& rhs )
917 return DMatTDMatAddExpr<MT1,MT2>( *lhs, *rhs );
936template<
typename MT1
938 , EnableIf_t< IsSymmetric_v<MT1> && !IsSymmetric_v<MT2> >* =
nullptr >
940 dmattdmatadd(
const DenseMatrix<MT1,false>& lhs,
const DenseMatrix<MT2,true>& rhs )
947 return trans( *lhs ) + *rhs;
966template<
typename MT1
968 , EnableIf_t< IsSymmetric_v<MT2> >* =
nullptr >
970 dmattdmatadd(
const DenseMatrix<MT1,false>& lhs,
const DenseMatrix<MT2,true>& rhs )
977 return (*lhs) +
trans( *rhs );
1012template<
typename MT1
1014inline decltype(
auto)
1019 if( (*lhs).rows() != (*rhs).rows() || (*lhs).columns() != (*rhs).columns() ) {
1023 return dmattdmatadd( *lhs, *rhs );
1041template<
typename MT1
1043 , EnableIf_t< !IsSymmetric_v<MT1> && !IsSymmetric_v<MT2> >* =
nullptr >
1044inline const DMatTDMatAddExpr<MT2,MT1>
1045 tdmatdmatadd(
const DenseMatrix<MT1,true>& lhs,
const DenseMatrix<MT2,false>& rhs )
1052 return DMatTDMatAddExpr<MT2,MT1>( *rhs, *lhs );
1071template<
typename MT1
1073 , EnableIf_t< !IsSymmetric_v<MT1> && IsSymmetric_v<MT2> >* =
nullptr >
1074inline decltype(
auto)
1075 tdmatdmatadd(
const DenseMatrix<MT1,true>& lhs,
const DenseMatrix<MT2,false>& rhs )
1082 return trans( *rhs ) + (*lhs);
1101template<
typename MT1
1103 , EnableIf_t< IsSymmetric_v<MT1> >* =
nullptr >
1104inline decltype(
auto)
1105 tdmatdmatadd(
const DenseMatrix<MT1,true>& lhs,
const DenseMatrix<MT2,false>& rhs )
1112 return (*rhs) +
trans( *lhs );
1147template<
typename MT1
1149inline decltype(
auto)
1154 if( (*lhs).rows() != (*rhs).rows() || (*lhs).columns() != (*rhs).columns() ) {
1158 return tdmatdmatadd( *lhs, *rhs );
1173template<
typename MT1,
typename MT2 >
1174struct IsAligned< DMatTDMatAddExpr<MT1,MT2> >
1175 :
public BoolConstant< IsAligned_v<MT1> && IsAligned_v<MT2> >
1191template<
typename MT1,
typename MT2 >
1192struct IsStrictlyUpper< DMatTDMatAddExpr<MT1,MT2> >
1193 :
public BoolConstant< IsStrictlyUpper_v<MT1> && IsStrictlyUpper_v<MT2> >
Header file for the addition trait.
Header file for auxiliary alias declarations.
typename T::CompositeType CompositeType_t
Alias declaration for nested CompositeType type definitions.
Definition: Aliases.h:110
typename T::ReturnType ReturnType_t
Alias declaration for nested ReturnType type definitions.
Definition: Aliases.h:470
typename T::ResultType ResultType_t
Alias declaration for nested ResultType type definitions.
Definition: Aliases.h:450
typename T::ElementType ElementType_t
Alias declaration for nested ElementType type definitions.
Definition: Aliases.h:190
typename T::OppositeType OppositeType_t
Alias declaration for nested OppositeType type definitions.
Definition: Aliases.h:310
typename T::TransposeType TransposeType_t
Alias declaration for nested TransposeType type definitions.
Definition: Aliases.h:550
Header file for run time assertion macros.
Header file for kernel specific block sizes.
Constraints on the storage order of matrix types.
Header file for the EnableIf class template.
Header file for the function trace functionality.
Header file for the If class template.
Header file for the IntegralConstant class template.
Header file for the IsAligned type trait.
Header file for the IsExpression type trait class.
Header file for the IsOperation type trait class.
Header file for the IsStrictlyUpper type trait.
Header file for the IsSymmetric type trait.
Header file for the IsTemporary type trait class.
Constraints on the storage order of matrix types.
Expression object for dense matrix-transpose dense matrix additions.
Definition: DMatTDMatAddExpr.h:95
TransposeType_t< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: DMatTDMatAddExpr.h:161
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: DMatTDMatAddExpr.h:280
LeftOperand lhs_
Left-hand side dense matrix of the addition expression.
Definition: DMatTDMatAddExpr.h:321
size_t rows() const noexcept
Returns the current number of rows of the matrix.
Definition: DMatTDMatAddExpr.h:238
static constexpr bool useAssign
Compilation switch for the serial evaluation strategy of the addition expression.
Definition: DMatTDMatAddExpr.h:127
ReturnType_t< MT2 > RN2
Return type of the right-hand side dense matrix expression.
Definition: DMatTDMatAddExpr.h:101
If_t< IsExpression_v< MT1 >, const MT1, const MT1 & > LeftOperand
Composite type of the left-hand side dense matrix expression.
Definition: DMatTDMatAddExpr.h:171
ReturnType at(size_t i, size_t j) const
Checked access to the matrix elements.
Definition: DMatTDMatAddExpr.h:222
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: DMatTDMatAddExpr.h:207
decltype(std::declval< RN1 >()+std::declval< RN2 >()) ExprReturnType
Expression return type for the subscript operator.
Definition: DMatTDMatAddExpr.h:116
RightOperand rhs_
Right-hand side dense matrix of the addition expression.
Definition: DMatTDMatAddExpr.h:322
ResultType_t< MT1 > RT1
Result type of the left-hand side dense matrix expression.
Definition: DMatTDMatAddExpr.h:98
bool isAligned() const noexcept
Returns whether the operands of the expression are properly aligned in memory.
Definition: DMatTDMatAddExpr.h:303
OppositeType_t< ResultType > OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: DMatTDMatAddExpr.h:160
static constexpr bool returnExpr
Compilation switch for the selection of the subscript operator return type.
Definition: DMatTDMatAddExpr.h:113
size_t columns() const noexcept
Returns the current number of columns of the matrix.
Definition: DMatTDMatAddExpr.h:248
If_t< IsExpression_v< MT2 >, const MT2, const MT2 & > RightOperand
Composite type of the right-hand side dense matrix expression.
Definition: DMatTDMatAddExpr.h:174
const If_t< returnExpr, ExprReturnType, ElementType > ReturnType
Return type for expression template evaluations.
Definition: DMatTDMatAddExpr.h:165
const ResultType CompositeType
Data type for composite expression templates.
Definition: DMatTDMatAddExpr.h:168
ElementType_t< ResultType > ElementType
Resulting element type.
Definition: DMatTDMatAddExpr.h:162
RightOperand rightOperand() const noexcept
Returns the right-hand side transpose dense matrix operand.
Definition: DMatTDMatAddExpr.h:268
ResultType_t< MT2 > RT2
Result type of the right-hand side dense matrix expression.
Definition: DMatTDMatAddExpr.h:99
AddTrait_t< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: DMatTDMatAddExpr.h:159
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: DMatTDMatAddExpr.h:293
static constexpr bool simdEnabled
Compilation switch for the expression template evaluation strategy.
Definition: DMatTDMatAddExpr.h:179
LeftOperand leftOperand() const noexcept
Returns the left-hand side dense matrix operand.
Definition: DMatTDMatAddExpr.h:258
bool canSMPAssign() const noexcept
Returns whether the expression can be used in SMP assignments.
Definition: DMatTDMatAddExpr.h:313
ReturnType_t< MT1 > RN1
Return type of the left-hand side dense matrix expression.
Definition: DMatTDMatAddExpr.h:100
CompositeType_t< MT2 > CT2
Composite type of the right-hand side dense matrix expression.
Definition: DMatTDMatAddExpr.h:103
CompositeType_t< MT1 > CT1
Composite type of the left-hand side dense matrix expression.
Definition: DMatTDMatAddExpr.h:102
static constexpr bool smpAssignable
Compilation switch for the expression template assignment strategy.
Definition: DMatTDMatAddExpr.h:182
DMatTDMatAddExpr(const MT1 &lhs, const MT2 &rhs) noexcept
Constructor for the DMatTDMatAddExpr class.
Definition: DMatTDMatAddExpr.h:191
Base class for dense matrices.
Definition: DenseMatrix.h:82
Constraint on the data type.
Constraint on the data type.
Constraint on the data type.
Header file for the Computation base class.
Header file for the DenseMatrix base class.
Header file for the MatMatAddExpr base class.
decltype(auto) trans(const DenseMatrix< MT, SO > &dm)
Calculation of the transpose of the given dense matrix.
Definition: DMatTransExpr.h:766
decltype(auto) serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:812
#define BLAZE_CONSTRAINT_MUST_BE_ROW_MAJOR_MATRIX_TYPE(T)
Constraint on the data type.
Definition: RowMajorMatrix.h:61
#define BLAZE_CONSTRAINT_MATRICES_MUST_HAVE_SAME_STORAGE_ORDER(T1, T2)
Constraint on the data type.
Definition: StorageOrder.h:84
#define BLAZE_CONSTRAINT_MUST_NOT_REQUIRE_EVALUATION(T)
Constraint on the data type.
Definition: RequiresEvaluation.h:81
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_MATRIX_TYPE(T)
Constraint on the data type.
Definition: DenseMatrix.h:61
#define BLAZE_CONSTRAINT_MUST_FORM_VALID_MATMATADDEXPR(T1, T2)
Constraint on the data type.
Definition: MatMatAddExpr.h:103
#define BLAZE_CONSTRAINT_MUST_BE_COLUMN_MAJOR_MATRIX_TYPE(T)
Constraint on the data type.
Definition: ColumnMajorMatrix.h:61
typename AddTrait< T1, T2 >::Type AddTrait_t
Auxiliary alias declaration for the AddTrait class template.
Definition: AddTrait.h:163
bool isSame(const Matrix< MT1, SO1 > &a, const Matrix< MT2, SO2 > &b) noexcept
Returns whether the two given matrices represent the same observable state.
Definition: Matrix.h:1424
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.
Definition: Assert.h:101
auto smpSubAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs) -> EnableIf_t< IsDenseMatrix_v< MT1 > >
Default implementation of the SMP subtraction assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:162
auto smpAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs) -> EnableIf_t< IsDenseMatrix_v< MT1 > >
Default implementation of the SMP assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:100
auto smpSchurAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs) -> EnableIf_t< IsDenseMatrix_v< MT1 > >
Default implementation of the SMP Schur product assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:194
auto smpAddAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs) -> EnableIf_t< IsDenseMatrix_v< MT1 > >
Default implementation of the SMP addition assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:131
typename EnableIf< Condition, T >::Type EnableIf_t
Auxiliary type for the EnableIf class template.
Definition: EnableIf.h:138
typename If< Condition >::template Type< T1, T2 > If_t
Auxiliary alias template for the If class template.
Definition: If.h:108
IntegralConstant< bool, B > BoolConstant
Generic wrapper for a compile time constant boolean value.
Definition: IntegralConstant.h:110
#define BLAZE_THROW_OUT_OF_RANGE(MESSAGE)
Macro for the emission of a std::out_of_range exception.
Definition: Exception.h:331
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.
Definition: Exception.h:235
typename EnableIf<!Condition, T >::Type DisableIf_t
Auxiliary type for the EnableIf class template.
Definition: EnableIf.h:175
#define BLAZE_FUNCTION_TRACE
Function trace macro.
Definition: FunctionTrace.h:94
Header file for the exception macros of the math module.
Constraints on the storage order of matrix types.
Header file for all forward declarations for expression class templates.
Header file for the serial shim.
Base class for all compute expression templates.
Definition: Computation.h:68
Base class for all matrix/matrix addition expression templates.
Definition: MatMatAddExpr.h:68
Header file for the thresholds for matrix/vector and matrix/matrix multiplications.
Header file for the RequiresEvaluation type trait.
Header file for basic type definitions.