pub struct LiftProjectGenerator { /* private fields */ }Expand description
Generator for Balas-Ceria-Cornuéjols lift-and-project cuts.
§Usage
use scirs2_optimize::integer::lift_project::{
LiftProjectConfig, LiftProjectGenerator,
};
let config = LiftProjectConfig::default();
let gen = LiftProjectGenerator::new(config);
// Constraint: x1 + x2 <= 1, x1 >= 0, x2 >= 0, x1,x2 ∈ {0,1}
let a = vec![vec![1.0, 1.0]];
let b = vec![1.0];
let x_bar = vec![0.6, 0.4]; // fractional LP solution
let integer_vars = vec![0, 1];
let cuts = gen.generate_cuts(&a, &b, &x_bar, &integer_vars).unwrap();
assert!(!cuts.is_empty());Implementations§
Source§impl LiftProjectGenerator
impl LiftProjectGenerator
Sourcepub fn new(config: LiftProjectConfig) -> Self
pub fn new(config: LiftProjectConfig) -> Self
Create a new generator with the given configuration.
Sourcepub fn default_generator() -> Self
pub fn default_generator() -> Self
Create a new generator with default configuration.
Sourcepub fn generate_cuts(
&self,
a: &[Vec<f64>],
b: &[f64],
x_bar: &[f64],
integer_vars: &[usize],
) -> OptimizeResult<Vec<LiftProjectCut>>
pub fn generate_cuts( &self, a: &[Vec<f64>], b: &[f64], x_bar: &[f64], integer_vars: &[usize], ) -> OptimizeResult<Vec<LiftProjectCut>>
Generate lift-and-project cuts from the LP relaxation solution.
§Arguments
a– Constraint matrix rows (constraint isa[i] · x ≤ b[i]).b– Right-hand side vector.x_bar– Current LP relaxation solution (may be fractional).integer_vars– Indices of variables constrained to {0, 1}.
§Returns
A vector of LiftProjectCuts violated at x_bar, sorted by decreasing
violation (strongest cut first). Empty when x_bar is integer-feasible.
Sourcepub fn select_variable(
&self,
x_bar: &[f64],
integer_vars: &[usize],
) -> Option<usize>
pub fn select_variable( &self, x_bar: &[f64], integer_vars: &[usize], ) -> Option<usize>
Select a single fractional variable according to the configured strategy.
Returns None if no fractional variable is found among integer_vars.
Sourcepub fn generate_cut_for_var(
&self,
a: &[Vec<f64>],
b: &[f64],
x_bar: &[f64],
j: usize,
) -> Option<LiftProjectCut>
pub fn generate_cut_for_var( &self, a: &[Vec<f64>], b: &[f64], x_bar: &[f64], j: usize, ) -> Option<LiftProjectCut>
Generate the single strongest BCC disjunctive cut for fractional variable j.
Uses the augmented constraint system (structural + bound rows) to ensure a violated cut can always be found when x̄_j ∈ (0, 1).
Returns None when:
- x̄_j is integer-valued (within
int_tol), or - No row in the augmented system gives violation >
cut_violation_tol.
Sourcepub fn cut_violation(&self, cut: &LiftProjectCut, x_bar: &[f64]) -> f64
pub fn cut_violation(&self, cut: &LiftProjectCut, x_bar: &[f64]) -> f64
Compute the signed violation of a cut at x̄.
Returns π · x̄ - π₀. A positive value means x̄ violates the cut
(x̄ does not satisfy π · x ≥ π₀). A negative or zero value means x̄ satisfies it.
Auto Trait Implementations§
impl Freeze for LiftProjectGenerator
impl RefUnwindSafe for LiftProjectGenerator
impl Send for LiftProjectGenerator
impl Sync for LiftProjectGenerator
impl Unpin for LiftProjectGenerator
impl UnsafeUnpin for LiftProjectGenerator
impl UnwindSafe for LiftProjectGenerator
Blanket Implementations§
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
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.