Blaze 3.9
SVecSVecAddExpr.h
Go to the documentation of this file.
1//=================================================================================================
33//=================================================================================================
34
35#ifndef _BLAZE_MATH_EXPRESSIONS_SVECSVECADDEXPR_H_
36#define _BLAZE_MATH_EXPRESSIONS_SVECSVECADDEXPR_H_
37
38
39//*************************************************************************************************
40// Includes
41//*************************************************************************************************
42
43#include <utility>
44#include <blaze/math/Aliases.h>
64#include <blaze/util/Assert.h>
65#include <blaze/util/EnableIf.h>
68#include <blaze/util/mpl/If.h>
69#include <blaze/util/Types.h>
71
72
73namespace blaze {
74
75//=================================================================================================
76//
77// CLASS SVECSVECADDEXPR
78//
79//=================================================================================================
80
81//*************************************************************************************************
88template< typename VT1 // Type of the left-hand side sparse vector
89 , typename VT2 // Type of the right-hand side sparse vector
90 , bool TF > // Transpose flag
92 : public VecVecAddExpr< SparseVector< SVecSVecAddExpr<VT1,VT2,TF>, TF > >
93 , private Computation
94{
95 private:
96 //**Type definitions****************************************************************************
103 //**********************************************************************************************
104
105 //**Return type evaluation**********************************************************************
107
112 static constexpr bool returnExpr = ( !IsTemporary_v<RN1> && !IsTemporary_v<RN2> );
113
115 using ExprReturnType = decltype( std::declval<RN1>() + std::declval<RN2>() );
116 //**********************************************************************************************
117
118 //**Parallel evaluation strategy****************************************************************
120
125 template< typename VT >
126 static constexpr bool UseSMPAssign_v = VT::smpAssignable;
128 //**********************************************************************************************
129
130 public:
131 //**Type definitions****************************************************************************
134
137
141
144
147
149 using LeftOperand = If_t< IsExpression_v<VT1>, const VT1, const VT1& >;
150
152 using RightOperand = If_t< IsExpression_v<VT2>, const VT2, const VT2& >;
153 //**********************************************************************************************
154
155 //**Compilation flags***************************************************************************
157 static constexpr bool smpAssignable = false;
158 //**********************************************************************************************
159
160 //**Constructor*********************************************************************************
163 inline SVecSVecAddExpr( const VT1& lhs, const VT2& rhs ) noexcept
164 : lhs_( lhs ) // Left-hand side sparse vector of the addition expression
165 , rhs_( rhs ) // Right-hand side sparse vector of the addition expression
166 {
167 BLAZE_INTERNAL_ASSERT( lhs.size() == rhs.size(), "Invalid vector sizes" );
168 }
169 //**********************************************************************************************
170
171 //**Subscript operator**************************************************************************
177 inline ReturnType operator[]( size_t index ) const {
178 BLAZE_INTERNAL_ASSERT( index < lhs_.size(), "Invalid vector access index" );
179 return lhs_[index] + rhs_[index];
180 }
181 //**********************************************************************************************
182
183 //**At function*********************************************************************************
190 inline ReturnType at( size_t index ) const {
191 if( index >= lhs_.size() ) {
192 BLAZE_THROW_OUT_OF_RANGE( "Invalid vector access index" );
193 }
194 return (*this)[index];
195 }
196 //**********************************************************************************************
197
198 //**Size function*******************************************************************************
203 inline size_t size() const noexcept {
204 return lhs_.size();
205 }
206 //**********************************************************************************************
207
208 //**NonZeros function***************************************************************************
213 inline size_t nonZeros() const {
214 return min( lhs_.size(), lhs_.nonZeros() + rhs_.nonZeros() );
215 }
216 //**********************************************************************************************
217
218 //**Left operand access*************************************************************************
223 inline LeftOperand leftOperand() const noexcept {
224 return lhs_;
225 }
226 //**********************************************************************************************
227
228 //**Right operand access************************************************************************
233 inline RightOperand rightOperand() const noexcept {
234 return rhs_;
235 }
236 //**********************************************************************************************
237
238 //**********************************************************************************************
244 template< typename T >
245 inline bool canAlias( const T* alias ) const noexcept {
246 return ( lhs_.canAlias( alias ) || rhs_.canAlias( alias ) );
247 }
248 //**********************************************************************************************
249
250 //**********************************************************************************************
256 template< typename T >
257 inline bool isAliased( const T* alias ) const noexcept {
258 return ( lhs_.isAliased( alias ) || rhs_.isAliased( alias ) );
259 }
260 //**********************************************************************************************
261
262 private:
263 //**Member variables****************************************************************************
266 //**********************************************************************************************
267
268 //**Default assignment to dense vectors*********************************************************
281 template< typename VT > // Type of the target dense vector
282 friend inline auto assign( DenseVector<VT,TF>& lhs, const SVecSVecAddExpr& rhs )
284 {
286
287 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
288
289 CT1 x( serial( rhs.lhs_ ) ); // Evaluation of the left-hand side sparse vector operand
290 CT2 y( serial( rhs.rhs_ ) ); // Evaluation of the right-hand side sparse vector operand
291
292 BLAZE_INTERNAL_ASSERT( x.size() == rhs.lhs_.size(), "Invalid vector size" );
293 BLAZE_INTERNAL_ASSERT( y.size() == rhs.rhs_.size(), "Invalid vector size" );
294 BLAZE_INTERNAL_ASSERT( x.size() == (*lhs).size() , "Invalid vector size" );
295
296 const auto lend( x.end() );
297 const auto rend( y.end() );
298
299 for( auto l=x.begin(); l!=lend; ++l ) {
300 (*lhs)[l->index()] = l->value();
301 }
302
303 for( auto r=y.begin(); r!=rend; ++r ) {
304 if( isDefault( (*lhs)[r->index()] ) )
305 (*lhs)[r->index()] = r->value();
306 else
307 (*lhs)[r->index()] += r->value();
308 }
309 }
311 //**********************************************************************************************
312
313 //**Optimized assignment to dense vectors*******************************************************
326 template< typename VT > // Type of the target dense vector
327 friend inline auto assign( DenseVector<VT,TF>& lhs, const SVecSVecAddExpr& rhs )
329 {
331
332 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
333
334 CT1 x( serial( rhs.lhs_ ) ); // Evaluation of the left-hand side sparse vector operand
335 CT2 y( serial( rhs.rhs_ ) ); // Evaluation of the right-hand side sparse vector operand
336
337 BLAZE_INTERNAL_ASSERT( x.size() == rhs.lhs_.size(), "Invalid vector size" );
338 BLAZE_INTERNAL_ASSERT( y.size() == rhs.rhs_.size(), "Invalid vector size" );
339 BLAZE_INTERNAL_ASSERT( x.size() == (*lhs).size() , "Invalid vector size" );
340
341 const auto lend( x.end() );
342 const auto rend( y.end() );
343
344 for( auto l=x.begin(); l!=lend; ++l ) {
345 (*lhs)[l->index()] = l->value();
346 }
347
348 for( auto r=y.begin(); r!=rend; ++r ) {
349 (*lhs)[r->index()] += r->value();
350 }
351 }
353 //**********************************************************************************************
354
355 //**Assignment to sparse vectors****************************************************************
367 template< typename VT > // Type of the target sparse vector
368 friend inline void assign( SparseVector<VT,TF>& lhs, const SVecSVecAddExpr& rhs )
369 {
371
372 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
373
374 CT1 x( serial( rhs.lhs_ ) ); // Evaluation of the left-hand side sparse vector operand
375 CT2 y( serial( rhs.rhs_ ) ); // Evaluation of the right-hand side sparse vector operand
376
377 BLAZE_INTERNAL_ASSERT( x.size() == rhs.lhs_.size(), "Invalid vector size" );
378 BLAZE_INTERNAL_ASSERT( y.size() == rhs.rhs_.size(), "Invalid vector size" );
379 BLAZE_INTERNAL_ASSERT( x.size() == (*lhs).size() , "Invalid vector size" );
380
381 // Final memory allocation (based on the evaluated operands)
382 (*lhs).reserve( min( x.size(), x.nonZeros() + y.nonZeros() ) );
383
384 // Performing the vector addition
385 const auto lend( x.end() );
386 const auto rend( y.end() );
387
388 auto l( x.begin() );
389 auto r( y.begin() );
390
391 while( l != lend && r != rend )
392 {
393 if( l->index() < r->index() ) {
394 (*lhs).append( l->index(), l->value() );
395 ++l;
396 }
397 else if( l->index() > r->index() ) {
398 (*lhs).append( r->index(), r->value() );
399 ++r;
400 }
401 else {
402 (*lhs).append( l->index(), l->value() + r->value() );
403 ++l;
404 ++r;
405 }
406 }
407
408 while( l != lend ) {
409 (*lhs).append( l->index(), l->value() );
410 ++l;
411 }
412
413 while( r != rend ) {
414 (*lhs).append( r->index(), r->value() );
415 ++r;
416 }
417 }
419 //**********************************************************************************************
420
421 //**Addition assignment to dense vectors********************************************************
433 template< typename VT > // Type of the target dense vector
434 friend inline void addAssign( DenseVector<VT,TF>& lhs, const SVecSVecAddExpr& rhs )
435 {
437
438 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
439
440 addAssign( *lhs, rhs.lhs_ );
441 addAssign( *lhs, rhs.rhs_ );
442 }
444 //**********************************************************************************************
445
446 //**Addition assignment to sparse vectors*******************************************************
447 // No special implementation for the addition assignment to sparse vectors.
448 //**********************************************************************************************
449
450 //**Subtraction assignment to dense vectors*****************************************************
462 template< typename VT > // Type of the target dense vector
463 friend inline void subAssign( DenseVector<VT,TF>& lhs, const SVecSVecAddExpr& rhs )
464 {
466
467 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
468
469 subAssign( *lhs, rhs.lhs_ );
470 subAssign( *lhs, rhs.rhs_ );
471 }
473 //**********************************************************************************************
474
475 //**Subtraction assignment to sparse vectors****************************************************
476 // No special implementation for the subtraction assignment to sparse vectors.
477 //**********************************************************************************************
478
479 //**Multiplication assignment to dense vectors**************************************************
491 template< typename VT > // Type of the target dense vector
492 friend inline void multAssign( DenseVector<VT,TF>& lhs, const SVecSVecAddExpr& rhs )
493 {
495
499
500 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
501
502 const ResultType tmp( serial( rhs ) );
503 multAssign( *lhs, tmp );
504 }
506 //**********************************************************************************************
507
508 //**Multiplication assignment to sparse vectors*************************************************
509 // No special implementation for the multiplication assignment to sparse vectors.
510 //**********************************************************************************************
511
512 //**SMP assignment to dense vectors*************************************************************
513 // No special implementation for the SMP assignment to dense vectors.
514 //**********************************************************************************************
515
516 //**SMP assignment to sparse vectors************************************************************
517 // No special implementation for the SMP assignment to sparse vectors.
518 //**********************************************************************************************
519
520 //**SMP addition assignment to dense vectors****************************************************
534 template< typename VT > // Type of the target dense vector
535 friend inline auto smpAddAssign( DenseVector<VT,TF>& lhs, const SVecSVecAddExpr& rhs )
536 -> EnableIf_t< UseSMPAssign_v<VT> >
537 {
539
540 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
541
542 smpAddAssign( *lhs, rhs.lhs_ );
543 smpAddAssign( *lhs, rhs.rhs_ );
544 }
546 //**********************************************************************************************
547
548 //**SMP addition assignment to sparse vectors***************************************************
549 // No special implementation for the SMP addition assignment to sparse vectors.
550 //**********************************************************************************************
551
552 //**SMP subtraction assignment to dense vectors*************************************************
566 template< typename VT > // Type of the target dense vector
567 friend inline auto smpSubAssign( DenseVector<VT,TF>& lhs, const SVecSVecAddExpr& rhs )
568 -> EnableIf_t< UseSMPAssign_v<VT> >
569 {
571
572 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
573
574 smpSubAssign( *lhs, rhs.lhs_ );
575 smpSubAssign( *lhs, rhs.rhs_ );
576 }
578 //**********************************************************************************************
579
580 //**SMP subtraction assignment to sparse vectors************************************************
581 // No special implementation for the SMP subtraction assignment to sparse vectors.
582 //**********************************************************************************************
583
584 //**SMP multiplication assignment to dense vectors**********************************************
599 template< typename VT > // Type of the target dense vector
600 friend inline auto smpMultAssign( DenseVector<VT,TF>& lhs, const SVecSVecAddExpr& rhs )
601 -> EnableIf_t< UseSMPAssign_v<VT> >
602 {
604
608
609 BLAZE_INTERNAL_ASSERT( (*lhs).size() == rhs.size(), "Invalid vector sizes" );
610
611 const ResultType tmp( rhs );
612 smpMultAssign( *lhs, tmp );
613 }
615 //**********************************************************************************************
616
617 //**SMP multiplication assignment to sparse vectors*********************************************
618 // No special implementation for the SMP multiplication assignment to sparse vectors.
619 //**********************************************************************************************
620
621 //**Compile time checks*************************************************************************
629 //**********************************************************************************************
630};
631//*************************************************************************************************
632
633
634
635
636//=================================================================================================
637//
638// GLOBAL BINARY ARITHMETIC OPERATORS
639//
640//=================================================================================================
641
642//*************************************************************************************************
654template< typename VT1 // Type of the left-hand side sparse vector
655 , typename VT2 // Type of the right-hand side sparse vector
656 , bool TF // Transpose flag
657 , DisableIf_t< ( ( IsZero_v<VT1> || IsZero_v<VT2> ) &&
658 IsSame_v< ElementType_t<VT1>, ElementType_t<VT2> > ) ||
659 ( IsZero_v<VT1> && IsZero_v<VT2> ) >* = nullptr >
660inline const SVecSVecAddExpr<VT1,VT2,TF>
661 svecsvecadd( const SparseVector<VT1,TF>& lhs, const SparseVector<VT2,TF>& rhs )
662{
664
665 BLAZE_INTERNAL_ASSERT( (*lhs).size() == (*rhs).size(), "Invalid vector sizes" );
666
667 return SVecSVecAddExpr<VT1,VT2,TF>( *lhs, *rhs );
668}
670//*************************************************************************************************
671
672
673//*************************************************************************************************
686template< typename VT1 // Type of the left-hand side sparse vector
687 , typename VT2 // Type of the right-hand side sparse vector
688 , bool TF // Transpose flag
689 , EnableIf_t< !IsZero_v<VT1> && IsZero_v<VT2> &&
690 IsSame_v< ElementType_t<VT1>, ElementType_t<VT2> > >* = nullptr >
691inline const VT1&
692 svecsvecadd( const SparseVector<VT1,TF>& lhs, const SparseVector<VT2,TF>& rhs )
693{
695
696 MAYBE_UNUSED( rhs );
697
698 BLAZE_INTERNAL_ASSERT( (*lhs).size() == (*rhs).size(), "Invalid vector sizes" );
699
700 return (*lhs);
701}
703//*************************************************************************************************
704
705
706//*************************************************************************************************
719template< typename VT1 // Type of the left-hand side sparse vector
720 , typename VT2 // Type of the right-hand side sparse vector
721 , bool TF // Transpose flag
722 , EnableIf_t< IsZero_v<VT1> && !IsZero_v<VT2> &&
723 IsSame_v< ElementType_t<VT1>, ElementType_t<VT2> > >* = nullptr >
724inline const VT2&
725 svecsvecadd( const SparseVector<VT1,TF>& lhs, const SparseVector<VT2,TF>& rhs )
726{
728
729 MAYBE_UNUSED( lhs );
730
731 BLAZE_INTERNAL_ASSERT( (*lhs).size() == (*rhs).size(), "Invalid vector sizes" );
732
733 return (*rhs);
734}
736//*************************************************************************************************
737
738
739//*************************************************************************************************
751template< typename VT1 // Type of the left-hand side sparse vector
752 , typename VT2 // Type of the right-hand side sparse vector
753 , bool TF // Transpose flag
754 , EnableIf_t< IsZero_v<VT1> && IsZero_v<VT2> >* = nullptr >
755inline decltype(auto)
756 svecsvecadd( const SparseVector<VT1,TF>& lhs, const SparseVector<VT2,TF>& rhs )
757{
759
760 MAYBE_UNUSED( rhs );
761
762 BLAZE_INTERNAL_ASSERT( (*lhs).size() == (*rhs).size(), "Invalid vector sizes" );
763
764 using ReturnType = const AddTrait_t< ResultType_t<VT1>, ResultType_t<VT2> >;
765
768
769 return ReturnType( (*lhs).size() );
770}
772//*************************************************************************************************
773
774
775//*************************************************************************************************
799template< typename VT1 // Type of the left-hand side sparse vector
800 , typename VT2 // Type of the right-hand side sparse vector
801 , bool TF > // Transpose flag
802inline decltype(auto)
803 operator+( const SparseVector<VT1,TF>& lhs, const SparseVector<VT2,TF>& rhs )
804{
806
807 if( (*lhs).size() != (*rhs).size() ) {
808 BLAZE_THROW_INVALID_ARGUMENT( "Vector sizes do not match" );
809 }
810
811 return svecsvecadd( *lhs, *rhs );
812}
813//*************************************************************************************************
814
815} // namespace blaze
816
817#endif
Header file for the addition trait.
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.
Constraint on the data type.
Base class for N-dimensional dense vectors.
Definition: DenseVector.h:77
Expression object for sparse vector-sparse vector additions.
Definition: SVecSVecAddExpr.h:94
const ResultType CompositeType
Data type for composite expression templates.
Definition: SVecSVecAddExpr.h:146
AddTrait_t< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: SVecSVecAddExpr.h:138
ReturnType_t< VT1 > RN1
Return type of the left-hand side sparse vector expression.
Definition: SVecSVecAddExpr.h:99
static constexpr bool smpAssignable
Compilation switch for the expression template assignment strategy.
Definition: SVecSVecAddExpr.h:157
ResultType_t< VT1 > RT1
Result type of the left-hand side sparse vector expression.
Definition: SVecSVecAddExpr.h:97
LeftOperand leftOperand() const noexcept
Returns the left-hand side sparse vector operand.
Definition: SVecSVecAddExpr.h:223
LeftOperand lhs_
Left-hand side sparse vector of the addition expression.
Definition: SVecSVecAddExpr.h:264
CompositeType_t< VT2 > CT2
Composite type of the right-hand side sparse vector expression.
Definition: SVecSVecAddExpr.h:102
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: SVecSVecAddExpr.h:245
ElementType_t< ResultType > ElementType
Resulting element type.
Definition: SVecSVecAddExpr.h:140
ReturnType at(size_t index) const
Checked access to the vector elements.
Definition: SVecSVecAddExpr.h:190
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: SVecSVecAddExpr.h:257
TransposeType_t< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: SVecSVecAddExpr.h:139
If_t< IsExpression_v< VT1 >, const VT1, const VT1 & > LeftOperand
Composite type of the left-hand side sparse vector expression.
Definition: SVecSVecAddExpr.h:149
CompositeType_t< VT1 > CT1
Composite type of the left-hand side sparse vector expression.
Definition: SVecSVecAddExpr.h:101
size_t size() const noexcept
Returns the current size/dimension of the vector.
Definition: SVecSVecAddExpr.h:203
decltype(std::declval< RN1 >()+std::declval< RN2 >()) ExprReturnType
Expression return type for the subscript operator.
Definition: SVecSVecAddExpr.h:115
const If_t< returnExpr, ExprReturnType, ElementType > ReturnType
Return type for expression template evaluations.
Definition: SVecSVecAddExpr.h:143
If_t< IsExpression_v< VT2 >, const VT2, const VT2 & > RightOperand
Composite type of the right-hand side sparse vector expression.
Definition: SVecSVecAddExpr.h:152
size_t nonZeros() const
Returns the number of non-zero elements in the sparse vector.
Definition: SVecSVecAddExpr.h:213
RightOperand rhs_
Right-hand side sparse vector of the addition expression.
Definition: SVecSVecAddExpr.h:265
ResultType_t< VT2 > RT2
Result type of the right-hand side sparse vector expression.
Definition: SVecSVecAddExpr.h:98
ReturnType_t< VT2 > RN2
Return type of the right-hand side sparse vector expression.
Definition: SVecSVecAddExpr.h:100
ReturnType operator[](size_t index) const
Subscript operator for the direct access to the vector elements.
Definition: SVecSVecAddExpr.h:177
SVecSVecAddExpr(const VT1 &lhs, const VT2 &rhs) noexcept
Constructor for the SVecSVecAddExpr class.
Definition: SVecSVecAddExpr.h:163
static constexpr bool returnExpr
Compilation switch for the selection of the subscript operator return type.
Definition: SVecSVecAddExpr.h:112
RightOperand rightOperand() const noexcept
Returns the right-hand side sparse vector operand.
Definition: SVecSVecAddExpr.h:233
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 VecVecAddExpr 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_BE_SPARSE_VECTOR_TYPE(T)
Constraint on the data type.
Definition: SparseVector.h:61
#define BLAZE_CONSTRAINT_MUST_FORM_VALID_VECVECADDEXPR(T1, T2)
Constraint on the data type.
Definition: VecVecAddExpr.h:104
#define BLAZE_CONSTRAINT_MUST_BE_ZERO_TYPE(T)
Constraint on the data type.
Definition: Zero.h:61
typename AddTrait< T1, T2 >::Type AddTrait_t
Auxiliary alias declaration for the AddTrait class template.
Definition: AddTrait.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 addition expression templates.
Definition: VecVecAddExpr.h:68
Header file for the IsZero type trait.
Header file for basic type definitions.
Header file for the generic min algorithm.