pub mod error;
pub use error::SolverError;
pub use error::MpsError;
#[doc(hidden)]
pub mod presolve;
pub mod sparse;
pub mod problem;
pub(crate) mod simplex;
#[cfg(test)]
#[allow(dead_code)]
pub(crate) mod io;
pub(crate) mod basis;
pub mod tolerances;
pub mod options;
pub use options::{
BranchingStrategy, DualPricing, GlobalOptimizationConfig, LpWarmStart, MipBranching, MipConfig,
SolverOptions, Tolerance, WarmStartBasis,
};
pub mod qp;
pub mod mip;
pub mod lp;
#[doc(hidden)]
pub mod linalg;
#[cfg(test)]
pub(crate) mod test_kkt;
#[cfg(test)]
pub(crate) mod peak_alloc {
use std::alloc::{GlobalAlloc, Layout, System};
use std::cell::Cell;
thread_local! {
static CURRENT: Cell<isize> = const { Cell::new(0) };
}
#[inline]
fn update(delta: isize) {
CURRENT.with(|c| c.set(c.get() + delta));
}
pub struct TrackingAlloc;
unsafe impl GlobalAlloc for TrackingAlloc {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let ptr = System.alloc(layout);
if !ptr.is_null() {
update(layout.size() as isize);
}
ptr
}
unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 {
let ptr = System.alloc_zeroed(layout);
if !ptr.is_null() {
update(layout.size() as isize);
}
ptr
}
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
System.dealloc(ptr, layout);
update(-(layout.size() as isize));
}
unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 {
let new_ptr = System.realloc(ptr, layout, new_size);
if !new_ptr.is_null() {
update(new_size as isize - layout.size() as isize);
}
new_ptr
}
}
}
#[cfg(test)]
#[global_allocator]
static TEST_ALLOC: peak_alloc::TrackingAlloc = peak_alloc::TrackingAlloc;
pub use sparse::CscMatrix;
pub use problem::{SolveRoute, SolveStats, SolveStatus};
pub use problem::certificate::{
BoundGapCertificate, FarkasCertificate, IncompleteReason, NotProven, OptimalCertificate,
SolveOutcome, UnboundedRayCertificate,
};
pub use qp::certificate::prove_optimal;
pub use qp::{solve_qp, solve_qp_global, solve_qp_with, QpProblem, SolverResult, QpWarmStart};
pub use mip::{
solve_milp, solve_milp_with_stats, solve_miqp, solve_miqp_with_stats, MilpProblem,
MipProblemError, MipStats, MiqpProblem,
};
pub use lp::solve_lp_with;
pub use simplex::{solve, solve_with};
#[doc(hidden)]
pub mod bound_flip {
pub use crate::simplex::dual_advanced::bound_flip::{
bfrt_flip_invocations, bfrt_select_entering, reset_bfrt_flip_invocations,
BfrtResult, ColBound,
};
}
pub use qp::{diagnose, DiagnosticReport, DiagnosticWarning, DiagnosticCode, Severity, ProblemInfo};
#[cfg(test)]
pub(crate) struct ScopedDisable<D: Fn()> {
restore: D,
}
#[cfg(test)]
impl<D: Fn()> ScopedDisable<D> {
pub(crate) fn new<E: Fn()>(enable: E, restore: D) -> Self {
enable();
ScopedDisable { restore }
}
}
#[cfg(test)]
impl<D: Fn()> Drop for ScopedDisable<D> {
fn drop(&mut self) {
(self.restore)();
}
}
#[doc(hidden)]
pub fn apply_lp_primal_guard(
result: crate::problem::SolverResult,
problem: &crate::problem::LpProblem,
) -> crate::problem::SolverResult {
crate::qp::certificate::guard_lp_optimal(result, problem)
}