35 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATTSMATMULTEXPR_H_ 36 #define _BLAZE_MATH_EXPRESSIONS_DMATTSMATMULTEXPR_H_ 116 template<
typename MT1
123 :
public MatMatMultExpr< DenseMatrix< DMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF>, false > >
149 SYM = ( SF && !( HF || LF || UF ) ),
150 HERM = ( HF && !( LF || UF ) ),
151 LOW = ( LF || ( ( SF || HF ) && UF ) ),
152 UPP = ( UF || ( ( SF || HF ) && LF ) )
163 template<
typename T1,
typename T2,
typename T3 >
164 struct CanExploitSymmetry {
176 template<
typename T1,
typename T2,
typename T3 >
177 struct IsEvaluationRequired {
178 enum :
bool { value = ( evaluateLeft || evaluateRight ) &&
179 !CanExploitSymmetry<T1,T2,T3>::value };
189 template<
typename T1,
typename T2,
typename T3 >
190 struct UseOptimizedKernel {
191 enum :
bool { value = useOptimizedKernels &&
245 enum :
bool { simdEnabled =
false };
248 enum :
bool { smpAssignable = !evaluateLeft && MT1::smpAssignable &&
249 !evaluateRight && MT2::smpAssignable };
299 :(
lhs_.columns() ) ) );
303 const size_t n(
end - begin );
323 if( i >=
lhs_.rows() ) {
326 if( j >=
rhs_.columns() ) {
338 inline size_t rows() const noexcept {
349 return rhs_.columns();
379 template<
typename T >
380 inline bool canAlias(
const T* alias )
const noexcept {
381 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
391 template<
typename T >
392 inline bool isAliased(
const T* alias )
const noexcept {
393 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
403 return lhs_.isAligned();
436 template<
typename MT
453 DMatTSMatMultExpr::selectAssignKernel( ~lhs, A, B );
472 template<
typename MT3
476 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
480 const size_t M( A.rows() );
481 const size_t N( B.columns() );
492 for( ; (i+4UL) <= M; i+=4UL ) {
493 for(
size_t j=( SYM || HERM || UPP ? i : 0UL ); j<( LOW ? i+4UL : N ); ++j )
502 if( element == end ) {
510 C(i ,j) = A(i ,element->index()) * element->value();
511 C(i+1UL,j) = A(i+1UL,element->index()) * element->value();
512 C(i+2UL,j) = A(i+2UL,element->index()) * element->value();
513 C(i+3UL,j) = A(i+3UL,element->index()) * element->value();
515 for( ; element!=
end; ++element ) {
516 C(i ,j) += A(i ,element->index()) * element->value();
517 C(i+1UL,j) += A(i+1UL,element->index()) * element->value();
518 C(i+2UL,j) += A(i+2UL,element->index()) * element->value();
519 C(i+3UL,j) += A(i+3UL,element->index()) * element->value();
524 for( ; (i+2UL) <= M; i+=2UL ) {
525 for(
size_t j=( SYM || HERM || UPP ? i : 0UL ); j<( LOW ? i+2UL : N ); ++j )
534 if( element == end ) {
540 C(i ,j) = A(i ,element->index()) * element->value();
541 C(i+1UL,j) = A(i+1UL,element->index()) * element->value();
543 for( ; element!=
end; ++element ) {
544 C(i ,j) += A(i ,element->index()) * element->value();
545 C(i+1UL,j) += A(i+1UL,element->index()) * element->value();
551 for(
size_t j=( SYM || HERM || UPP ? i : 0UL ); j<( LOW ? i+1UL : N ); ++j )
560 if( element == end ) {
565 C(i,j) = A(i,element->index()) * element->value();
567 for( ; element!=
end; ++element )
568 C(i,j) += A(i,element->index()) * element->value();
574 for(
size_t i=1UL; i<M; ++i ) {
575 for(
size_t j=0UL; j<i; ++j ) {
576 C(i,j) = HERM ?
conj( C(j,i) ) : C(j,i);
580 else if( LOW && !UPP ) {
581 for(
size_t j=1UL; j<N; ++j ) {
582 for(
size_t i=0UL; i<j; ++i ) {
587 else if( !LOW && UPP ) {
588 for(
size_t i=1UL; i<M; ++i ) {
589 for(
size_t j=0UL; j<i; ++j ) {
612 template<
typename MT3
616 selectAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
620 const size_t M( A.rows() );
621 const size_t N( B.columns() );
630 for( ; (i+4UL) <= M; i+=4UL ) {
631 for(
size_t j=( SYM || HERM || UPP ? i : 0UL ); j<( LOW ? i+4UL : N ); ++j )
640 const size_t nonzeros( end - element );
641 const size_t kpos( nonzeros &
size_t(-4) );
644 for(
size_t k=0UL; k<kpos; k+=4UL )
646 const size_t j1( element->index() );
647 const ET2 v1( element->value() );
649 const size_t j2( element->index() );
650 const ET2 v2( element->value() );
652 const size_t j3( element->index() );
653 const ET2 v3( element->value() );
655 const size_t j4( element->index() );
656 const ET2 v4( element->value() );
661 C(i ,j) += A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
662 C(i+1UL,j) += A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
663 C(i+2UL,j) += A(i+2UL,j1) * v1 + A(i+2UL,j2) * v2 + A(i+2UL,j3) * v3 + A(i+2UL,j4) * v4;
664 C(i+3UL,j) += A(i+3UL,j1) * v1 + A(i+3UL,j2) * v2 + A(i+3UL,j3) * v3 + A(i+3UL,j4) * v4;
667 for( ; element!=
end; ++element )
669 const size_t j1( element->index() );
670 const ET2 v1( element->value() );
672 C(i ,j) += A(i ,j1) * v1;
673 C(i+1UL,j) += A(i+1UL,j1) * v1;
674 C(i+2UL,j) += A(i+2UL,j1) * v1;
675 C(i+3UL,j) += A(i+3UL,j1) * v1;
680 for( ; (i+2UL) <= M; i+=2UL ) {
681 for(
size_t j=( SYM || HERM || UPP ? i : 0UL ); j<( LOW ? i+2UL : N ); ++j )
690 const size_t nonzeros( end - element );
691 const size_t kpos( nonzeros &
size_t(-4) );
694 for(
size_t k=0UL; k<kpos; k+=4UL )
696 const size_t j1( element->index() );
697 const ET2 v1( element->value() );
699 const size_t j2( element->index() );
700 const ET2 v2( element->value() );
702 const size_t j3( element->index() );
703 const ET2 v3( element->value() );
705 const size_t j4( element->index() );
706 const ET2 v4( element->value() );
711 C(i ,j) += A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
712 C(i+1UL,j) += A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
715 for( ; element!=
end; ++element )
717 const size_t j1( element->index() );
718 const ET2 v1( element->value() );
720 C(i ,j) += A(i ,j1) * v1;
721 C(i+1UL,j) += A(i+1UL,j1) * v1;
727 for(
size_t j=( SYM || HERM || UPP ? i : 0UL ); j<( LOW ? i+1UL : N ); ++j )
736 const size_t nonzeros( end - element );
737 const size_t kpos( nonzeros &
size_t(-4) );
740 for(
size_t k=0UL; k<kpos; k+=4UL )
742 const size_t j1( element->index() );
743 const ET2 v1( element->value() );
745 const size_t j2( element->index() );
746 const ET2 v2( element->value() );
748 const size_t j3( element->index() );
749 const ET2 v3( element->value() );
751 const size_t j4( element->index() );
752 const ET2 v4( element->value() );
757 C(i,j) += A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
760 for( ; element!=
end; ++element )
762 const size_t j1( element->index() );
763 const ET2 v1( element->value() );
765 C(i,j) += A(i,j1) * v1;
772 for(
size_t i=1UL; i<M; ++i ) {
773 for(
size_t j=0UL; j<i; ++j ) {
774 C(i,j) = HERM ?
conj( C(j,i) ) : C(j,i);
795 template<
typename MT
814 const ForwardFunctor fwd;
816 const TmpType tmp(
serial( rhs ) );
817 assign( ~lhs, fwd( tmp ) );
837 template<
typename MT
847 const ForwardFunctor fwd;
867 template<
typename MT
884 DMatTSMatMultExpr::selectAddAssignKernel( ~lhs, A, B );
903 template<
typename MT3
907 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
911 const size_t M( A.rows() );
912 const size_t N( B.columns() );
919 for( ; (i+4UL) <= M; i+=4UL ) {
920 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+4UL : N ); ++j )
929 for( ; element!=
end; ++element ) {
930 C(i ,j) += A(i ,element->index()) * element->value();
931 C(i+1UL,j) += A(i+1UL,element->index()) * element->value();
932 C(i+2UL,j) += A(i+2UL,element->index()) * element->value();
933 C(i+3UL,j) += A(i+3UL,element->index()) * element->value();
938 for( ; (i+2UL) <= M; i+=2UL ) {
939 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+2UL : N ); ++j )
948 for( ; element!=
end; ++element ) {
949 C(i ,j) += A(i ,element->index()) * element->value();
950 C(i+1UL,j) += A(i+1UL,element->index()) * element->value();
956 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+1UL : N ); ++j )
965 for( ; element!=
end; ++element )
966 C(i,j) += A(i,element->index()) * element->value();
988 template<
typename MT3
992 selectAddAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
996 const size_t M( A.rows() );
997 const size_t N( B.columns() );
1004 for( ; (i+4UL) <= M; i+=4UL ) {
1005 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+4UL : N ); ++j )
1014 const size_t nonzeros( end - element );
1015 const size_t kpos( nonzeros &
size_t(-4) );
1018 for(
size_t k=0UL; k<kpos; k+=4UL )
1020 const size_t j1( element->index() );
1021 const ET2 v1( element->value() );
1023 const size_t j2( element->index() );
1024 const ET2 v2( element->value() );
1026 const size_t j3( element->index() );
1027 const ET2 v3( element->value() );
1029 const size_t j4( element->index() );
1030 const ET2 v4( element->value() );
1035 C(i ,j) += A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
1036 C(i+1UL,j) += A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
1037 C(i+2UL,j) += A(i+2UL,j1) * v1 + A(i+2UL,j2) * v2 + A(i+2UL,j3) * v3 + A(i+2UL,j4) * v4;
1038 C(i+3UL,j) += A(i+3UL,j1) * v1 + A(i+3UL,j2) * v2 + A(i+3UL,j3) * v3 + A(i+3UL,j4) * v4;
1041 for( ; element!=
end; ++element )
1043 const size_t j1( element->index() );
1044 const ET2 v1( element->value() );
1046 C(i ,j) += A(i ,j1) * v1;
1047 C(i+1UL,j) += A(i+1UL,j1) * v1;
1048 C(i+2UL,j) += A(i+2UL,j1) * v1;
1049 C(i+3UL,j) += A(i+3UL,j1) * v1;
1054 for( ; (i+2UL) <= M; i+=2UL ) {
1055 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+2UL : N ); ++j )
1064 const size_t nonzeros( end - element );
1065 const size_t kpos( nonzeros &
size_t(-4) );
1068 for(
size_t k=0UL; k<kpos; k+=4UL )
1070 const size_t j1( element->index() );
1071 const ET2 v1( element->value() );
1073 const size_t j2( element->index() );
1074 const ET2 v2( element->value() );
1076 const size_t j3( element->index() );
1077 const ET2 v3( element->value() );
1079 const size_t j4( element->index() );
1080 const ET2 v4( element->value() );
1085 C(i ,j) += A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
1086 C(i+1UL,j) += A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
1089 for( ; element!=
end; ++element )
1091 const size_t j1( element->index() );
1092 const ET2 v1( element->value() );
1094 C(i ,j) += A(i ,j1) * v1;
1095 C(i+1UL,j) += A(i+1UL,j1) * v1;
1101 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+1UL : N ); ++j )
1110 const size_t nonzeros( end - element );
1111 const size_t kpos( nonzeros &
size_t(-4) );
1114 for(
size_t k=0UL; k<kpos; k+=4UL )
1116 const size_t j1( element->index() );
1117 const ET2 v1( element->value() );
1119 const size_t j2( element->index() );
1120 const ET2 v2( element->value() );
1122 const size_t j3( element->index() );
1123 const ET2 v3( element->value() );
1125 const size_t j4( element->index() );
1126 const ET2 v4( element->value() );
1131 C(i,j) += A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
1134 for( ; element!=
end; ++element )
1136 const size_t j1( element->index() );
1137 const ET2 v1( element->value() );
1139 C(i,j) += A(i,j1) * v1;
1163 template<
typename MT
1175 const ForwardFunctor fwd;
1199 template<
typename MT
1216 DMatTSMatMultExpr::selectSubAssignKernel( ~lhs, A, B );
1235 template<
typename MT3
1239 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
1243 const size_t M( A.rows() );
1244 const size_t N( B.columns() );
1251 for( ; (i+4UL) <= M; i+=4UL ) {
1252 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+4UL : N ); ++j )
1261 for( ; element!=
end; ++element ) {
1262 C(i ,j) -= A(i ,element->index()) * element->value();
1263 C(i+1UL,j) -= A(i+1UL,element->index()) * element->value();
1264 C(i+2UL,j) -= A(i+2UL,element->index()) * element->value();
1265 C(i+3UL,j) -= A(i+3UL,element->index()) * element->value();
1270 for( ; (i+2UL) <= M; i+=2UL ) {
1271 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+2UL : N ); ++j )
1280 for( ; element!=
end; ++element ) {
1281 C(i ,j) -= A(i ,element->index()) * element->value();
1282 C(i+1UL,j) -= A(i+1UL,element->index()) * element->value();
1288 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+1UL : N ); ++j )
1297 for( ; element!=
end; ++element )
1298 C(i,j) -= A(i,element->index()) * element->value();
1320 template<
typename MT3
1324 selectSubAssignKernel( MT3& C,
const MT4& A,
const MT5& B )
1328 const size_t M( A.rows() );
1329 const size_t N( B.columns() );
1336 for( ; (i+4UL) <= M; i+=4UL ) {
1337 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+4UL : N ); ++j )
1346 const size_t nonzeros( end - element );
1347 const size_t kpos( nonzeros &
size_t(-4) );
1350 for(
size_t k=0UL; k<kpos; k+=4UL )
1352 const size_t j1( element->index() );
1353 const ET2 v1( element->value() );
1355 const size_t j2( element->index() );
1356 const ET2 v2( element->value() );
1358 const size_t j3( element->index() );
1359 const ET2 v3( element->value() );
1361 const size_t j4( element->index() );
1362 const ET2 v4( element->value() );
1367 C(i ,j) -= A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
1368 C(i+1UL,j) -= A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
1369 C(i+2UL,j) -= A(i+2UL,j1) * v1 + A(i+2UL,j2) * v2 + A(i+2UL,j3) * v3 + A(i+2UL,j4) * v4;
1370 C(i+3UL,j) -= A(i+3UL,j1) * v1 + A(i+3UL,j2) * v2 + A(i+3UL,j3) * v3 + A(i+3UL,j4) * v4;
1373 for( ; element!=
end; ++element )
1375 const size_t j1( element->index() );
1376 const ET2 v1( element->value() );
1378 C(i ,j) -= A(i ,j1) * v1;
1379 C(i+1UL,j) -= A(i+1UL,j1) * v1;
1380 C(i+2UL,j) -= A(i+2UL,j1) * v1;
1381 C(i+3UL,j) -= A(i+3UL,j1) * v1;
1386 for( ; (i+2UL) <= M; i+=2UL ) {
1387 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+2UL : N ); ++j )
1396 const size_t nonzeros( end - element );
1397 const size_t kpos( nonzeros &
size_t(-4) );
1400 for(
size_t k=0UL; k<kpos; k+=4UL )
1402 const size_t j1( element->index() );
1403 const ET2 v1( element->value() );
1405 const size_t j2( element->index() );
1406 const ET2 v2( element->value() );
1408 const size_t j3( element->index() );
1409 const ET2 v3( element->value() );
1411 const size_t j4( element->index() );
1412 const ET2 v4( element->value() );
1417 C(i ,j) -= A(i ,j1) * v1 + A(i ,j2) * v2 + A(i ,j3) * v3 + A(i ,j4) * v4;
1418 C(i+1UL,j) -= A(i+1UL,j1) * v1 + A(i+1UL,j2) * v2 + A(i+1UL,j3) * v3 + A(i+1UL,j4) * v4;
1421 for( ; element!=
end; ++element )
1423 const size_t j1( element->index() );
1424 const ET2 v1( element->value() );
1426 C(i ,j) -= A(i ,j1) * v1;
1427 C(i+1UL,j) -= A(i+1UL,j1) * v1;
1433 for(
size_t j=( UPP ? i : 0UL ); j<( LOW ? i+1UL : N ); ++j )
1442 const size_t nonzeros( end - element );
1443 const size_t kpos( nonzeros &
size_t(-4) );
1446 for(
size_t k=0UL; k<kpos; k+=4UL )
1448 const size_t j1( element->index() );
1449 const ET2 v1( element->value() );
1451 const size_t j2( element->index() );
1452 const ET2 v2( element->value() );
1454 const size_t j3( element->index() );
1455 const ET2 v3( element->value() );
1457 const size_t j4( element->index() );
1458 const ET2 v4( element->value() );
1463 C(i,j) -= A(i,j1) * v1 + A(i,j2) * v2 + A(i,j3) * v3 + A(i,j4) * v4;
1466 for( ; element!=
end; ++element )
1468 const size_t j1( element->index() );
1469 const ET2 v1( element->value() );
1471 C(i,j) -= A(i,j1) * v1;
1495 template<
typename MT
1507 const ForwardFunctor fwd;
1531 template<
typename MT
1545 schurAssign( ~lhs, tmp );
1577 template<
typename MT
1614 template<
typename MT
1633 const ForwardFunctor fwd;
1635 const TmpType tmp( rhs );
1656 template<
typename MT
1668 const ForwardFunctor fwd;
1691 template<
typename MT
1728 template<
typename MT
1740 const ForwardFunctor fwd;
1767 template<
typename MT
1804 template<
typename MT
1816 const ForwardFunctor fwd;
1840 template<
typename MT
1922 template<
typename MT1
1924 inline decltype(
auto)
1971 template<
typename MT1
2016 template<
typename MT1
2061 template<
typename MT1
2106 template<
typename MT1
2151 template<
typename MT1
2182 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2183 struct Size< DMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF>, 0UL >
2184 :
public Size<MT1,0UL>
2187 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2188 struct Size< DMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF>, 1UL >
2189 :
public Size<MT2,1UL>
2205 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2206 struct IsAligned< DMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2223 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2224 struct IsSymmetric< DMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2225 :
public Or< Bool<SF>
2227 , IsBuiltin< ElementType_< DMatTSMatMultExpr<MT1,MT2,false,true,false,false> > > >
2228 , And< Bool<LF>, Bool<UF> > >
2244 template<
typename MT1,
typename MT2,
bool SF,
bool LF,
bool UF >
2245 struct IsHermitian< DMatTSMatMultExpr<MT1,MT2,SF,true,LF,UF> >
2262 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2263 struct IsLower< DMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2264 :
public Or< Bool<LF>
2265 , And< IsLower<MT1>, IsLower<MT2> >
2266 , And< Or< Bool<SF>, Bool<HF> >
2267 , IsUpper<MT1>, IsUpper<MT2> > >
2283 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2284 struct IsUniLower< DMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2285 :
public Or< And< IsUniLower<MT1>, IsUniLower<MT2> >
2286 , And< Or< Bool<SF>, Bool<HF> >
2287 , IsUniUpper<MT1>, IsUniUpper<MT2> > >
2303 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2305 :
public Or< And< IsStrictlyLower<MT1>, IsLower<MT2> >
2306 , And< IsStrictlyLower<MT2>, IsLower<MT1> >
2307 , And< Or< Bool<SF>, Bool<HF> >
2308 , Or< And< IsStrictlyUpper<MT1>, IsUpper<MT2> >
2309 , And< IsStrictlyUpper<MT2>, IsUpper<MT1> > > > >
2325 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2326 struct IsUpper< DMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2327 :
public Or< Bool<UF>
2328 , And< IsUpper<MT1>, IsUpper<MT2> >
2329 , And< Or< Bool<SF>, Bool<HF> >
2330 , IsLower<MT1>, IsLower<MT2> > >
2346 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2347 struct IsUniUpper< DMatTSMatMultExpr<MT1,MT2,SF,HF,LF,UF> >
2348 :
public Or< And< IsUniUpper<MT1>, IsUniUpper<MT2> >
2349 , And< Or< Bool<SF>, Bool<HF> >
2350 , IsUniLower<MT1>, IsUniLower<MT2> > >
2366 template<
typename MT1,
typename MT2,
bool SF,
bool HF,
bool LF,
bool UF >
2368 :
public Or< And< IsStrictlyUpper<MT1>, IsUpper<MT2> >
2369 , And< IsStrictlyUpper<MT2>, IsUpper<MT1> >
2370 , And< Or< Bool<SF>, Bool<HF> >
2371 , Or< And< IsStrictlyLower<MT1>, IsLower<MT2> >
2372 , And< IsStrictlyLower<MT2>, IsLower<MT1> > > > >
CompositeType_< MT1 > CT1
Composite type of the left-hand side dense matrix expression.
Definition: DMatTSMatMultExpr.h:132
decltype(auto) subvector(Vector< VT, TF > &, RSAs...)
Creating a view on a specific subvector of the given vector.
Definition: Subvector.h:329
#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
ElementType_< RT1 > ET1
Element type of the left-hand side dense matrix expression.
Definition: DMatTSMatMultExpr.h:130
Header file for auxiliary alias declarations.
decltype(auto) column(Matrix< MT, SO > &matrix, RCAs... args)
Creating a view on a specific column of the given matrix.
Definition: Column.h:131
Headerfile for the generic min algorithm.
Header file for the blaze::checked and blaze::unchecked instances.
Compile time check whether the given type is a computational expression template.This type trait clas...
Definition: IsComputation.h:71
decltype(auto) decldiag(const DenseMatrix< MT, SO > &dm)
Declares the given dense matrix expression dm as diagonal.
Definition: DMatDeclDiagExpr.h:996
Header file for the IsUniUpper type trait.
EnableIf_< IsDenseMatrix< MT1 > > smpSchurAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP Schur product assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:196
Compile time check for triangular matrix types.This type trait tests whether or not the given templat...
Definition: IsTriangular.h:86
Header file for basic type definitions.
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:164
size_t columns() const noexcept
Returns the current number of columns of the matrix.
Definition: DMatTSMatMultExpr.h:348
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 DeclUpp functor.
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:364
void reset(const DiagonalProxy< MT > &proxy)
Resetting the represented element to the default initial values.
Definition: DiagonalProxy.h:588
DMatTSMatMultExpr(const MT1 &lhs, const MT2 &rhs) noexcept
Constructor for the DMatTSMatMultExpr class.
Definition: DMatTSMatMultExpr.h:258
LeftOperand leftOperand() const noexcept
Returns the left-hand side dense matrix operand.
Definition: DMatTSMatMultExpr.h:358
constexpr Unchecked unchecked
Global Unchecked instance.The blaze::unchecked instance is an optional token for the creation of view...
Definition: Check.h:138
typename DisableIf< Condition, T >::Type DisableIf_
Auxiliary type for the DisableIf class template.The DisableIf_ alias declaration provides a convenien...
Definition: DisableIf.h:224
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:1903
Compile time check for lower triangular matrices.This type trait tests whether or not the given templ...
Definition: IsLower.h:87
ReturnType at(size_t i, size_t j) const
Checked access to the matrix elements.
Definition: DMatTSMatMultExpr.h:322
bool canSMPAssign() const noexcept
Returns whether the expression can be used in SMP assignments.
Definition: DMatTSMatMultExpr.h:412
decltype(auto) declupp(const DenseMatrix< MT, SO > &dm)
Declares the given dense matrix expression dm as upper.
Definition: DMatDeclUppExpr.h:1026
typename MultTrait< T1, T2 >::Type MultTrait_
Auxiliary alias declaration for the MultTrait class template.The MultTrait_ alias declaration provide...
Definition: MultTrait.h:291
Header file for the Computation base class.
OppositeType_< ResultType > OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: DMatTSMatMultExpr.h:224
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:87
Constraints on the storage order of matrix types.
Header file for the RequiresEvaluation type trait.
IfTrue_< evaluateLeft, const RT1, CT1 > LT
Type for the assignment of the left-hand side dense matrix operand.
Definition: DMatTSMatMultExpr.h:237
System settings for performance optimizations.
ResultType_< MT2 > RT2
Result type of the right-hand side sparse matrix expression.
Definition: DMatTSMatMultExpr.h:129
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:343
const ElementType_< MT > max(const DenseMatrix< MT, SO > &dm)
Returns the largest element of the dense matrix.
Definition: DenseMatrix.h:1950
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:133
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:80
Base class for sparse matrices.The SparseMatrix class is a base class for all sparse matrix classes...
Definition: Forward.h:129
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.
Compile time check to query the requirement to evaluate an expression.Via this type trait it is possi...
Definition: RequiresEvaluation.h:71
RightOperand rhs_
Right-hand side sparse matrix of the multiplication expression.
Definition: DMatTSMatMultExpr.h:420
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
Headerfile for the generic max algorithm.
Flag for upper matrices.
Definition: DMatTSMatMultExpr.h:152
Header file for the DisableIf class template.
Header file for the multiplication trait.
Header file for the IsStrictlyUpper type trait.
Header file for the IsSymmetric type trait.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:58
Header file for the DeclLow functor.
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: DMatTSMatMultExpr.h:392
Header file for the If class template.
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: DMatTSMatMultExpr.h:380
#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
Generic wrapper for the decllow() function.
Definition: DeclLow.h:58
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:102
Header file for the Or 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 DenseMatrix base class.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:3085
typename T::ElementType ElementType_
Alias declaration for nested ElementType type definitions.The ElementType_ alias declaration provides...
Definition: Aliases.h:163
RightOperand rightOperand() const noexcept
Returns the right-hand side transpose sparse matrix operand.
Definition: DMatTSMatMultExpr.h:368
decltype(auto) decllow(const DenseMatrix< MT, SO > &dm)
Declares the given dense matrix expression dm as lower.
Definition: DMatDeclLowExpr.h:1026
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:89
Flag for symmetric matrices.
Definition: DMatTSMatMultExpr.h:149
Generic wrapper for the null function.
Definition: Noop.h:59
Header file for the IsTriangular type trait.
Constraints on the storage order of matrix types.
Flag for Hermitian matrices.
Definition: DMatTSMatMultExpr.h:150
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.
Compile time check for strictly upper triangular matrices.This type trait tests whether or not the gi...
Definition: IsStrictlyUpper.h:86
size_t rows() const noexcept
Returns the current number of rows of the matrix.
Definition: DMatTSMatMultExpr.h:338
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:430
Header file for the DeclDiag functor.
Constraint on the data type.
Header file for all forward declarations for expression class templates.
bool isAligned() const noexcept
Returns whether the operands of the expression are properly aligned in memory.
Definition: DMatTSMatMultExpr.h:402
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:107
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
Base class for all matrix/matrix multiplication expression templates.The MatMatMultExpr class serves ...
Definition: MatMatMultExpr.h:67
#define BLAZE_CONSTRAINT_MUST_NOT_BE_SYMMETRIC_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a symmetric matrix type, a compilation error is created.
Definition: Symmetric.h:79
#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 run time assertion macros.
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:154
decltype(auto) row(Matrix< MT, SO > &, RRAs...)
Creating a view on a specific row of the given matrix.
Definition: Row.h:131
LeftOperand lhs_
Left-hand side dense matrix of the multiplication expression.
Definition: DMatTSMatMultExpr.h:419
Header file for the reset shim.
ElementType_< RT2 > ET2
Element type of the right-hand side sparse matrix expression.
Definition: DMatTSMatMultExpr.h:131
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:94
decltype(auto) declsym(const DenseMatrix< MT, SO > &dm)
Declares the given dense matrix expression dm as symmetric.
Definition: DMatDeclSymExpr.h:1028
Compile time check for Hermitian matrices.This type trait tests whether or not the given template par...
Definition: IsHermitian.h:85
Base class for matrices.The Matrix class is a base class for all dense and sparse matrix classes with...
Definition: Forward.h:101
Expression object for dense matrix-transpose sparse matrix multiplications.The DMatTSMatMultExpr clas...
Definition: DMatTSMatMultExpr.h:122
Constraint on the data type.
Constraints on the storage order of matrix types.
Generic wrapper for the declherm() function.
Definition: DeclHerm.h:58
decltype(auto) serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:816
Header file for the Noop functor.
CompositeType_< MT2 > CT2
Composite type of the right-hand side sparse matrix expression.
Definition: DMatTSMatMultExpr.h:133
Flag for lower matrices.
Definition: DMatTSMatMultExpr.h:151
#define BLAZE_CONSTRAINT_MUST_NOT_REQUIRE_EVALUATION(T)
Constraint on the data type.In case the given data type T requires an intermediate evaluation within ...
Definition: RequiresEvaluation.h:81
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:224
If_< IsExpression< MT2 >, const MT2, const MT2 &> RightOperand
Composite type of the right-hand side sparse matrix expression.
Definition: DMatTSMatMultExpr.h:234
typename T::OppositeType OppositeType_
Alias declaration for nested OppositeType type definitions.The OppositeType_ alias declaration provid...
Definition: Aliases.h:263
#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
const ElementType ReturnType
Return type for expression template evaluations.
Definition: DMatTSMatMultExpr.h:227
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
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:3080
typename T::ConstIterator ConstIterator_
Alias declaration for nested ConstIterator type definitions.The ConstIterator_ alias declaration prov...
Definition: Aliases.h:103
decltype(auto) trans(const DenseMatrix< MT, SO > &dm)
Calculation of the transpose of the given dense matrix.
Definition: DMatTransExpr.h:789
const ResultType CompositeType
Data type for composite expression templates.
Definition: DMatTSMatMultExpr.h:228
decltype(auto) declherm(const DenseMatrix< MT, SO > &dm)
Declares the given dense matrix expression dm as Hermitian.
Definition: DMatDeclHermExpr.h:1028
ResultType_< MT1 > RT1
Result type of the left-hand side dense matrix expression.
Definition: DMatTSMatMultExpr.h:128
Header file for the IsComputation type trait class.
MultTrait_< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: DMatTSMatMultExpr.h:223
Header file for the IsBuiltin type trait.
Base class for all compute expression templates.The Computation class serves as a tag for all computa...
Definition: Computation.h:66
Compile time logical 'or' evaluation.The Or alias declaration performs at compile time a logical 'or'...
Definition: Or.h:76
Compile time evaluation of the size of vectors and matrices.The Size type trait evaluates the size of...
Definition: Size.h:80
TransposeType_< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: DMatTSMatMultExpr.h:225
Generic wrapper for the decldiag() function.
Definition: DeclDiag.h:58
Header file for the DeclHerm functor.
typename T::TransposeType TransposeType_
Alias declaration for nested TransposeType type definitions.The TransposeType_ alias declaration prov...
Definition: Aliases.h:423
Header file for the IsUpper type trait.
decltype(auto) conj(const DenseMatrix< MT, SO > &dm)
Returns a matrix containing the complex conjugate of each single element of dm.
Definition: DMatMapExpr.h:1321
Constraint on the data type.
Generic wrapper for the declsym() function.
Definition: DeclSym.h:58
IfTrue_< evaluateRight, const RT2, CT2 > RT
Type for the assignment of the right-hand side sparse matrix operand.
Definition: DMatTSMatMultExpr.h:240
BLAZE_ALWAYS_INLINE bool isSquare(const Matrix< MT, SO > &matrix) noexcept
Checks if the given matrix is a square matrix.
Definition: Matrix.h:908
Header file for the IsResizable type trait.
ElementType_< ResultType > ElementType
Resulting element type.
Definition: DMatTSMatMultExpr.h:226
Header file for the Size type trait.
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 Bool 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
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: DMatTSMatMultExpr.h:273
Header file for the TrueType type/value trait base class.
Header file for the IsExpression type trait class.
Header file for the function trace functionality.
If_< IsExpression< MT1 >, const MT1, const MT1 &> LeftOperand
Composite type of the left-hand side dense matrix expression.
Definition: DMatTSMatMultExpr.h:231