pub const AWQ_MIN_QUALITY_RETENTION: f64 = 0.80;
pub const AWQ_MAX_COMPRESSION_RATIO: f64 = 0.30;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum QualityRetention {
Retained { ratio: f64 },
Degraded { ratio: f64, threshold: f64 },
}
#[must_use]
pub fn classify_quality_retention(p_fp16: f64, p_awq: f64, threshold: f64) -> QualityRetention {
if !p_fp16.is_finite() || p_fp16 <= 0.0 {
return QualityRetention::Degraded {
ratio: f64::NAN,
threshold,
};
}
let ratio = p_awq / p_fp16;
if ratio >= threshold {
QualityRetention::Retained { ratio }
} else {
QualityRetention::Degraded { ratio, threshold }
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum CompressionOutcome {
Compressed { ratio: f64 },
Insufficient { ratio: f64, max_ratio: f64 },
}
#[must_use]
pub fn classify_compression_ratio(
fp16_bytes: u64,
awq_bytes: u64,
max_ratio: f64,
) -> CompressionOutcome {
if fp16_bytes == 0 {
return CompressionOutcome::Insufficient {
ratio: f64::INFINITY,
max_ratio,
};
}
let ratio = awq_bytes as f64 / fp16_bytes as f64;
if ratio <= max_ratio {
CompressionOutcome::Compressed { ratio }
} else {
CompressionOutcome::Insufficient { ratio, max_ratio }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn retention_above_threshold_is_retained() {
let r = classify_quality_retention(0.50, 0.45, AWQ_MIN_QUALITY_RETENTION);
assert!(matches!(r, QualityRetention::Retained { .. }));
}
#[test]
fn retention_exactly_at_threshold_is_retained() {
let r = classify_quality_retention(0.50, 0.40, AWQ_MIN_QUALITY_RETENTION);
match r {
QualityRetention::Retained { ratio } => assert!((ratio - 0.80).abs() < 1e-9),
_ => panic!("expected Retained at exact threshold"),
}
}
#[test]
fn retention_below_threshold_is_degraded() {
let r = classify_quality_retention(0.50, 0.30, AWQ_MIN_QUALITY_RETENTION);
assert!(matches!(r, QualityRetention::Degraded { .. }));
}
#[test]
fn retention_zero_baseline_is_degraded_not_panic() {
let r = classify_quality_retention(0.0, 0.45, AWQ_MIN_QUALITY_RETENTION);
assert!(matches!(r, QualityRetention::Degraded { .. }));
}
#[test]
fn retention_is_deterministic() {
let a = classify_quality_retention(0.42, 0.35, AWQ_MIN_QUALITY_RETENTION);
let b = classify_quality_retention(0.42, 0.35, AWQ_MIN_QUALITY_RETENTION);
assert_eq!(format!("{:?}", a), format!("{:?}", b));
}
#[test]
fn compression_well_under_ceiling_is_compressed() {
let r = classify_compression_ratio(1_000_000, 200_000, AWQ_MAX_COMPRESSION_RATIO);
assert!(matches!(r, CompressionOutcome::Compressed { .. }));
}
#[test]
fn compression_exactly_at_ceiling_is_compressed() {
let r = classify_compression_ratio(1_000_000, 300_000, AWQ_MAX_COMPRESSION_RATIO);
match r {
CompressionOutcome::Compressed { ratio } => assert!((ratio - 0.30).abs() < 1e-9),
_ => panic!("expected Compressed at exact ceiling"),
}
}
#[test]
fn compression_over_ceiling_is_insufficient() {
let r = classify_compression_ratio(1_000_000, 400_000, AWQ_MAX_COMPRESSION_RATIO);
assert!(matches!(r, CompressionOutcome::Insufficient { .. }));
}
#[test]
fn compression_zero_source_is_insufficient() {
let r = classify_compression_ratio(0, 100, AWQ_MAX_COMPRESSION_RATIO);
assert!(matches!(r, CompressionOutcome::Insufficient { .. }));
}
}