tinyopt 700
Tinyopt, a lightweight, header only optimization library
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
21namespace tinyopt {
22
23/***
24 * @brief Struct containing optimization results
25 *
26 ***/
27struct 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;
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
Definition cost.h:18
Definition summary.h:137
std::vector< Scalar > deltas2
Squared step sizes of all iterations.
Definition summary.h:156
std::vector< Scalar > errs
Mean squared accumulated errors of all iterations.
Definition summary.h:155
std::vector< bool > successes
Step acceptance status.
Definition summary.h:157
Definition summary.h:27
bool Converged() const
Returns true if the optimization reached the specified minimal error, delta or gradient.
Definition summary.h:34
bool num_diff_used
True if numerical derivatives were used.
Definition summary.h:128
StopReason stop_reason
Stop reason.
Definition summary.h:107
Cost final_cost
Last valid error.
Definition summary.h:103
uint8_t num_failures
Final number of failures to decrease the error.
Definition summary.h:115
uint8_t num_consec_failures
Final number of the last consecutive failures to decrease the error.
Definition summary.h:116
std::variant< std::monostate, MatX, SparseMat > final_hessian
Final H, excluding any damping (only saved if options.hessian.save = true).
Definition summary.h:125
uint16_t num_residuals
Final number of residuals.
Definition summary.h:113
TimePoint start_time
Definition summary.h:119
std::optional< M > Covariance(bool rescaled=false) const
Computes an approximation of the covariance matrix.
Definition summary.h:82
float duration_ms
Cumulated optimization duration.
Definition summary.h:122
uint16_t num_iters
Final number of iterations.
Definition summary.h:114
bool Succeeded() const
Returns true if the stop reason is not a failure to solve or NaNs or missing residuals.
Definition summary.h:31