arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-schemes/src/bin_fhe/blind_rotation/tests/test_suite/generic_lut.rs
poulpy-schemes/src/bin_fhe/blind_rotation/tests/test_suite/generic_lut.rsRaw
 1use std::vec;
 2
 3use poulpy_hal::api::ModuleN;
 4
 5use crate::bin_fhe::blind_rotation::{DivRound, LookUpTableLayout, LookupTable, LookupTableFactory};
 6
 7pub fn test_lut_standard<M>(module: &M)
 8where
 9    M: LookupTableFactory + ModuleN,
10{
11    let base2k: usize = 20;
12    let k_lut: usize = 40;
13    let message_modulus: usize = 16;
14    let extension_factor: usize = 1;
15
16    let log_scale: usize = base2k + 1;
17
18    let mut f: Vec<i64> = vec![0i64; message_modulus];
19    f.iter_mut().enumerate().for_each(|(i, x)| *x = (i as i64) - 8);
20
21    let lut_infos: LookUpTableLayout = LookUpTableLayout {
22        n: module.n().into(),
23        extension_factor,
24        k: k_lut.into(),
25        base2k: base2k.into(),
26    };
27
28    let mut lut: LookupTable = LookupTable::alloc(&lut_infos);
29    lut.set(module, &f, log_scale);
30
31    let half_step: i64 = lut.domain_size().div_round(message_modulus << 1) as i64;
32    lut.rotate(module, half_step);
33
34    let step: usize = lut.domain_size().div_round(message_modulus);
35
36    let mut lut_dec: Vec<i64> = vec![0i64; module.n()];
37    lut.data[0].decode_vec_i64(base2k, 0, log_scale, &mut lut_dec);
38
39    (0..lut.domain_size()).step_by(step).for_each(|i| {
40        (0..step).for_each(|_| {
41            assert_eq!(f[i / step] % message_modulus as i64, lut_dec[i]);
42        });
43    });
44}
45
46pub fn test_lut_extended<M>(module: &M)
47where
48    M: LookupTableFactory + ModuleN,
49{
50    let base2k: usize = 20;
51    let k_lut: usize = 40;
52    let message_modulus: usize = 16;
53    let extension_factor: usize = 4;
54
55    let log_scale: usize = base2k + 1;
56
57    let mut f: Vec<i64> = vec![0i64; message_modulus];
58    f.iter_mut().enumerate().for_each(|(i, x)| *x = (i as i64) - 8);
59
60    let lut_infos: LookUpTableLayout = LookUpTableLayout {
61        n: module.n().into(),
62        extension_factor,
63        k: k_lut.into(),
64        base2k: base2k.into(),
65    };
66
67    let mut lut: LookupTable = LookupTable::alloc(&lut_infos);
68    lut.set(module, &f, log_scale);
69
70    let half_step: i64 = lut.domain_size().div_round(message_modulus << 1) as i64;
71    lut.rotate(module, half_step);
72
73    let step: usize = module.n().div_round(message_modulus);
74
75    let mut lut_dec: Vec<i64> = vec![0i64; module.n()];
76
77    (0..extension_factor).for_each(|ext| {
78        lut.data[ext].decode_vec_i64(base2k, 0, log_scale, &mut lut_dec);
79        (0..module.n()).step_by(step).for_each(|i| {
80            (0..step).for_each(|_| {
81                assert_eq!(f[i / step] % message_modulus as i64, lut_dec[i]);
82            });
83        });
84    });
85}