35 #ifndef _BLAZE_MATH_EXPRESSIONS_TDMATTSMATMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_TDMATTSMATMULTEXPR_H_
127 template<
typename MT1
129 class TDMatTSMatMultExpr :
public DenseMatrix< TDMatTSMatMultExpr<MT1,MT2>, true >
130 ,
private MatMatMultExpr
131 ,
private Computation
159 template<
typename T1,
typename T2,
typename T3 >
160 struct IsEvaluationRequired {
161 enum :
bool { value = ( evaluateLeft || evaluateRight ) };
171 template<
typename T1,
typename T2,
typename T3 >
172 struct UseVectorizedKernel {
174 !IsDiagonal<T2>::value &&
175 T1::simdEnabled && T2::simdEnabled &&
176 IsColumnMajorMatrix<T1>::value &&
177 AreSIMDCombinable< ElementType_<T1>
179 , ElementType_<T3> >::value &&
180 HasSIMDAdd< ElementType_<T2>, ElementType_<T3> >::value &&
181 HasSIMDMult< ElementType_<T2>, ElementType_<T3> >::value };
192 template<
typename T1,
typename T2,
typename T3 >
193 struct UseOptimizedKernel {
195 !UseVectorizedKernel<T1,T2,T3>::value &&
196 !IsDiagonal<T2>::value &&
197 !IsResizable< ElementType_<T1> >::value &&
198 !IsResizable<ET2>::value };
208 template<
typename T1,
typename T2,
typename T3 >
209 struct UseDefaultKernel {
210 enum :
bool { value = !UseVectorizedKernel<T1,T2,T3>::value &&
211 !UseOptimizedKernel<T1,T2,T3>::value };
248 enum :
bool { smpAssignable = !evaluateLeft && MT1::smpAssignable &&
249 !evaluateRight && MT2::smpAssignable };
304 :(
lhs_.columns() ) ) );
308 const size_t n(
end - begin );
326 inline ReturnType
at(
size_t i,
size_t j )
const {
327 if( i >=
lhs_.rows() ) {
330 if( j >=
rhs_.columns() ) {
342 inline size_t rows() const noexcept {
353 return rhs_.columns();
383 template<
typename T >
384 inline bool canAlias(
const T* alias )
const noexcept {
385 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
395 template<
typename T >
396 inline bool isAliased(
const T* alias )
const noexcept {
397 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
407 return lhs_.isAligned();
417 return (
rows() *
columns() >= SMP_TDMATTSMATMULT_THRESHOLD );
440 template<
typename MT
449 LT A(
serial( rhs.lhs_ ) );
450 RT B(
serial( rhs.rhs_ ) );
459 TDMatTSMatMultExpr::selectAssignKernel( ~lhs, A, B );
478 template<
typename MT3
482 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
490 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
492 const size_t itmp(
min( ii+block, A.rows() ) );
494 for(
size_t j=0UL; j<B.columns(); ++j )
496 ConstIterator element( B.begin(j) );
497 const ConstIterator
end( B.end(j) );
499 for( ; element!=
end; ++element )
501 const size_t j1( element->index() );
505 C(j1,j) = A(j1,j1) * element->value();
509 const size_t ibegin( ( IsLower<MT4>::value )
510 ?(
max( ii, ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) ) )
512 const size_t iend( ( IsUpper<MT4>::value )
513 ?(
min( itmp, ( IsStrictlyUpper<MT4>::value ? j1 : j1+1UL ) ) )
516 if( IsTriangular<MT4>::value && ibegin >= iend )
521 for(
size_t i=ibegin; i<iend; ++i ) {
523 C(i,j) = A(i,j1) * element->value();
525 C(i,j) += A(i,j1) * element->value();
549 template<
typename MT3
552 static inline EnableIf_< UseOptimizedKernel<MT3,MT4,MT5> >
553 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
557 const size_t block( IsColumnMajorMatrix<MT3>::value ? A.rows() : 64UL );
561 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
563 const size_t itmp(
min( ii+block, A.rows() ) );
565 for(
size_t j=0UL; j<B.columns(); ++j )
567 const ConstIterator
end( B.end(j) );
568 ConstIterator element( B.begin(j) );
570 const size_t nonzeros( B.nonZeros(j) );
571 const size_t kpos( nonzeros &
size_t(-4) );
574 for(
size_t k=0UL; k<kpos; k+=4UL )
576 const size_t j1( element->index() );
577 const ET2 v1( element->value() );
579 const size_t j2( element->index() );
580 const ET2 v2( element->value() );
582 const size_t j3( element->index() );
583 const ET2 v3( element->value() );
585 const size_t j4( element->index() );
586 const ET2 v4( element->value() );
591 const size_t ibegin( ( IsLower<MT4>::value )
592 ?(
max( ii, ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) ) )
594 const size_t iend( ( IsUpper<MT4>::value )
595 ?(
min( itmp, ( IsStrictlyUpper<MT4>::value ? j4 : j4+1UL ) ) )
598 if( IsTriangular<MT4>::value && ibegin >= iend )
603 const size_t inum( iend - ibegin );
604 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
607 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
608 C(i ,j) += A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
609 C(i+1UL,j) += A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
610 C(i+2UL,j) += A(i+2UL,j1) * v1 + A(i+2UL,j2) * v2 + A(i+2UL,j3) * v3 + A(i+2UL,j4) * v4;
611 C(i+3UL,j) += A(i+3UL,j1) * v1 + A(i+3UL,j2) * v2 + A(i+3UL,j3) * v3 + A(i+3UL,j4) * v4;
613 for(
size_t i=ipos; i<iend; ++i ) {
614 C(i,j) += A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
618 for( ; element!=
end; ++element )
620 const size_t j1( element->index() );
621 const ET2 v1( element->value() );
623 const size_t ibegin( ( IsLower<MT4>::value )
624 ?(
max( ii, ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) ) )
626 const size_t iend( ( IsUpper<MT4>::value )
627 ?(
min( itmp, ( IsStrictlyUpper<MT4>::value ? j1 : j1+1UL ) ) )
630 if( IsTriangular<MT4>::value && ibegin >= iend )
635 const size_t inum( iend - ibegin );
636 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
639 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
640 C(i ,j) += A(i ,j1) * v1;
641 C(i+1UL,j) += A(i+1UL,j1) * v1;
642 C(i+2UL,j) += A(i+2UL,j1) * v1;
643 C(i+3UL,j) += A(i+3UL,j1) * v1;
645 for(
size_t i=ipos; i<iend; ++i ) {
646 C(i,j) += A(i,j1) * v1;
669 template<
typename MT3
672 static inline EnableIf_< UseVectorizedKernel<MT3,MT4,MT5> >
673 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
677 const bool remainder( !IsPadded<MT3>::value || !IsPadded<MT4>::value );
681 for(
size_t j=0UL; j<B.columns(); ++j )
683 const ConstIterator
end( B.end(j) );
684 ConstIterator element( B.begin(j) );
686 const size_t nonzeros( B.nonZeros(j) );
687 const size_t kpos( nonzeros &
size_t(-4) );
690 for(
size_t k=0UL; k<kpos; k+=4UL )
692 const size_t j1( element->index() );
693 const ET2 v1( element->value() );
695 const size_t j2( element->index() );
696 const ET2 v2( element->value() );
698 const size_t j3( element->index() );
699 const ET2 v3( element->value() );
701 const size_t j4( element->index() );
702 const ET2 v4( element->value() );
707 const SIMDType xmm1(
set( v1 ) );
708 const SIMDType xmm2(
set( v2 ) );
709 const SIMDType xmm3(
set( v3 ) );
710 const SIMDType xmm4(
set( v4 ) );
712 const size_t ibegin( ( IsLower<MT4>::value )
713 ?( ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) &
size_t(-SIMDSIZE) )
715 const size_t iend( ( IsUpper<MT4>::value )
716 ?( IsStrictlyUpper<MT4>::value ? j4 : j4+1UL )
720 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
721 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
725 for( ; i<ipos; i+=SIMDSIZE ) {
726 C.store( i, j, C.load(i,j) + A.load(i,j1) * xmm1 + A.load(i,j2) * xmm2 + A.load(i,j3) * xmm3 + A.load(i,j4) * xmm4 );
728 for( ; remainder && i<iend; ++i ) {
729 C(i,j) += A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
733 for( ; element!=
end; ++element )
735 const size_t j1( element->index() );
736 const ET2 v1( element->value() );
738 const SIMDType xmm1(
set( v1 ) );
740 const size_t ibegin( ( IsLower<MT4>::value )
741 ?( ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) &
size_t(-SIMDSIZE) )
743 const size_t iend( ( IsUpper<MT4>::value )
744 ?( IsStrictlyUpper<MT4>::value ? j1 : j1+1UL )
748 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
749 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
753 for( ; i<ipos; i+=SIMDSIZE ) {
754 C.store( i, j, C.load(i,j) + A.load(i,j1) * xmm1 );
756 for( ; remainder && i<iend; ++i ) {
757 C(i,j) += A(i,j1) * v1;
778 template<
typename MT
784 typedef IfTrue_< SO, ResultType, OppositeType > TmpType;
796 const TmpType tmp(
serial( rhs ) );
815 template<
typename MT
817 friend inline void addAssign( DenseMatrix<MT,SO>& lhs,
const TDMatTSMatMultExpr& rhs )
824 LT A(
serial( rhs.lhs_ ) );
825 RT B(
serial( rhs.rhs_ ) );
834 TDMatTSMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
853 template<
typename MT3
856 static inline EnableIf_< UseDefaultKernel<MT3,MT4,MT5> >
857 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
861 const size_t block( Or< IsColumnMajorMatrix<MT3>, IsDiagonal<MT4> >::value ? A.rows() : 64UL );
863 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
865 const size_t itmp(
min( ii+block, A.rows() ) );
867 for(
size_t j=0UL; j<B.columns(); ++j )
869 ConstIterator element( B.begin(j) );
870 const ConstIterator
end( B.end(j) );
872 for( ; element!=
end; ++element )
874 const size_t j1( element->index() );
876 if( IsDiagonal<MT4>::value )
878 C(j1,j) += A(j1,j1) * element->value();
882 const size_t ibegin( ( IsLower<MT4>::value )
883 ?(
max( ii, ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) ) )
885 const size_t iend( ( IsUpper<MT4>::value )
886 ?(
min( itmp, ( IsStrictlyUpper<MT4>::value ? j1 : j1+1UL ) ) )
889 if( IsTriangular<MT4>::value && ibegin >= iend )
894 const size_t inum( iend - ibegin );
895 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
898 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
899 C(i ,j) += A(i ,j1) * element->value();
900 C(i+1UL,j) += A(i+1UL,j1) * element->value();
901 C(i+2UL,j) += A(i+2UL,j1) * element->value();
902 C(i+3UL,j) += A(i+3UL,j1) * element->value();
904 for(
size_t i=ipos; i<iend; ++i ) {
905 C(i,j) += A(i,j1) * element->value();
929 template<
typename MT3
932 static inline EnableIf_< UseOptimizedKernel<MT3,MT4,MT5> >
933 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
937 const size_t block( IsColumnMajorMatrix<MT3>::value ? A.rows() : 64UL );
939 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
941 const size_t itmp(
min( ii+block, A.rows() ) );
943 for(
size_t j=0UL; j<B.columns(); ++j )
945 const ConstIterator
end( B.end(j) );
946 ConstIterator element( B.begin(j) );
948 const size_t nonzeros( B.nonZeros(j) );
949 const size_t kpos( nonzeros &
size_t(-4) );
952 for(
size_t k=0UL; k<kpos; k+=4UL )
954 const size_t j1( element->index() );
955 const ET2 v1( element->value() );
957 const size_t j2( element->index() );
958 const ET2 v2( element->value() );
960 const size_t j3( element->index() );
961 const ET2 v3( element->value() );
963 const size_t j4( element->index() );
964 const ET2 v4( element->value() );
969 const size_t ibegin( ( IsLower<MT4>::value )
970 ?(
max( ii, ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) ) )
972 const size_t iend( ( IsUpper<MT4>::value )
973 ?(
min( itmp, ( IsStrictlyUpper<MT4>::value ? j4 : j4+1UL ) ) )
976 if( IsTriangular<MT4>::value && ibegin >= iend )
981 const size_t inum( iend - ibegin );
982 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
985 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
986 C(i ,j) += A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
987 C(i+1UL,j) += A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
988 C(i+2UL,j) += A(i+2UL,j1) * v1 + A(i+2UL,j2) * v2 + A(i+2UL,j3) * v3 + A(i+2UL,j4) * v4;
989 C(i+3UL,j) += A(i+3UL,j1) * v1 + A(i+3UL,j2) * v2 + A(i+3UL,j3) * v3 + A(i+3UL,j4) * v4;
991 for(
size_t i=ipos; i<iend; ++i ) {
992 C(i,j) += A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
996 for( ; element!=
end; ++element )
998 const size_t j1( element->index() );
999 const ET2 v1( element->value() );
1001 const size_t ibegin( ( IsLower<MT4>::value )
1002 ?(
max( ii, ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) ) )
1004 const size_t iend( ( IsUpper<MT4>::value )
1005 ?(
min( itmp, ( IsStrictlyUpper<MT4>::value ? j1 : j1+1UL ) ) )
1008 if( IsTriangular<MT4>::value && ibegin >= iend )
1013 const size_t inum( iend - ibegin );
1014 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
1017 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
1018 C(i ,j) += A(i ,j1) * v1;
1019 C(i+1UL,j) += A(i+1UL,j1) * v1;
1020 C(i+2UL,j) += A(i+2UL,j1) * v1;
1021 C(i+3UL,j) += A(i+3UL,j1) * v1;
1023 for(
size_t i=ipos; i<iend; ++i ) {
1024 C(i,j) += A(i,j1) * v1;
1047 template<
typename MT3
1050 static inline EnableIf_< UseVectorizedKernel<MT3,MT4,MT5> >
1051 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
1055 const bool remainder( !IsPadded<MT3>::value || !IsPadded<MT4>::value );
1057 for(
size_t j=0UL; j<B.columns(); ++j )
1059 const ConstIterator
end( B.end(j) );
1060 ConstIterator element( B.begin(j) );
1062 const size_t nonzeros( B.nonZeros(j) );
1063 const size_t kpos( nonzeros &
size_t(-4) );
1066 for(
size_t k=0UL; k<kpos; k+=4UL )
1068 const size_t j1( element->index() );
1069 const ET2 v1( element->value() );
1071 const size_t j2( element->index() );
1072 const ET2 v2( element->value() );
1074 const size_t j3( element->index() );
1075 const ET2 v3( element->value() );
1077 const size_t j4( element->index() );
1078 const ET2 v4( element->value() );
1083 const SIMDType xmm1(
set( v1 ) );
1084 const SIMDType xmm2(
set( v2 ) );
1085 const SIMDType xmm3(
set( v3 ) );
1086 const SIMDType xmm4(
set( v4 ) );
1088 const size_t ibegin( ( IsLower<MT4>::value )
1089 ?( ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) &
size_t(-SIMDSIZE) )
1091 const size_t iend( ( IsUpper<MT4>::value )
1092 ?( IsStrictlyUpper<MT4>::value ? j4 : j4+1UL )
1096 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
1097 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
1101 for( ; i<ipos; i+=SIMDSIZE ) {
1102 C.store( i, j, C.load(i,j) + A.load(i,j1) * xmm1 + A.load(i,j2) * xmm2 + A.load(i,j3) * xmm3 + A.load(i,j4) * xmm4 );
1104 for( ; remainder && i<iend; ++i ) {
1105 C(i,j) += A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
1109 for( ; element!=
end; ++element )
1111 const size_t j1( element->index() );
1112 const ET2 v1( element->value() );
1114 const SIMDType xmm1(
set( v1 ) );
1116 const size_t ibegin( ( IsLower<MT4>::value )
1117 ?( ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) &
size_t(-SIMDSIZE) )
1119 const size_t iend( ( IsUpper<MT4>::value )
1120 ?( IsStrictlyUpper<MT4>::value ? j1 : j1+1UL )
1124 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
1125 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
1129 for( ; i<ipos; i+=SIMDSIZE ) {
1130 C.store( i, j, C.load(i,j) + A.load(i,j1) * xmm1 );
1132 for( ; remainder && i<iend; ++i ) {
1133 C(i,j) += A(i,j1) * v1;
1158 template<
typename MT
1160 friend inline void subAssign( DenseMatrix<MT,SO>& lhs,
const TDMatTSMatMultExpr& rhs )
1167 LT A(
serial( rhs.lhs_ ) );
1168 RT B(
serial( rhs.rhs_ ) );
1177 TDMatTSMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
1196 template<
typename MT3
1199 static inline EnableIf_< UseDefaultKernel<MT3,MT4,MT5> >
1200 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
1204 const size_t block( Or< IsColumnMajorMatrix<MT3>, IsDiagonal<MT4> >::value ? A.rows() : 64UL );
1206 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
1208 const size_t itmp(
min( ii+block, A.rows() ) );
1210 for(
size_t j=0UL; j<B.columns(); ++j )
1212 ConstIterator element( B.begin(j) );
1213 const ConstIterator
end( B.end(j) );
1215 for( ; element!=
end; ++element )
1217 const size_t j1( element->index() );
1219 if( IsDiagonal<MT4>::value )
1221 C(j1,j) -= A(j1,j1) * element->value();
1225 const size_t ibegin( ( IsLower<MT4>::value )
1226 ?(
max( ii, ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) ) )
1228 const size_t iend( ( IsUpper<MT4>::value )
1229 ?(
min( itmp, ( IsStrictlyUpper<MT4>::value ? j1 : j1+1UL ) ) )
1232 if( IsTriangular<MT4>::value && ibegin >= iend )
1237 const size_t inum( iend - ibegin );
1238 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
1241 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
1242 C(i ,j) -= A(i ,j1) * element->value();
1243 C(i+1UL,j) -= A(i+1UL,j1) * element->value();
1244 C(i+2UL,j) -= A(i+2UL,j1) * element->value();
1245 C(i+3UL,j) -= A(i+3UL,j1) * element->value();
1247 for(
size_t i=ipos; i<iend; ++i ) {
1248 C(i,j) -= A(i,j1) * element->value();
1272 template<
typename MT3
1275 static inline EnableIf_< UseOptimizedKernel<MT3,MT4,MT5> >
1276 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
1280 const size_t block( IsColumnMajorMatrix<MT3>::value ? A.rows() : 64UL );
1282 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
1284 const size_t itmp(
min( ii+block, A.rows() ) );
1286 for(
size_t j=0UL; j<B.columns(); ++j )
1288 const ConstIterator
end( B.end(j) );
1289 ConstIterator element( B.begin(j) );
1291 const size_t nonzeros( B.nonZeros(j) );
1292 const size_t kpos( nonzeros &
size_t(-4) );
1295 for(
size_t k=0UL; k<kpos; k+=4UL )
1297 const size_t j1( element->index() );
1298 const ET2 v1( element->value() );
1300 const size_t j2( element->index() );
1301 const ET2 v2( element->value() );
1303 const size_t j3( element->index() );
1304 const ET2 v3( element->value() );
1306 const size_t j4( element->index() );
1307 const ET2 v4( element->value() );
1312 const size_t ibegin( ( IsLower<MT4>::value )
1313 ?(
max( ii, ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) ) )
1315 const size_t iend( ( IsUpper<MT4>::value )
1316 ?(
min( itmp, ( IsStrictlyUpper<MT4>::value ? j4 : j4+1UL ) ) )
1319 if( IsTriangular<MT4>::value && ibegin >= iend )
1324 const size_t inum( iend - ibegin );
1325 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
1328 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
1329 C(i ,j) -= A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
1330 C(i+1UL,j) -= A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
1331 C(i+2UL,j) -= A(i+2UL,j1) * v1 + A(i+2UL,j2) * v2 + A(i+2UL,j3) * v3 + A(i+2UL,j4) * v4;
1332 C(i+3UL,j) -= A(i+3UL,j1) * v1 + A(i+3UL,j2) * v2 + A(i+3UL,j3) * v3 + A(i+3UL,j4) * v4;
1334 for(
size_t i=ipos; i<iend; ++i ) {
1335 C(i,j) -= A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
1339 for( ; element!=
end; ++element )
1341 const size_t j1( element->index() );
1342 const ET2 v1( element->value() );
1344 const size_t ibegin( ( IsLower<MT4>::value )
1345 ?(
max( ii, ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) ) )
1347 const size_t iend( ( IsUpper<MT4>::value )
1348 ?(
min( itmp, ( IsStrictlyUpper<MT4>::value ? j1 : j1+1UL ) ) )
1351 if( IsTriangular<MT4>::value && ibegin >= iend )
1356 const size_t inum( iend - ibegin );
1357 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
1360 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
1361 C(i ,j) -= A(i ,j1) * v1;
1362 C(i+1UL,j) -= A(i+1UL,j1) * v1;
1363 C(i+2UL,j) -= A(i+2UL,j1) * v1;
1364 C(i+3UL,j) -= A(i+3UL,j1) * v1;
1366 for(
size_t i=ipos; i<iend; ++i ) {
1367 C(i,j) -= A(i,j1) * v1;
1390 template<
typename MT3
1393 static inline EnableIf_< UseVectorizedKernel<MT3,MT4,MT5> >
1394 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
1398 const bool remainder( !IsPadded<MT3>::value || !IsPadded<MT4>::value );
1400 for(
size_t j=0UL; j<B.columns(); ++j )
1402 const ConstIterator
end( B.end(j) );
1403 ConstIterator element( B.begin(j) );
1405 const size_t nonzeros( B.nonZeros(j) );
1406 const size_t kpos( nonzeros &
size_t(-4) );
1409 for(
size_t k=0UL; k<kpos; k+=4UL )
1411 const size_t j1( element->index() );
1412 const ET2 v1( element->value() );
1414 const size_t j2( element->index() );
1415 const ET2 v2( element->value() );
1417 const size_t j3( element->index() );
1418 const ET2 v3( element->value() );
1420 const size_t j4( element->index() );
1421 const ET2 v4( element->value() );
1426 const SIMDType xmm1(
set( v1 ) );
1427 const SIMDType xmm2(
set( v2 ) );
1428 const SIMDType xmm3(
set( v3 ) );
1429 const SIMDType xmm4(
set( v4 ) );
1431 const size_t ibegin( ( IsLower<MT4>::value )
1432 ?( ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) &
size_t(-SIMDSIZE) )
1434 const size_t iend( ( IsUpper<MT4>::value )
1435 ?( IsStrictlyUpper<MT4>::value ? j4 : j4+1UL )
1439 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
1440 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
1444 for( ; i<ipos; i+=SIMDSIZE ) {
1445 C.store( i, j, C.load(i,j) - A.load(i,j1) * xmm1 - A.load(i,j2) * xmm2 - A.load(i,j3) * xmm3 - A.load(i,j4) * xmm4 );
1447 for( ; remainder && i<iend; ++i ) {
1448 C(i,j) -= A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
1452 for( ; element!=
end; ++element )
1454 const size_t j1( element->index() );
1455 const ET2 v1( element->value() );
1457 const SIMDType xmm1(
set( v1 ) );
1459 const size_t ibegin( ( IsLower<MT4>::value )
1460 ?( ( IsStrictlyLower<MT4>::value ? j1+1UL : j1 ) &
size_t(-SIMDSIZE) )
1462 const size_t iend( ( IsUpper<MT4>::value )
1463 ?( IsStrictlyUpper<MT4>::value ? j1 : j1+1UL )
1467 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
1468 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
1472 for( ; i<ipos; i+=SIMDSIZE ) {
1473 C.store( i, j, C.load(i,j) - A.load(i,j1) * xmm1 );
1475 for( ; remainder && i<iend; ++i ) {
1476 C(i,j) -= A(i,j1) * v1;
1511 template<
typename MT
1513 friend inline EnableIf_< IsEvaluationRequired<MT,MT1,MT2> >
1551 template<
typename MT
1553 friend inline EnableIf_< IsEvaluationRequired<MT,MT1,MT2> >
1558 typedef IfTrue_< SO, ResultType, OppositeType > TmpType;
1570 const TmpType tmp( rhs );
1591 template<
typename MT
1593 friend inline EnableIf_< IsEvaluationRequired<MT,MT1,MT2> >
1635 template<
typename MT
1637 friend inline EnableIf_< IsEvaluationRequired<MT,MT1,MT2> >
1722 template<
typename T1
1724 inline const TDMatTSMatMultExpr<T1,T2>
1748 template<
typename MT1,
typename MT2 >
1765 template<
typename MT1,
typename MT2 >
1782 template<
typename MT1,
typename MT2 >
1800 template<
typename MT1,
typename MT2 >
1802 :
public BoolConstant< And< IsLower<MT1>, IsLower<MT2> >::value >
1818 template<
typename MT1,
typename MT2 >
1820 :
public BoolConstant< And< IsUniLower<MT1>, IsUniLower<MT2> >::value >
1836 template<
typename MT1,
typename MT2 >
1838 :
public BoolConstant< Or< And< IsStrictlyLower<MT1>, IsLower<MT2> >
1839 , And< IsStrictlyLower<MT2>, IsLower<MT1> > >::value >
1855 template<
typename MT1,
typename MT2 >
1857 :
public BoolConstant< And< IsUpper<MT1>, IsUpper<MT2> >::value >
1873 template<
typename MT1,
typename MT2 >
1875 :
public BoolConstant< And< IsUniUpper<MT1>, IsUniUpper<MT2> >::value >
1891 template<
typename MT1,
typename MT2 >
1893 :
public BoolConstant< Or< And< IsStrictlyUpper<MT1>, IsUpper<MT2> >
1894 , And< IsStrictlyUpper<MT2>, IsUpper<MT1> > >::value >
1910 template<
typename MT1,
typename MT2,
typename VT >
1915 using Type = If_< And< IsDenseMatrix<MT1>, IsColumnMajorMatrix<MT1>
1916 , IsSparseMatrix<MT2>, IsColumnMajorMatrix<MT2>
1917 , IsDenseVector<VT>, IsColumnVector<VT> >
1918 , TDMatDVecMultExprTrait_< MT1, TSMatDVecMultExprTrait_<MT2,VT> >
1928 template<
typename MT1,
typename MT2,
typename VT >
1933 using Type = If_< And< IsDenseMatrix<MT1>, IsColumnMajorMatrix<MT1>
1934 , IsSparseMatrix<MT2>, IsColumnMajorMatrix<MT2>
1935 , IsSparseVector<VT>, IsColumnVector<VT> >
1936 , TDMatDVecMultExprTrait_< MT1, TSMatDVecMultExprTrait_<MT2,VT> >
1946 template<
typename VT,
typename MT1,
typename MT2 >
1951 using Type = If_< And< IsDenseVector<VT>, IsRowVector<VT>
1952 , IsDenseMatrix<MT1>, IsColumnMajorMatrix<MT1>
1953 , IsSparseMatrix<MT2>, IsColumnMajorMatrix<MT2> >
1954 , TDVecTSMatMultExprTrait_< TDVecTDMatMultExprTrait_<VT,MT1>, MT2 >
1964 template<
typename VT,
typename MT1,
typename MT2 >
1969 using Type = If_< And< IsSparseVector<VT>, IsRowVector<VT>
1970 , IsDenseMatrix<MT1>, IsColumnMajorMatrix<MT1>
1971 , IsSparseMatrix<MT2>, IsColumnMajorMatrix<MT2> >
1972 , TDVecTSMatMultExprTrait_< TSVecTDMatMultExprTrait_<VT,MT1>, MT2 >
1982 template<
typename MT1,
typename MT2,
bool AF >
1987 using Type = MultExprTrait_< SubmatrixExprTrait_<const MT1,AF>
1988 , SubmatrixExprTrait_<const MT2,AF> >;
1997 template<
typename MT1,
typename MT2 >
2002 using Type = MultExprTrait_< RowExprTrait_<const MT1>, MT2 >;
2011 template<
typename MT1,
typename MT2 >
2016 using Type = MultExprTrait_< MT1, ColumnExprTrait_<const MT2> >;
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: TDMatTSMatMultExpr.h:384
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.This macro encapsulates the default way o...
Definition: Exception.h:235
bool canSMPAssign() const noexcept
Returns whether the expression can be used in SMP assignments.
Definition: TDMatTSMatMultExpr.h:416
Header file for auxiliary alias declarations.
Compile time check whether the given type is a computational expression template.This type trait clas...
Definition: IsComputation.h:72
Header file for mathematical functions.
constexpr bool useOptimizedKernels
Configuration switch for optimized kernels.This configuration switch enables/disables all optimized c...
Definition: Optimizations.h:84
TDMatTSMatMultExpr< MT1, MT2 > This
Type of this TDMatTSMatMultExpr instance.
Definition: TDMatTSMatMultExpr.h:218
Header file for the Rows type trait.
Header file for the IsUniUpper type trait.
const DMatDMatMultExpr< T1, T2 > operator*(const DenseMatrix< T1, false > &lhs, const DenseMatrix< T2, false > &rhs)
Multiplication operator for the multiplication of two row-major dense matrices ( ).
Definition: DMatDMatMultExpr.h:7800
Compile time check for triangular matrix types.This type trait tests whether or not the given templat...
Definition: IsTriangular.h:87
Header file for basic type definitions.
Expression object for transpose dense matrix-transpose sparse matrix multiplications.The TDMatTSMatMultExpr class represents the compile time expression for multiplications between a column-major dense matrix and a column-major sparse matrix.
Definition: Forward.h:135
EnableIf_< IsDenseMatrix< MT1 > > smpSubAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP subtraction assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:160
Header file for the IsSparseMatrix type trait.
Header file for the serial shim.
ResultType_< MT1 > RT1
Result type of the left-hand side dense matrix expression.
Definition: TDMatTSMatMultExpr.h:135
Header file for the IsDiagonal type trait.
BLAZE_ALWAYS_INLINE size_t size(const Vector< VT, TF > &vector) noexcept
Returns the current size/dimension of the vector.
Definition: Vector.h:258
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is not a dense, N-dimensional matrix type...
Definition: DenseMatrix.h:61
Header file for the ColumnExprTrait class template.
BLAZE_ALWAYS_INLINE MT::Iterator begin(Matrix< MT, SO > &matrix, size_t i)
Returns an iterator to the first element of row/column i.
Definition: Matrix.h:188
Availability of a SIMD multiplication for the given data types.Depending on the available instruction...
Definition: HasSIMDMult.h:162
typename SIMDTrait< T >::Type SIMDTrait_
Auxiliary alias declaration for the SIMDTrait class template.The SIMDTrait_ alias declaration provide...
Definition: SIMDTrait.h:315
Header file for the IsColumnMajorMatrix type trait.
void reset(const DiagonalProxy< MT > &proxy)
Resetting the represented element to the default initial values.
Definition: DiagonalProxy.h:533
Header file for the IsRowVector type trait.
Header file for the And class template.
const ElementType_< MT > min(const DenseMatrix< MT, SO > &dm)
Returns the smallest element of the dense matrix.
Definition: DenseMatrix.h:1669
Compile time check for lower triangular matrices.This type trait tests whether or not the given templ...
Definition: IsLower.h:88
OppositeType_< ResultType > OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: TDMatTSMatMultExpr.h:220
Availability of a SIMD addition for the given data types.Depending on the available instruction set (...
Definition: HasSIMDAdd.h:162
MultTrait_< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: TDMatTSMatMultExpr.h:219
const ElementType ReturnType
Return type for expression template evaluations.
Definition: TDMatTSMatMultExpr.h:224
const DMatSerialExpr< MT, SO > serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:723
typename MultTrait< T1, T2 >::Type MultTrait_
Auxiliary alias declaration for the MultTrait class template.The MultTrait_ alias declaration provide...
Definition: MultTrait.h:245
Header file for the Computation base class.
Header file for the MatMatMultExpr base class.
Compile time check for upper triangular matrices.This type trait tests whether or not the given templ...
Definition: IsUpper.h:88
Constraints on the storage order of matrix types.
Header file for the RequiresEvaluation type trait.
System settings for performance optimizations.
Header file for the IsUniLower type trait.
typename T::ResultType ResultType_
Alias declaration for nested ResultType type definitions.The ResultType_ alias declaration provides a...
Definition: Aliases.h:323
const ElementType_< MT > max(const DenseMatrix< MT, SO > &dm)
Returns the largest element of the dense matrix.
Definition: DenseMatrix.h:1716
EnableIf_< IsDenseMatrix< MT1 > > smpAddAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP addition assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:129
DisableIf_< Or< IsComputation< MT >, IsTransExpr< MT > >, ColumnExprTrait_< MT > > column(Matrix< MT, SO > &matrix, size_t index)
Creating a view on a specific column of the given matrix.
Definition: Column.h:126
CompositeType_< MT2 > CT2
Composite type of the right-hand side sparse matrix expression.
Definition: TDMatTSMatMultExpr.h:140
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:70
Base class for sparse matrices.The SparseMatrix class is a base class for all sparse matrix classes...
Definition: Forward.h:109
ResultType_< MT2 > RT2
Result type of the right-hand side sparse matrix expression.
Definition: TDMatTSMatMultExpr.h:136
bool isDefault(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is in default state.
Definition: DiagonalProxy.h:573
Constraint on the data type.
typename IfTrue< Condition, T1, T2 >::Type IfTrue_
Auxiliary alias declaration for the IfTrue class template.The IfTrue_ alias declaration provides a co...
Definition: If.h:109
ReturnType at(size_t i, size_t j) const
Checked access to the matrix elements.
Definition: TDMatTSMatMultExpr.h:326
const ResultType CompositeType
Data type for composite expression templates.
Definition: TDMatTSMatMultExpr.h:225
Constraint on the data type.
Constraint on the data type.
Header file for the MultExprTrait class template.
Compile time check to query the requirement to evaluate an expression.Via this type trait it is possi...
Definition: RequiresEvaluation.h:72
SubvectorExprTrait_< VT, unaligned > subvector(Vector< VT, TF > &vector, size_t index, size_t size)
Creating a view on a specific subvector of the given vector.
Definition: Subvector.h:152
IfTrue_< evaluateLeft, const RT1, CT1 > LT
Type for the assignment of the left-hand side dense matrix operand.
Definition: TDMatTSMatMultExpr.h:234
typename T::CompositeType CompositeType_
Alias declaration for nested CompositeType type definitions.The CompositeType_ alias declaration prov...
Definition: Aliases.h:83
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: TDMatTSMatMultExpr.h:396
Header file for the multiplication trait.
Header file for the IsStrictlyUpper type trait.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
Header file for the If class template.
#define BLAZE_CONSTRAINT_MUST_BE_COLUMN_MAJOR_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is not a column-major dense or sparse matri...
Definition: ColumnMajorMatrix.h:61
Header file for the TSVecTDMatMultExprTrait class template.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2647
EnableIf_< IsDenseMatrix< MT1 > > smpAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:98
Header file for the Or class template.
Header file for the TDMatSVecMultExprTrait class template.
Header file for the TDVecTSMatMultExprTrait class template.
#define BLAZE_THROW_OUT_OF_RANGE(MESSAGE)
Macro for the emission of a std::out_of_range exception.This macro encapsulates the default way of Bl...
Definition: Exception.h:331
Header file for the HasSIMDAdd type trait.
Header file for the DenseMatrix base class.
Header file for the Columns type trait.
Header file for the TSMatDVecMultExprTrait class template.
typename T::ElementType ElementType_
Alias declaration for nested ElementType type definitions.The ElementType_ alias declaration provides...
Definition: Aliases.h:163
Header file for all SIMD functionality.
Header file for the IsLower type trait.
Header file for the IsAligned type trait.
Compile time check for diagonal matrices.This type trait tests whether or not the given template para...
Definition: IsDiagonal.h:90
#define BLAZE_CONSTRAINT_MUST_BE_REFERENCE_TYPE(T)
Constraint on the data type.In case the given data type T is not a reference type, a compilation error is created.
Definition: Reference.h:60
Header file for the IsTriangular type trait.
Constraints on the storage order of matrix types.
Header file for the exception macros of the math module.
Compile time check for strictly upper triangular matrices.This type trait tests whether or not the gi...
Definition: IsStrictlyUpper.h:86
CompositeType_< MT1 > CT1
Composite type of the left-hand side dense matrix expression.
Definition: TDMatTSMatMultExpr.h:139
BLAZE_ALWAYS_INLINE MT::Iterator end(Matrix< MT, SO > &matrix, size_t i)
Returns an iterator just past the last element of row/column i.
Definition: Matrix.h:254
Header file for the RowExprTrait class template.
Header file for all forward declarations for expression class templates.
Header file for the IsDenseMatrix type trait.
LeftOperand lhs_
Left-hand side dense matrix of the multiplication expression.
Definition: TDMatTSMatMultExpr.h:423
Header file for the EnableIf class template.
Header file for the IsStrictlyLower type trait.
#define BLAZE_CONSTRAINT_MUST_FORM_VALID_MATMATMULTEXPR(T1, T2)
Constraint on the data type.In case the given data types T1 and T2 do not form a valid matrix/matrix ...
Definition: MatMatMultExpr.h:109
BLAZE_ALWAYS_INLINE const EnableIf_< And< IsIntegral< T >, HasSize< T, 1UL > >, If_< IsSigned< T >, SIMDint8, SIMDuint8 > > set(T value) noexcept
Sets all values in the vector to the given 1-byte integral value.
Definition: Set.h:76
size_t rows() const noexcept
Returns the current number of rows of the matrix.
Definition: TDMatTSMatMultExpr.h:342
DisableIf_< Or< IsComputation< MT >, IsTransExpr< MT > >, RowExprTrait_< MT > > row(Matrix< MT, SO > &matrix, size_t index)
Creating a view on a specific row of the given matrix.
Definition: Row.h:126
Header file for the IsSparseVector type trait.
Header file for the SubmatrixExprTrait class template.
#define BLAZE_CONSTRAINT_MUST_BE_ROW_MAJOR_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is not a row-major dense or sparse matrix t...
Definition: RowMajorMatrix.h:61
Header file for the HasSIMDMult type trait.
Header file for run time assertion macros.
Compile time check for column-major matrix types.This type trait tests whether or not the given templ...
Definition: IsColumnMajorMatrix.h:83
Utility type for generic codes.
ElementType_< RT1 > ET1
Element type of the left-hand side dense matrix expression.
Definition: TDMatTSMatMultExpr.h:137
If_< IsExpression< MT2 >, const MT2, const MT2 & > RightOperand
Composite type of the right-hand side sparse matrix expression.
Definition: TDMatTSMatMultExpr.h:231
typename If< T1, T2, T3 >::Type If_
Auxiliary alias declaration for the If class template.The If_ alias declaration provides a convenient...
Definition: If.h:160
RightOperand rightOperand() const noexcept
Returns the right-hand side transpose sparse matrix operand.
Definition: TDMatTSMatMultExpr.h:372
ElementType_< RT2 > ET2
Element type of the right-hand side sparse matrix expression.
Definition: TDMatTSMatMultExpr.h:138
Header file for the reset shim.
Header file for the isDefault shim.
Constraints on the storage order of matrix types.
IntegralConstant< bool, B > BoolConstant
Generic wrapper for a compile time constant boolean value.The BoolConstant class template represents ...
Definition: IntegralConstant.h:100
Header file for the RemoveReference type trait.
typename EnableIf< Condition, T >::Type EnableIf_
Auxiliary alias declaration for the EnableIf class template.The EnableIf_ alias declaration provides ...
Definition: EnableIf.h:223
typename T::OppositeType OppositeType_
Alias declaration for nested OppositeType type definitions.The OppositeType_ alias declaration provid...
Definition: Aliases.h:243
#define BLAZE_CONSTRAINT_MATRICES_MUST_HAVE_SAME_STORAGE_ORDER(T1, T2)
Constraint on the data type.In case either of the two given data types T1 or T2 is not a matrix type ...
Definition: StorageOrder.h:84
Header file for the IsDenseVector type trait.
IfTrue_< evaluateRight, const RT2, CT2 > RT
Type for the assignment of the right-hand side sparse matrix operand.
Definition: TDMatTSMatMultExpr.h:237
Compile time check for strictly lower triangular matrices.This type trait tests whether or not the gi...
Definition: IsStrictlyLower.h:86
typename T::ConstIterator ConstIterator_
Alias declaration for nested ConstIterator type definitions.The ConstIterator_ alias declaration prov...
Definition: Aliases.h:103
Header file for the AreSIMDCombinable type trait.
LeftOperand leftOperand() const noexcept
Returns the left-hand side transpose dense matrix operand.
Definition: TDMatTSMatMultExpr.h:362
Header file for the IsComputation type trait class.
Compile time logical or evaluation.The Or class template performs at compile time a logical or ('&&')...
Definition: Or.h:101
TDMatTSMatMultExpr(const MT1 &lhs, const MT2 &rhs) noexcept
Constructor for the TDMatTSMatMultExpr class.
Definition: TDMatTSMatMultExpr.h:263
Header file for the TDMatDVecMultExprTrait class template.
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: TDMatTSMatMultExpr.h:278
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:157
If_< IsExpression< MT1 >, const MT1, const MT1 & > LeftOperand
Composite type of the left-hand side dense matrix expression.
Definition: TDMatTSMatMultExpr.h:228
Header file for the IntegralConstant class template.
ElementType_< ResultType > ElementType
Resulting element type.
Definition: TDMatTSMatMultExpr.h:222
typename T::TransposeType TransposeType_
Alias declaration for nested TransposeType type definitions.The TransposeType_ alias declaration prov...
Definition: Aliases.h:403
Header file for the IsUpper type trait.
Header file for the IsColumnVector type trait.
Constraint on the data type.
TransposeType_< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: TDMatTSMatMultExpr.h:221
RightOperand rhs_
Right-hand side sparse matrix of the multiplication expression.
Definition: TDMatTSMatMultExpr.h:424
Header file for the IsResizable type trait.
SIMDTrait_< ElementType > SIMDType
Resulting SIMD element type.
Definition: TDMatTSMatMultExpr.h:223
Header file for the thresholds for matrix/vector and matrix/matrix multiplications.
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression, the program execution is terminated. The BLAZE_INTERNAL_ASSERT macro can be disabled by setting the BLAZE_USER_ASSERTION flag to zero or by defining NDEBUG during the compilation.
Definition: Assert.h:101
Header file for the TDVecTDMatMultExprTrait class template.
bool isAligned() const noexcept
Returns whether the operands of the expression are properly aligned in memory.
Definition: TDMatTSMatMultExpr.h:406
size_t columns() const noexcept
Returns the current number of columns of the matrix.
Definition: TDMatTSMatMultExpr.h:352
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is not a sparse, N-dimensional matrix type...
Definition: SparseMatrix.h:61
Header file for the IsExpression type trait class.
Header file for the TSMatSVecMultExprTrait class template.
Header file for the FunctionTrace class.