22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECTDVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECTDVECMULTEXPR_H_
74 template<
typename VT1
76 class SVecTDVecMultExpr :
public SparseMatrix< SVecTDVecMultExpr<VT1,VT2>, true >
77 ,
private VecTVecMultExpr
82 typedef typename VT1::ResultType
RT1;
83 typedef typename VT2::ResultType
RT2;
84 typedef typename VT1::ReturnType
RN1;
85 typedef typename VT2::ReturnType
RN2;
86 typedef typename VT1::CompositeType
CT1;
87 typedef typename VT2::CompositeType
CT2;
88 typedef typename VT1::ElementType
ET1;
89 typedef typename VT2::ElementType
ET2;
118 template<
typename MT >
120 enum { value = useAssign };
130 template<
typename T1,
typename T2,
typename T3 >
131 struct UseVectorizedKernel {
132 enum { value = T1::vectorizable && T3::vectorizable &&
145 template<
typename T1,
typename T2,
typename T3 >
146 struct UseDefaultKernel {
147 enum { value = !UseVectorizedKernel<T1,T2,T3>::value };
255 return it_->value() *
v_;
385 return lhs_.nonZeros() *
rhs_.size();
397 return lhs_.nonZeros();
427 template<
typename T >
429 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
439 template<
typename T >
441 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
463 template<
typename MT >
479 SVecTDVecMultExpr::selectAssignKernel( ~lhs, x, y );
498 template<
typename MT
506 const ConstIterator
end( x.end() );
508 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
510 for(
size_t j=0UL; j<y.size(); ++j ) {
511 (~A)(element->index(),j) = element->
value() * y[j];
533 template<
typename MT
536 static inline typename EnableIf< UseVectorizedKernel<MT,VT3,VT4> >::Type
537 selectAssignKernel( DenseMatrix<MT,false>& A,
const VT3& x,
const VT4& y )
539 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
541 typedef IntrinsicTrait<ElementType> IT;
542 typedef typename IT::Type IntrinsicType;
544 const ConstIterator
begin( x.begin() );
545 const ConstIterator
end ( x.end() );
547 for( ConstIterator element=
begin; element!=
end; ++element )
549 const IntrinsicType x1(
set( element->value() ) );
551 for(
size_t j=0UL; j<(~A).
columns(); j+=IT::size ) {
552 store( &(~A)(element->index(),j), x1 * y.get(j) );
575 template<
typename MT >
576 friend inline typename EnableIf< UseAssign<MT> >::Type
584 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
594 const ConstIterator
end( x.end() );
596 for(
size_t i=0UL; i<y.size(); ++i ) {
598 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
599 (~lhs)(element->index(),i) = element->
value() * y[i];
619 template<
typename MT >
627 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
637 const ConstIterator
end( x.end() );
639 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
641 (~lhs).reserve( element->index(), y.size() );
642 for(
size_t i=0UL; i<y.size(); ++i ) {
643 (~lhs).append( element->index(), i, element->value() * y[i] );
667 template<
typename MT >
668 friend inline typename EnableIf< UseAssign<MT> >::Type
676 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
686 const ConstIterator
end( x.end() );
688 for(
size_t i=0UL; i<y.size(); ++i ) {
690 (~lhs).reserve( i, x.nonZeros() );
691 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
692 (~lhs).append( element->index(), i, element->value() * y[i] );
713 template<
typename MT >
729 SVecTDVecMultExpr::selectAddAssignKernel( ~lhs, x, y );
748 template<
typename MT
751 static inline typename EnableIf< UseDefaultKernel<MT,VT3,VT4> >::Type
752 selectAddAssignKernel( DenseMatrix<MT,false>& A,
const VT3& x,
const VT4& y )
754 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
756 const ConstIterator
end( x.end() );
758 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
760 for(
size_t i=0UL; i<y.size(); ++i ) {
761 (~A)(element->index(),i) += element->
value() * y[i];
783 template<
typename MT
786 static inline typename EnableIf< UseVectorizedKernel<MT,VT3,VT4> >::Type
787 selectAddAssignKernel( DenseMatrix<MT,false>& A,
const VT3& x,
const VT4& y )
789 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
791 typedef IntrinsicTrait<ElementType> IT;
792 typedef typename IT::Type IntrinsicType;
794 const ConstIterator
begin( x.begin() );
795 const ConstIterator
end ( x.end() );
797 for( ConstIterator element=
begin; element!=
end; ++element )
799 const IntrinsicType x1(
set( element->value() ) );
801 for(
size_t j=0UL; j<(~A).
columns(); j+=IT::size ) {
802 store( &(~A)(element->index(),j),
load( &(~A)(element->index(),j) ) + x1 * y.get(j) );
825 template<
typename MT >
826 friend inline typename EnableIf< UseAssign<MT> >::Type
834 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
844 const ConstIterator
end( x.end() );
846 for(
size_t i=0UL; i<y.size(); ++i ) {
848 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
849 (~lhs)(element->index(),i) += element->
value() * y[i];
874 template<
typename MT >
890 SVecTDVecMultExpr::selectSubAssignKernel( ~lhs, x, y );
909 template<
typename MT
912 static inline typename EnableIf< UseDefaultKernel<MT,VT3,VT4> >::Type
913 selectSubAssignKernel( DenseMatrix<MT,false>& A,
const VT3& x,
const VT4& y )
915 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
917 const ConstIterator
end( x.end() );
919 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
921 for(
size_t i=0UL; i<y.size(); ++i ) {
922 (~A)(element->index(),i) -= element->
value() * y[i];
944 template<
typename MT
947 static inline typename EnableIf< UseVectorizedKernel<MT,VT3,VT4> >::Type
948 selectSubAssignKernel( DenseMatrix<MT,false>& A,
const VT3& x,
const VT4& y )
950 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
952 typedef IntrinsicTrait<ElementType> IT;
953 typedef typename IT::Type IntrinsicType;
955 const ConstIterator
begin( x.begin() );
956 const ConstIterator
end ( x.end() );
958 for( ConstIterator element=
begin; element!=
end; ++element )
960 const IntrinsicType x1(
set( element->value() ) );
962 for(
size_t j=0UL; j<(~A).
columns(); j+=IT::size ) {
963 store( &(~A)(element->index(),j),
load( &(~A)(element->index(),j) ) - x1 * y.get(j) );
986 template<
typename MT >
987 friend inline typename EnableIf< UseAssign<MT> >::Type
995 typedef typename RemoveReference<LT>::Type::ConstIterator ConstIterator;
1005 const ConstIterator
end( x.end() );
1007 for(
size_t i=0UL; i<y.size(); ++i ) {
1009 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
1010 (~lhs)(element->index(),i) -= element->
value() * y[i];
1079 template<
typename T1
1081 inline const SVecTDVecMultExpr<T1,T2>
1101 template<
typename VT1,
typename VT2 >
1106 typedef typename MultExprTrait< typename VT1::ReturnType, VT2 >::Type Type;
1115 template<
typename VT1,
typename VT2 >
1120 typedef typename MultExprTrait< VT1, typename VT2::ReturnType >::Type Type;