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