24#include <unordered_set>
46 const Eigen::VectorXd& dft_energies)
111 Eigen::MatrixXd
getHQP()
const;
118 std::string states)
const;
121 return rpa_.getRPAInputEnergies();
132 std::unique_ptr<Sigma_base>
sigma_ =
nullptr;
149 std::pair<double, double>
operator()(
double frequency)
const {
150 std::pair<double, double> result;
151 result.first =
value(frequency, EvalStage::Other);
152 result.second =
deriv(frequency);
160 if (!insert_result.second) {
161 ++
stats_.sigma_repeat_calls;
163 ++
stats_.sigma_unique_frequencies;
174 double deriv(
double frequency)
const {
185 std::uint64_t key = 0;
186 static_assert(
sizeof(double) ==
sizeof(std::uint64_t),
187 "Unexpected double size");
188 std::memcpy(&key, &x,
sizeof(
double));
194 case EvalStage::Scan:
195 ++
stats_.sigma_scan_calls;
197 case EvalStage::Refine:
198 ++
stats_.sigma_refine_calls;
200 case EvalStage::Derivative:
201 ++
stats_.sigma_derivative_calls;
203 case EvalStage::Other:
205 ++
stats_.sigma_other_calls;
220 const Eigen::VectorXd& dft_energies)
const;
224 Eigen::VectorXd
SolveQP(
const Eigen::VectorXd& frequencies)
const;
225 boost::optional<double>
SolveQP_Grid(
double intercept0,
double frequency0,
227 QPStats* stats =
nullptr)
const;
230 double intercept0,
double frequency0,
Index gw_level,
double left_limit,
231 double right_limit,
bool allow_rejected_return =
true,
232 QPStats* stats =
nullptr)
const;
235 double intercept0,
double frequency0,
Index gw_level,
double left_limit,
236 double right_limit,
bool allow_rejected_return =
true,
237 QPStats* stats =
nullptr)
const;
240 double intercept0,
double frequency0,
Index gw_level,
double left_limit,
241 double right_limit,
bool allow_rejected_return =
true,
242 QPStats* stats =
nullptr)
const;
245 double frequency0,
Index gw_level,
246 QPStats* stats =
nullptr)
const;
250 QPStats* stats =
nullptr)
const;
251 bool Converged(
const Eigen::VectorXd& e1,
const Eigen::VectorXd& e2,
252 double epsilon)
const;
255 double lowerbound,
double f_lowerbound,
double upperbound,
256 double f_upperbound,
const QPFunc& f,
double reference)
const;
void CountSigmaStage(EvalStage stage) const
double value(double frequency, EvalStage stage=EvalStage::Other) const
double sigma(double frequency, EvalStage stage=EvalStage::Other) const
const Sigma_base & sigma_c_func_
const QPStats & GetStats() const
std::unordered_set< std::uint64_t > seen_frequencies_
static std::uint64_t FrequencyKey(double x)
QPFunc(Index gw_level, const Sigma_base &sigma, double offset)
double deriv(double frequency) const
std::pair< double, double > operator()(double frequency) const
boost::optional< double > SolveQP_Grid_Windowed(double intercept0, double frequency0, Index gw_level, double left_limit, double right_limit, bool allow_rejected_return=true, QPStats *stats=nullptr) const
void PlotSigma(std::string filename, Index steps, double spacing, std::string states) const
Eigen::SelfAdjointEigenSolver< Eigen::MatrixXd > DiagonalizeQPHamiltonian() const
void PrintGWA_Energies() const
boost::optional< QPRootCandidate > RefineQPInterval(double lowerbound, double f_lowerbound, double upperbound, double f_upperbound, const QPFunc &f, double reference) const
bool Converged(const Eigen::VectorXd &e1, const Eigen::VectorXd &e2, double epsilon) const
void configure(const options &opt)
boost::optional< double > SolveQP_Grid_Windowed_Adaptive(double intercept0, double frequency0, Index gw_level, double left_limit, double right_limit, bool allow_rejected_return=true, QPStats *stats=nullptr) const
Eigen::MatrixXd getHQP() const
Eigen::VectorXd SolveQP(const Eigen::VectorXd &frequencies) const
qp_solver::EvalStage EvalStage
boost::optional< double > SolveQP_Grid_Windowed_Dense(double intercept0, double frequency0, Index gw_level, double left_limit, double right_limit, bool allow_rejected_return=true, QPStats *stats=nullptr) const
qp_solver::RootCandidate QPRootCandidate
const Eigen::VectorXd & dft_energies_
std::unique_ptr< Sigma_base > sigma_
Eigen::VectorXd getGWAResults() const
Eigen::VectorXd RPAInputEnergies() const
qp_solver::WindowDiagnostics QPWindowDiagnostics
double CalcHomoLumoShift(Eigen::VectorXd frequencies) const
boost::optional< double > SolveQP_Grid(double intercept0, double frequency0, Index gw_level, QPStats *stats=nullptr) const
const Eigen::MatrixXd & vxc_
void PrintQP_Energies(const Eigen::VectorXd &qp_diag_energies) const
boost::optional< double > SolveQP_FixedPoint(double intercept0, double frequency0, Index gw_level, QPStats *stats=nullptr) const
Eigen::VectorXd ScissorShift_DFTlevel(const Eigen::VectorXd &dft_energies) const
GW(Logger &log, TCMatrix_gwbse &Mmn, const Eigen::MatrixXd &vxc, const Eigen::VectorXd &dft_energies)
boost::optional< double > SolveQP_Linearisation(double intercept0, double frequency0, Index gw_level, QPStats *stats=nullptr) const
void CalculateGWPerturbation()
Logger is used for thread-safe output of messages.
Provides a means for comparing floating point numbers.
double qp_full_window_half_width
Index qp_adaptive_shell_count
double qp_adaptive_shell_width
std::string qp_grid_search_mode
double qp_virtual_min_energy
Index gw_sc_max_iterations
std::string quadrature_scheme
Index g_sc_max_iterations
std::string qp_root_finder
std::string sigma_integration