tinyopt
700
Tinyopt, a lightweight, header only optimization library
Toggle main menu visibility
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
17
namespace
tinyopt::solvers {
18
19
template
<
typename
_Scalar,
int
_Dims>
20
class
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
tinyopt::solvers::SolverBase::NormalizeCost
void NormalizeCost(Cost &cost)
Eventually normalize the cost.
Definition
base.h:41
tinyopt::solvers::SolverBase::Solve
virtual std::optional< Vector< Scalar, Dims > > Solve() const =0
Solve the linear system dx = -H^-1 * grad, returns nullopt on failure.
tinyopt::solvers::SolverBase::Clamp
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
tinyopt::Cost
Definition
cost.h:18
tinyopt::Options
Definition
options.h:18
include
tinyopt
solvers
base.h
Generated by
1.18.0