Skip to main content

NlCounts

Struct NlCounts 

Source
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, both

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

  1. Nonlinear rows come first. Constraints 0..nl_cons are the ones with a nonlinear body; objectives 0..nl_objs likewise.
  2. Nonlinear variables come first. The .nl variable order is “nonlinear in both, then constraints-only, then objectives-only, then everything linear”, so the variables that appear nonlinearly occupy a prefix of length NlCounts::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: usize

nlc: constraints with a nonlinear body.

§nl_objs: usize

nlo: objectives with a nonlinear body.

§nl_vars_cons: usize

nlvc: variables appearing nonlinearly in constraints. Includes the Self::nl_vars_both variables that are also nonlinear in an objective.

§nl_vars_objs: usize

nlvo: variables appearing nonlinearly in objectives. Also includes Self::nl_vars_both.

§nl_vars_both: usize

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

Source

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§

Source§

impl Clone for NlCounts

Source§

fn clone(&self) -> NlCounts

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for NlCounts

Source§

impl Debug for NlCounts

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Eq for NlCounts

Source§

impl PartialEq for NlCounts

Source§

fn eq(&self, other: &NlCounts) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for NlCounts

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Boilerplate for T
where T: Copy + Send + Sync + Debug + PartialEq + 'static,

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> ByRef<T> for T

Source§

fn by_ref(&self) -> &T

Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Imply<T> for U
where T: ?Sized, U: ?Sized,

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more