35 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATSCALARDIVEXPR_H_ 36 #define _BLAZE_MATH_EXPRESSIONS_DMATSCALARDIVEXPR_H_ 102 template<
typename MT
138 static constexpr
bool useAssign = IsComputation_v<MT> && RequiresEvaluation_v<MT>;
141 template<
typename MT2 >
143 static constexpr
bool UseAssign_v =
useAssign;
155 template<
typename MT2 >
156 static constexpr
bool UseSMPAssign_v =
157 ( ( !MT2::smpAssignable || !MT::smpAssignable ) &&
useAssign );
300 inline auto load() const noexcept {
429 ( MT::simdEnabled && IsNumeric_v<ET> &&
430 ( HasSIMDDiv_v<ET,ST> || HasSIMDDiv_v<UnderlyingElement_t<ET>,ST> ) );
529 inline size_t rows() const noexcept {
570 template<
typename T >
571 inline bool canAlias(
const T* alias )
const noexcept {
572 return IsExpression_v<MT> &&
matrix_.canAlias( alias );
582 template<
typename T >
583 inline bool isAliased(
const T* alias )
const noexcept {
584 return matrix_.isAliased( alias );
604 return matrix_.canSMPAssign() ||
605 (
rows() *
columns() >= SMP_DMATSCALARMULT_THRESHOLD );
629 template<
typename MT2
639 assign( ~lhs, rhs.matrix_ );
640 assign( ~lhs, (~lhs) / rhs.scalar_ );
659 template<
typename MT2
669 assign( ~lhs, rhs.matrix_ );
670 (~lhs) /= rhs.scalar_;
689 template<
typename MT2
691 friend inline auto addAssign( DenseMatrix<MT2,SO2>& lhs,
const DMatScalarDivExpr& rhs )
692 -> EnableIf_t< UseAssign_v<MT2> >
704 addAssign( ~lhs, tmp );
727 template<
typename MT2
729 friend inline auto subAssign( DenseMatrix<MT2,SO2>& lhs,
const DMatScalarDivExpr& rhs )
730 -> EnableIf_t< UseAssign_v<MT2> >
742 subAssign( ~lhs, tmp );
765 template<
typename MT2
767 friend inline auto schurAssign( DenseMatrix<MT2,SO2>& lhs,
const DMatScalarDivExpr& rhs )
768 -> EnableIf_t< UseAssign_v<MT2> >
780 schurAssign( ~lhs, tmp );
811 template<
typename MT2
814 -> EnableIf_t< UseSMPAssign_v<MT2> >
841 template<
typename MT2
844 -> EnableIf_t< UseSMPAssign_v<MT2> >
852 (~lhs) /= rhs.scalar_;
871 template<
typename MT2
874 -> EnableIf_t< UseSMPAssign_v<MT2> >
909 template<
typename MT2
912 -> EnableIf_t< UseSMPAssign_v<MT2> >
947 template<
typename MT2
950 -> EnableIf_t< UseSMPAssign_v<MT2> >
1006 template<
typename MT
1009 struct DMatScalarDivExprHelper
1013 using ScalarType = If_t< IsFloatingPoint_v< UnderlyingBuiltin_t<MT> > ||
1014 IsFloatingPoint_v< UnderlyingBuiltin_t<ST> >
1015 , If_t< IsComplex_v< UnderlyingNumeric_t<MT> > && IsBuiltin_v<ST>
1016 , DivTrait_t< UnderlyingBuiltin_t<MT>, ST >
1017 , DivTrait_t< UnderlyingNumeric_t<MT>, ST > >
1023 using Type = If_t< IsInvertible_v<ScalarType>
1024 , DMatScalarMultExpr<MT,ScalarType,SO>
1025 , DMatScalarDivExpr<MT,ScalarType,SO> >;
1054 template<
typename MT
1057 , EnableIf_t< IsNumeric_v<ST> >* =
nullptr >
1058 inline decltype(
auto) operator/( const
DenseMatrix<MT,SO>& mat, ST scalar )
1064 using ReturnType =
typename DMatScalarDivExprHelper<MT,ST,SO>::Type;
1067 if( IsMultExpr_v<ReturnType> ) {
1068 return ReturnType( ~mat, ScalarType(1)/ScalarType(scalar) );
1071 return ReturnType( ~mat, scalar );
1098 template<
typename MT
1102 , EnableIf_t< IsNumeric_v<ST2> && ( IsInvertible_v<ST1> || IsInvertible_v<ST2> ) >* =
nullptr >
1103 inline decltype(
auto) operator*( const DMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
1107 return mat.leftOperand() * ( scalar / mat.rightOperand() );
1126 template<
typename ST1
1130 , EnableIf_t< IsNumeric_v<ST1> && ( IsInvertible_v<ST1> || IsInvertible_v<ST2> ) >* =
nullptr >
1131 inline decltype(
auto) operator*( ST1 scalar, const DMatScalarDivExpr<MT,ST2,SO>& mat )
1135 return mat.leftOperand() * ( scalar / mat.rightOperand() );
1154 template<
typename MT
1158 , EnableIf_t< IsNumeric_v<ST2> >* =
nullptr >
1159 inline decltype(
auto) operator/( const DMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
1165 using MultType = MultTrait_t<ST1,ST2>;
1166 using ReturnType =
typename DMatScalarDivExprHelper<MT,MultType,SO>::Type;
1167 using ScalarType = RightOperand_t<ReturnType>;
1169 if( IsMultExpr_v<ReturnType> ) {
1170 return ReturnType( mat.leftOperand(), ScalarType(1)/( mat.rightOperand() * scalar ) );
1173 return ReturnType( mat.leftOperand(), mat.rightOperand() * scalar );
1190 template<
typename MT,
typename ST,
bool SO >
1191 struct IsAligned< DMatScalarDivExpr<MT,ST,SO> >
1192 :
public IsAligned<MT>
1208 template<
typename MT,
typename ST,
bool SO >
1209 struct IsPadded< DMatScalarDivExpr<MT,ST,SO> >
1210 :
public IsPadded<MT>
ptrdiff_t DifferenceType
Difference between two iterators.
Definition: DMatScalarDivExpr.h:194
Header file for the UnderlyingNumeric type trait.
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: DMatScalarDivExpr.h:571
Pointer difference type of the Blaze library.
OppositeType_t< ResultType > OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: DMatScalarDivExpr.h:166
Header file for auxiliary alias declarations.
Constraint on the data type.
bool operator<(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DMatScalarDivExpr.h:333
size_t columns() const noexcept
Returns the current number of columns of the matrix.
Definition: DMatScalarDivExpr.h:539
#define BLAZE_USER_ASSERT(expr, msg)
Run time assertion macro for user checks.In case of an invalid run time expression,...
Definition: Assert.h:117
LeftOperand leftOperand() const noexcept
Returns the left-hand side dense matrix operand.
Definition: DMatScalarDivExpr.h:549
bool operator>(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DMatScalarDivExpr.h:344
size_t rows() const noexcept
Returns the current number of rows of the matrix.
Definition: DMatScalarDivExpr.h:529
BLAZE_DEVICE_CALLABLE ConstIterator & operator-=(size_t dec)
Subtraction assignment operator.
Definition: DMatScalarDivExpr.h:237
Header file for basic type definitions.
typename If< Condition, T1, T2 >::Type If_t
Auxiliary alias template for the If class template.The If_t alias template provides a convenient shor...
Definition: If.h:109
DifferenceType operator-(const ConstIterator &rhs) const
Calculating the number of elements between two iterators.
Definition: DMatScalarDivExpr.h:377
Base class for all matrix/scalar division expression templates.The MatScalarDivExpr class serves as a...
Definition: MatScalarDivExpr.h:66
typename T::ResultType ResultType_t
Alias declaration for nested ResultType type definitions.The ResultType_t alias declaration provides ...
Definition: Aliases.h:390
Header file for the serial shim.
#define BLAZE_CONSTRAINT_MUST_BE_MATRIX_WITH_STORAGE_ORDER(T, SO)
Constraint on the data type.In case the given data type T is not a dense or sparse matrix type and in...
Definition: StorageOrder.h:63
typename DivTrait< T1, T2 >::Type DivTrait_t
Auxiliary alias declaration for the DivTrait class template.The DivTrait_t alias declaration provides...
Definition: DivTrait.h:239
ConstIterator begin(size_t i) const
Returns an iterator to the first non-zero element of row i.
Definition: DMatScalarDivExpr.h:508
BLAZE_DEVICE_CALLABLE ConstIterator & operator--()
Pre-decrement operator.
Definition: DMatScalarDivExpr.h:269
#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
decltype(std::declval< RN >()/std::declval< ST >()) ExprReturnType
Expression return type for the subscript operator.
Definition: DMatScalarDivExpr.h:127
bool canSMPAssign() const noexcept
Returns whether the expression can be used in SMP assignments.
Definition: DMatScalarDivExpr.h:603
ElementType ValueType
Type of the underlying elements.
Definition: DMatScalarDivExpr.h:191
Iterator over the elements of the dense matrix.
Definition: DMatScalarDivExpr.h:186
Expression object for divisions of a dense matrix by a scalar.The DMatScalarDivExpr class represents ...
Definition: DMatScalarDivExpr.h:105
BLAZE_DEVICE_CALLABLE const ConstIterator operator++(int)
Post-increment operator.
Definition: DMatScalarDivExpr.h:259
Header file for the Computation base class.
CompositeType_t< MT > CT
Composite type of the dense matrix expression.
Definition: DMatScalarDivExpr.h:114
Header file for the UnderlyingElement type trait.
auto load() const noexcept
Access to the SIMD elements of the matrix.
Definition: DMatScalarDivExpr.h:300
Header file for the RequiresEvaluation type trait.
typename T::ReturnType ReturnType_t
Alias declaration for nested ReturnType type definitions.The ReturnType_t alias declaration provides ...
Definition: Aliases.h:410
RightOperand rightOperand() const noexcept
Returns the right-hand side scalar operand.
Definition: DMatScalarDivExpr.h:559
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes....
Definition: DenseMatrix.h:81
Base class for sparse matrices.The SparseMatrix class is a base class for all sparse matrix classes....
Definition: Forward.h:145
typename T::ElementType ElementType_t
Alias declaration for nested ElementType type definitions.The ElementType_t alias declaration provide...
Definition: Aliases.h:170
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 isAligned() const noexcept
Returns whether the operands of the expression are properly aligned in memory.
Definition: DMatScalarDivExpr.h:593
ElementType * PointerType
Pointer return type.
Definition: DMatScalarDivExpr.h:192
Header file for the IsTemporary type trait class.
Header file for the multiplication trait.
DivTrait_t< RT, ST > ResultType
Result type for expression template evaluations.
Definition: DMatScalarDivExpr.h:165
If_t< useAssign, const ResultType, const DMatScalarDivExpr & > CompositeType
Data type for composite expression templates.
Definition: DMatScalarDivExpr.h:174
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
Header file for the If class template.
Header file for the IsFloatingPoint type trait.
Header file for the UnderlyingBuiltin type trait.
Header file for the IsMultExpr type trait class.
ElementType_t< ResultType > ElementType
Resulting element type.
Definition: DMatScalarDivExpr.h:168
BLAZE_DEVICE_CALLABLE ConstIterator & operator+=(size_t inc)
Addition assignment operator.
Definition: DMatScalarDivExpr.h:225
bool operator>=(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DMatScalarDivExpr.h:366
#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
ReferenceType reference
Reference return type.
Definition: DMatScalarDivExpr.h:200
Header file for the DenseMatrix base class.
ElementType_t< MT > ET
Element type of the dense matrix expression.
Definition: DMatScalarDivExpr.h:113
DMatScalarDivExpr(const MT &matrix, ST scalar) noexcept
Constructor for the DMatScalarDivExpr class.
Definition: DMatScalarDivExpr.h:447
Header file for all SIMD functionality.
ElementType & ReferenceType
Reference return type.
Definition: DMatScalarDivExpr.h:193
ST RightOperand
Composite type of the right-hand side scalar value.
Definition: DMatScalarDivExpr.h:180
#define BLAZE_CONSTRAINT_MUST_BE_SAME_TYPE(A, B)
Data type constraint.In case the two types A and B are not the same (ignoring all cv-qualifiers of bo...
Definition: SameType.h:71
static constexpr bool smpAssignable
Compilation switch for the expression template assignment strategy.
Definition: DMatScalarDivExpr.h:433
Header file for the IsAligned type trait.
IteratorType iterator_
Iterator to the current element.
Definition: DMatScalarDivExpr.h:420
static constexpr size_t SIMDSIZE
The number of elements packed within a single SIMD element.
Definition: DMatScalarDivExpr.h:438
ReturnType_t< MT > RN
Return type of the dense matrix expression.
Definition: DMatScalarDivExpr.h:112
const If_t< returnExpr, ExprReturnType, ElementType > ReturnType
Return type for expression template evaluations.
Definition: DMatScalarDivExpr.h:171
std::random_access_iterator_tag IteratorCategory
The iterator category.
Definition: DMatScalarDivExpr.h:190
Constraints on the storage order of matrix types.
Header file for the exception macros of the math module.
BLAZE_ALWAYS_INLINE auto load(size_t i, size_t j) const noexcept
Access to the SIMD elements of the matrix.
Definition: DMatScalarDivExpr.h:493
RightOperand scalar_
Scalar of the multiplication expression.
Definition: DMatScalarDivExpr.h:421
static constexpr bool simdEnabled
Compilation switch for the expression template evaluation strategy.
Definition: DMatScalarDivExpr.h:428
Constraint on the data type.
Header file for the EnableIf class template.
Header file for the IsPadded type trait.
typename T::OppositeType OppositeType_t
Alias declaration for nested OppositeType type definitions.The OppositeType_t alias declaration provi...
Definition: Aliases.h:270
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: DMatScalarDivExpr.h:460
Header file for the IsNumeric type trait.
ConstIterator end(size_t i) const
Returns an iterator just past the last non-zero element of row i.
Definition: DMatScalarDivExpr.h:519
LeftOperand matrix_
Left-hand side dense matrix of the division expression.
Definition: DMatScalarDivExpr.h:611
BLAZE_DEVICE_CALLABLE ConstIterator & operator++()
Pre-increment operator.
Definition: DMatScalarDivExpr.h:248
RightOperand scalar_
Right-hand side scalar of the division expression.
Definition: DMatScalarDivExpr.h:612
ConstIterator(IteratorType iterator, RightOperand scalar)
Constructor for the ConstIterator class.
Definition: DMatScalarDivExpr.h:213
static constexpr bool returnExpr
Compilation switch for the selection of the subscript operator return type.
Definition: DMatScalarDivExpr.h:124
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
Header file for the division trait.
friend const ConstIterator operator-(const ConstIterator &it, size_t dec)
Subtraction between a ConstIterator and an integral value.
Definition: DMatScalarDivExpr.h:413
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_BE_NUMERIC_TYPE(T)
Constraint on the data type.In case the given data type T is not a numeric (integral or floating poin...
Definition: Numeric.h:61
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
Header file for all forward declarations for expression class templates.
BLAZE_ALWAYS_INLINE const EnableIf_t< IsIntegral_v< T > &&HasSize_v< T, 1UL >, If_t< IsSigned_v< T >, SIMDint8, SIMDuint8 > > set(T value) noexcept
Sets all values in the vector to the given 1-byte integral value.
Definition: Set.h:75
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
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
TransposeType_t< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: DMatScalarDivExpr.h:167
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
bool operator==(const ConstIterator &rhs) const
Equality comparison between two ConstIterator objects.
Definition: DMatScalarDivExpr.h:311
IteratorCategory iterator_category
The iterator category.
Definition: DMatScalarDivExpr.h:197
ValueType value_type
Type of the underlying elements.
Definition: DMatScalarDivExpr.h:198
Header file for the IsInvertible type trait.
PointerType pointer
Pointer return type.
Definition: DMatScalarDivExpr.h:199
#define BLAZE_CONSTRAINT_MUST_NOT_BE_FLOATING_POINT_TYPE(T)
Constraint on the data type.In case the given data type T is a floating point data type,...
Definition: FloatingPoint.h:81
ResultType_t< MT > RT
Result type of the dense matrix expression.
Definition: DMatScalarDivExpr.h:111
typename T::ConstIterator ConstIterator_t
Alias declaration for nested ConstIterator type definitions.The ConstIterator_t alias declaration pro...
Definition: Aliases.h:110
Macro for CUDA compatibility.
Header file for the HasSIMDDiv type trait.
Header file for the IsComputation type trait class.
Header file for the IsBuiltin type trait.
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
Base class for all compute expression templates.The Computation class serves as a tag for all computa...
Definition: Computation.h:66
friend const ConstIterator operator+(const ConstIterator &it, size_t inc)
Addition between a ConstIterator and an integral value.
Definition: DMatScalarDivExpr.h:389
Header file for the IsComplex type trait.
friend const ConstIterator operator+(size_t inc, const ConstIterator &it)
Addition between an integral value and a ConstIterator.
Definition: DMatScalarDivExpr.h:401
BLAZE_DEVICE_CALLABLE const ConstIterator operator--(int)
Post-decrement operator.
Definition: DMatScalarDivExpr.h:280
ConstIterator_t< MT > IteratorType
ConstIterator type of the dense matrix expression.
Definition: DMatScalarDivExpr.h:204
typename T::RightOperand RightOperand_t
Alias declaration for nested RightOperand type definitions.The RightOperand_t alias declaration provi...
Definition: Aliases.h:430
static constexpr bool useAssign
Compilation switch for the serial evaluation strategy of the division expression.
Definition: DMatScalarDivExpr.h:138
#define BLAZE_DEVICE_CALLABLE
Conditional macro that sets host and device attributes when compiled with CUDA.
Definition: HostDevice.h:94
Header file for the MatScalarDivExpr base class.
If_t< IsExpression_v< MT >, const MT, const MT & > LeftOperand
Composite type of the left-hand side dense matrix expression.
Definition: DMatScalarDivExpr.h:177
ReturnType at(size_t i, size_t j) const
Checked access to the matrix elements.
Definition: DMatScalarDivExpr.h:475
ReturnType operator *() const
Direct access to the element at the current iterator position.
Definition: DMatScalarDivExpr.h:290
bool operator<=(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DMatScalarDivExpr.h:355
System settings for the inline keywords.
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,...
Definition: Assert.h:101
bool operator!=(const ConstIterator &rhs) const
Inequality comparison between two ConstIterator objects.
Definition: DMatScalarDivExpr.h:322
Header file for the IsExpression type trait class.
Header file for the function trace functionality.
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: DMatScalarDivExpr.h:583