mirror of
https://github.com/zama-ai/tfhe-rs.git
synced 2026-01-07 22:04:10 -05:00
feat(shortint): add multi bit decompression
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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())),
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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!()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -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(¶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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
});
|
||||
|
||||
@@ -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(¶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<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,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
)),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
)),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
)),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
)),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
)),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
)),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
)),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
)),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
)),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
)),
|
||||
};
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user