Nonconvex constrained optimization
Loading...
Searching...
No Matches
lbfgsb-driver.cpp
Go to the documentation of this file.
1#if ALPAQA_WITH_LBFGSB
2
6
10#include "extra-stats.hpp"
11#include "lbfgsb-driver.hpp"
12
13namespace alpaqa::driver {
14namespace {
15
16using InnerLBFGSBSolver = lbfgsb::LBFGSBSolver;
17
18auto make_inner_lbfgsb_solver(Options &opts) {
19 // Settings for the solver
20 InnerLBFGSBSolver::Params solver_param;
21 solver_param.max_iter = 50'000;
22 solver_param.print_interval = 0;
23 solver_param.stop_crit = PANOCStopCrit::ProjGradUnitNorm;
24 set_params(solver_param, "solver", opts);
25 return InnerLBFGSBSolver{solver_param};
26}
27
28template <class LoadedProblem>
29SharedSolverWrapper make_lbfgsb_driver_impl(std::string_view direction,
30 Options &opts) {
31 if (!direction.empty())
32 throw std::invalid_argument(
33 "L-BFGS-B solver does not support any directions");
34 using collector_t = AlpaqaSolverStatsCollector<config_t>;
35 std::shared_ptr<collector_t> collector;
36 auto inner_solver = make_inner_lbfgsb_solver(opts);
37 bool extra_stats = false;
38 set_params(extra_stats, "extra_stats", opts);
39 if (extra_stats) {
40 collector = std::make_shared<collector_t>();
41 inner_solver.set_progress_callback(
42 [collector](const auto &progress_info) {
43 collector->update_iter(progress_info);
44 });
45 }
46 auto solver = make_alm_solver(std::move(inner_solver), opts);
47 unsigned N_exp = 0;
48 set_params(N_exp, "num_exp", opts);
49 auto run = [solver{std::move(solver)},
50 N_exp](LoadedProblem &problem,
51 std::ostream &os) mutable -> SolverResults {
52 auto cancel = attach_cancellation(solver);
53 return run_alm_solver(problem, solver, os, N_exp);
54 };
55 return std::make_shared<AlpaqaSolverWrapperStats<config_t>>(
56 std::move(run), std::move(collector));
57}
58
59} // namespace
60
61SharedSolverWrapper make_lbfgsb_driver(std::string_view direction,
62 Options &opts) {
63 static constexpr bool valid_config =
64 std::is_same_v<LoadedProblem::config_t, InnerLBFGSBSolver::config_t>;
65 if constexpr (valid_config)
66 return make_lbfgsb_driver_impl<LoadedProblem>(direction, opts);
67 else
68 throw std::invalid_argument(
69 "L-BFGS-B solver only supports double precision");
70}
71} // namespace alpaqa::driver
72
74
75#else
76
78
79namespace alpaqa::driver {
81 throw std::invalid_argument(
82 "This version of alpaqa was compiled without L-BFGS-B support.");
83}
84} // namespace alpaqa::driver
85
86#endif
Augmented Lagrangian Method solver.
Definition alm.hpp:69
SharedSolverWrapper make_lbfgsb_driver(std::string_view, alpaqa::Options &)
SolverResults run_alm_solver(LoadedProblem &problem, Solver &solver, std::ostream &os, unsigned N_exp)
std::shared_ptr< SolverWrapper > SharedSolverWrapper
auto make_alm_solver(InnerSolver &&inner_solver, Options &opts)
@ ProjGradUnitNorm
∞-norm of the projected gradient with unit step size:
void set_params(T &t, std::string_view prefix, Options &opts)
Definition options.hpp:128
auto attach_cancellation(Solver &solver)
Attach SIGINT and SIGTERM handlers to stop the given solver.
Definition cancel.hpp:21