()
| 282 | |
| 283 | #[test] |
| 284 | fn quantize_dequantize_roundtrip() { |
| 285 | let vecs = make_vectors(); |
| 286 | let refs: Vec<&[f32]> = vecs.iter().map(|v| v.as_slice()).collect(); |
| 287 | let codec = Sq8Codec::calibrate(&refs, 3); |
| 288 | |
| 289 | for v in &vecs { |
| 290 | let q = codec.quantize(v); |
| 291 | let dq = codec.dequantize(&q); |
| 292 | for d in 0..3 { |
| 293 | let error = (v[d] - dq[d]).abs(); |
| 294 | let range = codec.maxs[d] - codec.mins[d]; |
| 295 | // Error should be at most half a quantization step. |
| 296 | assert!( |
| 297 | error <= range / 255.0 + 1e-6, |
| 298 | "d={d}: error={error}, max_step={}", |
| 299 | range / 255.0 |
| 300 | ); |
| 301 | } |
| 302 | } |
| 303 | } |
| 304 | |
| 305 | #[test] |
| 306 | fn asymmetric_l2_close_to_exact() { |
nothing calls this directly
no test coverage detected