10#include <Eigen/SparseCore>
20template <
typename Scalar>
58 c_e.template lpNorm<1>() + (c_i - s).template lpNorm<1>()} {
76template <
typename Scalar>
95 explicit constexpr Filter(Scalar initial_constraint_violation = Scalar(0)) {
99 Scalar(1e-4) *
max(Scalar(1), initial_constraint_violation);
101 Scalar(1e4) *
max(Scalar(1), initial_constraint_violation);
107 m_last_rejection_due_to_filter =
false;
125 if (!isfinite(trial_entry.
cost) ||
130 Scalar g_p_x = g.transpose() * p_x;
133 constexpr Scalar s_ϕ(2.3);
134 constexpr Scalar s_θ(1.1);
135 bool switching_condition =
140 constexpr Scalar η_ϕ(1e-8);
141 bool armijo_condition =
142 trial_entry.
cost <= current_entry.
cost + η_ϕ * α * g_p_x;
147 Scalar ϕ =
pow(α, Scalar(1.5));
148 bool sufficient_decrease =
159 switching_condition) {
160 if (!armijo_condition) {
161 m_last_rejection_due_to_filter =
false;
164 }
else if (!sufficient_decrease) {
165 m_last_rejection_due_to_filter =
false;
170 if (in_filter(trial_entry)) {
171 m_last_rejection_due_to_filter =
true;
177 if (!switching_condition || !armijo_condition) {
192 return m_last_rejection_due_to_filter;
196 static constexpr Scalar γ_cost{1e-8};
197 static constexpr Scalar γ_constraint{1e-5};
201 bool m_last_rejection_due_to_filter =
false;
206 void add(
const FilterEntry<Scalar>& entry) {
209 [&](
const auto& elem) {
return elem.dominated_by(entry); });
211 m_filter.push_back(entry);
218 bool in_filter(
const FilterEntry<Scalar>& entry)
const {
220 return std::any_of(m_filter.begin(), m_filter.end(), [&](
const auto& elem) {
221 return entry.dominated_by(elem);
Scalar min_constraint_violation
The minimum constraint violation.
Definition filter.hpp:86
Eigen::Vector< Scalar, Eigen::Dynamic > DenseVector
Type alias for dense vector.
Definition filter.hpp:80
bool last_rejection_due_to_filter() const
Returns true if the most recent trial entry rejection was due to the filter.
Definition filter.hpp:191
Eigen::SparseVector< Scalar > SparseVector
Type alias for sparse vector.
Definition filter.hpp:83
constexpr Filter(Scalar initial_constraint_violation=Scalar(0))
Constructs an empty filter.
Definition filter.hpp:95
Scalar max_constraint_violation
The maximum constraint violation.
Definition filter.hpp:89
void reset()
Resets the filter.
Definition filter.hpp:105
bool try_add(const FilterEntry< Scalar > ¤t_entry, const FilterEntry< Scalar > &trial_entry, const DenseVector &p_x, const SparseVector &g, Scalar α)
Returns true if the given trial entry is acceptable to the filter.
Definition filter.hpp:118
wpi::util::SmallVector< T > small_vector
Definition small_vector.hpp:10
Definition to_underlying.hpp:7
Variable< Scalar > log(const Variable< Scalar > &x)
log() for Variables.
Definition variable.hpp:521
Variable< Scalar > pow(const ScalarLike auto &base, const Variable< Scalar > &power)
pow() for Variables.
Definition variable.hpp:612
Variable< Scalar > max(const ScalarLike auto &a, const Variable< Scalar > &b)
max() for Variables.
Definition variable.hpp:542
Filter entry consisting of cost and constraint violation.
Definition filter.hpp:21
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 μ)
Constructs an interior-point method filter entry.
Definition filter.hpp:55
constexpr bool dominated_by(const FilterEntry< Scalar > &entry) const
Returns true if this filter entry is dominated by another.
Definition filter.hpp:65
Eigen::Vector< Scalar, Eigen::Dynamic > DenseVector
Type alias for dense vector.
Definition filter.hpp:23
constexpr FilterEntry()=default
Scalar constraint_violation
The constraint violation.
Definition filter.hpp:29
FilterEntry(Scalar f, const DenseVector &c_e)
Constructs a Sequential Quadratic Programming filter entry.
Definition filter.hpp:45
constexpr FilterEntry(Scalar cost, Scalar constraint_violation=Scalar(0))
Constructs a FilterEntry.
Definition filter.hpp:37