22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSMATSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSMATSMATMULTEXPR_H_
32 #include <boost/type_traits/remove_reference.hpp>
92 template<
typename MT1
94 class TSMatSMatMultExpr :
public SparseMatrix< TSMatSMatMultExpr<MT1,MT2>, true >
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
277 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
278 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
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
333 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
334 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
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 boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
440 typedef typename boost::remove_reference<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 boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
492 typedef typename boost::remove_reference<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" );
615 template<
typename T1
617 inline typename RowExprTrait< TSMatSMatMultExpr<T1,T2> >::Type
618 row(
const TSMatSMatMultExpr<T1,T2>& sm,
size_t index )
622 return row( sm.leftOperand(), index ) * sm.rightOperand();
641 template<
typename T1
643 inline typename ColumnExprTrait< TSMatSMatMultExpr<T1,T2> >::Type
644 column(
const TSMatSMatMultExpr<T1,T2>& sm,
size_t index )
648 return sm.leftOperand() *
column( sm.rightOperand(), index );
664 template<
typename MT1,
typename MT2,
typename VT >
665 struct TSMatDVecMultExprTrait< TSMatSMatMultExpr<MT1,MT2>, VT >
669 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
670 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
671 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value
672 ,
typename TSMatDVecMultExprTrait< MT1, typename SMatDVecMultExprTrait<MT2,VT>::Type >::Type
673 , INVALID_TYPE >::Type Type;
682 template<
typename MT1,
typename MT2,
typename VT >
683 struct TSMatSVecMultExprTrait< TSMatSMatMultExpr<MT1,MT2>, VT >
687 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
688 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
689 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value
690 ,
typename TSMatDVecMultExprTrait< MT1, typename SMatDVecMultExprTrait<MT2,VT>::Type >::Type
691 , INVALID_TYPE >::Type Type;
700 template<
typename VT,
typename MT1,
typename MT2 >
701 struct TDVecTSMatMultExprTrait< VT, TSMatSMatMultExpr<MT1,MT2> >
705 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
706 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
707 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
708 ,
typename TDVecSMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
709 , INVALID_TYPE >::Type Type;
718 template<
typename VT,
typename MT1,
typename MT2 >
719 struct TSVecTSMatMultExprTrait< VT, TSMatSMatMultExpr<MT1,MT2> >
723 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
724 IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
725 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value
726 ,
typename TDVecSMatMultExprTrait< typename TDVecTSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
727 , INVALID_TYPE >::Type Type;
736 template<
typename MT1,
typename MT2 >
737 struct RowExprTrait< TSMatSMatMultExpr<MT1,MT2> >
741 typedef typename MultExprTrait< typename RowExprTrait<const MT1>::Type, MT2 >::Type Type;
750 template<
typename MT1,
typename MT2 >
751 struct ColumnExprTrait< TSMatSMatMultExpr<MT1,MT2> >
755 typedef typename MultExprTrait< MT1, typename ColumnExprTrait<const MT2>::Type >::Type Type;