35#ifndef _BLAZE_MATH_ADAPTORS_HERMITIANMATRIX_H_
36#define _BLAZE_MATH_ADAPTORS_HERMITIANMATRIX_H_
121template< RelaxationFlag RF,
typename MT,
bool SO,
bool DF >
122bool isDefault(
const HermitianMatrix<MT,SO,DF>& m );
124template<
typename MT,
bool SO,
bool DF >
125bool isIntact(
const HermitianMatrix<MT,SO,DF>& m );
127template<
typename MT,
bool SO,
bool DF >
128void swap( HermitianMatrix<MT,SO,DF>& a, HermitianMatrix<MT,SO,DF>& b )
noexcept;
162inline bool isDefault(
const HermitianMatrix<MT,SO,DF>& m )
165 return m.rows() == 0UL;
166 else return isStrictlyLower<RF>( m );
195inline bool isIntact(
const HermitianMatrix<MT,SO,DF>& m )
213inline void swap( HermitianMatrix<MT,SO,DF>& a, HermitianMatrix<MT,SO,DF>& b )
noexcept
246inline void invert( HermitianMatrix<MT,SO,true>& m )
264 m.matrix_ = std::move( tmp );
292inline bool trySet(
const HermitianMatrix<MT,SO,DF>& mat,
size_t i,
size_t j,
const ET& value )
299 return ( i != j ||
isReal( value ) );
328 trySet(
const HermitianMatrix<MT,SO,DF>& mat,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
337 return ( m == 0UL ) ||
367inline bool tryAdd(
const HermitianMatrix<MT,SO,DF>& mat,
size_t i,
size_t j,
const ET& value )
369 return trySet( mat, i, j, value );
398 tryAdd(
const HermitianMatrix<MT,SO,DF>& mat,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
400 return trySet( mat,
row,
column, m, n, value );
426inline bool trySub(
const HermitianMatrix<MT,SO,DF>& mat,
size_t i,
size_t j,
const ET& value )
428 return trySet( mat, i, j, value );
457 trySub(
const HermitianMatrix<MT,SO,DF>& mat,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
459 return trySet( mat,
row,
column, m, n, value );
485inline bool tryMult(
const HermitianMatrix<MT,SO,DF>& mat,
size_t i,
size_t j,
const ET& value )
487 return trySet( mat, i, j, value );
516 tryMult(
const HermitianMatrix<MT,SO,DF>& mat,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
518 return trySet( mat,
row,
column, m, n, value );
544inline bool tryDiv(
const HermitianMatrix<MT,SO,DF>& mat,
size_t i,
size_t j,
const ET& value )
546 return trySet( mat, i, j, value );
575 tryDiv(
const HermitianMatrix<MT,SO,DF>& mat,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
577 return trySet( mat,
row,
column, m, n, value );
603inline bool tryAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
604 const Vector<VT,false>& rhs,
size_t row,
size_t column )
614 using ET = ElementType_t< HermitianMatrix<MT,SO,DF> >;
616 return ( IsBuiltin_v<ET> ||
647inline bool tryAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
648 const Vector<VT,true>& rhs,
size_t row,
size_t column )
658 using ET = ElementType_t< HermitianMatrix<MT,SO,DF> >;
660 return ( IsBuiltin_v<ET> ||
694inline bool tryAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
const DenseVector<VT,TF>& rhs,
707 for(
size_t i=0UL; i<(*rhs).size(); ++i ) {
708 if( !
isReal( (*rhs)[i] ) )
742inline bool tryAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
const SparseVector<VT,TF>& rhs,
755 for(
const auto& element : *rhs ) {
756 if( !
isReal( element.value() ) )
783template<
typename MT1
788inline bool tryAssign(
const HermitianMatrix<MT1,SO1,DF>& lhs,
789 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
800 const size_t M( (*rhs).rows() );
801 const size_t N( (*rhs).columns() );
812 const size_t subrow( lower ? 0UL :
column -
row );
813 const size_t subcol( lower ?
row -
column : 0UL );
842inline bool tryAddAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
843 const Vector<VT,TF>& rhs,
size_t row,
size_t column )
845 return tryAssign( lhs, *rhs,
row,
column );
874inline bool tryAddAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
const Vector<VT,TF>& rhs,
899template<
typename MT1
904inline bool tryAddAssign(
const HermitianMatrix<MT1,SO1,DF>& lhs,
905 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
907 return tryAssign( lhs, *rhs,
row,
column );
935inline bool trySubAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
936 const Vector<VT,TF>& rhs,
size_t row,
size_t column )
938 return tryAssign( lhs, *rhs,
row,
column );
967inline bool trySubAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
const Vector<VT,TF>& rhs,
993template<
typename MT1
998inline bool trySubAssign(
const HermitianMatrix<MT1,SO1,DF>& lhs,
999 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
1001 return tryAssign( lhs, *rhs,
row,
column );
1024template<
typename MT
1029inline bool tryMultAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
1030 const Vector<VT,TF>& rhs,
size_t row,
size_t column )
1032 return tryAssign( lhs, *rhs,
row,
column );
1056template<
typename MT
1061inline bool tryMultAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
const Vector<VT,TF>& rhs,
1087template<
typename MT1
1092inline bool trySchurAssign(
const HermitianMatrix<MT1,SO1,DF>& lhs,
1093 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
1095 return tryAssign( lhs, *rhs,
row,
column );
1117template<
typename MT
1122inline bool tryDivAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
1123 const Vector<VT,TF>& rhs,
size_t row,
size_t column )
1125 return tryAssign( lhs, *rhs,
row,
column );
1149template<
typename MT
1154inline bool tryDivAssign(
const HermitianMatrix<MT,SO,DF>& lhs,
const Vector<VT,TF>& rhs,
1173template<
typename MT,
bool SO,
bool DF >
1174struct Size< HermitianMatrix<MT,SO,DF>, 0UL >
1175 :
public Size<MT,0UL>
1178template<
typename MT,
bool SO,
bool DF >
1179struct Size< HermitianMatrix<MT,SO,DF>, 1UL >
1180 :
public Size<MT,1UL>
1196template<
typename MT,
bool SO,
bool DF >
1197struct MaxSize< HermitianMatrix<MT,SO,DF>, 0UL >
1198 :
public MaxSize<MT,0UL>
1201template<
typename MT,
bool SO,
bool DF >
1202struct MaxSize< HermitianMatrix<MT,SO,DF>, 1UL >
1203 :
public MaxSize<MT,1UL>
1219template<
typename MT,
bool SO,
bool DF >
1220struct IsSquare< HermitianMatrix<MT,SO,DF> >
1237template<
typename MT,
bool SO,
bool DF >
1238struct IsUniform< HermitianMatrix<MT,SO,DF> >
1239 :
public IsUniform<MT>
1255template<
typename MT,
bool SO,
bool DF >
1256struct IsSymmetric< HermitianMatrix<MT,SO,DF> >
1257 :
public IsBuiltin< ElementType_t<MT> >
1273template<
typename MT,
bool SO,
bool DF >
1274struct IsHermitian< HermitianMatrix<MT,SO,DF> >
1291template<
typename MT,
bool SO,
bool DF >
1292struct IsStrictlyLower< HermitianMatrix<MT,SO,DF> >
1309template<
typename MT,
bool SO,
bool DF >
1310struct IsStrictlyUpper< HermitianMatrix<MT,SO,DF> >
1327template<
typename MT,
bool SO,
bool DF >
1328struct IsAdaptor< HermitianMatrix<MT,SO,DF> >
1345template<
typename MT,
bool SO,
bool DF >
1346struct IsRestricted< HermitianMatrix<MT,SO,DF> >
1363template<
typename MT,
bool SO >
1364struct HasConstDataAccess< HermitianMatrix<MT,SO,true> >
1381template<
typename MT,
bool SO,
bool DF >
1382struct IsAligned< HermitianMatrix<MT,SO,DF> >
1383 :
public IsAligned<MT>
1399template<
typename MT,
bool SO,
bool DF >
1400struct IsContiguous< HermitianMatrix<MT,SO,DF> >
1401 :
public IsContiguous<MT>
1417template<
typename MT,
bool SO,
bool DF >
1418struct IsPadded< HermitianMatrix<MT,SO,DF> >
1419 :
public IsPadded<MT>
1435template<
typename MT,
bool SO,
bool DF >
1436struct RemoveAdaptor< HermitianMatrix<MT,SO,DF> >
1454template<
typename T1,
typename T2 >
1455struct AddTraitEval1< T1, T2
1458 ( ( IsHermitian_v<T1> && !IsSymmetric_v<T1> &&
1459 IsHermitian_v<T2> && !IsSymmetric_v<T2> ) ||
1460 ( IsHermitian_v<T1> && !IsSymmetric_v<T1> &&
1461 IsSymmetric_v<T2> && !
IsComplex_v< UnderlyingScalar_t<T2> > ) ||
1462 ( IsSymmetric_v<T1> && !IsComplex_v< UnderlyingScalar_t<T1> > &&
1463 IsHermitian_v<T2> && !IsSymmetric_v<T2> ) ) &&
1464 !( IsUniform_v<T1> && IsUniform_v<T2> ) &&
1465 !( IsZero_v<T1> || IsZero_v<T2> ) > >
1467 using Type = HermitianMatrix< typename AddTraitEval2<T1,T2>::Type >;
1483template<
typename T1,
typename T2 >
1484struct SubTraitEval1< T1, T2
1487 ( ( IsHermitian_v<T1> && !IsSymmetric_v<T1> &&
1488 IsHermitian_v<T2> && !IsSymmetric_v<T2> ) ||
1489 ( IsHermitian_v<T1> && !IsSymmetric_v<T1> &&
1490 IsSymmetric_v<T2> && !
IsComplex_v< UnderlyingScalar_t<T2> > ) ||
1491 ( IsSymmetric_v<T1> && !IsComplex_v< UnderlyingScalar_t<T1> > &&
1492 IsHermitian_v<T2> && !IsSymmetric_v<T2> ) ) &&
1493 !( IsZero_v<T1> || IsZero_v<T2> ) > >
1495 using Type = HermitianMatrix< typename SubTraitEval2<T1,T2>::Type >;
1511template<
typename T1,
typename T2 >
1512struct SchurTraitEval1< T1, T2
1515 ( IsHermitian_v<T1> && IsHermitian_v<T2> ) &&
1516 !( IsSymmetric_v<T1> && IsSymmetric_v<T2> ) &&
1517 !( IsDiagonal_v<T1> || IsZero_v<T1> ) &&
1518 !( IsDiagonal_v<T2> || IsZero_v<T2> ) > >
1520 using Type = HermitianMatrix< typename SchurTraitEval2<T1,T2>::Type >;
1536template<
typename T1,
typename T2 >
1537struct MultTraitEval1< T1, T2
1540 ( IsHermitian_v<T1> && !IsSymmetric_v<T1> && !IsUniform_v<T1> ) > >
1542 using Type = HermitianMatrix< typename MultTraitEval2<T1,T2>::Type >;
1545template<
typename T1,
typename T2 >
1546struct MultTraitEval1< T1, T2
1549 ( IsHermitian_v<T2> && !IsSymmetric_v<T2> && !IsUniform_v<T2> ) > >
1551 using Type = HermitianMatrix< typename MultTraitEval2<T1,T2>::Type >;
1567template<
typename T1,
typename T2 >
1568struct KronTraitEval1< T1, T2
1571 ( IsHermitian_v<T1> && IsHermitian_v<T2> ) &&
1572 !( IsSymmetric_v<T1> && IsSymmetric_v<T2> ) &&
1573 !( IsZero_v<T1> || IsZero_v<T2> ) > >
1575 using Type = HermitianMatrix< typename KronTraitEval2<T1,T2>::Type >;
1591template<
typename T1,
typename T2 >
1592struct DivTraitEval1< T1, T2
1595 using Type = HermitianMatrix< typename DivTraitEval2<T1,T2>::Type >;
1611template<
typename T,
typename OP >
1612struct UnaryMapTraitEval1< T, OP
1614 !YieldsSymmetric_v<OP,T> &&
1615 !YieldsIdentity_v<OP,T> > >
1617 using Type = HermitianMatrix< typename UnaryMapTraitEval2<T,OP>::Type, StorageOrder_v<T> >;
1625template<
typename T1,
typename T2,
typename OP >
1626struct BinaryMapTraitEval1< T1, T2, OP
1628 !YieldsSymmetric_v<OP,T1,T2> &&
1629 !YieldsIdentity_v<OP,T1,T2> > >
1631 using Type = HermitianMatrix< typename BinaryMapTraitEval2<T1,T2,OP>::Type >;
1647template<
typename T,
size_t R0,
size_t R1 >
1648struct RepeatTraitEval1< T, R0, R1,
inf
1650 IsHermitian_v<T> && !IsSymmetric_v<T> > >
1652 using Type = HermitianMatrix< typename RepeatTraitEval2<T,R0,R1,inf>::Type >;
1668template<
typename MT,
bool SO,
bool DF >
1669struct DeclSymTrait< HermitianMatrix<MT,SO,DF> >
1671 using Type = SymmetricMatrix<MT,SO,DF>;
1687template<
typename MT,
bool SO,
bool DF >
1688struct DeclHermTrait< HermitianMatrix<MT,SO,DF> >
1690 using Type = HermitianMatrix<MT,SO,DF>;
1706template<
typename MT,
bool SO,
bool DF >
1707struct DeclLowTrait< HermitianMatrix<MT,SO,DF> >
1709 using Type = DiagonalMatrix<MT,SO,DF>;
1725template<
typename MT,
bool SO,
bool DF >
1726struct DeclUniLowTrait< HermitianMatrix<MT,SO,DF> >
1728 using Type = IdentityMatrix< ElementType_t<MT>, SO >;
1744template<
typename MT,
bool SO,
bool DF >
1745struct DeclStrLowTrait< HermitianMatrix<MT,SO,DF> >
1747 using Type = ZeroMatrix< ElementType_t<MT>, SO >;
1763template<
typename MT,
bool SO,
bool DF >
1764struct DeclUppTrait< HermitianMatrix<MT,SO,DF> >
1766 using Type = DiagonalMatrix<MT,SO,DF>;
1782template<
typename MT,
bool SO,
bool DF >
1783struct DeclUniUppTrait< HermitianMatrix<MT,SO,DF> >
1785 using Type = IdentityMatrix< ElementType_t<MT>, SO >;
1801template<
typename MT,
bool SO,
bool DF >
1802struct DeclStrUppTrait< HermitianMatrix<MT,SO,DF> >
1804 using Type = ZeroMatrix< ElementType_t<MT>, SO >;
1820template<
typename MT,
bool SO,
bool DF >
1821struct DeclDiagTrait< HermitianMatrix<MT,SO,DF> >
1823 using Type = DiagonalMatrix<MT,SO,DF>;
1839template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1840struct HighType< HermitianMatrix<MT1,SO1,DF1>, HermitianMatrix<MT2,SO2,DF2> >
1842 using Type = HermitianMatrix< typename HighType<MT1,MT2>::Type >;
1858template<
typename MT1,
bool SO1,
bool DF1,
typename MT2,
bool SO2,
bool DF2 >
1859struct LowType< HermitianMatrix<MT1,SO1,DF1>, HermitianMatrix<MT2,SO2,DF2> >
1861 using Type = HermitianMatrix< typename LowType<MT1,MT2>::Type >;
1877template<
typename MT,
size_t I,
size_t N >
1878struct SubmatrixTraitEval1< MT, I, I, N, N
1880 IsHermitian_v<MT> &&
1881 !IsSymmetric_v<MT> > >
1883 using Type = HermitianMatrix< typename SubmatrixTraitEval2<MT,I,I,N,N>::Type >;
Header file for the addition trait.
Header file for auxiliary alias declarations.
Header file for run time assertion macros.
Constraint on the data type.
Header file for the conjugate shim.
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.
Header file for the dense matrix inversion flags.
Header file for the IsAdaptor type trait.
Header file for the IsAligned type trait.
Header file for the IsBuiltin type trait.
Header file for the IsComplex type trait.
Header file for the IsContiguous type trait.
Header file for the isDefault shim.
Header file for the IsDiagonal type trait.
Header file for the isDivisor shim.
Header file for the IsHermitian type trait.
Header file for the IsMatrix type trait.
Header file for the IsPadded type trait.
Header file for the isReal shim.
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 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 repeat trait.
Header file for the Schur product trait.
Header file for the subtraction trait.
Header file for the submatrix trait.
Header file for the UnderlyingScalar type trait.
Header file for the YieldsHermitian type trait.
Header file for the YieldsIdentity type trait.
Header file for the YieldsSymmetric type trait.
Header file for the implementation of the base template of the HeritianMatrix.
HermitianMatrix specialization for dense matrices.
HermitianMatrix 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 isHermitian(const DenseMatrix< MT, SO > &dm)
Checks if the given dense matrix is Hermitian.
Definition: DenseMatrix.h:1534
bool isIdentity(const DenseMatrix< MT, SO > &dm)
Checks if the given dense matrix is an identity matrix.
Definition: DenseMatrix.h:2561
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
void invert(const HermitianProxy< MT > &proxy)
In-place inversion of the represented element.
Definition: HermitianProxy.h:693
#define BLAZE_CONSTRAINT_MUST_BE_BLAS_COMPATIBLE_TYPE(T)
Constraint on the data type.
Definition: BLASCompatible.h:61
#define BLAZE_CONSTRAINT_MUST_NOT_REQUIRE_EVALUATION(T)
Constraint on the data type.
Definition: RequiresEvaluation.h:81
constexpr bool IsHermitian_v
Auxiliary variable template for the IsHermitian type trait.
Definition: IsHermitian.h:172
constexpr bool IsScalar_v
Auxiliary variable template for the IsScalar type trait.
Definition: IsScalar.h:104
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
constexpr bool YieldsHermitian_v
Auxiliary variable template for the YieldsHermitian type trait.
Definition: YieldsHermitian.h:124
RelaxationFlag
Relaxation flag for strict or relaxed semantics.
Definition: RelaxationFlag.h:66
constexpr Infinity inf
Global Infinity instance.
Definition: Infinity.h:1080
bool isReal(const Proxy< PT, RT > &proxy)
Returns whether the element represents a real number.
Definition: Proxy.h:2297
InversionFlag
Inversion flag.
Definition: InversionFlag.h:102
@ byLDLT
Flag for the Bunch-Kaufman-based inversion for symmetric matrices.
Definition: InversionFlag.h:104
@ asHermitian
Flag for the inversion of a Hermitian matrix (same as byLDLH).
Definition: InversionFlag.h:110
@ asUniLower
Flag for the inversion of a lower unitriangular matrix.
Definition: InversionFlag.h:112
@ asSymmetric
Flag for the inversion of a symmetric matrix (same as byLDLT).
Definition: InversionFlag.h:109
@ asUniUpper
Flag for the inversion of a upper unitriangular matrix.
Definition: InversionFlag.h:114
@ byLDLH
Flag for the Bunch-Kaufman-based inversion for Hermitian matrices.
Definition: InversionFlag.h:105
@ asDiagonal
Flag for the inversion of a diagonal matrix.
Definition: InversionFlag.h:115
@ byLU
Flag for the LU-based matrix inversion.
Definition: InversionFlag.h:103
@ byLLH
Flag for the Cholesky-based inversion for positive-definite matrices.
Definition: InversionFlag.h:106
@ asGeneral
Flag for the inversion of a general matrix (same as byLU).
Definition: InversionFlag.h:108
constexpr size_t size(const Matrix< MT, SO > &matrix) noexcept
Returns the total number of elements of the matrix.
Definition: Matrix.h:676
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
decltype(auto) submatrix(Matrix< MT, SO > &, RSAs...)
Creating a view on a specific submatrix of the given matrix.
Definition: Submatrix.h:181
#define BLAZE_ALWAYS_INLINE
Platform dependent setup of an enforced inline keyword.
Definition: Inline.h:85
constexpr bool IsComplex_v
Auxiliary variable template for the IsComplex type trait.
Definition: IsComplex.h:139
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 the exception macros of the math module.
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.