eOn client
Long-timescale dynamics: aKMC, NEB, parallel replica
☾
Toggle main menu visibility
Loading...
Searching...
No Matches
BiasedGradientSquaredDescent.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/BiasedGradientSquaredDescent.h
"
13
#include "
eon/EigenmodeStrategy.h
"
14
#include "
eon/HelperFunctions.h
"
15
#include "
eon/Matter.h
"
16
#include "
eon/ObjectiveFunction.h
"
17
#include "
eon/Optimizer.h
"
18
#include "
eon/SaddleSearchMethod.h
"
19
20
#include <cassert>
21
#include <cmath>
22
#include <cstdlib>
23
#include <cstring>
24
#include <map>
25
26
class
BGSDObjectiveFunction
:
public
ObjectiveFunction
{
27
Matter
&
matter
;
28
29
public
:
30
BGSDObjectiveFunction
(
Matter
&matterRef,
double
reactantEnergyPassed,
31
double
bgsdAlphaPassed,
32
const
Parameters
¶metersPassed)
33
:
ObjectiveFunction
(parametersPassed),
34
matter
{matterRef} {
35
bgsdAlpha
= bgsdAlphaPassed;
36
reactantEnergy
= reactantEnergyPassed;
37
}
38
39
~BGSDObjectiveFunction
() =
default
;
40
41
double
getEnergy
() {
42
VectorXd Vforce =
matter
.getForcesFreeV();
43
double
Henergy = 0.5 * Vforce.dot(Vforce) +
44
0.5 *
bgsdAlpha
*
45
(
matter
.getPotentialEnergy() -
46
(
reactantEnergy
+
params
.bgsd_options.beta)) *
47
(
matter
.getPotentialEnergy() -
48
(
reactantEnergy
+
params
.bgsd_options.beta));
49
return
Henergy;
50
}
51
52
VectorXd
getGradient
(
bool
fdstep =
false
) {
53
VectorXd Vforce =
matter
.getForcesFreeV();
54
double
magVforce = Vforce.norm();
55
VectorXd normVforce = Vforce / magVforce;
56
VectorXd Vpositions =
matter
.getPositionsFreeV();
57
matter
.setPositionsFreeV(
58
matter
.getPositionsFreeV() -
59
normVforce *
params
.bgsd_options.gradient_finite_difference);
60
VectorXd Vforcenew =
matter
.getForcesFreeV();
61
matter
.setPositionsFreeV(Vpositions);
62
VectorXd Hforce = magVforce * (Vforcenew - Vforce) /
63
params
.bgsd_options.gradient_finite_difference +
64
bgsdAlpha
*
65
(
matter
.getPotentialEnergy() -
66
(
reactantEnergy
+
params
.bgsd_options.beta)) *
67
Vforce;
68
return
-Hforce;
69
}
70
71
double
getGradientnorm
() {
72
VectorXd Hforce =
getGradient
();
73
double
Hnorm = Hforce.norm();
74
return
Hnorm;
75
}
76
77
void
setPositions
(
const
VectorXd &x) {
matter
.setPositionsFreeV(x); }
78
VectorXd
getPositions
() {
return
matter
.getPositionsFreeV(); }
79
int
degreesOfFreedom
() {
return
3 *
matter
.numberOfFreeAtoms(); }
80
bool
isConverged
() {
return
isConvergedH
() &&
isConvergedV
(); }
81
bool
isConvergedH
() {
82
return
getConvergenceH
() <
params
.bgsd_options.h_force_convergence;
83
}
84
bool
isConvergedV
() {
85
return
getConvergenceV
() <
params
.bgsd_options.grad2energy_convergence;
86
}
87
bool
isConvergedIP
() {
88
return
getConvergenceH
() <
params
.bgsd_options.grad2force_convergence;
89
}
90
91
double
getConvergence
() {
return
getEnergy
() &&
getGradient
().norm(); }
92
double
getConvergenceH
() {
return
getGradient
().norm(); }
93
double
getConvergenceV
() {
return
getEnergy
(); }
94
VectorXd
difference
(
const
VectorXd &a,
const
VectorXd &b) {
95
return
matter
.pbcV(a - b);
96
}
97
98
private
:
99
double
reactantEnergy
;
100
double
bgsdAlpha
;
101
};
102
103
int
BiasedGradientSquaredDescent::run
() {
104
auto
objf = std::make_shared<BGSDObjectiveFunction>(
105
*
saddle
,
reactantEnergy
,
params
.bgsd_options.alpha,
params
);
106
auto
optim =
eonc::helpers::create::mkOptim
(
107
objf,
params
.optimizer_options.method,
params
);
108
int
iteration = 0;
109
QUILL_LOG_DEBUG(
110
log
,
111
"starting optimization of H with params alpha and beta: {:.2f} {:.2f}"
,
112
params
.bgsd_options.alpha,
params
.bgsd_options.beta);
113
while
(!objf->isConvergedH() || iteration == 0) {
114
optim->step(
params
.optimizer_options.max_move);
115
QUILL_LOG_DEBUG(
log
,
116
"iteration {} Henergy, gradientHnorm, and Venergy: "
117
"{:.8f} {:.8f} {:.8f}"
,
118
iteration, objf->getEnergy(), objf->getGradientnorm(),
119
saddle
->getPotentialEnergy());
120
iteration++;
121
}
122
auto
objf2 = std::make_shared<BGSDObjectiveFunction>(*
saddle
,
reactantEnergy
,
123
0.0,
params
);
124
auto
optim2 =
eonc::helpers::create::mkOptim
(
125
objf2,
params
.optimizer_options.method,
params
);
126
while
(!objf2->isConvergedV() || iteration == 0) {
127
if
(objf2->isConvergedIP()) {
128
break
;
129
};
130
optim2->step(
params
.optimizer_options.max_move);
131
QUILL_LOG_DEBUG(
log
,
132
"gradient squared iteration {} Henergy, gradientHnorm, "
133
"and Venergy: {:.8f} {:.8f} {:.8f}"
,
134
iteration, objf2->getEnergy(), objf2->getGradientnorm(),
135
saddle
->getPotentialEnergy());
136
iteration++;
137
}
138
139
auto
minModeMethod =
eonc::buildEigenmodeStrategy
(
saddle
,
params
,
pot
);
140
141
eigenvector
.setRandom();
142
for
(
int
i = 0; i <
saddle
->numberOfAtoms(); i++) {
143
for
(
int
j = 0; j < 3; j++) {
144
if
(
saddle
->getFixed(i)) {
145
eigenvector
(i, j) = 0.0;
146
};
147
}
148
}
149
eigenvector
.normalize();
150
eonc::eigenmodeCompute
(*minModeMethod,
saddle
,
eigenvector
);
151
eigenvector
=
eonc::eigenmodeGetEigenvector
(*minModeMethod);
152
eigenvalue
=
eonc::eigenmodeGetEigenvalue
(*minModeMethod);
153
QUILL_LOG_DEBUG(
log
,
"lowest eigenvalue {:.8f}"
,
eigenvalue
);
154
if
(objf2->isConvergedV()) {
155
return
0;
156
}
else
if
(objf2->isConvergedIP()) {
157
return
1;
158
}
else
{
159
return
1;
160
};
161
}
162
163
double
BiasedGradientSquaredDescent::getEigenvalue
() {
return
eigenvalue
; }
164
165
AtomMatrix
BiasedGradientSquaredDescent::getEigenvector
() {
166
return
eigenvector
;
167
}
BiasedGradientSquaredDescent.h
AtomMatrix
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition
Eigen.h:37
EigenmodeStrategy.h
HelperFunctions.h
Matter.h
ObjectiveFunction.h
Optimizer.h
The optimizer class is used to serve as an abstract class for all optimizers, as well as to call an o...
SaddleSearchMethod.h
BGSDObjectiveFunction::matter
Matter & matter
Definition
BiasedGradientSquaredDescent.cpp:27
BGSDObjectiveFunction::degreesOfFreedom
int degreesOfFreedom()
Definition
BiasedGradientSquaredDescent.cpp:79
BGSDObjectiveFunction::bgsdAlpha
double bgsdAlpha
Definition
BiasedGradientSquaredDescent.cpp:100
BGSDObjectiveFunction::BGSDObjectiveFunction
BGSDObjectiveFunction(Matter &matterRef, double reactantEnergyPassed, double bgsdAlphaPassed, const Parameters ¶metersPassed)
Definition
BiasedGradientSquaredDescent.cpp:30
BGSDObjectiveFunction::isConverged
bool isConverged()
Definition
BiasedGradientSquaredDescent.cpp:80
BGSDObjectiveFunction::getPositions
VectorXd getPositions()
Definition
BiasedGradientSquaredDescent.cpp:78
BGSDObjectiveFunction::getEnergy
double getEnergy()
Definition
BiasedGradientSquaredDescent.cpp:41
BGSDObjectiveFunction::difference
VectorXd difference(const VectorXd &a, const VectorXd &b)
Definition
BiasedGradientSquaredDescent.cpp:94
BGSDObjectiveFunction::~BGSDObjectiveFunction
~BGSDObjectiveFunction()=default
BGSDObjectiveFunction::getGradientnorm
double getGradientnorm()
Definition
BiasedGradientSquaredDescent.cpp:71
BGSDObjectiveFunction::setPositions
void setPositions(const VectorXd &x)
Definition
BiasedGradientSquaredDescent.cpp:77
BGSDObjectiveFunction::isConvergedIP
bool isConvergedIP()
Definition
BiasedGradientSquaredDescent.cpp:87
BGSDObjectiveFunction::getConvergence
double getConvergence()
Definition
BiasedGradientSquaredDescent.cpp:91
BGSDObjectiveFunction::reactantEnergy
double reactantEnergy
Definition
BiasedGradientSquaredDescent.cpp:99
BGSDObjectiveFunction::getGradient
VectorXd getGradient(bool fdstep=false)
Definition
BiasedGradientSquaredDescent.cpp:52
BGSDObjectiveFunction::isConvergedH
bool isConvergedH()
Definition
BiasedGradientSquaredDescent.cpp:81
BGSDObjectiveFunction::isConvergedV
bool isConvergedV()
Definition
BiasedGradientSquaredDescent.cpp:84
BGSDObjectiveFunction::getConvergenceV
double getConvergenceV()
Definition
BiasedGradientSquaredDescent.cpp:93
BGSDObjectiveFunction::getConvergenceH
double getConvergenceH()
Definition
BiasedGradientSquaredDescent.cpp:92
BiasedGradientSquaredDescent::run
int run()
Definition
BiasedGradientSquaredDescent.cpp:103
eonc::BiasedGradientSquaredDescent::saddle
std::shared_ptr< Matter > saddle
Definition
BiasedGradientSquaredDescent.h:48
eonc::BiasedGradientSquaredDescent::getEigenvalue
double getEigenvalue()
Definition
BiasedGradientSquaredDescent.cpp:163
eonc::BiasedGradientSquaredDescent::eigenvector
AtomMatrix eigenvector
Definition
BiasedGradientSquaredDescent.h:46
eonc::BiasedGradientSquaredDescent::log
eonc::log::Scoped log
Definition
BiasedGradientSquaredDescent.h:54
eonc::BiasedGradientSquaredDescent::reactantEnergy
double reactantEnergy
Definition
BiasedGradientSquaredDescent.h:53
eonc::BiasedGradientSquaredDescent::getEigenvector
AtomMatrix getEigenvector()
Definition
BiasedGradientSquaredDescent.cpp:165
eonc::BiasedGradientSquaredDescent::eigenvalue
double eigenvalue
Definition
BiasedGradientSquaredDescent.h:45
eonc::Matter
Definition
Matter.h:92
eonc::ObjectiveFunction::ObjectiveFunction
ObjectiveFunction(const Parameters ¶msPassed)
Definition
ObjectiveFunction.h:23
eonc::ObjectiveFunction::params
const Parameters & params
Definition
ObjectiveFunction.h:20
eonc::Parameters
Definition
Parameters.h:28
eonc::SaddleSearchMethod::pot
std::shared_ptr< Potential > pot
Definition
SaddleSearchMethod.h:23
eonc::SaddleSearchMethod::params
const Parameters & params
Definition
SaddleSearchMethod.h:24
eonc::helpers::create::mkOptim
std::unique_ptr< Optimizer > mkOptim(std::shared_ptr< ObjectiveFunction > a_objf, OptType a_otype, const Parameters &a_params)
Definition
Optimizer.cpp:21
eonc::eigenmodeGetEigenvector
AtomMatrix eigenmodeGetEigenvector(EigenmodeStrategy &s)
Dispatch getEigenvector() to the active variant.
Definition
EigenmodeStrategy.h:87
eonc::buildEigenmodeStrategy
std::shared_ptr< EigenmodeStrategy > buildEigenmodeStrategy(std::shared_ptr< Matter > matter, const Parameters ¶ms, std::shared_ptr< Potential > pot)
Build the eigenmode solver from parameters.
Definition
EigenmodeStrategy.h:38
eonc::eigenmodeCompute
void eigenmodeCompute(EigenmodeStrategy &s, std::shared_ptr< Matter > matter, AtomMatrix direction)
Dispatch compute() to the active variant.
Definition
EigenmodeStrategy.h:75
eonc::eigenmodeGetEigenvalue
double eigenmodeGetEigenvalue(EigenmodeStrategy &s)
Dispatch getEigenvalue() to the active variant.
Definition
EigenmodeStrategy.h:82
client
BiasedGradientSquaredDescent.cpp
Generated by
1.17.0
Generated by
Doxygen 1.17.0
Analytics by
Antics
provided by
TurtleTech ehf