Skip to main content

fpzip_rs/
decoder.rs

1use crate::codec::range_decoder::RangeDecoder;
2use crate::codec::rc_qs_model::RCQsModel;
3use crate::core::front::Front;
4use crate::core::pc_decoder::{PCDecoderDouble, PCDecoderFloat};
5use crate::core::pc_encoder::symbol_count;
6use crate::core::pc_map;
7
8/// Decompresses a 3D float array at the given bit precision.
9pub(crate) fn decompress_3d_float(
10    decoder: &mut RangeDecoder,
11    data: &mut [f32],
12    nx: i32,
13    ny: i32,
14    nz: i32,
15    bits: u32,
16) {
17    let symbols = symbol_count(bits);
18    let mut model = RCQsModel::with_defaults(false, symbols);
19    let zero_mapped = pc_map::forward_f32(0.0f32, bits);
20    let mut front = Front::<u32>::new(nx, ny, zero_mapped);
21
22    let mut data_index = 0;
23
24    front.advance(0, 0, 1);
25    for _ in 0..nz {
26        front.advance(0, 1, 0);
27        for _ in 0..ny {
28            front.advance(1, 0, 0);
29            for _ in 0..nx {
30                let p = front
31                    .get(1, 0, 0)
32                    .wrapping_sub(front.get(0, 1, 1))
33                    .wrapping_add(front.get(0, 1, 0))
34                    .wrapping_sub(front.get(1, 0, 1))
35                    .wrapping_add(front.get(0, 0, 1))
36                    .wrapping_sub(front.get(1, 1, 0))
37                    .wrapping_add(front.get(1, 1, 1));
38
39                let mut pc = PCDecoderFloat::new(decoder, &mut model, bits);
40                let a = pc.decode(p);
41
42                data[data_index] = pc_map::inverse_f32(a, bits);
43                data_index += 1;
44
45                front.push(a);
46            }
47        }
48    }
49}
50
51/// Decompresses a 3D double array at the given bit precision.
52pub(crate) fn decompress_3d_double(
53    decoder: &mut RangeDecoder,
54    data: &mut [f64],
55    nx: i32,
56    ny: i32,
57    nz: i32,
58    bits: u32,
59) {
60    let symbols = symbol_count(bits);
61    let mut model = RCQsModel::with_defaults(false, symbols);
62    let zero_mapped = pc_map::forward_f64(0.0f64, bits);
63    let mut front = Front::<u64>::new(nx, ny, zero_mapped);
64
65    let mut data_index = 0;
66
67    front.advance(0, 0, 1);
68    for _ in 0..nz {
69        front.advance(0, 1, 0);
70        for _ in 0..ny {
71            front.advance(1, 0, 0);
72            for _ in 0..nx {
73                let p = front
74                    .get(1, 0, 0)
75                    .wrapping_sub(front.get(0, 1, 1))
76                    .wrapping_add(front.get(0, 1, 0))
77                    .wrapping_sub(front.get(1, 0, 1))
78                    .wrapping_add(front.get(0, 0, 1))
79                    .wrapping_sub(front.get(1, 1, 0))
80                    .wrapping_add(front.get(1, 1, 1));
81
82                let mut pc = PCDecoderDouble::new(decoder, &mut model, bits);
83                let a = pc.decode(p);
84
85                data[data_index] = pc_map::inverse_f64(a, bits);
86                data_index += 1;
87
88                front.push(a);
89            }
90        }
91    }
92}
93
94/// Decompresses a 4D float array (multiple fields).
95pub(crate) fn decompress_4d_float(
96    decoder: &mut RangeDecoder,
97    data: &mut [f32],
98    nx: i32,
99    ny: i32,
100    nz: i32,
101    nf: i32,
102    bits: u32,
103) {
104    let field_size = (nx as usize) * (ny as usize) * (nz as usize);
105    for f in 0..nf as usize {
106        let start = f * field_size;
107        let end = start + field_size;
108        decompress_3d_float(decoder, &mut data[start..end], nx, ny, nz, bits);
109    }
110}
111
112/// Decompresses a 4D double array (multiple fields).
113pub(crate) fn decompress_4d_double(
114    decoder: &mut RangeDecoder,
115    data: &mut [f64],
116    nx: i32,
117    ny: i32,
118    nz: i32,
119    nf: i32,
120    bits: u32,
121) {
122    let field_size = (nx as usize) * (ny as usize) * (nz as usize);
123    for f in 0..nf as usize {
124        let start = f * field_size;
125        let end = start + field_size;
126        decompress_3d_double(decoder, &mut data[start..end], nx, ny, nz, bits);
127    }
128}