use std::ffi::CStr;
use std::os::raw::c_void;
use crate::{DEFAULT_PROFILE_HEURISTIC_SENTINEL, ffi};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct HighsProfile {
pub primal_feasibility_tolerance: f64,
pub dual_feasibility_tolerance: f64,
pub simplex_iteration_limit: u32,
pub ipm_iteration_limit: u32,
pub simplex_dual_edge_weight_strategy: i32,
pub simplex_scale_strategy: i32,
pub simplex_price_strategy: i32,
}
impl Default for HighsProfile {
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,
simplex_dual_edge_weight_strategy: 1,
simplex_scale_strategy: 0,
simplex_price_strategy: 1,
}
}
}
pub(super) enum OptionValue {
Str(&'static CStr),
Int(i32),
Bool(i32),
Double(f64),
}
pub(super) struct DefaultOption {
pub(super) name: &'static CStr,
pub(super) value: OptionValue,
}
impl DefaultOption {
pub(super) unsafe fn apply(&self, handle: *mut c_void) -> i32 {
unsafe {
match &self.value {
OptionValue::Str(val) => {
ffi::cobre_highs_set_string_option(handle, self.name.as_ptr(), val.as_ptr())
}
OptionValue::Int(val) => {
ffi::cobre_highs_set_int_option(handle, self.name.as_ptr(), *val)
}
OptionValue::Bool(val) => {
ffi::cobre_highs_set_bool_option(handle, self.name.as_ptr(), *val)
}
OptionValue::Double(val) => {
ffi::cobre_highs_set_double_option(handle, self.name.as_ptr(), *val)
}
}
}
}
}
pub(super) fn default_options() -> [DefaultOption; 13] {
[
DefaultOption {
name: c"solver",
value: OptionValue::Str(c"simplex"),
},
DefaultOption {
name: c"simplex_strategy",
value: OptionValue::Int(1), },
DefaultOption {
name: c"simplex_scale_strategy",
value: OptionValue::Int(0), },
DefaultOption {
name: c"presolve",
value: OptionValue::Str(c"on"),
},
DefaultOption {
name: c"parallel",
value: OptionValue::Str(c"off"),
},
DefaultOption {
name: c"output_flag",
value: OptionValue::Bool(0),
},
DefaultOption {
name: c"primal_feasibility_tolerance",
value: OptionValue::Double(1e-9),
},
DefaultOption {
name: c"dual_feasibility_tolerance",
value: OptionValue::Double(1e-9),
},
DefaultOption {
name: c"simplex_dual_edge_weight_strategy",
value: OptionValue::Int(1), },
DefaultOption {
name: c"dual_simplex_cost_perturbation_multiplier",
value: OptionValue::Double(0.0), },
DefaultOption {
name: c"simplex_initial_condition_check",
value: OptionValue::Bool(0), },
DefaultOption {
name: c"simplex_price_strategy",
value: OptionValue::Int(1), },
DefaultOption {
name: c"rebuild_refactor_solution_error_tolerance",
value: OptionValue::Double(1e-6), },
]
}