Loading...
Searching...
No Matches
eonc::MinModeObjectiveFunction Class Reference
Inheritance diagram for eonc::MinModeObjectiveFunction:

Public Member Functions

 MinModeObjectiveFunction (std::shared_ptr< Matter > matterPassed, std::shared_ptr< EigenmodeStrategy > minModeMethodPassed, AtomMatrix modePassed, const Parameters &paramsPassed)
 ~MinModeObjectiveFunction () override=default
std::optional< double > knownCurvature () const override
VectorXd getGradient (bool fdstep=false)
double getEnergy ()
void setPositions (const VectorXd &x)
VectorXd getPositions ()
int degreesOfFreedom ()
bool isConverged ()
double getConvergence ()
VectorXd difference (const VectorXd &a, const VectorXd &b)
Public Member Functions inherited from eonc::ObjectiveFunction
 ObjectiveFunction (const Parameters &paramsPassed)
virtual ~ObjectiveFunction ()
virtual bool supportsFiniteDifferenceCurvature () const
virtual void minimumImage (Eigen::Ref< Eigen::Vector3d >) const
virtual VectorXd getMasses () const
virtual bool getPeriodic () const

Private Attributes

std::shared_ptr< Matter > matter
AtomMatrix eigenvector
std::shared_ptr< EigenmodeStrategy > minModeMethod
int iteration {0}

Additional Inherited Members

Protected Attributes inherited from eonc::ObjectiveFunction
const Parameters & params

Detailed Description

Definition at line 33 of file MinModeSaddleSearch.cpp.

Constructor & Destructor Documentation

◆ MinModeObjectiveFunction()

eonc::MinModeObjectiveFunction::MinModeObjectiveFunction ( std::shared_ptr< Matter > matterPassed,
std::shared_ptr< EigenmodeStrategy > minModeMethodPassed,
AtomMatrix modePassed,
const Parameters & paramsPassed )
inline

Definition at line 41 of file MinModeSaddleSearch.cpp.

45 : ObjectiveFunction(paramsPassed),
46 matter{std::move(matterPassed)},
47 minModeMethod{minModeMethodPassed},
48 eigenvector{std::move(modePassed)} {}
std::shared_ptr< EigenmodeStrategy > minModeMethod
std::shared_ptr< Matter > matter
ObjectiveFunction(const Parameters &paramsPassed)

◆ ~MinModeObjectiveFunction()

eonc::MinModeObjectiveFunction::~MinModeObjectiveFunction ( )
overridedefault

Member Function Documentation

◆ degreesOfFreedom()

int eonc::MinModeObjectiveFunction::degreesOfFreedom ( )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 173 of file MinModeSaddleSearch.cpp.

173{ return 3 * matter->numberOfAtoms(); }

◆ difference()

VectorXd eonc::MinModeObjectiveFunction::difference ( const VectorXd & a,
const VectorXd & b )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 195 of file MinModeSaddleSearch.cpp.

195 {
196 return matter->pbcV(a - b);
197 }

◆ getConvergence()

double eonc::MinModeObjectiveFunction::getConvergence ( )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 178 of file MinModeSaddleSearch.cpp.

178 {
179 if (params.optimizer_options().convergence_metric == "norm") {
180 return matter->getForcesFreeV().norm();
181 } else if (params.optimizer_options().convergence_metric == "max_atom") {
182 return matter->maxForce();
183 } else if (params.optimizer_options().convergence_metric ==
184 "max_component") {
185 return matter->getForces().cwiseAbs().maxCoeff();
186 } else {
187 EONC_LOG_CRITICAL("[MinModeSaddleSearch] unknown convergence metric: {}",
188 params.optimizer_options().convergence_metric);
189 throw std::invalid_argument(
190 std::format("[MinModeSaddleSearch] unknown convergence_metric: {}",
191 params.optimizer_options().convergence_metric));
192 }
193 }
#define EONC_LOG_CRITICAL(...)
Definition EonLogger.h:267
const Parameters & params

◆ getEnergy()

double eonc::MinModeObjectiveFunction::getEnergy ( )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 170 of file MinModeSaddleSearch.cpp.

170{ return matter->getPotentialEnergy(); }

◆ getGradient()

VectorXd eonc::MinModeObjectiveFunction::getGradient ( bool fdstep = false)
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 66 of file MinModeSaddleSearch.cpp.

66 {
67 AtomMatrix force = matter->getForces();
68
69 if (!fdstep || iteration == 0) {
71 // Check if ImprovedDimer lost the mode
73 if (dimer && !dimer->rotationDidConverge) {
74 if (dimer->getEigenvalue() < 0.0) {
77 "[MinMode] Dimer restored to best state with C_tau={:.4f}",
78 dimer->getEigenvalue());
79 throw eonc::DimerModeRestoredException();
80 } else {
81 throw eonc::DimerModeLostException();
82 }
83 }
84 iteration++;
85 }
86
88 double eigenvalue = eonc::eigenmodeGetEigenvalue(*minModeMethod);
89
90 AtomMatrix proj = matDot(force, eigenvector) *
91 eonc::safemath::safe_normalized(eigenvector);
92
93 if (eigenvalue > 0.0) {
94 if (params.saddle_search_options().perp_force_ratio > 0.0) {
95 double d = params.saddle_search_options().perp_force_ratio;
96 force = d * force - (1.0 + d) * proj;
97 } else if (params.saddle_search_options().confine_positive.enabled) {
98 if (params.saddle_search_options().confine_positive.bowl_breakout) {
99 AtomMatrix forceTemp = matter->getForces();
100 const long nAtoms = matter->numberOfAtoms();
101 int nBowlActive = static_cast<int>(std::min<long>(
102 params.saddle_search_options().confine_positive.bowl_active,
103 nAtoms));
104 if (nBowlActive <= 0) {
105 force.setZero();
106 } else {
107 std::vector<int> indices_max(nBowlActive);
108
109 // Find the nBowlActive atoms with largest forces
110 for (int j = 0; j < nBowlActive; j++) {
111 double f_max = forceTemp.row(0).norm();
112 int i_max = 0;
113 for (long i = 0; i < matter->numberOfAtoms(); i++) {
114 if (f_max < forceTemp.row(i).norm()) {
115 f_max = forceTemp.row(i).norm();
116 i_max = static_cast<int>(i);
117 }
118 }
119 forceTemp.row(i_max).setZero();
120 indices_max[j] = i_max;
121 }
122 forceTemp.setZero();
123 for (int j = 0; j < nBowlActive; j++) {
124 forceTemp.row(indices_max[j]) = -proj.row(indices_max[j]);
125 }
126 force = forceTemp;
127 }
128 } else {
129 int sufficientForce = 0;
130 double minForce =
131 params.saddle_search_options().confine_positive.min_force;
132 const long maxBoostTries = std::max(
133 3 * matter->numberOfAtoms(),
134 params.saddle_search_options().confine_positive.min_active);
135 long boostTries = 0;
136 while (
137 sufficientForce <
138 params.saddle_search_options().confine_positive.min_active &&
139 boostTries < maxBoostTries) {
140 sufficientForce = 0;
141 force = matter->getForces();
142 for (long i = 0; i < matter->numberOfAtoms(); i++) {
143 for (int k = 0; k < 3; k++) {
144 if (std::abs(force(i, k)) < minForce) {
145 force(i, k) = 0;
146 } else {
147 sufficientForce++;
148 force(i, k) =
149 -params.saddle_search_options().confine_positive.boost *
150 proj(i, k);
151 }
152 }
153 }
154 minForce *=
155 params.saddle_search_options().confine_positive.scale_ratio;
156 boostTries++;
157 }
158 }
159 } else {
160 force = -proj;
161 }
162 } else {
163 force += -2.0 * proj;
164 }
165
166 VectorXd forceV = VectorXd::Map(force.data(), 3 * matter->numberOfAtoms());
167 return -forceV;
168 }
double matDot(const AtomMatrix &a, const AtomMatrix &b)
SIMD-optimized dot product for contiguous Eigen matrices.
Definition Eigen.h:50
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition Eigen.h:37
#define EONC_LOG_DEBUG(...)
Definition EonLogger.h:243
void eigenmodeCompute(LowestEigenmode &s, std::shared_ptr< Matter > matter, AtomMatrix direction)
ImprovedDimer * asImprovedDimer(LowestEigenmode &s)
double eigenmodeGetEigenvalue(LowestEigenmode &s)
AtomMatrix eigenmodeGetEigenvector(LowestEigenmode &s)

◆ getPositions()

VectorXd eonc::MinModeObjectiveFunction::getPositions ( )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 172 of file MinModeSaddleSearch.cpp.

172{ return matter->getPositionsV(); }

◆ isConverged()

bool eonc::MinModeObjectiveFunction::isConverged ( )
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 174 of file MinModeSaddleSearch.cpp.

174 {
175 return getConvergence() < params.saddle_search_options().converged_force;
176 }

◆ knownCurvature()

std::optional< double > eonc::MinModeObjectiveFunction::knownCurvature ( ) const
inlineoverridevirtual

Reimplemented from eonc::ObjectiveFunction.

Definition at line 55 of file MinModeSaddleSearch.cpp.

55 {
56 if (iteration == 0 || !minModeMethod) {
57 return std::nullopt;
58 }
60 if (!std::isfinite(c) || c >= 0.0) {
61 return std::nullopt;
62 }
63 return -c;
64 }

◆ setPositions()

void eonc::MinModeObjectiveFunction::setPositions ( const VectorXd & x)
inlinevirtual

Implements eonc::ObjectiveFunction.

Definition at line 171 of file MinModeSaddleSearch.cpp.

171{ matter->setPositionsV(x); }

Member Data Documentation

◆ eigenvector

AtomMatrix eonc::MinModeObjectiveFunction::eigenvector
private

Definition at line 36 of file MinModeSaddleSearch.cpp.

◆ iteration

int eonc::MinModeObjectiveFunction::iteration {0}
private

Definition at line 38 of file MinModeSaddleSearch.cpp.

38{0};

◆ matter

std::shared_ptr<Matter> eonc::MinModeObjectiveFunction::matter
private

Definition at line 35 of file MinModeSaddleSearch.cpp.

◆ minModeMethod

std::shared_ptr<EigenmodeStrategy> eonc::MinModeObjectiveFunction::minModeMethod
private

Definition at line 37 of file MinModeSaddleSearch.cpp.


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