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);
 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);
 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                    );
 83                })
 84            })
 85        });
 86    });
 87}
 88
 89#[test]
 90fn gglwe_switching_key_keyswitch_inplace() {
 91    let log_n: usize = 8;
 92    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
 93    let basek: usize = 12;
 94    let k_ct: usize = 60;
 95    let digits: usize = k_ct.div_ceil(basek);
 96    (1..4).for_each(|rank_in_s0s1| {
 97        (1..4).for_each(|rank_out_s0s1| {
 98            (1..digits + 1).for_each(|di| {
 99                let k_ksk: usize = k_ct + basek * di;
100                println!(
101                    "test_gglwe_switching_key_keyswitch_inplace digits: {} ranks: ({},{})",
102                    di, rank_in_s0s1, rank_out_s0s1
103                );
104                test_gglwe_switching_key_keyswitch_inplace(&module, basek, k_ct, k_ksk, di, rank_in_s0s1, rank_out_s0s1);
105            });
106        });
107    });
108}
109
110#[test]
111fn gglwe_switching_key_external_product() {
112    let log_n: usize = 8;
113    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
114    let basek: usize = 12;
115    let k_in: usize = 60;
116    let digits: usize = k_in.div_ceil(basek);
117    (1..4).for_each(|rank_in| {
118        (1..4).for_each(|rank_out| {
119            (1..digits + 1).for_each(|di| {
120                let k_ggsw: usize = k_in + basek * di;
121                println!(
122                    "test_gglwe_switching_key_external_product digits: {} ranks: ({} {})",
123                    di, rank_in, rank_out
124                );
125                let k_out: usize = k_in; // Better capture noise.
126                test_gglwe_switching_key_external_product(&module, basek, k_out, k_in, k_ggsw, di, rank_in, rank_out);
127            });
128        });
129    });
130}
131
132#[test]
133fn gglwe_switching_key_external_product_inplace() {
134    let log_n: usize = 5;
135    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
136    let basek: usize = 12;
137    let k_ct: usize = 60;
138    let digits: usize = k_ct.div_ceil(basek);
139    (1..4).for_each(|rank_in| {
140        (1..4).for_each(|rank_out| {
141            (1..digits).for_each(|di| {
142                let k_ggsw: usize = k_ct + basek * di;
143                println!(
144                    "test_gglwe_switching_key_external_product_inplace digits: {} ranks: ({} {})",
145                    di, rank_in, rank_out
146                );
147                test_gglwe_switching_key_external_product_inplace(&module, basek, k_ct, k_ggsw, di, rank_in, rank_out);
148            });
149        });
150    });
151}
152
153#[test]
154fn gglwe_automorphisk_key_encrypt_sk() {
155    let log_n: usize = 8;
156    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
157    let basek: usize = 12;
158    let k: usize = 60;
159    let digits: usize = k.div_ceil(basek) - 1;
160    (1..4).for_each(|rank| {
161        (2..digits + 1).for_each(|di| {
162            println!(
163                "test_gglwe_automorphisk_key_encrypt_sk digits: {} rank: {}",
164                di, rank
165            );
166            test_gglwe_automorphisk_key_encrypt_sk(&module, basek, k, di, rank);
167        });
168    });
169}
170
171#[test]
172fn gglwe_automorphisk_key_compressed_encrypt_sk() {
173    let log_n: usize = 8;
174    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
175    let basek: usize = 12;
176    let k: usize = 60;
177    let digits: usize = k.div_ceil(basek) - 1;
178    (1..4).for_each(|rank| {
179        (2..digits + 1).for_each(|di| {
180            println!(
181                "test_gglwe_automorphisk_key_compressed_encrypt_sk digits: {} rank: {}",
182                di, rank
183            );
184            test_gglwe_automorphisk_key_compressed_encrypt_sk(&module, basek, k, di, rank);
185        });
186    });
187}
188
189#[test]
190fn gglwe_automorphism_key_automorphism() {
191    let log_n: usize = 8;
192    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
193    let basek: usize = 12;
194    let k_in: usize = 60;
195    let k_out: usize = 40;
196    let digits: usize = k_in.div_ceil(basek);
197    (1..4).for_each(|rank| {
198        (2..digits + 1).for_each(|di| {
199            println!(
200                "test_gglwe_automorphism_key_automorphism: {} rank: {}",
201                di, rank
202            );
203            let k_apply: usize = (digits + di) * basek;
204            test_gglwe_automorphism_key_automorphism(&module, -1, 5, basek, di, k_in, k_out, k_apply, rank);
205        });
206    });
207}
208
209#[test]
210fn gglwe_automorphism_key_automorphism_inplace() {
211    let log_n: usize = 8;
212    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
213    let basek: usize = 12;
214    let k_in: usize = 60;
215    let digits: usize = k_in.div_ceil(basek);
216    (1..4).for_each(|rank| {
217        (2..digits + 1).for_each(|di| {
218            println!(
219                "test_gglwe_automorphism_key_automorphism_inplace: {} rank: {}",
220                di, rank
221            );
222            let k_apply: usize = (digits + di) * basek;
223            test_gglwe_automorphism_key_automorphism_inplace(&module, -1, 5, basek, di, k_in, k_apply, rank);
224        });
225    });
226}
227
228#[test]
229fn glwe_tensor_key_encrypt_sk() {
230    let log_n: usize = 8;
231    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
232    (1..4).for_each(|rank| {
233        println!("test_glwe_tensor_key_encrypt_sk rank: {}", rank);
234        test_glwe_tensor_key_encrypt_sk(&module, 16, 54, rank);
235    });
236}
237
238#[test]
239fn glwe_tensor_key_compressed_encrypt_sk() {
240    let log_n: usize = 8;
241    let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
242    (1..4).for_each(|rank| {
243        println!("test_glwe_tensor_key_compressed_encrypt_sk rank: {}", rank);
244        test_glwe_tensor_key_compressed_encrypt_sk(&module, 16, 54, rank);
245    });
246}