Loading...
Searching...
No Matches
LBFGS.h
Go to the documentation of this file.
1/*
2** This file is part of eOn.
3**
4** SPDX-License-Identifier: BSD-3-Clause
5**
6** Copyright (c) 2010--present, eOn Development Team
7** All rights reserved.
8**
9** Repo:
10** https://github.com/TheochemUI/eOn
11*/
12#pragma once
13#include "EonLogger.h"
14
15#include "HelperFunctions.h"
16#include "Matter.h"
17#include "ObjectiveFunction.h"
18#include "Optimizer.h"
19#include "Parameters.h"
20
21#include <deque>
22
23namespace eonc {
24
25class LBFGS final : public Optimizer {
26
27public:
28 LBFGS(std::shared_ptr<ObjectiveFunction> a_objf, const Parameters &a_params)
29 : Optimizer(a_objf, OptType::LBFGS,
30 OptimizerConfig::fromParams(a_params)),
31 m_memory{std::min(
32 a_objf->degreesOfFreedom(),
33 static_cast<int>(a_params.optimizer_options().lbfgs.memory))},
34 m_rPrev{Eigen::VectorXd::Zero(a_objf->degreesOfFreedom())},
35 m_fPrev{Eigen::VectorXd::Zero(a_objf->degreesOfFreedom())} {}
36
37 ~LBFGS() = default;
38
39 [[nodiscard]] int step(double a_maxMove) override;
40 [[nodiscard]] int run(size_t a_maxIterations, double a_maxMove) override;
41 [[nodiscard]] int update(const Eigen::VectorXd &a_r1,
42 const Eigen::VectorXd &a_r0,
43 const Eigen::VectorXd &a_f1,
44 const Eigen::VectorXd &a_f0, double a_e1,
45 double a_e0);
46 void reset();
47
48private:
49 [[nodiscard]] Eigen::VectorXd getStep(double a_maxMove,
50 const Eigen::VectorXd &a_f);
51 [[nodiscard]] Eigen::Vector3d micRij(const Eigen::VectorXd &pos, int i,
52 int j) const;
53 [[nodiscard]] bool usesPrecon() const;
54 [[nodiscard]] Eigen::MatrixXd buildPrecon(const Eigen::VectorXd &pos) const;
55 [[nodiscard]] Eigen::VectorXd applyH0(const Eigen::VectorXd &q, double H0,
56 const Eigen::VectorXd &pos) const;
57 [[nodiscard]] Eigen::VectorXd hessianStep(double a_maxMove,
58 const Eigen::VectorXd &a_f);
59
61 int m_memory{0};
62
63 std::deque<Eigen::VectorXd> m_s;
64 std::deque<Eigen::VectorXd> m_y;
65 std::deque<double> m_rho;
66 std::deque<double> m_eHist;
67
68 Eigen::VectorXd m_rPrev;
69 Eigen::VectorXd m_fPrev;
70 double m_ePrev{0.0};
71 eonc::log::FileScoped m_log{"lbfgs", "_lbfgs.log"};
72};
73
74} // namespace eonc
The optimizer class is used to serve as an abstract class for all optimizers, as well as to call an o...
std::deque< double > m_rho
Definition LBFGS.h:65
int update(const Eigen::VectorXd &a_r1, const Eigen::VectorXd &a_r0, const Eigen::VectorXd &a_f1, const Eigen::VectorXd &a_f0, double a_e1, double a_e0)
Definition LBFGS.cpp:275
Eigen::VectorXd m_fPrev
Definition LBFGS.h:69
int m_iteration
Definition LBFGS.h:60
std::deque< Eigen::VectorXd > m_y
Definition LBFGS.h:64
std::deque< double > m_eHist
Definition LBFGS.h:66
std::deque< Eigen::VectorXd > m_s
Definition LBFGS.h:63
int step(double a_maxMove) override
Definition LBFGS.cpp:367
Eigen::VectorXd m_rPrev
Definition LBFGS.h:68
bool usesPrecon() const
Definition LBFGS.cpp:61
int run(size_t a_maxIterations, double a_maxMove) override
Definition LBFGS.cpp:425
int m_memory
Definition LBFGS.h:61
double m_ePrev
Definition LBFGS.h:70
LBFGS(std::shared_ptr< ObjectiveFunction > a_objf, const Parameters &a_params)
Definition LBFGS.h:28
Eigen::VectorXd hessianStep(double a_maxMove, const Eigen::VectorXd &a_f)
Definition LBFGS.cpp:91
void reset()
Definition LBFGS.cpp:268
eonc::log::FileScoped m_log
Definition LBFGS.h:71
Eigen::MatrixXd buildPrecon(const Eigen::VectorXd &pos) const
Definition LBFGS.cpp:68
Eigen::VectorXd applyH0(const Eigen::VectorXd &q, double H0, const Eigen::VectorXd &pos) const
Definition LBFGS.cpp:74
Eigen::VectorXd getStep(double a_maxMove, const Eigen::VectorXd &a_f)
Definition LBFGS.cpp:137
~LBFGS()=default
Eigen::Vector3d micRij(const Eigen::VectorXd &pos, int i, int j) const
Definition LBFGS.cpp:55
Optimizer(std::shared_ptr< ObjectiveFunction > a_objf, const OptimizerConfig &a_config)
Definition Optimizer.h:73
RAII resource manager for the ARTn C library with global synchronization.
Declaration of the optimizer class.
Definition Optimizer.h:51
RAII helper for file-based logging in a class.
Definition EonLogger.h:207