48 for (std::vector<double>& subvec :
Diis_Bs_) {
49 subvec.erase(subvec.begin() + maxerrorindex);
55 std::vector<double> Bijs;
59 Bijs.push_back(value);
62 Bijs.push_back(errormatrix.cwiseProduct(errormatrix.transpose()).sum());
85 return Eigen::VectorXd();
88 Eigen::MatrixXd B = Eigen::MatrixXd::Zero(size, size);
90 for (
Index i = 0; i < size; ++i) {
91 for (
Index j = 0; j <= i; ++j) {
99 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> es(B);
100 if (es.info() != Eigen::Success) {
102 return Eigen::VectorXd();
105 Eigen::MatrixXd eigenvectors = Eigen::MatrixXd::Zero(size, size);
107 for (
Index i = 0; i < size; ++i) {
108 double norm = es.eigenvectors().col(i).sum();
109 if (std::abs(norm) < 1
e-14) {
110 eigenvectors.col(i) = es.eigenvectors().col(i);
112 eigenvectors.col(i) = es.eigenvectors().col(i) / norm;
116 Eigen::VectorXd errors =
117 (eigenvectors.transpose() * B * eigenvectors).diagonal().cwiseAbs();
119 constexpr double MaxWeight = 10.0;
123 for (
Index i = 0; i < errors.size(); ++i) {
124 errors.minCoeff(&mincoeff);
125 if (std::abs(eigenvectors.col(mincoeff).maxCoeff()) > MaxWeight) {
126 errors[mincoeff] = std::numeric_limits<double>::max();
134 return Eigen::VectorXd();
137 Eigen::VectorXd coeffs = eigenvectors.col(mincoeff);
139 if (coeffs.size() == 0 || std::abs(coeffs[coeffs.size() - 1]) < 0.001) {
141 return Eigen::VectorXd();
151 const Eigen::MatrixXd& errormatrix_beta) {
158 for (std::vector<double>& subvec :
Diis_Bs_) {
159 subvec.erase(subvec.begin() + maxerrorindex);
166 std::vector<double> Bijs;
173 Bijs.push_back(value);
178 errormatrix_alpha.cwiseProduct(errormatrix_alpha.transpose()).sum() +
179 errormatrix_beta.cwiseProduct(errormatrix_beta.transpose()).sum();
181 Bijs.push_back(self);