Skip to content

Commit 7f474a2

Browse files
starknet_os: make elm_bound in pack_felts a u128 (#11138)
1 parent 9d0d276 commit 7f474a2

File tree

2 files changed

+20
-13
lines changed
  • crates/starknet_os/src/hints/hint_implementation/stateless_compression

2 files changed

+20
-13
lines changed

crates/starknet_os/src/hints/hint_implementation/stateless_compression/tests.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use crate::hints::hint_implementation::stateless_compression::utils::{
3232
decompress,
3333
unpack_felts,
3434
unpack_felts_to_usize,
35+
ElmBoundType,
3536
};
3637
use crate::test_utils::cairo_runner::{
3738
initialize_cairo_runner,
@@ -407,10 +408,10 @@ fn test_compression_length(
407408

408409
let n_unique_values = data.iter().collect::<HashSet<_>>().len();
409410
let n_repeated_values = data.len() - n_unique_values;
410-
let expected_repeated_value_pointers_packed_length =
411-
n_repeated_values.div_ceil(get_n_elms_per_felt(u32::try_from(n_unique_values).unwrap()));
411+
let expected_repeated_value_pointers_packed_length = n_repeated_values
412+
.div_ceil(get_n_elms_per_felt(ElmBoundType::try_from(n_unique_values).unwrap()));
412413
let expected_bucket_indices_packed_length =
413-
data.len().div_ceil(get_n_elms_per_felt(u32::try_from(TOTAL_N_BUCKETS).unwrap()));
414+
data.len().div_ceil(get_n_elms_per_felt(ElmBoundType::try_from(TOTAL_N_BUCKETS).unwrap()));
414415

415416
assert_eq!(
416417
compressed.len(),
@@ -428,7 +429,7 @@ fn test_compression_length(
428429
#[rstest]
429430
#[case(128, 35)]
430431
#[case(7, 83)]
431-
fn test_get_n_elms_per_felt(#[case] elm_bound: u32, #[case] expected_n_elems: usize) {
432+
fn test_get_n_elms_per_felt(#[case] elm_bound: ElmBoundType, #[case] expected_n_elems: usize) {
432433
assert_eq!(get_n_elms_per_felt(elm_bound), expected_n_elems);
433434
}
434435

crates/starknet_os/src/hints/hint_implementation/stateless_compression/utils.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ use strum_macros::Display;
1212

1313
use crate::hints::error::OsHintError;
1414

15+
pub type ElmBoundType = u128;
16+
1517
pub(crate) const COMPRESSION_VERSION: u8 = 0;
1618
pub(crate) const HEADER_ELM_N_BITS: usize = 20;
17-
pub(crate) const HEADER_ELM_BOUND: u32 = 1 << HEADER_ELM_N_BITS;
19+
pub(crate) const HEADER_ELM_BOUND: ElmBoundType = 1 << HEADER_ELM_N_BITS;
1820

1921
pub(crate) const N_UNIQUE_BUCKETS: usize = BitLength::COUNT;
2022
/// Number of buckets, including the repeating values bucket.
@@ -427,11 +429,11 @@ pub(crate) fn compress(data: &[Felt]) -> Vec<Felt> {
427429
let packed_header = pack_in_felts(&header, HEADER_ELM_BOUND);
428430
let packed_repeating_value_pointers = pack_in_felts(
429431
&compression_set.get_repeating_value_pointers(),
430-
u32::try_from(n_unique_values).expect("Too many unique values"),
432+
ElmBoundType::try_from(n_unique_values).expect("Too many unique values"),
431433
);
432434
let packed_bucket_index_per_elm = pack_in_felts(
433435
&compression_set.bucket_index_per_elm,
434-
u32::try_from(TOTAL_N_BUCKETS).expect("Too many buckets"),
436+
ElmBoundType::try_from(TOTAL_N_BUCKETS).expect("Too many buckets"),
435437
);
436438

437439
let unique_values = compression_set.pack_unique_values();
@@ -443,18 +445,18 @@ pub(crate) fn compress(data: &[Felt]) -> Vec<Felt> {
443445

444446
/// Calculates how many instances of the largest element below the (non-inclusive) element bound can
445447
/// fit into the bit length of a single felt.
446-
pub fn get_n_elms_per_felt(elm_bound: u32) -> usize {
448+
pub fn get_n_elms_per_felt(elm_bound: ElmBoundType) -> usize {
447449
if elm_bound <= 1 {
448450
return MAX_N_BITS;
449451
}
450452
// Calculate: ceil(log2(elm_bound)).
451-
let n_bits_required = u32::BITS - (elm_bound - 1).leading_zeros();
453+
let n_bits_required = ElmBoundType::BITS - (elm_bound - 1).leading_zeros();
452454
MAX_N_BITS / usize::try_from(n_bits_required).expect("usize overflow")
453455
}
454456

455457
/// Packs a list of elements into multiple felts, ensuring that each felt contains as many elements
456458
/// as can fit.
457-
pub fn pack_in_felts<U>(elms: &[U], elm_bound: u32) -> Vec<Felt>
459+
pub fn pack_in_felts<U>(elms: &[U], elm_bound: ElmBoundType) -> Vec<Felt>
458460
where
459461
U: Copy,
460462
BigUint: From<U>,
@@ -465,7 +467,7 @@ where
465467
}
466468

467469
/// Packs a chunk of elements into a single felt. Assumes that the elms fit in a felt.
468-
fn pack_in_felt<U>(elms: &[U], elm_bound: u32) -> Felt
470+
fn pack_in_felt<U>(elms: &[U], elm_bound: ElmBoundType) -> Felt
469471
where
470472
U: Copy,
471473
BigUint: From<U>,
@@ -509,7 +511,11 @@ pub fn unpack_felts<const LENGTH: usize>(
509511
result
510512
}
511513

512-
pub fn unpack_felts_to_usize(compressed: &[Felt], n_elms: usize, elm_bound: u32) -> Vec<usize> {
514+
pub fn unpack_felts_to_usize(
515+
compressed: &[Felt],
516+
n_elms: usize,
517+
elm_bound: ElmBoundType,
518+
) -> Vec<usize> {
513519
let n_elms_per_felt = get_n_elms_per_felt(elm_bound);
514520
let elm_bound_as_big = BigUint::from(elm_bound);
515521
let mut result = Vec::with_capacity(n_elms);
@@ -546,7 +552,7 @@ pub fn decompress(compressed: &mut impl Iterator<Item = Felt>) -> Vec<Felt> {
546552
fn unpack_chunk_to_usize(
547553
compressed: &mut impl Iterator<Item = Felt>,
548554
n_elms: usize,
549-
elm_bound: u32,
555+
elm_bound: ElmBoundType,
550556
) -> Vec<usize> {
551557
let n_elms_per_felt = get_n_elms_per_felt(elm_bound);
552558
let n_packed_felts = n_elms.div_ceil(n_elms_per_felt);

0 commit comments

Comments
 (0)