Loading...
Searching...
No Matches
eonc::FIRE Class Referencefinal

#include <FIRE.h>

Inheritance diagram for eonc::FIRE:

Public Member Functions

 FIRE (std::shared_ptr< ObjectiveFunction > a_objf, const Parameters &a_params)
 ~FIRE ()=default
int step (double a_maxMove) override
int run (size_t a_maxIterations, double a_maxMove) override
Public Member Functions inherited from eonc::Optimizer
 Optimizer (std::shared_ptr< ObjectiveFunction > a_objf, const OptimizerConfig &a_config)
 Optimizer (std::shared_ptr< ObjectiveFunction > a_objf, OptType a_optype, const OptimizerConfig &a_config)
 Optimizer (std::shared_ptr< ObjectiveFunction > a_objf, const Parameters &a_params)
 Optimizer (std::shared_ptr< ObjectiveFunction > a_objf, OptType a_optype, const Parameters &a_params)
virtual ~Optimizer ()=default

Private Attributes

double m_dt
double m_dt_max
double m_max_move
size_t m_N_min
size_t m_N
Eigen::VectorXd m_vel
double m_alpha_start
double m_alpha
double m_f_inc
double m_f_dec
double m_f_a
size_t m_iteration
eonc::log::FileScoped m_log {"fire", "_fire.log"}

Additional Inherited Members

Protected Attributes inherited from eonc::Optimizer
const OptimizerConfig m_optConfig
std::shared_ptr< ObjectiveFunction > m_objf

Detailed Description

Definition at line 19 of file FIRE.h.

Constructor & Destructor Documentation

◆ FIRE()

eonc::FIRE::FIRE ( std::shared_ptr< ObjectiveFunction > a_objf,
const Parameters & a_params )
inline

Definition at line 22 of file FIRE.h.

24 m_dt{a_params.optimizer_options().time_step},
25 m_dt_max{a_params.optimizer_options().max_time_step},
26 m_max_move{a_params.optimizer_options().max_move}, m_N_min{5}, m_N{0},
27 m_vel{Eigen::VectorXd::Zero(a_objf->degreesOfFreedom())},
29 m_f_a{0.99}, m_iteration{0} {}
Eigen::VectorXd m_vel
Definition FIRE.h:38
double m_dt_max
Definition FIRE.h:36
double m_f_inc
Definition FIRE.h:41
size_t m_N_min
Definition FIRE.h:37
double m_alpha_start
Definition FIRE.h:39
double m_f_a
Definition FIRE.h:43
double m_max_move
Definition FIRE.h:36
size_t m_iteration
Definition FIRE.h:44
size_t m_N
Definition FIRE.h:37
double m_alpha
Definition FIRE.h:40
double m_f_dec
Definition FIRE.h:42
double m_dt
Definition FIRE.h:36
Optimizer(std::shared_ptr< ObjectiveFunction > a_objf, const OptimizerConfig &a_config)
Definition Optimizer.h:73
static OptimizerConfig fromParams(const Parameters &p)
Definition Optimizer.h:57

◆ ~FIRE()

eonc::FIRE::~FIRE ( )
default

Member Function Documentation

◆ run()

int eonc::FIRE::run ( size_t a_maxIterations,
double a_maxMove )
overridevirtual

Implements eonc::Optimizer.

Definition at line 76 of file FIRE.cpp.

76 {
77 while (!m_objf->isConverged() && m_iteration < a_maxIterations) {
78 step(a_maxMove);
79 }
80 return m_objf->isConverged() ? 1 : 0;
81}
int step(double a_maxMove) override
Definition FIRE.cpp:21
std::shared_ptr< ObjectiveFunction > m_objf
Definition Optimizer.h:70

◆ step()

int eonc::FIRE::step ( double a_maxMove)
overridevirtual

Implements eonc::Optimizer.

Definition at line 21 of file FIRE.cpp.

21 {
22 double P = 0;
23 // Check convergence.
24 if (m_objf->isConverged()) {
25 return 1;
26 }
27
28 // Velocity Verlet
29 Eigen::VectorXd f = -m_objf->getGradient();
30 Eigen::VectorXd x = m_objf->getPositions();
31
32 m_vel += f * m_dt;
33 Eigen::VectorXd dx = m_vel * m_dt;
34
35 dx = eonc::geometry::maxAtomMotionAppliedV(dx, a_maxMove);
36 m_objf->setPositions(x + dx);
37
38 f = -m_objf->getGradient();
39 const double fnorm = f.norm();
40 Eigen::VectorXd f_unit = Eigen::VectorXd::Zero(f.size());
41 if (fnorm > 0.0) {
42 f_unit = f / fnorm;
43 }
44
45 // FIRE
46 P = f.dot(m_vel);
47 m_vel = (1 - m_alpha) * m_vel + m_alpha * f_unit * m_vel.norm();
48 QUILL_LOG_DEBUG(m_log,
49 "P: {:.4f}, v: {:.4f}, m_dt: {:.4f}, m_alpha: {:.4f}, N: {}",
50 P, m_vel.norm(), m_dt, m_alpha, m_N);
51 if (P >= 0) {
52 m_N++;
53 if (m_N > m_N_min) {
54 m_dt = std::min(m_dt * m_f_inc, m_dt_max);
56 }
57 } else {
58 m_dt = m_dt * m_f_dec;
59 m_vel.setZero();
61 m_N = 0;
62 }
63
64 // add a sanity check on m_dt
65 if (m_dt < 1e-6) {
66 QUILL_LOG_CRITICAL(m_log, "[FIRE] [critical] m_dt is too small: {:.4f}",
67 m_dt);
68 throw std::runtime_error(
69 std::format("[FIRE] m_dt is too small: {:.4f}", m_dt));
70 }
71
73 return m_objf->isConverged() ? 1 : 0;
74}
eonc::log::FileScoped m_log
Definition FIRE.h:45
VectorXd maxAtomMotionAppliedV(const VectorXd v1, double maxMotion)

Member Data Documentation

◆ m_alpha

double eonc::FIRE::m_alpha
private

Definition at line 40 of file FIRE.h.

◆ m_alpha_start

double eonc::FIRE::m_alpha_start
private

Definition at line 39 of file FIRE.h.

◆ m_dt

double eonc::FIRE::m_dt
private

Definition at line 36 of file FIRE.h.

◆ m_dt_max

double eonc::FIRE::m_dt_max
private

Definition at line 36 of file FIRE.h.

◆ m_f_a

double eonc::FIRE::m_f_a
private

Definition at line 43 of file FIRE.h.

◆ m_f_dec

double eonc::FIRE::m_f_dec
private

Definition at line 42 of file FIRE.h.

◆ m_f_inc

double eonc::FIRE::m_f_inc
private

Definition at line 41 of file FIRE.h.

◆ m_iteration

size_t eonc::FIRE::m_iteration
private

Definition at line 44 of file FIRE.h.

◆ m_log

eonc::log::FileScoped eonc::FIRE::m_log {"fire", "_fire.log"}
private

Definition at line 45 of file FIRE.h.

45{"fire", "_fire.log"};

◆ m_max_move

double eonc::FIRE::m_max_move
private

Definition at line 36 of file FIRE.h.

◆ m_N

size_t eonc::FIRE::m_N
private

Definition at line 37 of file FIRE.h.

◆ m_N_min

size_t eonc::FIRE::m_N_min
private

Definition at line 37 of file FIRE.h.

◆ m_vel

Eigen::VectorXd eonc::FIRE::m_vel
private

Definition at line 38 of file FIRE.h.


The documentation for this class was generated from the following files:
  • /home/runner/work/eOn/eOn/include/eon/FIRE.h
  • /home/runner/work/eOn/eOn/client/FIRE.cpp