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::{ZnxInfos, ZnxView, ZnxViewMut};
4use crate::{Backend, FFT64, Module, Scalar, ScalarZnxDft, ScalarZnxDftOwned, VecZnx, VecZnxDft};
5
6pub trait ScalarZnxDftAlloc<B> {
7 fn new_scalar_znx_dft(&self, cols: usize) -> ScalarZnxDftOwned<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>) -> ScalarZnxDftOwned<B>;
10 // fn new_scalar_znx_dft_from_bytes_borrow(&self, cols: usize, bytes: &mut [u8]) -> ScalarZnxDft<B>;
11}
12
13pub trait ScalarZnxDftOps<DataMut, Data, B: Backend> {
14 fn svp_prepare(&self, res: &mut ScalarZnxDft<DataMut, B>, res_col: usize, a: &Scalar<Data>, a_col: usize);
15 fn svp_apply_dft(
16 &self,
17 res: &mut VecZnxDft<DataMut, B>,
18 res_col: usize,
19 a: &ScalarZnxDft<Data, B>,
20 a_col: usize,
21 b: &VecZnx<Data>,
22 b_col: usize,
23 );
24}
25
26impl<B: Backend> ScalarZnxDftAlloc<B> for Module<B> {
27 fn new_scalar_znx_dft(&self, cols: usize) -> ScalarZnxDftOwned<B> {
28 ScalarZnxDftOwned::new(self, cols)
29 }
30
31 fn bytes_of_scalar_znx_dft(&self, cols: usize) -> usize {
32 ScalarZnxDftOwned::bytes_of(self, cols)
33 }
34
35 fn new_scalar_znx_dft_from_bytes(&self, cols: usize, bytes: Vec<u8>) -> ScalarZnxDftOwned<B> {
36 ScalarZnxDftOwned::new_from_bytes(self, cols, bytes)
37 }
38
39 // fn new_scalar_znx_dft_from_bytes_borrow(&self, cols: usize, bytes: &mut [u8]) -> ScalarZnxDft<FFT64> {
40 // ScalarZnxDft::from_bytes_borrow(self, SCALAR_ZNX_DFT_ROWS, cols, SCALAR_ZNX_DFT_SIZE, bytes)
41 // }
42}
43
44impl<DataMut, Data> ScalarZnxDftOps<DataMut, Data, FFT64> for Module<FFT64>
45where
46 DataMut: AsMut<[u8]> + AsRef<[u8]>,
47 Data: AsRef<[u8]>,
48{
49 fn svp_prepare(&self, res: &mut ScalarZnxDft<DataMut, FFT64>, res_col: usize, a: &Scalar<Data>, a_col: usize) {
50 unsafe {
51 svp::svp_prepare(
52 self.ptr,
53 res.at_mut_ptr(res_col, 0) as *mut svp_ppol_t,
54 a.at_ptr(a_col, 0),
55 )
56 }
57 }
58
59 fn svp_apply_dft(
60 &self,
61 res: &mut VecZnxDft<DataMut, FFT64>,
62 res_col: usize,
63 a: &ScalarZnxDft<Data, FFT64>,
64 a_col: usize,
65 b: &VecZnx<Data>,
66 b_col: usize,
67 ) {
68 unsafe {
69 svp::svp_apply_dft(
70 self.ptr,
71 res.at_mut_ptr(res_col, 0) as *mut vec_znx_dft_t,
72 res.size() as u64,
73 a.at_ptr(a_col, 0) as *const svp_ppol_t,
74 b.at_ptr(b_col, 0),
75 b.size() as u64,
76 b.sl() as u64,
77 )
78 }
79 }
80}