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
 55impl<D: From<Vec<u8>>, B: Backend> ScalarZnxDft<D, B> {
 56    pub(crate) fn bytes_of(module: &Module<B>, cols: usize) -> usize {
 57        unsafe { svp::bytes_of_svp_ppol(module.ptr) as usize * cols }
 58    }
 59
 60    pub(crate) fn new(module: &Module<B>, cols: usize) -> Self {
 61        let data = alloc_aligned::<u8>(Self::bytes_of(module, cols));
 62        Self {
 63            data: data.into(),
 64            n: module.n(),
 65            cols,
 66            _phantom: PhantomData,
 67        }
 68    }
 69
 70    pub(crate) fn new_from_bytes(module: &Module<B>, cols: usize, bytes: impl Into<Vec<u8>>) -> Self {
 71        let data: Vec<u8> = bytes.into();
 72        assert!(data.len() == Self::bytes_of(module, cols));
 73        Self {
 74            data: data.into(),
 75            n: module.n(),
 76            cols,
 77            _phantom: PhantomData,
 78        }
 79    }
 80}
 81
 82pub type ScalarZnxDftOwned<B> = ScalarZnxDft<Vec<u8>, B>;
 83
 84pub trait ScalarZnxDftToRef<B: Backend> {
 85    fn to_ref(&self) -> ScalarZnxDft<&[u8], B>;
 86}
 87
 88pub trait ScalarZnxDftToMut<B: Backend> {
 89    fn to_mut(&mut self) -> ScalarZnxDft<&mut [u8], B>;
 90}
 91
 92impl<B: Backend> ScalarZnxDftToMut<B> for ScalarZnxDft<Vec<u8>, B> {
 93    fn to_mut(&mut self) -> ScalarZnxDft<&mut [u8], B> {
 94        ScalarZnxDft {
 95            data: self.data.as_mut_slice(),
 96            n: self.n,
 97            cols: self.cols,
 98            _phantom: PhantomData,
 99        }
100    }
101}
102
103impl<B: Backend> ScalarZnxDftToRef<B> for ScalarZnxDft<Vec<u8>, B> {
104    fn to_ref(&self) -> ScalarZnxDft<&[u8], B> {
105        ScalarZnxDft {
106            data: self.data.as_slice(),
107            n: self.n,
108            cols: self.cols,
109            _phantom: PhantomData,
110        }
111    }
112}
113
114impl<B: Backend> ScalarZnxDftToMut<B> for ScalarZnxDft<&mut [u8], B> {
115    fn to_mut(&mut self) -> ScalarZnxDft<&mut [u8], B> {
116        ScalarZnxDft {
117            data: self.data,
118            n: self.n,
119            cols: self.cols,
120            _phantom: PhantomData,
121        }
122    }
123}
124
125impl<B: Backend> ScalarZnxDftToRef<B> for ScalarZnxDft<&mut [u8], B> {
126    fn to_ref(&self) -> ScalarZnxDft<&[u8], B> {
127        ScalarZnxDft {
128            data: self.data,
129            n: self.n,
130            cols: self.cols,
131            _phantom: PhantomData,
132        }
133    }
134}
135
136impl<B: Backend> ScalarZnxDftToRef<B> for ScalarZnxDft<&[u8], B> {
137    fn to_ref(&self) -> ScalarZnxDft<&[u8], B> {
138        ScalarZnxDft {
139            data: self.data,
140            n: self.n,
141            cols: self.cols,
142            _phantom: PhantomData,
143        }
144    }
145}