pub fn maxdiff(a: &[f32], b: &[f32]) -> f32 {
a.iter()
.zip(b)
.map(|(x, y)| (x - y).abs())
.fold(0.0, f32::max)
}
pub fn rel_of(d: f32, reference: &[f32]) -> f32 {
let scale = reference
.iter()
.map(|v| v.abs())
.fold(0.0, f32::max)
.max(1e-3);
d / scale
}
pub fn pr(i: usize) -> f32 {
let x = (i.wrapping_mul(2654435761) ^ 0x9E3779B9) as u32;
((x >> 8) as f32 / (1u32 << 24) as f32) * 2.0 - 1.0
}
pub fn median(xs: &[f64]) -> f64 {
assert!(!xs.is_empty());
let mut v = xs.to_vec();
v.sort_by(|a, b| a.partial_cmp(b).unwrap());
v[(v.len() - 1) / 2]
}
pub fn run_n_median<E>(
n: usize,
mut f: impl FnMut(usize) -> Result<f64, E>,
) -> Result<(f64, Vec<f64>), E> {
let mut runs = Vec::with_capacity(n);
for i in 0..n {
runs.push(f(i)?);
}
Ok((median(&runs), runs))
}
#[derive(Default)]
pub struct GateTally {
pub fails: usize,
}
impl GateTally {
pub fn check(&mut self, label: &str, ok: bool) -> bool {
println!("{label}: {}", if ok { "OK" } else { "FAIL" });
if !ok {
self.fails += 1;
}
ok
}
pub fn finish(&self, what: &str) -> Result<(), String> {
if self.fails == 0 {
println!("ALL GREEN: {what}");
Ok(())
} else {
Err(format!("{}: {} gate(s) FAILED", what, self.fails))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn median_odd_even() {
assert_eq!(median(&[3.0, 1.0, 2.0]), 2.0);
assert_eq!(median(&[4.0, 1.0, 3.0, 2.0]), 2.0); }
#[test]
fn pr_deterministic_snapshot() {
assert_eq!(pr(71), pr(71));
let v: Vec<f32> = (0..4).map(pr).collect();
assert!(v.iter().all(|x| (-1.0..1.0).contains(x)));
}
#[test]
fn tally_contract() {
let mut t = GateTally::default();
assert!(t.check("a", true));
assert!(!t.check("b", false));
assert!(t.finish("demo").is_err());
assert_eq!(t.fails, 1);
}
}