35#ifndef _BLAZE_MATH_EXPRESSIONS_DVECSVECMULTEXPR_H_
36#define _BLAZE_MATH_EXPRESSIONS_DVECSVECMULTEXPR_H_
96 :
public VecVecMultExpr< SparseVector< DVecSVecMultExpr<VT1,VT2,TF>, TF > >
118 static constexpr bool returnExpr = !IsTemporary_v<RN1> && !IsTemporary_v<RN2>;
132 static constexpr bool useAssign = ( RequiresEvaluation_v<VT1> || RequiresEvaluation_v<VT2> );
136 template<
typename VT >
137 static constexpr bool UseAssign_v =
useAssign;
336 if( index >=
lhs_.size() ) {
339 return (*
this)[index];
368 inline size_t size() const noexcept {
379 return rhs_.nonZeros();
445 template<
typename T >
446 inline bool canAlias(
const T* alias )
const noexcept {
447 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
457 template<
typename T >
458 inline bool isAliased(
const T* alias )
const noexcept {
459 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
483 template<
typename VT >
498 for(
auto element=y.begin(); element!=y.end(); ++element )
499 (*lhs)[element->index()] = x[element->index()] * element->value();
518 template<
typename VT >
534 (*lhs).reserve( y.nonZeros() );
537 for(
auto element=y.begin(); element!=y.end(); ++element )
538 (*lhs).append( element->index(), x[element->index()] * element->value() );
557 template<
typename VT >
558 friend inline auto addAssign( DenseVector<VT,TF>& lhs,
const DVecSVecMultExpr& rhs )
559 -> EnableIf_t< UseAssign_v<VT> >
572 for(
auto element=y.begin(); element!=y.end(); ++element )
573 (*lhs)[element->index()] += x[element->index()] * element->value();
596 template<
typename VT >
597 friend inline auto subAssign( DenseVector<VT,TF>& lhs,
const DVecSVecMultExpr& rhs )
598 -> EnableIf_t< UseAssign_v<VT> >
611 for(
auto element=y.begin(); element!=y.end(); ++element )
612 (*lhs)[element->index()] -= x[element->index()] * element->value();
635 template<
typename VT >
636 friend inline auto multAssign( DenseVector<VT,TF>& lhs,
const DVecSVecMultExpr& rhs )
637 -> EnableIf_t< UseAssign_v<VT> >
650 const auto end( y.end() );
651 auto begin( y.begin() );
656 for( ; i<index; ++i )
662 for( ; i<(*lhs).size(); ++i )
707template<
typename VT1
710 , DisableIf_t< IsZero_v<VT2> >* =
nullptr >
711inline const DVecSVecMultExpr<VT1,VT2,TF>
712 dvecsvecmult(
const DenseVector<VT1,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
718 return DVecSVecMultExpr<VT1,VT2,TF>( *lhs, *rhs );
737template<
typename VT1
740 , EnableIf_t< IsZero_v<VT2> >* =
nullptr >
742 dvecsvecmult(
const DenseVector<VT1,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
750 using ReturnType =
const MultTrait_t< ResultType_t<VT1>, ResultType_t<VT2> >;
755 return ReturnType( (*lhs).size() );
788template<
typename VT1
796 if( (*lhs).size() != (*rhs).size() ) {
800 return dvecsvecmult( *lhs, *rhs );
815template<
typename VT1,
typename VT2,
bool TF >
816struct Size< DVecSVecMultExpr<VT1,VT2,TF>, 0UL >
817 :
public Max_t< Size<VT1,0UL>, Size<VT2,0UL> >
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::ConstIterator ConstIterator_t
Alias declaration for nested ConstIterator type definitions.
Definition: Aliases.h:130
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 the EnableIf class template.
Header file for the function trace functionality.
Header file for the If class template.
Header file for the IsExpression type trait class.
Header file for the IsTemporary type trait class.
Deactivation of problematic macros.
Header file for the MAYBE_UNUSED function template.
Header file for the multiplication trait.
Header file for the RemoveReference type trait.
Header file for the ValueIndexPair class.
Constraint on the data type.
Iterator over the elements of the dense vector-sparse vector multiplication expression.
Definition: DVecSVecMultExpr.h:175
const ConstIterator * operator->() const
Direct access to the sparse vector element at the current iterator position.
Definition: DVecSVecMultExpr.h:236
size_t index() const
Access to the current index of the sparse element.
Definition: DVecSVecMultExpr.h:256
ConstIterator(LeftOperand vec, IteratorType it)
Constructor for the ConstIterator class.
Definition: DVecSVecMultExpr.h:204
ReturnType value() const
Access to the current value of the sparse element.
Definition: DVecSVecMultExpr.h:246
IteratorCategory iterator_category
The iterator category.
Definition: DVecSVecMultExpr.h:191
Element ValueType
Type of the underlying pointers.
Definition: DVecSVecMultExpr.h:185
DifferenceType operator-(const ConstIterator &rhs) const
Calculating the number of elements between two expression iterators.
Definition: DVecSVecMultExpr.h:289
ConstIterator & operator++()
Pre-increment operator.
Definition: DVecSVecMultExpr.h:215
ValueType & ReferenceType
Reference return type.
Definition: DVecSVecMultExpr.h:187
LeftOperand vec_
Left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:296
ValueIndexPair< ElementType > Element
Element type of the sparse vector expression.
Definition: DVecSVecMultExpr.h:179
const Element operator*() const
Direct access to the sparse vector element at the current iterator position.
Definition: DVecSVecMultExpr.h:226
DifferenceType difference_type
Difference between two iterators.
Definition: DVecSVecMultExpr.h:195
ValueType * PointerType
Pointer return type.
Definition: DVecSVecMultExpr.h:186
std::forward_iterator_tag IteratorCategory
The iterator category.
Definition: DVecSVecMultExpr.h:184
bool operator!=(const ConstIterator &rhs) const
Inequality comparison between two ConstIterator objects.
Definition: DVecSVecMultExpr.h:278
bool operator==(const ConstIterator &rhs) const
Equality comparison between two ConstIterator objects.
Definition: DVecSVecMultExpr.h:267
ConstIterator_t< RemoveReference_t< RightOperand > > IteratorType
Iterator type of the sparse vector expression.
Definition: DVecSVecMultExpr.h:182
IteratorType it_
Iterator over the elements of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:297
ptrdiff_t DifferenceType
Difference between two iterators.
Definition: DVecSVecMultExpr.h:188
Expression object for dense vector-sparse vector multiplications.
Definition: DVecSVecMultExpr.h:98
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: DVecSVecMultExpr.h:446
ConstIterator begin() const
Returns an iterator to the first non-zero element of the sparse vector.
Definition: DVecSVecMultExpr.h:348
ResultType_t< VT2 > RT2
Result type of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:102
ConstIterator find(size_t index) const
Searches for a specific vector element.
Definition: DVecSVecMultExpr.h:389
RightOperand rightOperand() const noexcept
Returns the right-hand side sparse vector operand.
Definition: DVecSVecMultExpr.h:434
CompositeType_t< VT2 > CT2
Composite type of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:106
If_t< IsExpression_v< VT1 >, const VT1, const VT1 & > LeftOperand
Composite type of the left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:160
MultTrait_t< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: DVecSVecMultExpr.h:149
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: DVecSVecMultExpr.h:458
ConstIterator upperBound(size_t index) const
Returns an iterator to the first index greater then the given index.
Definition: DVecSVecMultExpr.h:413
decltype(std::declval< RN1 >() *std::declval< RN2 >()) ExprReturnType
Expression return type for the subscript operator.
Definition: DVecSVecMultExpr.h:121
If_t< useAssign, const ResultType, const DVecSVecMultExpr & > CompositeType
Data type for composite expression templates.
Definition: DVecSVecMultExpr.h:157
CompositeType_t< VT1 > CT1
Composite type of the left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:105
ConstIterator lowerBound(size_t index) const
Returns an iterator to the first index not less then the given index.
Definition: DVecSVecMultExpr.h:401
ReturnType at(size_t index) const
Checked access to the vector elements.
Definition: DVecSVecMultExpr.h:335
TransposeType_t< VT2 > TT2
Transpose type of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:108
DVecSVecMultExpr(const VT1 &lhs, const VT2 &rhs) noexcept
Constructor for the DVecSVecMultExpr class.
Definition: DVecSVecMultExpr.h:308
static constexpr bool useAssign
Compilation switch for the evaluation strategy of the multiplication expression.
Definition: DVecSVecMultExpr.h:132
ConstIterator end() const
Returns an iterator just past the last non-zero element of the sparse vector.
Definition: DVecSVecMultExpr.h:358
LeftOperand lhs_
Left-hand side dense vector of the multiplication expression.
Definition: DVecSVecMultExpr.h:465
const If_t< returnExpr, ExprReturnType, ElementType > ReturnType
Return type for expression template evaluations.
Definition: DVecSVecMultExpr.h:154
size_t size() const noexcept
Returns the current size/dimension of the vector.
Definition: DVecSVecMultExpr.h:368
ElementType_t< ResultType > ElementType
Resulting element type.
Definition: DVecSVecMultExpr.h:151
size_t nonZeros() const
Returns the number of non-zero elements in the sparse vector.
Definition: DVecSVecMultExpr.h:378
ReturnType_t< VT1 > RN1
Return type of the left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:103
RightOperand rhs_
Right-hand side sparse vector of the multiplication expression.
Definition: DVecSVecMultExpr.h:466
static constexpr bool smpAssignable
Compilation switch for the expression template assignment strategy.
Definition: DVecSVecMultExpr.h:168
TransposeType_t< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: DVecSVecMultExpr.h:150
If_t< IsExpression_v< VT2 >, const VT2, const VT2 & > RightOperand
Composite type of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:163
TransposeType_t< VT1 > TT1
Transpose type of the left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:107
ReturnType operator[](size_t index) const
Subscript operator for the direct access to the vector elements.
Definition: DVecSVecMultExpr.h:322
ResultType_t< VT1 > RT1
Result type of the left-hand side dense vector expression.
Definition: DVecSVecMultExpr.h:101
LeftOperand leftOperand() const noexcept
Returns the left-hand side dense vector operand.
Definition: DVecSVecMultExpr.h:424
ReturnType_t< VT2 > RN2
Return type of the right-hand side sparse vector expression.
Definition: DVecSVecMultExpr.h:104
static constexpr bool returnExpr
Compilation switch for the selection of the subscript operator return type.
Definition: DVecSVecMultExpr.h:118
Base class for N-dimensional dense vectors.
Definition: DenseVector.h:77
Base class for sparse vectors.
Definition: SparseVector.h:72
Index-value-pair for sparse vectors and matrices.
Definition: ValueIndexPair.h:75
Constraint on the data type.
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 SparseVector base class.
Header file for the VecVecMultExpr 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
#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_FORM_VALID_VECVECMULTEXPR(T1, T2)
Constraint on the data type.
Definition: VecVecMultExpr.h:104
#define BLAZE_CONSTRAINT_MUST_NOT_BE_ZERO_TYPE(T)
Constraint on the data type.
Definition: Zero.h:81
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_VECTOR_TYPE(T)
Constraint on the data type.
Definition: SparseVector.h:61
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_VECTOR_TYPE(T)
Constraint on the data type.
Definition: DenseVector.h:61
#define BLAZE_CONSTRAINT_MUST_BE_ZERO_TYPE(T)
Constraint on the data type.
Definition: Zero.h:61
typename MultTrait< T1, T2 >::Type MultTrait_t
Auxiliary alias declaration for the MultTrait class template.
Definition: MultTrait.h:165
constexpr void reset(Matrix< MT, SO > &matrix)
Resetting the given matrix.
Definition: Matrix.h:806
If_t< Less_t< T1, T2 >::value, T2, T1 > Max_t
Compile time value evaluation.
Definition: Max.h:73
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.
Definition: Assert.h:101
typename EnableIf< Condition, T >::Type EnableIf_t
Auxiliary type for the EnableIf class template.
Definition: EnableIf.h:138
constexpr void MAYBE_UNUSED(const Args &...)
Suppression of unused parameter warnings.
Definition: MaybeUnused.h:81
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_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.
Definition: Exception.h:235
#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 Size type trait.
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 multiplication expression templates.
Definition: VecVecMultExpr.h:68
Header file for the IsZero type trait.
Header file for the RequiresEvaluation type trait.
Header file for basic type definitions.
Header file for the Max_t alias template.