35 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECDVECOUTEREXPR_H_ 36 #define _BLAZE_MATH_EXPRESSIONS_DVECDVECOUTEREXPR_H_ 102 template<
typename VT1
105 :
public VecTVecMultExpr< DenseMatrix< DVecDVecOuterExpr<VT1,VT2>, false > >
122 static constexpr
bool evaluateLeft = ( IsComputation_v<VT1> || RequiresEvaluation_v<VT1> );
127 static constexpr
bool evaluateRight = ( IsComputation_v<VT2> || RequiresEvaluation_v<VT2> );
137 static constexpr
bool returnExpr = ( !IsTemporary_v<RN1> && !IsTemporary_v<RN2> );
154 template<
typename VT >
156 static constexpr
bool UseAssign_v =
useAssign;
166 template<
typename VT >
176 template<
typename T1,
typename T2,
typename T3 >
177 static constexpr
bool UseVectorizedKernel_v =
178 ( useOptimizedKernels &&
179 T1::simdEnabled && T2::simdEnabled && T3::simdEnabled &&
180 IsSIMDCombinable_v< ElementType_t<T1>
192 template<
typename T1,
typename T2,
typename T3 >
193 static constexpr
bool UseDefaultKernel_v = !UseVectorizedKernel_v<T1,T2,T3>;
337 return (*
left_) * (*right_);
346 inline auto load() const noexcept {
347 return set( *left_ ) *
right_.load();
475 ( VT1::simdEnabled && VT2::simdEnabled && HasSIMDMult_v<ET1,ET2> );
522 if( i >=
lhs_.size() ) {
525 if( j >=
rhs_.size() ) {
543 return set(
lhs_[i] ) *
rhs_.load( j );
576 inline size_t rows() const noexcept {
617 template<
typename T >
618 inline bool canAlias(
const T* alias )
const noexcept {
619 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
629 template<
typename T >
630 inline bool isAliased(
const T* alias )
const noexcept {
631 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
641 return lhs_.isAligned() &&
rhs_.isAligned();
651 return (
rows() *
columns() >= SMP_DVECDVECOUTER_THRESHOLD );
675 template<
typename MT >
692 DVecDVecOuterExpr::selectAssignKernel( ~lhs, x, y );
711 template<
typename MT
714 static inline auto selectAssignKernel( MT& A,
const VT3& x,
const VT4& y )
717 const size_t M( A.rows() );
718 const size_t N( A.columns() );
720 const size_t jpos( N &
size_t(-2) );
723 for(
size_t i=0UL; i<M; ++i ) {
724 for(
size_t j=0UL; j<jpos; j+=2UL ) {
725 A(i,j ) = x[i] * y[j ];
726 A(i,j+1UL) = x[i] * y[j+1];
729 A(i,jpos) = x[i] * y[jpos];
750 template<
typename MT
753 static inline auto selectAssignKernel( MT& A,
const VT3& x,
const VT4& y )
754 -> EnableIf_t< IsRowMajorMatrix_v<MT> && UseVectorizedKernel_v<MT,VT3,VT4> >
756 constexpr
bool remainder( !IsPadded_v<MT> || !IsPadded_v<VT4> );
758 const size_t M( A.rows() );
759 const size_t N( A.columns() );
761 const size_t jpos( remainder ? ( N &
size_t(-
SIMDSIZE) ) : N );
764 for(
size_t i=0UL; i<M; ++i )
771 A.store( i, j, x1 * y.load(j) );
773 for( ; remainder && j<N; ++j ) {
774 A(i,j) = x[i] * y[j];
793 template<
typename MT >
794 friend inline void assign( DenseMatrix<MT,true>& lhs,
const DVecDVecOuterExpr& rhs )
811 DVecDVecOuterExpr::selectAssignKernel( ~lhs, x, y );
830 template<
typename MT
833 static inline auto selectAssignKernel( MT& A,
const VT3& x,
const VT4& y )
834 -> EnableIf_t< IsColumnMajorMatrix_v<MT> && UseDefaultKernel_v<MT,VT3,VT4> >
836 const size_t M( A.rows() );
837 const size_t N( A.columns() );
839 const size_t ipos( M &
size_t(-2) );
842 for(
size_t j=0UL; j<N; ++j ) {
843 for(
size_t i=0UL; i<ipos; i+=2UL ) {
844 A(i ,j) = x[i ] * y[j];
845 A(i+1UL,j) = x[i+1] * y[j];
848 A(ipos,j) = x[ipos] * y[j];
869 template<
typename MT
872 static inline auto selectAssignKernel( MT& A,
const VT3& x,
const VT4& y )
873 -> EnableIf_t< IsColumnMajorMatrix_v<MT> && UseVectorizedKernel_v<MT,VT3,VT4> >
875 constexpr
bool remainder( !IsPadded_v<MT> || !IsPadded_v<VT3> );
877 const size_t M( A.rows() );
878 const size_t N( A.columns() );
880 const size_t ipos( remainder ? ( M &
size_t(-
SIMDSIZE) ) : M );
883 for(
size_t j=0UL; j<N; ++j )
890 A.store( i, j, x.load(i) * y1 );
892 for( ; remainder && i<M; ++i ) {
893 A(i,j) = x[i] * y[j];
912 template<
typename MT
914 friend inline void assign( SparseMatrix<MT,SO>& lhs,
const DVecDVecOuterExpr& rhs )
918 using TmpType = If_t< SO, OppositeType, ResultType >;
930 const TmpType tmp(
serial( rhs ) );
951 template<
typename MT >
952 friend inline auto addAssign( DenseMatrix<MT,false>& lhs,
const DVecDVecOuterExpr& rhs )
953 -> EnableIf_t< UseAssign_v<MT> >
968 DVecDVecOuterExpr::selectAddAssignKernel( ~lhs, x, y );
987 template<
typename MT
990 static inline auto selectAddAssignKernel( MT& A,
const VT3& x,
const VT4& y )
991 -> EnableIf_t< IsRowMajorMatrix_v<MT> && UseDefaultKernel_v<MT,VT3,VT4> >
993 const size_t M( A.rows() );
994 const size_t N( A.columns() );
996 const size_t jpos( N &
size_t(-2) );
999 for(
size_t i=0UL; i<M; ++i ) {
1000 for(
size_t j=0UL; j<jpos; j+=2UL ) {
1001 A(i,j ) += x[i] * y[j ];
1002 A(i,j+1UL) += x[i] * y[j+1UL];
1005 A(i,jpos) += x[i] * y[jpos];
1026 template<
typename MT
1029 static inline auto selectAddAssignKernel( MT& A,
const VT3& x,
const VT4& y )
1030 -> EnableIf_t< IsRowMajorMatrix_v<MT> && UseVectorizedKernel_v<MT,VT3,VT4> >
1032 constexpr
bool remainder( !IsPadded_v<MT> || !IsPadded_v<VT4> );
1034 const size_t M( A.rows() );
1035 const size_t N( A.columns() );
1037 const size_t jpos( remainder ? ( N &
size_t(-
SIMDSIZE) ) : N );
1040 for(
size_t i=0UL; i<M; ++i )
1047 A.store( i, j, A.load(i,j) + x1 * y.load(j) );
1049 for( ; remainder && j<N; ++j ) {
1050 A(i,j) += x[i] * y[j];
1070 template<
typename MT >
1071 friend inline void addAssign( DenseMatrix<MT,true>& lhs,
const DVecDVecOuterExpr& rhs )
1088 DVecDVecOuterExpr::selectAddAssignKernel( ~lhs, x, y );
1107 template<
typename MT
1110 static inline auto selectAddAssignKernel( MT& A,
const VT3& x,
const VT4& y )
1111 -> EnableIf_t< IsColumnMajorMatrix_v<MT> && UseDefaultKernel_v<MT,VT3,VT4> >
1113 const size_t M( A.rows() );
1114 const size_t N( A.columns() );
1116 const size_t ipos( M &
size_t(-2) );
1119 for(
size_t j=0UL; j<N; ++j ) {
1120 for(
size_t i=0UL; i<ipos; i+=2UL ) {
1121 A(i ,j) += x[i ] * y[j];
1122 A(i+1UL,j) += x[i+1UL] * y[j];
1125 A(ipos,j) += x[ipos] * y[j];
1146 template<
typename MT
1149 static inline auto selectAddAssignKernel( MT& A,
const VT3& x,
const VT4& y )
1150 -> EnableIf_t< IsColumnMajorMatrix_v<MT> && UseVectorizedKernel_v<MT,VT3,VT4> >
1152 constexpr
bool remainder( !IsPadded_v<MT> || !IsPadded_v<VT3> );
1154 const size_t M( A.rows() );
1155 const size_t N( A.columns() );
1157 const size_t ipos( remainder ? ( M &
size_t(-
SIMDSIZE) ) : M );
1160 for(
size_t j=0UL; j<N; ++j )
1167 A.store( i, j, A.load(i,j) + x.load(i) * y1 );
1169 for( ; remainder && i<M; ++i ) {
1170 A(i,j) += x[i] * y[j];
1196 template<
typename MT >
1197 friend inline auto subAssign( DenseMatrix<MT,false>& lhs,
const DVecDVecOuterExpr& rhs )
1198 -> EnableIf_t< UseAssign_v<MT> >
1213 DVecDVecOuterExpr::selectSubAssignKernel( ~lhs, x, y );
1232 template<
typename MT
1235 static inline auto selectSubAssignKernel( MT& A,
const VT3& x,
const VT4& y )
1236 -> EnableIf_t< IsRowMajorMatrix_v<MT> && UseDefaultKernel_v<MT,VT3,VT4> >
1238 const size_t M( A.rows() );
1239 const size_t N( A.columns() );
1241 const size_t jpos( N &
size_t(-2) );
1244 for(
size_t i=0UL; i<M; ++i ) {
1245 for(
size_t j=0UL; j<jpos; j+=2UL ) {
1246 A(i,j ) -= x[i] * y[j ];
1247 A(i,j+1UL) -= x[i] * y[j+1UL];
1250 A(i,jpos) -= x[i] * y[jpos];
1271 template<
typename MT
1274 static inline auto selectSubAssignKernel( MT& A,
const VT3& x,
const VT4& y )
1275 -> EnableIf_t< IsRowMajorMatrix_v<MT> && UseVectorizedKernel_v<MT,VT3,VT4> >
1277 constexpr
bool remainder( !IsPadded_v<MT> || !IsPadded_v<VT4> );
1279 const size_t M( A.rows() );
1280 const size_t N( A.columns() );
1282 const size_t jpos( remainder ? ( N &
size_t(-
SIMDSIZE) ) : N );
1285 for(
size_t i=0UL; i<M; ++i )
1292 A.store( i, j, A.load(i,j) - x1 * y.load(j) );
1294 for( ; remainder && j<N; ++j ) {
1295 A(i,j) -= x[i] * y[j];
1315 template<
typename MT >
1316 friend inline void subAssign( DenseMatrix<MT,true>& lhs,
const DVecDVecOuterExpr& rhs )
1333 DVecDVecOuterExpr::selectSubAssignKernel( ~lhs, x, y );
1352 template<
typename MT
1355 static inline auto selectSubAssignKernel( MT& A,
const VT3& x,
const VT4& y )
1356 -> EnableIf_t< IsColumnMajorMatrix_v<MT> && UseDefaultKernel_v<MT,VT3,VT4> >
1358 const size_t M( A.rows() );
1359 const size_t N( A.columns() );
1361 const size_t ipos( M &
size_t(-2) );
1364 for(
size_t j=0UL; j<N; ++j ) {
1365 for(
size_t i=0UL; i<ipos; i+=2UL ) {
1366 A(i ,j) -= x[i ] * y[j];
1367 A(i+1UL,j) -= x[i+1UL] * y[j];
1370 A(ipos,j) -= x[ipos] * y[j];
1391 template<
typename MT
1394 static inline auto selectSubAssignKernel( MT& A,
const VT3& x,
const VT4& y )
1395 -> EnableIf_t< IsColumnMajorMatrix_v<MT> && UseVectorizedKernel_v<MT,VT3,VT4> >
1397 constexpr
bool remainder( !IsPadded_v<MT> || !IsPadded_v<VT3> );
1399 const size_t M( A.rows() );
1400 const size_t N( A.columns() );
1402 const size_t ipos( remainder ? ( M &
size_t(-
SIMDSIZE) ) : M );
1405 for(
size_t j=0UL; j<N; ++j )
1412 A.store( i, j, A.load(i,j) - x.load(i) * y1 );
1414 for( ; remainder && i<M; ++i ) {
1415 A(i,j) -= x[i] * y[j];
1441 template<
typename MT >
1442 friend inline auto schurAssign( DenseMatrix<MT,false>& lhs,
const DVecDVecOuterExpr& rhs )
1443 -> EnableIf_t< UseAssign_v<MT> >
1458 DVecDVecOuterExpr::selectSchurAssignKernel( ~lhs, x, y );
1477 template<
typename MT
1480 static inline auto selectSchurAssignKernel( MT& A,
const VT3& x,
const VT4& y )
1481 -> EnableIf_t< IsRowMajorMatrix_v<MT> && UseDefaultKernel_v<MT,VT3,VT4> >
1483 const size_t M( A.rows() );
1484 const size_t N( A.columns() );
1486 const size_t jpos( N &
size_t(-2) );
1489 for(
size_t i=0UL; i<M; ++i ) {
1490 for(
size_t j=0UL; j<jpos; j+=2UL ) {
1491 A(i,j ) *= x[i] * y[j ];
1492 A(i,j+1UL) *= x[i] * y[j+1UL];
1495 A(i,jpos) *= x[i] * y[jpos];
1516 template<
typename MT
1519 static inline auto selectSchurAssignKernel( MT& A,
const VT3& x,
const VT4& y )
1520 -> EnableIf_t< IsRowMajorMatrix_v<MT> && UseVectorizedKernel_v<MT,VT3,VT4> >
1522 constexpr
bool remainder( !IsPadded_v<MT> || !IsPadded_v<VT4> );
1524 const size_t M( A.rows() );
1525 const size_t N( A.columns() );
1527 const size_t jpos( remainder ? ( N &
size_t(-
SIMDSIZE) ) : N );
1530 for(
size_t i=0UL; i<M; ++i )
1537 A.store( i, j, A.load(i,j) * ( x1 * y.load(j) ) );
1539 for( ; remainder && j<N; ++j ) {
1540 A(i,j) *= x[i] * y[j];
1560 template<
typename MT >
1561 friend inline void schurAssign( DenseMatrix<MT,true>& lhs,
const DVecDVecOuterExpr& rhs )
1578 DVecDVecOuterExpr::selectSchurAssignKernel( ~lhs, x, y );
1597 template<
typename MT
1600 static inline auto selectSchurAssignKernel( MT& A,
const VT3& x,
const VT4& y )
1601 -> EnableIf_t< IsColumnMajorMatrix_v<MT> && UseDefaultKernel_v<MT,VT3,VT4> >
1603 const size_t M( A.rows() );
1604 const size_t N( A.columns() );
1606 const size_t ipos( M &
size_t(-2) );
1609 for(
size_t j=0UL; j<N; ++j ) {
1610 for(
size_t i=0UL; i<ipos; i+=2UL ) {
1611 A(i ,j) *= x[i ] * y[j];
1612 A(i+1UL,j) *= x[i+1UL] * y[j];
1615 A(ipos,j) *= x[ipos] * y[j];
1636 template<
typename MT
1639 static inline auto selectSchurAssignKernel( MT& A,
const VT3& x,
const VT4& y )
1640 -> EnableIf_t< IsColumnMajorMatrix_v<MT> && UseVectorizedKernel_v<MT,VT3,VT4> >
1642 constexpr
bool remainder( !IsPadded_v<MT> || !IsPadded_v<VT3> );
1644 const size_t M( A.rows() );
1645 const size_t N( A.columns() );
1647 const size_t ipos( remainder ? ( M &
size_t(-
SIMDSIZE) ) : M );
1650 for(
size_t j=0UL; j<N; ++j )
1657 A.store( i, j, A.load(i,j) * ( x.load(i) * y1 ) );
1659 for( ; remainder && i<M; ++i ) {
1660 A(i,j) *= x[i] * y[j];
1693 template<
typename MT
1696 -> EnableIf_t< UseSMPAssign_v<MT> >
1730 template<
typename MT
1733 -> EnableIf_t< UseSMPAssign_v<MT> >
1737 using TmpType = If_t< SO, OppositeType, ResultType >;
1749 const TmpType tmp( rhs );
1769 template<
typename MT >
1771 -> EnableIf_t< UseSMPAssign_v<MT> >
1810 template<
typename MT >
1812 -> EnableIf_t< UseSMPAssign_v<MT> >
1851 template<
typename MT >
1853 -> EnableIf_t< UseSMPAssign_v<MT> >
1933 template<
typename VT1
1935 inline decltype(
auto)
1956 template<
typename VT1,
typename VT2 >
1957 struct Size< DVecDVecOuterExpr<VT1,VT2>, 0UL >
1958 :
public Size<VT1,0UL>
1961 template<
typename VT1,
typename VT2 >
1962 struct Size< DVecDVecOuterExpr<VT1,VT2>, 1UL >
1963 :
public Size<VT2,0UL>
1979 template<
typename VT1,
typename VT2 >
1980 struct IsAligned< DVecDVecOuterExpr<VT1,VT2> >
1981 :
public BoolConstant< IsAligned_v<VT1> && IsAligned_v<VT2> >
1997 template<
typename VT1,
typename VT2 >
1998 struct IsPadded< DVecDVecOuterExpr<VT1,VT2> >
1999 :
public IsPadded<VT2>
Pointer difference type of the Blaze library.
Header file for auxiliary alias declarations.
const ConstIterator operator--(int)
Post-decrement operator.
Definition: DVecDVecOuterExpr.h:326
static constexpr bool evaluateLeft
Compilation switch for the composite type of the left-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:122
Header file for basic type definitions.
bool operator!=(const ConstIterator &rhs) const
Inequality comparison between two ConstIterator objects.
Definition: DVecDVecOuterExpr.h:368
typename If< Condition, T1, T2 >::Type If_t
Auxiliary alias declaration for the If class template.The If_t alias declaration provides a convenien...
Definition: If.h:109
size_t rows() const noexcept
Returns the current number of rows of the matrix.
Definition: DVecDVecOuterExpr.h:576
ConstIterator_t< VT1 > LeftIteratorType
ConstIterator type of the left-hand side dense matrix expression.
Definition: DVecDVecOuterExpr.h:247
typename T::ResultType ResultType_t
Alias declaration for nested ResultType type definitions.The ResultType_t alias declaration provides ...
Definition: Aliases.h:390
#define BLAZE_CONSTRAINT_MUST_BE_COLUMN_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a column dense or sparse vector type...
Definition: ColumnVector.h:61
Header file for the serial shim.
#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:61
ElementType * PointerType
Pointer return type.
Definition: DVecDVecOuterExpr.h:235
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: DVecDVecOuterExpr.h:505
Header file for the IsColumnMajorMatrix type trait.
static constexpr bool returnExpr
Compilation switch for the selection of the subscript operator return type.
Definition: DVecDVecOuterExpr.h:137
static constexpr bool smpAssignable
Compilation flag for SMP assignments.
Definition: CompressedMatrix.h:3113
ConstIterator & operator++()
Pre-increment operator.
Definition: DVecDVecOuterExpr.h:294
friend const ConstIterator operator+(size_t inc, const ConstIterator &it)
Addition between an integral value and a ConstIterator.
Definition: DVecDVecOuterExpr.h:447
typename SIMDTrait< T >::Type SIMDTrait_t
Auxiliary alias declaration for the SIMDTrait class template.The SIMDTrait_t alias declaration provid...
Definition: SIMDTrait.h:315
LeftOperand leftOperand() const noexcept
Returns the left-hand side dense vector operand.
Definition: DVecDVecOuterExpr.h:596
MultTrait_t< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: DVecDVecOuterExpr.h:201
Header file for the Computation base class.
Constraints on the storage order of matrix types.
BLAZE_ALWAYS_INLINE auto load(size_t i, size_t j) const noexcept
Access to the SIMD elements of the matrix.
Definition: DVecDVecOuterExpr.h:539
If_t< IsExpression_v< VT2 >, const VT2, const VT2 &> RightOperand
Composite type of the right-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:217
Header file for the RequiresEvaluation type trait.
System settings for performance optimizations.
typename T::ReturnType ReturnType_t
Alias declaration for nested ReturnType type definitions.The ReturnType_t alias declaration provides ...
Definition: Aliases.h:410
ElementType_t< RT1 > ET1
Element type of the left-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:112
ValueType value_type
Type of the underlying elements.
Definition: DVecDVecOuterExpr.h:241
static constexpr bool smpAssignable
Compilation switch for the expression template assignment strategy.
Definition: DVecDVecOuterExpr.h:478
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:80
typename T::ElementType ElementType_t
Alias declaration for nested ElementType type definitions.The ElementType_t alias declaration provide...
Definition: Aliases.h:170
ConstIterator & operator--()
Pre-decrement operator.
Definition: DVecDVecOuterExpr.h:315
size_t columns() const noexcept
Returns the current number of columns of the matrix.
Definition: DVecDVecOuterExpr.h:586
Constraint on the transpose flag of vector types.
RightOperand rightOperand() const noexcept
Returns the right-hand side dense vector operand.
Definition: DVecDVecOuterExpr.h:606
Constraint on the data type.
typename EnableIf< Condition, T >::Type EnableIf_t
Auxiliary type for the EnableIf class template.The EnableIf_t alias declaration provides a convenient...
Definition: EnableIf.h:138
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: DVecDVecOuterExpr.h:618
ResultType_t< VT1 > RT1
Result type of the left-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:110
ReturnType operator*() const
Direct access to the element at the current iterator position.
Definition: DVecDVecOuterExpr.h:336
Header file for the IsTemporary type trait class.
ConstIterator(LeftIteratorType left, RightIteratorType right)
Constructor for the ConstIterator class.
Definition: DVecDVecOuterExpr.h:259
static constexpr bool simdEnabled
Compilation switch for the expression template evaluation strategy.
Definition: DVecDVecOuterExpr.h:474
Header file for the multiplication trait.
ResultType_t< VT2 > RT2
Result type of the right-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:111
Namespace of the Blaze C++ math library.
Definition: Blaze.h:58
#define BLAZE_ALWAYS_INLINE
Platform dependent setup of an enforced inline keyword.
Definition: Inline.h:85
auto load() const noexcept
Access to the SIMD elements of the matrix.
Definition: DVecDVecOuterExpr.h:346
If_t< useAssign, const ResultType, const DVecDVecOuterExpr &> CompositeType
Data type for composite expression templates.
Definition: DVecDVecOuterExpr.h:211
Header file for the If class template.
#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: ColumnMajorMatrix.h:61
const ConstIterator operator++(int)
Post-increment operator.
Definition: DVecDVecOuterExpr.h:305
ElementType_t< ResultType > ElementType
Resulting element type.
Definition: DVecDVecOuterExpr.h:204
#define BLAZE_CONSTRAINT_MUST_FORM_VALID_VECTVECMULTEXPR(T1, T2)
Constraint on the data type.In case the given data types T1 and T2 do not form a valid vector/vector ...
Definition: VecTVecMultExpr.h:103
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: DVecDVecOuterExpr.h:630
LeftIteratorType left_
Iterator to the current left-hand side element.
Definition: DVecDVecOuterExpr.h:466
const If_t< returnExpr, ExprReturnType, ElementType > ReturnType
Return type for expression template evaluations.
Definition: DVecDVecOuterExpr.h:208
ConstIterator_t< VT2 > RightIteratorType
ConstIterator type of the right-hand side dense matrix expression.
Definition: DVecDVecOuterExpr.h:250
#define BLAZE_THROW_OUT_OF_RANGE(MESSAGE)
Macro for the emission of a std::out_of_range exception.This macro encapsulates the default way of Bl...
Definition: Exception.h:331
Header file for the DenseMatrix base class.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:3086
Header file for all SIMD functionality.
RightOperand rhs_
Right-hand side dense vector of the multiplication expression.
Definition: DVecDVecOuterExpr.h:658
OppositeType_t< ResultType > OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: DVecDVecOuterExpr.h:202
Base class for N-dimensional dense vectors.The DenseVector class is a base class for all arbitrarily ...
Definition: DenseVector.h:76
ConstIterator & operator-=(size_t dec)
Subtraction assignment operator.
Definition: DVecDVecOuterExpr.h:283
Header file for the IsAligned type trait.
bool operator==(const ConstIterator &rhs) const
Equality comparison between two ConstIterator objects.
Definition: DVecDVecOuterExpr.h:357
CompositeType_t< VT2 > CT2
Composite type of the right-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:117
bool operator<(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DVecDVecOuterExpr.h:379
static constexpr bool useAssign
Compilation switch for the serial evaluation strategy of the outer product expression.
Definition: DVecDVecOuterExpr.h:151
Constraints on the storage order of matrix types.
Constraint on the data type.
bool canSMPAssign() const noexcept
Returns whether the expression can be used in SMP assignments.
Definition: DVecDVecOuterExpr.h:650
Header file for the exception macros of the math module.
ConstIterator end(size_t i) const
Returns an iterator just past the last non-zero element of row i.
Definition: DVecDVecOuterExpr.h:565
Constraint on the data type.
ReturnType_t< VT1 > RN1
Return type of the left-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:114
Header file for all forward declarations for expression class templates.
Header file for the VecTVecMultExpr base class.
Header file for the EnableIf class template.
DVecDVecOuterExpr(const VT1 &lhs, const VT2 &rhs) noexcept
Constructor for the DVecDVecOuterExpr class.
Definition: DVecDVecOuterExpr.h:492
Header file for the IsPadded type trait.
decltype(std::declval< RN1 >() *std::declval< RN2 >()) ExprReturnType
Expression return type for the subscript operator.
Definition: DVecDVecOuterExpr.h:140
typename MultTrait< T1, T2 >::Type MultTrait_t
Auxiliary alias declaration for the MultTrait class template.The MultTrait_t alias declaration provid...
Definition: MultTrait.h:240
typename T::OppositeType OppositeType_t
Alias declaration for nested OppositeType type definitions.The OppositeType_t alias declaration provi...
Definition: Aliases.h:270
ReturnType at(size_t i, size_t j) const
Checked access to the matrix elements.
Definition: DVecDVecOuterExpr.h:521
bool operator<=(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DVecDVecOuterExpr.h:401
ConstIterator & operator+=(size_t inc)
Addition assignment operator.
Definition: DVecDVecOuterExpr.h:271
Header file for the IsSIMDCombinable 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:79
#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: RowMajorMatrix.h:61
Header file for the HasSIMDMult type trait.
bool operator>=(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DVecDVecOuterExpr.h:412
DifferenceType operator-(const ConstIterator &rhs) const
Calculating the number of elements between two iterators.
Definition: DVecDVecOuterExpr.h:423
typename T::TransposeType TransposeType_t
Alias declaration for nested TransposeType type definitions.The TransposeType_t alias declaration pro...
Definition: Aliases.h:470
Header file for run time assertion macros.
typename T::CompositeType CompositeType_t
Alias declaration for nested CompositeType type definitions.The CompositeType_t alias declaration pro...
Definition: Aliases.h:90
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
static constexpr size_t SIMDSIZE
The number of elements packed within a single SIMD element.
Definition: DVecDVecOuterExpr.h:483
If_t< IsExpression_v< VT1 >, const VT1, const VT1 &> LeftOperand
Composite type of the left-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:214
Expression object for outer products between two dense vectors.The DVecDVecOuterExpr class represents...
Definition: DVecDVecOuterExpr.h:104
RightIteratorType right_
Iterator to the current right-hand side element.
Definition: DVecDVecOuterExpr.h:467
SIMD characteristics of data types.The SIMDTrait class template provides the SIMD characteristics of ...
Definition: SIMDTrait.h:295
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:94
ptrdiff_t DifferenceType
Difference between two iterators.
Definition: DVecDVecOuterExpr.h:237
ConstIterator begin(size_t i) const
Returns an iterator to the first non-zero element of row i.
Definition: DVecDVecOuterExpr.h:553
CompositeType_t< VT1 > CT1
Composite type of the left-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:116
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
Constraint on the data type.
Constraints on the storage order of matrix types.
decltype(auto) serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:808
#define BLAZE_CONSTRAINT_MUST_NOT_REQUIRE_EVALUATION(T)
Constraint on the data type.In case the given data type T requires an intermediate evaluation within ...
Definition: RequiresEvaluation.h:81
IntegralConstant< bool, B > BoolConstant
Generic wrapper for a compile time constant boolean value.The BoolConstant class template represents ...
Definition: IntegralConstant.h:101
Constraint on the data type.
Header file for the IsReference type trait.
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
Base class for all outer product expression templates.The VecTVecMultExpr class serves as a tag for a...
Definition: VecTVecMultExpr.h:67
#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:84
ReturnType_t< VT2 > RN2
Return type of the right-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:115
typename T::ConstIterator ConstIterator_t
Alias declaration for nested ConstIterator type definitions.The ConstIterator_t alias declaration pro...
Definition: Aliases.h:110
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:3081
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a dense, N-dimensional vector type...
Definition: DenseVector.h:61
If_t< evaluateRight, const RT2, CT2 > RT
Type for the assignment of the right-hand side dense vector operand.
Definition: DVecDVecOuterExpr.h:223
Header file for the IsRowMajorMatrix type trait.
Header file for the IsComputation type trait class.
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
TransposeType_t< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: DVecDVecOuterExpr.h:203
bool operator>(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DVecDVecOuterExpr.h:390
Base class for all compute expression templates.The Computation class serves as a tag for all computa...
Definition: Computation.h:66
bool isAligned() const noexcept
Returns whether the operands of the expression are properly aligned in memory.
Definition: DVecDVecOuterExpr.h:640
ElementType & ReferenceType
Reference return type.
Definition: DVecDVecOuterExpr.h:236
Header file for the IntegralConstant class template.
friend const ConstIterator operator-(const ConstIterator &it, size_t dec)
Subtraction between a ConstIterator and an integral value.
Definition: DVecDVecOuterExpr.h:459
If_t< evaluateLeft, const RT1, CT1 > LT
Type for the assignment of the left-hand side dense vector operand.
Definition: DVecDVecOuterExpr.h:220
PointerType pointer
Pointer return type.
Definition: DVecDVecOuterExpr.h:242
#define BLAZE_CONSTRAINT_MUST_BE_ROW_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a row dense or sparse vector type (i...
Definition: RowVector.h:61
static constexpr bool evaluateRight
Compilation switch for the composite type of the right-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:127
std::random_access_iterator_tag IteratorCategory
The iterator category.
Definition: DVecDVecOuterExpr.h:233
LeftOperand lhs_
Left-hand side dense vector of the multiplication expression.
Definition: DVecDVecOuterExpr.h:657
friend const ConstIterator operator+(const ConstIterator &it, size_t inc)
Addition between a ConstIterator and an integral value.
Definition: DVecDVecOuterExpr.h:435
IteratorCategory iterator_category
The iterator category.
Definition: DVecDVecOuterExpr.h:240
Iterator over the elements of the dense matrix.
Definition: DVecDVecOuterExpr.h:229
ReferenceType reference
Reference return type.
Definition: DVecDVecOuterExpr.h:243
System settings for the inline keywords.
Header file for the Size type trait.
Header file for the thresholds for matrix/vector and matrix/matrix multiplications.
ElementType_t< RT2 > ET2
Element type of the right-hand side dense vector expression.
Definition: DVecDVecOuterExpr.h:113
#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
SIMDTrait_t< ElementType > SIMDType
Resulting SIMD element type.
Definition: DVecDVecOuterExpr.h:205
ElementType ValueType
Type of the underlying elements.
Definition: DVecDVecOuterExpr.h:234
Constraint on the transpose flag of vector types.
Header file for the IsExpression type trait class.
Header file for the function trace functionality.