tfhe/integer/parameters/
mod.rs

1#![allow(clippy::excessive_precision)]
2use crate::conformance::ListSizeConstraint;
3use crate::integer::key_switching_key::KeySwitchingKeyView;
4use crate::integer::server_key::ServerKey;
5use crate::shortint::parameters::{
6    CarryModulus, CiphertextConformanceParams, EncryptionKeyChoice, MessageModulus,
7};
8pub use crate::shortint::parameters::{
9    DecompositionBaseLog, DecompositionLevelCount, DynamicDistribution, GlweDimension,
10    LweDimension, PolynomialSize, StandardDev,
11};
12use crate::shortint::PBSParameters;
13pub use crate::shortint::{CiphertextModulus, ClassicPBSParameters, WopbsParameters};
14
15#[derive(Clone, Copy)]
16pub enum IntegerCompactCiphertextListExpansionMode<'key> {
17    /// The [`KeySwitchingKeyView`] has all the information to both cast and unpack.
18    CastAndUnpackIfNecessary(KeySwitchingKeyView<'key>),
19    /// This only allows to unpack.
20    UnpackAndSanitizeIfNecessary(&'key ServerKey),
21    NoCastingAndNoUnpacking,
22}
23
24pub const ALL_PARAMETER_VEC_INTEGER_16_BITS: [WopbsParameters; 2] = [
25    PARAM_MESSAGE_4_CARRY_4_KS_PBS_16_BITS,
26    PARAM_MESSAGE_2_CARRY_2_KS_PBS_16_BITS,
27];
28
29pub const PARAM_MESSAGE_4_CARRY_4_KS_PBS_16_BITS: WopbsParameters = WopbsParameters {
30    lwe_dimension: LweDimension(481),
31    glwe_dimension: GlweDimension(1),
32    polynomial_size: PolynomialSize(2048),
33    lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
34        0.00061200133780220371345,
35    )),
36    glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
37        0.00000000000000022148688116005568513645324585951,
38    )),
39    pbs_base_log: DecompositionBaseLog(9),
40    pbs_level: DecompositionLevelCount(4),
41    ks_level: DecompositionLevelCount(9),
42    ks_base_log: DecompositionBaseLog(1),
43    pfks_level: DecompositionLevelCount(4),
44    pfks_base_log: DecompositionBaseLog(9),
45    pfks_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
46        0.00000000000000022148688116005568513645324585951,
47    )),
48    cbs_level: DecompositionLevelCount(4),
49    cbs_base_log: DecompositionBaseLog(6),
50    message_modulus: MessageModulus(16),
51    carry_modulus: CarryModulus(16),
52    ciphertext_modulus: CiphertextModulus::new_native(),
53    encryption_key_choice: EncryptionKeyChoice::Big,
54};
55
56pub const PARAM_MESSAGE_2_CARRY_2_KS_PBS_16_BITS: WopbsParameters = WopbsParameters {
57    lwe_dimension: LweDimension(493),
58    glwe_dimension: GlweDimension(1),
59    polynomial_size: PolynomialSize(2048),
60    lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
61        0.00049144710341316649172,
62    )),
63    glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
64        0.00000000000000022148688116005568513645324585951,
65    )),
66    pbs_base_log: DecompositionBaseLog(16),
67    pbs_level: DecompositionLevelCount(2),
68    ks_level: DecompositionLevelCount(5),
69    ks_base_log: DecompositionBaseLog(2),
70    pfks_level: DecompositionLevelCount(2),
71    pfks_base_log: DecompositionBaseLog(16),
72    pfks_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
73        0.00000000000000022148688116005568513645324585951,
74    )),
75    cbs_level: DecompositionLevelCount(6),
76    cbs_base_log: DecompositionBaseLog(3),
77    message_modulus: MessageModulus(4),
78    carry_modulus: CarryModulus(4),
79    ciphertext_modulus: CiphertextModulus::new_native(),
80    encryption_key_choice: EncryptionKeyChoice::Big,
81};
82
83pub const PARAM_MESSAGE_4_CARRY_4_KS_PBS_32_BITS: WopbsParameters = WopbsParameters {
84    lwe_dimension: LweDimension(481),
85    glwe_dimension: GlweDimension(1),
86    polynomial_size: PolynomialSize(2048),
87    lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
88        0.00061200133780220371345,
89    )),
90    glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
91        0.00000000000000022148688116005568513645324585951,
92    )),
93    pbs_base_log: DecompositionBaseLog(9),
94    pbs_level: DecompositionLevelCount(4),
95    ks_level: DecompositionLevelCount(9),
96    ks_base_log: DecompositionBaseLog(1),
97    pfks_level: DecompositionLevelCount(4),
98    pfks_base_log: DecompositionBaseLog(9),
99    pfks_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
100        0.00000000000000022148688116005568513645324585951,
101    )),
102    cbs_level: DecompositionLevelCount(4),
103    cbs_base_log: DecompositionBaseLog(6),
104    message_modulus: MessageModulus(16),
105    carry_modulus: CarryModulus(16),
106    ciphertext_modulus: CiphertextModulus::new_native(),
107    encryption_key_choice: EncryptionKeyChoice::Big,
108};
109
110pub const PARAM_MESSAGE_2_CARRY_2_KS_PBS_32_BITS: WopbsParameters = WopbsParameters {
111    lwe_dimension: LweDimension(481),
112    glwe_dimension: GlweDimension(1),
113    polynomial_size: PolynomialSize(2048),
114    lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
115        0.00061200133780220371345,
116    )),
117    glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
118        0.00000000000000022148688116005568513645324585951,
119    )),
120    pbs_base_log: DecompositionBaseLog(11),
121    pbs_level: DecompositionLevelCount(3),
122    ks_level: DecompositionLevelCount(9),
123    ks_base_log: DecompositionBaseLog(1),
124    pfks_level: DecompositionLevelCount(3),
125    pfks_base_log: DecompositionBaseLog(11),
126    pfks_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
127        0.00000000000000022148688116005568513645324585951,
128    )),
129    cbs_level: DecompositionLevelCount(6),
130    cbs_base_log: DecompositionBaseLog(3),
131    message_modulus: MessageModulus(4),
132    carry_modulus: CarryModulus(4),
133    ciphertext_modulus: CiphertextModulus::new_native(),
134    encryption_key_choice: EncryptionKeyChoice::Big,
135};
136
137pub const PARAM_MESSAGE_1_CARRY_1_KS_PBS_32_BITS: WopbsParameters = WopbsParameters {
138    lwe_dimension: LweDimension(493),
139    glwe_dimension: GlweDimension(1),
140    polynomial_size: PolynomialSize(2048),
141    lwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
142        0.00049144710341316649172,
143    )),
144    glwe_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
145        0.00000000000000022148688116005568513645324585951,
146    )),
147    pbs_base_log: DecompositionBaseLog(15),
148    pbs_level: DecompositionLevelCount(2),
149    ks_level: DecompositionLevelCount(5),
150    ks_base_log: DecompositionBaseLog(2),
151    pfks_level: DecompositionLevelCount(2),
152    pfks_base_log: DecompositionBaseLog(15),
153    pfks_noise_distribution: DynamicDistribution::new_gaussian_from_std_dev(StandardDev(
154        0.00000000000000022148688116005568513645324585951,
155    )),
156    cbs_level: DecompositionLevelCount(5),
157    cbs_base_log: DecompositionBaseLog(3),
158    message_modulus: MessageModulus(2),
159    carry_modulus: CarryModulus(2),
160    ciphertext_modulus: CiphertextModulus::new_native(),
161    encryption_key_choice: EncryptionKeyChoice::Big,
162};
163
164#[derive(Copy, Clone)]
165pub struct RadixCiphertextConformanceParams {
166    pub shortint_params: CiphertextConformanceParams,
167    pub num_blocks_per_integer: usize,
168}
169
170/// Structure to store the expected properties of a ciphertext
171/// Can be used on a server to check if client inputs are well formed
172/// before running a computation on them
173impl RadixCiphertextConformanceParams {
174    pub fn to_ct_list_conformance_parameters(
175        &self,
176        list_constraint: ListSizeConstraint,
177    ) -> CompactCiphertextListConformanceParams {
178        CompactCiphertextListConformanceParams {
179            shortint_params: self.shortint_params,
180            num_elements_constraint: list_constraint,
181        }
182    }
183
184    pub fn from_pbs_parameters<P: Into<PBSParameters>>(
185        params: P,
186        num_blocks_per_integer: usize,
187    ) -> Self {
188        let params: PBSParameters = params.into();
189        Self {
190            shortint_params: params.to_shortint_conformance_param(),
191            num_blocks_per_integer,
192        }
193    }
194}
195
196/// Structure to store the expected properties of a ciphertext list
197/// Can be used on a server to check if client inputs are well formed
198/// before running a computation on them
199#[derive(Copy, Clone)]
200pub struct CompactCiphertextListConformanceParams {
201    pub shortint_params: CiphertextConformanceParams,
202    pub num_elements_constraint: ListSizeConstraint,
203}