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