Skip to main content

poulpy_hal/delegates/
vec_znx_big.rs

1use crate::{
2    api::{
3        VecZnxBigAddAssign, VecZnxBigAddInto, VecZnxBigAddNormal, VecZnxBigAddNormalBackend, VecZnxBigAddSmallAssign,
4        VecZnxBigAddSmallIntoBackend, VecZnxBigAlloc, VecZnxBigAutomorphism, VecZnxBigAutomorphismAssign,
5        VecZnxBigAutomorphismAssignTmpBytes, VecZnxBigBytesOf, VecZnxBigFromBytes, VecZnxBigFromSmallBackend,
6        VecZnxBigInnerSumBackend, VecZnxBigNegate, VecZnxBigNegateAssign, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes,
7        VecZnxBigSub, VecZnxBigSubAssign, VecZnxBigSubNegateAssign, VecZnxBigSubSmallABackend, VecZnxBigSubSmallAssign,
8        VecZnxBigSubSmallBBackend, VecZnxBigSubSmallNegateAssign, VecZnxScalarProduct,
9    },
10    layouts::{
11        Backend, Module, NoiseInfos, ScalarZnxBackendRef, ScratchArena, VecZnxBackendMut, VecZnxBackendRef, VecZnxBig,
12        VecZnxBigBackendMut, VecZnxBigBackendRef, VecZnxBigOwned,
13    },
14    oep::HalVecZnxBigImpl,
15    source::Source,
16};
17
18macro_rules! impl_vec_znx_big_delegate {
19    ($trait:ty, $($body:item)+) => {
20        impl<B> $trait for Module<B>
21        where
22            B: Backend + HalVecZnxBigImpl<B>,
23        {
24            $($body)+
25        }
26    };
27}
28
29impl_vec_znx_big_delegate!(
30    VecZnxBigFromSmallBackend<B>,
31    fn vec_znx_big_from_small_backend(
32        &self,
33        res: &mut VecZnxBigBackendMut<'_, B>,
34        res_col: usize,
35        a: &VecZnxBackendRef<'_, B>,
36        a_col: usize,
37    ) {
38        B::vec_znx_big_from_small_backend(res, res_col, a, a_col);
39    }
40);
41
42impl<B: Backend> VecZnxBigAlloc<B> for Module<B> {
43    fn vec_znx_big_alloc(&self, cols: usize, size: usize) -> VecZnxBigOwned<B> {
44        self.vec_znx_big_alloc_n(self.n(), cols, size)
45    }
46
47    fn vec_znx_big_alloc_n(&self, n: usize, cols: usize, size: usize) -> VecZnxBigOwned<B> {
48        VecZnxBigOwned::alloc(n, cols, size)
49    }
50}
51
52impl<B: Backend> VecZnxBigFromBytes<B> for Module<B> {
53    fn vec_znx_big_from_bytes(&self, cols: usize, size: usize, bytes: Vec<u8>) -> VecZnxBigOwned<B> {
54        self.vec_znx_big_from_bytes_n(self.n(), cols, size, bytes)
55    }
56
57    fn vec_znx_big_from_bytes_n(&self, n: usize, cols: usize, size: usize, bytes: Vec<u8>) -> VecZnxBigOwned<B> {
58        VecZnxBig::<B::OwnedBuf, B>::from_bytes(n, cols, size, bytes)
59    }
60}
61
62impl<B: Backend> VecZnxBigBytesOf for Module<B> {
63    fn bytes_of_vec_znx_big(&self, cols: usize, size: usize) -> usize {
64        self.bytes_of_vec_znx_big_n(self.n(), cols, size)
65    }
66
67    fn bytes_of_vec_znx_big_n(&self, n: usize, cols: usize, size: usize) -> usize {
68        B::bytes_of_vec_znx_big(n, cols, size)
69    }
70}
71
72impl_vec_znx_big_delegate!(
73    VecZnxBigAddNormal<B>,
74    fn vec_znx_big_add_normal(
75        &self,
76        base2k: usize,
77        res: &mut VecZnxBigBackendMut<'_, B>,
78        res_col: usize,
79        noise_infos: NoiseInfos,
80        source: &mut Source,
81    ) {
82        B::vec_znx_big_add_normal_backend(self, base2k, res, res_col, noise_infos, source.new_seed());
83    }
84);
85
86impl_vec_znx_big_delegate!(
87    VecZnxBigAddNormalBackend<B>,
88    fn vec_znx_big_add_normal_backend(
89        &self,
90        base2k: usize,
91        res: &mut VecZnxBigBackendMut<'_, B>,
92        res_col: usize,
93        noise_infos: NoiseInfos,
94        seed: [u8; 32],
95    ) {
96        B::vec_znx_big_add_normal_backend(self, base2k, res, res_col, noise_infos, seed);
97    }
98);
99
100impl_vec_znx_big_delegate!(
101    VecZnxBigAddInto<B>,
102    fn vec_znx_big_add_into(
103        &self,
104        res: &mut VecZnxBigBackendMut<'_, B>,
105        res_col: usize,
106        a: &VecZnxBigBackendRef<'_, B>,
107        a_col: usize,
108        b: &VecZnxBigBackendRef<'_, B>,
109        b_col: usize,
110    ) {
111        B::vec_znx_big_add_into(self, res, res_col, a, a_col, b, b_col);
112    }
113);
114
115impl_vec_znx_big_delegate!(
116    VecZnxBigAddAssign<B>,
117    fn vec_znx_big_add_assign(
118        &self,
119        res: &mut VecZnxBigBackendMut<'_, B>,
120        res_col: usize,
121        a: &VecZnxBigBackendRef<'_, B>,
122        a_col: usize,
123    ) {
124        B::vec_znx_big_add_assign(self, res, res_col, a, a_col);
125    }
126);
127
128impl_vec_znx_big_delegate!(
129    VecZnxBigAddSmallIntoBackend<B>,
130    fn vec_znx_big_add_small_into_backend(
131        &self,
132        res: &mut VecZnxBigBackendMut<'_, B>,
133        res_col: usize,
134        a: &VecZnxBigBackendRef<'_, B>,
135        a_col: usize,
136        b: &VecZnxBackendRef<'_, B>,
137        b_col: usize,
138    ) {
139        B::vec_znx_big_add_small_into_backend(self, res, res_col, a, a_col, b, b_col);
140    }
141);
142
143impl_vec_znx_big_delegate!(
144    VecZnxBigAddSmallAssign<B>,
145    fn vec_znx_big_add_small_assign(
146        &self,
147        res: &mut VecZnxBigBackendMut<'_, B>,
148        res_col: usize,
149        a: &VecZnxBackendRef<'_, B>,
150        a_col: usize,
151    ) {
152        B::vec_znx_big_add_small_assign(self, res, res_col, a, a_col);
153    }
154);
155
156impl_vec_znx_big_delegate!(
157    VecZnxBigSub<B>,
158    fn vec_znx_big_sub(
159        &self,
160        res: &mut VecZnxBigBackendMut<'_, B>,
161        res_col: usize,
162        a: &VecZnxBigBackendRef<'_, B>,
163        a_col: usize,
164        b: &VecZnxBigBackendRef<'_, B>,
165        b_col: usize,
166    ) {
167        B::vec_znx_big_sub(self, res, res_col, a, a_col, b, b_col);
168    }
169);
170
171impl_vec_znx_big_delegate!(
172    VecZnxBigSubAssign<B>,
173    fn vec_znx_big_sub_assign(
174        &self,
175        res: &mut VecZnxBigBackendMut<'_, B>,
176        res_col: usize,
177        a: &VecZnxBigBackendRef<'_, B>,
178        a_col: usize,
179    ) {
180        B::vec_znx_big_sub_assign(self, res, res_col, a, a_col);
181    }
182);
183
184impl_vec_znx_big_delegate!(
185    VecZnxBigSubNegateAssign<B>,
186    fn vec_znx_big_sub_negate_assign(
187        &self,
188        res: &mut VecZnxBigBackendMut<'_, B>,
189        res_col: usize,
190        a: &VecZnxBigBackendRef<'_, B>,
191        a_col: usize,
192    ) {
193        B::vec_znx_big_sub_negate_assign(self, res, res_col, a, a_col);
194    }
195);
196
197impl_vec_znx_big_delegate!(
198    VecZnxBigSubSmallABackend<B>,
199    fn vec_znx_big_sub_small_a_backend(
200        &self,
201        res: &mut VecZnxBigBackendMut<'_, B>,
202        res_col: usize,
203        a: &VecZnxBackendRef<'_, B>,
204        a_col: usize,
205        b: &VecZnxBigBackendRef<'_, B>,
206        b_col: usize,
207    ) {
208        B::vec_znx_big_sub_small_a_backend(self, res, res_col, a, a_col, b, b_col);
209    }
210);
211
212impl_vec_znx_big_delegate!(
213    VecZnxBigSubSmallAssign<B>,
214    fn vec_znx_big_sub_small_assign(
215        &self,
216        res: &mut VecZnxBigBackendMut<'_, B>,
217        res_col: usize,
218        a: &VecZnxBackendRef<'_, B>,
219        a_col: usize,
220    ) {
221        B::vec_znx_big_sub_small_assign(self, res, res_col, a, a_col);
222    }
223);
224
225impl_vec_znx_big_delegate!(
226    VecZnxBigSubSmallBBackend<B>,
227    fn vec_znx_big_sub_small_b_backend(
228        &self,
229        res: &mut VecZnxBigBackendMut<'_, B>,
230        res_col: usize,
231        a: &VecZnxBigBackendRef<'_, B>,
232        a_col: usize,
233        b: &VecZnxBackendRef<'_, B>,
234        b_col: usize,
235    ) {
236        B::vec_znx_big_sub_small_b_backend(self, res, res_col, a, a_col, b, b_col);
237    }
238);
239
240impl_vec_znx_big_delegate!(
241    VecZnxBigSubSmallNegateAssign<B>,
242    fn vec_znx_big_sub_small_negate_assign(
243        &self,
244        res: &mut VecZnxBigBackendMut<'_, B>,
245        res_col: usize,
246        a: &VecZnxBackendRef<'_, B>,
247        a_col: usize,
248    ) {
249        B::vec_znx_big_sub_small_negate_assign(self, res, res_col, a, a_col);
250    }
251);
252
253impl_vec_znx_big_delegate!(
254    VecZnxBigInnerSumBackend<B>,
255    fn vec_znx_big_inner_sum_backend(
256        &self,
257        res: &mut VecZnxBigBackendMut<'_, B>,
258        res_col: usize,
259        res_coeff: usize,
260        a: &VecZnxBigBackendRef<'_, B>,
261        a_col: usize,
262    ) {
263        B::vec_znx_big_inner_sum_backend(self, res, res_col, res_coeff, a, a_col);
264    }
265);
266
267impl_vec_znx_big_delegate!(
268    VecZnxScalarProduct<B>,
269    fn vec_znx_scalar_product(
270        &self,
271        res: &mut VecZnxBigBackendMut<'_, B>,
272        res_col: usize,
273        a: &VecZnxBackendRef<'_, B>,
274        a_col: usize,
275        b: &ScalarZnxBackendRef<'_, B>,
276        b_col: usize,
277    ) {
278        B::vec_znx_scalar_product(self, res, res_col, a, a_col, b, b_col);
279    }
280);
281
282impl_vec_znx_big_delegate!(
283    VecZnxBigNegate<B>,
284    fn vec_znx_big_negate(
285        &self,
286        res: &mut VecZnxBigBackendMut<'_, B>,
287        res_col: usize,
288        a: &VecZnxBigBackendRef<'_, B>,
289        a_col: usize,
290    ) {
291        B::vec_znx_big_negate(self, res, res_col, a, a_col);
292    }
293);
294
295impl_vec_znx_big_delegate!(
296    VecZnxBigNegateAssign<B>,
297    fn vec_znx_big_negate_assign(&self, a: &mut VecZnxBigBackendMut<'_, B>, a_col: usize) {
298        B::vec_znx_big_negate_assign(self, a, a_col);
299    }
300);
301
302impl_vec_znx_big_delegate!(
303    VecZnxBigNormalizeTmpBytes,
304    fn vec_znx_big_normalize_tmp_bytes(&self) -> usize {
305        B::vec_znx_big_normalize_tmp_bytes(self)
306    }
307);
308
309impl_vec_znx_big_delegate!(
310    VecZnxBigNormalize<B>,
311    fn vec_znx_big_normalize(
312        &self,
313        res: &mut VecZnxBackendMut<'_, B>,
314        res_base2k: usize,
315        res_offset: i64,
316        res_col: usize,
317        a: &VecZnxBigBackendRef<'_, B>,
318        a_base2k: usize,
319        a_col: usize,
320        scratch: &mut ScratchArena<'_, B>,
321    ) {
322        B::vec_znx_big_normalize(self, res, res_base2k, res_offset, res_col, a, a_base2k, a_col, scratch)
323    }
324);
325
326impl_vec_znx_big_delegate!(
327    VecZnxBigAutomorphism<B>,
328    fn vec_znx_big_automorphism(
329        &self,
330        k: i64,
331        res: &mut VecZnxBigBackendMut<'_, B>,
332        res_col: usize,
333        a: &VecZnxBigBackendRef<'_, B>,
334        a_col: usize,
335    ) {
336        B::vec_znx_big_automorphism(self, k, res, res_col, a, a_col);
337    }
338);
339
340impl_vec_znx_big_delegate!(
341    VecZnxBigAutomorphismAssignTmpBytes,
342    fn vec_znx_big_automorphism_assign_tmp_bytes(&self) -> usize {
343        B::vec_znx_big_automorphism_assign_tmp_bytes(self)
344    }
345);
346
347impl_vec_znx_big_delegate!(
348    VecZnxBigAutomorphismAssign<B>,
349    fn vec_znx_big_automorphism_assign(
350        &self,
351        k: i64,
352        a: &mut VecZnxBigBackendMut<'_, B>,
353        a_col: usize,
354        scratch: &mut ScratchArena<'_, B>,
355    ) {
356        B::vec_znx_big_automorphism_assign(self, k, a, a_col, scratch)
357    }
358);