pub struct NlCounts {
pub nl_cons: usize,
pub nl_objs: usize,
pub nl_vars_cons: usize,
pub nl_vars_objs: usize,
pub nl_vars_both: usize,
}Expand description
The .nl header’s nonlinearity census — lines 3 and 5 of Gay’s header
table (Hooking Your Solver to AMPL, §D and Table 1).
AMPL has already done this analysis when it writes the file, so these are facts about the model that cost nothing to keep and would otherwise have to be recovered by walking every expression tree in it.
55 1 # nonlinear constraints, objectives -> nl_cons, nl_objs
100 110 100 # nonlinear vars in constraints, objectives, bothTwo properties of the format make these usable rather than merely
informative, and both are asserted against the fixture corpus in
crates/pounce-cli/tests/nl_header_counts.rs:
- Nonlinear rows come first. Constraints
0..nl_consare the ones with a nonlinear body; objectives0..nl_objslikewise. - Nonlinear variables come first. The
.nlvariable order is “nonlinear in both, then constraints-only, then objectives-only, then everything linear”, so the variables that appear nonlinearly occupy a prefix of lengthNlCounts::nonlinear_vars.
The counts are what the writer asserted, which is not always what the
parsed trees say: parse_nl_text folds a variable-free C body into the
row bounds (gh #492), so a row counted in nl_cons can arrive here with
a nonlinear part of Const(0.0). The discrepancy is one-directional —
the header only ever over-states nonlinearity relative to the trees — and
every consumer below is written to be sound under exactly that direction.
Fields§
§nl_cons: usizenlc: constraints with a nonlinear body.
nl_objs: usizenlo: objectives with a nonlinear body.
nl_vars_cons: usizenlvc: variables appearing nonlinearly in constraints. Includes
the Self::nl_vars_both variables that are also nonlinear in an
objective.
nl_vars_objs: usizenlvo: variables appearing nonlinearly in objectives. Also includes
Self::nl_vars_both.
nl_vars_both: usizenlvb: variables appearing nonlinearly in both a constraint and an
objective. Counted a second and third time in the two fields above,
which is why the total is an inclusion–exclusion and not a sum.
Implementations§
Source§impl NlCounts
impl NlCounts
Sourcepub fn nonlinear_vars(&self) -> usize
pub fn nonlinear_vars(&self) -> usize
Number of distinct variables that appear nonlinearly anywhere:
nlvc + nlvo − nlvb, because nlvb is double-counted by the other
two. Saturating, so a malformed header cannot underflow.
This is not max(nlvc, nlvo): for min x₀² s.t. x₁² ≤ 1 the counts
are nlvc = nlvo = 1, nlvb = 0 and there are two nonlinear
variables, not one.
Trait Implementations§
impl Copy for NlCounts
impl Eq for NlCounts
impl StructuralPartialEq for NlCounts
Auto Trait Implementations§
impl Freeze for NlCounts
impl RefUnwindSafe for NlCounts
impl Send for NlCounts
impl Sync for NlCounts
impl Unpin for NlCounts
impl UnsafeUnpin for NlCounts
impl UnwindSafe for NlCounts
Blanket Implementations§
impl<T> Boilerplate for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T, U> Imply<T> for U
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more