35 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECTDVECMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_SVECTDVECMULTEXPR_H_
90 template<
typename VT1
92 class SVecTDVecMultExpr :
public SparseMatrix< SVecTDVecMultExpr<VT1,VT2>, true >
93 ,
private VecTVecMultExpr
133 template<
typename MT >
136 enum { value = useAssign };
146 template<
typename T1,
typename T2,
typename T3 >
147 struct UseVectorizedKernel {
148 enum { value = T1::vectorizable && T3::vectorizable &&
161 template<
typename T1,
typename T2,
typename T3 >
162 struct UseDefaultKernel {
163 enum { value = !UseVectorizedKernel<T1,T2,T3>::value };
197 enum { smpAssignable = 0 };
276 return it_->value() *
v_;
406 return lhs_.nonZeros() *
rhs_.size();
418 return lhs_.nonZeros();
448 template<
typename T >
450 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
460 template<
typename T >
462 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
484 template<
typename MT >
492 LT x(
serial( rhs.lhs_ ) );
493 RT y(
serial( rhs.rhs_ ) );
500 SVecTDVecMultExpr::selectAssignKernel( ~lhs, x, y );
519 template<
typename MT
527 const ConstIterator
end( x.end() );
529 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
531 for(
size_t j=0UL; j<y.size(); ++j ) {
532 (~A)(element->index(),j) = element->
value() * y[j];
554 template<
typename MT
557 static inline typename EnableIf< UseVectorizedKernel<MT,VT3,VT4> >::Type
558 selectAssignKernel( DenseMatrix<MT,false>& A,
const VT3& x,
const VT4& y )
562 typedef IntrinsicTrait<ElementType> IT;
563 typedef typename IT::Type IntrinsicType;
565 const ConstIterator
begin( x.begin() );
566 const ConstIterator
end ( x.end() );
568 for( ConstIterator element=
begin; element!=
end; ++element )
570 const IntrinsicType x1(
set( element->value() ) );
572 for(
size_t j=0UL; j<(~A).
columns(); j+=IT::size ) {
573 (~A).
store( element->index(), j, x1 * y.load(j) );
596 template<
typename MT >
597 friend inline typename EnableIf< UseAssign<MT> >::Type
607 LT x(
serial( rhs.lhs_ ) );
608 RT y(
serial( rhs.rhs_ ) );
615 const ConstIterator
end( x.end() );
617 for(
size_t i=0UL; i<y.size(); ++i ) {
619 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
620 (~lhs)(element->index(),i) = element->
value() * y[i];
640 template<
typename MT >
650 LT x(
serial( rhs.lhs_ ) );
651 RT y(
serial( rhs.rhs_ ) );
658 const ConstIterator
end( x.end() );
660 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
662 (~lhs).reserve( element->index(), y.size() );
663 for(
size_t i=0UL; i<y.size(); ++i ) {
664 (~lhs).append( element->index(), i, element->value() * y[i] );
688 template<
typename MT >
689 friend inline typename EnableIf< UseAssign<MT> >::Type
699 LT x(
serial( rhs.lhs_ ) );
700 RT y(
serial( rhs.rhs_ ) );
707 const ConstIterator
end( x.end() );
709 for(
size_t i=0UL; i<y.size(); ++i ) {
711 (~lhs).reserve( i, x.nonZeros() );
712 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
713 (~lhs).append( element->index(), i, element->value() * y[i] );
734 template<
typename MT >
742 LT x(
serial( rhs.lhs_ ) );
743 RT y(
serial( rhs.rhs_ ) );
750 SVecTDVecMultExpr::selectAddAssignKernel( ~lhs, x, y );
769 template<
typename MT
772 static inline typename EnableIf< UseDefaultKernel<MT,VT3,VT4> >::Type
773 selectAddAssignKernel( DenseMatrix<MT,false>& A,
const VT3& x,
const VT4& y )
777 const ConstIterator
end( x.end() );
779 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
781 for(
size_t i=0UL; i<y.size(); ++i ) {
782 (~A)(element->index(),i) += element->
value() * y[i];
804 template<
typename MT
807 static inline typename EnableIf< UseVectorizedKernel<MT,VT3,VT4> >::Type
808 selectAddAssignKernel( DenseMatrix<MT,false>& A,
const VT3& x,
const VT4& y )
812 typedef IntrinsicTrait<ElementType> IT;
813 typedef typename IT::Type IntrinsicType;
815 const ConstIterator
begin( x.begin() );
816 const ConstIterator
end ( x.end() );
818 for( ConstIterator element=
begin; element!=
end; ++element )
820 const IntrinsicType x1(
set( element->value() ) );
822 for(
size_t j=0UL; j<(~A).
columns(); j+=IT::size ) {
823 (~A).
store( element->index(), j, (~A).
load(element->index(),j) + x1 * y.load(j) );
846 template<
typename MT >
847 friend inline typename EnableIf< UseAssign<MT> >::Type
857 LT x(
serial( rhs.lhs_ ) );
858 RT y(
serial( rhs.rhs_ ) );
865 const ConstIterator
end( x.end() );
867 for(
size_t i=0UL; i<y.size(); ++i ) {
869 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
870 (~lhs)(element->index(),i) += element->
value() * y[i];
895 template<
typename MT >
903 LT x(
serial( rhs.lhs_ ) );
904 RT y(
serial( rhs.rhs_ ) );
911 SVecTDVecMultExpr::selectSubAssignKernel( ~lhs, x, y );
930 template<
typename MT
933 static inline typename EnableIf< UseDefaultKernel<MT,VT3,VT4> >::Type
934 selectSubAssignKernel( DenseMatrix<MT,false>& A,
const VT3& x,
const VT4& y )
938 const ConstIterator
end( x.end() );
940 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
942 for(
size_t i=0UL; i<y.size(); ++i ) {
943 (~A)(element->index(),i) -= element->
value() * y[i];
965 template<
typename MT
968 static inline typename EnableIf< UseVectorizedKernel<MT,VT3,VT4> >::Type
969 selectSubAssignKernel( DenseMatrix<MT,false>& A,
const VT3& x,
const VT4& y )
973 typedef IntrinsicTrait<ElementType> IT;
974 typedef typename IT::Type IntrinsicType;
976 const ConstIterator
begin( x.begin() );
977 const ConstIterator
end ( x.end() );
979 for( ConstIterator element=
begin; element!=
end; ++element )
981 const IntrinsicType x1(
set( element->value() ) );
983 for(
size_t j=0UL; j<(~A).
columns(); j+=IT::size ) {
984 (~A).
store( element->index(), j, (~A).
load(element->index(),j) - x1 * y.load(j) );
1007 template<
typename MT >
1008 friend inline typename EnableIf< UseAssign<MT> >::Type
1018 LT x(
serial( rhs.lhs_ ) );
1019 RT y(
serial( rhs.rhs_ ) );
1026 const ConstIterator
end( x.end() );
1028 for(
size_t i=0UL; i<y.size(); ++i ) {
1030 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
1031 (~lhs)(element->index(),i) -= element->
value() * y[i];
1100 template<
typename T1
1102 inline const SVecTDVecMultExpr<T1,T2>
1122 template<
typename VT1,
typename VT2,
bool AF >
1127 typedef typename MultExprTrait< typename SubvectorExprTrait<const VT1,AF>::Type
1128 ,
typename SubvectorExprTrait<const VT2,AF>::Type >::Type Type;
1137 template<
typename VT1,
typename VT2 >
1142 typedef typename MultExprTrait< typename VT1::ReturnType, VT2 >::Type Type;
1151 template<
typename VT1,
typename VT2 >
1156 typedef typename MultExprTrait< VT1, typename VT2::ReturnType >::Type Type;
std::forward_iterator_tag IteratorCategory
The iterator category.
Definition: SVecTDVecMultExpr.h:216
Pointer difference type of the Blaze library.
ValueType value_type
Type of the underlying pointers.
Definition: SVecTDVecMultExpr.h:224
Compile time check whether the given type is a computational expression template.This type trait clas...
Definition: IsComputation.h:89
Compile time check for numeric types.This type trait tests whether or not the given template paramete...
Definition: IsNumeric.h:98
EnableIf< IsIntegral< T > >::Type store(T *address, const typename Store< T, sizeof(T)>::Type &value)
Aligned store of a vector of integral values.
Definition: Store.h:223
Compile time check whether the given type is a temporary vector or matrix type.This type trait class ...
Definition: IsTemporary.h:87
EnableIf< IsIntegral< T >, Load< T, sizeof(T)> >::Type::Type load(const T *address)
Loads a vector of integral values.
Definition: Load.h:222
Header file for the UNUSED_PARAMETER function template.
const DMatDMatMultExpr< T1, T2 > operator*(const DenseMatrix< T1, false > &lhs, const DenseMatrix< T2, false > &rhs)
Multiplication operator for the multiplication of two row-major dense matrices ( ).
Definition: DMatDMatMultExpr.h:4329
ResultType::OppositeType OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: SVecTDVecMultExpr.h:172
Iterator over the elements of the sparse vector-dense vector outer product expression.
Definition: SVecTDVecMultExpr.h:203
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: SVecTDVecMultExpr.h:449
RightOperand rightOperand() const
Returns the right-hand side dense vector operand.
Definition: SVecTDVecMultExpr.h:437
#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: TransposeFlag.h:159
bool isDefault(const DynamicMatrix< Type, SO > &m)
Returns whether the given dense matrix is in default state.
Definition: DynamicMatrix.h:4642
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:199
SelectType< IsExpression< VT2 >::value, const VT2, const VT2 & >::Type RightOperand
Composite type of the right-hand side dense vector expression.
Definition: SVecTDVecMultExpr.h:186
Header file for the ColumnExprTrait class template.
ConstIterator begin(size_t i) const
Returns an iterator to the first non-zero element of column i.
Definition: SVecTDVecMultExpr.h:364
Expression object for sparse vector-dense vector outer products.The SVecTDVecMultExpr class represent...
Definition: Forward.h:121
VT1::ResultType RT1
Result type of the left-hand side sparse vector expression.
Definition: SVecTDVecMultExpr.h:98
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:2408
size_t index() const
Access to the current index of the sparse element.
Definition: SVecTDVecMultExpr.h:285
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:251
void UNUSED_PARAMETER(const T1 &)
Suppression of unused parameter warnings.
Definition: Unused.h:84
SelectType< IsComputation< VT1 >::value, const RT1, CT1 >::Type LT
Type for the assignment of the left-hand side dense vector operand.
Definition: SVecTDVecMultExpr.h:189
ConstIterator end(size_t i) const
Returns an iterator just past the last non-zero element of column i.
Definition: SVecTDVecMultExpr.h:375
const DMatSerialExpr< MT, SO > serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:690
Header file for the Computation base class.
Type relationship analysis.This class tests if the two data types A and B are equal. For this type comparison, the cv-qualifiers of both data types are ignored. If A and B are the same data type (ignoring the cv-qualifiers), then the value member enumeration is set to 1, the nested type definition Type is TrueType, and the class derives from TrueType. Otherwise value is set to 0, Type is FalseType, and the class derives from FalseType.
Definition: IsSame.h:158
ConstIterator(IteratorType it, RightElement v)
Constructor for the ConstIterator class.
Definition: SVecTDVecMultExpr.h:233
const Element operator*() const
Direct access to the sparse matrix element at the current iterator position.
Definition: SVecTDVecMultExpr.h:255
RightOperand rhs_
Right-hand side dense vector of the multiplication expression.
Definition: SVecTDVecMultExpr.h:469
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:70
Constraint on the data type.
ptrdiff_t DifferenceType
Difference between two iterators.
Definition: SVecTDVecMultExpr.h:220
DifferenceType difference_type
Difference between two iterators.
Definition: SVecTDVecMultExpr.h:227
Header file for the SparseMatrix base class.
Constraint on the data type.
Header file for the MultExprTrait class template.
IteratorType it_
Iterator over the elements of the left-hand side sparse vector expression.
Definition: SVecTDVecMultExpr.h:325
SVecTDVecMultExpr(const VT1 &lhs, const VT2 &rhs)
Constructor for the SVecTDVecMultExpr class.
Definition: SVecTDVecMultExpr.h:337
Header file for the ValueIndexPair class.
SelectType< IsComputation< VT2 >::value, const RT2, CT2 >::Type RT
Type for the assignment of the right-hand side dense vector operand.
Definition: SVecTDVecMultExpr.h:192
Compile time type selection.The SelectType class template selects one of the two given types T1 and T...
Definition: SelectType.h:59
Header file for the IsTemporary type trait class.
Header file for the multiplication trait.
RemoveReference< LeftOperand >::Type::ConstIterator IteratorType
Iterator type of the sparse vector expression.
Definition: SVecTDVecMultExpr.h:211
size_t columns() const
Returns the current number of columns of the matrix.
Definition: SVecTDVecMultExpr.h:395
VT2::CompositeType CT2
Composite type of the right-hand side dense vector expression.
Definition: SVecTDVecMultExpr.h:103
bool operator!=(const ConstIterator &rhs) const
Inequality comparison between two ConstIterator objects.
Definition: SVecTDVecMultExpr.h:307
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2412
MultExprTrait< RN1, RN2 >::Type ExprReturnType
Expression return type for the subscript operator.
Definition: SVecTDVecMultExpr.h:118
Element ValueType
Type of the underlying pointers.
Definition: SVecTDVecMultExpr.h:217
void assign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the assignment of a matrix to a matrix.
Definition: Matrix.h:271
Base class for N-dimensional dense vectors.The DenseVector class is a base class for all arbitrarily ...
Definition: DenseVector.h:70
#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:79
ET2 RightElement
Element type of the dense vector expression.
Definition: SVecTDVecMultExpr.h:214
Constraint on the data type.
VT2::ResultType RT2
Result type of the right-hand side dense vector expression.
Definition: SVecTDVecMultExpr.h:99
size_t rows() const
Returns the current number of rows of the matrix.
Definition: SVecTDVecMultExpr.h:385
RightElement v_
Element of the right-hand side dense vector expression.
Definition: SVecTDVecMultExpr.h:326
Constraint on the data type.
SelectType< useAssign, const ResultType, const SVecTDVecMultExpr & >::Type CompositeType
Data type for composite expression templates.
Definition: SVecTDVecMultExpr.h:180
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2406
SVecTDVecMultExpr< VT1, VT2 > This
Type of this SVecTDVecMultExpr instance.
Definition: SVecTDVecMultExpr.h:170
Header file for the SelectType class template.
Header file for the RowExprTrait class template.
Header file for all forward declarations for expression class templates.
Constraint on the data type.
Header file for the VecTVecMultExpr base class.
VT1::CompositeType CT1
Composite type of the left-hand side sparse vector expression.
Definition: SVecTDVecMultExpr.h:102
Header file for the serial shim.
ReferenceType reference
Reference return type.
Definition: SVecTDVecMultExpr.h:226
bool operator==(const ConstIterator &rhs) const
Equality comparison between two ConstIterator objects.
Definition: SVecTDVecMultExpr.h:296
Header file for the IsNumeric type trait.
VT2::ReturnType RN2
Return type of the right-hand side dense vector expression.
Definition: SVecTDVecMultExpr.h:101
const SelectType< returnExpr, ExprReturnType, ElementType >::Type ReturnType
Return type for expression template evaluations.
Definition: SVecTDVecMultExpr.h:177
Header file for the SubmatrixExprTrait class template.
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:2407
Removal of reference modifiers.The RemoveCV type trait removes any reference modifiers from the given...
Definition: RemoveReference.h:69
IteratorCategory iterator_category
The iterator category.
Definition: SVecTDVecMultExpr.h:223
Intrinsic characteristics of data types.The IntrinsicTrait class template provides the intrinsic char...
Definition: IntrinsicTrait.h:748
Header file for run time assertion macros.
Base template for the MultTrait class.
Definition: MultTrait.h:141
ReturnType value() const
Access to the current value of the sparse element.
Definition: SVecTDVecMultExpr.h:275
void addAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the addition assignment of a matrix to a matrix.
Definition: Matrix.h:301
LeftOperand leftOperand() const
Returns the left-hand side sparse vector operand.
Definition: SVecTDVecMultExpr.h:427
Substitution Failure Is Not An Error (SFINAE) class.The EnableIf class template is an auxiliary tool ...
Definition: EnableIf.h:184
VT2::ElementType ET2
Element type of the right-hand side dense vector expression.
Definition: SVecTDVecMultExpr.h:105
ResultType::ElementType ElementType
Resulting element type.
Definition: SVecTDVecMultExpr.h:174
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: SVecTDVecMultExpr.h:461
void subAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the subtraction assignment of a matrix to matrix.
Definition: Matrix.h:331
Header file for the isDefault shim.
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: SVecTDVecMultExpr.h:173
ValueType * PointerType
Pointer return type.
Definition: SVecTDVecMultExpr.h:218
VT1::ElementType ET1
Element type of the left-hand side sparse vector expression.
Definition: SVecTDVecMultExpr.h:104
ValueIndexPair< ElementType > Element
Element type of the sparse matrix expression.
Definition: SVecTDVecMultExpr.h:208
Header file for the RemoveReference type trait.
LeftOperand lhs_
Left-hand side sparse vector of the multiplication expression.
Definition: SVecTDVecMultExpr.h:468
Header file for all intrinsic functionality.
PointerType pointer
Pointer return type.
Definition: SVecTDVecMultExpr.h:225
DifferenceType operator-(const ConstIterator &rhs) const
Calculating the number of elements between two expression iterators.
Definition: SVecTDVecMultExpr.h:318
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a dense, N-dimensional vector type...
Definition: DenseVector.h:79
Index-value-pair for sparse vectors and matrices.The ValueIndexPair class represents a single index-v...
Definition: ValueIndexPair.h:69
Header file for the IsComputation type trait class.
const ConstIterator * operator->() const
Direct access to the sparse matrix element at the current iterator position.
Definition: SVecTDVecMultExpr.h:265
Base class for sparse vectors.The SparseVector class is a base class for all arbitrarily sized (N-dim...
Definition: Forward.h:108
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:157
This ResultType
Result type for expression template evaluations.
Definition: CompressedMatrix.h:2403
Header file for basic type definitions.
ConstIterator & operator++()
Pre-increment operator.
Definition: SVecTDVecMultExpr.h:244
#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: TransposeFlag.h:81
Header file for the SubvectorExprTrait class template.
ValueType & ReferenceType
Reference return type.
Definition: SVecTDVecMultExpr.h:219
MultTrait< RT1, RT2 >::Type ResultType
Result type for expression template evaluations.
Definition: SVecTDVecMultExpr.h:171
VT1::ReturnType RN1
Return type of the left-hand side sparse vector expression.
Definition: SVecTDVecMultExpr.h:100
size_t nonZeros(size_t i) const
Returns the number of non-zero elements in the specified column.
Definition: SVecTDVecMultExpr.h:416
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: SVecTDVecMultExpr.h:350
Evaluation of the resulting expression type of a multiplication.Via this type trait it is possible to...
Definition: MultExprTrait.h:137
SelectType< IsExpression< VT1 >::value, const VT1, const VT1 & >::Type LeftOperand
Composite type of the left-hand side sparse vector expression.
Definition: SVecTDVecMultExpr.h:183
#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
EnableIf< IsIntegral< T >, Set< T, sizeof(T)> >::Type::Type set(T value)
Sets all values in the vector to the given integral value.
Definition: Set.h:209
Header file for the IsExpression type trait class.
size_t nonZeros() const
Returns the number of non-zero elements in the sparse matrix.
Definition: SVecTDVecMultExpr.h:405
Header file for the FunctionTrace class.