mirror of
https://github.com/zama-ai/concrete.git
synced 2026-02-09 03:55:04 -05:00
remove usage of generics for parameters
This commit is contained in:
@@ -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!(
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -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>,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user