Program Listing for File lbfgs_exact.hpp#
↰ Return to documentation for file (source/pele/lbfgs_exact.hpp)
#ifndef _PELE_LBFGS_H__
#define _PELE_LBFGS_H__
#include <memory>
#include <mpreal.h>
#include <vector>
#include "array.hpp"
#include "base_potential.hpp"
#include "optimizer.hpp"
namespace pele {
using mpfr::mpreal;
const int digits = 100;
mpreal::set_default_prec(mpfr::digits2bits(digits)) class LBFGS_Exact
: public GradientOptimizer {
private:
int M_;
double max_f_rise_;
bool use_relative_f_;
// places to store the lbfgs memory
Array<mpreal> s_;
Array<mpreal> y_;
Array<mpreal> rho_;
mpreal H0_;
mpreal k_;
Array<mpreal> alpha;
Array<mpreal> xold;
Array<mpreal> gold;
Array<mpreal> step;
double
inv_sqrt_size;
public:
LBFGS_Exact(std::shared_ptr<pele::BasePotential> potential,
const pele::Array<double> x0, double tol = 1e-4, int M = 4);
virtual ~LBFGS_Exact() {}
void one_iteration();
// functions for setting the parameters
inline void set_H0(double H0) {
if (iter_number_ > 0) {
std::cout << "warning: setting H0 after the first iteration.\n";
}
H0_ = H0;
}
inline void set_max_f_rise(double max_f_rise) { max_f_rise_ = max_f_rise; }
inline void set_use_relative_f(int use_relative_f) {
use_relative_f_ = (bool)use_relative_f;
}
// functions for accessing the results
inline double get_H0() const { return H0_; }
virtual void reset(pele::Array<double> &x0);
private:
void update_memory(Array<mpreal> xold, Array<mpreal> gold, Array<mpreal> xnew,
Array<mpreal> gnew);
void compute_lbfgs_step(Array<mpreal> step);
double backtracking_linesearch(Array<mpreal> step);
};
} // namespace pele
#endif