Loading...
Searching...
No Matches
FIRE.cpp
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#include "eon/FIRE.h"
13#include "eon/HelperFunctions.h"
14
15#include <algorithm>
16#include <format>
17#include <stdexcept>
18
19int FIRE::step(double a_maxMove) {
20 double P = 0;
21 // Check convergence.
22 if (m_objf->isConverged()) {
23 return 1;
24 }
25
26 // Velocity Verlet
27 Eigen::VectorXd f = -m_objf->getGradient();
28 Eigen::VectorXd x = m_objf->getPositions();
29
30 m_vel += f * m_dt;
31 Eigen::VectorXd dx = m_vel * m_dt;
32
34 m_objf->setPositions(x + dx);
35
36 f = -m_objf->getGradient();
37 Eigen::VectorXd f_unit = f / f.norm();
38
39 // FIRE
40 P = f.dot(m_vel);
41 m_vel = (1 - m_alpha) * m_vel + m_alpha * f_unit * m_vel.norm();
42 QUILL_LOG_DEBUG(m_log,
43 "P: {:.4f}, v: {:.4f}, m_dt: {:.4f}, m_alpha: {:.4f}, N: {}",
44 P, m_vel.norm(), m_dt, m_alpha, m_N);
45 if (P >= 0) {
46 m_N++;
47 if (m_N > m_N_min) {
48 m_dt = std::min(m_dt * m_f_inc, m_dt_max);
50 }
51 } else {
52 m_dt = m_dt * m_f_dec;
53 m_vel.setZero();
55 m_N = 0;
56 }
57
58 // add a sanity check on m_dt
59 if (m_dt < 1e-6) {
60 QUILL_LOG_CRITICAL(m_log, "[FIRE] [critical] m_dt is too small: {:.4f}",
61 m_dt);
62 throw std::runtime_error(
63 std::format("[FIRE] m_dt is too small: {:.4f}", m_dt));
64 }
65
67 return m_objf->isConverged() ? 1 : 0;
68}
69
70int FIRE::run(size_t a_maxIterations, double a_maxMove) {
71 while (!m_objf->isConverged() && m_iteration < a_maxIterations) {
72 step(a_maxMove);
73 }
74 return m_objf->isConverged() ? 1 : 0;
75}
int step(double a_maxMove) override
Definition FIRE.cpp:19
int step(double a_maxMove) override
Definition FIRE.cpp:19
Eigen::VectorXd m_vel
Definition FIRE.h:44
double m_dt_max
Definition FIRE.h:42
double m_f_inc
Definition FIRE.h:47
size_t m_N_min
Definition FIRE.h:43
double m_alpha_start
Definition FIRE.h:45
double m_f_a
Definition FIRE.h:49
int run(size_t a_maxIterations, double a_maxMove) override
Definition FIRE.cpp:70
double m_max_move
Definition FIRE.h:42
eonc::log::FileScoped m_log
Definition FIRE.h:51
size_t m_iteration
Definition FIRE.h:50
size_t m_N
Definition FIRE.h:43
double m_alpha
Definition FIRE.h:46
double m_f_dec
Definition FIRE.h:48
double m_dt
Definition FIRE.h:42
std::shared_ptr< ObjectiveFunction > m_objf
Definition Optimizer.h:68
VectorXd maxAtomMotionAppliedV(const VectorXd v1, double maxMotion)