34 std::vector<Real> alphar(Nl);
36 Real zerozero =
A(0, 0);
44 std::vector<Real> alphar(Nl);
46 Real zerozero =
A(0, 0);
60 std::vector<Real>& ev)
66 int Nl = eigenvals.size();
68 bool found_any_eigenvalue =
false;
69 std::vector<std::pair<Real, int>> mappedEigenvalues(Nl);
70 for (
int i = 0; i < Nl; i++)
72 Real evi(eigenvals[i]);
73 if ((evi < zerozero) && (evi > (zerozero - 1e2)))
75 mappedEigenvalues[i].first = (evi - zerozero + 2.0) * (evi - zerozero + 2.0);
76 mappedEigenvalues[i].second = i;
77 found_any_eigenvalue =
true;
81 mappedEigenvalues[i].first = std::numeric_limits<Real>::max();
82 mappedEigenvalues[i].second = i;
90 if (!found_any_eigenvalue)
92 app_log() <<
"No eigenvalues passed initial filter. Trying broader 100 a.u. filter" << std::endl;
94 bool found_higher_eigenvalue;
95 for (
int i = 0; i < Nl; i++)
97 Real evi(eigenvals[i]);
98 if ((evi < zerozero + 1e2) && (evi > (zerozero - 1e2)))
100 mappedEigenvalues[i].first = (evi - zerozero + 2.0) * (evi - zerozero + 2.0);
101 mappedEigenvalues[i].second = i;
102 found_higher_eigenvalue =
true;
106 mappedEigenvalues[i].first = std::numeric_limits<Real>::max();
107 mappedEigenvalues[i].second = i;
110 if (!found_higher_eigenvalue)
112 app_log() <<
"No eigenvalues passed second filter. Optimization is likely to fail." << std::endl;
115 std::sort(mappedEigenvalues.begin(), mappedEigenvalues.end());
117 for (
int i = 0; i < Nl; i++)
118 ev[i] = eigenvectors(mappedEigenvalues[0].
second, i) / eigenvectors(mappedEigenvalues[0].
second, 0);
119 return eigenvals[mappedEigenvalues[0].second];
127 Real zerozero =
A(0, 0);
130 std::vector<Real> alphar(Nl), alphai(Nl), beta(Nl);
135 std::vector<Real> work(1);
136 LAPACK::geev(&jl, &jr, &Nl,
A.data(), &Nl, &alphar[0], &alphai[0], eigenD.
data(), &Nl, eigenT.
data(), &Nl, &work[0],
138 lwork = int(work[0]);
141 LAPACK::geev(&jl, &jr, &Nl,
A.data(), &Nl, &alphar[0], &alphai[0], eigenD.
data(), &Nl, eigenT.
data(), &Nl, &work[0],
145 APP_ABORT(
"Invalid Matrix Diagonalization Function!");
153 bool found_any_eigenvalue =
false;
154 std::vector<std::pair<Real, int>> mappedEigenvalues(Nl);
155 for (
int i = 0; i < Nl; i++)
158 if ((evi < zerozero) && (evi > (zerozero - 1e2)))
160 mappedEigenvalues[i].first = (evi - zerozero + 2.0) * (evi - zerozero + 2.0);
161 mappedEigenvalues[i].second = i;
162 found_any_eigenvalue =
true;
166 mappedEigenvalues[i].first = std::numeric_limits<Real>::max();
167 mappedEigenvalues[i].second = i;
175 if (!found_any_eigenvalue)
177 app_log() <<
"No eigenvalues passed initial filter. Trying broader 100 a.u. filter" << std::endl;
179 bool found_higher_eigenvalue;
180 for (
int i = 0; i < Nl; i++)
183 if ((evi < zerozero + 1e2) && (evi > (zerozero - 1e2)))
185 mappedEigenvalues[i].first = (evi - zerozero + 2.0) * (evi - zerozero + 2.0);
186 mappedEigenvalues[i].second = i;
187 found_higher_eigenvalue =
true;
191 mappedEigenvalues[i].first = std::numeric_limits<Real>::max();
192 mappedEigenvalues[i].second = i;
195 if (!found_higher_eigenvalue)
197 app_log() <<
"No eigenvalues passed second filter. Optimization is likely to fail." << std::endl;
200 std::sort(mappedEigenvalues.begin(), mappedEigenvalues.end());
202 for (
int i = 0; i < Nl; i++)
203 ev[i] = eigenT(mappedEigenvalues[0].
second, i) / eigenT(mappedEigenvalues[0].
second, 0);
204 return alphar[mappedEigenvalues[0].second];
210 std::vector<int> types;
218 while (i < types.size())
228 int i(types.size() - 1);
244 int first(0), last(0);
251 for (
int i = first; i < last; i++)
252 for (
int j = first; j < last; j++)
253 D += S(i + 1, j + 1) * dP[i + 1] * dP[j + 1];
254 rescale = (1 - xi) * D / ((1 - xi) + xi *
std::sqrt(1 + D));
255 rescale = 1.0 / (1.0 - rescale);
void getNonLinearRange(int &first, int &last, const QMCCostFunctionBase &optTarget) const
helper functions for EinsplineSetBuilder
static void solveGeneralizedEigenvalues(Matrix< Real > &A, Matrix< Real > &B, std::vector< Real > &eigenvals, Matrix< Real > &eigenvectors)
Use generalized eigenvalue solver.
LinearMethod related functions.
static Real getLowestEigenvector_Inv(Matrix< Real > &A, Matrix< Real > &B, std::vector< Real > &ev)
Solve the generalized eigenvalue problem and return a scaled eigenvector corresponding to the selecte...
static void solveGeneralizedEigenvalues_Inv(Matrix< Real > &A, Matrix< Real > &B, std::vector< Real > &eigenvals, Matrix< Real > &eigenvectors)
Solve by explicitly inverting the overlap matrix.
static Real getLowestEigenvector_Gen(Matrix< Real > &A, Matrix< Real > &B, std::vector< Real > &ev)
Solve the generalized eigenvalue problem and return a scaled eigenvector corresponding to the selecte...
void getParameterTypes(std::vector< int > &types) const
Real getLowestEigenvector(Matrix< Real > &A, std::vector< Real > &ev) const
#define APP_ABORT(msg)
Widely used but deprecated fatal error macros from legacy code.
Implements wave-function optimization.
Define determinant operators.
MakeReturn< UnaryNode< FnSqrt, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sqrt(const Vector< T1, C1 > &l)
double B(double x, int k, int i, const std::vector< double > &t)
static Real selectEigenvalue(std::vector< Real > &eigenvals, Matrix< Real > &eigenvectors, Real zerozero, std::vector< Real > &ev)
Select eigenvalue and return corresponding scaled eigenvector.
static void geev(char *jobvl, char *jobvr, int *n, double *a, int *lda, double *alphar, double *alphai, double *vl, int *ldvl, double *vr, int *ldvr, double *work, int *lwork, int *info)
Real getNonLinearRescale(std::vector< Real > &dP, Matrix< Real > &S, const QMCCostFunctionBase &optTarget) const