Skip to content

Commit a305a7c

Browse files
committed
chore!: use u64 for NoiseLevel
Change from usize to u64 for MaxNoiseLevel and NoiseLevel This is an API break as `new` and `get` handle/returns u64 instead of usize This is also a potential serialization break depending on the serializer used (bincode should be fine as it serializes usize as u64)
1 parent 12e7a71 commit a305a7c

File tree

15 files changed

+39
-34
lines changed

15 files changed

+39
-34
lines changed

tfhe/src/c_api/shortint/parameters.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ impl TryFrom<ShortintPBSParameters> for crate::shortint::ClassicPBSParameters {
6262
c_params.modulus_power_of_2_exponent,
6363
)?,
6464
max_noise_level: crate::shortint::parameters::MaxNoiseLevel::new(
65-
c_params.max_noise_level,
65+
c_params.max_noise_level as u64,
6666
),
6767
log2_p_fail: c_params.log2_p_fail,
6868
encryption_key_choice: c_params.encryption_key_choice.into(),
@@ -113,7 +113,7 @@ impl ShortintPBSParameters {
113113
ks_level: rust_params.ks_level.0,
114114
message_modulus: rust_params.message_modulus.0,
115115
carry_modulus: rust_params.carry_modulus.0,
116-
max_noise_level: rust_params.max_noise_level.get(),
116+
max_noise_level: rust_params.max_noise_level.get() as usize,
117117
log2_p_fail: rust_params.log2_p_fail,
118118
modulus_power_of_2_exponent: convert_modulus(rust_params.ciphertext_modulus),
119119
encryption_key_choice: ShortintEncryptionKeyChoice::convert(

tfhe/src/integer/server_key/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ impl ServerKey {
246246
MaxDegree::from_msg_carry_modulus(self.message_modulus(), self.carry_modulus());
247247
let max_sum_to_full_carry = max_degree.get() / degree.get();
248248

249-
max_sum_to_full_carry.min(self.key.max_noise_level.get())
249+
max_sum_to_full_carry.min(self.key.max_noise_level.get() as usize)
250250
}
251251
}
252252

tfhe/src/integer/server_key/radix_parallel/add.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,8 @@ impl ServerKey {
854854

855855
// Just in case we compare with max noise level, but it should always be num_bits_in_blocks
856856
// with the parameters we provide
857-
let grouping_size = (num_bits_in_block as usize).min(self.key.max_noise_level.get());
857+
let grouping_size =
858+
(num_bits_in_block as usize).min(self.key.max_noise_level.get() as usize);
858859

859860
let mut output_flag = None;
860861

tfhe/src/integer/server_key/radix_parallel/block_shift.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl ServerKey {
6767
assert!(
6868
self.key
6969
.max_noise_level
70-
.validate(NoiseLevel::NOMINAL * 3usize)
70+
.validate(NoiseLevel::NOMINAL * 3u64)
7171
.is_ok(),
7272
"Parameters must support 2 additions before a PBS"
7373
);

tfhe/src/integer/server_key/radix_parallel/modulus_switch_compression.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ impl ServerKey {
6666
"Compression does not support message_modulus > carry_modulus"
6767
);
6868
assert!(
69-
self.key.max_noise_level.get() >= self.message_modulus().0 + 1,
69+
self.key.max_noise_level.get() >= self.message_modulus().0 as u64 + 1,
7070
"Compression does not support max_noise_level < message_modulus + 1"
7171
);
7272

tfhe/src/integer/server_key/radix_parallel/scalar_add.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,8 @@ impl ServerKey {
555555
let num_bits_in_block = packed_modulus.ilog2();
556556
// Just in case we compare with max noise level, but it should always be num_bits_in_blocks
557557
// with the parameters we provide
558-
let grouping_size = (num_bits_in_block as usize).min(self.key.max_noise_level.get());
558+
let grouping_size =
559+
(num_bits_in_block as usize).min(self.key.max_noise_level.get() as usize);
559560

560561
// In this, we store lookup tables to be used on each 'packing'.
561562
// These LUTs will generate an output that tells whether the packing

tfhe/src/integer/server_key/radix_parallel/scalar_sub.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,8 @@ impl ServerKey {
394394
let num_bits_in_block = packed_modulus.ilog2();
395395
// Just in case we compare with max noise level, but it should always be num_bits_in_blocks
396396
// with the parameters we provide
397-
let grouping_size = (num_bits_in_block as usize).min(self.key.max_noise_level.get());
397+
let grouping_size =
398+
(num_bits_in_block as usize).min(self.key.max_noise_level.get() as usize);
398399

399400
// In this, we store lookup tables to be used on each 'packing'.
400401
// These LUTs will generate an output that tells whether the packing

tfhe/src/integer/server_key/radix_parallel/sub.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,8 @@ impl ServerKey {
386386

387387
// Just in case we compare with max noise level, but it should always be num_bits_in_blocks
388388
// with the parameters we provide
389-
let grouping_size = (num_bits_in_block as usize).min(self.key.max_noise_level.get());
389+
let grouping_size =
390+
(num_bits_in_block as usize).min(self.key.max_noise_level.get() as usize);
390391

391392
// Second step
392393
let (mut prepared_blocks, resolved_borrows) = {

tfhe/src/js_on_wasm_api/shortint.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ impl Shortint {
417417
ks_level: usize,
418418
message_modulus: usize,
419419
carry_modulus: usize,
420-
max_noise_level: usize,
420+
max_noise_level: u64,
421421
log2_p_fail: f64,
422422
modulus_power_of_2_exponent: usize,
423423
encryption_key_choice: ShortintEncryptionKeyChoice,

tfhe/src/shortint/ciphertext/common.rs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ impl std::error::Error for NotTrivialCiphertextError {}
2323
/// that guarantees the target p-error when doing a PBS on it
2424
#[derive(Debug, PartialEq, Eq, Copy, Clone, Serialize, Deserialize, Versionize)]
2525
#[versionize(MaxNoiseLevelVersions)]
26-
pub struct MaxNoiseLevel(usize);
26+
pub struct MaxNoiseLevel(u64);
2727

2828
impl MaxNoiseLevel {
29-
pub(crate) const UNKNOWN: Self = Self(usize::MAX);
29+
pub(crate) const UNKNOWN: Self = Self(u64::MAX);
3030

31-
pub const fn new(value: usize) -> Self {
31+
pub const fn new(value: u64) -> Self {
3232
Self(value)
3333
}
3434

35-
pub const fn get(&self) -> usize {
35+
pub const fn get(&self) -> u64 {
3636
self.0
3737
}
3838

@@ -45,7 +45,8 @@ impl MaxNoiseLevel {
4545
msg_modulus: MessageModulus,
4646
carry_modulus: CarryModulus,
4747
) -> Self {
48-
Self((carry_modulus.0 * msg_modulus.0 - 1) / (msg_modulus.0 - 1))
48+
let level = (carry_modulus.0 * msg_modulus.0 - 1) / (msg_modulus.0 - 1);
49+
Self(level as u64)
4950
}
5051

5152
pub const fn validate(&self, noise_level: NoiseLevel) -> Result<(), CheckError> {
@@ -64,17 +65,17 @@ impl MaxNoiseLevel {
6465
Debug, PartialEq, Eq, PartialOrd, Ord, Copy, Clone, Serialize, Deserialize, Versionize,
6566
)]
6667
#[versionize(NoiseLevelVersions)]
67-
pub struct NoiseLevel(usize);
68+
pub struct NoiseLevel(u64);
6869

6970
impl NoiseLevel {
7071
pub const NOMINAL: Self = Self(1);
7172
pub const ZERO: Self = Self(0);
7273
// As a safety measure the unknown noise level is set to the max value
73-
pub const UNKNOWN: Self = Self(usize::MAX);
74+
pub const UNKNOWN: Self = Self(u64::MAX);
7475
}
7576

7677
impl NoiseLevel {
77-
pub fn get(&self) -> usize {
78+
pub fn get(&self) -> u64 {
7879
self.0
7980
}
8081
}
@@ -94,16 +95,16 @@ impl std::ops::Add for NoiseLevel {
9495
}
9596
}
9697

97-
impl std::ops::MulAssign<usize> for NoiseLevel {
98-
fn mul_assign(&mut self, rhs: usize) {
98+
impl std::ops::MulAssign<u64> for NoiseLevel {
99+
fn mul_assign(&mut self, rhs: u64) {
99100
self.0 = self.0.saturating_mul(rhs);
100101
}
101102
}
102103

103-
impl std::ops::Mul<usize> for NoiseLevel {
104+
impl std::ops::Mul<u64> for NoiseLevel {
104105
type Output = Self;
105106

106-
fn mul(mut self, rhs: usize) -> Self::Output {
107+
fn mul(mut self, rhs: u64) -> Self::Output {
107108
self *= rhs;
108109

109110
self
@@ -272,14 +273,14 @@ mod tests {
272273

273274
let mut rng = thread_rng();
274275

275-
assert_eq!(NoiseLevel::UNKNOWN.0, usize::MAX);
276+
assert_eq!(NoiseLevel::UNKNOWN.0, u64::MAX);
276277

277278
let max_noise_level = NoiseLevel::UNKNOWN;
278-
let random_addend = rng.gen::<usize>();
279+
let random_addend = rng.gen::<u64>();
279280
let add = max_noise_level + NoiseLevel(random_addend);
280281
assert_eq!(add, NoiseLevel::UNKNOWN);
281282

282-
let random_positive_multiplier = rng.gen_range(1usize..=usize::MAX);
283+
let random_positive_multiplier = rng.gen_range(1u64..=u64::MAX);
283284
let mul = max_noise_level * random_positive_multiplier;
284285
assert_eq!(mul, NoiseLevel::UNKNOWN);
285286
}

tfhe/src/shortint/list_compression/compression.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ impl CompressionKey {
8888

8989
let mut ct = ct.clone();
9090
let max_noise_level =
91-
MaxNoiseLevel::new((ct.noise_level() * message_modulus.0).get());
91+
MaxNoiseLevel::new((ct.noise_level() * message_modulus.0 as u64).get());
9292
unchecked_scalar_mul_assign(&mut ct, message_modulus.0 as u8, max_noise_level);
9393

9494
list.extend(ct.ct.as_ref());

tfhe/src/shortint/server_key/bivariate_pbs.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ fn ciphertexts_can_be_packed_without_exceeding_space_or_noise(
3636

3737
max_degree.validate(final_degree)?;
3838

39-
let final_noise_level = (lhs.noise_level * factor) + rhs.noise_level;
39+
let final_noise_level = (lhs.noise_level * factor as u64) + rhs.noise_level;
4040

4141
server_key.max_noise_level.validate(final_noise_level)?;
4242

@@ -513,7 +513,7 @@ impl ScalingOperation {
513513
impl Ciphertext {
514514
fn noise_degree_if_scaled(&self, scale: u8) -> CiphertextNoiseDegree {
515515
CiphertextNoiseDegree {
516-
noise_level: self.noise_level() * scale as usize,
516+
noise_level: self.noise_level() * u64::from(scale),
517517
degree: self.degree * scale as usize,
518518
}
519519
}
@@ -524,7 +524,7 @@ impl Ciphertext {
524524
} = self.noise_degree_if_bootstrapped();
525525

526526
CiphertextNoiseDegree {
527-
noise_level: noise * scale as usize,
527+
noise_level: noise * u64::from(scale),
528528
degree: degree * scale as usize,
529529
}
530530
}

tfhe/src/shortint/server_key/scalar_mul.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ impl ServerKey {
298298
self.max_degree.validate(Degree::new(final_degree))?;
299299

300300
self.max_noise_level
301-
.validate(ct.noise_level * scalar as usize)?;
301+
.validate(ct.noise_level * u64::from(scalar))?;
302302

303303
Ok(())
304304
}
@@ -521,7 +521,7 @@ pub(crate) fn unchecked_scalar_mul_assign(
521521
scalar: u8,
522522
max_noise_level: MaxNoiseLevel,
523523
) {
524-
ct.set_noise_level(ct.noise_level() * scalar as usize, max_noise_level);
524+
ct.set_noise_level(ct.noise_level() * u64::from(scalar), max_noise_level);
525525
ct.degree = Degree::new(ct.degree.get() * scalar as usize);
526526

527527
match scalar {

tfhe/src/shortint/server_key/tests/noise_level.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ fn test_ct_scalar_op_noise_level_propagation(sk: &ServerKey, ct: &Ciphertext, sc
234234
test_fn(&ServerKey::unchecked_scalar_add, &|ct_noise, _| ct_noise);
235235
test_fn(&ServerKey::unchecked_scalar_sub, &|ct_noise, _| ct_noise);
236236
test_fn(&ServerKey::unchecked_scalar_mul, &|ct_noise, scalar| {
237-
ct_noise * scalar as usize
237+
ct_noise * u64::from(scalar)
238238
});
239239
let expected_pbs_noise = if ct.is_trivial() {
240240
NoiseLevel::ZERO
@@ -281,7 +281,7 @@ fn test_ct_scalar_op_assign_noise_level_propagation(sk: &ServerKey, ct: &Ciphert
281281
});
282282
test_fn(
283283
&ServerKey::unchecked_scalar_mul_assign,
284-
&|ct_noise, scalar| ct_noise * scalar as usize,
284+
&|ct_noise, scalar| ct_noise * u64::from(scalar),
285285
);
286286
let expected_pbs_noise = if ct.is_trivial() {
287287
NoiseLevel::ZERO

tfhe/tests/backward_compatibility/shortint.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pub fn load_params(test_params: &TestParameterSet) -> ClassicPBSParameters {
3636
ks_level: DecompositionLevelCount(test_params.ks_level),
3737
message_modulus: MessageModulus(test_params.message_modulus),
3838
carry_modulus: CarryModulus(test_params.carry_modulus),
39-
max_noise_level: MaxNoiseLevel::new(test_params.max_noise_level),
39+
max_noise_level: MaxNoiseLevel::new(test_params.max_noise_level as u64),
4040
log2_p_fail: test_params.log2_p_fail,
4141
ciphertext_modulus: CiphertextModulus::try_new(test_params.ciphertext_modulus).unwrap(),
4242
encryption_key_choice: {

0 commit comments

Comments
 (0)