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