Skip to main content

Sensitivity

Struct Sensitivity 

Source
#[non_exhaustive]
pub struct Sensitivity { pub basic_variables: Vec<String>, pub from_final_tableau: bool, pub constraints: Vec<ConstraintSensitivity>, pub variables: Vec<VariableSensitivity>, pub degenerate: bool, pub alternative_optima: bool, }
Expand description

Sensitivity analysis of an optimal solution, read from its final basis.

Everything is expressed in terms of the original problem (its own sense, constraints and variables), whatever method produced the solution.

use simplex_trace::{solve, Method, Options, Problem, Relation, ratio};

// Wyndor Glass Co.: max 3x1 + 5x2
let problem = Problem::maximize([3, 5])
    .subject_to([1, 0], Relation::Le, 4)
    .subject_to([0, 2], Relation::Le, 12)
    .subject_to([3, 2], Relation::Le, 18);
let solution = solve(&problem, Method::Simplex, &Options::default()).unwrap();
let s = solution.sensitivity.unwrap();

// One more unit of resource 2 is worth 3/2, as long as b2 stays within [6, 18].
assert_eq!(s.constraints[1].shadow_price, ratio(3, 2));
assert_eq!(s.constraints[1].rhs_range.lower, Some(ratio(6, 1)));
assert_eq!(s.constraints[1].rhs_range.upper, Some(ratio(18, 1)));
// (2, 6) stays optimal while c1 is within [0, 15/2].
assert_eq!(s.variables[0].cost_range.upper, Some(ratio(15, 2)));
print!("{s}");

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§basic_variables: Vec<String>

Basic columns of the basis the analysis is read from, one per non-redundant row, by name: a variable, a slack (s2), or a part of a free or non-positive variable (x1+, x1-).

§from_final_tableau: bool

The analysis is read from the final tableau of the trace (minus the rows of redundant equalities), so every Source points at one of its cells.

false only with Big-M, when an artificial variable is left in the basis at zero in a row that is not redundant: that is not a basis of the real problem. The artificial is then pivoted out and the real objective re-optimized from there, which only takes degenerate pivots (any other pivot would improve an optimal solution), so the solution is the same but the basis differs, and no Source is given.

§constraints: Vec<ConstraintSensitivity>

One entry per constraint of the problem, in order.

§variables: Vec<VariableSensitivity>

One entry per original variable, in order.

§degenerate: bool

Some basic variable is zero. Shadow prices are then only valid in one direction (the right-hand-side range has an end at the current value) and may not be unique. A free variable at zero does not count: it can move both ways.

§alternative_optima: bool

Some nonbasic column (variable or slack) has a zero reduced cost: other optimal bases, and usually other optimal solutions, exist. The column of a free variable whose other column is basic does not count: it only splits the same value differently.

Trait Implementations§

Source§

impl Clone for Sensitivity

Source§

fn clone(&self) -> Self

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 Debug for Sensitivity

Source§

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

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

impl<'de> Deserialize<'de> for Sensitivity

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Sensitivity

Source§

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

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

impl Eq for Sensitivity

Source§

impl PartialEq for Sensitivity

Source§

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

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

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

Inequality operator !=. Read more
Source§

impl Serialize for Sensitivity

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for Sensitivity

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> 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> 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> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> 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> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. 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.