arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/core/src/gglwe/keyswitch_key.rs
core/src/gglwe/keyswitch_key.rsRaw
  1use backend::{Backend, FFT64, MatZnxDft, MatZnxDftOps, Module};
  2
  3use crate::{FourierGLWECiphertext, GGLWECiphertext, GetRow, Infos, SetRow};
  4
  5pub struct GLWESwitchingKey<Data, B: Backend> {
  6    pub(crate) key: GGLWECiphertext<Data, B>,
  7    pub(crate) sk_in_n: usize,  // Degree of sk_in
  8    pub(crate) sk_out_n: usize, // Degree of sk_out
  9}
 10
 11impl GLWESwitchingKey<Vec<u8>, FFT64> {
 12    pub fn alloc(
 13        module: &Module<FFT64>,
 14        basek: usize,
 15        k: usize,
 16        rows: usize,
 17        digits: usize,
 18        rank_in: usize,
 19        rank_out: usize,
 20    ) -> Self {
 21        GLWESwitchingKey {
 22            key: GGLWECiphertext::alloc(module, basek, k, rows, digits, rank_in, rank_out),
 23            sk_in_n: 0,
 24            sk_out_n: 0,
 25        }
 26    }
 27
 28    pub fn bytes_of(
 29        module: &Module<FFT64>,
 30        basek: usize,
 31        k: usize,
 32        rows: usize,
 33        digits: usize,
 34        rank_in: usize,
 35        rank_out: usize,
 36    ) -> usize {
 37        GGLWECiphertext::<Vec<u8>, FFT64>::bytes_of(module, basek, k, rows, digits, rank_in, rank_out)
 38    }
 39}
 40
 41impl<T, B: Backend> Infos for GLWESwitchingKey<T, B> {
 42    type Inner = MatZnxDft<T, B>;
 43
 44    fn inner(&self) -> &Self::Inner {
 45        self.key.inner()
 46    }
 47
 48    fn basek(&self) -> usize {
 49        self.key.basek()
 50    }
 51
 52    fn k(&self) -> usize {
 53        self.key.k()
 54    }
 55}
 56
 57impl<T, B: Backend> GLWESwitchingKey<T, B> {
 58    pub fn rank(&self) -> usize {
 59        self.key.data.cols_out() - 1
 60    }
 61
 62    pub fn rank_in(&self) -> usize {
 63        self.key.data.cols_in()
 64    }
 65
 66    pub fn rank_out(&self) -> usize {
 67        self.key.data.cols_out() - 1
 68    }
 69
 70    pub fn digits(&self) -> usize {
 71        self.key.digits()
 72    }
 73
 74    pub fn sk_degree_in(&self) -> usize {
 75        self.sk_in_n
 76    }
 77
 78    pub fn sk_degree_out(&self) -> usize {
 79        self.sk_out_n
 80    }
 81}
 82
 83impl<C: AsRef<[u8]>> GetRow<FFT64> for GLWESwitchingKey<C, FFT64> {
 84    fn get_row<R: AsMut<[u8]> + AsRef<[u8]>>(
 85        &self,
 86        module: &Module<FFT64>,
 87        row_i: usize,
 88        col_j: usize,
 89        res: &mut FourierGLWECiphertext<R, FFT64>,
 90    ) {
 91        module.mat_znx_dft_get_row(&mut res.data, &self.key.data, row_i, col_j);
 92    }
 93}
 94
 95impl<C: AsMut<[u8]> + AsRef<[u8]>> SetRow<FFT64> for GLWESwitchingKey<C, FFT64> {
 96    fn set_row<R: AsRef<[u8]>>(
 97        &mut self,
 98        module: &Module<FFT64>,
 99        row_i: usize,
100        col_j: usize,
101        a: &FourierGLWECiphertext<R, FFT64>,
102    ) {
103        module.mat_znx_dft_set_row(&mut self.key.data, row_i, col_j, &a.data);
104    }
105}