use cobre_solver::{DEFAULT_PROFILE_HEURISTIC_SENTINEL, SolveProfile};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Phase {
Forward,
Backward,
Simulation,
}
pub const FORWARD_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,
};
pub const BACKWARD_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,
};
pub const SIMULATION_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,
};
impl Phase {
#[must_use]
pub fn profile(self) -> SolveProfile {
match self {
Phase::Forward => FORWARD_PROFILE,
Phase::Backward => BACKWARD_PROFILE,
Phase::Simulation => SIMULATION_PROFILE,
}
}
}
const _: () = {
assert!(FORWARD_PROFILE.primal_feasibility_tolerance == 1e-9);
assert!(FORWARD_PROFILE.dual_feasibility_tolerance == 1e-9);
assert!(FORWARD_PROFILE.simplex_iteration_limit == DEFAULT_PROFILE_HEURISTIC_SENTINEL);
assert!(FORWARD_PROFILE.ipm_iteration_limit == 10_000);
assert!(BACKWARD_PROFILE.primal_feasibility_tolerance == 1e-9);
assert!(BACKWARD_PROFILE.dual_feasibility_tolerance == 1e-9);
assert!(BACKWARD_PROFILE.simplex_iteration_limit == DEFAULT_PROFILE_HEURISTIC_SENTINEL);
assert!(BACKWARD_PROFILE.ipm_iteration_limit == 10_000);
assert!(SIMULATION_PROFILE.primal_feasibility_tolerance == 1e-9);
assert!(SIMULATION_PROFILE.dual_feasibility_tolerance == 1e-9);
assert!(SIMULATION_PROFILE.simplex_iteration_limit == DEFAULT_PROFILE_HEURISTIC_SENTINEL);
assert!(SIMULATION_PROFILE.ipm_iteration_limit == 10_000);
};
#[cfg(test)]
mod tests {
use cobre_solver::SolveProfile;
use super::{BACKWARD_PROFILE, FORWARD_PROFILE, Phase, SIMULATION_PROFILE};
#[test]
fn named_profiles_equal_solver_default_in_v1() {
let default = SolveProfile::default();
let check = |profile: &SolveProfile| {
assert_eq!(
profile.primal_feasibility_tolerance,
default.primal_feasibility_tolerance
);
assert_eq!(
profile.dual_feasibility_tolerance,
default.dual_feasibility_tolerance
);
assert_eq!(
profile.simplex_iteration_limit,
default.simplex_iteration_limit
);
assert_eq!(profile.ipm_iteration_limit, default.ipm_iteration_limit);
};
check(&FORWARD_PROFILE);
check(&BACKWARD_PROFILE);
check(&SIMULATION_PROFILE);
}
#[test]
fn phase_profile_returns_matching_constant() {
assert_eq!(Phase::Forward.profile(), FORWARD_PROFILE);
assert_eq!(Phase::Backward.profile(), BACKWARD_PROFILE);
assert_eq!(Phase::Simulation.profile(), SIMULATION_PROFILE);
}
}