use trueno_cuda_edge::quant_oracle::{
check_values_parity, BoundaryValueGenerator, ParityConfig, QuantFormat,
};
#[test]
fn quantization_format_tolerances() {
assert!((QuantFormat::Q4K.tolerance() - 0.05).abs() < f64::EPSILON);
assert!((QuantFormat::Q5K.tolerance() - 0.02).abs() < f64::EPSILON);
assert!((QuantFormat::Q6K.tolerance() - 0.01).abs() < f64::EPSILON);
assert!((QuantFormat::Q8_0.tolerance() - 0.005).abs() < f64::EPSILON);
assert!((QuantFormat::F16.tolerance() - 0.001).abs() < f64::EPSILON);
assert!((QuantFormat::F32.tolerance() - f64::EPSILON).abs() < f64::EPSILON);
}
#[test]
fn boundary_value_generation() {
let gen = BoundaryValueGenerator::new(QuantFormat::Q4K);
let universal = gen.universal_boundaries();
assert!(universal.contains(&0.0));
assert!(universal.iter().any(|v| v.is_nan()));
assert!(universal.iter().any(|v| v.is_infinite()));
let format_bounds = gen.format_boundaries();
assert_eq!(format_bounds.len(), 32);
let all = gen.all_boundaries();
assert_eq!(all.len(), universal.len() + format_bounds.len());
}
#[test]
fn parity_check_cpu_gpu() {
let config = ParityConfig::new(QuantFormat::Q4K);
let cpu = vec![1.0, 2.0, 3.0];
let gpu = vec![1.0, 2.0, 3.0];
let report = check_values_parity(&cpu, &gpu, &config);
assert!(report.passed());
let gpu_close = vec![1.01, 2.01, 3.01];
let report = check_values_parity(&cpu, &gpu_close, &config);
assert!(report.passed());
let gpu_far = vec![1.0, 2.5, 3.0];
let report = check_values_parity(&cpu, &gpu_far, &config);
assert!(!report.passed());
assert_eq!(report.violations.len(), 1);
}
#[test]
fn parity_nan_handling() {
let config = ParityConfig::new(QuantFormat::F32);
let cpu = vec![f64::NAN];
let gpu = vec![f64::NAN];
let report = check_values_parity(&cpu, &gpu, &config);
assert!(report.passed());
let gpu_num = vec![1.0];
let report = check_values_parity(&cpu, &gpu_num, &config);
assert!(!report.passed());
}