Skip to main content

poulpy_core/delegates/
keyswitching.rs

1use poulpy_hal::layouts::{Backend, Module, ScratchArena};
2
3use crate::{
4    api::{GGLWEKeyswitch, GGSWKeyswitch, GLWEKeyswitch, LWEKeyswitch},
5    layouts::{
6        GGLWEInfos, GGLWEToBackendMut, GGLWEToBackendRef, GGSWInfos, GGSWToBackendMut, GGSWToBackendRef, GLWEInfos,
7        GLWEToBackendMut, GLWEToBackendRef, LWEInfos, LWEToBackendMut, LWEToBackendRef,
8        prepared::{GGLWEPreparedToBackendRef, GGLWEToGGSWKeyPreparedToBackendRef},
9    },
10    oep::{GGLWEKeyswitchImpl, GGSWKeyswitchImpl, GLWEKeyswitchImpl, LWEKeyswitchImpl},
11};
12
13macro_rules! impl_keyswitching_delegate {
14    ($trait:ty, [$($bounds:tt)+], $($body:item)+) => {
15        impl<BE> $trait for Module<BE>
16        where
17            $($bounds)+
18        {
19            $($body)+
20        }
21    };
22}
23
24impl_keyswitching_delegate!(
25    GLWEKeyswitch<BE>,
26    [BE: Backend + GLWEKeyswitchImpl<BE>],
27    fn glwe_keyswitch_tmp_bytes<R, A, B>(&self, res_infos: &R, a_infos: &A, key_infos: &B) -> usize
28    where
29        R: GLWEInfos,
30        A: GLWEInfos,
31        B: GGLWEInfos,
32    {
33        BE::glwe_keyswitch_tmp_bytes(self, res_infos, a_infos, key_infos)
34    }
35
36    fn glwe_keyswitch<R, A, K>(&self, res: &mut R, a: &A, key: &K, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
37    where
38        R: GLWEToBackendMut<BE> + GLWEInfos,
39        A: GLWEToBackendRef<BE> + GLWEInfos,
40        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
41    {
42        BE::glwe_keyswitch(self, res, a, key, key_size, scratch)
43    }
44
45    fn glwe_keyswitch_assign<R, K>(&self, res: &mut R, key: &K, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
46    where
47        R: GLWEToBackendMut<BE> + GLWEInfos,
48        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
49    {
50        BE::glwe_keyswitch_assign(self, res, key, key_size, scratch)
51    }
52);
53
54impl_keyswitching_delegate!(
55    GGLWEKeyswitch<BE>,
56    [BE: Backend + GGLWEKeyswitchImpl<BE>],
57    fn gglwe_keyswitch_tmp_bytes<R, A, K>(&self, res_infos: &R, a_infos: &A, key_infos: &K) -> usize
58    where
59        R: GGLWEInfos,
60        A: GGLWEInfos,
61        K: GGLWEInfos,
62    {
63        BE::gglwe_keyswitch_tmp_bytes(self, res_infos, a_infos, key_infos)
64    }
65
66    fn gglwe_keyswitch<R, A, B>(&self, res: &mut R, a: &A, b: &B, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
67    where
68        R: GGLWEToBackendMut<BE> + GGLWEInfos,
69        A: GGLWEToBackendRef<BE> + GGLWEInfos,
70        B: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
71    {
72        BE::gglwe_keyswitch(self, res, a, b, key_size, scratch)
73    }
74
75    fn gglwe_keyswitch_assign<R, A>(&self, res: &mut R, a: &A, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
76    where
77        R: GGLWEToBackendMut<BE> + GGLWEInfos,
78        A: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
79    {
80        BE::gglwe_keyswitch_assign(self, res, a, key_size, scratch)
81    }
82);
83
84impl_keyswitching_delegate!(
85    GGSWKeyswitch<BE>,
86    [BE: Backend + GGSWKeyswitchImpl<BE>],
87    fn ggsw_keyswitch_tmp_bytes<R, A, K, T>(&self, res_infos: &R, a_infos: &A, key_infos: &K, tsk_infos: &T) -> usize
88    where
89        R: GGSWInfos,
90        A: GGSWInfos,
91        K: GGLWEInfos,
92        T: GGLWEInfos,
93    {
94        BE::ggsw_keyswitch_tmp_bytes(self, res_infos, a_infos, key_infos, tsk_infos)
95    }
96
97    fn ggsw_keyswitch<R, A, K, T>(
98        &self,
99        res: &mut R,
100        a: &A,
101        key: &K,
102        key_size: usize,
103        tsk: &T,
104        tsk_size: usize,
105        scratch: &mut ScratchArena<'_, BE>,
106    )
107    where
108        R: GGSWToBackendMut<BE> + GGSWInfos,
109        A: GGSWToBackendRef<BE> + GGSWInfos,
110        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
111        T: GGLWEToGGSWKeyPreparedToBackendRef<BE> + GGLWEInfos,
112    {
113        BE::ggsw_keyswitch(self, res, a, key, key_size, tsk, tsk_size, scratch)
114    }
115
116    fn ggsw_keyswitch_assign<R, K, T>(
117        &self,
118        res: &mut R,
119        key: &K,
120        key_size: usize,
121        tsk: &T,
122        tsk_size: usize,
123        scratch: &mut ScratchArena<'_, BE>,
124    )
125    where
126        R: GGSWToBackendMut<BE> + GGSWInfos,
127        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
128        T: GGLWEToGGSWKeyPreparedToBackendRef<BE> + GGLWEInfos,
129    {
130        BE::ggsw_keyswitch_assign(self, res, key, key_size, tsk, tsk_size, scratch)
131    }
132);
133
134impl_keyswitching_delegate!(
135    LWEKeyswitch<BE>,
136    [BE: Backend + LWEKeyswitchImpl<BE>],
137    fn lwe_keyswitch_tmp_bytes<R, A, K>(&self, res_infos: &R, a_infos: &A, key_infos: &K) -> usize
138    where
139        R: LWEInfos,
140        A: LWEInfos,
141        K: GGLWEInfos,
142    {
143        BE::lwe_keyswitch_tmp_bytes(self, res_infos, a_infos, key_infos)
144    }
145
146    fn lwe_keyswitch<R, A, K>(&self, res: &mut R, a: &A, ksk: &K, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
147    where
148        R: LWEToBackendMut<BE> + LWEInfos,
149        A: LWEToBackendRef<BE> + LWEInfos,
150        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
151    {
152        BE::lwe_keyswitch(self, res, a, ksk, key_size, scratch)
153    }
154);