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, VecZnxBigColWeightedSum, VecZnxBigFromBytes,
6        VecZnxBigFromSmallBackend, VecZnxBigInnerSumBackend, VecZnxBigNegate, VecZnxBigNegateAssign, VecZnxBigNormalize,
7        VecZnxBigNormalizeTmpBytes, VecZnxBigSub, VecZnxBigSubAssign, VecZnxBigSubNegateAssign, VecZnxBigSubSmallABackend,
8        VecZnxBigSubSmallAssign, 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    VecZnxBigColWeightedSum<B>,
269    fn vec_znx_big_col_weighted_sum(
270        &self,
271        res: &mut VecZnxBigBackendMut<'_, B>,
272        res_col: usize,
273        a: &VecZnxBackendRef<'_, B>,
274        weights: &ScalarZnxBackendRef<'_, B>,
275        weights_col: usize,
276        cols: usize,
277        coeffs: usize,
278    ) {
279        B::vec_znx_big_col_weighted_sum(self, res, res_col, a, weights, weights_col, cols, coeffs);
280    }
281);
282
283impl_vec_znx_big_delegate!(
284    VecZnxScalarProduct<B>,
285    fn vec_znx_scalar_product(
286        &self,
287        res: &mut VecZnxBigBackendMut<'_, B>,
288        res_col: usize,
289        a: &VecZnxBackendRef<'_, B>,
290        a_col: usize,
291        b: &ScalarZnxBackendRef<'_, B>,
292        b_col: usize,
293    ) {
294        B::vec_znx_scalar_product(self, res, res_col, a, a_col, b, b_col);
295    }
296);
297
298impl_vec_znx_big_delegate!(
299    VecZnxBigNegate<B>,
300    fn vec_znx_big_negate(
301        &self,
302        res: &mut VecZnxBigBackendMut<'_, B>,
303        res_col: usize,
304        a: &VecZnxBigBackendRef<'_, B>,
305        a_col: usize,
306    ) {
307        B::vec_znx_big_negate(self, res, res_col, a, a_col);
308    }
309);
310
311impl_vec_znx_big_delegate!(
312    VecZnxBigNegateAssign<B>,
313    fn vec_znx_big_negate_assign(&self, a: &mut VecZnxBigBackendMut<'_, B>, a_col: usize) {
314        B::vec_znx_big_negate_assign(self, a, a_col);
315    }
316);
317
318impl_vec_znx_big_delegate!(
319    VecZnxBigNormalizeTmpBytes,
320    fn vec_znx_big_normalize_tmp_bytes(&self) -> usize {
321        B::vec_znx_big_normalize_tmp_bytes(self)
322    }
323);
324
325impl_vec_znx_big_delegate!(
326    VecZnxBigNormalize<B>,
327    fn vec_znx_big_normalize(
328        &self,
329        res: &mut VecZnxBackendMut<'_, B>,
330        res_base2k: usize,
331        res_offset: i64,
332        res_col: usize,
333        a: &VecZnxBigBackendRef<'_, B>,
334        a_base2k: usize,
335        a_col: usize,
336        scratch: &mut ScratchArena<'_, B>,
337    ) {
338        B::vec_znx_big_normalize(self, res, res_base2k, res_offset, res_col, a, a_base2k, a_col, scratch)
339    }
340);
341
342impl_vec_znx_big_delegate!(
343    VecZnxBigAutomorphism<B>,
344    fn vec_znx_big_automorphism(
345        &self,
346        k: i64,
347        res: &mut VecZnxBigBackendMut<'_, B>,
348        res_col: usize,
349        a: &VecZnxBigBackendRef<'_, B>,
350        a_col: usize,
351    ) {
352        B::vec_znx_big_automorphism(self, k, res, res_col, a, a_col);
353    }
354);
355
356impl_vec_znx_big_delegate!(
357    VecZnxBigAutomorphismAssignTmpBytes,
358    fn vec_znx_big_automorphism_assign_tmp_bytes(&self) -> usize {
359        B::vec_znx_big_automorphism_assign_tmp_bytes(self)
360    }
361);
362
363impl_vec_znx_big_delegate!(
364    VecZnxBigAutomorphismAssign<B>,
365    fn vec_znx_big_automorphism_assign(
366        &self,
367        k: i64,
368        a: &mut VecZnxBigBackendMut<'_, B>,
369        a_col: usize,
370        scratch: &mut ScratchArena<'_, B>,
371    ) {
372        B::vec_znx_big_automorphism_assign(self, k, a, a_col, scratch)
373    }
374);