argmin/core/
termination.rs1use serde::{Deserialize, Serialize};
18
19#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
21pub enum TerminationReason {
22 NotTerminated,
24 MaxItersReached,
26 TargetCostReached,
28 TargetPrecisionReached,
30 NoChangeInCost,
32 AcceptedStallIterExceeded,
34 BestStallIterExceeded,
36 LineSearchConditionMet,
38 TargetToleranceReached,
40 Aborted,
42}
43
44impl TerminationReason {
45 pub fn terminated(self) -> bool {
47 match self {
48 TerminationReason::NotTerminated => false,
49 _ => true,
50 }
51 }
52
53 pub fn text(&self) -> &str {
55 match *self {
56 TerminationReason::NotTerminated => "Not terminated",
57 TerminationReason::MaxItersReached => "Maximum number of iterations reached",
58 TerminationReason::TargetCostReached => "Target cost value reached",
59 TerminationReason::TargetPrecisionReached => "Target precision reached",
60 TerminationReason::NoChangeInCost => "No change in cost function value",
61 TerminationReason::AcceptedStallIterExceeded => "Accepted stall iterations exceeded",
62 TerminationReason::BestStallIterExceeded => "Best stall iterations exceeded",
63 TerminationReason::LineSearchConditionMet => "Line search condition met",
64 TerminationReason::TargetToleranceReached => "Target tolerance reached",
65 TerminationReason::Aborted => "Optimization aborted",
66 }
67 }
68}
69
70impl std::fmt::Display for TerminationReason {
71 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
72 write!(f, "{}", self.text())
73 }
74}
75
76impl Default for TerminationReason {
77 fn default() -> Self {
78 TerminationReason::NotTerminated
79 }
80}
81
82#[cfg(test)]
83mod tests {
84 use super::*;
85
86 send_sync_test!(termination_reason, TerminationReason);
87}