#[must_use]
pub fn dequantize_block(quantized: &[i32; 64], matrix: &[u8; 64], qscale: u8) -> [i32; 64] {
let qscale = i32::from(qscale);
let mut out = [0i32; 64];
for i in 0..64 {
out[i] = quantized[i] * i32::from(matrix[i]) * qscale;
}
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn dequantize_zero_block_stays_zero() {
let q = [0i32; 64];
let m = [4u8; 64];
let out = dequantize_block(&q, &m, 10);
assert!(out.iter().all(|&v| v == 0));
}
#[test]
fn dequantize_inverts_scalar_quantization() {
let m = [4u8; 64];
let qscale = 5u8;
let coeff_target = 200; let q = [10i32; 64];
let out = dequantize_block(&q, &m, qscale);
assert!(out.iter().all(|&v| v == coeff_target));
}
#[test]
fn dequantize_preserves_sign() {
let m = [4u8; 64];
let mut q = [0i32; 64];
q[0] = -7;
let out = dequantize_block(&q, &m, 3);
assert_eq!(out[0], -7 * 4 * 3);
}
#[test]
fn dequantize_uses_per_position_matrix() {
let mut m = [0u8; 64];
m[0] = 4;
m[63] = 64;
let mut q = [0i32; 64];
q[0] = 1;
q[63] = 1;
let out = dequantize_block(&q, &m, 1);
assert_eq!(out[0], 4);
assert_eq!(out[63], 64);
}
}