#[cfg(test)]
mod tests {
use crate::hierarchy::HierarchicalConformal;
use crate::reconciliation::{reconcile, ReconciliationMethod, SummingMatrix};
use crate::Result;
use faer::Mat;
#[test]
fn test_reconciliation_ols_star() -> Result<()> {
let s = SummingMatrix::simple_star(2);
let mut y_hat = Mat::<f64>::zeros(3, 1);
y_hat[(0, 0)] = 3.0;
y_hat[(1, 0)] = 1.0;
y_hat[(2, 0)] = 1.0;
let y_tilde = reconcile(&s, &y_hat, ReconciliationMethod::Ols)?;
assert!((y_tilde[(0, 0)] - 2.6666666666666665).abs() < 1e-10);
assert!((y_tilde[(1, 0)] - 1.3333333333333333).abs() < 1e-10);
assert!((y_tilde[(2, 0)] - 1.3333333333333333).abs() < 1e-10);
assert!((y_tilde[(0, 0)] - (y_tilde[(1, 0)] + y_tilde[(2, 0)])).abs() < 1e-10);
Ok(())
}
#[test]
fn test_conformal_calibration() -> Result<()> {
let s = SummingMatrix::simple_star(2);
let mut cp = HierarchicalConformal::new(s, ReconciliationMethod::Ols);
let y_calib = Mat::<f64>::zeros(3, 10);
let mut y_hat_calib = Mat::<f64>::zeros(3, 10);
for j in 0..10 {
y_hat_calib[(1, j)] = (j + 1) as f64; }
cp.calibrate(&y_calib, &y_hat_calib, 0.2)?;
assert!(cp.quantile() > 0.0);
Ok(())
}
#[test]
fn test_reconciliation_mint() -> Result<()> {
let s = SummingMatrix::simple_star(2);
let m = s.m();
let mut y_hat = Mat::<f64>::zeros(m, 1);
y_hat[(0, 0)] = 3.0;
y_hat[(1, 0)] = 1.0;
y_hat[(2, 0)] = 1.0;
let covariance = Mat::<f64>::identity(m, m);
let y_tilde = reconcile(&s, &y_hat, ReconciliationMethod::MinT { covariance })?;
assert!((y_tilde[(0, 0)] - 2.6666666666666665).abs() < 1e-10);
assert!((y_tilde[(0, 0)] - (y_tilde[(1, 0)] + y_tilde[(2, 0)])).abs() < 1e-10);
Ok(())
}
}