use kshana::allan::{hadamard_adev, modified_adev, overlapping_adev, time_deviation};
const NBS14_PHASE: [f64; 10] = [
0.00000, 103.11111, 123.22222, 157.33333, 166.44444, 48.55555, -96.33333, -2.22222, 111.88889,
0.00000,
];
fn rel_err(got: f64, want: f64) -> f64 {
((got - want) / want).abs()
}
const TOL: f64 = 1e-4;
#[test]
fn overlapping_adev_matches_stable32_nbs14() {
let a1 = overlapping_adev(&NBS14_PHASE, 1.0, 1);
let a2 = overlapping_adev(&NBS14_PHASE, 1.0, 2);
assert!(
rel_err(a1, 91.22945) < TOL,
"OADEV(1) = {a1}, want 91.22945"
);
assert!(
rel_err(a2, 85.95287) < TOL,
"OADEV(2) = {a2}, want 85.95287"
);
}
#[test]
fn modified_adev_matches_stable32_nbs14() {
let m1 = modified_adev(&NBS14_PHASE, 1.0, 1);
let m2 = modified_adev(&NBS14_PHASE, 1.0, 2);
assert!(rel_err(m1, 91.22945) < TOL, "MDEV(1) = {m1}, want 91.22945");
assert!(rel_err(m2, 74.78849) < TOL, "MDEV(2) = {m2}, want 74.78849");
}
#[test]
fn time_deviation_matches_stable32_nbs14() {
let t1 = time_deviation(&NBS14_PHASE, 1.0, 1);
let t2 = time_deviation(&NBS14_PHASE, 1.0, 2);
assert!(rel_err(t1, 52.67135) < TOL, "TDEV(1) = {t1}, want 52.67135");
assert!(rel_err(t2, 86.35831) < TOL, "TDEV(2) = {t2}, want 86.35831");
}
#[test]
fn overlapping_hadamard_matches_stable32_nbs14() {
let h1 = hadamard_adev(&NBS14_PHASE, 1.0, 1);
let h2 = hadamard_adev(&NBS14_PHASE, 1.0, 2);
assert!(
rel_err(h1, 70.80607) < TOL,
"OHDEV(1) = {h1}, want 70.80607"
);
assert!(
rel_err(h2, 85.61487) < TOL,
"OHDEV(2) = {h2}, want 85.61487"
);
}