tinyopt
700
Tinyopt, a lightweight, header only optimization library
Toggle main menu visibility
Loading...
Searching...
No Matches
summary.h
1
// Copyright 2026 Julien Michot.
2
// SPDX-License-Identifier: Apache-2.0
3
4
#pragma once
5
6
#include <array>
7
#include <cstddef>
8
#include <cstdint>
9
#include <optional>
10
#include <variant>
11
#include <vector>
12
13
#include <Eigen/Core>
14
15
#include <tinyopt/cost.h>
16
#include <tinyopt/math.h>
// Defines Matrix and Vector
17
#include <tinyopt/stop_reasons.h>
18
#include <tinyopt/time.h>
19
#include <tinyopt/traits.h>
// Defines parameters_size_v
20
21
namespace
tinyopt {
22
23
/***
24
* @brief Struct containing optimization results
25
*
26
***/
27
struct
Summary
{
28
using
Scalar = double;
29
31
bool
Succeeded
()
const
{
return
stop_reason
>= StopReason::kNone; }
32
34
bool
Converged
()
const
{
35
return
stop_reason
>= StopReason::kMinError &&
stop_reason
< StopReason::kMaxIters;
36
}
37
81
template
<
typename
M = MatX>
82
std::optional<M>
Covariance
(
bool
rescaled =
false
)
const
{
83
using
M2 =
84
std::conditional_t<traits::is_sparse_matrix_v<M>, SparseMat, MatX>;
// TODO better way?
85
if
(!std::holds_alternative<M2>(
final_hessian
))
return
{};
86
const
auto
&final_hessian_dense = std::get<M2>(
final_hessian
);
87
const
auto
&cov = InvCov(final_hessian_dense);
88
if
(cov) {
89
if
(rescaled &&
num_residuals
> final_hessian_dense.cols())
90
return
cov.value() *
91
(
final_cost
*
final_cost
/ (
num_residuals
- final_hessian_dense.cols()));
92
else
93
return
cov.value();
94
}
95
return
{};
96
}
97
98
bool
has_final_hessian()
const
{
return
!std::holds_alternative<std::monostate>(
final_hessian
); }
99
const
auto
&final_hessian_dense()
const
{
return
std::get<MatX>(
final_hessian
); }
100
const
auto
&final_hessian_sparse()
const
{
return
std::get<SparseMat>(
final_hessian
); }
101
103
Cost
final_cost
=
Cost
(std::numeric_limits<Scalar>::max(), 0);
104
Scalar final_rerr_dec = std::numeric_limits<Scalar>::max();
105
107
StopReason
stop_reason
= StopReason::kNone;
108
113
uint16_t
num_residuals
= 0;
114
uint16_t
num_iters
= 0;
115
uint8_t
num_failures
= 0;
116
uint8_t
num_consec_failures
=
117
0;
118
119
TimePoint
start_time
=
120
TimePoint::min();
122
float
duration_ms
= 0;
123
125
std::variant<std::monostate, MatX, SparseMat>
final_hessian
;
126
128
bool
num_diff_used
=
false
;
129
131
136
137
struct
History
{
138
#if defined(TINYOPT_ENFORCE_NO_DYNAMIC_ALLOCATIONS)
139
std::array<Scalar, 2>
errs
{};
140
std::array<Scalar, 2>
deltas2
{};
141
std::array<bool, 2>
successes
{};
142
std::size_t size = 0;
143
144
void
Add(Scalar err, Scalar delta2,
bool
success) {
145
const
std::size_t index = size == 0 ? 0 : 1;
146
errs
[index] = err;
147
deltas2
[index] = delta2;
148
successes
[index] = success;
149
if
(size < 2) ++size;
150
}
151
152
bool
empty()
const
{
return
size == 0; }
153
Scalar last_delta2()
const
{
return
deltas2
[size == 1 ? 0 : 1]; }
154
#else
155
std::vector<Scalar>
errs
;
156
std::vector<Scalar>
deltas2
;
157
std::vector<bool>
successes
;
158
159
void
Add(Scalar err, Scalar delta2,
bool
success) {
160
errs
.emplace_back(err);
161
deltas2
.emplace_back(delta2);
162
successes
.emplace_back(success);
163
}
164
165
bool
empty()
const
{
return
deltas2
.empty(); }
166
Scalar last_delta2()
const
{
return
deltas2
.back(); }
167
#endif
168
} hist;
169
171
};
172
173
}
// namespace tinyopt
tinyopt::Cost
Definition
cost.h:18
tinyopt::Summary::History
Definition
summary.h:137
tinyopt::Summary::History::deltas2
std::vector< Scalar > deltas2
Squared step sizes of all iterations.
Definition
summary.h:156
tinyopt::Summary::History::errs
std::vector< Scalar > errs
Mean squared accumulated errors of all iterations.
Definition
summary.h:155
tinyopt::Summary::History::successes
std::vector< bool > successes
Step acceptance status.
Definition
summary.h:157
tinyopt::Summary
Definition
summary.h:27
tinyopt::Summary::Converged
bool Converged() const
Returns true if the optimization reached the specified minimal error, delta or gradient.
Definition
summary.h:34
tinyopt::Summary::num_diff_used
bool num_diff_used
True if numerical derivatives were used.
Definition
summary.h:128
tinyopt::Summary::stop_reason
StopReason stop_reason
Stop reason.
Definition
summary.h:107
tinyopt::Summary::final_cost
Cost final_cost
Last valid error.
Definition
summary.h:103
tinyopt::Summary::num_failures
uint8_t num_failures
Final number of failures to decrease the error.
Definition
summary.h:115
tinyopt::Summary::num_consec_failures
uint8_t num_consec_failures
Final number of the last consecutive failures to decrease the error.
Definition
summary.h:116
tinyopt::Summary::final_hessian
std::variant< std::monostate, MatX, SparseMat > final_hessian
Final H, excluding any damping (only saved if options.hessian.save = true).
Definition
summary.h:125
tinyopt::Summary::num_residuals
uint16_t num_residuals
Final number of residuals.
Definition
summary.h:113
tinyopt::Summary::start_time
TimePoint start_time
Definition
summary.h:119
tinyopt::Summary::Covariance
std::optional< M > Covariance(bool rescaled=false) const
Computes an approximation of the covariance matrix.
Definition
summary.h:82
tinyopt::Summary::duration_ms
float duration_ms
Cumulated optimization duration.
Definition
summary.h:122
tinyopt::Summary::num_iters
uint16_t num_iters
Final number of iterations.
Definition
summary.h:114
tinyopt::Summary::Succeeded
bool Succeeded() const
Returns true if the stop reason is not a failure to solve or NaNs or missing residuals.
Definition
summary.h:31
include
tinyopt
summary.h
Generated by
1.18.0