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);