Skip to content

Commit

Permalink
fix(shortint): make noise_level field of Ciphertext private again
Browse files Browse the repository at this point in the history
- this is required to make sure we have correctness checks on noise_level
updates if we enable them
  • Loading branch information
IceTDrinker committed Mar 4, 2025
1 parent 371e823 commit b7938ff
Show file tree
Hide file tree
Showing 19 changed files with 144 additions and 139 deletions.
16 changes: 8 additions & 8 deletions tfhe/src/integer/gpu/ciphertext/boolean_value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,17 +139,17 @@ impl CudaBooleanBlock {
let h_lwe_ciphertext_list = self.0.ciphertext.d_blocks.to_lwe_ciphertext_list(streams);
let ciphertext_modulus = h_lwe_ciphertext_list.ciphertext_modulus();

let block = Ciphertext {
ct: LweCiphertextOwned::from_container(
let block = Ciphertext::new(
LweCiphertextOwned::from_container(
h_lwe_ciphertext_list.into_container(),
ciphertext_modulus,
),
degree: self.0.ciphertext.info.blocks[0].degree,
noise_level: self.0.ciphertext.info.blocks[0].noise_level,
message_modulus: self.0.ciphertext.info.blocks[0].message_modulus,
carry_modulus: self.0.ciphertext.info.blocks[0].carry_modulus,
pbs_order: self.0.ciphertext.info.blocks[0].pbs_order,
};
self.0.ciphertext.info.blocks[0].degree,
self.0.ciphertext.info.blocks[0].noise_level,
self.0.ciphertext.info.blocks[0].message_modulus,
self.0.ciphertext.info.blocks[0].carry_modulus,
self.0.ciphertext.info.blocks[0].pbs_order,
);

BooleanBlock::new_unchecked(block)
}
Expand Down
16 changes: 9 additions & 7 deletions tfhe/src/integer/gpu/ciphertext/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -161,13 +161,15 @@ impl CudaRadixCiphertext {
.into_container()
.chunks(lwe_size)
.zip(&self.info.blocks)
.map(|(data, i)| Ciphertext {
ct: LweCiphertextOwned::from_container(data.to_vec(), ciphertext_modulus),
degree: i.degree,
noise_level: i.noise_level,
message_modulus: i.message_modulus,
carry_modulus: i.carry_modulus,
pbs_order: i.pbs_order,
.map(|(data, i)| {
Ciphertext::new(
LweCiphertextOwned::from_container(data.to_vec(), ciphertext_modulus),
i.degree,
i.noise_level,
i.message_modulus,
i.carry_modulus,
i.pbs_order,
)
})
.collect()
}
Expand Down
2 changes: 1 addition & 1 deletion tfhe/src/integer/server_key/crt/scalar_mul_crt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ impl ServerKey {
&& self
.key
.max_noise_level
.validate(ct_i.noise_level * scalar)
.validate(ct_i.noise_level() * scalar)
.is_ok()
{
self.key.unchecked_scalar_mul_assign(ct_i, scalar_i);
Expand Down
2 changes: 1 addition & 1 deletion tfhe/src/integer/server_key/crt_parallel/scalar_mul_crt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ impl ServerKey {
&& self
.key
.max_noise_level
.validate(ct_i.noise_level * scalar)
.validate(ct_i.noise_level() * scalar)
.is_ok()
{
self.key.unchecked_scalar_mul_assign(ct_i, scalar_i);
Expand Down
6 changes: 3 additions & 3 deletions tfhe/src/integer/server_key/radix_parallel/block_shift.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ impl ServerKey {
result
.blocks_mut()
.par_iter_mut()
.filter(|b| b.noise_level > NoiseLevel::NOMINAL)
.filter(|b| b.noise_level() > NoiseLevel::NOMINAL)
.for_each(|block| self.key.message_extract_assign(block));
return result;
}
Expand All @@ -81,7 +81,7 @@ impl ServerKey {
ct.blocks().iter().all(|block| self
.key
.max_noise_level
.validate(block.noise_level + NoiseLevel::NOMINAL)
.validate(block.noise_level() + NoiseLevel::NOMINAL)
.is_ok()),
"Blocks of ciphertext to be shifted has a noise level too high"
);
Expand Down Expand Up @@ -152,7 +152,7 @@ impl ServerKey {
assert!(current_blocks.iter().all(|block| {
self.key
.max_noise_level
.validate(block.noise_level + shift_bit.noise_level())
.validate(block.noise_level() + shift_bit.noise_level())
.is_ok()
}));

Expand Down
2 changes: 1 addition & 1 deletion tfhe/src/integer/server_key/radix_parallel/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ impl ServerKey {
s.spawn(|_| {
to_be_cleaned
.par_iter_mut()
.filter(|block| block.noise_level > NoiseLevel::NOMINAL)
.filter(|block| block.noise_level() > NoiseLevel::NOMINAL)
.for_each(|block| self.key.message_extract_assign(block));
});
}
Expand Down
2 changes: 1 addition & 1 deletion tfhe/src/integer/server_key/radix_parallel/mul.rs
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ impl ServerKey {
if !ct1.block_carries_are_empty() {
self.full_propagate_parallelized(ct1);
}
if ct2.noise_level != NoiseLevel::NOMINAL || !ct2.carry_is_empty() {
if ct2.noise_level() != NoiseLevel::NOMINAL || !ct2.carry_is_empty() {
self.key.message_extract_assign(ct2);
}

Expand Down
28 changes: 14 additions & 14 deletions tfhe/src/integer/server_key/radix_parallel/tests_cases_unsigned.rs
Original file line number Diff line number Diff line change
Expand Up @@ -447,15 +447,15 @@ where

let encrypted_result = executor.execute((&ct, &shift));
for (i, b) in encrypted_result.blocks.iter().enumerate() {
if b.noise_level > NoiseLevel::NOMINAL {
println!("{i}: {:?}", b.noise_level);
if b.noise_level() > NoiseLevel::NOMINAL {
println!("{i}: {:?}", b.noise_level());
}
}
assert!(
encrypted_result
.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL),
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL),
"Expected all blocks to have at most NOMINAL noise level"
);
let decrypted_result: u64 = cks.decrypt_radix(&encrypted_result);
Expand All @@ -472,7 +472,7 @@ where
encrypted_result
.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL),
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL),
"Expected all blocks to have at most NOMINAL noise level"
);
let decrypted_result: u64 = cks.decrypt_radix(&encrypted_result);
Expand Down Expand Up @@ -530,7 +530,7 @@ where
encrypted_result
.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL),
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL),
"Expected all blocks to have at most NOMINAL noise level"
);
let decrypted_result: u64 = cks.decrypt_radix(&encrypted_result);
Expand All @@ -546,7 +546,7 @@ where
encrypted_result
.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL),
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL),
"Expected all blocks to have at most NOMINAL noise level"
);
let decrypted_result: u64 = cks.decrypt_radix(&encrypted_result);
Expand Down Expand Up @@ -606,7 +606,7 @@ where
encrypted_result
.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL),
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL),
"Expected all blocks to have at most NOMINAL noise level"
);
let expected = rotate_left_helper(clear, clear_shift, nb_bits);
Expand All @@ -622,7 +622,7 @@ where
encrypted_result
.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL),
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL),
"Expected all blocks to have at most NOMINAL noise level"
);
let decrypted_result: u64 = cks.decrypt_radix(&encrypted_result);
Expand Down Expand Up @@ -677,7 +677,7 @@ where
encrypted_result
.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL),
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL),
"Expected all blocks to have at most NOMINAL noise level"
);
let decrypted_result: u64 = cks.decrypt_radix(&encrypted_result);
Expand All @@ -694,7 +694,7 @@ where
encrypted_result
.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL),
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL),
"Expected all blocks to have at most NOMINAL noise level"
);
let decrypted_result: u64 = cks.decrypt_radix(&encrypted_result);
Expand Down Expand Up @@ -2421,7 +2421,7 @@ where
assert!(res
.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL));
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL));
assert_eq!(res, tmp);

clear = clear.wrapping_mul(clear2.wrapping_mul(multiplier)) % modulus;
Expand Down Expand Up @@ -2821,7 +2821,7 @@ where
assert!(
ct.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL),
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL),
"Invalid noise_level after propagation"
);

Expand Down Expand Up @@ -2886,7 +2886,7 @@ where
assert!(
ct.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL),
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL),
"Invalid noise_level after propagation"
);

Expand Down Expand Up @@ -2968,7 +2968,7 @@ where
assert!(
ct.blocks
.iter()
.all(|b| b.noise_level <= NoiseLevel::NOMINAL),
.all(|b| b.noise_level() <= NoiseLevel::NOMINAL),
"Invalid noise_level after propagation"
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ pub(crate) fn random_op_sequence_test<P>(
);
res.blocks.iter().enumerate().for_each(|(k, b)| {
assert!(
b.noise_level <= NoiseLevel::NOMINAL,
b.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name} for block {k}",
)
});
Expand Down Expand Up @@ -624,7 +624,7 @@ pub(crate) fn random_op_sequence_test<P>(
);
res.blocks.iter().enumerate().for_each(|(k, b)| {
assert!(
b.noise_level <= NoiseLevel::NOMINAL,
b.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name} for block {k}",
)
});
Expand Down Expand Up @@ -665,7 +665,7 @@ pub(crate) fn random_op_sequence_test<P>(
);
res.blocks.iter().enumerate().for_each(|(k, b)| {
assert!(
b.noise_level <= NoiseLevel::NOMINAL,
b.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name} for block {k}",
)
});
Expand Down Expand Up @@ -707,12 +707,12 @@ pub(crate) fn random_op_sequence_test<P>(
);
res.blocks.iter().enumerate().for_each(|(k, b)| {
assert!(
b.noise_level <= NoiseLevel::NOMINAL,
b.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name} for block {k}",
)
});
assert!(
overflow.0.noise_level <= NoiseLevel::NOMINAL,
overflow.0.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on overflow for op {fn_name}",
);
// Determinism check
Expand Down Expand Up @@ -765,12 +765,12 @@ pub(crate) fn random_op_sequence_test<P>(
);
res.blocks.iter().enumerate().for_each(|(k, b)| {
assert!(
b.noise_level <= NoiseLevel::NOMINAL,
b.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name} for block {k}",
)
});
assert!(
overflow.0.noise_level <= NoiseLevel::NOMINAL,
overflow.0.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on overflow for op {fn_name}",
);
// Determinism check
Expand Down Expand Up @@ -815,7 +815,7 @@ pub(crate) fn random_op_sequence_test<P>(

let res = comparison_op_executor.execute((&left_vec[i], &right_vec[i]));
assert!(
res.0.noise_level <= NoiseLevel::NOMINAL,
res.0.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name}",
);
// Determinism check
Expand Down Expand Up @@ -852,7 +852,7 @@ pub(crate) fn random_op_sequence_test<P>(

let res = scalar_comparison_op_executor.execute((&left_vec[i], clear_right_vec[i]));
assert!(
res.0.noise_level <= NoiseLevel::NOMINAL,
res.0.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name}",
);
// Determinism check
Expand Down Expand Up @@ -895,7 +895,7 @@ pub(crate) fn random_op_sequence_test<P>(
);
res.blocks.iter().enumerate().for_each(|(k, b)| {
assert!(
b.noise_level <= NoiseLevel::NOMINAL,
b.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name} for block {k}",
)
});
Expand Down Expand Up @@ -942,13 +942,13 @@ pub(crate) fn random_op_sequence_test<P>(
);
res_q.blocks.iter().enumerate().for_each(|(k, b)| {
assert!(
b.noise_level <= NoiseLevel::NOMINAL,
b.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name} for block {k}",
)
});
res_r.blocks.iter().enumerate().for_each(|(k, b)| {
assert!(
b.noise_level <= NoiseLevel::NOMINAL,
b.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name} for block {k}",
)
});
Expand Down Expand Up @@ -1005,13 +1005,13 @@ pub(crate) fn random_op_sequence_test<P>(
);
res_q.blocks.iter().enumerate().for_each(|(k, b)| {
assert!(
b.noise_level <= NoiseLevel::NOMINAL,
b.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name} for block {k}",
)
});
res_r.blocks.iter().enumerate().for_each(|(k, b)| {
assert!(
b.noise_level <= NoiseLevel::NOMINAL,
b.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name} for block {k}",
)
});
Expand Down Expand Up @@ -1073,7 +1073,7 @@ pub(crate) fn random_op_sequence_test<P>(
);
res.blocks.iter().enumerate().for_each(|(k, b)| {
assert!(
b.noise_level <= NoiseLevel::NOMINAL,
b.noise_level() <= NoiseLevel::NOMINAL,
"Noise level greater than nominal value on op {fn_name} for block {k}",
)
});
Expand Down
Loading

0 comments on commit b7938ff

Please sign in to comment.