22 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATTDMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SMATTDMATMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
83 template<
typename MT1
91 typedef typename MT1::ResultType
RT1;
92 typedef typename MT2::ResultType
RT2;
93 typedef typename MT1::CompositeType
CT1;
94 typedef typename MT2::CompositeType
CT2;
122 enum { vectorizable = 0 };
153 typedef typename boost::remove_reference<CT1>::type::ConstIterator ConstIterator;
158 if(
lhs_.columns() == 0UL )
167 const ConstIterator end( A.end(i) );
168 ConstIterator element( A.begin(i) );
175 tmp = element->value() *
rhs_(element->index(),j);
177 for( ; element!=end; ++element )
178 tmp += element->value() *
rhs_(element->index(),j);
184 for(
size_t k=1UL; k<
lhs_.columns(); ++k ) {
209 return rhs_.columns();
239 template<
typename T >
263 template<
typename MT
270 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
282 const size_t block( 256UL );
285 const size_t jend( B.columns() &
size_t(-4) );
287 for(
size_t ii=0UL; ii<A.rows(); ii+=block ) {
288 const size_t iend( ( ii+block > A.rows() )?( A.rows() ):( ii+block ) );
289 for(
size_t j=0UL; j<jend; j+=4UL ) {
290 for(
size_t i=ii; i<iend; ++i ) {
291 const ConstIterator end( A.end(i) );
292 ConstIterator element( A.begin(i) );
294 (~lhs)(i,j ) = element->value() * B(element->index(),j );
295 (~lhs)(i,j+1UL) = element->value() * B(element->index(),j+1UL);
296 (~lhs)(i,j+2UL) = element->value() * B(element->index(),j+2UL);
297 (~lhs)(i,j+3UL) = element->value() * B(element->index(),j+3UL);
299 for( ; element!=end; ++element ) {
300 (~lhs)(i,j ) += element->value() * B(element->index(),j );
301 (~lhs)(i,j+1UL) += element->value() * B(element->index(),j+1UL);
302 (~lhs)(i,j+2UL) += element->value() * B(element->index(),j+2UL);
303 (~lhs)(i,j+3UL) += element->value() * B(element->index(),j+3UL);
307 reset( (~lhs)(i,j ) );
308 reset( (~lhs)(i,j+1UL) );
309 reset( (~lhs)(i,j+2UL) );
310 reset( (~lhs)(i,j+3UL) );
314 for(
size_t j=jend; j<B.columns(); ++j ) {
315 for(
size_t i=ii; i<iend; ++i ) {
316 const ConstIterator end( A.end(i) );
317 ConstIterator element( A.begin(i) );
319 (~lhs)(i,j) = element->value() * B(element->index(),j);
321 for( ; element!=end; ++element ) {
322 (~lhs)(i,j) += element->value() * B(element->index(),j);
326 reset( (~lhs)(i,j) );
347 template<
typename MT
363 const TmpType tmp( rhs );
382 template<
typename MT
389 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
401 const size_t block( 256UL );
402 BLAZE_INTERNAL_ASSERT( ( B.columns() - ( B.columns() % 4UL ) ) == ( B.columns() & size_t(-4) ),
"Invalid end calculation" );
403 const size_t jend( B.columns() & size_t(-4) );
405 for(
size_t ii=0UL; ii<A.rows(); ii+=block ) {
406 const size_t iend( ( ii+block > A.rows() )?( A.rows() ):( ii+block ) );
407 for(
size_t j=0UL; j<jend; j+=4UL ) {
408 for(
size_t i=ii; i<iend; ++i ) {
409 const ConstIterator end( A.end(i) );
410 ConstIterator element( A.begin(i) );
411 for( ; element!=end; ++element ) {
412 (~lhs)(i,j ) += element->value() * B(element->index(),j );
413 (~lhs)(i,j+1UL) += element->value() * B(element->index(),j+1UL);
414 (~lhs)(i,j+2UL) += element->value() * B(element->index(),j+2UL);
415 (~lhs)(i,j+3UL) += element->value() * B(element->index(),j+3UL);
419 for(
size_t j=jend; j<B.columns(); ++j ) {
420 for(
size_t i=ii; i<iend; ++i ) {
421 const ConstIterator end( A.end(i) );
422 ConstIterator element( A.begin(i) );
423 for( ; element!=end; ++element ) {
424 (~lhs)(i,j) += element->value() * B(element->index(),j);
450 template<
typename MT
457 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
469 const size_t block( 256UL );
470 BLAZE_INTERNAL_ASSERT( ( B.columns() - ( B.columns() % 4UL ) ) == ( B.columns() & size_t(-4) ),
"Invalid end calculation" );
471 const size_t jend( B.columns() & size_t(-4) );
473 for(
size_t ii=0UL; ii<A.rows(); ii+=block ) {
474 const size_t iend( ( ii+block > A.rows() )?( A.rows() ):( ii+block ) );
475 for(
size_t j=0UL; j<jend; j+=4UL ) {
476 for(
size_t i=ii; i<iend; ++i ) {
477 const ConstIterator end( A.end(i) );
478 ConstIterator element( A.begin(i) );
479 for( ; element!=end; ++element ) {
480 (~lhs)(i,j ) -= element->value() * B(element->index(),j );
481 (~lhs)(i,j+1UL) -= element->value() * B(element->index(),j+1UL);
482 (~lhs)(i,j+2UL) -= element->value() * B(element->index(),j+2UL);
483 (~lhs)(i,j+3UL) -= element->value() * B(element->index(),j+3UL);
487 for(
size_t j=jend; j<B.columns(); ++j ) {
488 for(
size_t i=ii; i<iend; ++i ) {
489 const ConstIterator end( A.end(i) );
490 ConstIterator element( A.begin(i) );
491 for( ; element!=end; ++element ) {
492 (~lhs)(i,j) -= element->value() * B(element->index(),j);
564 template<
typename T1
570 throw std::invalid_argument(
"Matrix sizes do not match" );
587 template<
typename MT1,
typename MT2,
typename VT >
592 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
593 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
594 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value
595 ,
typename SMatDVecMultExprTrait< MT1, typename TDMatDVecMultExprTrait<MT2,VT>::Type >::Type
596 , INVALID_TYPE >::Type Type;
605 template<
typename MT1,
typename MT2,
typename VT >
610 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
611 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
612 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value
613 ,
typename SMatDVecMultExprTrait< MT1, typename TDMatSVecMultExprTrait<MT2,VT>::Type >::Type
614 , INVALID_TYPE >::Type Type;
623 template<
typename VT,
typename MT1,
typename MT2 >
628 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
629 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
630 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
631 ,
typename TDVecTDMatMultExprTrait< typename TDVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
632 , INVALID_TYPE >::Type Type;
641 template<
typename VT,
typename MT1,
typename MT2 >
646 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
647 IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
648 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value
649 ,
typename TSVecTDMatMultExprTrait< typename TSVecSMatMultExprTrait<VT,MT1>::Type, MT2 >::Type
650 , INVALID_TYPE >::Type Type;