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