diff --git a/concrete-optimizer/Cargo.toml b/concrete-optimizer/Cargo.toml index 6e6b7dc0e..2c37b1e79 100644 --- a/concrete-optimizer/Cargo.toml +++ b/concrete-optimizer/Cargo.toml @@ -16,13 +16,8 @@ puruspe = "0.2.0" [dev-dependencies] approx = "0.5" pretty_assertions = "1.2.1" -criterion = "0.4" [lib] crate-type = [ "lib", # rust ] - -[[bench]] -name = "benchmark" -harness = false diff --git a/concrete-optimizer/benches/benchmark.rs b/concrete-optimizer/benches/benchmark.rs deleted file mode 100644 index bfe06e720..000000000 --- a/concrete-optimizer/benches/benchmark.rs +++ /dev/null @@ -1,32 +0,0 @@ -use concrete_optimizer::global_parameters::DEFAUT_DOMAINS; -use concrete_optimizer::pareto::{extract_br_pareto, extract_ks_pareto}; -use criterion::{black_box, criterion_group, criterion_main, Criterion}; - -fn br_pareto_benchmark(c: &mut Criterion) { - c.bench_function("BR pareto", |b| { - b.iter(|| { - black_box(extract_br_pareto( - 128, - &DEFAUT_DOMAINS.glwe_pbs_constrained, - &DEFAUT_DOMAINS.free_glwe.into(), - 64, - )) - }) - }); -} - -fn ks_pareto_benchmark(c: &mut Criterion) { - c.bench_function("KS pareto", |b| { - b.iter(|| { - black_box(extract_ks_pareto( - 128, - &DEFAUT_DOMAINS.glwe_pbs_constrained, - &DEFAUT_DOMAINS.free_glwe.into(), - 64, - )) - }) - }); -} - -criterion_group!(benches, br_pareto_benchmark, ks_pareto_benchmark); -criterion_main!(benches); diff --git a/concrete-optimizer/src/lib.rs b/concrete-optimizer/src/lib.rs index 3bef040e9..dcd2d8cef 100644 --- a/concrete-optimizer/src/lib.rs +++ b/concrete-optimizer/src/lib.rs @@ -24,7 +24,6 @@ pub mod global_parameters; pub mod noise_estimator; pub mod optimization; pub mod parameters; -pub mod pareto; pub mod security; pub mod utils; pub mod weight; diff --git a/concrete-optimizer/src/optimization/wop_atomic_pattern/pareto.rs b/concrete-optimizer/src/optimization/wop_atomic_pattern/pareto.rs deleted file mode 100644 index edc6f50d7..000000000 --- a/concrete-optimizer/src/optimization/wop_atomic_pattern/pareto.rs +++ /dev/null @@ -1,4 +0,0 @@ -use crate::parameters::BrDecompositionParameters; - -#[rustfmt::skip] -pub const BR_CIRCUIT_BOOTSTRAP_PARETO_DECOMP: &[BrDecompositionParameters; 75] = &[BrDecompositionParameters { level: 1, log2_base: 1 }, BrDecompositionParameters { level: 1, log2_base: 2 }, BrDecompositionParameters { level: 1, log2_base: 3 }, BrDecompositionParameters { level: 1, log2_base: 4 }, BrDecompositionParameters { level: 1, log2_base: 5 }, BrDecompositionParameters { level: 1, log2_base: 6 }, BrDecompositionParameters { level: 2, log2_base: 1 }, BrDecompositionParameters { level: 2, log2_base: 2 }, BrDecompositionParameters { level: 2, log2_base: 3 }, BrDecompositionParameters { level: 2, log2_base: 4 }, BrDecompositionParameters { level: 2, log2_base: 5 }, BrDecompositionParameters { level: 3, log2_base: 1 }, BrDecompositionParameters { level: 3, log2_base: 2 }, BrDecompositionParameters { level: 3, log2_base: 3 }, BrDecompositionParameters { level: 3, log2_base: 4 }, BrDecompositionParameters { level: 3, log2_base: 5 }, BrDecompositionParameters { level: 3, log2_base: 6 }, BrDecompositionParameters { level: 4, log2_base: 1 }, BrDecompositionParameters { level: 4, log2_base: 2 }, BrDecompositionParameters { level: 4, log2_base: 3 }, BrDecompositionParameters { level: 4, log2_base: 4 }, BrDecompositionParameters { level: 4, log2_base: 5 }, BrDecompositionParameters { level: 5, log2_base: 1 }, BrDecompositionParameters { level: 5, log2_base: 2 }, BrDecompositionParameters { level: 5, log2_base: 3 }, BrDecompositionParameters { level: 5, log2_base: 4 }, BrDecompositionParameters { level: 6, log2_base: 1 }, BrDecompositionParameters { level: 6, log2_base: 2 }, BrDecompositionParameters { level: 6, log2_base: 3 }, BrDecompositionParameters { level: 6, log2_base: 4 }, BrDecompositionParameters { level: 7, log2_base: 1 }, BrDecompositionParameters { level: 7, log2_base: 2 }, BrDecompositionParameters { level: 7, log2_base: 3 }, BrDecompositionParameters { level: 7, log2_base: 4 }, BrDecompositionParameters { level: 8, log2_base: 1 }, BrDecompositionParameters { level: 8, log2_base: 2 }, BrDecompositionParameters { level: 8, log2_base: 3 }, BrDecompositionParameters { level: 9, log2_base: 1 }, BrDecompositionParameters { level: 9, log2_base: 2 }, BrDecompositionParameters { level: 9, log2_base: 3 }, BrDecompositionParameters { level: 10, log2_base: 1 }, BrDecompositionParameters { level: 10, log2_base: 2 }, BrDecompositionParameters { level: 10, log2_base: 3 }, BrDecompositionParameters { level: 11, log2_base: 1 }, BrDecompositionParameters { level: 11, log2_base: 2 }, BrDecompositionParameters { level: 12, log2_base: 1 }, BrDecompositionParameters { level: 12, log2_base: 2 }, BrDecompositionParameters { level: 13, log2_base: 1 }, BrDecompositionParameters { level: 13, log2_base: 2 }, BrDecompositionParameters { level: 14, log2_base: 1 }, BrDecompositionParameters { level: 14, log2_base: 2 }, BrDecompositionParameters { level: 15, log2_base: 1 }, BrDecompositionParameters { level: 15, log2_base: 2 }, BrDecompositionParameters { level: 16, log2_base: 1 }, BrDecompositionParameters { level: 16, log2_base: 2 }, BrDecompositionParameters { level: 17, log2_base: 1 }, BrDecompositionParameters { level: 17, log2_base: 2 }, BrDecompositionParameters { level: 18, log2_base: 1 }, BrDecompositionParameters { level: 19, log2_base: 1 }, BrDecompositionParameters { level: 20, log2_base: 1 }, BrDecompositionParameters { level: 21, log2_base: 1 }, BrDecompositionParameters { level: 22, log2_base: 1 }, BrDecompositionParameters { level: 23, log2_base: 1 }, BrDecompositionParameters { level: 24, log2_base: 1 }, BrDecompositionParameters { level: 25, log2_base: 1 }, BrDecompositionParameters { level: 26, log2_base: 1 }, BrDecompositionParameters { level: 27, log2_base: 1 }, BrDecompositionParameters { level: 28, log2_base: 1 }, BrDecompositionParameters { level: 29, log2_base: 1 }, BrDecompositionParameters { level: 30, log2_base: 1 }, BrDecompositionParameters { level: 31, log2_base: 1 }, BrDecompositionParameters { level: 32, log2_base: 1 }, BrDecompositionParameters { level: 33, log2_base: 1 }, BrDecompositionParameters { level: 34, log2_base: 1 }, BrDecompositionParameters { level: 35, log2_base: 1 }]; diff --git a/concrete-optimizer/src/pareto.rs b/concrete-optimizer/src/pareto.rs deleted file mode 100644 index 8e6f6de92..000000000 --- a/concrete-optimizer/src/pareto.rs +++ /dev/null @@ -1,222 +0,0 @@ -use crate::noise_estimator::operators::atomic_pattern::{variance_bootstrap, variance_keyswitch}; -use crate::parameters::{ - BrDecompositionParameters, GlweParameterRanges, GlweParameters, KeyswitchParameters, - KsDecompositionParameters, LweDimension, PbsParameters, -}; -use crate::security::glwe::minimal_variance; -use concrete_commons::dispersion::Variance; -use std::collections::HashSet; - -pub fn extract_br_pareto( - security_level: u64, - output_glwe_range: &GlweParameterRanges, - input_lwe_range: &crate::parameters::LweDimensionRange, - ciphertext_modulus_log: u32, -) -> Vec { - let mut paretos = HashSet::new(); - - for glwe_dimension in &output_glwe_range.glwe_dimension { - for log2_polynomial_size in &output_glwe_range.log2_polynomial_size { - let glwe_params = GlweParameters { - log2_polynomial_size, - glwe_dimension, - }; - - let variance_bsk = - minimal_variance(glwe_params, ciphertext_modulus_log, security_level); - - for input_lwe_dimension in &input_lwe_range.lwe_dimension { - let mut min_variance = Variance(f64::INFINITY); - - for level in 1..=(ciphertext_modulus_log as u64) { - // To compute the PBS, Concrete switches from u32/u64 to f64 to represent the ciphertext - // which only keeps the 53 MSB of each u32/u64 (53 is the mantissa size). - // There is no need to decompose more bits than 53 as those ones will be erased by the conversion between u32/u64 and f64. - const MAX_DECOMPOSITION_DEPTH: u64 = 53; - - let mut log_base_arg_min = None; - - for log2_base in 1..=(MAX_DECOMPOSITION_DEPTH / level) { - let pbs_parameters = PbsParameters { - internal_lwe_dimension: LweDimension(input_lwe_dimension), - br_decomposition_parameter: BrDecompositionParameters { - level, - log2_base, - }, - output_glwe_params: GlweParameters { - log2_polynomial_size, - glwe_dimension, - }, - }; - - let variance = variance_bootstrap( - pbs_parameters, - ciphertext_modulus_log, - variance_bsk, - ); - - debug_assert!(variance.0.is_finite()); - - if variance < min_variance { - min_variance = variance; - log_base_arg_min = Some(log2_base); - } - } - if let Some(log2_base_arg_min) = log_base_arg_min { - let _ = paretos.insert(BrDecompositionParameters { - level, - log2_base: log2_base_arg_min, - }); - } - } - } - } - } - - let mut res: Vec<_> = paretos.into_iter().collect(); - - res.sort_unstable(); - - res -} - -// We assume that the input lwe dimension is constrained -// by being the result of a sample extract -// (i.e. is the product of a glwe_dimension and a polynomial_size) -pub fn extract_ks_pareto( - security_level: u64, - input_glwe_range: &GlweParameterRanges, - output_lwe_range: &crate::parameters::LweDimensionRange, - ciphertext_modulus_log: u32, -) -> Vec { - let mut paretos = HashSet::new(); - - for output_lwe_dimension in &output_lwe_range.lwe_dimension { - let variance_ksk = minimal_variance( - GlweParameters { - log2_polynomial_size: 0, - glwe_dimension: output_lwe_dimension, - }, - ciphertext_modulus_log, - security_level, - ); - - for glwe_dimension in &input_glwe_range.glwe_dimension { - for log2_polynomial_size in &input_glwe_range.log2_polynomial_size { - let polynomial_size = 1 << log2_polynomial_size; - - let input_lwe_dimension = polynomial_size * glwe_dimension; - - let mut min_variance = Variance(f64::INFINITY); - - for level in 1..=ciphertext_modulus_log as u64 { - let mut log2_base_arg_min = None; - - for log2_base in 1..=(ciphertext_modulus_log as u64 / level) { - let keyswitch_parameters = KeyswitchParameters { - input_lwe_dimension: LweDimension(input_lwe_dimension), - output_lwe_dimension: LweDimension(output_lwe_dimension), - ks_decomposition_parameter: KsDecompositionParameters { - level, - log2_base, - }, - }; - - let variance = variance_keyswitch( - keyswitch_parameters, - ciphertext_modulus_log, - variance_ksk, - ); - - debug_assert!(variance.0.is_finite()); - - if variance < min_variance { - min_variance = variance; - log2_base_arg_min = Some(log2_base); - } - } - if let Some(log_base_arg_min) = log2_base_arg_min { - let _ = paretos.insert(KsDecompositionParameters { - level, - log2_base: log_base_arg_min, - }); - } - } - } - } - } - - let mut res: Vec<_> = paretos.into_iter().collect(); - - res.sort_unstable(); - - res -} - -#[rustfmt::skip] -pub const BR_BL: &[(u64, u64); 41] = &[ - (12, 1),(22, 1),(23, 1),(8, 2),(15, 2),(16, 2),(6, 3),(11, 3),(12, 3),(5, 4),(9, 4), - (4, 5),(7, 5),(8, 5),(6, 6),(7, 6),(3, 7),(6, 7),(5, 8),(5, 9),(2, 10),(4, 10),(2, 11), - (4, 11),(3, 13),(3, 14),(3, 15),(1, 20),(2, 20),(1, 21),(2, 21),(1, 22),(2, 22),(2, 23), - (1, 40),(1, 41),(1, 42),(1, 43),(1, 44),(1, 45),(1, 46), -]; - -#[rustfmt::skip] -pub const KS_BL: &[(u64, u64); 50] = &[ - (5, 1),(6, 1),(7, 1),(8, 1),(9, 1),(10, 1),(11, 1),(12, 1),(4, 2),(5, 2),(6, 2),(7, 2), - (8, 2),(3, 3),(4, 3),(5, 3),(6, 3),(2, 4),(3, 4),(4, 4),(5, 4),(2, 5),(3, 5),(4, 5), - (2, 6),(3, 6),(4, 6),(2, 7),(3, 7),(1, 8),(2, 8),(3, 8),(1, 9),(2, 9),(1, 10),(2, 10), - (1, 11),(2, 11),(1, 12),(1, 13),(1, 14),(1, 15),(1, 16),(1, 17),(1, 18),(1, 19),(1, 20), - (1, 21),(1, 22),(1, 23), -]; - -#[cfg(test)] -mod tests { - use super::*; - use crate::global_parameters::DEFAUT_DOMAINS; - use pretty_assertions::assert_eq; - - #[test] - fn extract_br_pareto2() { - let pareto = extract_br_pareto( - 128, - &DEFAUT_DOMAINS.glwe_pbs_constrained, - &DEFAUT_DOMAINS.free_glwe.into(), - 64, - ); - - let decomp_couple = |v: &BrDecompositionParameters| (v.log2_base, v.level); - let br_bl: Vec<_> = pareto.iter().map(decomp_couple).collect(); - if br_bl != BR_BL { - println!("---- Copy past to BR_BL"); - for (log2_base, level) in &br_bl { - print!("({log2_base}, {level}), "); - } - println!(); - println!("---- End"); - assert_eq!(br_bl, BR_BL); - } - } - - #[test] - fn extract_ks_pareto2() { - let pareto = extract_ks_pareto( - 128, - &DEFAUT_DOMAINS.glwe_pbs_constrained, - &DEFAUT_DOMAINS.free_glwe.into(), - 64, - ); - - let decomp_couple = |v: &KsDecompositionParameters| (v.log2_base, v.level); - let ks_bl: Vec<_> = pareto.iter().map(decomp_couple).collect(); - if ks_bl != KS_BL { - println!("---- Copy past to KS_BL"); - for (log2_base, level) in &ks_bl { - print!("({log2_base}, {level}), "); - } - println!(); - println!("---- End"); - assert_eq!(ks_bl, KS_BL); - } - } -}