use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum TerminationReason {
NotTerminated,
MaxItersReached,
TargetCostReached,
TargetPrecisionReached,
NoChangeInCost,
AcceptedStallIterExceeded,
BestStallIterExceeded,
LineSearchConditionMet,
TargetToleranceReached,
Aborted,
}
impl TerminationReason {
pub fn terminated(self) -> bool {
match self {
TerminationReason::NotTerminated => false,
_ => true,
}
}
pub fn text(&self) -> &str {
match *self {
TerminationReason::NotTerminated => "Not terminated",
TerminationReason::MaxItersReached => "Maximum number of iterations reached",
TerminationReason::TargetCostReached => "Target cost value reached",
TerminationReason::TargetPrecisionReached => "Target precision reached",
TerminationReason::NoChangeInCost => "No change in cost function value",
TerminationReason::AcceptedStallIterExceeded => "Accepted stall iterations exceeded",
TerminationReason::BestStallIterExceeded => "Best stall iterations exceeded",
TerminationReason::LineSearchConditionMet => "Line search condition met",
TerminationReason::TargetToleranceReached => "Target tolerance reached",
TerminationReason::Aborted => "Optimization aborted",
}
}
}
impl std::fmt::Display for TerminationReason {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.text())
}
}
impl Default for TerminationReason {
fn default() -> Self {
TerminationReason::NotTerminated
}
}
#[cfg(test)]
mod tests {
use super::*;
send_sync_test!(termination_reason, TerminationReason);
}