#[derive(Debug, Clone, Copy, PartialEq)]
pub struct SolveProfile {
pub primal_feasibility_tolerance: f64,
pub dual_feasibility_tolerance: f64,
pub simplex_iteration_limit: u32,
pub ipm_iteration_limit: u32,
}
impl Default for SolveProfile {
fn default() -> Self {
Self {
primal_feasibility_tolerance: 1e-9,
dual_feasibility_tolerance: 1e-9,
simplex_iteration_limit: DEFAULT_PROFILE_HEURISTIC_SENTINEL,
ipm_iteration_limit: 10_000,
}
}
}
pub const DEFAULT_PROFILE_HEURISTIC_SENTINEL: u32 = 0;
pub const DEFAULT_PROFILE_IPM_UNBOUNDED_SENTINEL: u32 = 0;
#[cfg(test)]
mod tests {
use super::{DEFAULT_PROFILE_HEURISTIC_SENTINEL, SolveProfile};
#[test]
fn default_matches_historical_values() {
let p = SolveProfile::default();
assert_eq!(p.primal_feasibility_tolerance, 1e-9);
assert_eq!(p.dual_feasibility_tolerance, 1e-9);
assert_eq!(p.simplex_iteration_limit, 0);
assert_eq!(p.ipm_iteration_limit, 10_000);
}
#[test]
#[allow(clippy::clone_on_copy, clippy::no_effect_underscore_binding)]
fn derived_traits_behave() {
let p = SolveProfile::default();
let cloned = p.clone();
assert_eq!(cloned, p);
assert_eq!(p, p);
let q = p;
let _r = p; assert_eq!(q, p);
let debug = format!("{p:?}");
for field in [
"primal_feasibility_tolerance",
"dual_feasibility_tolerance",
"simplex_iteration_limit",
"ipm_iteration_limit",
] {
assert!(
debug.contains(field),
"debug output missing '{field}': {debug}"
);
}
}
const _CONST_PROFILE: SolveProfile = SolveProfile {
primal_feasibility_tolerance: 1e-9,
dual_feasibility_tolerance: 1e-9,
simplex_iteration_limit: DEFAULT_PROFILE_HEURISTIC_SENTINEL,
ipm_iteration_limit: 10_000,
};
}