use rkyv::{Archive, Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Archive, Serialize, Deserialize)]
pub struct Prediction {
pub point: f32,
pub lower: Option<f32>,
pub upper: Option<f32>,
}
impl Prediction {
pub fn point(value: f32) -> Self {
Self {
point: value,
lower: None,
upper: None,
}
}
pub fn with_interval(point: f32, lower: f32, upper: f32) -> Self {
Self {
point,
lower: Some(lower),
upper: Some(upper),
}
}
#[inline]
pub fn has_interval(&self) -> bool {
self.lower.is_some() && self.upper.is_some()
}
pub fn interval_width(&self) -> Option<f32> {
match (self.lower, self.upper) {
(Some(l), Some(u)) => Some(u - l),
_ => None,
}
}
}
impl From<f32> for Prediction {
fn from(value: f32) -> Self {
Self::point(value)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_point_prediction() {
let pred = Prediction::point(42.0);
assert_eq!(pred.point, 42.0);
assert!(!pred.has_interval());
assert!(pred.interval_width().is_none());
}
#[test]
fn test_prediction_with_interval() {
let pred = Prediction::with_interval(50.0, 45.0, 55.0);
assert_eq!(pred.point, 50.0);
assert!(pred.has_interval());
assert_eq!(pred.lower, Some(45.0));
assert_eq!(pred.upper, Some(55.0));
assert_eq!(pred.interval_width(), Some(10.0));
}
}