aligator  0.14.0
A primal-dual augmented Lagrangian-type solver for nonlinear trajectory optimization.
Loading...
Searching...
No Matches
traj-opt-problem.hpp
Go to the documentation of this file.
1
3#pragma once
4
8
9namespace aligator {
10
64
78template <typename _Scalar> struct TrajOptProblemTpl {
80 using Scalar = _Scalar;
81
83
92#pragma GCC diagnostic push
93#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
95#pragma GCC diagnostic pop
97 std::function<void(const Self &, std::vector<VectorXs> &)>;
98
102 std::vector<xyz::polymorphic<StageModel>> stages_;
108 VectorXs unone_;
109
112
115 const std::vector<xyz::polymorphic<StageModel>> &stages,
117
119 TrajOptProblemTpl(const ConstVectorRef &x0,
120 const std::vector<xyz::polymorphic<StageModel>> &stages,
123
126
130
132 TrajOptProblemTpl(const ConstVectorRef &x0, const int nu,
136
137 bool initCondIsStateError() const {
138 assert(init_cond_is_state_error_ == checkInitCondIsStateError());
139 return init_cond_is_state_error_;
140 }
141
144
146 ConstVectorRef getInitState() const {
147 if (!initCondIsStateError()) {
149 "Initial condition is not a StateErrorResidual.\n");
150 }
151 return static_cast<StateErrorResidual const *>(&*init_constraint_)->target_;
152 }
153
155 void setInitState(const ConstVectorRef &x0) {
156 if (!initCondIsStateError()) {
158 "Initial condition is not a StateErrorResidual.\n");
159 }
160 static_cast<StateErrorResidual *>(&*init_constraint_)->target_ = x0;
161 }
162
164 ALIGATOR_DEPRECATED void addTerminalConstraint(const StageConstraint &cstr);
168 this->term_cstrs_.pushBack(func, set);
169 }
170
172
173 [[nodiscard]] std::size_t numSteps() const;
174
176 Scalar evaluate(const std::vector<VectorXs> &xs,
177 const std::vector<VectorXs> &us, Data &prob_data,
178 std::size_t num_threads = 1) const;
179
189 void computeDerivatives(const std::vector<VectorXs> &xs,
190 const std::vector<VectorXs> &us, Data &prob_data,
191 std::size_t num_threads = 1,
192 bool compute_second_order = true) const;
193
197
198 bool checkIntegrity() const;
199
201 //
207 template <typename Callable> void setInitializationStrategy(Callable &&func) {
208 static_assert(std::is_convertible_v<Callable, InitializationStrategy>);
209 this->xs_init_strategy_ = std::forward<Callable>(func);
210 }
211
216 void initializeSolution(std::vector<VectorXs> &xs,
217 std::vector<VectorXs> &us) const {
218 xs_init_strategy_(*this, xs);
219 us_default_init(*this, us);
220 }
221
223 void initializeSolution(std::vector<VectorXs> &xs, std::vector<VectorXs> &us,
224 std::vector<VectorXs> &vs,
225 std::vector<VectorXs> &lbdas) const {
226 const size_t nsteps = numSteps();
227 initializeSolution(xs, us);
228 // initialize multipliers...
229 vs.resize(nsteps + 1);
230 lbdas.resize(nsteps + 1);
231 lbdas[0].setZero(init_constraint_->nr);
232 for (size_t i = 0; i < nsteps; i++) {
233 const StageModelTpl<Scalar> &sm = *stages_[i];
234 lbdas[i + 1].setZero(sm.ndx2());
235 vs[i].setZero(sm.nc());
236 }
237
238 if (!term_cstrs_.empty()) {
239 vs[nsteps].setZero(term_cstrs_.totalDim());
240 }
241 }
242
244 [[nodiscard]] auto initializeSolution() const {
245 std::vector<VectorXs> xs, us, vs, lbdas;
246 initializeSolution(xs, us, vs, lbdas);
247 return std::make_tuple(std::move(xs), std::move(us), std::move(vs),
248 std::move(lbdas));
249 }
250
251private:
252 InitializationStrategy xs_init_strategy_;
253
254 // Check if the initial state is a StateErrorResidual.
255 // Since this is a costly operation (dynamic_cast), we cache the result.
256 bool checkInitCondIsStateError() const;
257 bool init_cond_is_state_error_ = false;
258};
259
260namespace internal {
261template <typename Scalar>
262auto problem_last_state_space_helper(const TrajOptProblemTpl<Scalar> &problem) {
263 return problem.term_cost_->space;
264}
265
267template <typename Scalar>
268int problem_last_ndx_helper(const TrajOptProblemTpl<Scalar> &problem) {
269 return problem_last_state_space_helper(problem)->ndx();
270}
271} // namespace internal
272
273} // namespace aligator
274
275#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
276#include "aligator/core/traj-opt-problem.txx"
277#endif
#define ALIGATOR_RUNTIME_ERROR(...)
Definition exceptions.hpp:7
Main package namespace.
void us_default_init(const TrajOptProblemTpl< Scalar > &problem, std::vector< typename math_types< Scalar >::VectorXs > &us)
Default-initialize a controls trajectory from the neutral element of each control space.
Base constraint set type.
Convenience class to manage a stack of constraints.
ALIGATOR_DEPRECATED void pushBack(Cstr &&el)
Stage costs for control problems.
Base class for manifolds, to use in cost funcs, solvers...
Simple struct holding together a function and set, to describe a constraint.
Class representing ternary functions .
A stage in the control problem.
int nc() const
Total number of constraints.
Problem data struct.
void addStage(const xyz::polymorphic< StageModel > &stage)
Add a stage to the control problem.
void addTerminalConstraint(const xyz::polymorphic< StageFunction > &func, const xyz::polymorphic< ConstraintSet > &set)
Add a terminal constraint for the model.
TrajOptProblemTpl(const ConstVectorRef &x0, const std::vector< xyz::polymorphic< StageModel > > &stages, xyz::polymorphic< CostAbstract > term_cost)
Constructor for an initial value problem.
TrajOptProblemTpl(const ConstVectorRef &x0, const int nu, xyz::polymorphic< Manifold > space, xyz::polymorphic< CostAbstract > term_cost)
Constructor for an initial value problem.
ConstraintSetTpl< Scalar > ConstraintSet
ConstraintStackTpl< Scalar > term_cstrs_
StageFunctionTpl< Scalar > StageFunction
void setInitState(const ConstVectorRef &x0)
Set initial state constraint.
void computeDerivatives(const std::vector< VectorXs > &xs, const std::vector< VectorXs > &us, Data &prob_data, std::size_t num_threads=1, bool compute_second_order=true) const
Rollout the problem derivatives, stage per stage.
void initializeSolution(std::vector< VectorXs > &xs, std::vector< VectorXs > &us) const
Execute the initialization strategy to generate an initial candidate solution to the problem.
StageConstraintTpl< Scalar > StageConstraint
xyz::polymorphic< UnaryFunction > init_constraint_
TrajOptProblemTpl(xyz::polymorphic< UnaryFunction > init_constraint, xyz::polymorphic< CostAbstract > term_cost)
Constructor with a given constraint function of any given type.
void setInitializationStrategy(Callable &&func)
Set a function to initialize the state trajectory.
UnaryFunctionTpl< Scalar > UnaryFunction
void removeTerminalConstraints()
Remove all terminal constraints.
xyz::polymorphic< CostAbstract > term_cost_
Scalar evaluate(const std::vector< VectorXs > &xs, const std::vector< VectorXs > &us, Data &prob_data, std::size_t num_threads=1) const
Rollout the problem costs, constraints, dynamics, stage per stage.
void replaceStageCircular(const xyz::polymorphic< StageModel > &model)
Pop out the first StageModel and replace by the supplied one; updates the supplied problem data (Traj...
ALIGATOR_DEPRECATED void addTerminalConstraint(const StageConstraint &cstr)
Add a terminal constraint for the model.
ConstVectorRef getInitState() const
Get initial state constraint.
auto initializeSolution() const
Execute the initialization strategy to generate an initial candidate solution to the problem.
std::vector< xyz::polymorphic< StageModel > > stages_
StateErrorResidualTpl< Scalar > StateErrorResidual
std::function< void(const Self &, std::vector< VectorXs > &)> InitializationStrategy
TrajOptProblemTpl(xyz::polymorphic< UnaryFunction > init_constraint, const std::vector< xyz::polymorphic< StageModel > > &stages, xyz::polymorphic< CostAbstract > term_cost)
Constructor with a given constraint function of any given type.
std::size_t numSteps() const
ManifoldAbstractTpl< Scalar > Manifold
void initializeSolution(std::vector< VectorXs > &xs, std::vector< VectorXs > &us, std::vector< VectorXs > &vs, std::vector< VectorXs > &lbdas) const
Execute the initialization strategy to generate an initial candidate solution to the problem.
Represents unary functions of the form , with no control (or next-state) arguments.