arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/core/src/gglwe/tests/cpu_spqlios/fft64.rs
core/src/gglwe/tests/cpu_spqlios/fft64.rsRaw
  1use backend::{
  2    hal::{api::ModuleNew, layouts::Module},
  3    implementation::cpu_spqlios::FFT64,
  4};
  5
  6use crate::gglwe::tests::{
  7    generics_automorphism_key::{
  8        test_automorphisk_key_encrypt_sk, test_automorphisk_key_encrypt_sk_compressed, test_gglwe_automorphism,
  9        test_gglwe_automorphism_inplace,
 10    },
 11    generics_gglwe::{
 12        test_gglwe_encrypt_sk, test_gglwe_encrypt_sk_compressed, test_gglwe_external_product,
 13        test_gglwe_external_product_inplace, test_gglwe_keyswitch, test_gglwe_keyswitch_inplace,
 14    },
 15    generics_tensor_key::{test_tensor_key_encrypt_sk, test_tensor_key_encrypt_sk_compressed},
 16};
 17
 18#[test]
 19fn gglwe_encrypt_sk() {
 20    let log_n: usize = 8;
 21    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
 22    let basek: usize = 12;
 23    let k_ksk: usize = 54;
 24    let digits: usize = k_ksk / basek;
 25    (1..4).for_each(|rank_in| {
 26        (1..4).for_each(|rank_out| {
 27            (1..digits + 1).for_each(|di| {
 28                println!(
 29                    "test gglwe_encrypt_sk digits: {} ranks: ({} {})",
 30                    di, rank_in, rank_out
 31                );
 32                test_gglwe_encrypt_sk(&module, basek, k_ksk, di, rank_in, rank_out, 3.2);
 33            });
 34        });
 35    });
 36}
 37
 38#[test]
 39fn gglwe_encrypt_sk_compressed() {
 40    let log_n: usize = 8;
 41    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
 42    let basek: usize = 12;
 43    let k_ksk: usize = 54;
 44    let digits: usize = k_ksk / basek;
 45    (1..4).for_each(|rank_in| {
 46        (1..4).for_each(|rank_out| {
 47            (1..digits + 1).for_each(|di| {
 48                println!(
 49                    "test gglwe_encrypt_sk_compressed digits: {} ranks: ({} {})",
 50                    di, rank_in, rank_out
 51                );
 52                test_gglwe_encrypt_sk_compressed(&module, basek, k_ksk, di, rank_in, rank_out, 3.2);
 53            });
 54        });
 55    });
 56}
 57
 58#[test]
 59fn gglwe_keyswitch() {
 60    let log_n: usize = 8;
 61    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
 62    let basek: usize = 12;
 63    let k_in: usize = 60;
 64    let digits: usize = k_in.div_ceil(basek);
 65    (1..4).for_each(|rank_in_s0s1| {
 66        (1..4).for_each(|rank_out_s0s1| {
 67            (1..4).for_each(|rank_out_s1s2| {
 68                (1..digits + 1).for_each(|di| {
 69                    let k_ksk: usize = k_in + basek * di;
 70                    println!(
 71                        "test gglwe_keyswitch digits: {} ranks: ({},{},{})",
 72                        di, rank_in_s0s1, rank_out_s0s1, rank_out_s1s2
 73                    );
 74                    let k_out: usize = k_ksk; // Better capture noise.
 75                    test_gglwe_keyswitch(
 76                        &module,
 77                        basek,
 78                        k_out,
 79                        k_in,
 80                        k_ksk,
 81                        di,
 82                        rank_in_s0s1,
 83                        rank_out_s0s1,
 84                        rank_out_s1s2,
 85                        3.2,
 86                    );
 87                })
 88            })
 89        });
 90    });
 91}
 92
 93#[test]
 94fn gglwe_keyswitch_inplace() {
 95    let log_n: usize = 8;
 96    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
 97    let basek: usize = 12;
 98    let k_ct: usize = 60;
 99    let digits: usize = k_ct.div_ceil(basek);
100    (1..4).for_each(|rank_in_s0s1| {
101        (1..4).for_each(|rank_out_s0s1| {
102            (1..digits + 1).for_each(|di| {
103                let k_ksk: usize = k_ct + basek * di;
104                println!(
105                    "test gglwe_keyswitch_inplace digits: {} ranks: ({},{})",
106                    di, rank_in_s0s1, rank_out_s0s1
107                );
108                test_gglwe_keyswitch_inplace(
109                    &module,
110                    basek,
111                    k_ct,
112                    k_ksk,
113                    di,
114                    rank_in_s0s1,
115                    rank_out_s0s1,
116                    3.2,
117                );
118            });
119        });
120    });
121}
122
123#[test]
124fn gglwe_external_product() {
125    let log_n: usize = 8;
126    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
127    let basek: usize = 12;
128    let k_in: usize = 60;
129    let digits: usize = k_in.div_ceil(basek);
130    (1..4).for_each(|rank_in| {
131        (1..4).for_each(|rank_out| {
132            (1..digits + 1).for_each(|di| {
133                let k_ggsw: usize = k_in + basek * di;
134                println!(
135                    "test gglwe_external_product digits: {} ranks: ({} {})",
136                    di, rank_in, rank_out
137                );
138                let k_out: usize = k_in; // Better capture noise.
139                test_gglwe_external_product(
140                    &module, basek, k_out, k_in, k_ggsw, di, rank_in, rank_out, 3.2,
141                );
142            });
143        });
144    });
145}
146
147#[test]
148fn gglwe_external_product_inplace() {
149    let log_n: usize = 5;
150    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
151    let basek: usize = 12;
152    let k_ct: usize = 60;
153    let digits: usize = k_ct.div_ceil(basek);
154    (1..4).for_each(|rank_in| {
155        (1..4).for_each(|rank_out| {
156            (1..digits).for_each(|di| {
157                let k_ggsw: usize = k_ct + basek * di;
158                println!(
159                    "test gglwe_external_product_inplace digits: {} ranks: ({} {})",
160                    di, rank_in, rank_out
161                );
162                test_gglwe_external_product_inplace(&module, basek, k_ct, k_ggsw, di, rank_in, rank_out, 3.2);
163            });
164        });
165    });
166}
167
168#[test]
169fn automorphism_key_encrypt_sk() {
170    let log_n: usize = 8;
171    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
172    let basek: usize = 12;
173    let k: usize = 60;
174    let digits: usize = k.div_ceil(basek) - 1;
175    let sigma: f64 = 3.2;
176    (1..4).for_each(|rank| {
177        (2..digits + 1).for_each(|di| {
178            println!(
179                "test automorphism key encrypt sk digits: {} rank: {}",
180                di, rank
181            );
182            test_automorphisk_key_encrypt_sk(&module, basek, k, di, rank, sigma);
183        });
184    });
185}
186
187#[test]
188fn automorphism_key_encrypt_sk_compressed() {
189    let log_n: usize = 8;
190    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
191    let basek: usize = 12;
192    let k: usize = 60;
193    let digits: usize = k.div_ceil(basek) - 1;
194    let sigma: f64 = 3.2;
195    (1..4).for_each(|rank| {
196        (2..digits + 1).for_each(|di| {
197            println!(
198                "test automorphism key encrypt sk compressed digits: {} rank: {}",
199                di, rank
200            );
201            test_automorphisk_key_encrypt_sk_compressed(&module, basek, k, di, rank, sigma);
202        });
203    });
204}
205
206#[test]
207fn gglwe_automorphism() {
208    let log_n: usize = 8;
209    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
210    let basek: usize = 12;
211    let k_in: usize = 60;
212    let k_out: usize = 40;
213    let digits: usize = k_in.div_ceil(basek);
214    let sigma: f64 = 3.2;
215    (1..4).for_each(|rank| {
216        (2..digits + 1).for_each(|di| {
217            println!("test automorphism digits: {} rank: {}", di, rank);
218            let k_apply: usize = (digits + di) * basek;
219            test_gglwe_automorphism(&module, -1, 5, basek, di, k_in, k_out, k_apply, sigma, rank);
220        });
221    });
222}
223
224#[test]
225fn gglwe_automorphism_inplace() {
226    let log_n: usize = 8;
227    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
228    let basek: usize = 12;
229    let k_in: usize = 60;
230    let digits: usize = k_in.div_ceil(basek);
231    let sigma: f64 = 3.2;
232    (1..4).for_each(|rank| {
233        (2..digits + 1).for_each(|di| {
234            println!("test automorphism_inplace digits: {} rank: {}", di, rank);
235            let k_apply: usize = (digits + di) * basek;
236            test_gglwe_automorphism_inplace(&module, -1, 5, basek, di, k_in, k_apply, sigma, rank);
237        });
238    });
239}
240
241#[test]
242fn tensor_key_encrypt_sk() {
243    let log_n: usize = 8;
244    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
245    (1..4).for_each(|rank| {
246        println!("test encrypt_sk rank: {}", rank);
247        test_tensor_key_encrypt_sk(&module, 16, 54, 3.2, rank);
248    });
249}
250
251#[test]
252fn tensor_key_encrypt_sk_compressed() {
253    let log_n: usize = 8;
254    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
255    (1..4).for_each(|rank| {
256        println!("test encrypt_sk_compressed rank: {}", rank);
257        test_tensor_key_encrypt_sk_compressed(&module, 16, 54, 3.2, rank);
258    });
259}