3 #include "../common.hpp"
6 #include <autodiff/forward/dual.hpp>
8 #include <autodiff/forward/dual.hpp>
17 template <
typename V,
typename M>
48 const bool timing = (this->
recorder_ !=
nullptr);
50 auto start_time = std::chrono::steady_clock::now();
52 for (_iters = 0; _iters < _max_iters; ++_iters) {
53 if (grad.norm() < _tol) {
63 alpha_wolfe = std::min(1.0, 1.0 / grad.norm());
67 x_new = x + alpha_wolfe * p;
70 V grad_new = Gradient(x_new);
71 V y = grad_new - grad;
78 double rho = 1.0 / ys;
90 double elapsed_ms = 0.0;
92 auto now = std::chrono::steady_clock::now();
93 elapsed_ms = std::chrono::duration<double, std::milli>(now - start_time).count();
111 if (s_list.
empty()) {
115 V z = V::Zero(grad.size());
117 std::vector<double> alpha_list(s_list.
size());
120 for (
int i =
static_cast<int>(s_list.
size()) - 1; i >= 0; --i) {
121 alpha_list[i] = rho_list[i] * s_list[i].dot(q);
122 q -= alpha_list[i] * y_list[i];
127 double gamma = s_list.
back().dot(y_list.
back()) /
133 for (
size_t i = 0; i < s_list.
size(); ++i) {
134 double beta = rho_list[i] * y_list[i].dot(z);
135 z += s_list[i] * (alpha_list[i] - beta);
void reset()
Reset recorded size without releasing memory.
Definition: iteration_recorder.hpp:31
void record(int idx, double loss, double grad_norm, double time_ms=0.0)
Record a loss/grad/time entry at iteration index.
Definition: iteration_recorder.hpp:40
Base class for Full Batch Minimizers.
Definition: full_batch_minimizer.hpp:23
double rho
Definition: full_batch_minimizer.hpp:115
double _tol
Definition: full_batch_minimizer.hpp:109
double line_search(V x, V p, VecFun< V, double > &f, GradFun< V > &Gradient)
Backtracking Line Search satisfying Wolfe Conditions.
Definition: full_batch_minimizer.hpp:126
unsigned int _iters
Definition: full_batch_minimizer.hpp:108
::IterationRecorder< CpuBackend > * recorder_
Optional recorder for diagnostics.
Definition: full_batch_minimizer.hpp:110
unsigned int _max_iters
Definition: full_batch_minimizer.hpp:107
Limited-memory BFGS (L-BFGS) minimizer.
Definition: lbfgs.hpp:18
V solve(V x, VecFun< V, double > &f, GradFun< V > &Gradient) override
Solves the optimization problem using L-BFGS.
Definition: lbfgs.hpp:38
V compute_direction(const V &grad, const RingBuffer< V > &s_list, const RingBuffer< V > &y_list, const RingBuffer< double > &rho_list)
Two-loop recursion to compute search direction.
Definition: lbfgs.hpp:106
void setHistorySize(size_t history_size)
Set history size for L-BFGS.
Definition: lbfgs.hpp:29
A fixed-capacity ring buffer (circular buffer).
Definition: ring_buffer.hpp:15
bool empty() const
Checks if the buffer is empty.
Definition: ring_buffer.hpp:104
void push_back(const T &val)
Pushes a new element into the buffer.
Definition: ring_buffer.hpp:43
size_t size() const
Returns the number of elements currently stored.
Definition: ring_buffer.hpp:101
T & back()
Access the newest element.
Definition: ring_buffer.hpp:86
std::function< T(T)> GradFun
Gradient function type alias (T -> T).
Definition: common.hpp:32
std::function< W(T)> VecFun
Objective function type alias (T -> W).
Definition: common.hpp:35