Program Listing for File nwpele.hpp#

↰ Return to documentation for file (source/pele/nwpele.hpp)

#ifndef PELE_LINE_SEARCH_NOCEDAL_WRIGHT_H
#define PELE_LINE_SEARCH_NOCEDAL_WRIGHT_H
#include <Eigen/Core>

#include "eigen_interface.hpp"
#include "linesearch.hpp"
#include "lsparameters.hpp"
#include "optimizer.hpp"

using Scalar = double;
typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1> Vector;

namespace pele {

class NocedalWrightLineSearch : LineSearch {
 public:
  NocedalWrightLineSearch(GradientOptimizer *opt,
                          Scalar max_step_ = Scalar(1.0), int m_ = 6,
                          Scalar epsilon_ = Scalar(1e-5),
                          Scalar epsilon_rel_ = Scalar(1e-5), int past_ = 0,
                          Scalar delta_ = Scalar(0), int max_linesearch_ = 40,
                          Scalar min_step_ = Scalar(0.05),
                          Scalar ftol_ = Scalar(1e-4),
                          Scalar wolfe_ = Scalar(0.9))
      : params(m_, epsilon_, epsilon_rel_, past_, delta_, max_linesearch_,
               min_step_, max_step_, ftol_, wolfe_),
        LineSearch(opt, max_step_),
        xsize(opt->get_x().size()),
        xdum(opt->get_x().copy()),
        gdum(xsize),
        xvec(xsize),
        gradvec(xsize),
        stpsize(Scalar(1.0)),
        xoldvec(xsize),
        step_direction(xsize){};
  virtual ~NocedalWrightLineSearch(){};
  inline void set_xold_gold_(Array<double> &xold, Array<double> &gold) {
    gold_ = gold;
    xold_ = xold;
  };
  // helper function to assign g_ and f
  inline void set_g_f_ptr(Array<double> &g) { g_ = g; };
  double line_search(Array<double> &x, Array<double> step);

 private:
  LBFGSParam params;
  int xsize;
  double func_grad_wrapper(Vector &x, Vector &grad);
  // These should reflect the xold in the old version
  void LSFunc(Scalar &fx, Vector &x, Vector &grad, Scalar &step,
              const Vector &drt, const Vector &xp, const LBFGSParam &param);

 private:
  Array<double> g_;
  Array<double> xold_;
  Array<double> gold_;
  Array<double> xdum;
  Array<double> gdum;
  Vector xvec;
  Vector gradvec;
  Scalar stpsize;
  Vector step_direction;
  Vector xoldvec;
};

}  // namespace pele

#endif  // end ifndef PELE_LINE_SEARCH_NOCEDAL_WRIGHT_H