arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/base2k/src/scalar_znx_dft_ops.rs
base2k/src/scalar_znx_dft_ops.rsRaw
 1use crate::ffi::svp::{self, svp_ppol_t};
 2use crate::ffi::vec_znx_dft::vec_znx_dft_t;
 3use crate::znx_base::{ZnxAlloc, ZnxInfos, ZnxLayout, ZnxSliceSize};
 4use crate::{Backend, FFT64, Module, SCALAR_ZNX_DFT_ROWS, SCALAR_ZNX_DFT_SIZE, Scalar, ScalarZnxDft, VecZnx, VecZnxDft};
 5
 6pub trait ScalarZnxDftOps<B: Backend> {
 7    fn new_scalar_znx_dft(&self, cols: usize) -> ScalarZnxDft<B>;
 8    fn bytes_of_scalar_znx_dft(&self, cols: usize) -> usize;
 9    fn new_scalar_znx_dft_from_bytes(&self, cols: usize, bytes: Vec<u8>) -> ScalarZnxDft<B>;
10    fn new_scalar_znx_dft_from_bytes_borrow(&self, cols: usize, bytes: &mut [u8]) -> ScalarZnxDft<B>;
11    fn svp_prepare(&self, res: &mut ScalarZnxDft<B>, res_col: usize, a: &Scalar, a_col: usize);
12    fn svp_apply_dft(&self, res: &mut VecZnxDft<B>, res_col: usize, a: &ScalarZnxDft<B>, a_col: usize, b: &VecZnx, b_col: usize);
13}
14
15impl ScalarZnxDftOps<FFT64> for Module<FFT64> {
16    fn new_scalar_znx_dft(&self, cols: usize) -> ScalarZnxDft<FFT64> {
17        ScalarZnxDft::<FFT64>::new(&self, SCALAR_ZNX_DFT_ROWS, cols, SCALAR_ZNX_DFT_SIZE)
18    }
19
20    fn bytes_of_scalar_znx_dft(&self, cols: usize) -> usize {
21        ScalarZnxDft::<FFT64>::bytes_of(self, SCALAR_ZNX_DFT_ROWS, cols, SCALAR_ZNX_DFT_SIZE)
22    }
23
24    fn new_scalar_znx_dft_from_bytes(&self, cols: usize, bytes: Vec<u8>) -> ScalarZnxDft<FFT64> {
25        ScalarZnxDft::from_bytes(self, SCALAR_ZNX_DFT_ROWS, cols, SCALAR_ZNX_DFT_SIZE, bytes)
26    }
27
28    fn new_scalar_znx_dft_from_bytes_borrow(&self, cols: usize, bytes: &mut [u8]) -> ScalarZnxDft<FFT64> {
29        ScalarZnxDft::from_bytes_borrow(self, SCALAR_ZNX_DFT_ROWS, cols, SCALAR_ZNX_DFT_SIZE, bytes)
30    }
31
32    fn svp_prepare(&self, res: &mut ScalarZnxDft<FFT64>, res_col: usize, a: &Scalar, a_col: usize) {
33        unsafe {
34            svp::svp_prepare(
35                self.ptr,
36                res.at_mut_ptr(res_col, 0) as *mut svp_ppol_t,
37                a.at_ptr(a_col, 0),
38            )
39        }
40    }
41
42    fn svp_apply_dft(
43        &self,
44        res: &mut VecZnxDft<FFT64>,
45        res_col: usize,
46        a: &ScalarZnxDft<FFT64>,
47        a_col: usize,
48        b: &VecZnx,
49        b_col: usize,
50    ) {
51        unsafe {
52            svp::svp_apply_dft(
53                self.ptr,
54                res.at_mut_ptr(res_col, 0) as *mut vec_znx_dft_t,
55                res.size() as u64,
56                a.at_ptr(a_col, 0) as *const svp_ppol_t,
57                b.at_ptr(b_col, 0),
58                b.size() as u64,
59                b.sl() as u64,
60            )
61        }
62    }
63}