35#ifndef _BLAZE_MATH_EXPRESSIONS_DVECDVECKRONEXPR_H_
36#define _BLAZE_MATH_EXPRESSIONS_DVECDVECKRONEXPR_H_
88 :
public VecVecKronExpr< DenseVector< DVecDVecKronExpr<VT1,VT2,TF>, TF > >
110 static constexpr bool returnExpr = ( !IsTemporary_v<RN1> && !IsTemporary_v<RN2> );
181 if( index >=
lhs_.size() ) {
184 return (*
this)[index];
193 inline size_t size() const noexcept {
224 template<
typename T >
225 inline bool canAlias(
const T* alias )
const noexcept {
226 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
236 template<
typename T >
237 inline bool isAliased(
const T* alias )
const noexcept {
238 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
248 return rhs_.isAligned();
280 template<
typename VT >
287 if( rhs.
size() == 0UL ) {
294 const size_t N( y.size() );
296 for(
size_t i=0UL; i<x.size(); ++i ) {
297 if( !isDefault<strict>( x[i] ) ) {
298 for(
size_t j=0UL; j<N; ++j )
299 (*lhs)[i*N+j] = x[i] * y[j];
302 for(
size_t j=0UL; j<N; ++j )
303 reset( (*lhs)[i*N+j] );
322 template<
typename VT >
351 template<
typename VT >
352 friend inline void addAssign( DenseVector<VT,TF>& lhs,
const DVecDVecKronExpr& rhs )
358 if( rhs.size() == 0UL ) {
365 const size_t N( y.size() );
367 for(
size_t i=0UL; i<x.size(); ++i ) {
368 if( !isDefault<strict>( x[i] ) ) {
369 for(
size_t j=0UL; j<N; ++j )
370 (*lhs)[i*N+j] += x[i] * y[j];
394 template<
typename VT >
395 friend inline void subAssign( DenseVector<VT,TF>& lhs,
const DVecDVecKronExpr& rhs )
401 if( rhs.size() == 0UL ) {
408 const size_t N( y.size() );
410 for(
size_t i=0UL; i<x.size(); ++i ) {
411 if( !isDefault<strict>( x[i] ) ) {
412 for(
size_t j=0UL; j<N; ++j )
413 (*lhs)[i*N+j] -= x[i] * y[j];
437 template<
typename VT >
438 friend inline void multAssign( DenseVector<VT,TF>& lhs,
const DVecDVecKronExpr& rhs )
444 if( rhs.size() == 0UL ) {
451 const size_t N( y.size() );
453 for(
size_t i=0UL; i<x.size(); ++i ) {
454 if( !isDefault<strict>( x[i] ) ) {
455 for(
size_t j=0UL; j<N; ++j )
456 (*lhs)[i*N+j] *= x[i] * y[j];
459 for(
size_t j=0UL; j<N; ++j )
460 reset( (*lhs)[i*N+j] );
483 template<
typename VT >
484 friend inline void divAssign( DenseVector<VT,TF>& lhs,
const DVecDVecKronExpr& rhs )
490 if( rhs.size() == 0UL ) {
497 const size_t N( y.size() );
499 for(
size_t i=0UL; i<x.size(); ++i ) {
500 if( !isDefault<strict>( x[i] ) ) {
501 for(
size_t j=0UL; j<N; ++j )
502 (*lhs)[i*N+j] /= x[i] * y[j];
555template<
typename VT1
564 return ReturnType( *lhs, *rhs );
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::TransposeType TransposeType_t
Alias declaration for nested TransposeType type definitions.
Definition: Aliases.h:550
Header file for the alignment flag enumeration.
Header file for run time assertion macros.
Header file for the function trace functionality.
Header file for the If class template.
Header file for the isDefault shim.
Header file for the IsExpression type trait class.
Header file for the IsTemporary type trait class.
Header file for the Kron product trait.
Deactivation of problematic macros.
Header file for the type list functionality.
Expression object for dense vector-dense vector Kronecker product.
Definition: DVecDVecKronExpr.h:90
ReturnType operator[](size_t index) const
Subscript operator for the direct access to the vector elements.
Definition: DVecDVecKronExpr.h:167
const ResultType CompositeType
Data type for composite expression templates.
Definition: DVecDVecKronExpr.h:132
ReturnType_t< VT2 > RN2
Return type of the right-hand side dense vector expression.
Definition: DVecDVecKronExpr.h:96
const If_t< returnExpr, ExprReturnType, ElementType > ReturnType
Return type for expression template evaluations.
Definition: DVecDVecKronExpr.h:129
ElementType_t< VT1 > ET1
Element type of the left-hand side dense vector expression.
Definition: DVecDVecKronExpr.h:99
ElementType_t< ResultType > ElementType
Resulting element type.
Definition: DVecDVecKronExpr.h:126
bool canSMPAssign() const noexcept
Returns whether the expression can be used in SMP assignments.
Definition: DVecDVecKronExpr.h:257
decltype(std::declval< RN1 >()+std::declval< RN2 >()) ExprReturnType
Expression return type for the subscript operator.
Definition: DVecDVecKronExpr.h:113
ResultType_t< VT2 > RT2
Result type of the right-hand side dense vector expression.
Definition: DVecDVecKronExpr.h:94
static constexpr bool smpAssignable
Compilation switch for the expression template assignment strategy.
Definition: DVecDVecKronExpr.h:146
If_t< IsExpression_v< VT1 >, const VT1, const VT1 & > LeftOperand
Composite type of the left-hand side dense vector expression.
Definition: DVecDVecKronExpr.h:135
LeftOperand leftOperand() const noexcept
Returns the left-hand side dense vector operand.
Definition: DVecDVecKronExpr.h:203
static constexpr bool returnExpr
Compilation switch for the selection of the subscript operator return type.
Definition: DVecDVecKronExpr.h:110
ElementType_t< VT2 > ET2
Element type of the right-hand side dense vector expression.
Definition: DVecDVecKronExpr.h:100
ResultType_t< VT1 > RT1
Result type of the left-hand side dense vector expression.
Definition: DVecDVecKronExpr.h:93
CompositeType_t< VT2 > CT2
Composite type of the right-hand side dense vector expression.
Definition: DVecDVecKronExpr.h:98
DVecDVecKronExpr(const VT1 &lhs, const VT2 &rhs) noexcept
Constructor for the DVecDVecKronExpr class.
Definition: DVecDVecKronExpr.h:155
size_t size() const noexcept
Returns the current size/dimension of the vector.
Definition: DVecDVecKronExpr.h:193
ReturnType at(size_t index) const
Checked access to the vector elements.
Definition: DVecDVecKronExpr.h:180
If_t< IsExpression_v< VT2 >, const VT2, const VT2 & > RightOperand
Composite type of the right-hand side dense vector expression.
Definition: DVecDVecKronExpr.h:138
RightOperand rightOperand() const noexcept
Returns the right-hand side dense vector operand.
Definition: DVecDVecKronExpr.h:213
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: DVecDVecKronExpr.h:225
bool isAligned() const noexcept
Returns whether the operands of the expression are properly aligned in memory.
Definition: DVecDVecKronExpr.h:247
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: DVecDVecKronExpr.h:237
ReturnType_t< VT1 > RN1
Return type of the left-hand side dense vector expression.
Definition: DVecDVecKronExpr.h:95
RightOperand rhs_
Right-hand side dense vector of the Kronecker product expression.
Definition: DVecDVecKronExpr.h:265
TransposeType_t< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: DVecDVecKronExpr.h:125
KronTrait_t< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: DVecDVecKronExpr.h:124
static constexpr bool simdEnabled
Compilation switch for the expression template evaluation strategy.
Definition: DVecDVecKronExpr.h:143
LeftOperand lhs_
Left-hand side dense vector of the Kronecker product expression.
Definition: DVecDVecKronExpr.h:264
CompositeType_t< VT1 > CT1
Composite type of the left-hand side dense vector expression.
Definition: DVecDVecKronExpr.h:97
Base class for N-dimensional dense vectors.
Definition: DenseVector.h:77
Base class for sparse vectors.
Definition: SparseVector.h:72
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 DenseVector base class.
Header file for the VecVecKronExpr base class.
decltype(auto) serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:812
decltype(auto) kron(const DenseVector< VT1, TF > &lhs, const DenseVector< VT2, TF > &rhs)
Computes the Kronecker product of two dense vectors ( ).
Definition: DVecDVecKronExpr.h:559
#define BLAZE_CONSTRAINT_MUST_NOT_REQUIRE_EVALUATION(T)
Constraint on the data type.
Definition: RequiresEvaluation.h:81
#define BLAZE_CONSTRAINT_MUST_BE_VECTOR_WITH_TRANSPOSE_FLAG(T, TF)
Constraint on the data type.
Definition: TransposeFlag.h:63
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_VECTOR_TYPE(T)
Constraint on the data type.
Definition: DenseVector.h:61
#define BLAZE_CONSTRAINT_MUST_FORM_VALID_VECVECKRONEXPR(T1, T2)
Constraint on the data type.
Definition: VecVecKronExpr.h:102
typename KronTrait< T1, T2 >::Type KronTrait_t
Auxiliary alias declaration for the KronTrait class template.
Definition: KronTrait.h:137
constexpr void reset(Matrix< MT, SO > &matrix)
Resetting the given matrix.
Definition: Matrix.h:806
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.
Definition: Assert.h:101
typename If< Condition >::template Type< T1, T2 > If_t
Auxiliary alias template for the If class template.
Definition: If.h:108
#define BLAZE_THROW_OUT_OF_RANGE(MESSAGE)
Macro for the emission of a std::out_of_range exception.
Definition: Exception.h:331
#define BLAZE_FUNCTION_TRACE
Function trace macro.
Definition: FunctionTrace.h:94
Header file for the exception macros of the math module.
Constraint on the data type.
Header file for all forward declarations for expression class templates.
Header file for the reset shim.
Header file for the serial shim.
Base class for all compute expression templates.
Definition: Computation.h:68
Base class for all vector/vector Kronecker expression templates.
Definition: VecVecKronExpr.h:69
Header file for basic type definitions.