use loeres::{FiniteScalar, OrderedScalar, SolverError};
#[non_exhaustive]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum TimingMode {
EarlyExitAllowed,
#[cfg(feature = "constant-iteration")]
ConstantIteration,
}
#[derive(Copy, Clone, Debug)]
pub struct DeviceSolveConfig<S> {
pub max_iterations: u32,
pub tolerance: S,
pub timing_mode: TimingMode,
}
impl<S: FiniteScalar + OrderedScalar> DeviceSolveConfig<S> {
pub fn validate(&self) -> Result<(), SolverError> {
if self.max_iterations == 0 {
return Err(SolverError::InvalidInput);
}
if !self.tolerance.is_finite() {
return Err(SolverError::NonFiniteInput);
}
if self.tolerance < S::zero() {
return Err(SolverError::InvalidInput);
}
Ok(())
}
}
#[cfg(test)]
mod tests;