Skip to content

Commit 5830b8c

Browse files
Merge branch 'main' into docs
2 parents 5f82919 + 1239856 commit 5830b8c

1 file changed

Lines changed: 26 additions & 25 deletions

File tree

src/rust/integer_compression/fastpfor.rs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ pub struct FastPFOR {
3737
/// Frequency count for each bit width:
3838
/// freqs[0..32] = count of values needing exactly i bits
3939
pub freqs: Vec<u32>,
40-
/// [`optimal_bits`, `exception_count`, `max_bits`]
41-
pub bestbbestcexceptmaxb: [u32; 3],
40+
pub optimal_bits: u32,
41+
pub exception_count: u32,
42+
pub max_bits: u32,
4243
/// Integers per block (128 or 256)
4344
pub block_size: u32,
4445
}
@@ -149,7 +150,9 @@ impl FastPFOR {
149150
data_to_be_packed: vec![vec![0; page_size as usize / 32 * 4]; 33],
150151
data_pointers: vec![0; 33],
151152
freqs: vec![0; 33],
152-
bestbbestcexceptmaxb: [0; 3],
153+
optimal_bits: 0,
154+
exception_count: 0,
155+
max_bits: 0,
153156
}
154157
}
155158

@@ -184,25 +187,23 @@ impl FastPFOR {
184187
let final_input_offset = tmp_input_offset + thissize - self.block_size;
185188
while tmp_input_offset <= final_input_offset {
186189
self.best_b_from_data(input, tmp_input_offset);
187-
let tmp_best_b = self.bestbbestcexceptmaxb[0];
188-
self.bytes_container.put(self.bestbbestcexceptmaxb[0] as u8);
189-
self.bytes_container.put(self.bestbbestcexceptmaxb[1] as u8);
190-
if self.bestbbestcexceptmaxb[1] > 0 {
191-
self.bytes_container.put(self.bestbbestcexceptmaxb[2] as u8);
192-
let index = self.bestbbestcexceptmaxb[2] - self.bestbbestcexceptmaxb[0];
193-
if self.data_pointers[index as usize] + self.bestbbestcexceptmaxb[1] as usize
190+
let tmp_best_b = self.optimal_bits;
191+
self.bytes_container.put(self.optimal_bits as u8);
192+
self.bytes_container.put(self.exception_count as u8);
193+
if self.exception_count > 0 {
194+
self.bytes_container.put(self.max_bits as u8);
195+
let index = self.max_bits - self.optimal_bits;
196+
if self.data_pointers[index as usize] + self.exception_count as usize
194197
>= self.data_to_be_packed[index as usize].len()
195198
{
196199
let mut new_size = 2
197-
* (self.data_pointers[index as usize]
198-
+ self.bestbbestcexceptmaxb[1] as usize)
200+
* (self.data_pointers[index as usize] + self.exception_count as usize)
199201
as u32;
200202
new_size = helpers::greatest_multiple(new_size + 31, 32);
201203
self.data_to_be_packed[index as usize].resize(new_size as usize, 0);
202204
}
203205
for k in 0..self.block_size {
204-
if (input[(k + tmp_input_offset) as usize] >> self.bestbbestcexceptmaxb[0]) != 0
205-
{
206+
if (input[(k + tmp_input_offset) as usize] >> self.optimal_bits) != 0 {
206207
self.bytes_container.put(k as u8);
207208
self.data_to_be_packed[index as usize]
208209
[self.data_pointers[index as usize]] =
@@ -287,32 +288,32 @@ impl FastPFOR {
287288
self.freqs[helpers::bits(input[k as usize])] += 1;
288289
}
289290

290-
self.bestbbestcexceptmaxb[0] = 32;
291-
while self.freqs[self.bestbbestcexceptmaxb[0] as usize] == 0 {
292-
self.bestbbestcexceptmaxb[0] -= 1;
291+
self.optimal_bits = 32;
292+
while self.freqs[self.optimal_bits as usize] == 0 {
293+
self.optimal_bits -= 1;
293294
}
294-
self.bestbbestcexceptmaxb[2] = self.bestbbestcexceptmaxb[0];
295+
self.max_bits = self.optimal_bits;
295296

296-
let mut bestcost = self.bestbbestcexceptmaxb[0] * self.block_size;
297+
let mut bestcost = self.optimal_bits * self.block_size;
297298
let mut cexcept: u32 = 0;
298-
self.bestbbestcexceptmaxb[1] = cexcept;
299+
self.exception_count = cexcept;
299300

300-
for b in (0..self.bestbbestcexceptmaxb[0]).rev() {
301+
for b in (0..self.optimal_bits).rev() {
301302
cexcept += self.freqs[b as usize + 1];
302303
if cexcept == self.block_size {
303304
break;
304305
}
305306
let mut thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT
306-
+ cexcept * (self.bestbbestcexceptmaxb[2] - b)
307+
+ cexcept * (self.max_bits - b)
307308
+ b * self.block_size
308309
+ 8;
309-
if self.bestbbestcexceptmaxb[2] - b == 1 {
310+
if self.max_bits - b == 1 {
310311
thiscost -= cexcept;
311312
}
312313
if thiscost < bestcost {
313314
bestcost = thiscost;
314-
self.bestbbestcexceptmaxb[0] = b;
315-
self.bestbbestcexceptmaxb[1] = cexcept;
315+
self.optimal_bits = b;
316+
self.exception_count = cexcept;
316317
}
317318
}
318319
}

0 commit comments

Comments
 (0)