Sleipnir C++ API
Loading...
Searching...
No Matches
filter.hpp
1// Copyright (c) Sleipnir contributors
2
3#pragma once
4
5#include <algorithm>
6#include <cmath>
7#include <limits>
8#include <utility>
9
10#include <Eigen/Core>
11#include <gch/small_vector.hpp>
12
13// See docs/algorithms.md#Works_cited for citation definitions.
14
15namespace slp {
16
22template <typename Scalar>
25 Scalar cost{0};
26
29
30 constexpr FilterEntry() = default;
31
40
46 explicit FilterEntry(Scalar f) : FilterEntry{f, Scalar(0)} {}
47
54 FilterEntry(Scalar f, const Eigen::Vector<Scalar, Eigen::Dynamic>& c_e)
55 : FilterEntry{f, c_e.template lpNorm<1>()} {}
56
66 FilterEntry(Scalar f, Eigen::Vector<Scalar, Eigen::Dynamic>& s,
67 const Eigen::Vector<Scalar, Eigen::Dynamic>& c_e,
68 const Eigen::Vector<Scalar, Eigen::Dynamic>& c_i, Scalar μ)
69 : FilterEntry{f - μ * s.array().log().sum(),
70 c_e.template lpNorm<1>() + (c_i - s).template lpNorm<1>()} {
71 }
72};
73
81template <typename Scalar>
82class Filter {
83 public:
86
91 // Initial filter entry rejects constraint violations above max
92 m_filter.emplace_back(std::numeric_limits<Scalar>::infinity(),
94 }
95
99 void reset() {
100 m_filter.clear();
101
102 // Initial filter entry rejects constraint violations above max
103 m_filter.emplace_back(std::numeric_limits<Scalar>::infinity(),
105 }
106
113 // Remove dominated entries
114 erase_if(m_filter, [&](const auto& elem) {
115 return entry.cost <= elem.cost &&
116 entry.constraint_violation <= elem.constraint_violation;
117 });
118
119 m_filter.push_back(entry);
120 }
121
128 // Remove dominated entries
129 erase_if(m_filter, [&](const auto& elem) {
130 return entry.cost <= elem.cost &&
131 entry.constraint_violation <= elem.constraint_violation;
132 });
133
134 m_filter.push_back(entry);
135 }
136
144 bool try_add(const FilterEntry<Scalar>& entry, Scalar α) {
145 if (is_acceptable(entry, α)) {
146 add(entry);
147 return true;
148 } else {
149 return false;
150 }
151 }
152
161 if (is_acceptable(entry, α)) {
162 add(std::move(entry));
163 return true;
164 } else {
165 return false;
166 }
167 }
168
177 using std::isfinite;
178 using std::pow;
179
180 if (!isfinite(entry.cost) || !isfinite(entry.constraint_violation)) {
181 return false;
182 }
183
184 Scalar ϕ = pow(α, Scalar(1.5));
185
186 // If current filter entry is better than all prior ones in some respect,
187 // accept it.
188 //
189 // See equation (2.13) of [4].
190 return std::ranges::all_of(m_filter, [&](const auto& elem) {
191 return entry.cost <= elem.cost - ϕ * γ_cost * elem.constraint_violation ||
192 entry.constraint_violation <=
193 (Scalar(1) - ϕ * γ_constraint) * elem.constraint_violation;
194 });
195 }
196
202 const FilterEntry<Scalar>& back() const { return m_filter.back(); }
203
204 private:
205 static constexpr Scalar γ_cost{1e-8};
206 static constexpr Scalar γ_constraint{1e-5};
207
208 gch::small_vector<FilterEntry<Scalar>> m_filter;
209};
210
211} // namespace slp
Definition filter.hpp:82
void add(const FilterEntry< Scalar > &entry)
Definition filter.hpp:112
const FilterEntry< Scalar > & back() const
Definition filter.hpp:202
bool is_acceptable(const FilterEntry< Scalar > &entry, Scalar α)
Definition filter.hpp:176
Filter()
Definition filter.hpp:90
bool try_add(const FilterEntry< Scalar > &entry, Scalar α)
Definition filter.hpp:144
bool try_add(FilterEntry< Scalar > &&entry, Scalar α)
Definition filter.hpp:160
Scalar max_constraint_violation
The maximum constraint violation.
Definition filter.hpp:85
void reset()
Definition filter.hpp:99
void add(FilterEntry< Scalar > &&entry)
Definition filter.hpp:127
Definition intrusive_shared_ptr.hpp:29
Definition filter.hpp:23
FilterEntry(Scalar f)
Definition filter.hpp:46
Scalar cost
The cost function's value.
Definition filter.hpp:25
FilterEntry(Scalar f, const Eigen::Vector< Scalar, Eigen::Dynamic > &c_e)
Definition filter.hpp:54
Scalar constraint_violation
The constraint violation.
Definition filter.hpp:28
constexpr FilterEntry(Scalar cost, Scalar constraint_violation)
Definition filter.hpp:38
FilterEntry(Scalar f, Eigen::Vector< Scalar, Eigen::Dynamic > &s, const Eigen::Vector< Scalar, Eigen::Dynamic > &c_e, const Eigen::Vector< Scalar, Eigen::Dynamic > &c_i, Scalar μ)
Definition filter.hpp:66