22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECTSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECTSVECMULTEXPR_H_
30 #include <boost/type_traits/remove_reference.hpp>
68 template<
typename VT1
70 class SVecTSVecMultExpr :
public SparseMatrix< SVecTSVecMultExpr<VT1,VT2>, false >
76 typedef typename VT1::ResultType
RT1;
77 typedef typename VT2::ResultType
RT2;
78 typedef typename VT1::ReturnType
RN1;
79 typedef typename VT2::ReturnType
RN2;
80 typedef typename VT1::CompositeType
CT1;
81 typedef typename VT2::CompositeType
CT2;
177 return lhs_.nonZeros() *
rhs_.nonZeros();
218 template<
typename T >
220 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
230 template<
typename T >
232 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
254 template<
typename MT >
262 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
263 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
273 const LeftIterator lend( x.end() );
274 const RightIterator rend( y.end() );
276 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
278 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
279 (~lhs)(lelem->index(),relem->index()) = lelem->value() * relem->value();
300 template<
typename MT >
308 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
309 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
319 const LeftIterator lend( x.end() );
320 const RightIterator rend( y.end() );
322 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
324 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
325 (~lhs)(lelem->index(),relem->index()) = lelem->value() * relem->value();
345 template<
typename MT >
353 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
354 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
364 const LeftIterator lend( x.end() );
365 const RightIterator rend( y.end() );
367 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
369 (~lhs).reserve( lelem->index(), y.nonZeros() );
370 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
371 (~lhs).append( lelem->index(), relem->index(), lelem->value() * relem->value() );
392 template<
typename MT >
400 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
401 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
411 const LeftIterator lend( x.end() );
412 const RightIterator rend( y.end() );
414 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
416 (~lhs).reserve( relem->index(), x.nonZeros() );
417 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
418 (~lhs).append( lelem->index(), relem->index(), lelem->value() * relem->value() );
439 template<
typename MT >
447 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
448 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
458 const LeftIterator lend( x.end() );
459 const RightIterator rend( y.end() );
461 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
463 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
464 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
485 template<
typename MT >
493 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
494 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
504 const LeftIterator lend( x.end() );
505 const RightIterator rend( y.end() );
507 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
509 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
510 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
535 template<
typename MT >
543 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
544 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
554 const LeftIterator lend( x.end() );
555 const RightIterator rend( y.end() );
557 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
559 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
560 (~lhs)(lelem->index(),relem->index()) -= lelem->value() * relem->value();
581 template<
typename MT >
589 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
590 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
600 const LeftIterator lend( x.end() );
601 const RightIterator rend( y.end() );
603 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
605 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
606 (~lhs)(lelem->index(),relem->index()) -= lelem->value() * relem->value();
673 template<
typename T1
675 inline const SVecTSVecMultExpr<T1,T2>
705 template<
typename VT1
707 inline typename RowExprTrait< SVecTSVecMultExpr<VT1,VT2> >::Type
708 row(
const SVecTSVecMultExpr<VT1,VT2>& sm,
size_t index )
712 return sm.leftOperand()[index] * sm.rightOperand();
730 template<
typename VT1
732 inline typename ColumnExprTrait< SVecTSVecMultExpr<VT1,VT2> >::Type
733 column(
const SVecTSVecMultExpr<VT1,VT2>& sm,
size_t index )
737 return sm.leftOperand() * sm.rightOperand()[index];
753 template<
typename VT1,
typename VT2 >
754 struct RowExprTrait< SVecTSVecMultExpr<VT1,VT2> >
758 typedef typename MultExprTrait< typename VT1::ReturnType, VT2 >::Type Type;
767 template<
typename VT1,
typename VT2 >
768 struct ColumnExprTrait< SVecTSVecMultExpr<VT1,VT2> >
772 typedef typename MultExprTrait< VT1, typename VT2::ReturnType >::Type Type;