pub fn code_bands<B: Bits, M: CoefModel>(
p: &Pyramid,
q: &mut [i32],
preds: &[Pred],
b: &mut B,
model: &mut M,
)Expand description
Code (encode or decode) every band of q (volume layout) in pyramid
order with per-band predictors. When decoding, q must be zeroed and is
filled in.
Examples found in repository?
examples/analyze.rs (line 27)
6fn main() {
7 let a: Vec<String> = std::env::args().skip(1).collect();
8 let b = std::fs::read(&a[0]).unwrap();
9 let x: Vec<f64> = b
10 .as_chunks::<4>()
11 .0
12 .iter()
13 .map(|&c| f32::from_le_bytes(c) as f64)
14 .collect();
15 let dims: Vec<usize> = a[1].split('x').map(|s| s.parse().unwrap()).collect();
16 let delta: f64 = a[2].parse().unwrap();
17 let rho: f64 = a.get(3).map_or(0.45, |s| s.parse().unwrap());
18 let co = Coeffs::new(&x, &dims);
19 let (q, _) = quantize(&co, delta, rho);
20 let mut m = Meter::default();
21 let mut qq = q.clone();
22 let preds = if std::env::var("TC_NOPRED").is_ok() {
23 vec![]
24 } else {
25 fit_predictors(&co.p, &q)
26 };
27 code_bands(&co.p, &mut qq, &preds, &mut m, &mut HandModel::default());
28 let n = x.len() as f64;
29 let nz = q.iter().filter(|&&v| v != 0).count();
30 println!(
31 "nonzero {:.4} sig {:.4} hi {:.4} low {:.4} sign {:.4} total {:.4} bpv",
32 nz as f64 / n,
33 m.bits[0] / n,
34 m.bits[1] / n,
35 m.bits[2] / n,
36 m.bits[3] / n,
37 m.bits.iter().sum::<f64>() / n
38 );
39 // per band
40 for (bi, band) in co.p.bands.iter().enumerate() {
41 let _ = bi;
42 let [_, ny, nx] = co.p.dims;
43 let mut cnt = 0;
44 let mut nzc = 0;
45 let mut sa = 0u64;
46 for z in band.start[0]..band.end[0] {
47 for y in band.start[1]..band.end[1] {
48 for xx in band.start[2]..band.end[2] {
49 let v = q[(z * ny + y) * nx + xx];
50 cnt += 1;
51 if v != 0 {
52 nzc += 1;
53 }
54 sa += v.unsigned_abs() as u64;
55 }
56 }
57 }
58 if band.level <= 1 {
59 println!(
60 " L{} m{:03b} n={} nz={:.3} mean|q|={:.2}",
61 band.level,
62 band.mask,
63 cnt,
64 nzc as f64 / cnt as f64,
65 sa as f64 / cnt as f64
66 );
67 }
68 }
69}