Loading...
Searching...
No Matches
SteepestDescent.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
13// Based on the SteepestDescent minimizer written in ASE.
14
15#include "eon/SteepestDescent.h"
16#include "eon/SafeMath.h"
17
18namespace eonc {
19
20int SteepestDescent::step(double a_maxMove) {
21 Eigen::VectorXd r = m_objf->getPositions();
22 Eigen::VectorXd f = -m_objf->getGradient();
23
24 Eigen::VectorXd dr;
25 double alpha = m_optConfig.opts.sd.alpha;
26 if (m_optConfig.opts.sd.two_point && iteration > 0) {
27 Eigen::VectorXd dx = m_objf->difference(r, m_rPrev);
28 Eigen::VectorXd dg = -f + m_fPrev;
29 alpha = eonc::safemath::safe_div(dx.dot(dx), dx.dot(dg), 0.0);
30 if (alpha < 0) {
31 alpha = m_optConfig.opts.sd.alpha;
32 }
33 QUILL_LOG_DEBUG(m_log, "[SD] alpha: {:.4e}", alpha);
34 }
35
36 dr = alpha * f;
37 dr = eonc::geometry::maxAtomMotionAppliedV(dr, a_maxMove);
38
39 m_objf->setPositions(r + dr);
40
41 m_rPrev = r;
42 m_fPrev = f;
43
44 iteration++;
45
46 return m_objf->isConverged() ? 1 : 0;
47}
48
49int SteepestDescent::run(size_t a_maxIteration, double a_maxMove) {
50 while (!m_objf->isConverged() && iteration < a_maxIteration) {
51 step(a_maxMove);
52 }
53 return m_objf->isConverged() ? 1 : 0;
54}
55
56} // namespace eonc
const OptimizerConfig m_optConfig
Definition Optimizer.h:69
std::shared_ptr< ObjectiveFunction > m_objf
Definition Optimizer.h:70
int run(size_t a_maxIterations, double a_maxMove) override
Eigen::VectorXd m_fPrev
eonc::log::FileScoped m_log
Eigen::VectorXd m_rPrev
int step(double a_maxMove) override
VectorXd maxAtomMotionAppliedV(const VectorXd v1, double maxMotion)
constexpr double safe_div(double num, double denom, double fallback=0.0)
Definition SafeMath.h:21
RAII resource manager for the ARTn C library with global synchronization.