use super::conv_dense_zps;
use crate::model::Layer;
pub fn layer_has_zero_zps(layer: &Layer) -> bool {
matches!(conv_dense_zps(layer), Some((0, 0)))
}
#[cfg(test)]
mod tests {
use super::*;
use crate::model::tinyconv_mnist_from_cortexm;
#[test]
fn tinyconv_mnist_every_conv_dense_qualifies() {
let m = tinyconv_mnist_from_cortexm();
for l in &m.layers {
if matches!(l, Layer::Conv2d { .. } | Layer::Dense { .. }) {
assert!(
layer_has_zero_zps(l),
"expected fold_zero_zp on {}",
l.name()
);
}
}
}
#[test]
fn nonzero_zp_disqualifies() {
use crate::model::Layer;
use crate::quant::quantize_multiplier;
let (m0, sh) = quantize_multiplier(0.5);
let l = Layer::Dense {
name: "d",
in_features: 4,
out_features: 1,
x_zp: 3,
w_zp: 0,
out_zp: 0,
weight_bits: 8,
weight_encoding: crate::model::WeightEncoding::SignedInt,
requant: vec![(m0, sh)],
weights: vec![1, 2, 3, 4],
bias: None,
};
assert!(!layer_has_zero_zps(&l));
}
}