35#ifndef _BLAZE_MATH_EXPRESSIONS_SVECSVECSUBEXPR_H_
36#define _BLAZE_MATH_EXPRESSIONS_SVECSVECSUBEXPR_H_
92 :
public VecVecSubExpr< SparseVector< SVecSVecSubExpr<VT1,VT2,TF>, TF > >
112 static constexpr bool returnExpr = ( !IsTemporary_v<RN1> && !IsTemporary_v<RN2> );
125 template<
typename VT >
126 static constexpr bool UseSMPAssign_v = VT::smpAssignable;
191 if( index >=
lhs_.size() ) {
194 return (*
this)[index];
203 inline size_t size() const noexcept {
244 template<
typename T >
245 inline bool canAlias(
const T* alias )
const noexcept {
246 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
256 template<
typename T >
257 inline bool isAliased(
const T* alias )
const noexcept {
258 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
281 template<
typename VT >
296 const auto lend( x.end() );
297 const auto rend( y.end() );
299 for(
auto l=x.begin(); l!=lend; ++l ) {
300 (*lhs)[l->index()] = l->value();
303 for(
auto r=y.begin(); r!=rend; ++r ) {
305 (*lhs)[r->index()] = -r->value();
307 (*lhs)[r->index()] -= r->value();
326 template<
typename VT >
341 const auto lend( x.end() );
342 const auto rend( y.end() );
344 for(
auto l=x.begin(); l!=lend; ++l ) {
345 (*lhs)[l->index()] = l->value();
348 for(
auto r=y.begin(); r!=rend; ++r ) {
349 (*lhs)[r->index()] -= r->value();
367 template<
typename VT >
368 friend inline void assign( SparseVector<VT,TF>& lhs,
const SVecSVecSubExpr& rhs )
382 (*lhs).reserve(
min( x.size(), x.nonZeros() + y.nonZeros() ) );
385 const auto lend( x.end() );
386 const auto rend( y.end() );
391 while( l != lend && r != rend )
393 if( l->index() < r->index() ) {
394 (*lhs).append( l->index(), l->value() );
397 else if( l->index() > r->index() ) {
398 (*lhs).append( r->index(), -r->value() );
402 (*lhs).append( l->index(), l->value() - r->value() );
409 (*lhs).append( l->index(), l->value() );
414 (*lhs).append( r->index(), -r->value() );
433 template<
typename VT >
434 friend inline void addAssign( DenseVector<VT,TF>& lhs,
const SVecSVecSubExpr& rhs )
440 addAssign( *lhs, rhs.lhs_ );
441 subAssign( *lhs, rhs.rhs_ );
462 template<
typename VT >
463 friend inline void subAssign( DenseVector<VT,TF>& lhs,
const SVecSVecSubExpr& rhs )
469 subAssign( *lhs, rhs.lhs_ );
470 addAssign( *lhs, rhs.rhs_ );
491 template<
typename VT >
492 friend inline void multAssign( DenseVector<VT,TF>& lhs,
const SVecSVecSubExpr& rhs )
503 multAssign( *lhs, tmp );
534 template<
typename VT >
536 -> EnableIf_t< UseSMPAssign_v<VT> >
567 template<
typename VT >
569 -> EnableIf_t< UseSMPAssign_v<VT> >
600 template<
typename VT >
602 -> EnableIf_t< UseSMPAssign_v<VT> >
655template<
typename VT1
658 ,
DisableIf_t< ( ( IsZero_v<VT1> || IsZero_v<VT2> ) &&
659 IsSame_v< ElementType_t<VT1>, ElementType_t<VT2> > ) ||
660 ( IsZero_v<VT1> && IsZero_v<VT2> ) >* =
nullptr >
661inline const SVecSVecSubExpr<VT1,VT2,TF>
662 svecsvecsub(
const SparseVector<VT1,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
668 return SVecSVecSubExpr<VT1,VT2,TF>( *lhs, *rhs );
687template<
typename VT1
690 , EnableIf_t< !IsZero_v<VT1> && IsZero_v<VT2> &&
691 IsSame_v< ElementType_t<VT1>, ElementType_t<VT2> > >* =
nullptr >
693 svecsvecsub(
const SparseVector<VT1,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
720template<
typename VT1
723 , EnableIf_t< IsZero_v<VT1> && !IsZero_v<VT2> &&
724 IsSame_v< ElementType_t<VT1>, ElementType_t<VT2> > >* =
nullptr >
726 svecsvecsub(
const SparseVector<VT1,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
752template<
typename VT1
755 , EnableIf_t< IsZero_v<VT1> && IsZero_v<VT2> >* =
nullptr >
757 svecsvecsub(
const SparseVector<VT1,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
765 using ReturnType =
const SubTrait_t< ResultType_t<VT1>, ResultType_t<VT2> >;
770 return ReturnType( (*lhs).size() );
800template<
typename VT1
808 if( (*lhs).size() != (*rhs).size() ) {
812 return svecsvecsub( *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 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 isDefault shim.
Header file for the IsExpression type trait class.
Header file for the IsResizable type trait.
Header file for the IsSame and IsStrictlySame type traits.
Header file for the IsTemporary type trait class.
Deactivation of problematic macros.
Header file for the MAYBE_UNUSED function template.
Header file for the subtraction trait.
Constraint on the data type.
Base class for N-dimensional dense vectors.
Definition: DenseVector.h:77
Expression object for sparse vector-sparse vector subtractions.
Definition: SVecSVecSubExpr.h:94
CompositeType_t< VT2 > CT2
Composite type of the right-hand side sparse vector expression.
Definition: SVecSVecSubExpr.h:102
LeftOperand lhs_
Left-hand side sparse vector of the subtraction expression.
Definition: SVecSVecSubExpr.h:264
SVecSVecSubExpr(const VT1 &lhs, const VT2 &rhs) noexcept
Constructor for the SVecSVecSubExpr class.
Definition: SVecSVecSubExpr.h:163
ResultType_t< VT2 > RT2
Result type of the right-hand side sparse vector expression.
Definition: SVecSVecSubExpr.h:98
ReturnType_t< VT1 > RN1
Return type of the left-hand side sparse vector expression.
Definition: SVecSVecSubExpr.h:99
size_t size() const noexcept
Returns the current size/dimension of the vector.
Definition: SVecSVecSubExpr.h:203
If_t< IsExpression_v< VT1 >, const VT1, const VT1 & > LeftOperand
Composite type of the left-hand side sparse vector expression.
Definition: SVecSVecSubExpr.h:149
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: SVecSVecSubExpr.h:257
LeftOperand leftOperand() const noexcept
Returns the left-hand side sparse vector operand.
Definition: SVecSVecSubExpr.h:223
ReturnType operator[](size_t index) const
Subscript operator for the direct access to the vector elements.
Definition: SVecSVecSubExpr.h:177
static constexpr bool returnExpr
Compilation switch for the selection of the subscript operator return type.
Definition: SVecSVecSubExpr.h:112
SubTrait_t< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: SVecSVecSubExpr.h:138
const ResultType CompositeType
Data type for composite expression templates.
Definition: SVecSVecSubExpr.h:146
const If_t< returnExpr, ExprReturnType, ElementType > ReturnType
Return type for expression template evaluations.
Definition: SVecSVecSubExpr.h:143
ElementType_t< ResultType > ElementType
Resulting element type.
Definition: SVecSVecSubExpr.h:140
RightOperand rightOperand() const noexcept
Returns the right-hand side sparse vector operand.
Definition: SVecSVecSubExpr.h:233
decltype(std::declval< RN1 >() - std::declval< RN2 >()) ExprReturnType
Expression return type for the subscript operator.
Definition: SVecSVecSubExpr.h:115
CompositeType_t< VT1 > CT1
Composite type of the left-hand side sparse vector expression.
Definition: SVecSVecSubExpr.h:101
RightOperand rhs_
Right-hand side sparse vector of the subtraction expression.
Definition: SVecSVecSubExpr.h:265
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: SVecSVecSubExpr.h:245
ReturnType at(size_t index) const
Checked access to the vector elements.
Definition: SVecSVecSubExpr.h:190
ReturnType_t< VT2 > RN2
Return type of the right-hand side sparse vector expression.
Definition: SVecSVecSubExpr.h:100
static constexpr bool smpAssignable
Compilation switch for the expression template assignment strategy.
Definition: SVecSVecSubExpr.h:157
size_t nonZeros() const
Returns the number of non-zero elements in the sparse vector.
Definition: SVecSVecSubExpr.h:213
TransposeType_t< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: SVecSVecSubExpr.h:139
If_t< IsExpression_v< VT2 >, const VT2, const VT2 & > RightOperand
Composite type of the right-hand side sparse vector expression.
Definition: SVecSVecSubExpr.h:152
ResultType_t< VT1 > RT1
Result type of the left-hand side sparse vector expression.
Definition: SVecSVecSubExpr.h:97
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 SparseVector base class.
Header file for the VecVecSubExpr base class.
decltype(auto) min(const DenseMatrix< MT1, SO1 > &lhs, const DenseMatrix< MT2, SO2 > &rhs)
Computes the componentwise minimum of the dense matrices lhs and rhs.
Definition: DMatDMatMapExpr.h:1339
decltype(auto) serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:812
bool isDefault(const DiagonalMatrix< MT, SO, DF > &m)
Returns whether the given diagonal matrix is in default state.
Definition: DiagonalMatrix.h:169
#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_VECVECSUBEXPR(T1, T2)
Constraint on the data type.
Definition: VecVecSubExpr.h:104
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_VECTOR_TYPE(T)
Constraint on the data type.
Definition: SparseVector.h:61
#define BLAZE_CONSTRAINT_MUST_BE_ZERO_TYPE(T)
Constraint on the data type.
Definition: Zero.h:61
typename SubTrait< T1, T2 >::Type SubTrait_t
Auxiliary alias declaration for the SubTrait class template.
Definition: SubTrait.h:163
#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 smpMultAssign(Vector< VT1, TF1 > &lhs, const Vector< VT2, TF2 > &rhs) -> EnableIf_t< IsDenseVector_v< VT1 > >
Default implementation of the SMP multiplication assignment of a vector to a dense vector.
Definition: DenseVector.h:192
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
constexpr bool IsSame_v
Auxiliary variable template for the IsSame type trait.
Definition: IsSame.h:159
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
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.
Constraint on the data type.
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 vector/vector subtraction expression templates.
Definition: VecVecSubExpr.h:68
Header file for the IsZero type trait.
Header file for basic type definitions.
Header file for the generic min algorithm.