35 #ifndef _BLAZE_MATH_EXPRESSIONS_TDMATTSMATMULTEXPR_H_ 36 #define _BLAZE_MATH_EXPRESSIONS_TDMATTSMATMULTEXPR_H_ 141 template<
typename MT1
147 class TDMatTSMatMultExpr :
public DenseMatrix< TDMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF>, true >
148 ,
private MatMatMultExpr
149 ,
private Computation
174 SYM = ( SF && !( HF || LF || UF ) ),
175 HERM = ( HF && !( LF || UF ) ),
176 LOW = ( LF || ( ( SF || HF ) && UF ) ),
177 UPP = ( UF || ( ( SF || HF ) && LF ) )
187 template<
typename T1,
typename T2,
typename T3 >
188 struct IsEvaluationRequired {
189 enum :
bool { value = ( evaluateLeft || evaluateRight ) };
199 template<
typename T1,
typename T2,
typename T3 >
200 struct UseVectorizedKernel {
203 T1::simdEnabled && T2::simdEnabled &&
220 template<
typename T1,
typename T2,
typename T3 >
221 struct UseOptimizedKernel {
223 !UseVectorizedKernel<T1,T2,T3>::value &&
236 template<
typename T1,
typename T2,
typename T3 >
237 struct UseDefaultKernel {
238 enum :
bool { value = !UseVectorizedKernel<T1,T2,T3>::value &&
239 !UseOptimizedKernel<T1,T2,T3>::value };
259 ,
Noop > > > > ForwardFunctor;
297 enum :
bool { smpAssignable = !evaluateLeft && MT1::smpAssignable &&
298 !evaluateRight && MT2::smpAssignable };
353 :(
lhs_.columns() ) ) );
357 const size_t n(
end - begin );
375 inline ReturnType
at(
size_t i,
size_t j )
const {
376 if( i >=
lhs_.rows() ) {
379 if( j >=
rhs_.columns() ) {
391 inline size_t rows() const noexcept {
402 return rhs_.columns();
432 template<
typename T >
433 inline bool canAlias(
const T* alias )
const noexcept {
434 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
444 template<
typename T >
445 inline bool isAliased(
const T* alias )
const noexcept {
446 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
456 return lhs_.isAligned();
489 template<
typename MT
498 LT A(
serial( rhs.lhs_ ) );
499 RT B(
serial( rhs.rhs_ ) );
508 TDMatTSMatMultExpr::selectAssignKernel( ~lhs, A, B );
527 template<
typename MT3
531 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
539 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
541 const size_t itmp(
min( ii+block, A.rows() ) );
543 for(
size_t j=0UL; j<B.columns(); ++j )
545 ConstIterator element( B.begin(j) );
546 const ConstIterator
end( B.end(j) );
548 for( ; element!=
end; ++element )
550 const size_t j1( element->index() );
554 C(j1,j) = A(j1,j1) * element->value();
562 :( LOW ?
max(j,ii) : ii ) );
564 ?( ( SYM || HERM || UPP )
567 :( SYM || HERM || UPP ?
min(j+1UL,itmp) : itmp ) );
574 for(
size_t i=ibegin; i<iend; ++i ) {
576 C(i,j) = A(i,j1) * element->value();
578 C(i,j) += A(i,j1) * element->value();
586 for(
size_t j=0UL; j<B.columns(); ++j ) {
587 for(
size_t i=j+1UL; i<A.rows(); ++i ) {
588 C(i,j) = HERM ?
conj( C(j,i) ) : C(j,i);
610 template<
typename MT3
614 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
622 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
624 const size_t itmp(
min( ii+block, A.rows() ) );
626 for(
size_t j=0UL; j<B.columns(); ++j )
628 const ConstIterator
end( B.end(j) );
629 ConstIterator element( B.begin(j) );
631 const size_t nonzeros( B.nonZeros(j) );
632 const size_t kpos( nonzeros &
size_t(-4) );
635 for(
size_t k=0UL; k<kpos; k+=4UL )
637 const size_t j1( element->index() );
638 const ET2 v1( element->value() );
640 const size_t j2( element->index() );
641 const ET2 v2( element->value() );
643 const size_t j3( element->index() );
644 const ET2 v3( element->value() );
646 const size_t j4( element->index() );
647 const ET2 v4( element->value() );
656 :( LOW ?
max(j,ii) : ii ) );
658 ?( ( SYM || HERM || UPP )
661 :( SYM || HERM || UPP ?
min(j+1UL,itmp) : itmp ) );
668 const size_t inum( iend - ibegin );
669 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
672 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
673 C(i ,j) += A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
674 C(i+1UL,j) += A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
675 C(i+2UL,j) += A(i+2UL,j1) * v1 + A(i+2UL,j2) * v2 + A(i+2UL,j3) * v3 + A(i+2UL,j4) * v4;
676 C(i+3UL,j) += A(i+3UL,j1) * v1 + A(i+3UL,j2) * v2 + A(i+3UL,j3) * v3 + A(i+3UL,j4) * v4;
678 for(
size_t i=ipos; i<iend; ++i ) {
679 C(i,j) += A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
683 for( ; element!=
end; ++element )
685 const size_t j1( element->index() );
686 const ET2 v1( element->value() );
692 :( LOW ?
max(j,ii) : ii ) );
694 ?( ( SYM || HERM || UPP )
697 :( SYM || HERM || UPP ?
min(j+1UL,itmp) : itmp ) );
704 const size_t inum( iend - ibegin );
705 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
708 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
709 C(i ,j) += A(i ,j1) * v1;
710 C(i+1UL,j) += A(i+1UL,j1) * v1;
711 C(i+2UL,j) += A(i+2UL,j1) * v1;
712 C(i+3UL,j) += A(i+3UL,j1) * v1;
714 for(
size_t i=ipos; i<iend; ++i ) {
715 C(i,j) += A(i,j1) * v1;
722 for(
size_t j=0UL; j<B.columns(); ++j ) {
723 for(
size_t i=j+1UL; i<A.rows(); ++i ) {
724 C(i,j) = HERM ?
conj( C(j,i) ) : C(j,i);
746 template<
typename MT3
750 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
758 for(
size_t j=0UL; j<B.columns(); ++j )
760 const ConstIterator
end( B.end(j) );
761 ConstIterator element( B.begin(j) );
763 const size_t nonzeros( B.nonZeros(j) );
764 const size_t kpos( nonzeros &
size_t(-4) );
767 for(
size_t k=0UL; k<kpos; k+=4UL )
769 const size_t j1( element->index() );
770 const ET2 v1( element->value() );
772 const size_t j2( element->index() );
773 const ET2 v2( element->value() );
775 const size_t j3( element->index() );
776 const ET2 v3( element->value() );
778 const size_t j4( element->index() );
779 const ET2 v4( element->value() );
784 const SIMDType xmm1(
set( v1 ) );
785 const SIMDType xmm2(
set( v2 ) );
786 const SIMDType xmm3(
set( v3 ) );
787 const SIMDType xmm4(
set( v4 ) );
791 ?( ( LOW ?
max(j,j1+1UL) : j1+1UL ) &
size_t(-SIMDSIZE) )
792 :( ( LOW ?
max(j,j1) : j1 ) &
size_t(-SIMDSIZE) ) )
793 :( LOW ? ( j &
size_t(-SIMDSIZE) ) : 0UL ) );
796 ?( SYM || HERM || UPP ?
max(j+1UL,j4) : j4 )
797 :( SYM || HERM || UPP ?
max(j,j4)+1UL : j4+1UL ) )
798 :( SYM || HERM || UPP ? j+1UL : A.rows() ) );
801 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
802 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
806 for( ; i<ipos; i+=SIMDSIZE ) {
807 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 );
809 for( ; remainder && i<iend; ++i ) {
810 C(i,j) += A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
814 for( ; element!=
end; ++element )
816 const size_t j1( element->index() );
817 const ET2 v1( element->value() );
819 const SIMDType xmm1(
set( v1 ) );
823 ?( ( LOW ?
max(j,j1+1UL) : j1+1UL ) &
size_t(-SIMDSIZE) )
824 :( ( LOW ?
max(j,j1) : j1 ) &
size_t(-SIMDSIZE) ) )
825 :( LOW ? ( j &
size_t(-SIMDSIZE) ) : 0UL ) );
828 ?( SYM || HERM || UPP ?
max(j+1UL,j1) : j1 )
829 :( SYM || HERM || UPP ?
max(j,j1)+1UL : j1+1UL ) )
830 :( SYM || HERM || UPP ? j+1UL : A.rows() ) );
833 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
834 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
838 for( ; i<ipos; i+=SIMDSIZE ) {
839 C.store( i, j, C.load(i,j) + A.load(i,j1) * xmm1 );
841 for( ; remainder && i<iend; ++i ) {
842 C(i,j) += A(i,j1) * v1;
848 for(
size_t j=0UL; j<B.columns(); ++j ) {
849 for(
size_t i=j+1UL; i<A.rows(); ++i ) {
850 C(i,j) = HERM ?
conj( C(j,i) ) : C(j,i);
871 template<
typename MT
889 const ForwardFunctor fwd;
891 const TmpType tmp(
serial( rhs ) );
892 assign( ~lhs, fwd( tmp ) );
910 template<
typename MT
919 LT A(
serial( rhs.lhs_ ) );
920 RT B(
serial( rhs.rhs_ ) );
929 TDMatTSMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
948 template<
typename MT3
952 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
958 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
960 const size_t itmp(
min( ii+block, A.rows() ) );
962 for(
size_t j=0UL; j<B.columns(); ++j )
964 ConstIterator element( B.begin(j) );
965 const ConstIterator
end( B.end(j) );
967 for( ; element!=
end; ++element )
969 const size_t j1( element->index() );
973 C(j1,j) += A(j1,j1) * element->value();
981 :( LOW ?
max(j,ii) : ii ) );
986 :( UPP ?
min(j+1UL,itmp) : itmp ) );
993 const size_t inum( iend - ibegin );
994 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
997 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
998 C(i ,j) += A(i ,j1) * element->value();
999 C(i+1UL,j) += A(i+1UL,j1) * element->value();
1000 C(i+2UL,j) += A(i+2UL,j1) * element->value();
1001 C(i+3UL,j) += A(i+3UL,j1) * element->value();
1003 for(
size_t i=ipos; i<iend; ++i ) {
1004 C(i,j) += A(i,j1) * element->value();
1028 template<
typename MT3
1032 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
1038 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
1040 const size_t itmp(
min( ii+block, A.rows() ) );
1042 for(
size_t j=0UL; j<B.columns(); ++j )
1044 const ConstIterator
end( B.end(j) );
1045 ConstIterator element( B.begin(j) );
1047 const size_t nonzeros( B.nonZeros(j) );
1048 const size_t kpos( nonzeros &
size_t(-4) );
1051 for(
size_t k=0UL; k<kpos; k+=4UL )
1053 const size_t j1( element->index() );
1054 const ET2 v1( element->value() );
1056 const size_t j2( element->index() );
1057 const ET2 v2( element->value() );
1059 const size_t j3( element->index() );
1060 const ET2 v3( element->value() );
1062 const size_t j4( element->index() );
1063 const ET2 v4( element->value() );
1072 :( LOW ?
max(j,ii) : ii ) );
1077 :( UPP ?
min(j+1UL,itmp) : itmp ) );
1084 const size_t inum( iend - ibegin );
1085 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
1088 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
1089 C(i ,j) += A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
1090 C(i+1UL,j) += A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
1091 C(i+2UL,j) += A(i+2UL,j1) * v1 + A(i+2UL,j2) * v2 + A(i+2UL,j3) * v3 + A(i+2UL,j4) * v4;
1092 C(i+3UL,j) += A(i+3UL,j1) * v1 + A(i+3UL,j2) * v2 + A(i+3UL,j3) * v3 + A(i+3UL,j4) * v4;
1094 for(
size_t i=ipos; i<iend; ++i ) {
1095 C(i,j) += A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
1099 for( ; element!=
end; ++element )
1101 const size_t j1( element->index() );
1102 const ET2 v1( element->value() );
1108 :( LOW ?
max(j,ii) : ii ) );
1113 :( UPP ?
min(j+1UL,itmp) : itmp ) );
1120 const size_t inum( iend - ibegin );
1121 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
1124 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
1125 C(i ,j) += A(i ,j1) * v1;
1126 C(i+1UL,j) += A(i+1UL,j1) * v1;
1127 C(i+2UL,j) += A(i+2UL,j1) * v1;
1128 C(i+3UL,j) += A(i+3UL,j1) * v1;
1130 for(
size_t i=ipos; i<iend; ++i ) {
1131 C(i,j) += A(i,j1) * v1;
1154 template<
typename MT3
1158 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
1164 for(
size_t j=0UL; j<B.columns(); ++j )
1166 const ConstIterator
end( B.end(j) );
1167 ConstIterator element( B.begin(j) );
1169 const size_t nonzeros( B.nonZeros(j) );
1170 const size_t kpos( nonzeros &
size_t(-4) );
1173 for(
size_t k=0UL; k<kpos; k+=4UL )
1175 const size_t j1( element->index() );
1176 const ET2 v1( element->value() );
1178 const size_t j2( element->index() );
1179 const ET2 v2( element->value() );
1181 const size_t j3( element->index() );
1182 const ET2 v3( element->value() );
1184 const size_t j4( element->index() );
1185 const ET2 v4( element->value() );
1190 const SIMDType xmm1(
set( v1 ) );
1191 const SIMDType xmm2(
set( v2 ) );
1192 const SIMDType xmm3(
set( v3 ) );
1193 const SIMDType xmm4(
set( v4 ) );
1197 ?( ( LOW ?
max(j,j1+1UL) : j1+1UL ) &
size_t(-SIMDSIZE) )
1198 :( ( LOW ?
max(j,j1) : j1 ) &
size_t(-SIMDSIZE) ) )
1199 :( LOW ? ( j &
size_t(-SIMDSIZE) ) : 0UL ) );
1202 ?( UPP ?
max(j+1UL,j4) : j4 )
1203 :( UPP ?
max(j,j4)+1UL : j4+1UL ) )
1204 :( UPP ? j+1UL : A.rows() ) );
1207 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
1208 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
1212 for( ; i<ipos; i+=SIMDSIZE ) {
1213 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 );
1215 for( ; remainder && i<iend; ++i ) {
1216 C(i,j) += A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
1220 for( ; element!=
end; ++element )
1222 const size_t j1( element->index() );
1223 const ET2 v1( element->value() );
1225 const SIMDType xmm1(
set( v1 ) );
1229 ?( ( LOW ?
max(j,j1+1UL) : j1+1UL ) &
size_t(-SIMDSIZE) )
1230 :( ( LOW ?
max(j,j1) : j1 ) &
size_t(-SIMDSIZE) ) )
1231 :( LOW ? ( j &
size_t(-SIMDSIZE) ) : 0UL ) );
1234 ?( UPP ?
max(j+1UL,j1) : j1 )
1235 :( UPP ?
max(j,j1)+1UL : j1+1UL ) )
1236 :( UPP ? j+1UL : A.rows() ) );
1239 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
1240 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
1244 for( ; i<ipos; i+=SIMDSIZE ) {
1245 C.store( i, j, C.load(i,j) + A.load(i,j1) * xmm1 );
1247 for( ; remainder && i<iend; ++i ) {
1248 C(i,j) += A(i,j1) * v1;
1273 template<
typename MT
1282 LT A(
serial( rhs.lhs_ ) );
1283 RT B(
serial( rhs.rhs_ ) );
1292 TDMatTSMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
1311 template<
typename MT3
1315 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
1321 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
1323 const size_t itmp(
min( ii+block, A.rows() ) );
1325 for(
size_t j=0UL; j<B.columns(); ++j )
1327 ConstIterator element( B.begin(j) );
1328 const ConstIterator
end( B.end(j) );
1330 for( ; element!=
end; ++element )
1332 const size_t j1( element->index() );
1336 C(j1,j) -= A(j1,j1) * element->value();
1344 :( LOW ?
max(j,ii) : ii ) );
1349 :( UPP ?
min(j+1UL,itmp) : itmp ) );
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) * element->value();
1362 C(i+1UL,j) -= A(i+1UL,j1) * element->value();
1363 C(i+2UL,j) -= A(i+2UL,j1) * element->value();
1364 C(i+3UL,j) -= A(i+3UL,j1) * element->value();
1366 for(
size_t i=ipos; i<iend; ++i ) {
1367 C(i,j) -= A(i,j1) * element->value();
1391 template<
typename MT3
1395 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
1401 for(
size_t ii=0UL; ii<A.rows(); ii+=block )
1403 const size_t itmp(
min( ii+block, A.rows() ) );
1405 for(
size_t j=0UL; j<B.columns(); ++j )
1407 const ConstIterator
end( B.end(j) );
1408 ConstIterator element( B.begin(j) );
1410 const size_t nonzeros( B.nonZeros(j) );
1411 const size_t kpos( nonzeros &
size_t(-4) );
1414 for(
size_t k=0UL; k<kpos; k+=4UL )
1416 const size_t j1( element->index() );
1417 const ET2 v1( element->value() );
1419 const size_t j2( element->index() );
1420 const ET2 v2( element->value() );
1422 const size_t j3( element->index() );
1423 const ET2 v3( element->value() );
1425 const size_t j4( element->index() );
1426 const ET2 v4( element->value() );
1435 :( LOW ?
max(j,ii) : ii ) );
1440 :( UPP ?
min(j+1UL,itmp) : itmp ) );
1447 const size_t inum( iend - ibegin );
1448 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
1451 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
1452 C(i ,j) -= A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
1453 C(i+1UL,j) -= A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
1454 C(i+2UL,j) -= A(i+2UL,j1) * v1 + A(i+2UL,j2) * v2 + A(i+2UL,j3) * v3 + A(i+2UL,j4) * v4;
1455 C(i+3UL,j) -= A(i+3UL,j1) * v1 + A(i+3UL,j2) * v2 + A(i+3UL,j3) * v3 + A(i+3UL,j4) * v4;
1457 for(
size_t i=ipos; i<iend; ++i ) {
1458 C(i,j) -= A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
1462 for( ; element!=
end; ++element )
1464 const size_t j1( element->index() );
1465 const ET2 v1( element->value() );
1471 :( LOW ?
max(j,ii) : ii ) );
1476 :( UPP ?
min(j+1UL,itmp) : itmp ) );
1483 const size_t inum( iend - ibegin );
1484 const size_t ipos( ibegin + ( inum &
size_t(-4) ) );
1487 for(
size_t i=ibegin; i<ipos; i+=4UL ) {
1488 C(i ,j) -= A(i ,j1) * v1;
1489 C(i+1UL,j) -= A(i+1UL,j1) * v1;
1490 C(i+2UL,j) -= A(i+2UL,j1) * v1;
1491 C(i+3UL,j) -= A(i+3UL,j1) * v1;
1493 for(
size_t i=ipos; i<iend; ++i ) {
1494 C(i,j) -= A(i,j1) * v1;
1517 template<
typename MT3
1521 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
1527 for(
size_t j=0UL; j<B.columns(); ++j )
1529 const ConstIterator
end( B.end(j) );
1530 ConstIterator element( B.begin(j) );
1532 const size_t nonzeros( B.nonZeros(j) );
1533 const size_t kpos( nonzeros &
size_t(-4) );
1536 for(
size_t k=0UL; k<kpos; k+=4UL )
1538 const size_t j1( element->index() );
1539 const ET2 v1( element->value() );
1541 const size_t j2( element->index() );
1542 const ET2 v2( element->value() );
1544 const size_t j3( element->index() );
1545 const ET2 v3( element->value() );
1547 const size_t j4( element->index() );
1548 const ET2 v4( element->value() );
1553 const SIMDType xmm1(
set( v1 ) );
1554 const SIMDType xmm2(
set( v2 ) );
1555 const SIMDType xmm3(
set( v3 ) );
1556 const SIMDType xmm4(
set( v4 ) );
1560 ?( ( LOW ?
max(j,j1+1UL) : j1+1UL ) &
size_t(-SIMDSIZE) )
1561 :( ( LOW ?
max(j,j1) : j1 ) &
size_t(-SIMDSIZE) ) )
1562 :( LOW ? ( j &
size_t(-SIMDSIZE) ) : 0UL ) );
1565 ?( UPP ?
max(j+1UL,j4) : j4 )
1566 :( UPP ?
max(j,j4)+1UL : j4+1UL ) )
1567 :( UPP ? j+1UL : A.rows() ) );
1570 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
1571 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
1575 for( ; i<ipos; i+=SIMDSIZE ) {
1576 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 );
1578 for( ; remainder && i<iend; ++i ) {
1579 C(i,j) -= A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
1583 for( ; element!=
end; ++element )
1585 const size_t j1( element->index() );
1586 const ET2 v1( element->value() );
1588 const SIMDType xmm1(
set( v1 ) );
1592 ?( ( LOW ?
max(j,j1+1UL) : j1+1UL ) &
size_t(-SIMDSIZE) )
1593 :( ( LOW ?
max(j,j1) : j1 ) &
size_t(-SIMDSIZE) ) )
1594 :( LOW ? ( j &
size_t(-SIMDSIZE) ) : 0UL ) );
1597 ?( UPP ?
max(j+1UL,j1) : j1 )
1598 :( UPP ?
max(j,j1)+1UL : j1+1UL ) )
1599 :( UPP ? j+1UL : A.rows() ) );
1602 const size_t ipos( remainder ? ( iend &
size_t(-SIMDSIZE) ) : iend );
1603 BLAZE_INTERNAL_ASSERT( !remainder || ( iend - ( iend % (SIMDSIZE) ) ) == ipos,
"Invalid end calculation" );
1607 for( ; i<ipos; i+=SIMDSIZE ) {
1608 C.store( i, j, C.load(i,j) - A.load(i,j1) * xmm1 );
1610 for( ; remainder && i<iend; ++i ) {
1611 C(i,j) -= A(i,j1) * v1;
1646 template<
typename MT
1686 template<
typename MT
1705 const ForwardFunctor fwd;
1707 const TmpType tmp( rhs );
1728 template<
typename MT
1772 template<
typename MT
1859 template<
typename T1
1907 template<
typename MT1
1952 template<
typename MT1
1997 template<
typename MT1
2042 template<
typename MT1
2087 template<
typename MT1
2118 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2119 struct Rows< TDMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> > :
public Rows<MT1>
2135 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2136 struct Columns< TDMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> > :
public Columns<MT2>
2152 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2153 struct IsAligned< TDMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2170 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2171 struct IsSymmetric< TDMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2174 , IsBuiltin< ElementType_< TDMatTSMatMultExpr<MT1,MT2,false,true,false,false> > > >
2175 , And< Bool<LF>, Bool<UF> > >::value >
2191 template<
typename MT1,
typename MT2,
bool SF,
bool LF,
bool UF >
2192 struct IsHermitian< TDMatTSMatMultExpr<MT1,MT2,SF,true,LF,UF> >
2209 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2210 struct IsLower< TDMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2212 , And< IsLower<MT1>, IsLower<MT2> >
2213 , And< Or< Bool<SF>, Bool<HF> >
2214 , IsUpper<MT1>, IsUpper<MT2> > >::value >
2230 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2231 struct IsUniLower< TDMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2232 :
public BoolConstant< Or< And< IsUniLower<MT1>, IsUniLower<MT2> >
2233 , And< Or< Bool<SF>, Bool<HF> >
2234 , IsUniUpper<MT1>, IsUniUpper<MT2> > >::value >
2250 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2252 :
public BoolConstant< Or< And< IsStrictlyLower<MT1>, IsLower<MT2> >
2253 , And< IsStrictlyLower<MT2>, IsLower<MT1> >
2254 , And< Or< Bool<SF>, Bool<HF> >
2255 , Or< And< IsStrictlyUpper<MT1>, IsUpper<MT2> >
2256 , And< IsStrictlyUpper<MT2>, IsUpper<MT1> > > > >::value >
2272 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2273 struct IsUpper< TDMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2275 , And< IsUpper<MT1>, IsUpper<MT2> >
2276 , And< Or< Bool<SF>, Bool<HF> >
2277 , IsLower<MT1>, IsLower<MT2> > >::value >
2293 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2294 struct IsUniUpper< TDMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2295 :
public BoolConstant< Or< And< IsUniUpper<MT1>, IsUniUpper<MT2> >
2296 , And< Or< Bool<SF>, Bool<HF> >
2297 , IsUniLower<MT1>, IsUniLower<MT2> > >::value >
2313 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2315 :
public BoolConstant< Or< And< IsStrictlyUpper<MT1>, IsUpper<MT2> >
2316 , And< IsStrictlyUpper<MT2>, IsUpper<MT1> >
2317 , And< Or< Bool<SF>, Bool<HF> >
2318 , Or< And< IsStrictlyLower<MT1>, IsLower<MT2> >
2319 , And< IsStrictlyLower<MT2>, IsLower<MT1> > > > >::value >
2335 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF,
typename VT >
2353 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF,
typename VT >
2371 template<
typename VT,
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2389 template<
typename VT,
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2407 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2424 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2441 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2458 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2475 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2492 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF,
bool AF >
2507 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2508 struct RowExprTrait< TDMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2521 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
typename SubmatrixExprTrait< MT, AF >::Type SubmatrixExprTrait_
Auxiliary alias declaration for the SubmatrixExprTrait type trait.The SubmatrixExprTrait_ alias decla...
Definition: SubmatrixExprTrait.h:134
#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
Evaluation of the expression type of a dense matrix declherm operation.Via this type trait it is poss...
Definition: TDMatDeclHermExprTrait.h:75
ElementType_< RT1 > ET1
Element type of the left-hand side dense matrix expression.
Definition: TDMatTSMatMultExpr.h:155
Compile time check for row vector types.This type trait tests whether or not the given template argum...
Definition: IsRowVector.h:80
const DMatForEachExpr< MT, Conj, SO > conj(const DenseMatrix< MT, SO > &dm)
Returns a matrix containing the complex conjugate of each single element of dm.
Definition: DMatForEachExpr.h:1214
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
Evaluation of the expression type of a dense matrix decllow operation.Via this type trait it is possi...
Definition: TDMatDeclLowExprTrait.h:75
RightOperand rhs_
Right-hand side sparse matrix of the multiplication expression.
Definition: TDMatTSMatMultExpr.h:473
Header file for mathematical functions.
RightOperand rightOperand() const noexcept
Returns the right-hand side transpose sparse matrix operand.
Definition: TDMatTSMatMultExpr.h:421
constexpr bool useOptimizedKernels
Configuration switch for optimized kernels.This configuration switch enables/disables all optimized c...
Definition: Optimizations.h:84
If_< IsExpression< MT1 >, const MT1, const MT1 &> LeftOperand
Composite type of the left-hand side dense matrix expression.
Definition: TDMatTSMatMultExpr.h:277
ElementType_< ResultType > ElementType
Resulting element type.
Definition: TDMatTSMatMultExpr.h:271
MultTrait_< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: TDMatTSMatMultExpr.h:268
Header file for the Rows type trait.
Header file for the IsUniUpper type trait.
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.
Flag for symmetric matrices.
Definition: TDMatTSMatMultExpr.h:174
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:145
LeftOperand leftOperand() const noexcept
Returns the left-hand side transpose dense matrix operand.
Definition: TDMatTSMatMultExpr.h:411
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.
Header file for the IsDiagonal type trait.
Generic wrapper for a compile time constant integral value.The IntegralConstant class template repres...
Definition: IntegralConstant.h:71
#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.
Header file for the DeclUpp functor.
const ElementType ReturnType
Return type for expression template evaluations.
Definition: TDMatTSMatMultExpr.h:273
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:194
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
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: TDMatTSMatMultExpr.h:445
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.
TransposeType_< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: TDMatTSMatMultExpr.h:270
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:1755
Compile time check for lower triangular matrices.This type trait tests whether or not the given templ...
Definition: IsLower.h:88
Availability of a SIMD addition for the given data types.Depending on the available instruction set (...
Definition: HasSIMDAdd.h:163
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: TDMatTSMatMultExpr.h:433
const DMatSerialExpr< MT, SO > serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:721
Evaluation of the expression type of a sparse vector/transpose dense matrix multiplication.Via this type trait it is possible to evaluate the resulting expression type of a sparse vector/transpose dense matrix multiplication. Given the transpose sparse vector type VT and the column-major dense matrix type MT, the nested type Type corresponds to the resulting expression type. In case either VT is not a transpose sparse vector type or MT is not a column-major dense matrix type, the resulting data type Type is set to INVALID_TYPE.
Definition: TSVecTDMatMultExprTrait.h:81
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.
DisableIf_< IsSymmetric< MT >, const DMatDeclSymExpr< MT, SO > > declsym(const DenseMatrix< MT, SO > &dm)
Declares the given non-symmetric dense matrix expression dm as symmetric.
Definition: DMatDeclSymExpr.h:841
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 TDMatDeclDiagExprTrait class template.
Header file for the RequiresEvaluation type trait.
System settings for performance optimizations.
Compile time check for data types.This type trait tests whether or not the given types can be combine...
Definition: IsSIMDCombinable.h:120
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:1802
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
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:71
Base class for sparse matrices.The SparseMatrix class is a base class for all sparse matrix classes...
Definition: Forward.h:119
If_< IsExpression< MT2 >, const MT2, const MT2 &> RightOperand
Composite type of the right-hand side sparse matrix expression.
Definition: TDMatTSMatMultExpr.h:280
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
Compile time check for the alignment of data types.This type trait tests whether the given data type ...
Definition: IsAligned.h:87
Constraint on the data type.
Constraint on the data type.
typename MultExprTrait< T1, T2 >::Type MultExprTrait_
Auxiliary alias declaration for the MultExprTrait class template.The MultExprTrait_ alias declaration...
Definition: MultExprTrait.h:344
Header file for the MultExprTrait class template.
DisableIf_< IsHermitian< MT >, const DMatDeclHermExpr< MT, SO > > declherm(const DenseMatrix< MT, SO > &dm)
Declares the given non-Hermitian dense matrix expression dm as Hermitian.
Definition: DMatDeclHermExpr.h:841
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
typename T::CompositeType CompositeType_
Alias declaration for nested CompositeType type definitions.The CompositeType_ alias declaration prov...
Definition: Aliases.h:83
Compile time check for upper unitriangular matrices.This type trait tests whether or not the given te...
Definition: IsUniUpper.h:86
IfTrue_< evaluateLeft, const RT1, CT1 > LT
Type for the assignment of the left-hand side dense matrix operand.
Definition: TDMatTSMatMultExpr.h:283
size_t columns() const noexcept
Returns the current number of columns of the matrix.
Definition: TDMatTSMatMultExpr.h:401
Compile time check for dense vector types.This type trait tests whether or not the given template par...
Definition: IsDenseVector.h:78
Header file for the multiplication trait.
Header file for the IsStrictlyUpper type trait.
size_t rows() const noexcept
Returns the current number of rows of the matrix.
Definition: TDMatTSMatMultExpr.h:391
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
Header file for the DeclLow functor.
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.
OppositeType_< ResultType > OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: TDMatTSMatMultExpr.h:269
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2939
TDMatTSMatMultExpr(const MT1 &lhs, const MT2 &rhs) noexcept
Constructor for the TDMatTSMatMultExpr class.
Definition: TDMatTSMatMultExpr.h:312
Evaluation of the expression type of a dense matrix declupp operation.Via this type trait it is possi...
Definition: TDMatDeclUppExprTrait.h:75
Generic wrapper for the decllow() function.
Definition: DeclLow.h:58
Compile time check for data types with padding.This type trait tests whether the given data type empl...
Definition: IsPadded.h:76
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.
Header file for the TDMatDeclHermExprTrait 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.
Header file for the TDMatDeclUppExprTrait 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.
Evaluation of the expression type of a dense matrix decldiag operation.Via this type trait it is poss...
Definition: TDMatDeclDiagExprTrait.h:75
Compile time check for sparse vector types.This type trait tests whether or not the given template pa...
Definition: IsSparseVector.h:78
Evaluation of the expression type type of a submatrix operation.Via this type trait it is possible to...
Definition: SubmatrixExprTrait.h:80
IfTrue_< evaluateRight, const RT2, CT2 > RT
Type for the assignment of the right-hand side sparse matrix operand.
Definition: TDMatTSMatMultExpr.h:286
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
DisableIf_< Or< IsComputation< MT >, IsTransExpr< MT >, IsDeclExpr< 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:128
#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
Generic wrapper for the null function.
Definition: Noop.h:58
Header file for the IsTriangular type trait.
Compile time check for column vector types.This type trait tests whether or not the given template ar...
Definition: IsColumnVector.h:80
Evaluation of the expression type of a dense matrix declsym operation.Via this type trait it is possi...
Definition: TDMatDeclSymExprTrait.h:75
Constraints on the storage order of matrix types.
Compile time check for symmetric matrices.This type trait tests whether or not the given template par...
Definition: IsSymmetric.h:85
Header file for the exception macros of the math module.
SIMDTrait_< ElementType > SIMDType
Resulting SIMD element type.
Definition: TDMatTSMatMultExpr.h:272
DisableIf_< IsLower< MT >, const DMatDeclLowExpr< MT, SO > > decllow(const DenseMatrix< MT, SO > &dm)
Declares the given non-lower dense matrix expression dm as lower.
Definition: DMatDeclLowExpr.h:842
Compile time check for strictly upper triangular matrices.This type trait tests whether or not the gi...
Definition: IsStrictlyUpper.h:86
Evaluation of the expression type type of a row operation.Via this type trait it is possible to evalu...
Definition: RowExprTrait.h:79
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:260
Header file for the DeclDiag functor.
Compile time check for dense matrix types.This type trait tests whether or not the given template par...
Definition: IsDenseMatrix.h:78
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: TDMatTSMatMultExpr.h:327
Header file for the RowExprTrait class template.
Header file for all forward declarations for expression class templates.
Header file for the IsDenseMatrix type trait.
DisableIf_< Or< IsComputation< MT >, IsTransExpr< MT >, IsDeclExpr< 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:128
Header file for the EnableIf class template.
Header file for the IsStrictlyLower type trait.
Flag for lower matrices.
Definition: TDMatTSMatMultExpr.h:176
#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
Compile time check for lower unitriangular matrices.This type trait tests whether or not the given te...
Definition: IsUniLower.h:86
Header file for the conjugate shim.
Compile time check for resizable data types.This type trait tests whether the given data type is a re...
Definition: IsResizable.h:75
Evaluation of the expression type of a transpose dense matrix/sparse vector multiplication.Via this type trait it is possible to evaluate the resulting expression type of a transpose dense matrix/sparse vector multiplication. Given the column-major dense matrix type MT and the non-transpose sparse vector type VT, the nested type Type corresponds to the resulting expression type. In case either MT is not a column-major dense matrix type or VT is not a non-transpose sparse vector type, the resulting data type Type is set to INVALID_TYPE.
Definition: TDMatSVecMultExprTrait.h:79
Header file for the IsSIMDCombinable type trait.
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_< RT2 > ET2
Element type of the right-hand side sparse matrix expression.
Definition: TDMatTSMatMultExpr.h:156
Header file for the TDMatDeclLowExprTrait class template.
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
TDMatTSMatMultExpr< MT1, MT2, SF, HF, LF, UF > This
Type of this TDMatTSMatMultExpr instance.
Definition: TDMatTSMatMultExpr.h:266
Header file for the reset shim.
SIMD characteristics of data types.The SIMDTrait class template provides the SIMD characteristics of ...
Definition: SIMDTrait.h:296
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:93
ResultType_< MT2 > RT2
Result type of the right-hand side sparse matrix expression.
Definition: TDMatTSMatMultExpr.h:154
ResultType_< MT1 > RT1
Result type of the left-hand side dense matrix expression.
Definition: TDMatTSMatMultExpr.h:153
Header file for the isDefault shim.
Compile time check for Hermitian matrices.This type trait tests whether or not the given template par...
Definition: IsHermitian.h:85
typename TDVecTSMatMultExprTrait< VT, MT >::Type TDVecTSMatMultExprTrait_
Auxiliary alias declaration for the TDVecTSMatMultExprTrait class template.The TDVecTSMatMultExprTrai...
Definition: TDVecTSMatMultExprTrait.h:120
Constraints on the storage order of matrix types.
Generic wrapper for the declherm() function.
Definition: DeclHerm.h:58
Header file for the TDMatDeclSymExprTrait class template.
Header file for the Noop functor.
Header file for the RemoveReference type trait.
typename TDMatDVecMultExprTrait< MT, VT >::Type TDMatDVecMultExprTrait_
Auxiliary alias declaration for the TDMatDVecMultExprTrait class template.The TDMatDVecMultExprTrait_...
Definition: TDMatDVecMultExprTrait.h:120
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.
Generic wrapper for the declupp() function.
Definition: DeclUpp.h:58
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
ReturnType at(size_t i, size_t j) const
Checked access to the matrix elements.
Definition: TDMatTSMatMultExpr.h:375
Evaluation of the expression type of a dense vector/transpose dense matrix multiplication.Via this type trait it is possible to evaluate the resulting expression type of a dense vector/transpose dense matrix multiplication. Given the transpose dense vector type VT and the column-major dense matrix type MT, the nested type Type corresponds to the resulting expression type. In case either VT is not a transpose dense vector type or MT is not a column-major dense matrix type, the resulting data type Type is set to INVALID_TYPE.
Definition: TDVecTDMatMultExprTrait.h:79
Header file for the IsComputation type trait class.
Header file for the IsBuiltin type trait.
const ResultType CompositeType
Data type for composite expression templates.
Definition: TDMatTSMatMultExpr.h:274
Compile time logical or evaluation.The Or class template performs at compile time a logical or ('&&')...
Definition: Or.h:101
Header file for the TDMatDVecMultExprTrait class template.
Evaluation of the expression type of a transpose dense matrix/dense vector multiplication.Via this type trait it is possible to evaluate the resulting expression type of a transpose dense matrix/dense vector multiplication. Given the column-major dense matrix type MT and the non-transpose dense vector type VT, the nested type Type corresponds to the resulting expression type. In case either MT is not a column-major dense matrix type or VT is not a non-transpose dense vector type, the resulting data type Type is set to INVALID_TYPE.
Definition: TDMatDVecMultExprTrait.h:79
CompositeType_< MT2 > CT2
Composite type of the right-hand side sparse matrix expression.
Definition: TDMatTSMatMultExpr.h:158
Header file for the IntegralConstant class template.
Compile time evaluation of the number of columns of a matrix.The Columns type trait evaluates the num...
Definition: Columns.h:76
Generic wrapper for the decldiag() function.
Definition: DeclDiag.h:58
LeftOperand lhs_
Left-hand side dense matrix of the multiplication expression.
Definition: TDMatTSMatMultExpr.h:472
Compile time evaluation of the number of rows of a matrix.The Rows type trait evaluates the number of...
Definition: Rows.h:76
Compile time check for sparse matrix types.This type trait tests whether or not the given template pa...
Definition: IsSparseMatrix.h:78
Header file for the DeclHerm functor.
bool canSMPAssign() const noexcept
Returns whether the expression can be used in SMP assignments.
Definition: TDMatTSMatMultExpr.h:465
bool isDefault(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is in default state.
Definition: DiagonalProxy.h:573
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.
CompositeType_< MT1 > CT1
Composite type of the left-hand side dense matrix expression.
Definition: TDMatTSMatMultExpr.h:157
Flag for upper matrices.
Definition: TDMatTSMatMultExpr.h:177
Constraint on the data type.
Generic wrapper for the declsym() function.
Definition: DeclSym.h:58
BLAZE_ALWAYS_INLINE bool isSquare(const Matrix< MT, SO > &matrix) noexcept
Checks if the given matrix is a square matrix.
Definition: Matrix.h:677
Header file for the IsResizable type trait.
const DMatDMatMultExpr< T1, T2, false, false, false, false > 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:7505
Header file for the thresholds for matrix/vector and matrix/matrix multiplications.
DisableIf_< IsDiagonal< MT >, const DMatDeclDiagExpr< MT, SO > > decldiag(const DenseMatrix< MT, SO > &dm)
Declares the given non-diagonal dense matrix expression dm as diagonal.
Definition: DMatDeclDiagExpr.h:841
DisableIf_< IsUpper< MT >, const DMatDeclUppExpr< MT, SO > > declupp(const DenseMatrix< MT, SO > &dm)
Declares the given non-upper dense matrix expression dm as upper.
Definition: DMatDeclUppExpr.h:842
Evaluation of the expression type type of a column operation.Via this type trait it is possible to ev...
Definition: ColumnExprTrait.h:78
#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 Bool class template.
Header file for the TDVecTDMatMultExprTrait class template.
Header file for the DeclSym functor.
#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.
bool isAligned() const noexcept
Returns whether the operands of the expression are properly aligned in memory.
Definition: TDMatTSMatMultExpr.h:455
Header file for the TSMatSVecMultExprTrait class template.
Header file for the function trace functionality.
Flag for Hermitian matrices.
Definition: TDMatTSMatMultExpr.h:175