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

#include <SteepestDescent.h>

Inheritance diagram for eonc::SteepestDescent:

Public Member Functions

 SteepestDescent (std::shared_ptr< ObjectiveFunction > a_objf, const Parameters &a_params)
 ~SteepestDescent ()=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 Member Functions

Eigen::VectorXd getStep (const Eigen::VectorXd &a_f)

Private Attributes

eonc::log::FileScoped m_log {"sd", "_sd.log"}
size_t iteration {0}
Eigen::VectorXd m_rPrev
Eigen::VectorXd m_fPrev

Additional Inherited Members

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

Detailed Description

Definition at line 24 of file SteepestDescent.h.

Constructor & Destructor Documentation

◆ SteepestDescent()

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

Definition at line 26 of file SteepestDescent.h.

29 m_rPrev{Eigen::VectorXd::Zero(a_objf->degreesOfFreedom())},
30 m_fPrev{Eigen::VectorXd::Zero(a_objf->degreesOfFreedom())} {}
Optimizer(std::shared_ptr< ObjectiveFunction > a_objf, const OptimizerConfig &a_config)
Definition Optimizer.h:73
Eigen::VectorXd m_fPrev
Eigen::VectorXd m_rPrev
static OptimizerConfig fromParams(const Parameters &p)
Definition Optimizer.h:57

◆ ~SteepestDescent()

eonc::SteepestDescent::~SteepestDescent ( )
default

Member Function Documentation

◆ getStep()

Eigen::VectorXd eonc::SteepestDescent::getStep ( const Eigen::VectorXd & a_f)
private

◆ run()

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

Implements eonc::Optimizer.

Definition at line 49 of file SteepestDescent.cpp.

49 {
50 while (!m_objf->isConverged() && iteration < a_maxIteration) {
51 step(a_maxMove);
52 }
53 return m_objf->isConverged() ? 1 : 0;
54}
std::shared_ptr< ObjectiveFunction > m_objf
Definition Optimizer.h:70
int step(double a_maxMove) override

◆ step()

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

Implements eonc::Optimizer.

Definition at line 20 of file SteepestDescent.cpp.

20 {
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}
const OptimizerConfig m_optConfig
Definition Optimizer.h:69
eonc::log::FileScoped m_log
VectorXd maxAtomMotionAppliedV(const VectorXd v1, double maxMotion)
constexpr double safe_div(double num, double denom, double fallback=0.0)
Definition SafeMath.h:21

Member Data Documentation

◆ iteration

size_t eonc::SteepestDescent::iteration {0}
private

Definition at line 39 of file SteepestDescent.h.

39{0};

◆ m_fPrev

Eigen::VectorXd eonc::SteepestDescent::m_fPrev
private

Definition at line 41 of file SteepestDescent.h.

◆ m_log

eonc::log::FileScoped eonc::SteepestDescent::m_log {"sd", "_sd.log"}
private

Definition at line 37 of file SteepestDescent.h.

37{"sd", "_sd.log"};

◆ m_rPrev

Eigen::VectorXd eonc::SteepestDescent::m_rPrev
private

Definition at line 40 of file SteepestDescent.h.


The documentation for this class was generated from the following files: