12#include <Eigen/Eigenvalues>
17template <
typename Scalar>
21template <
typename Scalar>
22template <
typename ScalarLim>
27 int dim = matrix.rows();
32 this->
template subtract_mean<ScalarLim>(matrix, shift, rtol);
35 Eigen::SelfAdjointEigenSolver<Eigen::MatrixX<ScalarLim>> eigensolver;
36 eigensolver.compute(shifted_matrix);
38 return {eigensolver.eigenvectors()
39 .sparseView(1, 0.5 * rtol / std::sqrt(dim))
40 .template cast<Scalar>(),
41 this->add_mean(eigensolver.eigenvalues(), shift)};
44template <
typename Scalar>
48 switch (this->float_type) {
50 return dispatch_eigh<traits::restricted_t<Scalar, FloatType::FLOAT32>>(matrix, rtol);
52 return dispatch_eigh<traits::restricted_t<Scalar, FloatType::FLOAT64>>(matrix, rtol);
54 throw std::invalid_argument(
"Unsupported floating point precision.");
DiagonalizerEigen(FloatType float_type=FloatType::FLOAT64)
EigenSystemH< Scalar > eigh(const Eigen::SparseMatrix< Scalar, Eigen::RowMajor > &matrix, double rtol) const override
Matrix< Type, Dynamic, Dynamic > MatrixX