cyqlone develop
Fast, parallel and vectorized solver for linear systems with optimal control structure.
Loading...
Searching...
No Matches
solver.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cyqlone/config.hpp>
5#include <cyqlone/qpalm/export.h>
8#include <cyqlone/timing.hpp>
9#include <guanaqo/atomic-stop-signal.hpp>
10#include <guanaqo/timed.hpp>
11#include <map>
12#include <memory>
13#include <optional>
14#include <string>
15
16namespace cyqlone::qpalm {
17
18/// @ingroup topic-optimization-solvers
37
38/// @relates SolverTimings
39CYQLONE_QPALM_EXPORT std::ostream &operator<<(std::ostream &, const SolverTimings &);
40
41/// @ingroup topic-optimization-solvers
42struct CYQLONE_QPALM_EXPORT SolverStats {
43 unsigned inner_iter = 0;
44 unsigned outer_iter = 0;
45 real_t stationarity = std::numeric_limits<real_t>::quiet_NaN();
46 real_t primal_residual_norm = std::numeric_limits<real_t>::quiet_NaN();
47 real_t max_penalty = std::numeric_limits<real_t>::quiet_NaN();
49 std::optional<DetailedStats> detail = std::nullopt;
50};
51
52} // namespace cyqlone::qpalm
53
54namespace CYQLONE_NS(cyqlone::qpalm) {
55
56namespace detail {
57
58template <class T>
59struct backend_type; // deliberately undefined
60
61template <class T, class D>
62struct backend_type<std::unique_ptr<T, D>> {
63 using type = T;
64};
65
66template <class T>
67struct backend_type<T *> {
68 using type = T;
69};
70
71template <class T>
73
74template <class T>
75struct backend_stats_type; // deliberately undefined
76
77} // namespace detail
78
79template <class Backend>
81
82/// @ingroup topic-optimization-solvers
83template <class Backend>
84class Solver {
85 private:
87 /// Run QPALM on the scaled problem
88 [[nodiscard]] SolverStatus do_solve();
89
90 public:
92
94 guanaqo::Timed t{stats.emplace().timings.total};
95 return do_solve();
96 }
97
98 Backend backend;
100 std::unique_ptr<SolverImplementation<backend_type>> impl{};
101 std::optional<SolverStats> stats = std::nullopt;
102 std::optional<BackendStats> stats_backend = std::nullopt;
104
105 [[nodiscard]] index_t get_num_variables() const;
106 [[nodiscard]] index_t get_num_equality_constraints() const;
107 [[nodiscard]] index_t get_num_inequality_constraints() const;
108
109 [[nodiscard]] bool has_result() const;
110 void get_solution(std::span<real_t>) const;
111 [[nodiscard]] std::vector<real_t> get_solution() const;
112 void get_equality_multipliers(std::span<real_t>) const;
113 [[nodiscard]] std::vector<real_t> get_equality_multipliers() const;
114 void get_equality_constraints(std::span<real_t>) const;
115 [[nodiscard]] std::vector<real_t> get_equality_constraints() const;
116 void get_inequality_multipliers(std::span<real_t>) const;
117 [[nodiscard]] std::vector<real_t> get_inequality_multipliers() const;
118 void get_inequality_constraints(std::span<real_t>) const;
119 [[nodiscard]] std::vector<real_t> get_inequality_constraints() const;
120 void get_penalty_factors(std::span<real_t>) const;
121 [[nodiscard]] std::vector<real_t> get_penalty_factors() const;
122 void warm_start_solution();
123 void set_initial_guess(std::span<const real_t> x, std::span<const real_t> y,
124 std::span<const real_t> λ);
125 bool get_initial_guess(std::span<real_t> x, std::span<real_t> y, std::span<real_t> λ);
126 void set_b_eq(std::span<const real_t> b_eq);
127 void set_b_lb(std::span<const real_t> b_lb);
128 void set_b_ub(std::span<const real_t> b_ub);
129
130 void stop() { stop_signal.stop(); }
131
132 Solver(Backend backend, Settings settings = {});
133 Solver(const Solver &) = delete;
134 Solver &operator=(const Solver &) = delete;
135 Solver(Solver &&) noexcept;
136 Solver &operator=(Solver &&) noexcept;
138};
139
140} // namespace CYQLONE_NS(cyqlone::qpalm)
bool get_initial_guess(std::span< real_t > x, std::span< real_t > y, std::span< real_t > λ)
Definition solver.tpp:591
std::optional< BackendStats > stats_backend
Definition solver.hpp:102
void set_b_ub(std::span< const real_t > b_ub)
Definition solver.tpp:609
void get_penalty_factors(std::span< real_t >) const
guanaqo::AtomicStopSignal stop_signal
Definition solver.hpp:103
Solver(const Solver &)=delete
Solver(Solver &&) noexcept
std::optional< SolverStats > stats
Definition solver.hpp:101
detail::backend_type_t< Backend > backend_type
Definition solver.hpp:86
SolverStatus operator()()
Definition solver.hpp:93
typename detail::backend_stats_type< backend_type >::type BackendStats
Definition solver.hpp:91
Solver & operator=(const Solver &)=delete
SolverStatus do_solve()
Run QPALM on the scaled problem.
Definition solver.tpp:101
std::unique_ptr< SolverImplementation< backend_type > > impl
Definition solver.hpp:100
Solver(Backend backend, Settings settings={})
Definition solver.tpp:624
void set_b_eq(std::span< const real_t > b_eq)
Definition solver.tpp:601
void set_initial_guess(std::span< const real_t > x, std::span< const real_t > y, std::span< const real_t > λ)
Definition solver.tpp:578
std::vector< real_t > get_penalty_factors() const
void set_b_lb(std::span< const real_t > b_lb)
Definition solver.tpp:605
#define CYQLONE_NS(ns)
Definition config.hpp:10
std::optional< DetailedStats > detail
Definition solver.hpp:49
SolverStatus
Exit status of a numerical solver.
Definition status.hpp:12
typename backend_type< T >::type backend_type_t
Definition solver.hpp:72
batmat::DefaultTimings DefaultTimings
Definition timing.hpp:7
cyqlone::TricyqleSolver< v, real_t > Solver
std::map< std::string, DefaultTimings > backend
Definition solver.hpp:35
DefaultTimings recompute_inner
Definition solver.hpp:23
DefaultTimings update_penalty
Definition solver.hpp:31
std::ostream & operator<<(std::ostream &, const SolverTimings &)
DefaultTimings boost_regularization
Definition solver.hpp:33
DefaultTimings line_search
Definition solver.hpp:22
DefaultTimings mat_vec_AT
Definition solver.hpp:28
DefaultTimings update_regularization
Definition solver.hpp:32
DefaultTimings active_set_change
Definition solver.hpp:30
DefaultTimings mat_vec_MT
Definition solver.hpp:26
DefaultTimings recompute_outer
Definition solver.hpp:24