22 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATTSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SMATTSMATMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
82 template<
typename MT1
84 class SMatTSMatMultExpr :
public SparseMatrix< SMatTSMatMultExpr<MT1,MT2>, false >
90 typedef typename MT1::ResultType
RT1;
91 typedef typename MT2::ResultType
RT2;
92 typedef typename MT1::CompositeType
CT1;
93 typedef typename MT2::CompositeType
CT2;
138 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
139 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
144 if(
lhs_.columns() == 0UL )
154 const LeftIterator lend( A.end(i) );
155 LeftIterator lelem( A.begin(i) );
160 const RightIterator rend( B.end(j) );
161 RightIterator relem( B.begin(j) );
164 if( lelem == lend || relem == rend )
169 if( lelem->index() < relem->index() ) {
171 if( lelem == lend )
break;
173 else if( relem->index() < lelem->index() ) {
175 if( relem == rend )
break;
178 tmp = lelem->value() * relem->value();
185 if( lelem != lend && relem != rend )
188 if( lelem->index() < relem->index() ) {
190 if( lelem == lend )
break;
192 else if( relem->index() < lelem->index() ) {
194 if( relem == rend )
break;
197 tmp += lelem->value() * relem->value();
199 if( lelem == lend )
break;
201 if( relem == rend )
break;
213 const LeftIterator end( A.end(i) );
214 LeftIterator element( A.begin(i) );
221 tmp = element->value() *
rhs_(element->index(),j);
223 for( ; element!=end; ++element )
224 tmp += element->value() *
rhs_(element->index(),j);
233 const RightIterator end( B.end(j) );
234 RightIterator element( B.begin(j) );
241 tmp =
lhs_(i,element->index()) * element->value();
243 for( ; element!=end; ++element )
244 tmp +=
lhs_(i,element->index()) * element->value();
250 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
275 return rhs_.columns();
327 template<
typename T >
329 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
339 template<
typename T >
341 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
364 template<
typename MT >
374 const typename MT2::OppositeType tmp( rhs.rhs_ );
375 assign( ~lhs, rhs.lhs_ * tmp );
393 template<
typename MT >
403 const typename MT1::OppositeType tmp( rhs.lhs_ );
404 assign( ~lhs, tmp * rhs.rhs_ );
422 template<
typename MT >
432 const typename MT2::OppositeType tmp( rhs.rhs_ );
433 assign( ~lhs, rhs.lhs_ * tmp );
451 template<
typename MT >
461 const typename MT1::OppositeType tmp( rhs.lhs_ );
462 assign( ~lhs, tmp * rhs.rhs_ );
480 template<
typename MT >
490 const typename MT2::OppositeType tmp( rhs.rhs_ );
509 template<
typename MT >
519 const typename MT1::OppositeType tmp( rhs.lhs_ );
542 template<
typename MT >
552 const typename MT2::OppositeType tmp( rhs.rhs_ );
571 template<
typename MT >
581 const typename MT1::OppositeType tmp( rhs.lhs_ );
649 template<
typename T1
651 inline const SMatTSMatMultExpr<T1,T2>
657 throw std::invalid_argument(
"Matrix sizes do not match" );
685 template<
typename T1
687 inline typename RowExprTrait< SMatTSMatMultExpr<T1,T2> >::Type
688 row(
const SMatTSMatMultExpr<T1,T2>& sm,
size_t index )
692 return row( sm.leftOperand(), index ) * sm.rightOperand();
711 template<
typename T1
713 inline typename ColumnExprTrait< SMatTSMatMultExpr<T1,T2> >::Type
714 column(
const SMatTSMatMultExpr<T1,T2>& sm,
size_t index )
718 return sm.leftOperand() *
column( sm.rightOperand(), index );
734 template<
typename MT1,
typename MT2,
typename VT >
735 struct SMatDVecMultExprTrait< SMatTSMatMultExpr<MT1,MT2>, VT >
739 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
740 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
741 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value
742 ,
typename SMatDVecMultExprTrait< MT1, typename TSMatDVecMultExprTrait<MT2,VT>::Type >::Type
743 , INVALID_TYPE >::Type Type;
752 template<
typename MT1,
typename MT2,
typename VT >
753 struct SMatSVecMultExprTrait< SMatTSMatMultExpr<MT1,MT2>, VT >
757 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
758 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
759 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value
760 ,
typename SMatSVecMultExprTrait< MT1, typename TSMatSVecMultExprTrait<MT2,VT>::Type >::Type
761 , INVALID_TYPE >::Type Type;
770 template<
typename VT,
typename MT1,
typename MT2 >
771 struct TDVecSMatMultExprTrait< VT, SMatTSMatMultExpr<MT1,MT2> >
775 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
776 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
777 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
778 ,
typename TDVecTSMatMultExprTrait< typename TDVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
779 , INVALID_TYPE >::Type Type;
788 template<
typename VT,
typename MT1,
typename MT2 >
789 struct TSVecSMatMultExprTrait< VT, SMatTSMatMultExpr<MT1,MT2> >
793 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
794 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
795 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
796 ,
typename TDVecTSMatMultExprTrait< typename TDVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
797 , INVALID_TYPE >::Type Type;
806 template<
typename MT1,
typename MT2 >
807 struct RowExprTrait< SMatTSMatMultExpr<MT1,MT2> >
811 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
820 template<
typename MT1,
typename MT2 >
821 struct ColumnExprTrait< SMatTSMatMultExpr<MT1,MT2> >
825 typedef typename MultExprTrait< MT1, typename ColumnExprTrait<const MT2>::Type >::Type Type;