use oximo_solver::{HasUniversal, UniversalOptions};
#[cfg_attr(
feature = "faer",
doc = "The [`Faer`](Self::Faer) backend requires this crate's `faer` feature."
)]
#[cfg_attr(
not(feature = "faer"),
doc = "A `Faer` backend is also available behind this crate's `faer` feature."
)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ClarabelDirectSolve {
Auto,
Qdldl,
#[cfg(feature = "faer")]
#[cfg_attr(docsrs, doc(cfg(feature = "faer")))]
Faer,
}
macro_rules! clarabel_options {
($($(#[$meta:meta])* $name:ident : $ty:ty),* $(,)?) => {
#[derive(Clone, Debug, Default)]
pub struct ClarabelOptions {
pub universal: UniversalOptions,
pub direct_solve_method: Option<ClarabelDirectSolve>,
$(
$(#[$meta])*
pub $name: Option<$ty>,
)*
}
impl ClarabelOptions {
#[must_use]
pub fn direct_solve_method(mut self, m: ClarabelDirectSolve) -> Self {
self.direct_solve_method = Some(m);
self
}
$(
$(#[$meta])*
#[must_use]
pub fn $name(mut self, v: $ty) -> Self {
self.$name = Some(v);
self
}
)*
}
};
}
clarabel_options! {
max_iter: u32,
max_step_fraction: f64,
tol_gap_abs: f64,
tol_gap_rel: f64,
tol_feas: f64,
tol_infeas_abs: f64,
tol_infeas_rel: f64,
tol_ktratio: f64,
reduced_tol_gap_abs: f64,
reduced_tol_gap_rel: f64,
reduced_tol_feas: f64,
reduced_tol_infeas_abs: f64,
reduced_tol_infeas_rel: f64,
reduced_tol_ktratio: f64,
equilibrate_enable: bool,
equilibrate_max_iter: u32,
equilibrate_min_scaling: f64,
equilibrate_max_scaling: f64,
linesearch_backtrack_step: f64,
min_switch_step_length: f64,
min_terminate_step_length: f64,
static_regularization_enable: bool,
static_regularization_constant: f64,
static_regularization_proportional: f64,
dynamic_regularization_enable: bool,
dynamic_regularization_eps: f64,
dynamic_regularization_delta: f64,
iterative_refinement_enable: bool,
iterative_refinement_reltol: f64,
iterative_refinement_abstol: f64,
iterative_refinement_max_iter: u32,
iterative_refinement_stop_ratio: f64,
presolve_enable: bool,
input_sparse_dropzeros: bool,
}
impl HasUniversal for ClarabelOptions {
fn universal(&self) -> &UniversalOptions {
&self.universal
}
fn universal_mut(&mut self) -> &mut UniversalOptions {
&mut self.universal
}
}