aligator  0.14.0
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// Faster than std::unordered_map with Bost 1.80
5// https://martin.ankerl.com/2022/08/27/hashmap-bench-01/#boost__unordered_map
6#include <boost/unordered_map.hpp>
7
8namespace aligator {
9
10template <typename Scalar> struct CostStackDataTpl;
11
19template <typename _Scalar> struct CostStackTpl : CostAbstractTpl<_Scalar> {
20 using Scalar = _Scalar;
27 using CostItem = std::pair<PolyCost, Scalar>;
28 using CostKey = std::variant<std::size_t, std::string>;
29 using CostMap = boost::unordered::unordered_map<CostKey, CostItem>;
30 using CostIterator = typename CostMap::iterator;
31
33
37 bool checkDimension(const CostBase &comp) const;
38
42 const std::vector<PolyCost> &comps = {},
43 const std::vector<Scalar> &weights = {});
44
46 const CostMap &comps)
47 : CostBase(space, nu)
48 , components_(comps) {
49 for (const auto &[key, item] : comps) {
50 auto &cost = *item.first;
51 if (!this->checkDimension(cost)) {
53 "Cannot add new component due to inconsistent input dimensions "
54 "(got ({:d}, {:d}), expected ({:d}, {:d}))",
55 cost.ndx(), cost.nu, this->ndx(), this->nu);
56 }
57 }
58 }
59
61 CostStackTpl(const PolyCost &cost);
62
63 inline CostItem &addCost(const PolyCost &cost, const Scalar weight = 1.) {
64 const std::size_t size = components_.size();
65 return this->addCost(size, cost, weight);
66 }
67
68 CostItem &addCost(const CostKey &key, const PolyCost &cost,
69 const Scalar weight = 1.);
70
71 inline std::size_t size() const { return components_.size(); }
72
74 template <typename Derived> Derived *getComponent(const CostKey &key) {
75 CostItem &item = components_.at(key);
76 return dynamic_cast<Derived *>(&*item.first);
77 }
78
79 template <typename Derived>
80 const Derived *getComponent(const CostKey &key) const {
81 CostItem &item = components_.at(key);
82 return dynamic_cast<const Derived *>(&*item.first);
83 }
84
85 void evaluate(const ConstVectorRef &x, const ConstVectorRef &u,
86 CostData &data) const;
87
88 void computeGradients(const ConstVectorRef &x, const ConstVectorRef &u,
89 CostData &data) const;
90
91 void computeHessians(const ConstVectorRef &x, const ConstVectorRef &u,
92 CostData &data) const;
93
94 shared_ptr<CostData> createData() const;
95};
96
97namespace {
98template <typename T>
99using CostPtr =
100 xyz::polymorphic<CostAbstractTpl<T>>; //< convenience typedef for rest
101 // of this file
102}
103
104template <typename T>
106 const CostPtr<T> &c2) {
107 return xyz::polymorphic<CostStackTpl<T>>({c1, c2}, {1., 1.});
108}
109
110template <typename T>
112operator+(xyz::polymorphic<CostStackTpl<T>> &&c1, const CostPtr<T> &c2) {
113 c1->addCost(c2, 1.);
114 return c1;
115}
116
117template <typename T>
120 c1->addCost(std::move(c2), 1.);
121 return c1;
122}
123
124template <typename T>
126operator+(const xyz::polymorphic<CostStackTpl<T>> &c1, CostPtr<T> &&c2) {
127 c1->addCost(std::move(c2), 1.);
128 return c1;
129}
130
131template <typename T>
134 for (auto &[key, item] : c1->components_) {
135 item.second *= u;
136 }
137 return c1;
138}
139
140template <typename _Scalar>
142 using Scalar = _Scalar;
145 using CostKey = typename CostStack::CostKey;
146 using DataMap =
147 boost::unordered::unordered_map<CostKey, shared_ptr<CostData>>;
150};
151} // namespace aligator
152
153#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
154#include "aligator/modelling/costs/sum-of-costs.txx"
155#endif
#define ALIGATOR_DOMAIN_ERROR(...)
Main package namespace.
xyz::polymorphic< CostStackTpl< T > > operator*(T u, xyz::polymorphic< CostStackTpl< T > > &&c1)
xyz::polymorphic< CostStackTpl< T > > operator+(const CostPtr< T > &c1, const CostPtr< T > &c2)
xyz::polymorphic< Manifold > space
CostAbstractTpl(U &&space, const int nu)
Data struct for CostAbstractTpl.
CostDataAbstractTpl(const int ndx, const int nu)
CostStackDataTpl(const CostStackTpl< Scalar > &obj)
typename CostStack::CostKey CostKey
boost::unordered::unordered_map< CostKey, shared_ptr< CostData > > DataMap
CostDataAbstractTpl< Scalar > CostData
Weighted sum of multiple cost components.
CostItem & addCost(const PolyCost &cost, const Scalar weight=1.)
CostItem & addCost(const CostKey &key, const PolyCost &cost, const Scalar weight=1.)
void computeGradients(const ConstVectorRef &x, const ConstVectorRef &u, CostData &data) const
Compute the cost gradients .
std::variant< std::size_t, std::string > CostKey
ManifoldAbstractTpl< Scalar > Manifold
Derived * getComponent(const CostKey &key)
Get component, cast down to the specified type.
xyz::polymorphic< CostBase > PolyCost
CostStackTpl(const PolyCost &cost)
Constructor from a single CostBase instance.
CostStackTpl(xyz::polymorphic< Manifold > space, const int nu, const std::vector< PolyCost > &comps={}, const std::vector< Scalar > &weights={})
Constructor with a specified dimension, and optional vector of components and weights.
boost::unordered::unordered_map< CostKey, CostItem > CostMap
CostStackTpl(xyz::polymorphic< Manifold > space, const int nu, const CostMap &comps)
CostAbstractTpl< Scalar > CostBase
ALIGATOR_DYNAMIC_TYPEDEFS(Scalar)
void evaluate(const ConstVectorRef &x, const ConstVectorRef &u, CostData &data) const
Evaluate the cost function.
bool checkDimension(const CostBase &comp) const
Check the dimension of a component.
typename CostMap::iterator CostIterator
const Derived * getComponent(const CostKey &key) const
void computeHessians(const ConstVectorRef &x, const ConstVectorRef &u, CostData &data) const
Compute the cost Hessians .
shared_ptr< CostData > createData() const
CostDataAbstractTpl< Scalar > CostData
std::pair< PolyCost, Scalar > CostItem
CostStackDataTpl< Scalar > SumCostData
Base class for manifolds, to use in cost funcs, solvers...