use crate::core::scalar::Scalar;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum RefinementStatus {
Converged,
MaxIterations,
Degenerate,
OutOfBounds,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "H: serde::Serialize",
deserialize = "H: serde::de::DeserializeOwned"
))
)]
pub struct RefinementResult<H> {
pub hypothesis: H,
pub status: RefinementStatus,
pub residual: Scalar,
pub iterations: usize,
}
impl<H> RefinementResult<H> {
#[inline]
pub fn converged(&self) -> bool {
self.status == RefinementStatus::Converged
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::coords::PixelCoord;
#[test]
fn converged_result() {
let result = RefinementResult {
hypothesis: PixelCoord::new(10.5, 20.3),
status: RefinementStatus::Converged,
residual: 0.01,
iterations: 3,
};
assert!(result.converged());
}
#[test]
fn degenerate_result() {
let result = RefinementResult {
hypothesis: PixelCoord::new(0.0, 0.0),
status: RefinementStatus::Degenerate,
residual: 0.0,
iterations: 0,
};
assert!(!result.converged());
}
}