1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//! `ma57_batched_backsolve` must stay registered, and must stay `no`.
//!
//! The option lets MA57 affirm
//! `SparseSymLinearSolverInterface::multi_solve_matches_single_solve`,
//! which is what admits `LowRankAugSystemSolver`'s SMW columns to a
//! single blocked back-substitution instead of one traversal of the
//! factor per column. MA57's blocked path is **not** bit-identical to
//! the per-column one — measured at about one ulp on gh#809's review
//! model, and enough to move the trajectory and the final iteration
//! count — so the option is a permission the user grants, not a
//! capability that should arrive switched on.
//!
//! Two properties, and neither is checkable by the tests that live
//! next to the backend:
//!
//! * The **registered default** is `no`. `pounce-hsl`'s own reader
//! falls back to `false` when the option is absent, but that fallback
//! is dead code in production — the registry always answers first —
//! so a registry that defaulted to `yes` would silently switch every
//! MA57 run onto a different trajectory while every fallback in the
//! reader still read `false`. That is the gh#677 shape exactly:
//! registered with one default, read with another, nothing comparing
//! the two.
//! * The option is **registered at all**. Unregistered reads as unset,
//! unset reads as `false`, and the feature would go quietly
//! unreachable rather than fail — which is gh#825's failure mode with
//! the sign flipped.
//!
//! This runs in CI, which the rest of the MA57 coverage cannot: CoinHSL
//! is licensed and cannot be linked here, so
//! `ma57_options_reach_the_backend.rs` is `#![cfg(feature = "ma57")]`
//! and `pounce-hsl`'s tests are excluded from every CI job. Registration
//! is deliberately unconditional on the `ma57` cargo feature — the
//! registry is built the same way in every build so that
//! `--print-options` is not build-dependent — which is what makes this
//! assertion possible here.
use IpoptApplication;
/// Unset, with the registry attached, the option reads `false`.
///
/// Read through `OptionsList` rather than off the `RegisteredOption`
/// because that is the path production takes: `Ma57Options::from_options_list`
/// asks the same question of the same object.
/// And the restoration sub-solve inherits that default rather than
/// carrying one of its own.
///
/// The `resto.` prefix is a real facility for this family
/// (`ma57_options_reach_the_backend.rs::the_resto_prefix_selects_its_own_values`),
/// so "off by default" has to hold at both prefixes or the restoration
/// IPM batches while the main one does not.
/// Setting it is what turns it on — the other branch, so that a
/// hard-coded `false` reader would not pass the two tests above.
///
/// Without this, a reader that ignored the option entirely and returned
/// `false` unconditionally satisfies everything else here.