From 993f5cee60110bafccbc5c83947f293a46706d11 Mon Sep 17 00:00:00 2001 From: "Mayeul@Zama" Date: Wed, 9 Feb 2022 14:47:07 +0100 Subject: [PATCH] add parametrized graphs --- src/graph.rs | 2 +- src/graph/operator.rs | 18 ++++++++++ src/graph/operator_index.rs | 2 -- src/graph/unparametrized.rs | 40 ++++++++++----------- src/lib.rs | 2 ++ src/parameters.rs | 70 +++++++++++++++++++++++++++++++++++++ 6 files changed, 111 insertions(+), 23 deletions(-) create mode 100644 src/graph/operator.rs delete mode 100644 src/graph/operator_index.rs create mode 100644 src/parameters.rs diff --git a/src/graph.rs b/src/graph.rs index 7510da3a7..a21dce048 100644 --- a/src/graph.rs +++ b/src/graph.rs @@ -1,2 +1,2 @@ -pub mod operator_index; +pub mod operator; pub mod unparametrized; diff --git a/src/graph/operator.rs b/src/graph/operator.rs new file mode 100644 index 000000000..6d95db4e8 --- /dev/null +++ b/src/graph/operator.rs @@ -0,0 +1,18 @@ +use crate::weight::Weight; + +#[derive(Clone, PartialEq, Eq, Debug)] +pub(crate) enum Operator { + Input { + out_precision: u8, + extra_data: InputExtraData, + }, + AtomicPattern { + in_precision: u8, + out_precision: u8, + multisum_inputs: Vec<(Weight, OperatorIndex)>, + extra_data: AtomicPatternExtraData, + }, +} + +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub struct OperatorIndex(pub usize); diff --git a/src/graph/operator_index.rs b/src/graph/operator_index.rs deleted file mode 100644 index 33f0b74a8..000000000 --- a/src/graph/operator_index.rs +++ /dev/null @@ -1,2 +0,0 @@ -#[derive(Clone, Copy, PartialEq, Eq, Debug)] -pub struct OperatorIndex(pub usize); diff --git a/src/graph/unparametrized.rs b/src/graph/unparametrized.rs index 6007d52df..569eeeae4 100644 --- a/src/graph/unparametrized.rs +++ b/src/graph/unparametrized.rs @@ -1,22 +1,10 @@ -use super::operator_index::OperatorIndex; +use super::operator::{Operator, OperatorIndex}; use crate::weight::Weight; -#[derive(Clone, PartialEq, Eq, Debug)] -pub(crate) enum Operator { - Input { - out_precision: u8, - }, - AtomicPattern { - in_precision: u8, - out_precision: u8, - multisum_inputs: Vec<(Weight, OperatorIndex)>, - }, -} - #[derive(Clone)] #[must_use] pub struct AtomicPatternDag { - operators: Vec, + operators: Vec>, } impl AtomicPatternDag { @@ -24,7 +12,7 @@ impl AtomicPatternDag { Self { operators: vec![] } } - fn add_operator(&mut self, operator: Operator) -> OperatorIndex { + fn add_operator(&mut self, operator: Operator<(), ()>) -> OperatorIndex { let operator_index = self.operators.len(); self.operators.push(operator); @@ -33,7 +21,10 @@ impl AtomicPatternDag { } pub fn add_input(&mut self, out_precision: u8) -> OperatorIndex { - self.add_operator(Operator::Input { out_precision }) + self.add_operator(Operator::Input { + out_precision, + extra_data: (), + }) } pub fn add_atomic_pattern( @@ -46,6 +37,7 @@ impl AtomicPatternDag { in_precision, out_precision, multisum_inputs, + extra_data: (), }) } } @@ -74,17 +66,25 @@ mod tests { assert_eq!( &graph.operators, &[ - Operator::Input { out_precision: 1 }, - Operator::Input { out_precision: 2 }, + Operator::Input { + out_precision: 1, + extra_data: () + }, + Operator::Input { + out_precision: 2, + extra_data: () + }, Operator::AtomicPattern { in_precision: 3, out_precision: 3, - multisum_inputs: vec![(Weight(1), input1), (Weight(2), input2)] + multisum_inputs: vec![(Weight(1), input1), (Weight(2), input2)], + extra_data: () }, Operator::AtomicPattern { in_precision: 4, out_precision: 4, - multisum_inputs: vec![(Weight(1), atomic_pattern1), (Weight(2), input2)] + multisum_inputs: vec![(Weight(1), atomic_pattern1), (Weight(2), input2)], + extra_data: () }, ] ); diff --git a/src/lib.rs b/src/lib.rs index c290d6b92..a406981d7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,8 @@ #![warn(clippy::pedantic)] #![warn(clippy::style)] #![allow(clippy::missing_panics_doc)] +#![allow(clippy::module_name_repetitions)] pub mod graph; +pub mod parameters; pub mod weight; diff --git a/src/parameters.rs b/src/parameters.rs new file mode 100644 index 000000000..72ccd68a6 --- /dev/null +++ b/src/parameters.rs @@ -0,0 +1,70 @@ +pub use grouped::*; +pub use individual::*; + +mod individual { + #[derive(Clone, Copy)] + pub struct KsDecompositionParameters { + pub log2_base: LogBase, + pub level: Level, + } + + #[derive(Clone, Copy)] + pub struct PbsDecompositionParameters { + pub log2_base: LogBase, + pub level: Level, + } + + #[derive(Clone, Copy, PartialEq, Debug)] + pub struct GlweParameters { + pub log2_polynomial_size: LogPolynomialSize, + pub glwe_dimension: GlweDimension, + } + + #[derive(Clone, Copy)] + pub struct LweDimension { + pub lwe_dimension: LweDimension2, + } + + #[derive(Copy, Clone)] + pub struct InputParameter { + pub lwe_dimension: LweDimension, + } + + #[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, + } +} + +mod grouped { + use super::{ + GlweParameters, KsDecompositionParameters, LweDimension, PbsDecompositionParameters, + }; + + #[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>, + } +}