From 777bbe437a73db2b6d4df8d9609aec5a3fcf0a32 Mon Sep 17 00:00:00 2001 From: "Mayeul@Zama" <69792125+mayeul-zama@users.noreply.github.com> Date: Thu, 16 Oct 2025 10:30:46 +0200 Subject: [PATCH] feat(shortint): add multi bit decompression --- .../integer/glwe_packing_compression.rs | 4 +- tfhe-benchmark/src/utilities.rs | 18 +- tfhe/examples/utilities/params_to_file.rs | 6 +- ...we_multi_bit_programmable_bootstrapping.rs | 1 - tfhe/src/high_level_api/keys/server.rs | 11 +- tfhe/src/high_level_api/xof_key_set.rs | 79 ++++++--- .../ciphertext/compressed_ciphertext_list.rs | 2 +- .../ciphertext/compressed_ciphertext_list.rs | 4 +- tfhe/src/integer/gpu/client_key/radix.rs | 20 +-- .../compressed_server_keys.rs | 40 +++-- .../list_compression.rs | 63 ++++++- .../parameters/list_compression.rs | 68 +++++++- tfhe/src/shortint/keycache.rs | 3 +- .../compressed_server_keys.rs | 163 ++++++++++++++---- .../shortint/list_compression/compression.rs | 69 +++++--- .../shortint/list_compression/private_key.rs | 139 ++++++++++----- .../shortint/list_compression/server_keys.rs | 147 +++++++++++++--- .../shortint/parameters/list_compression.rs | 128 +++++++++++++- .../parameters/v0_10/list_compression.rs | 5 +- .../parameters/v0_11/list_compression.rs | 5 +- .../p_fail_2_minus_128/mod.rs | 9 +- .../list_compression/p_fail_2_minus_64/mod.rs | 9 +- .../p_fail_2_minus_128/mod.rs | 17 +- .../list_compression/p_fail_2_minus_64/mod.rs | 17 +- .../p_fail_2_minus_128/mod.rs | 17 +- .../list_compression/p_fail_2_minus_64/mod.rs | 17 +- .../p_fail_2_minus_128/mod.rs | 17 +- .../list_compression/p_fail_2_minus_64/mod.rs | 17 +- .../p_fail_2_minus_128/mod.rs | 17 +- .../list_compression/p_fail_2_minus_64/mod.rs | 17 +- .../p_fail_2_minus_128/mod.rs | 17 +- .../list_compression/p_fail_2_minus_64/mod.rs | 17 +- 32 files changed, 866 insertions(+), 297 deletions(-) diff --git a/tfhe-benchmark/benches/integer/glwe_packing_compression.rs b/tfhe-benchmark/benches/integer/glwe_packing_compression.rs index 26a7b725b..41b7b420a 100644 --- a/tfhe-benchmark/benches/integer/glwe_packing_compression.rs +++ b/tfhe-benchmark/benches/integer/glwe_packing_compression.rs @@ -37,7 +37,7 @@ fn cpu_glwe_packing(c: &mut Criterion) { 64, 128, 256, - comp_param.lwe_per_glwe.0 * log_message_modulus, + comp_param.lwe_per_glwe().0 * log_message_modulus, ] { assert_eq!(bit_size % log_message_modulus, 0); let num_blocks = bit_size / log_message_modulus; @@ -198,7 +198,7 @@ mod cuda { 64, 128, 256, - comp_param.lwe_per_glwe.0 * log_message_modulus, + comp_param.lwe_per_glwe().0 * log_message_modulus, ] { assert_eq!(bit_size % log_message_modulus, 0); let num_blocks = bit_size / log_message_modulus; diff --git a/tfhe-benchmark/src/utilities.rs b/tfhe-benchmark/src/utilities.rs index 6bf2e8711..0cb920133 100644 --- a/tfhe-benchmark/src/utilities.rs +++ b/tfhe-benchmark/src/utilities.rs @@ -106,17 +106,17 @@ pub mod shortint_utils { ) -> Self { CryptoParametersRecord { lwe_dimension: Some(pbs_params.lwe_dimension()), - br_level: Some(comp_params.br_level), - br_base_log: Some(comp_params.br_base_log), - packing_ks_level: Some(comp_params.packing_ks_level), - packing_ks_base_log: Some(comp_params.packing_ks_base_log), - packing_ks_polynomial_size: Some(comp_params.packing_ks_polynomial_size), - packing_ks_glwe_dimension: Some(comp_params.packing_ks_glwe_dimension), - lwe_per_glwe: Some(comp_params.lwe_per_glwe), - storage_log_modulus: Some(comp_params.storage_log_modulus), + br_level: Some(comp_params.br_level()), + br_base_log: Some(comp_params.br_base_log()), + packing_ks_level: Some(comp_params.packing_ks_level()), + packing_ks_base_log: Some(comp_params.packing_ks_base_log()), + packing_ks_polynomial_size: Some(comp_params.packing_ks_polynomial_size()), + packing_ks_glwe_dimension: Some(comp_params.packing_ks_glwe_dimension()), + lwe_per_glwe: Some(comp_params.lwe_per_glwe()), + storage_log_modulus: Some(comp_params.storage_log_modulus()), lwe_noise_distribution: Some(pbs_params.encryption_noise_distribution()), packing_ks_key_noise_distribution: Some( - comp_params.packing_ks_key_noise_distribution, + comp_params.packing_ks_key_noise_distribution(), ), ciphertext_modulus: Some(pbs_params.ciphertext_modulus()), error_probability: Some(2f64.powf(pbs_params.log2_p_fail())), diff --git a/tfhe/examples/utilities/params_to_file.rs b/tfhe/examples/utilities/params_to_file.rs index f5f6e4e2a..6df332bd2 100644 --- a/tfhe/examples/utilities/params_to_file.rs +++ b/tfhe/examples/utilities/params_to_file.rs @@ -164,18 +164,18 @@ impl ParamDetails for CompressionParameters { } fn glwe_dimension(&self) -> GlweDimension { - self.packing_ks_glwe_dimension + self.packing_ks_glwe_dimension() } fn lwe_noise_distribution(&self) -> DynamicDistribution { panic!("lwe_noise_distribution not applicable for compression parameters") } fn glwe_noise_distribution(&self) -> DynamicDistribution { - self.packing_ks_key_noise_distribution + self.packing_ks_key_noise_distribution() } fn polynomial_size(&self) -> PolynomialSize { - self.packing_ks_polynomial_size + self.packing_ks_polynomial_size() } fn lwe_ciphertext_modulus(&self) -> ParamModulus { diff --git a/tfhe/src/core_crypto/algorithms/lwe_multi_bit_programmable_bootstrapping.rs b/tfhe/src/core_crypto/algorithms/lwe_multi_bit_programmable_bootstrapping.rs index 7da7d732a..f9bbb2152 100644 --- a/tfhe/src/core_crypto/algorithms/lwe_multi_bit_programmable_bootstrapping.rs +++ b/tfhe/src/core_crypto/algorithms/lwe_multi_bit_programmable_bootstrapping.rs @@ -18,7 +18,6 @@ use crate::core_crypto::fft_impl::fft64::crypto::ggsw::{ add_external_product_assign, add_external_product_assign_scratch, update_with_fmadd_factor, }; use crate::core_crypto::fft_impl::fft64::math::fft::{Fft, FftView}; - use aligned_vec::ABox; use itertools::Itertools; use std::sync::atomic::{AtomicUsize, Ordering}; diff --git a/tfhe/src/high_level_api/keys/server.rs b/tfhe/src/high_level_api/keys/server.rs index 9d6354e6a..65740dae5 100644 --- a/tfhe/src/high_level_api/keys/server.rs +++ b/tfhe/src/high_level_api/keys/server.rs @@ -364,16 +364,11 @@ impl CompressedServerKey { > = match &self.integer_key.decompression_key { // Convert decompression_key in the (cpu) integer keyset to the GPU if it's defined Some(decompression_key) => { - let polynomial_size = decompression_key.key.blind_rotate_key.polynomial_size(); - let glwe_dimension = decompression_key - .key - .blind_rotate_key - .glwe_size() - .to_glwe_dimension(); + let polynomial_size = decompression_key.key.polynomial_size(); + let glwe_dimension = decompression_key.key.glwe_size().to_glwe_dimension(); let message_modulus = key.message_modulus; let carry_modulus = key.carry_modulus; - let ciphertext_modulus = - decompression_key.key.blind_rotate_key.ciphertext_modulus(); + let ciphertext_modulus = decompression_key.key.ciphertext_modulus(); Some(decompression_key.decompress_to_cuda( glwe_dimension, polynomial_size, diff --git a/tfhe/src/high_level_api/xof_key_set.rs b/tfhe/src/high_level_api/xof_key_set.rs index 8155c8a3a..e12d8fcbf 100644 --- a/tfhe/src/high_level_api/xof_key_set.rs +++ b/tfhe/src/high_level_api/xof_key_set.rs @@ -15,6 +15,7 @@ use crate::shortint::atomic_pattern::{ AtomicPatternServerKey, KS32AtomicPatternServerKey, StandardAtomicPatternServerKey, }; +use crate::shortint::list_compression::CompressedDecompressionKey; use crate::shortint::noise_squashing::atomic_pattern::ks32::KS32AtomicPatternNoiseSquashingKey; use crate::shortint::noise_squashing::atomic_pattern::standard::StandardAtomicPatternNoiseSquashingKey; use crate::shortint::noise_squashing::atomic_pattern::AtomicPatternNoiseSquashingKey; @@ -324,11 +325,11 @@ impl integer::compression_keys::CompressedCompressionKey { let compression_params = private_compression_key.key.params; let mut packing_key_switching_key = SeededLwePackingKeyswitchKey::new( 0u64, - compression_params.packing_ks_base_log, - compression_params.packing_ks_level, + compression_params.packing_ks_base_log(), + compression_params.packing_ks_level(), glwe_secret_key.as_lwe_secret_key().lwe_dimension(), - compression_params.packing_ks_glwe_dimension, - compression_params.packing_ks_polynomial_size, + compression_params.packing_ks_glwe_dimension(), + compression_params.packing_ks_polynomial_size(), CompressionSeed::from(Seed(0)), ciphertext_modulus, ); @@ -337,15 +338,15 @@ impl integer::compression_keys::CompressedCompressionKey { &glwe_secret_key.as_lwe_secret_key(), &private_compression_key.key.post_packing_ks_key, &mut packing_key_switching_key, - compression_params.packing_ks_key_noise_distribution, + compression_params.packing_ks_key_noise_distribution(), generator, ); Self { key: shortint::list_compression::CompressedCompressionKey { packing_key_switching_key, - lwe_per_glwe: compression_params.lwe_per_glwe, - storage_log_modulus: compression_params.storage_log_modulus, + lwe_per_glwe: compression_params.lwe_per_glwe(), + storage_log_modulus: compression_params.storage_log_modulus(), }, } } @@ -391,17 +392,17 @@ impl integer::compression_keys::CompressedDecompressionKey { .post_packing_ks_key .as_lwe_secret_key(), glwe_secret_key, - compression_params.br_base_log, - compression_params.br_level, + compression_params.br_base_log(), + compression_params.br_level(), computation_parameters.glwe_noise_distribution(), computation_parameters.ciphertext_modulus(), generator, ); Self { - key: shortint::list_compression::CompressedDecompressionKey { + key: shortint::list_compression::CompressedDecompressionKey::Classic { blind_rotate_key: core_bsk, - lwe_per_glwe: compression_params.lwe_per_glwe, + lwe_per_glwe: compression_params.lwe_per_glwe(), }, } } @@ -411,20 +412,54 @@ impl integer::compression_keys::CompressedDecompressionKey { generator: &mut MaskRandomGenerator, ) -> integer::compression_keys::DecompressionKey where - Gen: ByteRandomGenerator, + Gen: ByteRandomGenerator + ParallelByteRandomGenerator, { - let compressed_blind_rot_key = &self.key.blind_rotate_key; + match &self.key { + CompressedDecompressionKey::Classic { + blind_rotate_key, + lwe_per_glwe, + } => { + let core_fourier_bsk = + par_decompress_bootstrap_key_to_fourier_with_pre_seeded_generator( + blind_rotate_key, + generator, + ); - let core_fourier_bsk = par_decompress_bootstrap_key_to_fourier_with_pre_seeded_generator( - compressed_blind_rot_key, - generator, - ); + integer::compression_keys::DecompressionKey { + key: shortint::list_compression::DecompressionKey::Classic { + blind_rotate_key: core_fourier_bsk, + lwe_per_glwe: *lwe_per_glwe, + }, + } + } + CompressedDecompressionKey::MultiBit { + multi_bit_blind_rotate_key, + lwe_per_glwe, + } => { + let core_fourier_bsk = + par_decompress_seeded_lwe_multi_bit_bootstrap_key_to_fourier_with_pre_seeded_generator( + multi_bit_blind_rotate_key, + generator, + ); - integer::compression_keys::DecompressionKey { - key: shortint::list_compression::DecompressionKey { - blind_rotate_key: core_fourier_bsk, - lwe_per_glwe: self.key.lwe_per_glwe, - }, + let thread_count = + shortint::engine::ShortintEngine::get_thread_count_for_multi_bit_pbs( + core_fourier_bsk.input_lwe_dimension(), + core_fourier_bsk.glwe_size().to_glwe_dimension(), + core_fourier_bsk.polynomial_size(), + core_fourier_bsk.decomposition_base_log(), + core_fourier_bsk.decomposition_level_count(), + core_fourier_bsk.grouping_factor(), + ); + + integer::compression_keys::DecompressionKey { + key: shortint::list_compression::DecompressionKey::MultiBit { + multi_bit_blind_rotate_key: core_fourier_bsk, + lwe_per_glwe: *lwe_per_glwe, + thread_count, + }, + } + } } } } diff --git a/tfhe/src/integer/ciphertext/compressed_ciphertext_list.rs b/tfhe/src/integer/ciphertext/compressed_ciphertext_list.rs index 83a81cf22..304d07197 100644 --- a/tfhe/src/integer/ciphertext/compressed_ciphertext_list.rs +++ b/tfhe/src/integer/ciphertext/compressed_ciphertext_list.rs @@ -277,7 +277,7 @@ mod tests { ] { let (cks, sks) = gen_keys::(params, IntegerKeyKind::Radix); - let max_nb_messages: usize = 2 * comp_params.lwe_per_glwe.0 / NUM_BLOCKS; + let max_nb_messages: usize = 2 * comp_params.lwe_per_glwe().0 / NUM_BLOCKS; let private_compression_key = cks.new_compression_private_key(comp_params); diff --git a/tfhe/src/integer/gpu/ciphertext/compressed_ciphertext_list.rs b/tfhe/src/integer/gpu/ciphertext/compressed_ciphertext_list.rs index 1f787b3a2..373ae686a 100644 --- a/tfhe/src/integer/gpu/ciphertext/compressed_ciphertext_list.rs +++ b/tfhe/src/integer/gpu/ciphertext/compressed_ciphertext_list.rs @@ -614,7 +614,7 @@ mod tests { // How many uints of NUM_BLOCKS we have to push in the list to ensure it // internally has more than one packed GLWE - let max_nb_messages: usize = 1 + 2 * comp_params.lwe_per_glwe.0 / NUM_BLOCKS; + let max_nb_messages: usize = 1 + 2 * comp_params.lwe_per_glwe().0 / NUM_BLOCKS; let mut rng = rand::thread_rng(); let message_modulus: u128 = radix_cks.parameters().message_modulus().0 as u128; @@ -754,7 +754,7 @@ mod tests { let (cuda_compression_key, cuda_decompression_key) = radix_cks .new_cuda_compression_decompression_keys(&private_compression_key, &streams); - let max_nb_messages: usize = 2 * comp_params.lwe_per_glwe.0 / NUM_BLOCKS; + let max_nb_messages: usize = 2 * comp_params.lwe_per_glwe().0 / NUM_BLOCKS; let mut rng = rand::thread_rng(); diff --git a/tfhe/src/integer/gpu/client_key/radix.rs b/tfhe/src/integer/gpu/client_key/radix.rs index 254b3037f..7eaa7f804 100644 --- a/tfhe/src/integer/gpu/client_key/radix.rs +++ b/tfhe/src/integer/gpu/client_key/radix.rs @@ -39,9 +39,9 @@ impl RadixClientKey { allocate_and_generate_new_lwe_packing_keyswitch_key( &std_cks.large_lwe_secret_key(), &private_compression_key.post_packing_ks_key, - compression_params.packing_ks_base_log, - compression_params.packing_ks_level, - compression_params.packing_ks_key_noise_distribution, + compression_params.packing_ks_base_log(), + compression_params.packing_ks_level(), + compression_params.packing_ks_key_noise_distribution(), self.parameters().ciphertext_modulus(), &mut engine.encryption_generator, ) @@ -50,8 +50,8 @@ impl RadixClientKey { let glwe_compression_key = CompressionKey { key: crate::shortint::list_compression::CompressionKey { packing_key_switching_key, - lwe_per_glwe: compression_params.lwe_per_glwe, - storage_log_modulus: private_compression_key.params.storage_log_modulus, + lwe_per_glwe: compression_params.lwe_per_glwe(), + storage_log_modulus: private_compression_key.params.storage_log_modulus(), }, }; @@ -63,11 +63,11 @@ impl RadixClientKey { 0u64, self.parameters().glwe_dimension().to_glwe_size(), self.parameters().polynomial_size(), - private_compression_key.params.br_base_log, - private_compression_key.params.br_level, + private_compression_key.params.br_base_log(), + private_compression_key.params.br_level(), compression_params - .packing_ks_glwe_dimension - .to_equivalent_lwe_dimension(compression_params.packing_ks_polynomial_size), + .packing_ks_glwe_dimension() + .to_equivalent_lwe_dimension(compression_params.packing_ks_polynomial_size()), self.parameters().ciphertext_modulus(), ); @@ -89,7 +89,7 @@ impl RadixClientKey { let cuda_decompression_key = CudaDecompressionKey { blind_rotate_key, - lwe_per_glwe: compression_params.lwe_per_glwe, + lwe_per_glwe: compression_params.lwe_per_glwe(), glwe_dimension: self.parameters().glwe_dimension(), polynomial_size: self.parameters().polynomial_size(), message_modulus: self.parameters().message_modulus(), diff --git a/tfhe/src/integer/gpu/list_compression/compressed_server_keys.rs b/tfhe/src/integer/gpu/list_compression/compressed_server_keys.rs index 1231e1781..d6ebdc6d6 100644 --- a/tfhe/src/integer/gpu/list_compression/compressed_server_keys.rs +++ b/tfhe/src/integer/gpu/list_compression/compressed_server_keys.rs @@ -20,25 +20,33 @@ impl CompressedDecompressionKey { ciphertext_modulus: CiphertextModulus, streams: &CudaStreams, ) -> CudaDecompressionKey { - let h_bootstrap_key = self - .key - .blind_rotate_key - .as_view() - .par_decompress_into_lwe_bootstrap_key(); + match &self.key { + crate::shortint::list_compression::CompressedDecompressionKey::Classic { + blind_rotate_key, + lwe_per_glwe, + } => { + let h_bootstrap_key = blind_rotate_key + .as_view() + .par_decompress_into_lwe_bootstrap_key(); - let d_bootstrap_key = - CudaLweBootstrapKey::from_lwe_bootstrap_key(&h_bootstrap_key, None, streams); + let d_bootstrap_key = + CudaLweBootstrapKey::from_lwe_bootstrap_key(&h_bootstrap_key, None, streams); - let blind_rotate_key = CudaBootstrappingKey::Classic(d_bootstrap_key); + let blind_rotate_key = CudaBootstrappingKey::Classic(d_bootstrap_key); - CudaDecompressionKey { - blind_rotate_key, - lwe_per_glwe: self.key.lwe_per_glwe, - glwe_dimension, - polynomial_size, - message_modulus, - carry_modulus, - ciphertext_modulus, + CudaDecompressionKey { + blind_rotate_key, + lwe_per_glwe: *lwe_per_glwe, + glwe_dimension, + polynomial_size, + message_modulus, + carry_modulus, + ciphertext_modulus, + } + } + crate::shortint::list_compression::CompressedDecompressionKey::MultiBit { .. } => { + todo!() + } } } } diff --git a/tfhe/src/shortint/backward_compatibility/list_compression.rs b/tfhe/src/shortint/backward_compatibility/list_compression.rs index 5fd80710d..e31708f7f 100644 --- a/tfhe/src/shortint/backward_compatibility/list_compression.rs +++ b/tfhe/src/shortint/backward_compatibility/list_compression.rs @@ -1,3 +1,6 @@ +use std::convert::Infallible; + +use crate::core_crypto::prelude::{FourierLweBootstrapKeyOwned, SeededLweBootstrapKeyOwned}; use crate::shortint::list_compression::{ CompressedCompressionKey, CompressedDecompressionKey, CompressedNoiseSquashingCompressionKey, CompressionKey, CompressionPrivateKeys, DecompressionKey, NoiseSquashingCompressionKey, @@ -20,10 +23,10 @@ pub struct DecompressionKeyV0 { pub lwe_per_glwe: LweCiphertextCount, } -impl Upgrade for DecompressionKeyV0 { +impl Upgrade for DecompressionKeyV0 { type Error = Error; - fn upgrade(self) -> Result { + fn upgrade(self) -> Result { let Self { blind_rotate_key, lwe_per_glwe, @@ -33,7 +36,7 @@ impl Upgrade for DecompressionKeyV0 { ShortintBootstrappingKey::Classic { bsk, modulus_switch_noise_reduction_key: _, - } => Ok(DecompressionKey { + } => Ok(DecompressionKeyV1 { blind_rotate_key: bsk, lwe_per_glwe, }), @@ -44,10 +47,33 @@ impl Upgrade for DecompressionKeyV0 { } } +#[derive(Version)] +pub struct DecompressionKeyV1 { + pub blind_rotate_key: FourierLweBootstrapKeyOwned, + pub lwe_per_glwe: LweCiphertextCount, +} + +impl Upgrade for DecompressionKeyV1 { + type Error = Infallible; + + fn upgrade(self) -> Result { + let Self { + blind_rotate_key, + lwe_per_glwe, + } = self; + + Ok(DecompressionKey::Classic { + blind_rotate_key, + lwe_per_glwe, + }) + } +} + #[derive(VersionsDispatch)] pub enum DecompressionKeyVersions { V0(DecompressionKeyV0), - V1(DecompressionKey), + V1(DecompressionKeyV1), + V2(DecompressionKey), } impl Deprecable for CompressedCompressionKey { @@ -62,15 +88,38 @@ pub enum CompressedCompressionKeyVersions { V2(CompressedCompressionKey), } -impl Deprecable for CompressedDecompressionKey { +impl Deprecable for CompressedDecompressionKeyV1 { const TYPE_NAME: &'static str = "CompressedDecompressionKey"; const MIN_SUPPORTED_APP_VERSION: &'static str = "TFHE-rs v0.10"; } +#[derive(Version)] +pub struct CompressedDecompressionKeyV1 { + pub blind_rotate_key: SeededLweBootstrapKeyOwned, + pub lwe_per_glwe: LweCiphertextCount, +} + +impl Upgrade for CompressedDecompressionKeyV1 { + type Error = Error; + + fn upgrade(self) -> Result { + let Self { + blind_rotate_key, + lwe_per_glwe, + } = self; + + Ok(CompressedDecompressionKey::Classic { + blind_rotate_key, + lwe_per_glwe, + }) + } +} + #[derive(VersionsDispatch)] pub enum CompressedDecompressionKeyVersions { - V0(Deprecated), - V1(CompressedDecompressionKey), + V0(Deprecated), + V1(CompressedDecompressionKeyV1), + V2(CompressedDecompressionKey), } #[derive(VersionsDispatch)] diff --git a/tfhe/src/shortint/backward_compatibility/parameters/list_compression.rs b/tfhe/src/shortint/backward_compatibility/parameters/list_compression.rs index 0c50de922..ce906b80c 100644 --- a/tfhe/src/shortint/backward_compatibility/parameters/list_compression.rs +++ b/tfhe/src/shortint/backward_compatibility/parameters/list_compression.rs @@ -1,8 +1,70 @@ -use tfhe_versionable::VersionsDispatch; +use super::parameters::list_compression::{ + ClassicCompressionParameters, CompressionParameters, MultiBitCompressionParameters, +}; +use crate::core_crypto::prelude::{ + CiphertextModulusLog, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, + GlweDimension, LweCiphertextCount, PolynomialSize, +}; +use std::convert::Infallible; +use tfhe_versionable::{Upgrade, Version, VersionsDispatch}; -use super::parameters::list_compression::CompressionParameters; +#[derive(Version)] +pub struct CompressionParametersV0 { + pub br_level: DecompositionLevelCount, + pub br_base_log: DecompositionBaseLog, + pub packing_ks_level: DecompositionLevelCount, + pub packing_ks_base_log: DecompositionBaseLog, + pub packing_ks_polynomial_size: PolynomialSize, + pub packing_ks_glwe_dimension: GlweDimension, + pub lwe_per_glwe: LweCiphertextCount, + pub storage_log_modulus: CiphertextModulusLog, + pub packing_ks_key_noise_distribution: DynamicDistribution, +} + +impl Upgrade for CompressionParametersV0 { + type Error = Infallible; + + fn upgrade(self) -> Result { + let Self { + br_level, + br_base_log, + packing_ks_level, + packing_ks_base_log, + packing_ks_polynomial_size, + packing_ks_glwe_dimension, + lwe_per_glwe, + storage_log_modulus, + packing_ks_key_noise_distribution, + } = self; + + Ok(CompressionParameters::Classic( + ClassicCompressionParameters { + br_level, + br_base_log, + packing_ks_level, + packing_ks_base_log, + packing_ks_polynomial_size, + packing_ks_glwe_dimension, + lwe_per_glwe, + storage_log_modulus, + packing_ks_key_noise_distribution, + }, + )) + } +} #[derive(VersionsDispatch)] pub enum CompressionParametersVersions { - V0(CompressionParameters), + V0(CompressionParametersV0), + V1(CompressionParameters), +} + +#[derive(VersionsDispatch)] +pub enum ClassicCompressionParametersVersions { + V0(ClassicCompressionParameters), +} + +#[derive(VersionsDispatch)] +pub enum MultiBitCompressionParametersVersions { + V0(MultiBitCompressionParameters), } diff --git a/tfhe/src/shortint/keycache.rs b/tfhe/src/shortint/keycache.rs index 665397d09..c3e357b37 100644 --- a/tfhe/src/shortint/keycache.rs +++ b/tfhe/src/shortint/keycache.rs @@ -470,7 +470,8 @@ named_params_impl!(CompressionParameters => fn comp_params_default_name(params: &CompressionParameters) -> String { format!( "COMP_PARAM_CUSTOM_BR_LEVEL_{}_NOISE_DISTRIB_{}", - params.br_level.0, params.packing_ks_key_noise_distribution + params.br_level().0, + params.packing_ks_key_noise_distribution() ) } diff --git a/tfhe/src/shortint/list_compression/compressed_server_keys.rs b/tfhe/src/shortint/list_compression/compressed_server_keys.rs index c65ed51f2..105a48d3c 100644 --- a/tfhe/src/shortint/list_compression/compressed_server_keys.rs +++ b/tfhe/src/shortint/list_compression/compressed_server_keys.rs @@ -4,11 +4,12 @@ use super::{ NoiseSquashingCompressionKey, }; use crate::conformance::ParameterSetConformant; -use crate::core_crypto::fft_impl::fft64::crypto::bootstrap::LweBootstrapKeyConformanceParams; use crate::core_crypto::prelude::{ - par_convert_standard_lwe_bootstrap_key_to_fourier, CiphertextModulusLog, - FourierLweBootstrapKey, LweCiphertextCount, LwePackingKeyswitchKeyConformanceParams, - SeededLweBootstrapKeyOwned, SeededLwePackingKeyswitchKey, + par_convert_standard_lwe_bootstrap_key_to_fourier, + par_convert_standard_lwe_multi_bit_bootstrap_key_to_fourier, CiphertextModulus, + CiphertextModulusLog, FourierLweBootstrapKey, FourierLweMultiBitBootstrapKey, GlweSize, + LweCiphertextCount, LwePackingKeyswitchKeyConformanceParams, PolynomialSize, + SeededLweBootstrapKeyOwned, SeededLweMultiBitBootstrapKeyOwned, SeededLwePackingKeyswitchKey, }; use crate::shortint::backward_compatibility::list_compression::{ CompressedCompressionKeyVersions, CompressedDecompressionKeyVersions, @@ -44,32 +45,120 @@ impl CompressedCompressionKey { #[derive(Clone, Debug, Serialize, Deserialize, Versionize)] #[versionize(CompressedDecompressionKeyVersions)] -pub struct CompressedDecompressionKey { - pub blind_rotate_key: SeededLweBootstrapKeyOwned, - pub lwe_per_glwe: LweCiphertextCount, +pub enum CompressedDecompressionKey { + Classic { + blind_rotate_key: SeededLweBootstrapKeyOwned, + lwe_per_glwe: LweCiphertextCount, + }, + MultiBit { + multi_bit_blind_rotate_key: SeededLweMultiBitBootstrapKeyOwned, + lwe_per_glwe: LweCiphertextCount, + }, } impl CompressedDecompressionKey { + pub fn glwe_size(&self) -> GlweSize { + match self { + Self::Classic { + blind_rotate_key, .. + } => blind_rotate_key.glwe_size(), + Self::MultiBit { + multi_bit_blind_rotate_key, + .. + } => multi_bit_blind_rotate_key.glwe_size(), + } + } + pub fn polynomial_size(&self) -> PolynomialSize { + match self { + Self::Classic { + blind_rotate_key, .. + } => blind_rotate_key.polynomial_size(), + Self::MultiBit { + multi_bit_blind_rotate_key, + .. + } => multi_bit_blind_rotate_key.polynomial_size(), + } + } + pub fn ciphertext_modulus(&self) -> CiphertextModulus { + match self { + Self::Classic { + blind_rotate_key, .. + } => blind_rotate_key.ciphertext_modulus(), + Self::MultiBit { + multi_bit_blind_rotate_key, + .. + } => multi_bit_blind_rotate_key.ciphertext_modulus(), + } + } + pub fn decompress(&self) -> DecompressionKey { - let blind_rotate_key = self - .blind_rotate_key - .as_view() - .par_decompress_into_lwe_bootstrap_key(); + match self { + Self::Classic { + blind_rotate_key, + lwe_per_glwe, + } => { + let blind_rotate_key = blind_rotate_key + .as_view() + .par_decompress_into_lwe_bootstrap_key(); - let mut fourier_bsk = FourierLweBootstrapKey::new( - blind_rotate_key.input_lwe_dimension(), - blind_rotate_key.glwe_size(), - blind_rotate_key.polynomial_size(), - blind_rotate_key.decomposition_base_log(), - blind_rotate_key.decomposition_level_count(), - ); + let mut fourier_bsk = FourierLweBootstrapKey::new( + blind_rotate_key.input_lwe_dimension(), + blind_rotate_key.glwe_size(), + blind_rotate_key.polynomial_size(), + blind_rotate_key.decomposition_base_log(), + blind_rotate_key.decomposition_level_count(), + ); - // Conversion to fourier domain - par_convert_standard_lwe_bootstrap_key_to_fourier(&blind_rotate_key, &mut fourier_bsk); + // Conversion to fourier domain + par_convert_standard_lwe_bootstrap_key_to_fourier( + &blind_rotate_key, + &mut fourier_bsk, + ); - DecompressionKey { - blind_rotate_key: fourier_bsk, - lwe_per_glwe: self.lwe_per_glwe, + DecompressionKey::Classic { + blind_rotate_key: fourier_bsk, + lwe_per_glwe: *lwe_per_glwe, + } + } + Self::MultiBit { + multi_bit_blind_rotate_key, + lwe_per_glwe, + } => { + let multi_bit_blind_rotate_key = multi_bit_blind_rotate_key + .as_view() + .par_decompress_into_lwe_multi_bit_bootstrap_key(); + + let mut fourier_bsk = FourierLweMultiBitBootstrapKey::new( + multi_bit_blind_rotate_key.input_lwe_dimension(), + multi_bit_blind_rotate_key.glwe_size(), + multi_bit_blind_rotate_key.polynomial_size(), + multi_bit_blind_rotate_key.decomposition_base_log(), + multi_bit_blind_rotate_key.decomposition_level_count(), + multi_bit_blind_rotate_key.grouping_factor(), + ); + + // Conversion to fourier domain + par_convert_standard_lwe_multi_bit_bootstrap_key_to_fourier( + &multi_bit_blind_rotate_key, + &mut fourier_bsk, + ); + + let thread_count = + crate::shortint::engine::ShortintEngine::get_thread_count_for_multi_bit_pbs( + fourier_bsk.input_lwe_dimension(), + fourier_bsk.glwe_size().to_glwe_dimension(), + fourier_bsk.polynomial_size(), + fourier_bsk.decomposition_base_log(), + fourier_bsk.decomposition_level_count(), + fourier_bsk.grouping_factor(), + ); + + DecompressionKey::MultiBit { + multi_bit_blind_rotate_key: fourier_bsk, + lwe_per_glwe: *lwe_per_glwe, + thread_count, + } + } } } } @@ -119,14 +208,30 @@ impl ParameterSetConformant for CompressedDecompressionKey { type ParameterSet = CompressionKeyConformanceParams; fn is_conformant(&self, parameter_set: &Self::ParameterSet) -> bool { - let Self { - blind_rotate_key, - lwe_per_glwe, - } = self; + match self { + Self::Classic { + blind_rotate_key, + lwe_per_glwe, + } => { + let Ok(params) = parameter_set.try_into() else { + return false; + }; - let params: LweBootstrapKeyConformanceParams<_> = parameter_set.into(); + blind_rotate_key.is_conformant(¶ms) + && *lwe_per_glwe == parameter_set.lwe_per_glwe + } + Self::MultiBit { + multi_bit_blind_rotate_key, + lwe_per_glwe, + } => { + let Ok(params) = parameter_set.try_into() else { + return false; + }; - blind_rotate_key.is_conformant(¶ms) && *lwe_per_glwe == parameter_set.lwe_per_glwe + multi_bit_blind_rotate_key.is_conformant(¶ms) + && *lwe_per_glwe == parameter_set.lwe_per_glwe + } + } } } diff --git a/tfhe/src/shortint/list_compression/compression.rs b/tfhe/src/shortint/list_compression/compression.rs index 432cfdcba..289d1ed7d 100644 --- a/tfhe/src/shortint/list_compression/compression.rs +++ b/tfhe/src/shortint/list_compression/compression.rs @@ -6,8 +6,8 @@ use crate::shortint::ciphertext::{CompressedCiphertextList, CompressedCiphertext use crate::shortint::engine::ShortintEngine; use crate::shortint::parameters::{CarryModulus, MessageModulus, NoiseLevel}; use crate::shortint::server_key::{ - apply_standard_blind_rotate, generate_lookup_table_with_output_encoding, - unchecked_scalar_mul_assign, LookupTableSize, + apply_multi_bit_blind_rotate, apply_standard_blind_rotate, + generate_lookup_table_with_output_encoding, unchecked_scalar_mul_assign, LookupTableSize, }; use crate::shortint::{Ciphertext, MaxNoiseLevel}; use rayon::iter::ParallelIterator; @@ -208,32 +208,57 @@ impl DecompressionKey { monomial_degree, ); - let intermediate_lwe = lwe_ciphertext_modulus_switch( - intermediate_lwe.as_view(), - self.out_polynomial_size() - .to_blind_rotation_input_modulus_log(), - ); + let mut glwe_out = decompression_rescale.acc.clone(); + + let log_modulus = self + .out_polynomial_size() + .to_blind_rotation_input_modulus_log(); + + match self { + Self::Classic { + blind_rotate_key, .. + } => { + let msed_lwe = + lwe_ciphertext_modulus_switch(intermediate_lwe.as_view(), log_modulus); + ShortintEngine::with_thread_local_mut(|engine| { + let buffers = engine.get_computation_buffers(); + + apply_standard_blind_rotate( + blind_rotate_key, + &msed_lwe, + &mut glwe_out, + buffers, + ); + }); + } + Self::MultiBit { + multi_bit_blind_rotate_key, + thread_count, + .. + } => { + let multi_bit_msed_lwe = StandardMultiBitModulusSwitchedCt { + input: intermediate_lwe.as_view(), + log_modulus, + grouping_factor: multi_bit_blind_rotate_key.grouping_factor(), + }; + + apply_multi_bit_blind_rotate( + &multi_bit_msed_lwe, + &mut glwe_out, + multi_bit_blind_rotate_key, + *thread_count, + true, + ); + } + } let mut output_br = LweCiphertext::new( 0, - self.blind_rotate_key.output_lwe_dimension().to_lwe_size(), + self.output_lwe_dimension().to_lwe_size(), ciphertext_modulus, ); - ShortintEngine::with_thread_local_mut(|engine| { - let buffers = engine.get_computation_buffers(); - - let mut glwe_out = decompression_rescale.acc.clone(); - - apply_standard_blind_rotate( - &self.blind_rotate_key, - &intermediate_lwe, - &mut glwe_out, - buffers, - ); - - extract_lwe_sample_from_glwe_ciphertext(&glwe_out, &mut output_br, MonomialDegree(0)); - }); + extract_lwe_sample_from_glwe_ciphertext(&glwe_out, &mut output_br, MonomialDegree(0)); Ok(Ciphertext::new( output_br, diff --git a/tfhe/src/shortint/list_compression/private_key.rs b/tfhe/src/shortint/list_compression/private_key.rs index 8db693803..a3785dd1a 100644 --- a/tfhe/src/shortint/list_compression/private_key.rs +++ b/tfhe/src/shortint/list_compression/private_key.rs @@ -4,7 +4,9 @@ use crate::core_crypto::prelude::{ allocate_and_generate_new_binary_glwe_secret_key, allocate_and_generate_new_lwe_packing_keyswitch_key, allocate_and_generate_new_seeded_lwe_packing_keyswitch_key, - par_allocate_and_generate_new_seeded_lwe_bootstrap_key, GlweSecretKey, GlweSecretKeyOwned, + par_allocate_and_generate_new_seeded_lwe_bootstrap_key, + par_allocate_and_generate_new_seeded_lwe_multi_bit_bootstrap_key, GlweSecretKey, + GlweSecretKeyOwned, }; use crate::shortint::backward_compatibility::list_compression::{ CompressionPrivateKeysVersions, NoiseSquashingCompressionPrivateKeyVersions, @@ -43,7 +45,7 @@ impl CompressionPrivateKeys { let compression_params = &self.params; assert!( - compression_params.storage_log_modulus.0 + compression_params.storage_log_modulus().0 <= pbs_params .polynomial_size() .to_blind_rotation_input_modulus_log() @@ -55,9 +57,9 @@ impl CompressionPrivateKeys { allocate_and_generate_new_lwe_packing_keyswitch_key( &glwe_secret_key.as_lwe_secret_key(), &self.post_packing_ks_key, - compression_params.packing_ks_base_log, - compression_params.packing_ks_level, - compression_params.packing_ks_key_noise_distribution, + compression_params.packing_ks_base_log(), + compression_params.packing_ks_level(), + compression_params.packing_ks_key_noise_distribution(), pbs_params.ciphertext_modulus(), &mut engine.encryption_generator, ) @@ -65,8 +67,8 @@ impl CompressionPrivateKeys { CompressionKey { packing_key_switching_key, - lwe_per_glwe: compression_params.lwe_per_glwe, - storage_log_modulus: compression_params.storage_log_modulus, + lwe_per_glwe: compression_params.lwe_per_glwe(), + storage_log_modulus: compression_params.storage_log_modulus(), } } pub(crate) fn new_compressed_compression_key( @@ -86,9 +88,9 @@ impl CompressionPrivateKeys { allocate_and_generate_new_seeded_lwe_packing_keyswitch_key( &glwe_secret_key.as_lwe_secret_key(), &self.post_packing_ks_key, - compression_params.packing_ks_base_log, - compression_params.packing_ks_level, - compression_params.packing_ks_key_noise_distribution, + compression_params.packing_ks_base_log(), + compression_params.packing_ks_level(), + compression_params.packing_ks_key_noise_distribution(), pbs_params.ciphertext_modulus(), &mut engine.seeder, ) @@ -96,8 +98,8 @@ impl CompressionPrivateKeys { CompressedCompressionKey { packing_key_switching_key, - lwe_per_glwe: compression_params.lwe_per_glwe, - storage_log_modulus: compression_params.storage_log_modulus, + lwe_per_glwe: compression_params.lwe_per_glwe(), + storage_log_modulus: compression_params.storage_log_modulus(), } } @@ -124,20 +126,52 @@ impl CompressionPrivateKeys { "Compression is only compatible with ciphertext in post PBS dimension" ); - let blind_rotate_key = ShortintEngine::with_thread_local_mut(|engine| { - engine.new_classic_bootstrapping_key( - &self.post_packing_ks_key.as_lwe_secret_key(), - glwe_secret_key, - pbs_params.glwe_noise_distribution(), - compression_params.br_base_log, - compression_params.br_level, - pbs_params.ciphertext_modulus(), - ) - }); + match compression_params { + CompressionParameters::Classic(classic_compression_parameters) => { + let blind_rotate_key = ShortintEngine::with_thread_local_mut(|engine| { + engine.new_classic_bootstrapping_key( + &self.post_packing_ks_key.as_lwe_secret_key(), + glwe_secret_key, + pbs_params.glwe_noise_distribution(), + classic_compression_parameters.br_base_log, + classic_compression_parameters.br_level, + pbs_params.ciphertext_modulus(), + ) + }); - DecompressionKey { - blind_rotate_key, - lwe_per_glwe: compression_params.lwe_per_glwe, + DecompressionKey::Classic { + blind_rotate_key, + lwe_per_glwe: classic_compression_parameters.lwe_per_glwe, + } + } + CompressionParameters::MultiBit(multi_bit_compression_parameters) => { + let multi_bit_blind_rotate_key = ShortintEngine::with_thread_local_mut(|engine| { + engine.new_multibit_bootstrapping_key( + &self.post_packing_ks_key.as_lwe_secret_key(), + glwe_secret_key, + pbs_params.glwe_noise_distribution(), + multi_bit_compression_parameters.br_base_log, + multi_bit_compression_parameters.br_level, + multi_bit_compression_parameters.decompression_grouping_factor, + pbs_params.ciphertext_modulus(), + ) + }); + + let thread_count = ShortintEngine::get_thread_count_for_multi_bit_pbs( + pbs_params.lwe_dimension(), + pbs_params.glwe_dimension(), + pbs_params.polynomial_size(), + pbs_params.pbs_base_log(), + pbs_params.pbs_level(), + multi_bit_compression_parameters.decompression_grouping_factor, + ); + + DecompressionKey::MultiBit { + multi_bit_blind_rotate_key, + lwe_per_glwe: multi_bit_compression_parameters.lwe_per_glwe, + thread_count, + } + } } } @@ -154,21 +188,44 @@ impl CompressionPrivateKeys { let compression_params = &self.params; - let blind_rotate_key = ShortintEngine::with_thread_local_mut(|engine| { - par_allocate_and_generate_new_seeded_lwe_bootstrap_key( - &self.post_packing_ks_key.as_lwe_secret_key(), - glwe_secret_key, - compression_params.br_base_log, - compression_params.br_level, - pbs_params.glwe_noise_distribution(), - pbs_params.ciphertext_modulus(), - &mut engine.seeder, - ) - }); + match compression_params { + CompressionParameters::Classic(classic_compression_parameters) => { + let blind_rotate_key = ShortintEngine::with_thread_local_mut(|engine| { + par_allocate_and_generate_new_seeded_lwe_bootstrap_key( + &self.post_packing_ks_key.as_lwe_secret_key(), + glwe_secret_key, + classic_compression_parameters.br_base_log, + classic_compression_parameters.br_level, + pbs_params.glwe_noise_distribution(), + pbs_params.ciphertext_modulus(), + &mut engine.seeder, + ) + }); - CompressedDecompressionKey { - blind_rotate_key, - lwe_per_glwe: compression_params.lwe_per_glwe, + CompressedDecompressionKey::Classic { + blind_rotate_key, + lwe_per_glwe: classic_compression_parameters.lwe_per_glwe, + } + } + CompressionParameters::MultiBit(multi_bit_compression_parameters) => { + let multi_bit_blind_rotate_key = ShortintEngine::with_thread_local_mut(|engine| { + par_allocate_and_generate_new_seeded_lwe_multi_bit_bootstrap_key( + &self.post_packing_ks_key.as_lwe_secret_key(), + glwe_secret_key, + multi_bit_compression_parameters.br_base_log, + multi_bit_compression_parameters.br_level, + pbs_params.glwe_noise_distribution(), + multi_bit_compression_parameters.decompression_grouping_factor, + pbs_params.ciphertext_modulus(), + &mut engine.seeder, + ) + }); + + CompressedDecompressionKey::MultiBit { + multi_bit_blind_rotate_key, + lwe_per_glwe: multi_bit_compression_parameters.lwe_per_glwe, + } + } } } } @@ -186,8 +243,8 @@ impl ClientKey { let post_packing_ks_key = ShortintEngine::with_thread_local_mut(|engine| { allocate_and_generate_new_binary_glwe_secret_key( - params.packing_ks_glwe_dimension, - params.packing_ks_polynomial_size, + params.packing_ks_glwe_dimension(), + params.packing_ks_polynomial_size(), &mut engine.secret_generator, ) }); diff --git a/tfhe/src/shortint/list_compression/server_keys.rs b/tfhe/src/shortint/list_compression/server_keys.rs index 74e144ab5..a357d2f17 100644 --- a/tfhe/src/shortint/list_compression/server_keys.rs +++ b/tfhe/src/shortint/list_compression/server_keys.rs @@ -29,18 +29,53 @@ pub struct CompressionKey { #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Versionize)] #[versionize(DecompressionKeyVersions)] -pub struct DecompressionKey { - pub blind_rotate_key: FourierLweBootstrapKeyOwned, - pub lwe_per_glwe: LweCiphertextCount, +pub enum DecompressionKey { + Classic { + blind_rotate_key: FourierLweBootstrapKeyOwned, + lwe_per_glwe: LweCiphertextCount, + }, + MultiBit { + multi_bit_blind_rotate_key: FourierLweMultiBitBootstrapKeyOwned, + lwe_per_glwe: LweCiphertextCount, + thread_count: ThreadCount, + }, } impl DecompressionKey { pub fn out_glwe_size(&self) -> GlweSize { - self.blind_rotate_key.glwe_size() + match self { + Self::Classic { + blind_rotate_key, .. + } => blind_rotate_key.glwe_size(), + Self::MultiBit { + multi_bit_blind_rotate_key, + .. + } => multi_bit_blind_rotate_key.glwe_size(), + } } pub fn out_polynomial_size(&self) -> PolynomialSize { - self.blind_rotate_key.polynomial_size() + match self { + Self::Classic { + blind_rotate_key, .. + } => blind_rotate_key.polynomial_size(), + Self::MultiBit { + multi_bit_blind_rotate_key, + .. + } => multi_bit_blind_rotate_key.polynomial_size(), + } + } + + pub fn output_lwe_dimension(&self) -> LweDimension { + match self { + Self::Classic { + blind_rotate_key, .. + } => blind_rotate_key.output_lwe_dimension(), + Self::MultiBit { + multi_bit_blind_rotate_key, + .. + } => multi_bit_blind_rotate_key.output_lwe_dimension(), + } } } @@ -81,6 +116,7 @@ pub struct CompressionKeyConformanceParams { pub storage_log_modulus: CiphertextModulusLog, pub uncompressed_polynomial_size: PolynomialSize, pub uncompressed_glwe_dimension: GlweDimension, + pub decompression_grouping_factor: Option, pub cipherext_modulus: CiphertextModulus, } @@ -88,18 +124,26 @@ impl From<(AtomicPatternParameters, CompressionParameters)> for CompressionKeyCo fn from( (ap_params, compression_params): (AtomicPatternParameters, CompressionParameters), ) -> Self { + let decompression_grouping_factor = match compression_params { + CompressionParameters::Classic(_) => None, + CompressionParameters::MultiBit(multi_bit_compression_parameters) => { + Some(multi_bit_compression_parameters.decompression_grouping_factor) + } + }; + Self { - br_level: compression_params.br_level, - br_base_log: compression_params.br_base_log, - packing_ks_level: compression_params.packing_ks_level, - packing_ks_base_log: compression_params.packing_ks_base_log, - packing_ks_polynomial_size: compression_params.packing_ks_polynomial_size, - packing_ks_glwe_dimension: compression_params.packing_ks_glwe_dimension, - lwe_per_glwe: compression_params.lwe_per_glwe, - storage_log_modulus: compression_params.storage_log_modulus, + br_level: compression_params.br_level(), + br_base_log: compression_params.br_base_log(), + packing_ks_level: compression_params.packing_ks_level(), + packing_ks_base_log: compression_params.packing_ks_base_log(), + packing_ks_polynomial_size: compression_params.packing_ks_polynomial_size(), + packing_ks_glwe_dimension: compression_params.packing_ks_glwe_dimension(), + lwe_per_glwe: compression_params.lwe_per_glwe(), + storage_log_modulus: compression_params.storage_log_modulus(), uncompressed_polynomial_size: ap_params.polynomial_size(), uncompressed_glwe_dimension: ap_params.glwe_dimension(), cipherext_modulus: ap_params.ciphertext_modulus(), + decompression_grouping_factor, } } } @@ -135,19 +179,39 @@ impl ParameterSetConformant for DecompressionKey { type ParameterSet = CompressionKeyConformanceParams; fn is_conformant(&self, parameter_set: &Self::ParameterSet) -> bool { - let Self { - blind_rotate_key, - lwe_per_glwe, - } = self; + match self { + Self::Classic { + blind_rotate_key, + lwe_per_glwe, + } => { + let Ok(params) = parameter_set.try_into() else { + return false; + }; - let params: LweBootstrapKeyConformanceParams = parameter_set.into(); + blind_rotate_key.is_conformant(¶ms) + && *lwe_per_glwe == parameter_set.lwe_per_glwe + } + Self::MultiBit { + multi_bit_blind_rotate_key, + lwe_per_glwe, + thread_count, + } => { + let Ok(params) = parameter_set.try_into() else { + return false; + }; - blind_rotate_key.is_conformant(¶ms) && *lwe_per_glwe == parameter_set.lwe_per_glwe + multi_bit_blind_rotate_key.is_conformant(¶ms) + && *lwe_per_glwe == parameter_set.lwe_per_glwe + && thread_count.0 > 0 + } + } } } -impl From<&CompressionKeyConformanceParams> for LweBootstrapKeyConformanceParams { - fn from(value: &CompressionKeyConformanceParams) -> Self { +impl TryFrom<&CompressionKeyConformanceParams> for LweBootstrapKeyConformanceParams { + type Error = String; + + fn try_from(value: &CompressionKeyConformanceParams) -> Result { let CompressionKeyConformanceParams { br_level, br_base_log, @@ -155,10 +219,15 @@ impl From<&CompressionKeyConformanceParams> for LweBootstrapKeyConformanceParams packing_ks_glwe_dimension, uncompressed_polynomial_size, uncompressed_glwe_dimension, + decompression_grouping_factor, .. } = value; - Self { + if decompression_grouping_factor.is_some() { + return Err("Expected classic PBS decompression conformance parameters, found multi bit parameters".to_owned()); + } + + Ok(Self { decomp_base_log: *br_base_log, decomp_level_count: *br_level, input_lwe_dimension: packing_ks_glwe_dimension @@ -166,7 +235,39 @@ impl From<&CompressionKeyConformanceParams> for LweBootstrapKeyConformanceParams output_glwe_size: uncompressed_glwe_dimension.to_glwe_size(), polynomial_size: *uncompressed_polynomial_size, ciphertext_modulus: value.cipherext_modulus, - } + }) + } +} + +impl TryFrom<&CompressionKeyConformanceParams> for MultiBitBootstrapKeyConformanceParams { + type Error = String; + + fn try_from(value: &CompressionKeyConformanceParams) -> Result { + let CompressionKeyConformanceParams { + br_level, + br_base_log, + packing_ks_polynomial_size, + packing_ks_glwe_dimension, + uncompressed_polynomial_size, + uncompressed_glwe_dimension, + decompression_grouping_factor, + .. + } = value; + + let Some(grouping_factor) = decompression_grouping_factor.as_ref() else { + return Err("Expected multi bit PBS decompression conformance parameters, found classic parameters".to_owned()); + }; + + Ok(Self { + decomp_base_log: *br_base_log, + decomp_level_count: *br_level, + input_lwe_dimension: packing_ks_glwe_dimension + .to_equivalent_lwe_dimension(*packing_ks_polynomial_size), + output_glwe_size: uncompressed_glwe_dimension.to_glwe_size(), + polynomial_size: *uncompressed_polynomial_size, + ciphertext_modulus: value.cipherext_modulus, + grouping_factor: *grouping_factor, + }) } } diff --git a/tfhe/src/shortint/parameters/list_compression.rs b/tfhe/src/shortint/parameters/list_compression.rs index bbe3230f1..9a392884a 100644 --- a/tfhe/src/shortint/parameters/list_compression.rs +++ b/tfhe/src/shortint/parameters/list_compression.rs @@ -1,15 +1,118 @@ -use crate::shortint::backward_compatibility::parameters::list_compression::CompressionParametersVersions; +use crate::shortint::backward_compatibility::parameters::list_compression::{ + ClassicCompressionParametersVersions, CompressionParametersVersions, + MultiBitCompressionParametersVersions, +}; use crate::shortint::parameters::{ CiphertextModulusLog, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, - GlweDimension, LweCiphertextCount, PolynomialSize, + GlweDimension, LweBskGroupingFactor, LweCiphertextCount, PolynomialSize, }; - +use serde::{Deserialize, Serialize}; use std::fmt::Debug; use tfhe_versionable::Versionize; -#[derive(Copy, Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize, Versionize)] +#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Versionize)] #[versionize(CompressionParametersVersions)] -pub struct CompressionParameters { +pub enum CompressionParameters { + Classic(ClassicCompressionParameters), + MultiBit(MultiBitCompressionParameters), +} + +impl CompressionParameters { + pub fn br_level(&self) -> DecompositionLevelCount { + match self { + Self::Classic(classic_compression_parameters) => { + classic_compression_parameters.br_level + } + Self::MultiBit(multi_bit_compression_parameters) => { + multi_bit_compression_parameters.br_level + } + } + } + pub fn br_base_log(&self) -> DecompositionBaseLog { + match self { + Self::Classic(classic_compression_parameters) => { + classic_compression_parameters.br_base_log + } + Self::MultiBit(multi_bit_compression_parameters) => { + multi_bit_compression_parameters.br_base_log + } + } + } + pub fn packing_ks_level(&self) -> DecompositionLevelCount { + match self { + Self::Classic(classic_compression_parameters) => { + classic_compression_parameters.packing_ks_level + } + Self::MultiBit(multi_bit_compression_parameters) => { + multi_bit_compression_parameters.packing_ks_level + } + } + } + pub fn packing_ks_base_log(&self) -> DecompositionBaseLog { + match self { + Self::Classic(classic_compression_parameters) => { + classic_compression_parameters.packing_ks_base_log + } + Self::MultiBit(multi_bit_compression_parameters) => { + multi_bit_compression_parameters.packing_ks_base_log + } + } + } + pub fn packing_ks_polynomial_size(&self) -> PolynomialSize { + match self { + Self::Classic(classic_compression_parameters) => { + classic_compression_parameters.packing_ks_polynomial_size + } + Self::MultiBit(multi_bit_compression_parameters) => { + multi_bit_compression_parameters.packing_ks_polynomial_size + } + } + } + pub fn packing_ks_glwe_dimension(&self) -> GlweDimension { + match self { + Self::Classic(classic_compression_parameters) => { + classic_compression_parameters.packing_ks_glwe_dimension + } + Self::MultiBit(multi_bit_compression_parameters) => { + multi_bit_compression_parameters.packing_ks_glwe_dimension + } + } + } + pub fn lwe_per_glwe(&self) -> LweCiphertextCount { + match self { + Self::Classic(classic_compression_parameters) => { + classic_compression_parameters.lwe_per_glwe + } + Self::MultiBit(multi_bit_compression_parameters) => { + multi_bit_compression_parameters.lwe_per_glwe + } + } + } + pub fn storage_log_modulus(&self) -> CiphertextModulusLog { + match self { + Self::Classic(classic_compression_parameters) => { + classic_compression_parameters.storage_log_modulus + } + Self::MultiBit(multi_bit_compression_parameters) => { + multi_bit_compression_parameters.storage_log_modulus + } + } + } + pub fn packing_ks_key_noise_distribution(&self) -> DynamicDistribution { + match self { + Self::Classic(classic_compression_parameters) => { + classic_compression_parameters.packing_ks_key_noise_distribution + } + Self::MultiBit(multi_bit_compression_parameters) => { + multi_bit_compression_parameters.packing_ks_key_noise_distribution + } + } + } +} + +#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Versionize)] +#[versionize(ClassicCompressionParametersVersions)] +pub struct ClassicCompressionParameters { pub br_level: DecompositionLevelCount, pub br_base_log: DecompositionBaseLog, pub packing_ks_level: DecompositionLevelCount, @@ -20,3 +123,18 @@ pub struct CompressionParameters { pub storage_log_modulus: CiphertextModulusLog, pub packing_ks_key_noise_distribution: DynamicDistribution, } + +#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Versionize)] +#[versionize(MultiBitCompressionParametersVersions)] +pub struct MultiBitCompressionParameters { + pub br_level: DecompositionLevelCount, + pub br_base_log: DecompositionBaseLog, + pub packing_ks_level: DecompositionLevelCount, + pub packing_ks_base_log: DecompositionBaseLog, + pub packing_ks_polynomial_size: PolynomialSize, + pub packing_ks_glwe_dimension: GlweDimension, + pub lwe_per_glwe: LweCiphertextCount, + pub storage_log_modulus: CiphertextModulusLog, + pub packing_ks_key_noise_distribution: DynamicDistribution, + pub decompression_grouping_factor: LweBskGroupingFactor, +} diff --git a/tfhe/src/shortint/parameters/v0_10/list_compression.rs b/tfhe/src/shortint/parameters/v0_10/list_compression.rs index a740e15d4..631887398 100644 --- a/tfhe/src/shortint/parameters/v0_10/list_compression.rs +++ b/tfhe/src/shortint/parameters/v0_10/list_compression.rs @@ -1,10 +1,11 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, }; pub const V0_10_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(4), @@ -14,4 +15,4 @@ pub const V0_10_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionPa lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(42), - }; + }); diff --git a/tfhe/src/shortint/parameters/v0_11/list_compression.rs b/tfhe/src/shortint/parameters/v0_11/list_compression.rs index f0e093252..bcf2a5d2b 100644 --- a/tfhe/src/shortint/parameters/v0_11/list_compression.rs +++ b/tfhe/src/shortint/parameters/v0_11/list_compression.rs @@ -1,10 +1,11 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, }; pub const V0_11_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -14,4 +15,4 @@ pub const V0_11_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionPa lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); diff --git a/tfhe/src/shortint/parameters/v1_0/list_compression/p_fail_2_minus_128/mod.rs b/tfhe/src/shortint/parameters/v1_0/list_compression/p_fail_2_minus_128/mod.rs index 03479bc79..e44179135 100644 --- a/tfhe/src/shortint/parameters/v1_0/list_compression/p_fail_2_minus_128/mod.rs +++ b/tfhe/src/shortint/parameters/v1_0/list_compression/p_fail_2_minus_128/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ // p-fail = 2^-129.048, algorithmic cost ~ 97955 pub const V1_0_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(3), @@ -15,11 +16,11 @@ pub const V1_0_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionPa lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); // p-fail = 2^-127.994, algorithmic cost ~ 96700 pub const V1_0_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -31,4 +32,4 @@ pub const V1_0_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionPa packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); diff --git a/tfhe/src/shortint/parameters/v1_0/list_compression/p_fail_2_minus_64/mod.rs b/tfhe/src/shortint/parameters/v1_0/list_compression/p_fail_2_minus_64/mod.rs index 4d3390c4e..33df7e807 100644 --- a/tfhe/src/shortint/parameters/v1_0/list_compression/p_fail_2_minus_64/mod.rs +++ b/tfhe/src/shortint/parameters/v1_0/list_compression/p_fail_2_minus_64/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ // p-fail = 2^-71.052, algorithmic cost ~ 97079 pub const V1_0_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -15,11 +16,11 @@ pub const V1_0_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionPar lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); // p-fail = 2^-63.983, algorithmic cost ~ 110013 pub const V1_0_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -31,4 +32,4 @@ pub const V1_0_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionPar packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); diff --git a/tfhe/src/shortint/parameters/v1_1/list_compression/p_fail_2_minus_128/mod.rs b/tfhe/src/shortint/parameters/v1_1/list_compression/p_fail_2_minus_128/mod.rs index c38decec5..349df2f71 100644 --- a/tfhe/src/shortint/parameters/v1_1/list_compression/p_fail_2_minus_128/mod.rs +++ b/tfhe/src/shortint/parameters/v1_1/list_compression/p_fail_2_minus_128/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ /// p-fail = 2^-129.053, algorithmic cost ~ 41458 pub const V1_1_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(3), @@ -15,11 +16,11 @@ pub const V1_1_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionPa lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); /// p-fail = 2^-129.053, algorithmic cost ~ 41458 pub const V1_1_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(3), @@ -29,11 +30,11 @@ pub const V1_1_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFOR lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), -}; +}); /// p-fail = 2^-128.0, algorithmic cost ~ 42199 pub const V1_1_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -45,11 +46,11 @@ pub const V1_1_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionPa packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); /// p-fail = 2^-128.0, algorithmic cost ~ 42199 pub const V1_1_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -61,4 +62,4 @@ pub const V1_1_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIA packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( 1.339775301998614e-07, )), -}; +}); diff --git a/tfhe/src/shortint/parameters/v1_1/list_compression/p_fail_2_minus_64/mod.rs b/tfhe/src/shortint/parameters/v1_1/list_compression/p_fail_2_minus_64/mod.rs index c083b0c44..7b5815030 100644 --- a/tfhe/src/shortint/parameters/v1_1/list_compression/p_fail_2_minus_64/mod.rs +++ b/tfhe/src/shortint/parameters/v1_1/list_compression/p_fail_2_minus_64/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ /// p-fail = 2^-72.052, algorithmic cost ~ 42700 pub const V1_1_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -15,11 +16,11 @@ pub const V1_1_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionPar lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); /// p-fail = 2^-72.052, algorithmic cost ~ 42700 pub const V1_1_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -29,11 +30,11 @@ pub const V1_1_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFOR lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), -}; +}); /// p-fail = 2^-64.174, algorithmic cost ~ 58234 pub const V1_1_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(2), br_base_log: DecompositionBaseLog(15), packing_ks_level: DecompositionLevelCount(2), @@ -45,11 +46,11 @@ pub const V1_1_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionPar packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); /// p-fail = 2^-64.174, algorithmic cost ~ 58234 pub const V1_1_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -61,4 +62,4 @@ pub const V1_1_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIA packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( 1.339775301998614e-07, )), -}; +}); diff --git a/tfhe/src/shortint/parameters/v1_2/list_compression/p_fail_2_minus_128/mod.rs b/tfhe/src/shortint/parameters/v1_2/list_compression/p_fail_2_minus_128/mod.rs index e8b238f56..2a1a0adba 100644 --- a/tfhe/src/shortint/parameters/v1_2/list_compression/p_fail_2_minus_128/mod.rs +++ b/tfhe/src/shortint/parameters/v1_2/list_compression/p_fail_2_minus_128/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ /// p-fail = 2^-129.053, algorithmic cost ~ 41458 pub const V1_2_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(3), @@ -15,11 +16,11 @@ pub const V1_2_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionPa lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); /// p-fail = 2^-129.053, algorithmic cost ~ 41458 pub const V1_2_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(3), @@ -29,11 +30,11 @@ pub const V1_2_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFOR lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), -}; +}); /// p-fail = 2^-128.0, algorithmic cost ~ 42199 pub const V1_2_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -45,11 +46,11 @@ pub const V1_2_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionPa packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); /// p-fail = 2^-128.0, algorithmic cost ~ 42199 pub const V1_2_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -61,4 +62,4 @@ pub const V1_2_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIA packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( 1.339775301998614e-07, )), -}; +}); diff --git a/tfhe/src/shortint/parameters/v1_2/list_compression/p_fail_2_minus_64/mod.rs b/tfhe/src/shortint/parameters/v1_2/list_compression/p_fail_2_minus_64/mod.rs index f2f34b3f9..44024f40f 100644 --- a/tfhe/src/shortint/parameters/v1_2/list_compression/p_fail_2_minus_64/mod.rs +++ b/tfhe/src/shortint/parameters/v1_2/list_compression/p_fail_2_minus_64/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ /// p-fail = 2^-72.052, algorithmic cost ~ 42700 pub const V1_2_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -15,11 +16,11 @@ pub const V1_2_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionPar lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); /// p-fail = 2^-72.052, algorithmic cost ~ 42700 pub const V1_2_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -29,11 +30,11 @@ pub const V1_2_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFOR lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), -}; +}); /// p-fail = 2^-64.174, algorithmic cost ~ 58234 pub const V1_2_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(2), br_base_log: DecompositionBaseLog(15), packing_ks_level: DecompositionLevelCount(2), @@ -45,11 +46,11 @@ pub const V1_2_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionPar packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); /// p-fail = 2^-64.174, algorithmic cost ~ 58234 pub const V1_2_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -61,4 +62,4 @@ pub const V1_2_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIA packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( 1.339775301998614e-07, )), -}; +}); diff --git a/tfhe/src/shortint/parameters/v1_3/list_compression/p_fail_2_minus_128/mod.rs b/tfhe/src/shortint/parameters/v1_3/list_compression/p_fail_2_minus_128/mod.rs index 543f82987..1c52f30f4 100644 --- a/tfhe/src/shortint/parameters/v1_3/list_compression/p_fail_2_minus_128/mod.rs +++ b/tfhe/src/shortint/parameters/v1_3/list_compression/p_fail_2_minus_128/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ /// p-fail = 2^-129.053, algorithmic cost ~ 41458 pub const V1_3_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(3), @@ -15,11 +16,11 @@ pub const V1_3_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionPa lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); /// p-fail = 2^-129.053, algorithmic cost ~ 41458 pub const V1_3_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(3), @@ -29,11 +30,11 @@ pub const V1_3_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFOR lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), -}; +}); /// p-fail = 2^-128.0, algorithmic cost ~ 42199 pub const V1_3_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -45,11 +46,11 @@ pub const V1_3_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionPa packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); /// p-fail = 2^-128.0, algorithmic cost ~ 42199 pub const V1_3_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -61,4 +62,4 @@ pub const V1_3_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIA packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( 1.339775301998614e-07, )), -}; +}); diff --git a/tfhe/src/shortint/parameters/v1_3/list_compression/p_fail_2_minus_64/mod.rs b/tfhe/src/shortint/parameters/v1_3/list_compression/p_fail_2_minus_64/mod.rs index 98a5f786f..05edb84f1 100644 --- a/tfhe/src/shortint/parameters/v1_3/list_compression/p_fail_2_minus_64/mod.rs +++ b/tfhe/src/shortint/parameters/v1_3/list_compression/p_fail_2_minus_64/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ /// p-fail = 2^-72.052, algorithmic cost ~ 42700 pub const V1_3_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -15,11 +16,11 @@ pub const V1_3_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionPar lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); /// p-fail = 2^-72.052, algorithmic cost ~ 42700 pub const V1_3_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -29,11 +30,11 @@ pub const V1_3_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFOR lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), -}; +}); /// p-fail = 2^-64.174, algorithmic cost ~ 58234 pub const V1_3_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(2), br_base_log: DecompositionBaseLog(15), packing_ks_level: DecompositionLevelCount(2), @@ -45,11 +46,11 @@ pub const V1_3_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionPar packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); /// p-fail = 2^-64.174, algorithmic cost ~ 58234 pub const V1_3_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -61,4 +62,4 @@ pub const V1_3_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIA packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( 1.339775301998614e-07, )), -}; +}); diff --git a/tfhe/src/shortint/parameters/v1_4/list_compression/p_fail_2_minus_128/mod.rs b/tfhe/src/shortint/parameters/v1_4/list_compression/p_fail_2_minus_128/mod.rs index b1ec0cb19..026180358 100644 --- a/tfhe/src/shortint/parameters/v1_4/list_compression/p_fail_2_minus_128/mod.rs +++ b/tfhe/src/shortint/parameters/v1_4/list_compression/p_fail_2_minus_128/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ /// p-fail = 2^-129.275, algorithmic cost ~ 41458 pub const V1_4_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(3), @@ -15,11 +16,11 @@ pub const V1_4_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionPa lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); /// p-fail = 2^-129.275, algorithmic cost ~ 41458 pub const V1_4_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(3), @@ -29,11 +30,11 @@ pub const V1_4_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFOR lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), -}; +}); /// p-fail = 2^-128.218, algorithmic cost ~ 42199 pub const V1_4_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -45,11 +46,11 @@ pub const V1_4_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionPa packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); /// p-fail = 2^-128.218, algorithmic cost ~ 42199 pub const V1_4_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -61,4 +62,4 @@ pub const V1_4_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIA packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( 1.339775301998614e-07, )), -}; +}); diff --git a/tfhe/src/shortint/parameters/v1_4/list_compression/p_fail_2_minus_64/mod.rs b/tfhe/src/shortint/parameters/v1_4/list_compression/p_fail_2_minus_64/mod.rs index 717588eaa..a7545d807 100644 --- a/tfhe/src/shortint/parameters/v1_4/list_compression/p_fail_2_minus_64/mod.rs +++ b/tfhe/src/shortint/parameters/v1_4/list_compression/p_fail_2_minus_64/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ /// p-fail = 2^-72.052, algorithmic cost ~ 42700 pub const V1_4_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -15,11 +16,11 @@ pub const V1_4_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionPar lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); /// p-fail = 2^-72.052, algorithmic cost ~ 42700 pub const V1_4_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -29,11 +30,11 @@ pub const V1_4_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFOR lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), -}; +}); /// p-fail = 2^-64.174, algorithmic cost ~ 58234 pub const V1_4_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(2), br_base_log: DecompositionBaseLog(15), packing_ks_level: DecompositionLevelCount(2), @@ -45,11 +46,11 @@ pub const V1_4_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionPar packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); /// p-fail = 2^-64.174, algorithmic cost ~ 58234 pub const V1_4_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -61,4 +62,4 @@ pub const V1_4_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIA packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( 1.339775301998614e-07, )), -}; +}); diff --git a/tfhe/src/shortint/parameters/v1_5/list_compression/p_fail_2_minus_128/mod.rs b/tfhe/src/shortint/parameters/v1_5/list_compression/p_fail_2_minus_128/mod.rs index 4acaf5206..edbcd3c7a 100644 --- a/tfhe/src/shortint/parameters/v1_5/list_compression/p_fail_2_minus_128/mod.rs +++ b/tfhe/src/shortint/parameters/v1_5/list_compression/p_fail_2_minus_128/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ /// p-fail = 2^-129.275, algorithmic cost ~ 41458 pub const V1_5_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(3), @@ -15,11 +16,11 @@ pub const V1_5_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: CompressionPa lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); /// p-fail = 2^-129.275, algorithmic cost ~ 41458 pub const V1_5_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(3), @@ -29,11 +30,11 @@ pub const V1_5_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFOR lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), -}; +}); /// p-fail = 2^-128.218, algorithmic cost ~ 42199 pub const V1_5_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -45,11 +46,11 @@ pub const V1_5_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: CompressionPa packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); /// p-fail = 2^-128.218, algorithmic cost ~ 42199 pub const V1_5_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -61,4 +62,4 @@ pub const V1_5_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIA packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( 1.339775301998614e-07, )), -}; +}); diff --git a/tfhe/src/shortint/parameters/v1_5/list_compression/p_fail_2_minus_64/mod.rs b/tfhe/src/shortint/parameters/v1_5/list_compression/p_fail_2_minus_64/mod.rs index 4fbf81c08..ee3297c91 100644 --- a/tfhe/src/shortint/parameters/v1_5/list_compression/p_fail_2_minus_64/mod.rs +++ b/tfhe/src/shortint/parameters/v1_5/list_compression/p_fail_2_minus_64/mod.rs @@ -1,3 +1,4 @@ +use crate::shortint::parameters::list_compression::ClassicCompressionParameters; use crate::shortint::parameters::{ CiphertextModulusLog, CompressionParameters, DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension, LweCiphertextCount, PolynomialSize, StandardDev, @@ -5,7 +6,7 @@ use crate::shortint::parameters::{ /// p-fail = 2^-72.052, algorithmic cost ~ 42700 pub const V1_5_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -15,11 +16,11 @@ pub const V1_5_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: CompressionPar lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), - }; + }); /// p-fail = 2^-72.052, algorithmic cost ~ 42700 pub const V1_5_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M64: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -29,11 +30,11 @@ pub const V1_5_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_TUNIFOR lwe_per_glwe: LweCiphertextCount(256), storage_log_modulus: CiphertextModulusLog(12), packing_ks_key_noise_distribution: DynamicDistribution::new_t_uniform(43), -}; +}); /// p-fail = 2^-64.174, algorithmic cost ~ 58234 pub const V1_5_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionParameters = - CompressionParameters { + CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(2), br_base_log: DecompositionBaseLog(15), packing_ks_level: DecompositionLevelCount(2), @@ -45,11 +46,11 @@ pub const V1_5_COMP_PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: CompressionPar packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev( StandardDev(1.339775301998614e-07), ), - }; + }); /// p-fail = 2^-64.174, algorithmic cost ~ 58234 pub const V1_5_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M64: - CompressionParameters = CompressionParameters { + CompressionParameters = CompressionParameters::Classic(ClassicCompressionParameters { br_level: DecompositionLevelCount(1), br_base_log: DecompositionBaseLog(23), packing_ks_level: DecompositionLevelCount(2), @@ -61,4 +62,4 @@ pub const V1_5_COMP_PARAM_GPU_MULTI_BIT_GROUP_4_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIA packing_ks_key_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev( 1.339775301998614e-07, )), -}; +});