22 float& damping,
float factor,
float lower,
float upper,
23 Eigen::Ref<VectorR> step, Accept&& accept)
25 if (!std::isfinite(factor) || factor <= 1.0f)
26 throw std::invalid_argument(
"LevenbergMarquardt: damping factor must be finite and greater than one.");
28 if (!curvature.allFinite() || !gradient.allFinite())
return false;
30 MatrixR system(curvature.rows(), curvature.cols());
34 system.diagonal().array() += damping;
35 step = system.colPivHouseholderQr().solve(-gradient);
37 if (step.allFinite() && accept(step))
39 damping = std::clamp(damping / factor, lower, upper);
43 const float next = std::clamp(damping * factor, lower, upper);
44 const bool exhausted = next >= upper || next <= damping;
46 if (exhausted)
return false;
bool find_damped_step(const MatrixR &curvature, const VectorR &gradient, float &damping, float factor, float lower, float upper, Eigen::Ref< VectorR > step, Accept &&accept)
Definition levenberg_marquardt_step.h:21
Eigen::Matrix< float, Eigen::Dynamic, 1 > VectorR
Definition opennn_types.h:335
Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic, Layout > MatrixR
Definition opennn_types.h:331