feat(shortint): add multi bit decompression

This commit is contained in:
Mayeul@Zama
2025-10-16 10:30:46 +02:00
committed by mayeul-zama
parent 3842032f08
commit 777bbe437a
32 changed files with 866 additions and 297 deletions

View File

@@ -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;

View File

@@ -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())),

View File

@@ -164,18 +164,18 @@ impl ParamDetails<u64> for CompressionParameters {
}
fn glwe_dimension(&self) -> GlweDimension {
self.packing_ks_glwe_dimension
self.packing_ks_glwe_dimension()
}
fn lwe_noise_distribution(&self) -> DynamicDistribution<u64> {
panic!("lwe_noise_distribution not applicable for compression parameters")
}
fn glwe_noise_distribution(&self) -> DynamicDistribution<u64> {
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 {

View File

@@ -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};

View File

@@ -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,

View File

@@ -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<Gen>,
) -> 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,
},
}
}
}
}
}

View File

@@ -277,7 +277,7 @@ mod tests {
] {
let (cks, sks) = gen_keys::<ShortintParameterSet>(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);

View File

@@ -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();

View File

@@ -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(),

View File

@@ -20,25 +20,33 @@ impl CompressedDecompressionKey {
ciphertext_modulus: CiphertextModulus<u64>,
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!()
}
}
}
}

View File

@@ -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<DecompressionKey> for DecompressionKeyV0 {
impl Upgrade<DecompressionKeyV1> for DecompressionKeyV0 {
type Error = Error;
fn upgrade(self) -> Result<DecompressionKey, Self::Error> {
fn upgrade(self) -> Result<DecompressionKeyV1, Self::Error> {
let Self {
blind_rotate_key,
lwe_per_glwe,
@@ -33,7 +36,7 @@ impl Upgrade<DecompressionKey> 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<DecompressionKey> for DecompressionKeyV0 {
}
}
#[derive(Version)]
pub struct DecompressionKeyV1 {
pub blind_rotate_key: FourierLweBootstrapKeyOwned,
pub lwe_per_glwe: LweCiphertextCount,
}
impl Upgrade<DecompressionKey> for DecompressionKeyV1 {
type Error = Infallible;
fn upgrade(self) -> Result<DecompressionKey, Self::Error> {
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<u64>,
pub lwe_per_glwe: LweCiphertextCount,
}
impl Upgrade<CompressedDecompressionKey> for CompressedDecompressionKeyV1 {
type Error = Error;
fn upgrade(self) -> Result<CompressedDecompressionKey, Self::Error> {
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<CompressedDecompressionKey>),
V1(CompressedDecompressionKey),
V0(Deprecated<CompressedDecompressionKeyV1>),
V1(CompressedDecompressionKeyV1),
V2(CompressedDecompressionKey),
}
#[derive(VersionsDispatch)]

View File

@@ -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<u64>,
}
impl Upgrade<CompressionParameters> for CompressionParametersV0 {
type Error = Infallible;
fn upgrade(self) -> Result<CompressionParameters, Self::Error> {
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),
}

View File

@@ -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()
)
}

View File

@@ -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<u64>,
pub lwe_per_glwe: LweCiphertextCount,
pub enum CompressedDecompressionKey {
Classic {
blind_rotate_key: SeededLweBootstrapKeyOwned<u64>,
lwe_per_glwe: LweCiphertextCount,
},
MultiBit {
multi_bit_blind_rotate_key: SeededLweMultiBitBootstrapKeyOwned<u64>,
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<u64> {
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(&params)
&& *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(&params) && *lwe_per_glwe == parameter_set.lwe_per_glwe
multi_bit_blind_rotate_key.is_conformant(&params)
&& *lwe_per_glwe == parameter_set.lwe_per_glwe
}
}
}
}

View File

@@ -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,

View File

@@ -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,
)
});

View File

@@ -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<LweBskGroupingFactor>,
pub cipherext_modulus: CiphertextModulus<u64>,
}
@@ -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<u64> = parameter_set.into();
blind_rotate_key.is_conformant(&params)
&& *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(&params) && *lwe_per_glwe == parameter_set.lwe_per_glwe
multi_bit_blind_rotate_key.is_conformant(&params)
&& *lwe_per_glwe == parameter_set.lwe_per_glwe
&& thread_count.0 > 0
}
}
}
}
impl From<&CompressionKeyConformanceParams> for LweBootstrapKeyConformanceParams<u64> {
fn from(value: &CompressionKeyConformanceParams) -> Self {
impl TryFrom<&CompressionKeyConformanceParams> for LweBootstrapKeyConformanceParams<u64> {
type Error = String;
fn try_from(value: &CompressionKeyConformanceParams) -> Result<Self, String> {
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<u64> {
type Error = String;
fn try_from(value: &CompressionKeyConformanceParams) -> Result<Self, String> {
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,
})
}
}

View File

@@ -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<u64> {
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<u64>,
}
#[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<u64>,
pub decompression_grouping_factor: LweBskGroupingFactor,
}

View File

@@ -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),
};
});

View File

@@ -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),
};
});

View File

@@ -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),
),
};
});

View File

@@ -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),
),
};
});

View File

@@ -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,
)),
};
});

View File

@@ -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,
)),
};
});

View File

@@ -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,
)),
};
});

View File

@@ -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,
)),
};
});

View File

@@ -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,
)),
};
});

View File

@@ -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,
)),
};
});

View File

@@ -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,
)),
};
});

View File

@@ -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,
)),
};
});

View File

@@ -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,
)),
};
});

View File

@@ -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,
)),
};
});