remove usage of generics for parameters

This commit is contained in:
Mayeul@Zama
2022-04-12 11:29:35 +02:00
committed by mayeul-zama
parent 51f936911e
commit db15c75700
4 changed files with 113 additions and 89 deletions

View File

@@ -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<GlweParameters<Range, Range>>,
pub pbs_decomposition: Vec<PbsDecompositionParameters<Range, Range>>, // 0 => lpetit , 1 => l plus grand
pub ks_decomposition: Vec<KsDecompositionParameters<Range, Range>>,
pub glwe: Vec<GlweParameterRanges>,
pub pbs_decomposition: Vec<PbsDecompositionParameterRanges>, // 0 => lpetit , 1 => l plus grand
pub ks_decomposition: Vec<KsDecompositionParameterRanges>,
}
pub struct ParameterValues {
pub glwe: Vec<GlweParameters<u16, u16>>,
pub pbs_decomposition: Vec<PbsDecompositionParameters<u16, u16>>,
pub ks_decomposition: Vec<KsDecompositionParameters<u16, u16>>,
pub glwe: Vec<GlweParameters>,
pub pbs_decomposition: Vec<PbsDecompositionParameters>,
pub ks_decomposition: Vec<KsDecompositionParameters>,
}
#[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<Range, Range>,
pub free_glwe: GlweParameters<Range, Range>,
pub pbs_decomposition: PbsDecompositionParameters<Range, Range>,
pub ks_decomposition: KsDecompositionParameters<Range, Range>,
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<InputParameter<usize>, AtomicPatternParameters<usize, usize, usize, usize, usize>> {
) -> Operator<InputParameterIndexed, AtomicPatternParametersIndexed> {
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!(

View File

@@ -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<Index>;
type AtomicPatternParametersIndexed = AtomicPatternParameters<Index, Index, Index, Index, Index>;
#[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<InputParameterIndexed, AtomicPatternParametersIndexed>;

View File

@@ -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<LogBase, Level> {
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<LogBase, Level> {
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<LogPolynomialSize, GlweDimension> {
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<LweDimension2> {
pub lwe_dimension: LweDimension2,
pub struct LweDimension {
pub lwe_dimension: u32,
}
#[derive(Copy, Clone)]
pub struct InputParameter<LweDimension> {
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<LweDimension<LweDimension2>>,
pub glwe_dimension_and_polynomial_size:
Vec<GlweParameters<LogPolynomialSize, GlweDimension>>,
pub pbs_decomposition_parameters: Vec<PbsDecompositionParameters<PbsLogBase, PbsLevel>>,
pub ks_decomposition_parameters: Vec<KsDecompositionParameters<KsLogBase, KsLevel>>,
pub struct Parameters {
pub lwe_dimension: Vec<LweDimension>,
pub glwe_dimension_and_polynomial_size: Vec<GlweParameters>,
pub pbs_decomposition_parameters: Vec<PbsDecompositionParameters>,
pub ks_decomposition_parameters: Vec<KsDecompositionParameters>,
}
}

View File

@@ -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<Range, Range>,
input_lwe_range: &crate::parameters::LweDimension<Range>,
output_glwe_range: &GlweParameterRanges,
input_lwe_range: &crate::parameters::LweDimensionRange,
ciphertext_modulus_log: u64,
) -> Vec<PbsDecompositionParameters<u64, u64>> {
) -> Vec<PbsDecompositionParameters> {
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<Range, Range>,
output_lwe_range: &crate::parameters::LweDimension<Range>,
input_glwe_range: &GlweParameterRanges,
output_lwe_range: &crate::parameters::LweDimensionRange,
ciphertext_modulus_log: u64,
) -> Vec<KsDecompositionParameters<u64, u64>> {
) -> Vec<KsDecompositionParameters> {
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