tinyopt 700
Tinyopt, a lightweight, header only optimization library
Loading...
Searching...
No Matches
base.h
1// Copyright 2026 Julien Michot.
2// SPDX-License-Identifier: Apache-2.0
3
4#pragma once
5
6#include <algorithm>
7#include <cassert>
8#include <type_traits>
9
10#include <tinyopt/cost.h>
11#include <tinyopt/log.h>
12#include <tinyopt/math.h>
13#include <tinyopt/summary.h>
14
15#include <tinyopt/optimizers/options.h>
16
17namespace tinyopt::solvers {
18
19template <typename _Scalar, int _Dims>
20class SolverBase {
21 public:
22 using Scalar = _Scalar;
23 static constexpr Index Dims = _Dims;
24
25 SolverBase(const Options &options = {}) : options_{options} {}
26
29 template <typename Grad_t>
30 bool Clamp(Grad_t &g, Scalar minmax) const {
31 if (minmax == 0) return false;
32 if constexpr (std::is_scalar_v<Grad_t>) {
33 g = std::clamp(g, -minmax, minmax);
34 } else {
35 g = g.cwiseMax(-minmax).cwiseMin(minmax);
36 }
37 return true;
38 }
39
41 void NormalizeCost(Cost &cost) {
42 if (!options_.cost.use_squared_norm) cost.cost = std::sqrt(cost.cost);
43 if (options_.cost.downscale_by_2) cost.cost *= 0.5f;
44 if (options_.cost.normalize && cost.num_resisuals > 0) cost.cost /= cost.num_resisuals;
45 }
46
47 public:
49 virtual std::optional<Vector<Scalar, Dims>> Solve() const = 0;
50
51 virtual void GoodStep(Scalar /*quality*/ = 0.0f) {}
52 virtual void BadStep(Scalar /*quality*/ = 0.0f) {}
53 virtual void FailedStep() {}
54
55 virtual void Rebuild(bool) {}
56
57 virtual std::string stateAsString() const { return ""; }
58 virtual Index dims() const = 0;
59
60 const Cost &cost() const { return cost_; }
61
62 protected:
63 const Options options_;
64 Cost cost_; // Last cost
65};
66
67} // namespace tinyopt::solvers
void NormalizeCost(Cost &cost)
Eventually normalize the cost.
Definition base.h:41
virtual std::optional< Vector< Scalar, Dims > > Solve() const =0
Solve the linear system dx = -H^-1 * grad, returns nullopt on failure.
bool Clamp(Grad_t &g, Scalar minmax) const
Clamp the gradient 'g' to within [-minmax, minmax], if minmax is not 0. Returns true if 'g' was clamp...
Definition base.h:30
Definition cost.h:18
Definition options.h:18