13#include <spdlog/spdlog.h>
22#if defined(WITH_MKL) || defined(WITH_LAPACKE)
23lapack_int evd(
int matrix_layout,
char jobz,
char uplo, lapack_int n,
float *a, lapack_int lda,
25 return LAPACKE_ssyevd(matrix_layout, jobz, uplo, n, a, lda, w);
28lapack_int evd(
int matrix_layout,
char jobz,
char uplo, lapack_int n,
double *a, lapack_int lda,
30 return LAPACKE_dsyevd(matrix_layout, jobz, uplo, n, a, lda, w);
33lapack_int evd(
int matrix_layout,
char jobz,
char uplo, lapack_int n, lapack_complex_float *a,
34 lapack_int lda,
float *w) {
35 return LAPACKE_cheevd(matrix_layout, jobz, uplo, n, a, lda, w);
38lapack_int evd(
int matrix_layout,
char jobz,
char uplo, lapack_int n, lapack_complex_double *a,
39 lapack_int lda,
double *w) {
40 return LAPACKE_zheevd(matrix_layout, jobz, uplo, n, a, lda, w);
43template <
typename Scalar>
44template <
typename ScalarLim>
45EigenSystemH<Scalar> DiagonalizerLapackeEvd<Scalar>::dispatch_eigh(
46 const Eigen::SparseMatrix<Scalar, Eigen::RowMajor> &matrix,
double rtol)
const {
48 int dim = matrix.rows();
59 lapack_int info = evd(LAPACK_COL_MAJOR, jobz, uplo, dim, evecs.data(), dim, evals.data());
63 throw std::invalid_argument(
64 fmt::format(
"Diagonalization error: Argument {} to the "
65 "lapacke_evd routine had an illegal value (the counting of the "
66 "arguments starts with one). For a documentation of lapacke_evd, see "
67 "https://www.intel.com/content/www/us/en/docs/onemkl/"
68 "developer-reference-c/2025-1/syevd.html.",
71 throw std::runtime_error(fmt::format(
72 "Diagonalization error: The lapacke_evd routine failed with error code {}.", info));
75 return {evecs.sparseView(1, 0.5 * rtol / std::sqrt(dim)).template cast<Scalar>(),
76 this->add_mean(evals, shift)};
79template <
typename Scalar>
81 : DiagonalizerInterface<Scalar>(float_type) {}
83template <
typename Scalar>
85DiagonalizerLapackeEvd<Scalar>::eigh(
const Eigen::SparseMatrix<Scalar, Eigen::RowMajor> &matrix,
87 switch (this->float_type) {
88 case FloatType::FLOAT32:
89 return dispatch_eigh<traits::restricted_t<Scalar, FloatType::FLOAT32>>(matrix, rtol);
90 case FloatType::FLOAT64:
91 return dispatch_eigh<traits::restricted_t<Scalar, FloatType::FLOAT64>>(matrix, rtol);
93 throw std::invalid_argument(
"Unsupported floating point precision.");
99template <
typename Scalar>
102 throw std::runtime_error(
"The lapacke_evd routine is not available in this build. Please use a "
103 "different diagonalizer.");
106template <
typename Scalar>
108 const Eigen::SparseMatrix<Scalar, Eigen::RowMajor> & ,
double )
const {
EigenSystemH< Scalar > eigh(const Eigen::SparseMatrix< Scalar, Eigen::RowMajor > &matrix, double rtol) const override
DiagonalizerLapackeEvd(FloatType float_type=FloatType::FLOAT64)
Matrix< Type, Dynamic, Dynamic > MatrixX
Matrix< Type, Dynamic, 1 > VectorX