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::{Backend, DataView, DataViewMut, FFT64, Module, ZnxSliceSize, ZnxView, alloc_aligned};
  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
 97pub type ScalarZnxDftOwned<B> = ScalarZnxDft<Vec<u8>, B>;
 98
 99pub trait ScalarZnxDftToRef<B: Backend> {
100    fn to_ref(&self) -> ScalarZnxDft<&[u8], B>;
101}
102
103pub trait ScalarZnxDftToMut<B: Backend> {
104    fn to_mut(&mut self) -> ScalarZnxDft<&mut [u8], B>;
105}
106
107impl<B: Backend> ScalarZnxDftToMut<B> for ScalarZnxDft<Vec<u8>, B> {
108    fn to_mut(&mut self) -> ScalarZnxDft<&mut [u8], B> {
109        ScalarZnxDft {
110            data: self.data.as_mut_slice(),
111            n: self.n,
112            cols: self.cols,
113            _phantom: PhantomData,
114        }
115    }
116}
117
118impl<B: Backend> ScalarZnxDftToRef<B> for ScalarZnxDft<Vec<u8>, B> {
119    fn to_ref(&self) -> ScalarZnxDft<&[u8], B> {
120        ScalarZnxDft {
121            data: self.data.as_slice(),
122            n: self.n,
123            cols: self.cols,
124            _phantom: PhantomData,
125        }
126    }
127}
128
129impl<B: Backend> ScalarZnxDftToMut<B> for ScalarZnxDft<&mut [u8], B> {
130    fn to_mut(&mut self) -> ScalarZnxDft<&mut [u8], B> {
131        ScalarZnxDft {
132            data: self.data,
133            n: self.n,
134            cols: self.cols,
135            _phantom: PhantomData,
136        }
137    }
138}
139
140impl<B: Backend> ScalarZnxDftToRef<B> for ScalarZnxDft<&mut [u8], B> {
141    fn to_ref(&self) -> ScalarZnxDft<&[u8], B> {
142        ScalarZnxDft {
143            data: self.data,
144            n: self.n,
145            cols: self.cols,
146            _phantom: PhantomData,
147        }
148    }
149}
150
151impl<B: Backend> ScalarZnxDftToRef<B> for ScalarZnxDft<&[u8], B> {
152    fn to_ref(&self) -> ScalarZnxDft<&[u8], B> {
153        ScalarZnxDft {
154            data: self.data,
155            n: self.n,
156            cols: self.cols,
157            _phantom: PhantomData,
158        }
159    }
160}