#![allow(dead_code)]
use std::path::{Path, PathBuf};
pub fn assert_close(got: &[f32], want: &[f32], tol: f32, what: &str) {
assert_eq!(got.len(), want.len(), "{what}: logit count");
let worst = got
.iter()
.zip(want.iter())
.map(|(a, b)| (a - b).abs())
.fold(0f32, f32::max);
assert!(
worst <= tol,
"{what}: max |ferrox - llama.cpp| = {worst} > {tol}\n ferrox: {:?}\n llama: {:?}",
&got[..8.min(got.len())],
&want[..8.min(want.len())]
);
}
pub fn collect_gguf(dir: &Path, out: &mut Vec<PathBuf>) {
let Ok(entries) = std::fs::read_dir(dir) else {
return;
};
for e in entries.flatten() {
let p = e.path();
if p.is_dir() {
collect_gguf(&p, out);
} else if p.extension().and_then(|x| x.to_str()) == Some("gguf") {
out.push(p);
}
}
}