poulpy/core/src/gglwe/test/gglwe_fft64.rs
core/src/gglwe/test/gglwe_fft64.rsRaw
1use backend::{
2 hal::{api::ModuleNew, layouts::Module},
3 implementation::cpu_spqlios::FFT64,
4};
5
6use crate::gglwe::test::gglwe_generic::{
7 test_encrypt_sk, test_external_product, test_external_product_inplace, test_keyswitch, test_keyswitch_inplace,
8};
9
10#[test]
11fn encrypt_sk() {
12 let log_n: usize = 8;
13 let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
14 let basek: usize = 12;
15 let k_ksk: usize = 54;
16 let digits: usize = k_ksk / basek;
17 (1..4).for_each(|rank_in| {
18 (1..4).for_each(|rank_out| {
19 (1..digits + 1).for_each(|di| {
20 println!(
21 "test encrypt_sk digits: {} ranks: ({} {})",
22 di, rank_in, rank_out
23 );
24 test_encrypt_sk(&module, basek, k_ksk, di, rank_in, rank_out, 3.2);
25 });
26 });
27 });
28}
29
30#[test]
31fn keyswitch() {
32 let log_n: usize = 8;
33 let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
34 let basek: usize = 12;
35 let k_in: usize = 60;
36 let digits: usize = k_in.div_ceil(basek);
37 (1..4).for_each(|rank_in_s0s1| {
38 (1..4).for_each(|rank_out_s0s1| {
39 (1..4).for_each(|rank_out_s1s2| {
40 (1..digits + 1).for_each(|di| {
41 let k_ksk: usize = k_in + basek * di;
42 println!(
43 "test key_switch digits: {} ranks: ({},{},{})",
44 di, rank_in_s0s1, rank_out_s0s1, rank_out_s1s2
45 );
46 let k_out: usize = k_ksk; // Better capture noise.
47 test_keyswitch(
48 &module,
49 basek,
50 k_out,
51 k_in,
52 k_ksk,
53 di,
54 rank_in_s0s1,
55 rank_out_s0s1,
56 rank_out_s1s2,
57 3.2,
58 );
59 })
60 })
61 });
62 });
63}
64
65#[test]
66fn keyswitch_inplace() {
67 let log_n: usize = 8;
68 let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
69 let basek: usize = 12;
70 let k_ct: usize = 60;
71 let digits: usize = k_ct.div_ceil(basek);
72 (1..4).for_each(|rank_in_s0s1| {
73 (1..4).for_each(|rank_out_s0s1| {
74 (1..digits + 1).for_each(|di| {
75 let k_ksk: usize = k_ct + basek * di;
76 println!(
77 "test key_switch_inplace digits: {} ranks: ({},{})",
78 di, rank_in_s0s1, rank_out_s0s1
79 );
80 test_keyswitch_inplace(
81 &module,
82 basek,
83 k_ct,
84 k_ksk,
85 di,
86 rank_in_s0s1,
87 rank_out_s0s1,
88 3.2,
89 );
90 });
91 });
92 });
93}
94
95#[test]
96fn external_product() {
97 let log_n: usize = 8;
98 let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
99 let basek: usize = 12;
100 let k_in: usize = 60;
101 let digits: usize = k_in.div_ceil(basek);
102 (1..4).for_each(|rank_in| {
103 (1..4).for_each(|rank_out| {
104 (1..digits + 1).for_each(|di| {
105 let k_ggsw: usize = k_in + basek * di;
106 println!(
107 "test external_product digits: {} ranks: ({} {})",
108 di, rank_in, rank_out
109 );
110 let k_out: usize = k_in; // Better capture noise.
111 test_external_product(
112 &module, basek, k_out, k_in, k_ggsw, di, rank_in, rank_out, 3.2,
113 );
114 });
115 });
116 });
117}
118
119#[test]
120fn external_product_inplace() {
121 let log_n: usize = 5;
122 let module: Module<FFT64> = Module::<FFT64>::new(1 << log_n);
123 let basek: usize = 12;
124 let k_ct: usize = 60;
125 let digits: usize = k_ct.div_ceil(basek);
126 (1..4).for_each(|rank_in| {
127 (1..4).for_each(|rank_out| {
128 (1..digits).for_each(|di| {
129 let k_ggsw: usize = k_ct + basek * di;
130 println!(
131 "test external_product_inplace digits: {} ranks: ({} {})",
132 di, rank_in, rank_out
133 );
134 test_external_product_inplace(&module, basek, k_ct, k_ggsw, di, rank_in, rank_out, 3.2);
135 });
136 });
137 });
138}