Expand description
Options registered for ipopt.opt compatibility whose feature
pounce does not implement (gh#483 follow-up, continuing #191).
§Why these are refused rather than ignored
upstream_options.rs is a faithful port of Ipopt’s option registry:
every name Ipopt registers is registered here, so an ipopt.opt
written for Ipopt parses unchanged. That is a real compatibility
benefit — and it silently turned ~200 knobs into no-ops, because
registering an option says nothing about implementing it. Setting one
did exactly nothing and said exactly nothing.
Issue #191 audited this class and fixed the half where the feature runs and only the option’s read site was missing. It explicitly scoped out “feature genuinely unimplemented — expected no-ops”. This module closes that half: an option naming a feature pounce does not have is now an error, not a shrug.
§What is and is not in the table
Membership was established per option, not guessed:
- the option’s name appears in no crate source outside the
registry (whole-word —
penalty_maxdoes not count as present becausel1_penalty_maxexists), and - the feature it configures is absent too.
Both are needed. An option whose name is unread but whose feature
runs — the limited_memory_* tail, the corrector knobs — is a
missing read site, not a missing feature; refusing those would fail
solves whose current answers are already correct. They are
deliberately not here; wiring them is the other half of the work.
A third shape turned up while wiring that half and belongs to
neither: an option for a sub-capability of a feature that does run.
max_resto_iter and resto_failure_feasibility_threshold are the
examples — restoration runs, but there is no iteration cap or failure
threshold to point a read site at, so honouring them means building
the capability, not adding a line. They are left out of this table
until that call is made, and so remain silent for now.
The clearest case is the penalty line search. pounce implements
IpPenaltyLSAcceptor (line_search_method=penalty), so its knobs
(nu_init, nu_inc, rho, eta_penalty) are read sites to add.
Ipopt’s other penalty acceptor — the CG-penalty / inexact-Newton
one — has no counterpart here at all, and the port registered its
whole option set. Those are refused.
An entry leaves the table by being implemented. option_file_name
was here — refusing it was the cheap half of gh#518’s “implement it
or fail loudly” — until gh#518 got the other half:
crate::application::IpoptApplication::initialize_with_option_file
reads the named file, so the option now configures something.
§The default gate
Only an explicit value different from the registered default is
refused. expect_infeasible_problem_ctol left alone, or an
ipopt.opt that spells out defaults, must keep working: those ask
for nothing. Refusing them would break the very compatibility the
registry exists to provide.
Structs§
- Unimplemented
Feature - One unimplemented feature and the options that configure it.
Constants§
- UNEXPLOITED_
HINTS - Options that are honored in the sense that matters — the answer is unaffected — but whose performance hint pounce does not exploit. These warn rather than fail: refusing them would stop a solve that returns the right result today, only a little slower.
- UNIMPLEMENTED_
FEATURES - Feature groups pounce does not implement. Refused when set.
Functions§
- hint_
warnings - Warnings for hints pounce does not exploit. Never blocks a solve.
- refusal
- The first unimplemented-feature option the caller set, with the
message it earns.
Nonewhen nothing in the table was touched.