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}