9#include <gch/small_vector.hpp>
11#include "sleipnir/optimization/solver/util/constraint_violation.hpp"
20template <
typename Scalar>
75template <
typename Scalar>
88 explicit constexpr Filter(Scalar initial_constraint_violation = Scalar(0)) {
92 Scalar(1e-4) * max(Scalar(1), initial_constraint_violation);
94 Scalar(1e4) * max(Scalar(1), initial_constraint_violation);
100 m_last_rejection_due_to_filter =
false;
110 constexpr int max_resets = 5;
117 if (m_resets >= max_resets ||
120 !m_last_rejection_due_to_filter) {
126 m_last_rejection_due_to_filter =
false;
145 if (!isfinite(trial_entry.
cost) ||
151 bool switching_condition =
156 constexpr Scalar η_ϕ(1e-8);
157 bool armijo_condition =
158 trial_entry.
cost <= current_entry.
cost + η_ϕ * α * D_ϕ;
161 bool sufficient_decrease =
171 switching_condition) {
172 if (!armijo_condition) {
173 m_last_rejection_due_to_filter =
false;
176 }
else if (!sufficient_decrease) {
177 m_last_rejection_due_to_filter =
false;
182 if (in_filter(trial_entry)) {
183 m_last_rejection_due_to_filter =
true;
189 if (!switching_condition || !armijo_condition) {
210 [&](
const auto& elem) {
return elem.dominated_by(margin_entry); });
212 m_filter.push_back(margin_entry);
222 return isfinite(entry.
cost) &&
248 constexpr Scalar γ_α(0.05);
252 if (D_ϕ >= Scalar(0)) {
253 return γ_α * γ_constraint;
256 Scalar α_min = min(γ_constraint, γ_cost * θ / -D_ϕ);
258 α_min = min(α_min, pow(θ, s_θ) / pow(-D_ϕ, s_ϕ));
264 static constexpr Scalar γ_cost{1e-8};
265 static constexpr Scalar γ_constraint{1e-5};
268 static constexpr Scalar s_ϕ{2.3};
269 static constexpr Scalar s_θ{1.1};
271 gch::small_vector<FilterEntry<Scalar>> m_filter;
273 bool m_last_rejection_due_to_filter =
false;
282 bool in_filter(
const FilterEntry<Scalar>& entry)
const {
284 return std::any_of(m_filter.begin(), m_filter.end(), [&](
const auto& elem) {
285 return entry.dominated_by(elem);
293template <
typename Scalar>
306 Scalar min_constraint_violation) {
310 if (α < Scalar(1e-3) &&
314 ++m_stalled_step_counter;
317 if (m_stalled_step_counter >= 5) {
318 m_stalled_step_counter = 0;
323 m_stalled_step_counter = 0;
330 int m_stalled_step_counter = 0;
void add(const FilterEntry< Scalar > &entry)
Definition filter.hpp:203
Scalar min_step_size(const FilterEntry< Scalar > ¤t_entry, Scalar D_ϕ) const
Definition filter.hpp:236
bool try_add(const FilterEntry< Scalar > ¤t_entry, const FilterEntry< Scalar > &trial_entry, Scalar D_ϕ, Scalar α)
Definition filter.hpp:139
Scalar min_constraint_violation
The minimum constraint violation.
Definition filter.hpp:79
bool is_acceptable(const FilterEntry< Scalar > &entry) const
Definition filter.hpp:219
bool try_reset(const FilterEntry< Scalar > ¤t_entry)
Definition filter.hpp:109
constexpr Filter(Scalar initial_constraint_violation=Scalar(0))
Definition filter.hpp:88
Scalar max_constraint_violation
The maximum constraint violation.
Definition filter.hpp:82
void reset()
Resets the filter.
Definition filter.hpp:98
Definition filter.hpp:294
bool update(const FilterEntry< Scalar > ¤t_entry, const FilterEntry< Scalar > &trial_entry, Scalar α, Scalar min_constraint_violation)
Definition filter.hpp:304
Scalar cost
The cost function's value.
Definition filter.hpp:26
FilterEntry(Scalar f, DenseVector &s, const DenseVector &c_e, const DenseVector &c_i, Scalar μ)
Definition filter.hpp:55
constexpr bool dominated_by(const FilterEntry< Scalar > &entry) const
Definition filter.hpp:64
Scalar constraint_violation
The constraint violation.
Definition filter.hpp:29
FilterEntry(Scalar f, const DenseVector &c_e)
Definition filter.hpp:45
Eigen::VectorX< Scalar > DenseVector
Type alias for dense vector.
Definition filter.hpp:23
constexpr FilterEntry(Scalar cost, Scalar constraint_violation=Scalar(0))
Definition filter.hpp:37