35#ifndef _BLAZE_MATH_ADAPTORS_STRICTLYLOWERMATRIX_H_
36#define _BLAZE_MATH_ADAPTORS_STRICTLYLOWERMATRIX_H_
114template< RelaxationFlag RF,
typename MT,
bool SO,
bool DF >
115bool isDefault(
const StrictlyLowerMatrix<MT,SO,DF>& m );
117template<
typename MT,
bool SO,
bool DF >
118bool isIntact(
const StrictlyLowerMatrix<MT,SO,DF>& m );
120template<
typename MT,
bool SO,
bool DF >
121void swap( StrictlyLowerMatrix<MT,SO,DF>& a, StrictlyLowerMatrix<MT,SO,DF>& b )
noexcept;
156inline bool isDefault(
const StrictlyLowerMatrix<MT,SO,DF>& m )
159 return m.rows() == 0UL;
160 else return isUpper<RF>( m );
189inline bool isIntact(
const StrictlyLowerMatrix<MT,SO,DF>& m )
207inline void swap( StrictlyLowerMatrix<MT,SO,DF>& a, StrictlyLowerMatrix<MT,SO,DF>& b )
noexcept
234inline bool trySet(
const StrictlyLowerMatrix<MT,SO,DF>& mat,
size_t i,
size_t j,
const ET& value )
270 trySet(
const StrictlyLowerMatrix<MT,SO,DF>& mat,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
279 return ( m == 0UL ) ||
308inline bool tryAdd(
const StrictlyLowerMatrix<MT,SO,DF>& mat,
size_t i,
size_t j,
const ET& value )
310 return trySet( mat, i, j, value );
339 tryAdd(
const StrictlyLowerMatrix<MT,SO,DF>& mat,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
341 return trySet( mat,
row,
column, m, n, value );
368inline bool trySub(
const StrictlyLowerMatrix<MT,SO,DF>& mat,
size_t i,
size_t j,
const ET& value )
370 return trySet( mat, i, j, value );
400 trySub(
const StrictlyLowerMatrix<MT,SO,DF>& mat,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
402 return trySet( mat,
row,
column, m, n, value );
428inline bool tryBitor(
const StrictlyLowerMatrix<MT,SO,DF>& mat,
size_t i,
size_t j,
const ET& value )
430 return trySet( mat, i, j, value );
459 tryBitor(
const StrictlyLowerMatrix<MT,SO,DF>& mat,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
461 return trySet( mat,
row,
column, m, n, value );
487inline bool tryBitxor(
const StrictlyLowerMatrix<MT,SO,DF>& mat,
size_t i,
size_t j,
const ET& value )
489 return tryAdd( mat, i, j, value );
518 tryBitxor(
const StrictlyLowerMatrix<MT,SO,DF>& mat,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
520 return tryAdd( mat,
row,
column, m, n, value );
547inline bool tryAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
548 const DenseVector<VT,false>& rhs,
size_t row,
size_t column )
561 const size_t iend(
min(
column -
row + 1UL, (*rhs).size() ) );
563 for(
size_t i=0UL; i<iend; ++i ) {
595inline bool tryAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
596 const DenseVector<VT,true>& rhs,
size_t row,
size_t column )
608 for(
size_t i=ibegin; i<(*rhs).size(); ++i ) {
642inline bool tryAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
const DenseVector<VT,TF>& rhs,
655 for(
size_t i=0UL; i<(*rhs).size(); ++i ) {
688inline bool tryAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
689 const SparseVector<VT,false>& rhs,
size_t row,
size_t column )
702 const auto last( (*rhs).lowerBound(
column -
row + 1UL ) );
704 for(
auto element=(*rhs).begin(); element!=last; ++element ) {
736inline bool tryAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
737 const SparseVector<VT,true>& rhs,
size_t row,
size_t column )
747 const auto last( (*rhs).end() );
750 for( ; element!=last; ++element ) {
784inline bool tryAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
const SparseVector<VT,TF>& rhs,
797 for(
const auto& element : *rhs ) {
826template<
typename MT1
830inline bool tryAssign(
const StrictlyLowerMatrix<MT1,SO,DF>& lhs,
831 const DenseMatrix<MT2,false>& rhs,
size_t row,
size_t column )
842 const size_t M( (*rhs).rows() );
843 const size_t N( (*rhs).columns() );
850 for(
size_t i=0UL; i<iend; ++i )
852 const bool containsDiagonal(
row + i >=
column );
853 const size_t jbegin( ( containsDiagonal )?(
row + i -
column ):( 0UL ) );
855 for(
size_t j=jbegin; j<N; ++j ) {
884template<
typename MT1
888inline bool tryAssign(
const StrictlyLowerMatrix<MT1,SO,DF>& lhs,
889 const DenseMatrix<MT2,true>& rhs,
size_t row,
size_t column )
900 const size_t M( (*rhs).rows() );
901 const size_t N( (*rhs).columns() );
908 for(
size_t j=jbegin; j<N; ++j )
912 for(
size_t i=0UL; i<iend; ++i ) {
941template<
typename MT1
945inline bool tryAssign(
const StrictlyLowerMatrix<MT1,SO,DF>& lhs,
946 const SparseMatrix<MT2,false>& rhs,
size_t row,
size_t column )
957 const size_t M( (*rhs).rows() );
958 const size_t N( (*rhs).columns() );
965 for(
size_t i=0UL; i<iend; ++i )
967 const bool containsDiagonal(
row + i >=
column );
968 const size_t index( ( containsDiagonal )?(
row + i -
column ):( 0UL ) );
970 const auto last( (*rhs).end(i) );
971 auto element( (*rhs).lowerBound( i, index ) );
973 for( ; element!=last; ++element ) {
1002template<
typename MT1
1006inline bool tryAssign(
const StrictlyLowerMatrix<MT1,SO,DF>& lhs,
1007 const SparseMatrix<MT2,true>& rhs,
size_t row,
size_t column )
1018 const size_t M( (*rhs).rows() );
1019 const size_t N( (*rhs).columns() );
1026 for(
size_t j=jbegin; j<N; ++j )
1028 const size_t index(
column + j -
row + 1UL );
1029 const auto last( (*rhs).lowerBound(
min( index, M ), j ) );
1031 for(
auto element=(*rhs).begin(j); element!=last; ++element ) {
1060template<
typename MT
1065inline bool tryAddAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
1066 const Vector<VT,TF>& rhs,
size_t row,
size_t column )
1068 return tryAssign( lhs, *rhs,
row,
column );
1092template<
typename MT
1097inline bool tryAddAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
const Vector<VT,TF>& rhs,
1123template<
typename MT1
1128inline bool tryAddAssign(
const StrictlyLowerMatrix<MT1,SO1,DF>& lhs,
1129 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
1131 return tryAssign( lhs, *rhs,
row,
column );
1154template<
typename MT
1159inline bool trySubAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
1160 const Vector<VT,TF>& rhs,
size_t row,
size_t column )
1162 return tryAssign( lhs, *rhs,
row,
column );
1186template<
typename MT
1191inline bool trySubAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
const Vector<VT,TF>& rhs,
1217template<
typename MT1
1222inline bool trySubAssign(
const StrictlyLowerMatrix<MT1,SO1,DF>& lhs,
1223 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
1225 return tryAssign( lhs, *rhs,
row,
column );
1248template<
typename MT
1253inline bool tryBitorAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
1254 const Vector<VT,TF>& rhs,
size_t row,
size_t column )
1256 return tryAssign( lhs, *rhs,
row,
column );
1279template<
typename MT
1284inline bool tryBitorAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
const Vector<VT,TF>& rhs,
1310template<
typename MT1
1315inline bool tryBitorAssign(
const StrictlyLowerMatrix<MT1,SO1,DF>& lhs,
1316 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
1318 return tryAssign( lhs, *rhs,
row,
column );
1341template<
typename MT
1346inline bool tryBitxorAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
1347 const Vector<VT,TF>& rhs,
size_t row,
size_t column )
1349 return tryAssign( lhs, *rhs,
row,
column );
1372template<
typename MT
1377inline bool tryBitxorAssign(
const StrictlyLowerMatrix<MT,SO,DF>& lhs,
const Vector<VT,TF>& rhs,
1403template<
typename MT1
1408inline bool tryBitxorAssign(
const StrictlyLowerMatrix<MT1,SO1,DF>& lhs,
1409 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
1411 return tryAssign( lhs, *rhs,
row,
column );
1431template<
typename MT
1434inline MT& derestrict( StrictlyLowerMatrix<MT,SO,DF>& m )
1452template<
typename MT,
bool SO,
bool DF >
1453struct Size< StrictlyLowerMatrix<MT,SO,DF>, 0UL >
1454 :
public Size<MT,0UL>
1457template<
typename MT,
bool SO,
bool DF >
1458struct Size< StrictlyLowerMatrix<MT,SO,DF>, 1UL >
1459 :
public Size<MT,1UL>
1475template<
typename MT,
bool SO,
bool DF >
1476struct MaxSize< StrictlyLowerMatrix<MT,SO,DF>, 0UL >
1477 :
public MaxSize<MT,0UL>
1480template<
typename MT,
bool SO,
bool DF >
1481struct MaxSize< StrictlyLowerMatrix<MT,SO,DF>, 1UL >
1482 :
public MaxSize<MT,1UL>
1498template<
typename MT,
bool SO,
bool DF >
1499struct IsSquare< StrictlyLowerMatrix<MT,SO,DF> >
1516template<
typename MT,
bool SO,
bool DF >
1517struct IsUniform< StrictlyLowerMatrix<MT,SO,DF> >
1518 :
public IsUniform<MT>
1534template<
typename MT,
bool SO,
bool DF >
1535struct IsSymmetric< StrictlyLowerMatrix<MT,SO,DF> >
1536 :
public IsUniform<MT>
1552template<
typename MT,
bool SO,
bool DF >
1553struct IsHermitian< StrictlyLowerMatrix<MT,SO,DF> >
1554 :
public IsUniform<MT>
1570template<
typename MT,
bool SO,
bool DF >
1571struct IsStrictlyLower< StrictlyLowerMatrix<MT,SO,DF> >
1588template<
typename MT,
bool SO,
bool DF >
1589struct IsStrictlyUpper< StrictlyLowerMatrix<MT,SO,DF> >
1590 :
public IsUniform<MT>
1606template<
typename MT,
bool SO,
bool DF >
1607struct IsAdaptor< StrictlyLowerMatrix<MT,SO,DF> >
1624template<
typename MT,
bool SO,
bool DF >
1625struct IsRestricted< StrictlyLowerMatrix<MT,SO,DF> >
1642template<
typename MT,
bool SO >
1643struct HasConstDataAccess< StrictlyLowerMatrix<MT,SO,true> >
1660template<
typename MT,
bool SO,
bool DF >
1661struct IsAligned< StrictlyLowerMatrix<MT,SO,DF> >
1662 :
public IsAligned<MT>
1678template<
typename MT,
bool SO,
bool DF >
1679struct IsContiguous< StrictlyLowerMatrix<MT,SO,DF> >
1680 :
public IsContiguous<MT>
1696template<
typename MT,
bool SO,
bool DF >
1697struct IsPadded< StrictlyLowerMatrix<MT,SO,DF> >
1698 :
public IsPadded<MT>
1714template<
typename MT,
bool SO,
bool DF >
1715struct RemoveAdaptor< StrictlyLowerMatrix<MT,SO,DF> >
1733template<
typename T1,
typename T2 >
1734struct AddTraitEval1< T1, T2
1737 ( IsStrictlyLower_v<T1> && IsStrictlyLower_v<T2> ) &&
1738 !( IsZero_v<T1> || IsZero_v<T2> ) > >
1740 using Type = StrictlyLowerMatrix< typename AddTraitEval2<T1,T2>::Type >;
1756template<
typename T1,
typename T2 >
1757struct SubTraitEval1< T1, T2
1760 ( ( IsUniLower_v<T1> && IsUniLower_v<T2> ) ||
1761 ( IsStrictlyLower_v<T1> && IsStrictlyLower_v<T2> ) ) &&
1762 !( IsIdentity_v<T1> && IsIdentity_v<T2> ) &&
1763 !( IsZero_v<T1> || IsZero_v<T2> ) > >
1765 using Type = StrictlyLowerMatrix< typename SubTraitEval2<T1,T2>::Type >;
1781template<
typename T1,
typename T2 >
1782struct SchurTraitEval1< T1, T2
1785 ( ( IsStrictlyLower_v<T1> && !IsUpper_v<T2> ) ||
1786 ( !IsUpper_v<T1> && IsStrictlyLower_v<T2> ) ) &&
1787 !( IsZero_v<T1> || IsZero_v<T2> ) > >
1789 using Type = StrictlyLowerMatrix< typename SchurTraitEval2<T1,T2>::Type >;
1805template<
typename T1,
typename T2 >
1806struct MultTraitEval1< T1, T2
1809 ( IsStrictlyLower_v<T1> && !IsUniform_v<T1> ) > >
1811 using Type = StrictlyLowerMatrix< typename MultTraitEval2<T1,T2>::Type >;
1814template<
typename T1,
typename T2 >
1815struct MultTraitEval1< T1, T2
1818 ( IsStrictlyLower_v<T2> && !IsUniform_v<T2> ) > >
1820 using Type = StrictlyLowerMatrix< typename MultTraitEval2<T1,T2>::Type >;
1823template<
typename T1,
typename T2 >
1824struct MultTraitEval1< T1, T2
1827 ( ( IsStrictlyLower_v<T1> && IsLower_v<T2> ) ||
1828 ( IsLower_v<T1> && IsStrictlyLower_v<T2> ) ) &&
1829 !( IsIdentity_v<T1> || IsIdentity_v<T2> ) &&
1830 !( IsZero_v<T1> || IsZero_v<T2> ) > >
1832 using Type = StrictlyLowerMatrix< typename MultTraitEval2<T1,T2>::Type >;
1848template<
typename T1,
typename T2 >
1849struct KronTraitEval1< T1, T2
1852 ( ( IsStrictlyLower_v<T1> ) ||
1853 ( IsLower_v<T1> && IsStrictlyLower_v<T2> ) ) &&
1854 !( IsZero_v<T1> || IsZero_v<T2> ) > >
1856 using Type = StrictlyLowerMatrix< typename KronTraitEval2<T1,T2>::Type >;
1872template<
typename T1,
typename T2 >
1873struct DivTraitEval1< T1, T2
1876 using Type = StrictlyLowerMatrix< typename DivTraitEval2<T1,T2>::Type >;
1892template<
typename T,
typename OP >
1893struct UnaryMapTraitEval1< T, OP
1895 !YieldsZero_v<OP,T> > >
1897 using Type = StrictlyLowerMatrix< typename UnaryMapTraitEval2<T,OP>::Type, StorageOrder_v<T> >;
1905template<
typename T1,
typename T2,
typename OP >
1906struct BinaryMapTraitEval1< T1, T2, OP
1908 !YieldsDiagonal_v<OP,T1,T2> > >
1910 using Type = StrictlyLowerMatrix< typename BinaryMapTraitEval2<T1,T2,OP>::Type >;
1926template<
typename MT,
bool SO,
bool DF >
1927struct DeclSymTrait< StrictlyLowerMatrix<MT,SO,DF> >
1929 using Type = ZeroMatrix< typename MT::ElementType, SO >;
1945template<
typename MT,
bool SO,
bool DF >
1946struct DeclHermTrait< StrictlyLowerMatrix<MT,SO,DF> >
1948 using Type = ZeroMatrix< typename MT::ElementType, SO >;
1964template<
typename MT,
bool SO,
bool DF >
1965struct DeclLowTrait< StrictlyLowerMatrix<MT,SO,DF> >
1967 using Type = StrictlyLowerMatrix<MT,SO,DF>;
1983template<
typename MT,
bool SO,
bool DF >
1984struct DeclUniLowTrait< StrictlyLowerMatrix<MT,SO,DF> >
1986 using Type = INVALID_TYPE;
2002template<
typename MT,
bool SO,
bool DF >
2003struct DeclStrLowTrait< StrictlyLowerMatrix<MT,SO,DF> >
2005 using Type = StrictlyLowerMatrix<MT,SO,DF>;
2021template<
typename MT,
bool SO,
bool DF >
2022struct DeclUppTrait< StrictlyLowerMatrix<MT,SO,DF> >
2024 using Type = ZeroMatrix< typename MT::ElementType, SO >;
2040template<
typename MT,
bool SO,
bool DF >
2041struct DeclUniUppTrait< StrictlyLowerMatrix<MT,SO,DF> >
2043 using Type = INVALID_TYPE;
2059template<
typename MT,
bool SO,
bool DF >
2060struct DeclStrUppTrait< StrictlyLowerMatrix<MT,SO,DF> >
2062 using Type = ZeroMatrix< typename MT::ElementType, SO >;
2078template<
typename MT,
bool SO,
bool DF >
2079struct DeclDiagTrait< StrictlyLowerMatrix<MT,SO,DF> >
2081 using Type = ZeroMatrix< typename MT::ElementType, SO >;
2097template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
2098struct HighType< StrictlyLowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
2100 using Type = StrictlyLowerMatrix< typename HighType<MT1,MT2>::Type >;
2116template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
2117struct LowType< StrictlyLowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
2119 using Type = StrictlyLowerMatrix< typename LowType<MT1,MT2>::Type >;
2135template<
typename MT,
size_t I,
size_t N >
2136struct SubmatrixTraitEval1< MT, I, I, N, N
2138 IsStrictlyLower_v<MT> &&
2141 using Type = StrictlyLowerMatrix< typename SubmatrixTraitEval2<MT,I,I,N,N>::Type >;
Header file for the addition trait.
Header file for run time assertion macros.
Header file for the decldiag trait.
Header file for the declherm trait.
Header file for the decllow trait.
Header file for the declstrlow trait.
Header file for the declstrupp trait.
Header file for the declsym trait.
Header file for the declunilow trait.
Header file for the decluniupp trait.
Header file for the declupp trait.
Header file for the division trait.
Header file for the EnableIf class template.
Header file for the HasConstDataAccess type trait.
Header file for the HighType type trait.
Header file for the IntegralConstant class template.
Utility type for generic codes.
Header file for the IsAdaptor type trait.
Header file for the IsAligned type trait.
Header file for the IsContiguous type trait.
Header file for the isDefault shim.
Header file for the IsHermitian type trait.
Header file for the IsIdentity type trait.
Header file for the IsLower type trait.
Header file for the IsMatrix type trait.
Header file for the IsPadded type trait.
Header file for the IsRestricted type trait.
Header file for the IsScalar type trait.
Header file for the IsSquare type trait.
Header file for the IsStrictlyLower type trait.
Header file for the IsStrictlyUpper type trait.
Header file for the IsSymmetric type trait.
Header file for the IsUniLower type trait.
Header file for the IsUpper type trait.
Header file for the Kron product trait.
Header file for the LowType type trait.
Header file for the map trait.
Header file for the MaxSize type trait.
Header file for the MAYBE_UNUSED function template.
Header file for the multiplication trait.
Header file for the relaxation flag enumeration.
Header file for the RemoveAdaptor type trait.
Header file for the Schur product trait.
Header file for the subtraction trait.
Header file for the submatrix trait.
Header file for the YieldsDiagonal type trait.
Header file for the YieldsStrictlyLower type trait.
Header file for the YieldsZero type trait.
Header file for the implementation of the base template of the StrictlyLowerMatrix.
StrictlyLowerMatrix specialization for dense matrices.
StrictlyLowerMatrix specialization for sparse matrices.
Pointer difference type of the Blaze library.
Constraint on the data type.
decltype(auto) band(Matrix< MT, SO > &matrix, RBAs... args)
Creating a view on a specific band of the given matrix.
Definition: Band.h:140
decltype(auto) column(Matrix< MT, SO > &matrix, RCAs... args)
Creating a view on a specific column of the given matrix.
Definition: Column.h:137
decltype(auto) min(const DenseMatrix< MT1, SO1 > &lhs, const DenseMatrix< MT2, SO2 > &rhs)
Computes the componentwise minimum of the dense matrices lhs and rhs.
Definition: DMatDMatMapExpr.h:1339
bool isIntact(const DiagonalMatrix< MT, SO, DF > &m)
Returns whether the invariants of the given diagonal matrix are intact.
Definition: DiagonalMatrix.h:207
void swap(DiagonalMatrix< MT, SO, DF > &a, DiagonalMatrix< MT, SO, DF > &b) noexcept
Swapping the contents of two matrices.
Definition: DiagonalMatrix.h:225
bool isDefault(const DiagonalMatrix< MT, SO, DF > &m)
Returns whether the given diagonal matrix is in default state.
Definition: DiagonalMatrix.h:169
#define BLAZE_CONSTRAINT_MUST_NOT_REQUIRE_EVALUATION(T)
Constraint on the data type.
Definition: RequiresEvaluation.h:81
constexpr bool YieldsStrictlyLower_v
Auxiliary variable template for the YieldsStrictlyLower type trait.
Definition: YieldsStrictlyLower.h:124
constexpr bool IsScalar_v
Auxiliary variable template for the IsScalar type trait.
Definition: IsScalar.h:104
constexpr bool IsStrictlyLower_v
Auxiliary variable template for the IsStrictlyLower type trait.
Definition: IsStrictlyLower.h:173
constexpr ptrdiff_t DefaultSize_v
Default size of the Size type trait.
Definition: Size.h:72
constexpr bool IsMatrix_v
Auxiliary variable template for the IsMatrix type trait.
Definition: IsMatrix.h:124
RelaxationFlag
Relaxation flag for strict or relaxed semantics.
Definition: RelaxationFlag.h:66
constexpr Infinity inf
Global Infinity instance.
Definition: Infinity.h:1080
decltype(auto) row(Matrix< MT, SO > &, RRAs...)
Creating a view on a specific row of the given matrix.
Definition: Row.h:137
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.
Definition: Assert.h:101
#define BLAZE_ALWAYS_INLINE
Platform dependent setup of an enforced inline keyword.
Definition: Inline.h:85
BoolConstant< true > TrueType
Type traits base class.
Definition: IntegralConstant.h:132
typename EnableIf< Condition, T >::Type EnableIf_t
Auxiliary type for the EnableIf class template.
Definition: EnableIf.h:138
constexpr void MAYBE_UNUSED(const Args &...)
Suppression of unused parameter warnings.
Definition: MaybeUnused.h:81
Header file for all forward declarations of the math module.
Header file for the Size type trait.
Header file for the StorageOrder type trait.
Header file for the IsZero type trait.
Header file for the generic min algorithm.