use super::residuals::ResidualStats;
#[derive(Debug, Clone)]
pub struct SlrResidual {
pub jd_tt: f64,
pub residual_m: f64,
}
#[derive(Debug, Clone)]
pub struct SlrValidationReport {
pub residuals: Vec<SlrResidual>,
pub stats: ResidualStats,
}
impl SlrValidationReport {
pub fn from_pairs<I: IntoIterator<Item = (f64, f64)>>(pairs: I) -> Self {
let residuals: Vec<SlrResidual> = pairs
.into_iter()
.map(|(t, r)| SlrResidual {
jd_tt: t,
residual_m: r,
})
.collect();
let values: Vec<f64> = residuals.iter().map(|r| r.residual_m).collect();
let stats = ResidualStats::from_slice(&values);
Self { residuals, stats }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn aggregates_zero_residuals() {
let r = SlrValidationReport::from_pairs((0..5).map(|i| (i as f64, 0.0)));
assert_eq!(r.residuals.len(), 5);
assert!(r.stats.rms.abs() < 1e-12);
}
}