aligator  0.6.1
A primal-dual augmented Lagrangian-type solver for nonlinear trajectory optimization.
Loading...
Searching...
No Matches
sum-of-costs.hpp
Go to the documentation of this file.
1#pragma once
2
4
5namespace aligator {
6
7template <typename Scalar> struct CostStackDataTpl;
8
16template <typename _Scalar> struct CostStackTpl : CostAbstractTpl<_Scalar> {
17 using Scalar = _Scalar;
19 using CostBase = CostAbstractTpl<Scalar>;
20 using CostData = CostDataAbstractTpl<Scalar>;
21 using CostPtr = shared_ptr<CostBase>;
22 using SumCostData = CostStackDataTpl<Scalar>;
23 using Manifold = ManifoldAbstractTpl<Scalar>;
24
25 std::vector<CostPtr> components_;
26 std::vector<Scalar> weights_;
27
31 bool checkDimension(const CostBase *comp) const;
32
35 CostStackTpl(shared_ptr<Manifold> space, const int nu,
36 const std::vector<CostPtr> &comps = {},
37 const std::vector<Scalar> &weights = {});
38
40 CostStackTpl(const CostPtr &cost);
41
42 void addCost(const CostPtr &cost, const Scalar weight = 1.);
43
44 std::size_t size() const;
45
46 void evaluate(const ConstVectorRef &x, const ConstVectorRef &u,
47 CostData &data) const;
48
49 void computeGradients(const ConstVectorRef &x, const ConstVectorRef &u,
50 CostData &data) const;
51
52 void computeHessians(const ConstVectorRef &x, const ConstVectorRef &u,
53 CostData &data) const;
54
55 shared_ptr<CostData> createData() const;
56};
57
58namespace {
59template <typename T>
60using CostPtr = shared_ptr<CostAbstractTpl<T>>; //< convenience typedef for rest
61 // of this file
62}
63
64template <typename T>
65shared_ptr<CostStackTpl<T>> operator+(const CostPtr<T> &c1,
66 const CostPtr<T> &c2) {
67 return std::make_shared<CostStackTpl<T>>({c1, c2}, {1., 1.});
68}
69
70template <typename T>
71shared_ptr<CostStackTpl<T>> operator+(shared_ptr<CostStackTpl<T>> &&c1,
72 const CostPtr<T> &c2) {
73 c1->addCost(c2, 1.);
74 return c1;
75}
76
77template <typename T>
78shared_ptr<CostStackTpl<T>> operator+(shared_ptr<CostStackTpl<T>> &&c1,
79 CostPtr<T> &&c2) {
80 c1->addCost(std::move(c2), 1.);
81 return c1;
82}
83
84template <typename T>
85shared_ptr<CostStackTpl<T>> operator+(const shared_ptr<CostStackTpl<T>> &c1,
86 CostPtr<T> &&c2) {
87 c1->addCost(std::move(c2), 1.);
88 return c1;
89}
90
91template <typename T>
92shared_ptr<CostStackTpl<T>> operator*(T u, const CostPtr<T> &c1) {
93 return std::make_shared<CostStackTpl<T>>({c1}, {u});
94}
95
96template <typename T>
97shared_ptr<CostStackTpl<T>> operator*(T u, shared_ptr<CostStackTpl<T>> &&c1) {
98 for (std::size_t i = 0; i < c1->size(); i++) {
99 c1->weights_[i] *= u;
100 }
101 return c1;
102}
103
104template <typename _Scalar>
106 using Scalar = _Scalar;
107 using CostData = CostDataAbstractTpl<Scalar>;
108 std::vector<shared_ptr<CostData>> sub_cost_data;
109 CostStackDataTpl(const CostStackTpl<Scalar> &obj);
110};
111} // namespace aligator
112
113#include "aligator/modelling/costs/sum-of-costs.hxx"
114
115#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
116#include "aligator/modelling/costs/sum-of-costs.txx"
117#endif
Main package namespace.
shared_ptr< CostStackTpl< T > > operator*(T u, const CostPtr< T > &c1)
shared_ptr< CostStackTpl< T > > operator+(const CostPtr< T > &c1, const CostPtr< T > &c2)
Stage costs for control problems.
int nu
Control dimension.
shared_ptr< Manifold > space
State dimension.
std::vector< shared_ptr< CostData > > sub_cost_data
CostStackDataTpl(const CostStackTpl< Scalar > &obj)
Weighted sum of multiple cost components.
void computeGradients(const ConstVectorRef &x, const ConstVectorRef &u, CostData &data) const
Compute the cost gradients .
ManifoldAbstractTpl< Scalar > Manifold
CostStackTpl(shared_ptr< Manifold > space, const int nu, const std::vector< CostPtr > &comps={}, const std::vector< Scalar > &weights={})
Constructor with a specified dimension, and optional vector of components and weights.
void addCost(const CostPtr &cost, const Scalar weight=1.)
ALIGATOR_DYNAMIC_TYPEDEFS(Scalar)
CostStackTpl(const CostPtr &cost)
Constructor from a single CostBase instance.
std::vector< Scalar > weights_
void evaluate(const ConstVectorRef &x, const ConstVectorRef &u, CostData &data) const
Evaluate the cost function.
void computeHessians(const ConstVectorRef &x, const ConstVectorRef &u, CostData &data) const
Compute the cost Hessians .
shared_ptr< CostBase > CostPtr
shared_ptr< CostData > createData() const
bool checkDimension(const CostBase *comp) const
Check the dimension of a component.
std::vector< CostPtr > components_
std::size_t size() const
CostStackDataTpl< Scalar > SumCostData