35 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSVECOUTEREXPR_H_ 36 #define _BLAZE_MATH_EXPRESSIONS_SVECSVECOUTEREXPR_H_ 87 template<
typename VT1
89 class SVecSVecOuterExpr
90 :
public VecTVecMultExpr< SparseMatrix< SVecSVecOuterExpr<VT1,VT2>, false > >
145 enum :
bool { smpAssignable =
false };
184 if( i >=
lhs_.size() ) {
187 if( j >=
rhs_.size() ) {
199 inline size_t rows() const noexcept {
220 return lhs_.nonZeros() *
rhs_.nonZeros();
261 template<
typename T >
262 inline bool canAlias(
const T* alias )
const noexcept {
263 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
273 template<
typename T >
274 inline bool isAliased(
const T* alias )
const noexcept {
275 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
297 template<
typename MT >
316 const LeftIterator lend( x.end() );
317 const RightIterator rend( y.end() );
319 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
321 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
322 (~lhs)(lelem->index(),relem->index()) = lelem->value() * relem->value();
343 template<
typename MT >
364 const LeftIterator lend( x.end() );
365 const RightIterator rend( y.end() );
367 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
369 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
370 (~lhs)(lelem->index(),relem->index()) = lelem->value() * relem->value();
390 template<
typename MT >
410 const LeftIterator lend( x.end() );
411 const RightIterator rend( y.end() );
414 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
416 for( ; index < lelem->index(); ++index ) {
417 (~lhs).finalize( index );
419 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
420 (~lhs).append( lelem->index(), relem->index(), lelem->value() * relem->value() );
422 (~lhs).finalize( index++ );
426 for( ; index < x.size(); ++index ) {
427 (~lhs).finalize( index );
446 template<
typename MT >
468 const LeftIterator lend( x.end() );
469 const RightIterator rend( y.end() );
472 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
474 for( ; index < relem->index(); ++index ) {
475 (~lhs).finalize( index );
477 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
478 (~lhs).append( lelem->index(), relem->index(), lelem->value() * relem->value() );
480 (~lhs).finalize( index++ );
484 for( ; index < y.size(); ++index ) {
485 (~lhs).finalize( index );
504 template<
typename MT >
523 const LeftIterator lend( x.end() );
524 const RightIterator rend( y.end() );
526 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
528 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
529 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
550 template<
typename MT >
571 const LeftIterator lend( x.end() );
572 const RightIterator rend( y.end() );
574 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
576 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
577 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
602 template<
typename MT >
621 const LeftIterator lend( x.end() );
622 const RightIterator rend( y.end() );
624 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
626 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
627 (~lhs)(lelem->index(),relem->index()) -= lelem->value() * relem->value();
648 template<
typename MT >
669 const LeftIterator lend( x.end() );
670 const RightIterator rend( y.end() );
672 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
674 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
675 (~lhs)(lelem->index(),relem->index()) -= lelem->value() * relem->value();
700 template<
typename MT >
719 const LeftIterator lend( x.end() );
720 const RightIterator rend( y.end() );
724 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem )
726 if(
isDefault( lelem->value() ) )
continue;
728 for( ; i<lelem->index(); ++i ) {
729 for(
size_t j=0UL; j<y.size(); ++j )
730 reset( (~lhs)(i,j) );
735 for( RightIterator relem=y.begin(); relem!=rend; ++relem, ++j ) {
736 for( ; j<relem->index(); ++j )
737 reset( (~lhs)(i,j) );
738 (~lhs)(lelem->index(),relem->index()) *= lelem->value() * relem->value();
741 for( ; j<y.size(); ++j ) {
742 reset( (~lhs)(i,j) );
748 for( ; i<x.size(); ++i ) {
749 for(
size_t j=0UL; j<y.size(); ++j )
750 reset( (~lhs)(i,j) );
769 template<
typename MT >
790 const LeftIterator lend( x.end() );
791 const RightIterator rend( y.end() );
795 for( RightIterator relem=y.begin(); relem!=rend; ++relem )
797 if(
isDefault( relem->value() ) )
continue;
799 for( ; j<relem->index(); ++j ) {
800 for(
size_t i=0UL; i<x.size(); ++i )
801 reset( (~lhs)(i,j) );
806 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem, ++i ) {
807 for( ; i<lelem->index(); ++i )
808 reset( (~lhs)(i,j) );
809 (~lhs)(lelem->index(),relem->index()) *= lelem->value() * relem->value();
812 for( ; i<x.size(); ++i ) {
813 reset( (~lhs)(i,j) );
819 for( ; j<y.size(); ++j ) {
820 for(
size_t i=0UL; i<x.size(); ++i )
821 reset( (~lhs)(i,j) );
887 template<
typename VT1
889 inline decltype(
auto)
910 template<
typename VT1,
typename VT2 >
911 struct Rows< SVecSVecOuterExpr<VT1,VT2> >
928 template<
typename VT1,
typename VT2 >
929 struct Columns< SVecSVecOuterExpr<VT1,VT2> >
OppositeType_< ResultType > OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: SVecSVecOuterExpr.h:120
LeftOperand leftOperand() const noexcept
Returns the left-hand side sparse vector operand.
Definition: SVecSVecOuterExpr.h:240
TransposeType_< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: SVecSVecOuterExpr.h:121
Header file for auxiliary alias declarations.
Compile time check whether the given type is a temporary vector or matrix type.This type trait class ...
Definition: IsTemporary.h:70
ReturnType_< VT2 > RN2
Return type of the right-hand side sparse vector expression.
Definition: SVecSVecOuterExpr.h:98
Header file for the Rows type trait.
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: SVecSVecOuterExpr.h:167
BLAZE_ALWAYS_INLINE size_t capacity(const Matrix< MT, SO > &matrix) noexcept
Returns the maximum capacity of the matrix.
Definition: Matrix.h:356
Header file for basic type definitions.
Expression object for sparse vector-sparse vector outer products.The SVecSVecOuterExpr class represen...
Definition: Forward.h:144
#define BLAZE_CONSTRAINT_MUST_BE_COLUMN_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a column dense or sparse vector type...
Definition: ColumnVector.h:61
Header file for the serial shim.
void reset(const DiagonalProxy< MT > &proxy)
Resetting the represented element to the default initial values.
Definition: DiagonalProxy.h:560
typename MultTrait< T1, T2 >::Type MultTrait_
Auxiliary alias declaration for the MultTrait class template.The MultTrait_ alias declaration provide...
Definition: MultTrait.h:250
size_t rows() const noexcept
Returns the current number of rows of the matrix.
Definition: SVecSVecOuterExpr.h:199
Header file for the Computation base class.
RightOperand rightOperand() const noexcept
Returns the right-hand side sparse vector operand.
Definition: SVecSVecOuterExpr.h:250
typename T::ResultType ResultType_
Alias declaration for nested ResultType type definitions.The ResultType_ alias declaration provides a...
Definition: Aliases.h:343
CompositeType_< VT1 > CT1
Composite type of the left-hand side sparse vector expression.
Definition: SVecSVecOuterExpr.h:99
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:78
Base class for sparse matrices.The SparseMatrix class is a base class for all sparse matrix classes...
Definition: Forward.h:129
typename IfTrue< Condition, T1, T2 >::Type IfTrue_
Auxiliary alias declaration for the IfTrue class template.The IfTrue_ alias declaration provides a co...
Definition: If.h:109
typename T::ReturnType ReturnType_
Alias declaration for nested ReturnType type definitions.The ReturnType_ alias declaration provides a...
Definition: Aliases.h:363
size_t nonZeros(size_t i) const
Returns the number of non-zero elements in the specified row.
Definition: SVecSVecOuterExpr.h:230
size_t nonZeros() const
Returns the number of non-zero elements in the sparse matrix.
Definition: SVecSVecOuterExpr.h:219
const IfTrue_< returnExpr, ExprReturnType, ElementType > ReturnType
Return type for expression template evaluations.
Definition: SVecSVecOuterExpr.h:125
Header file for the SparseMatrix base class.
Constraint on the transpose flag of vector types.
RightOperand rhs_
Right-hand side sparse vector of the multiplication expression.
Definition: SVecSVecOuterExpr.h:282
Constraint on the data type.
typename MultExprTrait< T1, T2 >::Type MultExprTrait_
Auxiliary alias declaration for the MultExprTrait class template.The MultExprTrait_ alias declaration...
Definition: MultExprTrait.h:112
Header file for the MultExprTrait class template.
typename T::CompositeType CompositeType_
Alias declaration for nested CompositeType type definitions.The CompositeType_ alias declaration prov...
Definition: Aliases.h:83
ResultType_< VT1 > RT1
Result type of the left-hand side sparse vector expression.
Definition: SVecSVecOuterExpr.h:95
Header file for the IsTemporary type trait class.
Header file for the multiplication trait.
If_< IsComputation< VT1 >, const RT1, CT1 > LT
Type for the assignment of the left-hand side dense vector operand.
Definition: SVecSVecOuterExpr.h:137
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
Header file for the If class template.
#define BLAZE_CONSTRAINT_MUST_FORM_VALID_VECTVECMULTEXPR(T1, T2)
Constraint on the data type.In case the given data types T1 and T2 do not form a valid vector/vector ...
Definition: VecTVecMultExpr.h:104
#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
Header file for the Columns type trait.
typename T::ElementType ElementType_
Alias declaration for nested ElementType type definitions.The ElementType_ alias declaration provides...
Definition: Aliases.h:163
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a sparse, N-dimensional vector type...
Definition: SparseVector.h:61
SVecSVecOuterExpr(const VT1 &lhs, const VT2 &rhs) noexcept
Constructor for the SVecSVecOuterExpr class.
Definition: SVecSVecOuterExpr.h:154
If_< IsComputation< VT2 >, const RT2, CT2 > RT
Type for the assignment of the right-hand side dense vector operand.
Definition: SVecSVecOuterExpr.h:140
MultTrait_< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: SVecSVecOuterExpr.h:119
Header file for the exception macros of the math module.
Header file for all forward declarations for expression class templates.
Constraint on the data type.
Header file for the VecTVecMultExpr base class.
If_< IsExpression< VT2 >, const VT2, const VT2 &> RightOperand
Composite type of the right-hand side sparse vector expression.
Definition: SVecSVecOuterExpr.h:134
#define BLAZE_CONSTRAINT_MUST_NOT_BE_SYMMETRIC_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a symmetric matrix type, a compilation error is created.
Definition: Symmetric.h:79
Header file for run time assertion macros.
MultExprTrait_< RN1, RN2 > ExprReturnType
Expression return type for the subscript operator.
Definition: SVecSVecOuterExpr.h:113
CompositeType_< VT2 > CT2
Composite type of the right-hand side sparse vector expression.
Definition: SVecSVecOuterExpr.h:100
typename If< T1, T2, T3 >::Type If_
Auxiliary alias declaration for the If class template.The If_ alias declaration provides a convenient...
Definition: If.h:154
#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 the isDefault shim.
Constraint on the data type.
decltype(auto) serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:819
Constraint on the data type.
ReturnType_< VT1 > RN1
Return type of the left-hand side sparse vector expression.
Definition: SVecSVecOuterExpr.h:97
Header file for the RemoveReference type trait.
size_t columns() const noexcept
Returns the current number of columns of the matrix.
Definition: SVecSVecOuterExpr.h:209
typename T::OppositeType OppositeType_
Alias declaration for nested OppositeType type definitions.The OppositeType_ alias declaration provid...
Definition: Aliases.h:263
ReturnType at(size_t i, size_t j) const
Checked access to the matrix elements.
Definition: SVecSVecOuterExpr.h:183
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:3082
typename T::ConstIterator ConstIterator_
Alias declaration for nested ConstIterator type definitions.The ConstIterator_ alias declaration prov...
Definition: Aliases.h:103
const ResultType CompositeType
Data type for composite expression templates.
Definition: SVecSVecOuterExpr.h:128
Header file for the IsComputation type trait class.
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: SVecSVecOuterExpr.h:262
Compile time evaluation of the size of a vector.The Size type trait evaluates the size of the given v...
Definition: Size.h:74
Base class for sparse vectors.The SparseVector class is a base class for all arbitrarily sized (N-dim...
Definition: Forward.h:130
ElementType_< ResultType > ElementType
Resulting element type.
Definition: SVecSVecOuterExpr.h:122
ResultType_< VT2 > RT2
Result type of the right-hand side sparse vector expression.
Definition: SVecSVecOuterExpr.h:96
Compile time evaluation of the number of columns of a matrix.The Columns type trait evaluates the num...
Definition: Columns.h:75
#define BLAZE_CONSTRAINT_MUST_BE_ROW_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a row dense or sparse vector type (i...
Definition: RowVector.h:61
Compile time evaluation of the number of rows of a matrix.The Rows type trait evaluates the number of...
Definition: Rows.h:75
bool isDefault(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is in default state.
Definition: DiagonalProxy.h:600
typename T::TransposeType TransposeType_
Alias declaration for nested TransposeType type definitions.The TransposeType_ alias declaration prov...
Definition: Aliases.h:423
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: SVecSVecOuterExpr.h:274
Header file for the Size type trait.
Size type of the Blaze library.
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression, the program execution is terminated. The BLAZE_INTERNAL_ASSERT macro can be disabled by setting the BLAZE_USER_ASSERTION flag to zero or by defining NDEBUG during the compilation.
Definition: Assert.h:101
Constraint on the transpose flag of vector types.
Header file for the IsExpression type trait class.
Header file for the function trace functionality.
If_< IsExpression< VT1 >, const VT1, const VT1 &> LeftOperand
Composite type of the left-hand side sparse vector expression.
Definition: SVecSVecOuterExpr.h:131
LeftOperand lhs_
Left-hand side sparse vector of the multiplication expression.
Definition: SVecSVecOuterExpr.h:281