PhysicsBasedAnimationToolkit 0.0.10
Cross-platform C++20 library of algorithms and data structures commonly used in computer graphics research on physically-based simulation.
Loading...
Searching...
No Matches
Newton.h
Go to the documentation of this file.
1
8
9#ifndef PBAT_MATH_OPTIMIZATION_NEWTON_H
10#define PBAT_MATH_OPTIMIZATION_NEWTON_H
11
12#include "LineSearch.h"
13#include "pbat/Aliases.h"
14
15#include <Eigen/Core>
16#include <optional>
17#include <type_traits>
18
20
25template <class TScalar = Scalar>
26struct Newton
27{
29 TScalar gtol2;
30 Eigen::Vector<TScalar, Eigen::Dynamic> dxk;
31 Eigen::Vector<TScalar, Eigen::Dynamic> gk;
32
39 Newton(int nMaxIters = 10, TScalar gtol = TScalar(1e-4), Index n = 0);
58 template <
59 class FPrepareDerivatives,
60 class FObjective,
61 class FGradient,
62 class FHessianInverseProduct,
63 class TDerivedX>
64 TScalar Solve(
65 FPrepareDerivatives prepareDerivatives,
66 FObjective f,
67 FGradient g,
68 FHessianInverseProduct Hinv,
69 Eigen::MatrixBase<TDerivedX>& xk,
70 std::optional<BackTrackingLineSearch<TScalar>> lineSearch = std::nullopt);
71};
72
73template <class TScalar>
74inline Newton<TScalar>::Newton(int nMaxItersIn, TScalar gtol, Index n)
75 : nMaxIters(nMaxItersIn), gtol2(gtol * gtol), dxk(n), gk(n)
76{
77}
78
79template <class TScalar>
80template <
81 class FPrepareDerivatives,
82 class FObjective,
83 class FGradient,
84 class FHessianInverseProduct,
85 class TDerivedX>
87 FPrepareDerivatives prepareDerivatives,
88 FObjective f,
89 FGradient g,
90 FHessianInverseProduct Hinv,
91 Eigen::MatrixBase<TDerivedX>& xk,
92 std::optional<BackTrackingLineSearch<TScalar>> lineSearch)
93{
94 TScalar gnorm2{0};
95 prepareDerivatives(xk);
96 gk = g(xk);
97 for (auto k = 0; k < nMaxIters; ++k)
98 {
99 gnorm2 = gk.squaredNorm();
100 if (gnorm2 < gtol2)
101 break;
102 dxk = -Hinv(xk, gk);
103 if (lineSearch)
104 lineSearch->Solve(f, gk, dxk, xk);
105 else
106 xk += dxk;
107 prepareDerivatives(xk);
108 gk = g(xk);
109 }
110 return gnorm2;
111}
112
113} // namespace pbat::math::optimization
114
115#endif // PBAT_MATH_OPTIMIZATION_NEWTON_H
Header file for line search algorithms.
Namespace for optimization algorithms.
Definition BranchAndBound.h:7
std::ptrdiff_t Index
Index type.
Definition Aliases.h:17
TScalar gtol2
Gradient squared norm threshold for convergence.
Definition Newton.h:29
Newton(int nMaxIters=10, TScalar gtol=TScalar(1e-4), Index n=0)
Construct a new Newton optimizer.
Definition Newton.h:74
Eigen::Vector< TScalar, Eigen::Dynamic > gk
Gradient at current iteration.
Definition Newton.h:31
Eigen::Vector< TScalar, Eigen::Dynamic > dxk
Step direction.
Definition Newton.h:30
int nMaxIters
Maximum number of iterations for the Newton solver.
Definition Newton.h:28
TScalar Solve(FPrepareDerivatives prepareDerivatives, FObjective f, FGradient g, FHessianInverseProduct Hinv, Eigen::MatrixBase< TDerivedX > &xk, std::optional< BackTrackingLineSearch< TScalar > > lineSearch=std::nullopt)
Solve the optimization problem using Newton's method.
Definition Newton.h:86