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