aligator  0.16.0
A versatile and efficient C++ library for real-time constrained trajectory optimization.
Loading...
Searching...
No Matches
solver-fddp.hpp
Go to the documentation of this file.
1
6#pragma once
7
11
12#include "workspace.hpp"
13#include "results.hpp"
14
17#include "aligator/threads.hpp"
18
19#include <boost/unordered_map.hpp>
20
21namespace aligator {
22
28template <typename Scalar> struct SolverFDDPTpl {
42 using CallbackPtr = shared_ptr<CallbackBaseTpl<Scalar>>;
43 using CallbackMap = boost::unordered_map<std::string, CallbackPtr,
44 ExtendedStringHash, std::equal_to<>>;
45
47
50 Scalar reg_init;
51 Scalar preg_ = reg_init;
52 Scalar reg_min_ = 1e-9;
53 Scalar reg_max_ = 1e9;
55 Scalar reg_dec_factor_ = 0.1;
57 Scalar reg_inc_factor_ = 10.;
59
60 Scalar th_grad_ = 1e-12;
61 Scalar th_step_dec_ = 0.5;
62 Scalar th_step_inc_ = 0.01;
63
65
68 std::size_t max_iters;
73
75
76 void setNumThreads(const std::size_t num_threads) {
77 num_threads_ = num_threads;
78 omp::set_default_options(num_threads);
79 }
80 std::size_t getNumThreads() const { return num_threads_; }
81
82protected:
84 std::size_t num_threads_;
87
88public:
91
92 SolverFDDPTpl(const Scalar tol = 1e-6,
94 const Scalar reg_init = 1e-9,
95 const std::size_t max_iters = 200);
96
98 void setup(const Problem &problem);
99
110 static Scalar forwardPass(const Problem &problem, const Results &results,
111 Workspace &workspace, const Scalar alpha);
112
119 void updateExpectedImprovement(Workspace &workspace, Results &results) const;
120
127 void expectedImprovement(Workspace &workspace, Scalar &d1, Scalar &d2) const;
128
135 inline Scalar computeInfeasibility(const Problem &problem);
136
138 void backwardPass(const Problem &problem, Workspace &workspace) const;
139
143 ALIGATOR_INLINE void acceptGains(const Workspace &workspace,
144 Results &results) const {
145 assert(workspace.kktRhs.size() == results.gains_.size());
147 results.gains_ = workspace.kktRhs;
148 }
149
150 inline void increaseRegularization() {
152 preg_ = std::min(preg_, reg_max_);
153 }
154
155 inline void decreaseRegularization() {
157 preg_ = std::max(preg_, reg_min_);
158 }
159
161 inline Scalar computeCriterion(Workspace &workspace);
162
164 void registerCallback(std::string_view name, CallbackPtr cb) {
165 callbacks_.insert_or_assign(name, cb);
166 }
167
168 const CallbackMap &getCallbacks() const { return callbacks_; }
169 void removeCallback(std::string_view name) { callbacks_.erase(name); }
170 auto getCallbackNames() const {
171 std::vector<std::string> keys;
172 for (const auto &item : callbacks_) {
173 keys.push_back(item.first);
174 }
175 return keys;
176 }
177 CallbackPtr getCallback(std::string_view name) const {
178 auto cb = callbacks_.find(name);
179 if (cb != end(callbacks_)) {
180 return cb->second;
181 }
182 return nullptr;
183 }
184
186 void clearCallbacks() { callbacks_.clear(); }
187
188 void invokeCallbacks() {
189 for (const auto &cb : callbacks_) {
190 cb.second->call(workspace_, results_);
191 }
192 }
193
194 bool run(const Problem &problem, const std::vector<VectorXs> &xs_init = {},
195 const std::vector<VectorXs> &us_init = {});
196};
197
198} // namespace aligator
199
200#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
201#include "./solver-fddp.txx"
202#endif
LinesearchOptions< T > Options
#define ALIGATOR_INLINE
Definition fwd.hpp:27
Base structs for linesearch algorithms.
#define ALIGATOR_NOMALLOC_SCOPED
Definition math.hpp:44
::aligator::context::Scalar Scalar
Definition context.hpp:14
void set_default_options(std::size_t num_threads, bool dynamic=true)
Definition threads.hpp:25
Main package namespace.
VerboseLevel
Verbosity level.
Definition fwd.hpp:82
@ QUIET
Definition fwd.hpp:82
Data struct for CostAbstractTpl.
Specific data struct for explicit dynamics ExplicitDynamicsModelTpl.
Explicit forward dynamics model .
Extended hashing function for strings which supports const char* and std::string_view.
A table logging utility to log the trace of the numerical solvers.
Definition logger.hpp:32
Base class for manifolds, to use in cost funcs, solvers...
Q-function model parameters.
std::vector< MatrixXs > gains_
Riccati gains.
void updateExpectedImprovement(Workspace &workspace, Results &results) const
Pre-compute parts of the directional derivatives – this is done before linesearch.
WorkspaceFDDPTpl< Scalar > Workspace
void setup(const Problem &problem)
Allocate workspace and results structs.
boost::unordered_map< std::string, CallbackPtr, ExtendedStringHash, std::equal_to<> > CallbackMap
TrajOptProblemTpl< Scalar > Problem
ExplicitDynamicsModelTpl< Scalar > DynamicsModel
TrajOptDataTpl< Scalar > ProblemData
Scalar reg_inc_factor_
Regularization increase factor.
static Scalar forwardPass(const Problem &problem, const Results &results, Workspace &workspace, const Scalar alpha)
Perform a nonlinear rollout, keeping an infeasibility gap.
void expectedImprovement(Workspace &workspace, Scalar &d1, Scalar &d2) const
Finish computing the directional derivatives – this is done within linesearch.
Linesearch< Scalar >::Options ls_params
Scalar reg_dec_factor_
Regularization decrease factor.
void setNumThreads(const std::size_t num_threads)
ResultsFDDPTpl< Scalar > Results
std::size_t max_iters
Maximum number of iterations for the solver.
CostDataAbstractTpl< Scalar > CostData
shared_ptr< CallbackBaseTpl< Scalar > > CallbackPtr
StageModelTpl< Scalar > StageModel
std::size_t getNumThreads() const
StageDataTpl< Scalar > StageData
ManifoldAbstractTpl< Scalar > Manifold
QFunctionTpl< Scalar > QParams
ExplicitDynamicsDataTpl< Scalar > ExplicitDynamicsData
ValueFunctionTpl< Scalar > VParams
std::size_t num_threads_
Number of threads to use when evaluating the problem or its derivatives.
CallbackMap callbacks_
Callbacks.
SolverFDDPTpl(const Scalar tol=1e-6, VerboseLevel verbose=VerboseLevel::QUIET, const Scalar reg_init=1e-9, const std::size_t max_iters=200)
Data struct for stage models StageModelTpl.
A stage in the control problem.
Problem data struct.
Trajectory optimization problem.
Storage for the value function model parameters.
Workspace for solver SolverFDDP.
Definition workspace.hpp:10
std::vector< MatrixXs > kktRhs
Buffer for KKT system right-hand sides.
Definition workspace.hpp:27