22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSMATSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSMATSMATMULTEXPR_H_
92 template<
typename MT1
94 class TSMatSMatMultExpr :
public SparseMatrix< TSMatSMatMultExpr<MT1,MT2>, true >
95 ,
private MatMatMultExpr
100 typedef typename MT1::ResultType
RT1;
101 typedef typename MT2::ResultType
RT2;
102 typedef typename MT1::CompositeType
CT1;
103 typedef typename MT2::CompositeType
CT2;
150 if(
lhs_.columns() != 0UL ) {
152 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
177 return rhs_.columns();
229 template<
typename T >
231 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
241 template<
typename T >
243 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
267 template<
typename MT
290 for(
size_t j=0UL; j<A.columns(); ++j ) {
291 const LeftIterator lend( A.end(j) );
292 for( LeftIterator lelem=A.begin(j); lelem!=lend; ++lelem ) {
293 const RightIterator rend( B.end(j) );
294 for( RightIterator relem=B.begin(j); relem!=rend; ++relem )
296 if(
isDefault( (~lhs)(lelem->index(),relem->index()) ) ) {
297 (~lhs)(lelem->index(),relem->index()) = lelem->value() * relem->value();
300 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
323 template<
typename MT
346 for(
size_t j=0UL; j<A.columns(); ++j ) {
347 const LeftIterator lend( A.end(j) );
348 for( LeftIterator lelem=A.begin(j); lelem!=lend; ++lelem ) {
349 const RightIterator rend( B.end(j) );
350 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
351 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
372 template<
typename MT >
382 const typename MT1::OppositeType tmp( rhs.lhs_ );
383 assign( ~lhs, tmp * rhs.rhs_ );
401 template<
typename MT >
411 const typename MT2::OppositeType tmp( rhs.rhs_ );
412 assign( ~lhs, rhs.lhs_ * tmp );
430 template<
typename MT
439 typedef typename RemoveReference<CT1>::Type::ConstIterator LeftIterator;
440 typedef typename RemoveReference<CT2>::Type::ConstIterator RightIterator;
452 for(
size_t j=0UL; j<A.columns(); ++j ) {
453 const LeftIterator lend( A.end(j) );
454 for( LeftIterator lelem=A.begin(j); lelem!=lend; ++lelem ) {
455 const RightIterator rend( B.end(j) );
456 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
457 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
482 template<
typename MT
491 typedef typename RemoveReference<CT1>::Type::ConstIterator LeftIterator;
492 typedef typename RemoveReference<CT2>::Type::ConstIterator RightIterator;
504 for(
size_t j=0UL; j<A.columns(); ++j ) {
505 const LeftIterator lend( A.end(j) );
506 for( LeftIterator lelem=A.begin(j); lelem!=lend; ++lelem ) {
507 const RightIterator rend( B.end(j) );
508 for( RightIterator relem=B.begin(j); relem!=rend; ++relem ) {
509 (~lhs)(lelem->index(),relem->index()) -= lelem->value() * relem->value();
579 template<
typename T1
581 inline const TSMatSMatMultExpr<T1,T2>
587 throw std::invalid_argument(
"Matrix sizes do not match" );
604 template<
typename MT1,
typename MT2,
typename VT >
605 struct TSMatDVecMultExprTrait< TSMatSMatMultExpr<MT1,MT2>, VT >
609 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
610 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
611 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value
612 ,
typename TSMatDVecMultExprTrait< MT1, typename SMatDVecMultExprTrait<MT2,VT>::Type >::Type
613 , INVALID_TYPE >::Type Type;
622 template<
typename MT1,
typename MT2,
typename VT >
623 struct TSMatSVecMultExprTrait< TSMatSMatMultExpr<MT1,MT2>, VT >
627 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
628 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
629 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value
630 ,
typename TSMatDVecMultExprTrait< MT1, typename SMatDVecMultExprTrait<MT2,VT>::Type >::Type
631 , INVALID_TYPE >::Type Type;
640 template<
typename VT,
typename MT1,
typename MT2 >
641 struct TDVecTSMatMultExprTrait< VT, TSMatSMatMultExpr<MT1,MT2> >
645 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
646 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
647 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
648 ,
typename TDVecSMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
649 , INVALID_TYPE >::Type Type;
658 template<
typename VT,
typename MT1,
typename MT2 >
659 struct TSVecTSMatMultExprTrait< VT, TSMatSMatMultExpr<MT1,MT2> >
663 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
664 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
665 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
666 ,
typename TDVecSMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
667 , INVALID_TYPE >::Type Type;
676 template<
typename MT1,
typename MT2 >
677 struct RowExprTrait< TSMatSMatMultExpr<MT1,MT2> >
681 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
690 template<
typename MT1,
typename MT2 >
691 struct ColumnExprTrait< TSMatSMatMultExpr<MT1,MT2> >
695 typedef typename MultExprTrait< MT1, typename ColumnExprTrait<const MT2>::Type >::Type Type;