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}