arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/base2k/src/scalar_znx_dft.rs
base2k/src/scalar_znx_dft.rsRaw
  1use std::marker::PhantomData;
  2
  3use crate::ffi::svp;
  4use crate::znx_base::ZnxInfos;
  5use crate::{alloc_aligned, Backend, DataView, DataViewMut, Module, VecZnxDft, VecZnxDftToMut, VecZnxDftToRef, ZnxSliceSize, ZnxView, FFT64};
  6
  7pub struct ScalarZnxDft<D, B: Backend> {
  8    data: D,
  9    n: usize,
 10    cols: usize,
 11    _phantom: PhantomData<B>,
 12}
 13
 14impl<D, B: Backend> ZnxInfos for ScalarZnxDft<D, B> {
 15    fn cols(&self) -> usize {
 16        self.cols
 17    }
 18
 19    fn rows(&self) -> usize {
 20        1
 21    }
 22
 23    fn n(&self) -> usize {
 24        self.n
 25    }
 26
 27    fn size(&self) -> usize {
 28        1
 29    }
 30}
 31
 32impl<D> ZnxSliceSize for ScalarZnxDft<D, FFT64> {
 33    fn sl(&self) -> usize {
 34        self.n()
 35    }
 36}
 37
 38impl<D, B: Backend> DataView for ScalarZnxDft<D, B> {
 39    type D = D;
 40    fn data(&self) -> &Self::D {
 41        &self.data
 42    }
 43}
 44
 45impl<D, B: Backend> DataViewMut for ScalarZnxDft<D, B> {
 46    fn data_mut(&mut self) -> &mut Self::D {
 47        &mut self.data
 48    }
 49}
 50
 51impl<D: AsRef<[u8]>> ZnxView for ScalarZnxDft<D, FFT64> {
 52    type Scalar = f64;
 53}
 54
 55pub(crate) fn bytes_of_scalar_znx_dft<B: Backend>(module: &Module<B>, cols: usize) -> usize {
 56    ScalarZnxDftOwned::bytes_of(module, cols)
 57}
 58
 59impl<D: From<Vec<u8>>, B: Backend> ScalarZnxDft<D, B> {
 60    pub(crate) fn bytes_of(module: &Module<B>, cols: usize) -> usize {
 61        unsafe { svp::bytes_of_svp_ppol(module.ptr) as usize * cols }
 62    }
 63
 64    pub(crate) fn new(module: &Module<B>, cols: usize) -> Self {
 65        let data = alloc_aligned::<u8>(Self::bytes_of(module, cols));
 66        Self {
 67            data: data.into(),
 68            n: module.n(),
 69            cols,
 70            _phantom: PhantomData,
 71        }
 72    }
 73
 74    pub(crate) fn new_from_bytes(module: &Module<B>, cols: usize, bytes: impl Into<Vec<u8>>) -> Self {
 75        let data: Vec<u8> = bytes.into();
 76        assert!(data.len() == Self::bytes_of(module, cols));
 77        Self {
 78            data: data.into(),
 79            n: module.n(),
 80            cols,
 81            _phantom: PhantomData,
 82        }
 83    }
 84}
 85
 86impl<D, B: Backend> ScalarZnxDft<D, B> {
 87    pub(crate) fn from_data(data: D, n: usize, cols: usize) -> Self {
 88        Self {
 89            data,
 90            n,
 91            cols,
 92            _phantom: PhantomData,
 93        }
 94    }
 95
 96    pub fn as_vec_znx_dft(self) -> VecZnxDft<D, B>{
 97        VecZnxDft{
 98            data: self.data,
 99            n: self.n,
100            cols: self.cols,
101            size: 1,
102            _phantom: PhantomData,
103        }
104    }
105}
106
107pub type ScalarZnxDftOwned<B> = ScalarZnxDft<Vec<u8>, B>;
108
109pub trait ScalarZnxDftToRef<B: Backend> {
110    fn to_ref(&self) -> ScalarZnxDft<&[u8], B>;
111}
112
113pub trait ScalarZnxDftToMut<B: Backend> {
114    fn to_mut(&mut self) -> ScalarZnxDft<&mut [u8], B>;
115}
116
117impl<B: Backend> ScalarZnxDftToMut<B> for ScalarZnxDft<Vec<u8>, B> {
118    fn to_mut(&mut self) -> ScalarZnxDft<&mut [u8], B> {
119        ScalarZnxDft {
120            data: self.data.as_mut_slice(),
121            n: self.n,
122            cols: self.cols,
123            _phantom: PhantomData,
124        }
125    }
126}
127
128impl<B: Backend> ScalarZnxDftToRef<B> for ScalarZnxDft<Vec<u8>, B> {
129    fn to_ref(&self) -> ScalarZnxDft<&[u8], B> {
130        ScalarZnxDft {
131            data: self.data.as_slice(),
132            n: self.n,
133            cols: self.cols,
134            _phantom: PhantomData,
135        }
136    }
137}
138
139impl<B: Backend> ScalarZnxDftToMut<B> for ScalarZnxDft<&mut [u8], B> {
140    fn to_mut(&mut self) -> ScalarZnxDft<&mut [u8], B> {
141        ScalarZnxDft {
142            data: self.data,
143            n: self.n,
144            cols: self.cols,
145            _phantom: PhantomData,
146        }
147    }
148}
149
150impl<B: Backend> ScalarZnxDftToRef<B> for ScalarZnxDft<&mut [u8], B> {
151    fn to_ref(&self) -> ScalarZnxDft<&[u8], B> {
152        ScalarZnxDft {
153            data: self.data,
154            n: self.n,
155            cols: self.cols,
156            _phantom: PhantomData,
157        }
158    }
159}
160
161impl<B: Backend> ScalarZnxDftToRef<B> for ScalarZnxDft<&[u8], B> {
162    fn to_ref(&self) -> ScalarZnxDft<&[u8], B> {
163        ScalarZnxDft {
164            data: self.data,
165            n: self.n,
166            cols: self.cols,
167            _phantom: PhantomData,
168        }
169    }
170}
171
172impl<B: Backend> VecZnxDftToMut<B> for ScalarZnxDft<Vec<u8>, B> {
173    fn to_mut(&mut self) -> VecZnxDft<&mut [u8], B> {
174        VecZnxDft {
175            data: self.data.as_mut_slice(),
176            n: self.n,
177            cols: self.cols,
178            size: 1,
179            _phantom: PhantomData,
180        }
181    }
182}
183
184impl<B: Backend> VecZnxDftToRef<B> for ScalarZnxDft<Vec<u8>, B> {
185    fn to_ref(&self) -> VecZnxDft<&[u8], B> {
186        VecZnxDft {
187            data: self.data.as_slice(),
188            n: self.n,
189            cols: self.cols,
190            size: 1,
191            _phantom: PhantomData,
192        }
193    }
194}
195
196impl<B: Backend> VecZnxDftToMut<B> for ScalarZnxDft<&mut [u8], B> {
197    fn to_mut(&mut self) -> VecZnxDft<&mut [u8], B> {
198        VecZnxDft {
199            data: self.data,
200            n: self.n,
201            cols: self.cols,
202            size: 1,
203            _phantom: PhantomData,
204        }
205    }
206}
207
208impl<B: Backend> VecZnxDftToRef<B> for ScalarZnxDft<&mut [u8], B> {
209    fn to_ref(&self) -> VecZnxDft<&[u8], B> {
210        VecZnxDft {
211            data: self.data,
212            n: self.n,
213            cols: self.cols,
214            size: 1,
215            _phantom: PhantomData,
216        }
217    }
218}
219
220impl<B: Backend> VecZnxDftToRef<B> for ScalarZnxDft<&[u8], B> {
221    fn to_ref(&self) -> VecZnxDft<&[u8], B> {
222        VecZnxDft {
223            data: self.data,
224            n: self.n,
225            cols: self.cols,
226            size: 1,
227            _phantom: PhantomData,
228        }
229    }
230}