1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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);
}