Skip to main content

Module unimplemented_options

Module unimplemented_options 

Source
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:

  1. the option’s name appears in no crate source outside the registry (whole-word — penalty_max does not count as present because l1_penalty_max exists), and
  2. 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§

UnimplementedFeature
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. None when nothing in the table was touched.