22 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECTSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DVECTSVECMULTEXPR_H_
75 template<
typename VT1
83 typedef typename VT1::ResultType
RT1;
84 typedef typename VT2::ResultType
RT2;
85 typedef typename VT1::ReturnType
RN1;
86 typedef typename VT2::ReturnType
RN2;
87 typedef typename VT1::CompositeType
CT1;
88 typedef typename VT2::CompositeType
CT2;
89 typedef typename VT1::ElementType
ET1;
90 typedef typename VT2::ElementType
ET2;
120 template<
typename MT >
122 enum { value = useAssign };
132 template<
typename T1,
typename T2,
typename T3 >
133 struct UseVectorizedKernel {
134 enum { value = T1::vectorizable && T2::vectorizable &&
147 template<
typename T1,
typename T2,
typename T3 >
148 struct UseDefaultKernel {
149 enum { value = !UseVectorizedKernel<T1,T2,T3>::value };
257 return v_ *
it_->value();
387 return lhs_.size() *
rhs_.nonZeros();
399 return rhs_.nonZeros();
429 template<
typename T >
431 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
441 template<
typename T >
443 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
468 template<
typename MT >
487 const ConstIterator
begin( y.begin() );
488 const ConstIterator
end ( y.end() );
490 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
491 for( ConstIterator element=
begin; element!=
end; ++element ) {
492 (~lhs)(i,element->index()) = x[i] * element->
value();
512 template<
typename MT >
528 DVecTSVecMultExpr::selectAssignKernel( ~lhs, x, y );
547 template<
typename MT
550 static inline typename EnableIf< UseDefaultKernel<MT,VT3,VT4> >::Type
551 selectAssignKernel( DenseMatrix<MT,true>& A,
const VT3& x,
const VT4& y )
553 typedef typename RemoveReference<RT>::Type::ConstIterator ConstIterator;
555 const ConstIterator
begin( y.begin() );
556 const ConstIterator
end ( y.end() );
558 for( ConstIterator element=
begin; element!=
end; ++element ) {
559 for(
size_t i=0UL; i<(~A).
rows(); ++i ) {
560 (~A)(i,element->index()) = x[i] * element->
value();
581 template<
typename MT
584 static inline typename EnableIf< UseVectorizedKernel<MT,VT3,VT4> >::Type
585 selectAssignKernel( DenseMatrix<MT,true>& A,
const VT3& x,
const VT4& y )
587 typedef typename RemoveReference<RT>::Type::ConstIterator ConstIterator;
589 typedef IntrinsicTrait<ElementType> IT;
590 typedef typename IT::Type IntrinsicType;
592 const ConstIterator
begin( y.begin() );
593 const ConstIterator
end ( y.end() );
595 for( ConstIterator element=
begin; element!=
end; ++element )
597 const IntrinsicType y1(
set( element->value() ) );
599 for(
size_t i=0UL; i<(~A).
rows(); i+=IT::size ) {
600 store( &(~A)(i,element->index()), x.get(i) * y1 );
622 template<
typename MT >
623 friend inline typename EnableIf< UseAssign<MT> >::Type
631 typedef typename RemoveReference<RT>::Type::ConstIterator ConstIterator;
641 const ConstIterator
begin( y.begin() );
642 const ConstIterator
end ( y.end() );
644 for(
size_t i=0UL; i<x.size(); ++i ) {
646 (~lhs).reserve( i, y.nonZeros() );
647 for( ConstIterator element=
begin; element!=
end; ++element ) {
648 (~lhs).append( i, element->index(), x[i] * element->value() );
669 template<
typename MT >
677 typedef typename RemoveReference<RT>::Type::ConstIterator ConstIterator;
687 const ConstIterator
begin( y.begin() );
688 const ConstIterator
end ( y.end() );
690 for( ConstIterator element=
begin; element!=
end; ++element ) {
692 (~lhs).reserve( element->index(), x.size() );
693 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
694 (~lhs).append( i, element->index(), x[i] * element->value() );
718 template<
typename MT >
719 friend inline typename EnableIf< UseAssign<MT> >::Type
727 typedef typename RemoveReference<RT>::Type::ConstIterator ConstIterator;
737 const ConstIterator
begin( y.begin() );
738 const ConstIterator
end ( y.end() );
740 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
741 for( ConstIterator element=
begin; element!=
end; ++element ) {
742 (~lhs)(i,element->index()) += x[i] * element->
value();
762 template<
typename MT >
778 DVecTSVecMultExpr::selectAddAssignKernel( ~lhs, x, y );
797 template<
typename MT
800 static inline typename EnableIf< UseDefaultKernel<MT,VT3,VT4> >::Type
801 selectAddAssignKernel( DenseMatrix<MT,true>& A,
const VT3& x,
const VT4& y )
803 typedef typename RemoveReference<RT>::Type::ConstIterator ConstIterator;
805 const ConstIterator
begin( y.begin() );
806 const ConstIterator
end ( y.end() );
808 for( ConstIterator element=
begin; element!=
end; ++element ) {
809 for(
size_t i=0UL; i<(~A).
rows(); ++i ) {
810 (~A)(i,element->index()) += x[i] * element->
value();
831 template<
typename MT
834 static inline typename EnableIf< UseVectorizedKernel<MT,VT3,VT4> >::Type
835 selectAddAssignKernel( DenseMatrix<MT,true>& A,
const VT3& x,
const VT4& y )
837 typedef typename RemoveReference<RT>::Type::ConstIterator ConstIterator;
839 typedef IntrinsicTrait<ElementType> IT;
840 typedef typename IT::Type IntrinsicType;
842 const ConstIterator
begin( y.begin() );
843 const ConstIterator
end ( y.end() );
845 for( ConstIterator element=
begin; element!=
end; ++element )
847 const IntrinsicType y1(
set( element->value() ) );
849 for(
size_t i=0UL; i<(~A).
rows(); i+=IT::size ) {
850 store( &(~A)(i,element->index()),
load( &(~A)(i,element->index()) ) + x.get(i) * y1 );
877 template<
typename MT >
878 friend inline typename EnableIf< UseAssign<MT> >::Type
886 typedef typename RemoveReference<RT>::Type::ConstIterator ConstIterator;
896 const ConstIterator
begin( y.begin() );
897 const ConstIterator
end ( y.end() );
899 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
900 for( ConstIterator element=
begin; element!=
end; ++element ) {
901 (~lhs)(i,element->index()) -= x[i] * element->
value();
921 template<
typename MT >
937 DVecTSVecMultExpr::selectSubAssignKernel( ~lhs, x, y );
956 template<
typename MT
959 static inline typename EnableIf< UseDefaultKernel<MT,VT3,VT4> >::Type
960 selectSubAssignKernel( DenseMatrix<MT,true>& A,
const VT3& x,
const VT4& y )
962 typedef typename RemoveReference<RT>::Type::ConstIterator ConstIterator;
964 const ConstIterator
begin( y.begin() );
965 const ConstIterator
end ( y.end() );
967 for( ConstIterator element=
begin; element!=
end; ++element ) {
968 for(
size_t i=0UL; i<(~A).
rows(); ++i ) {
969 (~A)(i,element->index()) -= x[i] * element->
value();
990 template<
typename MT
993 static inline typename EnableIf< UseVectorizedKernel<MT,VT3,VT4> >::Type
994 selectSubAssignKernel( DenseMatrix<MT,true>& A,
const VT3& x,
const VT4& y )
996 typedef typename RemoveReference<RT>::Type::ConstIterator ConstIterator;
998 typedef IntrinsicTrait<ElementType> IT;
999 typedef typename IT::Type IntrinsicType;
1001 const ConstIterator
begin( y.begin() );
1002 const ConstIterator
end ( y.end() );
1004 for( ConstIterator element=
begin; element!=
end; ++element )
1006 const IntrinsicType y1(
set( element->value() ) );
1008 for(
size_t i=0UL; i<(~A).
rows(); i+=IT::size ) {
1009 store( &(~A)(i,element->index()),
load( &(~A)(i,element->index()) ) - x.get(i) * y1 );
1077 template<
typename T1
1079 inline const DVecTSVecMultExpr<T1,T2>
1099 template<
typename VT1,
typename VT2 >
1104 typedef typename MultExprTrait< typename VT1::ReturnType, VT2 >::Type Type;
1113 template<
typename VT1,
typename VT2 >
1118 typedef typename MultExprTrait< VT1, typename VT2::ReturnType >::Type Type;