Nonconvex constrained optimization
Loading...
Searching...
No Matches
extra-stats.hpp
Go to the documentation of this file.
1#pragma once
2
6
7#include <chrono>
8#include <memory>
9
10namespace alpaqa::driver {
11
12template <alpaqa::Config Conf>
15 static constexpr real_t NaN = alpaqa::NaN<Conf>;
16 struct Record {
18 double time;
20 fbe = NaN, tau = NaN, radius = NaN, rho = NaN;
21 };
22 std::vector<Record> stats{};
23 std::chrono::steady_clock::time_point t0;
24
25 void update_iter(const auto &progress_info) {
27 auto t = std::chrono::steady_clock::now();
28 if (progress_info.outer_iter == 0 && progress_info.k == 0)
29 t0 = t;
30 Record r{
31 .outer_iter = progress_info.outer_iter,
32 .inner_iter = progress_info.k,
33 .time = std::chrono::duration<double>{t - t0}.count(),
34 };
35 if constexpr (requires { progress_info.γ; })
36 r.gamma = progress_info.γ;
37 if constexpr (requires { progress_info.ε; })
38 r.eps = progress_info.ε;
39 if constexpr (requires { progress_info.ψ; })
40 r.psi = progress_info.ψ;
41 if constexpr (requires { progress_info.ψ_hat; })
42 r.psi_hat = progress_info.ψ_hat;
43 if constexpr (requires { progress_info.φγ; })
44 r.fbe = progress_info.φγ;
45 if constexpr (requires { progress_info.τ; })
46 r.tau = progress_info.τ;
47 if constexpr (requires { progress_info.Δ; })
48 r.radius = progress_info.Δ;
49 if constexpr (requires { progress_info.ρ; })
50 r.rho = progress_info.ρ;
51 if constexpr (requires {
52 progress_info.y;
53 progress_info.ŷ;
54 progress_info.Σ;
55 })
56 r.delta = norm_inf((progress_info.ŷ - progress_info.y)
57 .cwiseQuotient(progress_info.Σ));
58 stats.push_back(r);
59 }
60};
61
62template <alpaqa::Config Conf>
66 std::shared_ptr<const AlpaqaSolverStatsCollector<config_t>>;
70 [[nodiscard]] bool has_statistics() const override {
71 return collector && !collector->stats.empty();
72 }
73 void write_statistics_to_stream(std::ostream &os) const override {
74 std::array<char, 64> buf;
75 os << "outer_iter,inner_iter,time,gamma,eps,delta,psi,psi_hat,fbe,tau,"
76 "radius,rho\n";
77 for (const auto &r : collector->stats) {
78 os << r.outer_iter << ',' << r.inner_iter << ','
79 << alpaqa::float_to_str_vw(buf, r.time) << ','
80 << alpaqa::float_to_str_vw(buf, r.gamma) << ','
81 << alpaqa::float_to_str_vw(buf, r.eps) << ','
82 << alpaqa::float_to_str_vw(buf, r.delta) << ','
83 << alpaqa::float_to_str_vw(buf, r.psi) << ','
84 << alpaqa::float_to_str_vw(buf, r.psi_hat) << ','
85 << alpaqa::float_to_str_vw(buf, r.fbe) << ','
86 << alpaqa::float_to_str_vw(buf, r.tau) << ','
87 << alpaqa::float_to_str_vw(buf, r.radius) << ','
88 << alpaqa::float_to_str_vw(buf, r.rho) << '\n';
89 }
90 }
91};
92
93} // namespace alpaqa::driver
#define USING_ALPAQA_CONFIG(Conf)
Definition config.hpp:77
std::function< solver_free_func_t > solver_func_t
auto norm_inf(const Eigen::MatrixBase< Derived > &v)
Get the maximum or infinity-norm of the given vector.
Definition config.hpp:204
typename Conf::real_t real_t
Definition config.hpp:86
constexpr const auto NaN
Definition config.hpp:114
void update_iter(const auto &progress_info)
std::chrono::steady_clock::time_point t0
std::shared_ptr< const AlpaqaSolverStatsCollector< config_t > > collector_t
AlpaqaSolverWrapperStats(solver_func_t run, collector_t collector)
void write_statistics_to_stream(std::ostream &os) const override
SolverWrapper(solver_func_t run)