35 #ifndef _BLAZE_MATH_ADAPTORS_UNILOWERMATRIX_H_
36 #define _BLAZE_MATH_ADAPTORS_UNILOWERMATRIX_H_
101 template<
typename MT,
bool SO,
bool DF >
102 inline void reset( UniLowerMatrix<MT,SO,DF>& m );
104 template<
typename MT,
bool SO,
bool DF >
105 inline void reset( UniLowerMatrix<MT,SO,DF>& m,
size_t i );
107 template<
typename MT,
bool SO,
bool DF >
108 inline void clear( UniLowerMatrix<MT,SO,DF>& m );
110 template<
typename MT,
bool SO,
bool DF >
111 inline bool isDefault(
const UniLowerMatrix<MT,SO,DF>& m );
113 template<
typename MT,
bool SO,
bool DF >
114 inline bool isIntact(
const UniLowerMatrix<MT,SO,DF>& m );
116 template<
typename MT,
bool SO,
bool DF >
117 inline void swap( UniLowerMatrix<MT,SO,DF>& a, UniLowerMatrix<MT,SO,DF>& b ) noexcept;
129 template<
typename MT
152 template<
typename MT
169 template<
typename MT
189 template<
typename MT
192 inline bool isDefault_backend(
const UniLowerMatrix<MT,SO,DF>& m,
TrueType )
194 return ( m.rows() == 0UL );
210 template<
typename MT
213 inline bool isDefault_backend(
const UniLowerMatrix<MT,SO,DF>& m,
FalseType )
240 template<
typename MT
271 template<
typename MT
289 template<
typename MT
325 inline void invert( UniLowerMatrix<MT,SO,true>& m )
338 invert<flag>( derestrict( m ) );
365 template<
typename MT1,
bool SO1,
typename MT2,
typename MT3,
typename MT4,
bool SO2 >
366 inline void lu(
const UniLowerMatrix<MT1,SO1,true>& A, DenseMatrix<MT2,SO1>& L,
367 DenseMatrix<MT3,SO1>& U, Matrix<MT4,SO2>& P )
381 typedef ElementType_<MT3> ET3;
382 typedef ElementType_<MT4> ET4;
384 const size_t n( (~A).
rows() );
386 DerestrictTrait_<MT3> U2( derestrict( ~U ) );
396 for(
size_t i=0UL; i<n; ++i ) {
421 template<
typename MT
425 inline bool tryAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
426 const DenseVector<VT,false>& rhs,
size_t row,
size_t column )
439 const bool containsDiagonal( column < row + (~rhs).
size() );
440 const size_t iend(
min( column - row, (~rhs).
size() ) );
442 for(
size_t i=0UL; i<iend; ++i ) {
447 if( containsDiagonal && !
isOne( (~rhs)[iend] ) )
472 template<
typename MT
476 inline bool tryAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
477 const DenseVector<VT,true>& rhs,
size_t row,
size_t column )
487 if( row >= column + (~rhs).
size() )
490 const bool containsDiagonal( row >= column );
491 const size_t ibegin( ( !containsDiagonal )?( 0UL ):( row - column + 1UL ) );
493 if( containsDiagonal && !
isOne( (~rhs)[row-column] ) )
496 for(
size_t i=ibegin; i<(~rhs).
size(); ++i ) {
523 template<
typename MT
527 inline bool tryAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
528 const SparseVector<VT,false>& rhs,
size_t row,
size_t column )
543 const bool containsDiagonal( column < row + (~rhs).
size() );
544 const size_t index( column - row );
545 const RhsIterator last( (~rhs).lowerBound( index ) );
547 if( containsDiagonal ) {
548 if( last == (~rhs).
end() || last->index() != index || !
isOne( last->value() ) )
552 for( RhsIterator element=(~rhs).begin(); element!=last; ++element ) {
579 template<
typename MT
583 inline bool tryAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
584 const SparseVector<VT,true>& rhs,
size_t row,
size_t column )
596 if( row >= column + (~rhs).
size() )
599 const bool containsDiagonal( row >= column );
600 const size_t index( ( containsDiagonal )?( row - column ):( 0UL ) );
601 const RhsIterator last( (~rhs).
end() );
602 RhsIterator element( (~rhs).lowerBound( index ) );
604 if( containsDiagonal ) {
605 if( element == last || element->index() != index || !
isOne( element->value() ) )
610 for( ; element!=last; ++element ) {
637 template<
typename MT1
641 inline bool tryAssign(
const UniLowerMatrix<MT1,SO,DF>& lhs,
642 const DenseMatrix<MT2,false>& rhs,
size_t row,
size_t column )
653 const size_t M( (~rhs).
rows() );
654 const size_t N( (~rhs).
columns() );
656 if( row + 1UL >= column + N )
659 const size_t iend(
min( column + N - row, M ) );
661 for(
size_t i=0UL; i<iend; ++i )
663 const bool containsDiagonal( row + i >= column );
665 if( containsDiagonal && !
isOne( (~rhs)(i,row+i-column) ) )
668 const size_t jbegin( ( containsDiagonal )?( row + i - column + 1UL ):( 0UL ) );
670 for(
size_t j=jbegin; j<N; ++j ) {
698 template<
typename MT1
702 inline bool tryAssign(
const UniLowerMatrix<MT1,SO,DF>& lhs,
703 const DenseMatrix<MT2,true>& rhs,
size_t row,
size_t column )
714 const size_t M( (~rhs).
rows() );
715 const size_t N( (~rhs).
columns() );
717 if( row + 1UL >= column + N )
720 const size_t jbegin( ( row < column )?( 0UL ):( row - column ) );
722 for(
size_t j=jbegin; j<N; ++j )
724 const size_t iend(
min( column + j - row, M ) );
726 for(
size_t i=0UL; i<iend; ++i ) {
731 const bool containsDiagonal( column + j < row + M );
733 if( containsDiagonal && !
isOne( (~rhs)(iend,j) ) )
759 template<
typename MT1
763 inline bool tryAssign(
const UniLowerMatrix<MT1,SO,DF>& lhs,
764 const SparseMatrix<MT2,false>& rhs,
size_t row,
size_t column )
777 const size_t M( (~rhs).
rows() );
778 const size_t N( (~rhs).
columns() );
780 if( row + 1UL >= column + N )
783 const size_t iend(
min( column + N - row, M ) );
785 for(
size_t i=0UL; i<iend; ++i )
787 const bool containsDiagonal( row + i >= column );
788 const size_t index( ( containsDiagonal )?( row + i - column ):( 0UL ) );
790 const RhsIterator last( (~rhs).
end(i) );
791 RhsIterator element( (~rhs).lowerBound( i, index ) );
793 if( containsDiagonal ) {
794 if( element == last || ( element->index() != index ) || !
isOne( element->value() ) )
799 for( ; element!=last; ++element ) {
827 template<
typename MT1
831 inline bool tryAssign(
const UniLowerMatrix<MT1,SO,DF>& lhs,
832 const SparseMatrix<MT2,true>& rhs,
size_t row,
size_t column )
845 const size_t M( (~rhs).
rows() );
846 const size_t N( (~rhs).
columns() );
848 if( row + 1UL >= column + N )
851 const size_t jbegin( ( row < column )?( 0UL ):( row - column ) );
853 for(
size_t j=jbegin; j<N; ++j )
855 const bool containsDiagonal( column + j < row + M );
857 const size_t index( column + j - row );
858 const RhsIterator last( (~rhs).lowerBound(
min( index, M ), j ) );
860 if( containsDiagonal ) {
861 if( last == (~rhs).
end(j) || ( last->index() != index ) || !
isOne( last->value() ) )
865 for( RhsIterator element=(~rhs).begin(j); element!=last; ++element ) {
894 template<
typename MT
898 inline bool tryAddAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
899 const DenseVector<VT,false>& rhs,
size_t row,
size_t column )
912 const size_t iend(
min( column - row + 1UL, (~rhs).
size() ) );
914 for(
size_t i=0UL; i<iend; ++i ) {
942 template<
typename MT
946 inline bool tryAddAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
947 const DenseVector<VT,true>& rhs,
size_t row,
size_t column )
957 const size_t ibegin( ( row <= column )?( 0UL ):( row - column ) );
959 for(
size_t i=ibegin; i<(~rhs).
size(); ++i ) {
987 template<
typename MT
991 inline bool tryAddAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
992 const SparseVector<VT,false>& rhs,
size_t row,
size_t column )
1007 const RhsIterator last( (~rhs).lowerBound( column - row + 1UL ) );
1009 for( RhsIterator element=(~rhs).
begin(); element!=last; ++element ) {
1037 template<
typename MT
1041 inline bool tryAddAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
1042 const SparseVector<VT,true>& rhs,
size_t row,
size_t column )
1054 const RhsIterator last( (~rhs).
end() );
1055 RhsIterator element( (~rhs).lowerBound( ( row <= column )?( 0UL ):( row - column ) ) );
1057 for( ; element!=last; ++element ) {
1085 template<
typename MT1
1089 inline bool tryAddAssign(
const UniLowerMatrix<MT1,SO,DF>& lhs,
1090 const DenseMatrix<MT2,false>& rhs,
size_t row,
size_t column )
1101 const size_t M( (~rhs).
rows() );
1102 const size_t N( (~rhs).
columns() );
1104 if( row + 1UL >= column + N )
1107 const size_t iend(
min( column + N - row, M ) );
1109 for(
size_t i=0UL; i<iend; ++i )
1111 const bool containsDiagonal( row + i >= column );
1112 const size_t jbegin( ( containsDiagonal )?( row + i - column ):( 0UL ) );
1114 for(
size_t j=jbegin; j<N; ++j ) {
1143 template<
typename MT1
1147 inline bool tryAddAssign(
const UniLowerMatrix<MT1,SO,DF>& lhs,
1148 const DenseMatrix<MT2,true>& rhs,
size_t row,
size_t column )
1159 const size_t M( (~rhs).
rows() );
1160 const size_t N( (~rhs).
columns() );
1162 if( row + 1UL >= column + N )
1165 const size_t jbegin( ( row <= column )?( 0UL ):( row - column ) );
1167 for(
size_t j=jbegin; j<N; ++j )
1169 const size_t iend(
min( column + j - row + 1UL, M ) );
1171 for(
size_t i=0UL; i<iend; ++i ) {
1200 template<
typename MT1
1204 inline bool tryAddAssign(
const UniLowerMatrix<MT1,SO,DF>& lhs,
1205 const SparseMatrix<MT2,false>& rhs,
size_t row,
size_t column )
1218 const size_t M( (~rhs).
rows() );
1219 const size_t N( (~rhs).
columns() );
1221 if( row + 1UL >= column + N )
1224 const size_t iend(
min( column + N - row, M ) );
1226 for(
size_t i=0UL; i<iend; ++i )
1228 const bool containsDiagonal( row + i >= column );
1229 const size_t index( ( containsDiagonal )?( row + i - column ):( 0UL ) );
1231 const RhsIterator last( (~rhs).
end(i) );
1232 RhsIterator element( (~rhs).lowerBound( i, index ) );
1234 for( ; element!=last; ++element ) {
1263 template<
typename MT1
1267 inline bool tryAddAssign(
const UniLowerMatrix<MT1,SO,DF>& lhs,
1268 const SparseMatrix<MT2,true>& rhs,
size_t row,
size_t column )
1281 const size_t M( (~rhs).
rows() );
1282 const size_t N( (~rhs).
columns() );
1284 if( row + 1UL >= column + N )
1287 const size_t jbegin( ( row < column )?( 0UL ):( row - column ) );
1289 for(
size_t j=jbegin; j<N; ++j )
1291 const size_t index( column + j - row + 1UL );
1292 const RhsIterator last( (~rhs).lowerBound(
min( index, M ), j ) );
1294 for( RhsIterator element=(~rhs).
begin(j); element!=last; ++element ) {
1323 template<
typename MT
1328 inline bool trySubAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
1329 const Vector<VT,TF>& rhs,
size_t row,
size_t column )
1331 return tryAddAssign( lhs, ~rhs, row, column );
1354 template<
typename MT1
1359 inline bool trySubAssign(
const UniLowerMatrix<MT1,SO1,DF>& lhs,
1360 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
1362 return tryAddAssign( lhs, ~rhs, row, column );
1385 template<
typename MT
1389 inline bool tryMultAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
1390 const Vector<VT,false>& rhs,
size_t row,
size_t column )
1400 return ( column < row || (~rhs).
size() <= column - row ||
isOne( (~rhs)[column-row] ) );
1423 template<
typename MT
1427 inline bool tryMultAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
1428 const Vector<VT,true>& rhs,
size_t row,
size_t column )
1438 return ( row < column || (~rhs).
size() <= row - column ||
isOne( (~rhs)[row-column] ) );
1460 template<
typename MT
1465 inline bool tryDivAssign(
const UniLowerMatrix<MT,SO,DF>& lhs,
1466 const Vector<VT,TF>& rhs,
size_t row,
size_t column )
1468 return tryMultAssign( lhs, ~rhs, row, column );
1488 template<
typename MT
1491 inline MT& derestrict( UniLowerMatrix<MT,SO,DF>& m )
1509 template<
typename MT,
bool SO,
bool DF >
1510 struct Rows< UniLowerMatrix<MT,SO,DF> > :
public Rows<MT>
1526 template<
typename MT,
bool SO,
bool DF >
1527 struct Columns< UniLowerMatrix<MT,SO,DF> > :
public Columns<MT>
1543 template<
typename MT,
bool SO,
bool DF >
1544 struct IsSquare< UniLowerMatrix<MT,SO,DF> > :
public TrueType
1560 template<
typename MT,
bool SO,
bool DF >
1561 struct IsUniLower< UniLowerMatrix<MT,SO,DF> > :
public TrueType
1577 template<
typename MT,
bool SO,
bool DF >
1578 struct IsAdaptor< UniLowerMatrix<MT,SO,DF> > :
public TrueType
1594 template<
typename MT,
bool SO,
bool DF >
1595 struct IsRestricted< UniLowerMatrix<MT,SO,DF> > :
public TrueType
1611 template<
typename MT,
bool SO >
1612 struct HasConstDataAccess< UniLowerMatrix<MT,SO,true> > :
public TrueType
1628 template<
typename MT,
bool SO,
bool DF >
1629 struct IsAligned< UniLowerMatrix<MT,SO,DF> > :
public BoolConstant< IsAligned<MT>::value >
1645 template<
typename MT,
bool SO,
bool DF >
1646 struct IsPadded< UniLowerMatrix<MT,SO,DF> > :
public BoolConstant< IsPadded<MT>::value >
1662 template<
typename MT,
bool SO,
bool DF >
1663 struct IsResizable< UniLowerMatrix<MT,SO,DF> > :
public BoolConstant< IsResizable<MT>::value >
1679 template<
typename MT,
bool SO,
bool DF >
1680 struct RemoveAdaptor< UniLowerMatrix<MT,SO,DF> >
1698 template<
typename MT,
bool SO,
bool DF >
1699 struct DerestrictTrait< UniLowerMatrix<MT,SO,DF> >
1717 template<
typename MT,
bool SO1,
bool DF,
typename T,
size_t M,
size_t N,
bool SO2 >
1718 struct AddTrait< UniLowerMatrix<MT,SO1,DF>, StaticMatrix<T,M,N,SO2> >
1720 using Type = AddTrait_< MT, StaticMatrix<T,M,N,SO2> >;
1723 template<
typename T,
size_t M,
size_t N,
bool SO1,
typename MT,
bool SO2,
bool DF >
1724 struct AddTrait< StaticMatrix<T,M,N,SO1>, UniLowerMatrix<MT,SO2,DF> >
1726 using Type = AddTrait_< StaticMatrix<T,M,N,SO1>, MT >;
1729 template<
typename MT,
bool SO1,
bool DF,
typename T,
size_t M,
size_t N,
bool SO2 >
1730 struct AddTrait< UniLowerMatrix<MT,SO1,DF>, HybridMatrix<T,M,N,SO2> >
1732 using Type = AddTrait_< MT, HybridMatrix<T,M,N,SO2> >;
1735 template<
typename T,
size_t M,
size_t N,
bool SO1,
typename MT,
bool SO2,
bool DF >
1736 struct AddTrait< HybridMatrix<T,M,N,SO1>, UniLowerMatrix<MT,SO2,DF> >
1738 using Type = AddTrait_< HybridMatrix<T,M,N,SO1>, MT >;
1741 template<
typename MT,
bool SO1,
bool DF,
typename T,
bool SO2 >
1742 struct AddTrait< UniLowerMatrix<MT,SO1,DF>, DynamicMatrix<T,SO2> >
1744 using Type = AddTrait_< MT, DynamicMatrix<T,SO2> >;
1747 template<
typename T,
bool SO1,
typename MT,
bool SO2,
bool DF >
1748 struct AddTrait< DynamicMatrix<T,SO1>, UniLowerMatrix<MT,SO2,DF> >
1750 using Type = AddTrait_< DynamicMatrix<T,SO1>, MT >;
1753 template<
typename MT,
bool SO1,
bool DF,
typename T,
bool AF,
bool PF,
bool SO2 >
1754 struct AddTrait< UniLowerMatrix<MT,SO1,DF>, CustomMatrix<T,AF,PF,SO2> >
1756 using Type = AddTrait_< MT, CustomMatrix<T,AF,PF,SO2> >;
1759 template<
typename T,
bool AF,
bool PF,
bool SO1,
typename MT,
bool SO2,
bool DF >
1760 struct AddTrait< CustomMatrix<T,AF,PF,SO1>, UniLowerMatrix<MT,SO2,DF> >
1762 using Type = AddTrait_< CustomMatrix<T,AF,PF,SO1>, MT >;
1765 template<
typename MT,
bool SO1,
bool DF,
typename T,
bool SO2 >
1766 struct AddTrait< UniLowerMatrix<MT,SO1,DF>, CompressedMatrix<T,SO2> >
1768 using Type = AddTrait_< MT, CompressedMatrix<T,SO2> >;
1771 template<
typename T,
bool SO1,
typename MT,
bool SO2,
bool DF >
1772 struct AddTrait< CompressedMatrix<T,SO1>, UniLowerMatrix<MT,SO2,DF> >
1774 using Type = AddTrait_< CompressedMatrix<T,SO1>, MT >;
1777 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2,
bool NF >
1778 struct AddTrait< UniLowerMatrix<MT1,SO1,DF1>, SymmetricMatrix<MT2,SO2,DF2,NF> >
1780 using Type = AddTrait_<MT1,MT2>;
1783 template<
typename MT1,
bool SO1,
bool DF1,
bool NF,
typename MT2,
bool SO2,
bool DF2 >
1784 struct AddTrait< SymmetricMatrix<MT1,SO1,DF1,NF>, UniLowerMatrix<MT2,SO2,DF2> >
1786 using Type = AddTrait_<MT1,MT2>;
1789 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1790 struct AddTrait< UniLowerMatrix<MT1,SO1,DF1>, HermitianMatrix<MT2,SO2,DF2> >
1792 using Type = AddTrait_<MT1,MT2>;
1795 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1796 struct AddTrait< HermitianMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
1798 using Type = AddTrait_<MT1,MT2>;
1801 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1802 struct AddTrait< UniLowerMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1804 using Type = LowerMatrix< AddTrait_<MT1,MT2> >;
1807 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1808 struct AddTrait< LowerMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
1810 using Type = LowerMatrix< AddTrait_<MT1,MT2> >;
1813 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1814 struct AddTrait< UniLowerMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
1816 using Type = LowerMatrix< AddTrait_<MT1,MT2> >;
1832 template<
typename MT,
bool SO1,
bool DF,
typename T,
size_t M,
size_t N,
bool SO2 >
1833 struct SubTrait< UniLowerMatrix<MT,SO1,DF>, StaticMatrix<T,M,N,SO2> >
1835 using Type = SubTrait_< MT, StaticMatrix<T,M,N,SO2> >;
1838 template<
typename T,
size_t M,
size_t N,
bool SO1,
typename MT,
bool SO2,
bool DF >
1839 struct SubTrait< StaticMatrix<T,M,N,SO1>, UniLowerMatrix<MT,SO2,DF> >
1841 using Type = SubTrait_< StaticMatrix<T,M,N,SO1>, MT >;
1844 template<
typename MT,
bool SO1,
bool DF,
typename T,
size_t M,
size_t N,
bool SO2 >
1845 struct SubTrait< UniLowerMatrix<MT,SO1,DF>, HybridMatrix<T,M,N,SO2> >
1847 using Type = SubTrait_< MT, HybridMatrix<T,M,N,SO2> >;
1850 template<
typename T,
size_t M,
size_t N,
bool SO1,
typename MT,
bool SO2,
bool DF >
1851 struct SubTrait< HybridMatrix<T,M,N,SO1>, UniLowerMatrix<MT,SO2,DF> >
1853 using Type = SubTrait_< HybridMatrix<T,M,N,SO1>, MT >;
1856 template<
typename MT,
bool SO1,
bool DF,
typename T,
bool SO2 >
1857 struct SubTrait< UniLowerMatrix<MT,SO1,DF>, DynamicMatrix<T,SO2> >
1859 using Type = SubTrait_< MT, DynamicMatrix<T,SO2> >;
1862 template<
typename T,
bool SO1,
typename MT,
bool SO2,
bool DF >
1863 struct SubTrait< DynamicMatrix<T,SO1>, UniLowerMatrix<MT,SO2,DF> >
1865 using Type = SubTrait_< DynamicMatrix<T,SO1>, MT >;
1868 template<
typename MT,
bool SO1,
bool DF,
typename T,
bool AF,
bool PF,
bool SO2 >
1869 struct SubTrait< UniLowerMatrix<MT,SO1,DF>, CustomMatrix<T,AF,PF,SO2> >
1871 using Type = SubTrait_< MT, CustomMatrix<T,AF,PF,SO2> >;
1874 template<
typename T,
bool AF,
bool PF,
bool SO1,
typename MT,
bool SO2,
bool DF >
1875 struct SubTrait< CustomMatrix<T,AF,PF,SO1>, UniLowerMatrix<MT,SO2,DF> >
1877 using Type = SubTrait_< CustomMatrix<T,AF,PF,SO1>, MT >;
1880 template<
typename MT,
bool SO1,
bool DF,
typename T,
bool SO2 >
1881 struct SubTrait< UniLowerMatrix<MT,SO1,DF>, CompressedMatrix<T,SO2> >
1883 using Type = SubTrait_< MT, CompressedMatrix<T,SO2> >;
1886 template<
typename T,
bool SO1,
typename MT,
bool SO2,
bool DF >
1887 struct SubTrait< CompressedMatrix<T,SO1>, UniLowerMatrix<MT,SO2,DF> >
1889 using Type = SubTrait_< CompressedMatrix<T,SO1>, MT >;
1892 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2,
bool NF >
1893 struct SubTrait< UniLowerMatrix<MT1,SO1,DF1>, SymmetricMatrix<MT2,SO2,DF2,NF> >
1895 using Type = SubTrait_<MT1,MT2>;
1898 template<
typename MT1,
bool SO1,
bool DF1,
bool NF,
typename MT2,
bool SO2,
bool DF2 >
1899 struct SubTrait< SymmetricMatrix<MT1,SO1,DF1,NF>, UniLowerMatrix<MT2,SO2,DF2> >
1901 using Type = SubTrait_<MT1,MT2>;
1904 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1905 struct SubTrait< UniLowerMatrix<MT1,SO1,DF1>, HermitianMatrix<MT2,SO2,DF2> >
1907 using Type = SubTrait_<MT1,MT2>;
1910 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1911 struct SubTrait< HermitianMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
1913 using Type = SubTrait_<MT1,MT2>;
1916 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1917 struct SubTrait< UniLowerMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1919 using Type = LowerMatrix< SubTrait_<MT1,MT2> >;
1922 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1923 struct SubTrait< LowerMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
1925 using Type = LowerMatrix< SubTrait_<MT1,MT2> >;
1928 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1929 struct SubTrait< UniLowerMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
1931 using Type = LowerMatrix< SubTrait_<MT1,MT2> >;
1947 template<
typename MT,
bool SO,
bool DF,
typename T >
1948 struct MultTrait< UniLowerMatrix<MT,SO,DF>, T,
EnableIf_< IsNumeric<T> > >
1950 using Type = LowerMatrix< MultTrait_<MT,T> >;
1953 template<
typename T,
typename MT,
bool SO,
bool DF >
1954 struct MultTrait< T, UniLowerMatrix<MT,SO,DF>,
EnableIf_< IsNumeric<T> > >
1956 using Type = LowerMatrix< MultTrait_<T,MT> >;
1959 template<
typename MT,
bool SO,
bool DF,
typename T,
size_t N >
1960 struct MultTrait< UniLowerMatrix<MT,SO,DF>, StaticVector<T,N,false> >
1962 using Type = MultTrait_< MT, StaticVector<T,N,false> >;
1965 template<
typename T,
size_t N,
typename MT,
bool SO,
bool DF >
1966 struct MultTrait< StaticVector<T,N,true>, UniLowerMatrix<MT,SO,DF> >
1968 using Type = MultTrait_< StaticVector<T,N,true>, MT >;
1971 template<
typename MT,
bool SO,
bool DF,
typename T,
size_t N >
1972 struct MultTrait< UniLowerMatrix<MT,SO,DF>, HybridVector<T,N,false> >
1974 using Type = MultTrait_< MT, HybridVector<T,N,false> >;
1977 template<
typename T,
size_t N,
typename MT,
bool SO,
bool DF >
1978 struct MultTrait< HybridVector<T,N,true>, UniLowerMatrix<MT,SO,DF> >
1980 using Type = MultTrait_< HybridVector<T,N,true>, MT >;
1983 template<
typename MT,
bool SO,
bool DF,
typename T >
1984 struct MultTrait< UniLowerMatrix<MT,SO,DF>, DynamicVector<T,false> >
1986 using Type = MultTrait_< MT, DynamicVector<T,false> >;
1989 template<
typename T,
typename MT,
bool SO,
bool DF >
1990 struct MultTrait< DynamicVector<T,true>, UniLowerMatrix<MT,SO,DF> >
1992 using Type = MultTrait_< DynamicVector<T,true>, MT >;
1995 template<
typename MT,
bool SO,
bool DF,
typename T,
bool AF,
bool PF >
1996 struct MultTrait< UniLowerMatrix<MT,SO,DF>, CustomVector<T,AF,PF,false> >
1998 using Type = MultTrait_< MT, CustomVector<T,AF,PF,false> >;
2001 template<
typename T,
bool AF,
bool PF,
typename MT,
bool SO,
bool DF >
2002 struct MultTrait< CustomVector<T,AF,PF,true>, UniLowerMatrix<MT,SO,DF> >
2004 using Type = MultTrait_< CustomVector<T,AF,PF,true>, MT >;
2007 template<
typename MT,
bool SO,
bool DF,
typename T >
2008 struct MultTrait< UniLowerMatrix<MT,SO,DF>, CompressedVector<T,false> >
2010 using Type = MultTrait_< MT, CompressedVector<T,false> >;
2013 template<
typename T,
typename MT,
bool SO,
bool DF >
2014 struct MultTrait< CompressedVector<T,true>, UniLowerMatrix<MT,SO,DF> >
2016 using Type = MultTrait_< CompressedVector<T,true>, MT >;
2019 template<
typename MT,
bool SO1,
bool DF,
typename T,
size_t M,
size_t N,
bool SO2 >
2020 struct MultTrait< UniLowerMatrix<MT,SO1,DF>, StaticMatrix<T,M,N,SO2> >
2022 using Type = MultTrait_< MT, StaticMatrix<T,M,N,SO2> >;
2025 template<
typename T,
size_t M,
size_t N,
bool SO1,
typename MT,
bool SO2,
bool DF >
2026 struct MultTrait< StaticMatrix<T,M,N,SO1>, UniLowerMatrix<MT,SO2,DF> >
2028 using Type = MultTrait_< StaticMatrix<T,M,N,SO1>, MT >;
2031 template<
typename MT,
bool SO1,
bool DF,
typename T,
size_t M,
size_t N,
bool SO2 >
2032 struct MultTrait< UniLowerMatrix<MT,SO1,DF>, HybridMatrix<T,M,N,SO2> >
2034 using Type = MultTrait_< MT, HybridMatrix<T,M,N,SO2> >;
2037 template<
typename T,
size_t M,
size_t N,
bool SO1,
typename MT,
bool SO2,
bool DF >
2038 struct MultTrait< HybridMatrix<T,M,N,SO1>, UniLowerMatrix<MT,SO2,DF> >
2040 using Type = MultTrait_< HybridMatrix<T,M,N,SO1>, MT >;
2043 template<
typename MT,
bool SO1,
bool DF,
typename T,
bool SO2 >
2044 struct MultTrait< UniLowerMatrix<MT,SO1,DF>, DynamicMatrix<T,SO2> >
2046 using Type = MultTrait_< MT, DynamicMatrix<T,SO2> >;
2049 template<
typename T,
bool SO1,
typename MT,
bool SO2,
bool DF >
2050 struct MultTrait< DynamicMatrix<T,SO1>, UniLowerMatrix<MT,SO2,DF> >
2052 using Type = MultTrait_< DynamicMatrix<T,SO1>, MT >;
2055 template<
typename MT,
bool SO1,
bool DF,
typename T,
bool AF,
bool PF,
bool SO2 >
2056 struct MultTrait< UniLowerMatrix<MT,SO1,DF>, CustomMatrix<T,AF,PF,SO2> >
2058 using Type = MultTrait_< MT, CustomMatrix<T,AF,PF,SO2> >;
2061 template<
typename T,
bool AF,
bool PF,
bool SO1,
typename MT,
bool SO2,
bool DF >
2062 struct MultTrait< CustomMatrix<T,AF,PF,SO1>, UniLowerMatrix<MT,SO2,DF> >
2064 using Type = MultTrait_< CustomMatrix<T,AF,PF,SO1>, MT >;
2067 template<
typename MT,
bool SO1,
bool DF,
typename T,
bool SO2 >
2068 struct MultTrait< UniLowerMatrix<MT,SO1,DF>, CompressedMatrix<T,SO2> >
2070 using Type = MultTrait_< MT, CompressedMatrix<T,SO2> >;
2073 template<
typename T,
bool SO1,
typename MT,
bool SO2,
bool DF >
2074 struct MultTrait< CompressedMatrix<T,SO1>, UniLowerMatrix<MT,SO2,DF> >
2076 using Type = MultTrait_< CompressedMatrix<T,SO1>, MT >;
2079 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2,
bool NF >
2080 struct MultTrait< UniLowerMatrix<MT1,SO1,DF1>, SymmetricMatrix<MT2,SO2,DF2,NF> >
2082 using Type = MultTrait_<MT1,MT2>;
2085 template<
typename MT1,
bool SO1,
bool DF1,
bool NF,
typename MT2,
bool SO2,
bool DF2 >
2086 struct MultTrait< SymmetricMatrix<MT1,SO1,DF1,NF>, UniLowerMatrix<MT2,SO2,DF2> >
2088 using Type = MultTrait_<MT1,MT2>;
2091 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
2092 struct MultTrait< UniLowerMatrix<MT1,SO1,DF1>, HermitianMatrix<MT2,SO2,DF2> >
2094 using Type = MultTrait_<MT1,MT2>;
2097 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
2098 struct MultTrait< HermitianMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
2100 using Type = MultTrait_<MT1,MT2>;
2103 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
2104 struct MultTrait< UniLowerMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
2106 using Type = LowerMatrix< MultTrait_<MT1,MT2> >;
2109 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
2110 struct MultTrait< LowerMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
2112 using Type = LowerMatrix< MultTrait_<MT1,MT2> >;
2115 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
2116 struct MultTrait< UniLowerMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
2118 using Type = UniLowerMatrix< MultTrait_<MT1,MT2> >;
2134 template<
typename MT,
bool SO,
bool DF,
typename T >
2135 struct DivTrait< UniLowerMatrix<MT,SO,DF>, T,
EnableIf_< IsNumeric<T> > >
2137 using Type = LowerMatrix< DivTrait_<MT,T> >;
2153 template<
typename MT,
bool SO,
bool DF,
typename ET >
2154 struct ForEachTrait< UniLowerMatrix<MT,SO,DF>, Pow<ET> >
2156 using Type = UniLowerMatrix< ForEachTrait_< MT, Pow<ET> > >;
2172 template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
2173 struct MathTrait< UniLowerMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
2175 using HighType = UniLowerMatrix< typename MathTrait<MT1,MT2>::HighType >;
2176 using LowType = UniLowerMatrix< typename MathTrait<MT1,MT2>::LowType >;
2192 template<
typename MT,
bool SO,
bool DF >
2193 struct SubmatrixTrait< UniLowerMatrix<MT,SO,DF> >
2195 using Type = SubmatrixTrait_<MT>;
2211 template<
typename MT,
bool SO,
bool DF >
2212 struct RowTrait< UniLowerMatrix<MT,SO,DF> >
2214 using Type = RowTrait_<MT>;
2230 template<
typename MT,
bool SO,
bool DF >
2231 struct ColumnTrait< UniLowerMatrix<MT,SO,DF> >
2233 using Type = ColumnTrait_<MT>;
BoolConstant< false > FalseType
Type/value traits base class.The FalseType class is used as base class for type traits and value trai...
Definition: FalseType.h:61
bool isOne(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is 1.
Definition: DiagonalProxy.h:635
Header file for the implementation of the base template of the UniLowerMatrix.
Header file for auxiliary alias declarations.
Header file for mathematical functions.
Header file for the Rows type trait.
Header file for the UNUSED_PARAMETER function template.
Header file for the subtraction trait.
Header file for the row 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
Header file for the dense matrix inversion flags.
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
Flag for the inversion of a diagonal matrix.
Definition: InversionFlag.h:115
void reset(const DiagonalProxy< MT > &proxy)
Resetting the represented element to the default initial values.
Definition: DiagonalProxy.h:533
Flag for the inversion of a general matrix (same as byLU).
Definition: InversionFlag.h:108
Flag for the inversion of a upper unitriangular matrix.
Definition: InversionFlag.h:114
const ElementType_< MT > min(const DenseMatrix< MT, SO > &dm)
Returns the smallest element of the dense matrix.
Definition: DenseMatrix.h:1669
#define BLAZE_CONSTRAINT_MUST_NOT_BE_UNITRIANGULAR_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a lower or upper unitriangular matrix ty...
Definition: UniTriangular.h:81
BoolConstant< true > TrueType
Type traits base class.The TrueType class is used as base class for type traits and value traits that...
Definition: TrueType.h:61
Flag for the inversion of a upper triangular matrix.
Definition: InversionFlag.h:113
Constraint on the data type.
Header file for the IsUniLower type trait.
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
bool isDefault(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is in default state.
Definition: DiagonalProxy.h:573
Constraint on the data type.
Header file for the IsSquare type trait.
void invert(const HermitianProxy< MT > &proxy)
In-place inversion of the represented element.
Definition: HermitianProxy.h:741
Constraint on the data type.
Flag for the LU-based matrix inversion.
Definition: InversionFlag.h:103
Header file for the multiplication trait.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
UniLowerMatrix specialization for dense matrices.
Header file for all forward declarations of the math module.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2647
void lu(const DenseMatrix< MT1, SO1 > &A, DenseMatrix< MT2, SO1 > &L, DenseMatrix< MT3, SO1 > &U, Matrix< MT4, SO2 > &P)
LU decomposition of the given dense matrix.
Definition: LU.h:219
Header file for the Columns type trait.
Header file for the implementation of a fixed-size matrix.
Header file for the IsAligned type trait.
BLAZE_ALWAYS_INLINE size_t columns(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of columns of the matrix.
Definition: Matrix.h:330
#define BLAZE_CONSTRAINT_MUST_NOT_BE_UPPER_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a upper triangular matrix type...
Definition: Upper.h:81
UniLowerMatrix specialization for sparse matrices.
BLAZE_ALWAYS_INLINE void resize(Matrix< MT, SO > &matrix, size_t rows, size_t columns, bool preserve=true)
Changing the size of the matrix.
Definition: Matrix.h:538
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 RemoveAdaptor type trait.
Constraint on the data type.
Header file for the EnableIf class template.
void clear(const DiagonalProxy< MT > &proxy)
Clearing the represented element.
Definition: DiagonalProxy.h:553
Header file for the IsPadded type trait.
Header file for the IsAdaptor type trait.
Header file for the isOne shim.
InversionFlag
Inversion flag.The InversionFlag type enumeration represents the different types of matrix inversion ...
Definition: InversionFlag.h:101
Header file for the DerestrictTrait class template.
Flag for the inversion of a lower triangular matrix.
Definition: InversionFlag.h:111
Constraint on the data type.
Header file for the IsNumeric type trait.
Header file for the HasConstDataAccess type trait.
Compile time check for resizable data types.This type trait tests whether the given data type is a re...
Definition: IsResizable.h:75
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
#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
Header file for run time assertion macros.
Header file for the addition trait.
Header file for the division trait.
Header file for the submatrix trait.
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_NOT_BE_LOWER_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a lower triangular matrix type...
Definition: Lower.h:81
Header file for the column trait.
Header file for the isDefault shim.
void swap(DiagonalMatrix< MT, SO, DF > &a, DiagonalMatrix< MT, SO, DF > &b) noexcept
Swapping the contents of two matrices.
Definition: DiagonalMatrix.h:258
#define BLAZE_CONSTRAINT_MUST_BE_BLAS_COMPATIBLE_TYPE(T)
Constraint on the data type.In case the given data type T is not a BLAS compatible data type (i...
Definition: BLASCompatible.h:61
Constraint on the data type.
#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
IntegralConstant< bool, B > BoolConstant
Generic wrapper for a compile time constant boolean value.The BoolConstant class template represents ...
Definition: IntegralConstant.h:100
typename EnableIf< Condition, T >::Type EnableIf_
Auxiliary alias declaration for the EnableIf class template.The EnableIf_ alias declaration provides ...
Definition: EnableIf.h:223
Header file for the mathematical trait.
BLAZE_ALWAYS_INLINE size_t rows(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of rows of the matrix.
Definition: Matrix.h:314
Header file for the implementation of the base template of the LowerMatrix.
Header file for the for-each trait.
Header file for the IntegralConstant class template.
Matrix adapter for lower unitriangular matrices.
Definition: Forward.h:53
bool isIntact(const DiagonalMatrix< MT, SO, DF > &m)
Returns whether the invariants of the given diagonal matrix are intact.
Definition: DiagonalMatrix.h:240
#define BLAZE_CONSTRAINT_MUST_NOT_BE_HERMITIAN_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is an Hermitian matrix type, a compilation error is created.
Definition: Hermitian.h:79
void UNUSED_PARAMETER(const Args &...)
Suppression of unused parameter warnings.
Definition: Unused.h:81
Flag for the inversion of a lower unitriangular matrix.
Definition: InversionFlag.h:112
Header file for the IsResizable type trait.
Header file for the IsRestricted type trait.
#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 TrueType type/value trait base class.
bool isIdentity(const DenseMatrix< MT, SO > &dm)
Checks if the give dense matrix is an identity matrix.
Definition: DenseMatrix.h:1593