From db15c757000cfa321442daab73e66a520a6a3383 Mon Sep 17 00:00:00 2001 From: "Mayeul@Zama" Date: Tue, 12 Apr 2022 11:29:35 +0200 Subject: [PATCH] remove usage of generics for parameters --- concrete-optimizer/src/global_parameters.rs | 63 ++++++------- .../src/graph/parameter_indexed.rs | 16 +++- concrete-optimizer/src/parameters.rs | 93 +++++++++++-------- concrete-optimizer/src/pareto.rs | 30 +++--- 4 files changed, 113 insertions(+), 89 deletions(-) diff --git a/concrete-optimizer/src/global_parameters.rs b/concrete-optimizer/src/global_parameters.rs index 75214aa05..4d630218b 100644 --- a/concrete-optimizer/src/global_parameters.rs +++ b/concrete-optimizer/src/global_parameters.rs @@ -1,10 +1,11 @@ use std::collections::HashSet; use crate::graph::operator::{Operator, OperatorIndex}; +use crate::graph::parameter_indexed::{AtomicPatternParametersIndexed, InputParameterIndexed}; use crate::graph::{parameter_indexed, range_parametrized, unparametrized}; use crate::parameters::{ - AtomicPatternParameters, GlweParameters, InputParameter, KsDecompositionParameters, - PbsDecompositionParameters, + GlweParameterRanges, GlweParameters, KsDecompositionParameterRanges, KsDecompositionParameters, + PbsDecompositionParameterRanges, PbsDecompositionParameters, }; #[derive(Clone)] @@ -24,50 +25,50 @@ pub struct ParameterCount { #[derive(Clone)] pub struct ParameterRanges { - pub glwe: Vec>, - pub pbs_decomposition: Vec>, // 0 => lpetit , 1 => l plus grand - pub ks_decomposition: Vec>, + pub glwe: Vec, + pub pbs_decomposition: Vec, // 0 => lpetit , 1 => l plus grand + pub ks_decomposition: Vec, } pub struct ParameterValues { - pub glwe: Vec>, - pub pbs_decomposition: Vec>, - pub ks_decomposition: Vec>, + pub glwe: Vec, + pub pbs_decomposition: Vec, + pub ks_decomposition: Vec, } #[derive(Clone, Copy)] pub struct ParameterDomains { // move next comment to pareto ranges definition // TODO: verify if pareto optimal parameters depends on precisions - pub glwe_pbs_constrained: GlweParameters, - pub free_glwe: GlweParameters, - pub pbs_decomposition: PbsDecompositionParameters, - pub ks_decomposition: KsDecompositionParameters, + pub glwe_pbs_constrained: GlweParameterRanges, + pub free_glwe: GlweParameterRanges, + pub pbs_decomposition: PbsDecompositionParameterRanges, + pub ks_decomposition: KsDecompositionParameterRanges, } pub const DEFAUT_DOMAINS: ParameterDomains = ParameterDomains { - glwe_pbs_constrained: GlweParameters { + glwe_pbs_constrained: GlweParameterRanges { log2_polynomial_size: Range { start: 8, end: 15 }, glwe_dimension: Range { start: 1, end: 2 }, }, - free_glwe: GlweParameters { + free_glwe: GlweParameterRanges { log2_polynomial_size: Range { start: 0, end: 1 }, glwe_dimension: Range { start: 512, end: 1025, }, }, - pbs_decomposition: PbsDecompositionParameters { + pbs_decomposition: PbsDecompositionParameterRanges { log2_base: Range { start: 1, end: 65 }, level: Range { start: 1, end: 65 }, }, - ks_decomposition: KsDecompositionParameters { + ks_decomposition: KsDecompositionParameterRanges { log2_base: Range { start: 1, end: 65 }, level: Range { start: 1, end: 65 }, }, }; -#[derive(Clone, Copy, PartialEq, Debug)] +#[derive(Clone, Copy, PartialEq, Eq, Debug)] pub struct Range { pub start: u64, pub end: u64, @@ -97,7 +98,7 @@ pub fn minimal_unify(_g: unparametrized::AtomicPatternDag) -> parameter_indexed: fn convert_maximal( op: Operator<(), ()>, -) -> Operator, AtomicPatternParameters> { +) -> Operator { let external_glwe_index = 0; let internal_lwe_index = 1; let pbs_decomposition_index = 0; @@ -105,8 +106,8 @@ fn convert_maximal( match op { Operator::Input { out_precision, .. } => Operator::Input { out_precision, - extra_data: InputParameter { - lwe_dimension: external_glwe_index, + extra_data: InputParameterIndexed { + lwe_dimension_index: external_glwe_index, }, }, Operator::AtomicPattern { @@ -118,12 +119,12 @@ fn convert_maximal( in_precision, out_precision, multisum_inputs, - extra_data: AtomicPatternParameters { - input_lwe_dimension: external_glwe_index, - ks_decomposition_parameter: ks_decomposition_index, - internal_lwe_dimension: internal_lwe_index, - pbs_decomposition_parameter: pbs_decomposition_index, - output_glwe_params: external_glwe_index, + extra_data: AtomicPatternParametersIndexed { + input_lwe_dimensionlwe_dimension_index: external_glwe_index, + ks_decomposition_parameter_index: ks_decomposition_index, + internal_lwe_dimension_index: internal_lwe_index, + pbs_decomposition_parameter_index: pbs_decomposition_index, + output_glwe_params_index: external_glwe_index, }, }, } @@ -178,7 +179,7 @@ pub fn domains_to_ranges( let mut constrained_glwe_parameter_indexes = HashSet::new(); for op in &operators { if let Operator::AtomicPattern { extra_data, .. } = op { - let _ = constrained_glwe_parameter_indexes.insert(extra_data.output_glwe_params); + let _ = constrained_glwe_parameter_indexes.insert(extra_data.output_glwe_params_index); } } @@ -290,7 +291,7 @@ mod tests { } = domains_to_ranges(graph_params, DEFAUT_DOMAINS); let input_1_lwe_params = match &operators[input1.0] { - Operator::Input { extra_data, .. } => extra_data.lwe_dimension, + Operator::Input { extra_data, .. } => extra_data.lwe_dimension_index, _ => unreachable!(), }; @@ -320,7 +321,7 @@ mod tests { } = domains_to_ranges(graph_params, DEFAUT_DOMAINS); let input_1_lwe_params = match &operators[input1.0] { - Operator::Input { extra_data, .. } => extra_data.lwe_dimension, + Operator::Input { extra_data, .. } => extra_data.lwe_dimension_index, _ => unreachable!(), }; assert_eq!( @@ -329,7 +330,7 @@ mod tests { ); let atomic_pattern1_out_glwe_params = match &operators[atomic_pattern1.0] { - Operator::AtomicPattern { extra_data, .. } => extra_data.output_glwe_params, + Operator::AtomicPattern { extra_data, .. } => extra_data.output_glwe_params_index, _ => unreachable!(), }; assert_eq!( @@ -338,7 +339,7 @@ mod tests { ); let atomic_pattern1_internal_glwe_params = match &operators[atomic_pattern1.0] { - Operator::AtomicPattern { extra_data, .. } => extra_data.internal_lwe_dimension, + Operator::AtomicPattern { extra_data, .. } => extra_data.internal_lwe_dimension_index, _ => unreachable!(), }; assert_eq!( diff --git a/concrete-optimizer/src/graph/parameter_indexed.rs b/concrete-optimizer/src/graph/parameter_indexed.rs index 3b60a89f0..9ec9c317e 100644 --- a/concrete-optimizer/src/graph/parameter_indexed.rs +++ b/concrete-optimizer/src/graph/parameter_indexed.rs @@ -1,13 +1,19 @@ use crate::global_parameters::{ParameterCount, ParameterToOperation}; -use crate::parameters::{AtomicPatternParameters, InputParameter}; use super::operator::Operator; -type Index = usize; +pub struct InputParameterIndexed { + pub lwe_dimension_index: usize, +} -type InputParameterIndexed = InputParameter; - -type AtomicPatternParametersIndexed = AtomicPatternParameters; +#[derive(Copy, Clone)] +pub struct AtomicPatternParametersIndexed { + pub input_lwe_dimensionlwe_dimension_index: usize, + pub ks_decomposition_parameter_index: usize, + pub internal_lwe_dimension_index: usize, + pub pbs_decomposition_parameter_index: usize, + pub output_glwe_params_index: usize, +} pub(crate) type OperatorParameterIndexed = Operator; diff --git a/concrete-optimizer/src/parameters.rs b/concrete-optimizer/src/parameters.rs index aa99b67af..abfe50b68 100644 --- a/concrete-optimizer/src/parameters.rs +++ b/concrete-optimizer/src/parameters.rs @@ -1,48 +1,72 @@ pub use grouped::*; pub use individual::*; +pub use range::*; mod individual { + #[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)] - pub struct KsDecompositionParameters { - pub level: Level, - pub log2_base: LogBase, + pub struct KsDecompositionParameters { + pub level: u64, + pub log2_base: u64, } #[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)] - pub struct PbsDecompositionParameters { - pub level: Level, - pub log2_base: LogBase, + pub struct PbsDecompositionParameters { + pub level: u64, + pub log2_base: u64, } #[derive(Clone, Copy, PartialEq, Debug)] - pub struct GlweParameters { - pub log2_polynomial_size: LogPolynomialSize, - pub glwe_dimension: GlweDimension, + pub struct GlweParameters { + pub log2_polynomial_size: u64, + pub glwe_dimension: u64, } #[derive(Clone, Copy)] - pub struct LweDimension { - pub lwe_dimension: LweDimension2, + pub struct LweDimension { + pub lwe_dimension: u32, } #[derive(Copy, Clone)] - pub struct InputParameter { - pub lwe_dimension: LweDimension, + pub struct InputParameter { + pub lwe_dimension: u32, } #[derive(Copy, Clone)] - pub struct AtomicPatternParameters< - InputLweDimension, - KsDecompositionParameter, - InternalLweDimension, - PbsDecompositionParameter, - GlweDimensionAndPolynomialSize, - > { - pub input_lwe_dimension: InputLweDimension, - pub ks_decomposition_parameter: KsDecompositionParameter, - pub internal_lwe_dimension: InternalLweDimension, - pub pbs_decomposition_parameter: PbsDecompositionParameter, - pub output_glwe_params: GlweDimensionAndPolynomialSize, + pub struct AtomicPatternParameters { + pub input_lwe_dimension: LweDimension, + pub ks_decomposition_parameter: KsDecompositionParameters, + pub internal_lwe_dimension: LweDimension, + pub pbs_decomposition_parameter: PbsDecompositionParameters, + pub output_glwe_params: GlweParameters, + } +} + +mod range { + + use crate::global_parameters::Range; + + #[derive(Clone, Copy)] + pub struct KsDecompositionParameterRanges { + pub level: Range, + pub log2_base: Range, + } + + #[derive(Clone, Copy)] + pub struct LweDimensionRange { + pub lwe_dimension: Range, + } + + #[derive(Clone, Copy, Debug, PartialEq, Eq)] + pub struct GlweParameterRanges { + pub log2_polynomial_size: Range, + pub glwe_dimension: Range, + } + + #[derive(Clone, Copy)] + pub struct PbsDecompositionParameterRanges { + pub level: Range, + pub log2_base: Range, } } @@ -52,19 +76,10 @@ mod grouped { }; #[derive(Clone)] - pub struct Parameters< - LweDimension2, - KsLogBase, - KsLevel, - PbsLogBase, - PbsLevel, - LogPolynomialSize, - GlweDimension, - > { - pub lwe_dimension: Vec>, - pub glwe_dimension_and_polynomial_size: - Vec>, - pub pbs_decomposition_parameters: Vec>, - pub ks_decomposition_parameters: Vec>, + pub struct Parameters { + pub lwe_dimension: Vec, + pub glwe_dimension_and_polynomial_size: Vec, + pub pbs_decomposition_parameters: Vec, + pub ks_decomposition_parameters: Vec, } } diff --git a/concrete-optimizer/src/pareto.rs b/concrete-optimizer/src/pareto.rs index 60ce9f3df..1b7f9a2ff 100644 --- a/concrete-optimizer/src/pareto.rs +++ b/concrete-optimizer/src/pareto.rs @@ -1,16 +1,17 @@ -use crate::global_parameters::Range; use crate::noise_estimator::operators::atomic_pattern::{variance_bootstrap, variance_keyswitch}; -use crate::parameters::{GlweParameters, KsDecompositionParameters, PbsDecompositionParameters}; +use crate::parameters::{ + GlweParameterRanges, KsDecompositionParameters, PbsDecompositionParameters, +}; 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: &GlweParameters, - input_lwe_range: &crate::parameters::LweDimension, + output_glwe_range: &GlweParameterRanges, + input_lwe_range: &crate::parameters::LweDimensionRange, ciphertext_modulus_log: u64, -) -> Vec> { +) -> Vec { let mut paretos = HashSet::new(); for glwe_dimension in &output_glwe_range.glwe_dimension { @@ -76,10 +77,10 @@ pub fn extract_br_pareto( // (i.e. is the product of a glwe_dimension and a polynomial_size) pub fn extract_ks_pareto( security_level: u64, - input_glwe_range: &GlweParameters, - output_lwe_range: &crate::parameters::LweDimension, + input_glwe_range: &GlweParameterRanges, + output_lwe_range: &crate::parameters::LweDimensionRange, ciphertext_modulus_log: u64, -) -> Vec> { +) -> Vec { let mut paretos = HashSet::new(); for output_lwe_dimension in &output_lwe_range.lwe_dimension { @@ -137,9 +138,10 @@ pub fn extract_ks_pareto( #[cfg(test)] mod tests { - use std::time::Instant; - use super::*; + use crate::global_parameters::Range; + use crate::parameters::GlweParameterRanges; + use std::time::Instant; // when this test fails remove function fix_1xerror and fix_2xerror #[test] @@ -149,11 +151,11 @@ mod tests { assert_eq!( extract_br_pareto( 128, - &GlweParameters { + &GlweParameterRanges { log2_polynomial_size: Range { start: 9, end: 15 }, glwe_dimension: Range { start: 1, end: 3 } }, - &crate::parameters::LweDimension { + &crate::parameters::LweDimensionRange { lwe_dimension: Range { start: 450, end: 1024 @@ -177,11 +179,11 @@ mod tests { assert_eq!( extract_ks_pareto( 128, - &GlweParameters { + &GlweParameterRanges { log2_polynomial_size: Range { start: 9, end: 15 }, glwe_dimension: Range { start: 1, end: 3 } }, - &crate::parameters::LweDimension { + &crate::parameters::LweDimensionRange { lwe_dimension: Range { start: 450, end: 1024