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