1#![allow(clippy::too_many_arguments)]
2
3use crate::{
4 layouts::{
5 Backend, Module, NoiseInfos, ScalarZnxBackendMut, ScalarZnxBackendRef, ScratchArena, VecZnxBackendMut, VecZnxBackendRef,
6 VecZnxBigBackendMut,
7 },
8 source::Source,
9};
10
11pub unsafe trait HalModuleImpl<BE: Backend>: Backend {
17 #[allow(clippy::new_ret_no_self)]
18 fn new(n: u64) -> Module<BE>;
19}
20
21pub unsafe trait HalVecZnxImpl<BE: Backend>: Backend {
27 fn vec_znx_zero_backend(module: &Module<BE>, res: &mut VecZnxBackendMut<'_, BE>, res_col: usize);
28
29 fn scalar_znx_fill_ternary_hw_backend(
30 module: &Module<BE>,
31 res: &mut ScalarZnxBackendMut<'_, BE>,
32 res_col: usize,
33 hw: usize,
34 seed: [u8; 32],
35 );
36
37 fn scalar_znx_fill_ternary_prob_backend(
38 module: &Module<BE>,
39 res: &mut ScalarZnxBackendMut<'_, BE>,
40 res_col: usize,
41 prob: f64,
42 seed: [u8; 32],
43 );
44
45 fn scalar_znx_fill_binary_hw_backend(
46 module: &Module<BE>,
47 res: &mut ScalarZnxBackendMut<'_, BE>,
48 res_col: usize,
49 hw: usize,
50 seed: [u8; 32],
51 );
52
53 fn scalar_znx_fill_binary_prob_backend(
54 module: &Module<BE>,
55 res: &mut ScalarZnxBackendMut<'_, BE>,
56 res_col: usize,
57 prob: f64,
58 seed: [u8; 32],
59 );
60
61 fn scalar_znx_fill_binary_block_backend(
62 module: &Module<BE>,
63 res: &mut ScalarZnxBackendMut<'_, BE>,
64 res_col: usize,
65 block_size: usize,
66 seed: [u8; 32],
67 );
68
69 fn vec_znx_hadamard_product_scalar_znx_backend(
70 module: &Module<BE>,
71 res: &mut VecZnxBigBackendMut<'_, BE>,
72 res_col: usize,
73 a: &VecZnxBackendRef<'_, BE>,
74 a_col: usize,
75 b: &ScalarZnxBackendRef<'_, BE>,
76 b_col: usize,
77 );
78
79 fn vec_znx_normalize_tmp_bytes_backend(module: &Module<BE>) -> usize;
80
81 #[allow(clippy::too_many_arguments)]
82 fn vec_znx_normalize_backend(
83 module: &Module<BE>,
84 res: &mut VecZnxBackendMut<'_, BE>,
85 res_base2k: usize,
86 res_offset: i64,
87 res_col: usize,
88 a: &VecZnxBackendRef<'_, BE>,
89 a_base2k: usize,
90 a_col: usize,
91 scratch: &mut ScratchArena<'_, BE>,
92 );
93
94 fn vec_znx_normalize_assign_backend(
95 module: &Module<BE>,
96 base2k: usize,
97 a: &mut VecZnxBackendMut<'_, BE>,
98 a_col: usize,
99 scratch: &mut ScratchArena<'_, BE>,
100 );
101
102 fn vec_znx_normalize_coeff_assign_backend(
103 module: &Module<BE>,
104 base2k: usize,
105 a: &mut VecZnxBackendMut<'_, BE>,
106 a_col: usize,
107 a_coeff: usize,
108 scratch: &mut ScratchArena<'_, BE>,
109 );
110
111 #[allow(clippy::too_many_arguments)]
112 fn vec_znx_normalize_coeff_backend(
113 module: &Module<BE>,
114 res: &mut VecZnxBackendMut<'_, BE>,
115 res_base2k: usize,
116 res_offset: i64,
117 res_col: usize,
118 a: &VecZnxBackendRef<'_, BE>,
119 a_base2k: usize,
120 a_col: usize,
121 a_coeff: usize,
122 scratch: &mut ScratchArena<'_, BE>,
123 );
124
125 fn vec_znx_add_into_backend(
126 module: &Module<BE>,
127 res: &mut VecZnxBackendMut<'_, BE>,
128 res_col: usize,
129 a: &VecZnxBackendRef<'_, BE>,
130 a_col: usize,
131 b: &VecZnxBackendRef<'_, BE>,
132 b_col: usize,
133 );
134
135 fn vec_znx_add_assign_backend(
136 module: &Module<BE>,
137 res: &mut VecZnxBackendMut<'_, BE>,
138 res_col: usize,
139 a: &VecZnxBackendRef<'_, BE>,
140 a_col: usize,
141 );
142
143 #[allow(clippy::too_many_arguments)]
144 fn vec_znx_add_const_into_backend(
145 module: &Module<BE>,
146 res: &mut VecZnxBackendMut<'_, BE>,
147 res_col: usize,
148 a: &VecZnxBackendRef<'_, BE>,
149 a_col: usize,
150 cnst: &VecZnxBackendRef<'_, BE>,
151 cnst_col: usize,
152 cnst_coeff: usize,
153 res_limb: usize,
154 res_coeff: usize,
155 );
156
157 fn vec_znx_add_const_assign_backend(
158 module: &Module<BE>,
159 res: &mut VecZnxBackendMut<'_, BE>,
160 res_col: usize,
161 cnst: &VecZnxBackendRef<'_, BE>,
162 cnst_col: usize,
163 cnst_coeff: usize,
164 res_limb: usize,
165 res_coeff: usize,
166 );
167
168 #[allow(clippy::too_many_arguments)]
169 fn vec_znx_add_scalar_into_backend(
170 module: &Module<BE>,
171 res: &mut VecZnxBackendMut<'_, BE>,
172 res_col: usize,
173 a: &ScalarZnxBackendRef<'_, BE>,
174 a_col: usize,
175 b: &VecZnxBackendRef<'_, BE>,
176 b_col: usize,
177 b_limb: usize,
178 );
179
180 fn vec_znx_add_scalar_assign_backend(
181 module: &Module<BE>,
182 res: &mut VecZnxBackendMut<'_, BE>,
183 res_col: usize,
184 res_limb: usize,
185 a: &ScalarZnxBackendRef<'_, BE>,
186 a_col: usize,
187 );
188
189 fn vec_znx_sub_backend(
190 module: &Module<BE>,
191 res: &mut VecZnxBackendMut<'_, BE>,
192 res_col: usize,
193 a: &VecZnxBackendRef<'_, BE>,
194 a_col: usize,
195 b: &VecZnxBackendRef<'_, BE>,
196 b_col: usize,
197 );
198
199 fn vec_znx_sub_assign_backend(
200 module: &Module<BE>,
201 res: &mut VecZnxBackendMut<'_, BE>,
202 res_col: usize,
203 a: &VecZnxBackendRef<'_, BE>,
204 a_col: usize,
205 );
206
207 fn vec_znx_sub_negate_assign_backend(
208 module: &Module<BE>,
209 res: &mut VecZnxBackendMut<'_, BE>,
210 res_col: usize,
211 a: &VecZnxBackendRef<'_, BE>,
212 a_col: usize,
213 );
214
215 #[allow(clippy::too_many_arguments)]
216 fn vec_znx_sub_scalar_backend(
217 module: &Module<BE>,
218 res: &mut VecZnxBackendMut<'_, BE>,
219 res_col: usize,
220 a: &ScalarZnxBackendRef<'_, BE>,
221 a_col: usize,
222 b: &VecZnxBackendRef<'_, BE>,
223 b_col: usize,
224 b_limb: usize,
225 );
226
227 fn vec_znx_sub_scalar_assign_backend(
228 module: &Module<BE>,
229 res: &mut VecZnxBackendMut<'_, BE>,
230 res_col: usize,
231 res_limb: usize,
232 a: &ScalarZnxBackendRef<'_, BE>,
233 a_col: usize,
234 );
235
236 fn vec_znx_negate_backend(
237 module: &Module<BE>,
238 res: &mut VecZnxBackendMut<'_, BE>,
239 res_col: usize,
240 a: &VecZnxBackendRef<'_, BE>,
241 a_col: usize,
242 );
243
244 fn vec_znx_negate_assign_backend(module: &Module<BE>, a: &mut VecZnxBackendMut<'_, BE>, a_col: usize);
245
246 fn vec_znx_rsh_tmp_bytes_backend(module: &Module<BE>) -> usize;
247
248 fn vec_znx_rsh_backend(
249 module: &Module<BE>,
250 base2k: usize,
251 k: usize,
252 res: &mut VecZnxBackendMut<'_, BE>,
253 res_col: usize,
254 a: &VecZnxBackendRef<'_, BE>,
255 a_col: usize,
256 scratch: &mut ScratchArena<'_, BE>,
257 );
258
259 fn vec_znx_rsh_coeff_backend(
260 module: &Module<BE>,
261 base2k: usize,
262 k: usize,
263 res: &mut VecZnxBackendMut<'_, BE>,
264 res_col: usize,
265 a: &VecZnxBackendRef<'_, BE>,
266 a_col: usize,
267 a_coeff: usize,
268 scratch: &mut ScratchArena<'_, BE>,
269 );
270
271 fn vec_znx_rsh_add_into_backend(
272 module: &Module<BE>,
273 base2k: usize,
274 k: usize,
275 res: &mut VecZnxBackendMut<'_, BE>,
276 res_col: usize,
277 a: &VecZnxBackendRef<'_, BE>,
278 a_col: usize,
279 scratch: &mut ScratchArena<'_, BE>,
280 );
281
282 fn vec_znx_rsh_add_coeff_into_backend(
283 module: &Module<BE>,
284 base2k: usize,
285 k: usize,
286 res: &mut VecZnxBackendMut<'_, BE>,
287 res_col: usize,
288 a: &VecZnxBackendRef<'_, BE>,
289 a_col: usize,
290 a_coeff: usize,
291 res_coeff: usize,
292 scratch: &mut ScratchArena<'_, BE>,
293 );
294
295 fn vec_znx_rsh_sub_coeff_into_backend(
296 module: &Module<BE>,
297 base2k: usize,
298 k: usize,
299 res: &mut VecZnxBackendMut<'_, BE>,
300 res_col: usize,
301 a: &VecZnxBackendRef<'_, BE>,
302 a_col: usize,
303 a_coeff: usize,
304 res_coeff: usize,
305 scratch: &mut ScratchArena<'_, BE>,
306 );
307
308 fn vec_znx_lsh_tmp_bytes_backend(module: &Module<BE>) -> usize;
309
310 fn vec_znx_lsh_backend(
311 module: &Module<BE>,
312 base2k: usize,
313 k: usize,
314 res: &mut VecZnxBackendMut<'_, BE>,
315 res_col: usize,
316 a: &VecZnxBackendRef<'_, BE>,
317 a_col: usize,
318 scratch: &mut ScratchArena<'_, BE>,
319 );
320
321 fn vec_znx_lsh_coeff_backend(
322 module: &Module<BE>,
323 base2k: usize,
324 k: usize,
325 res: &mut VecZnxBackendMut<'_, BE>,
326 res_col: usize,
327 a: &VecZnxBackendRef<'_, BE>,
328 a_col: usize,
329 a_coeff: usize,
330 scratch: &mut ScratchArena<'_, BE>,
331 );
332
333 fn vec_znx_lsh_add_into_backend(
334 module: &Module<BE>,
335 base2k: usize,
336 k: usize,
337 res: &mut VecZnxBackendMut<'_, BE>,
338 res_col: usize,
339 a: &VecZnxBackendRef<'_, BE>,
340 a_col: usize,
341 scratch: &mut ScratchArena<'_, BE>,
342 );
343
344 fn vec_znx_lsh_add_coeff_into_backend(
345 module: &Module<BE>,
346 base2k: usize,
347 k: usize,
348 res: &mut VecZnxBackendMut<'_, BE>,
349 res_col: usize,
350 a: &VecZnxBackendRef<'_, BE>,
351 a_col: usize,
352 a_coeff: usize,
353 scratch: &mut ScratchArena<'_, BE>,
354 );
355
356 fn vec_znx_lsh_sub_backend(
357 module: &Module<BE>,
358 base2k: usize,
359 k: usize,
360 res: &mut VecZnxBackendMut<'_, BE>,
361 res_col: usize,
362 a: &VecZnxBackendRef<'_, BE>,
363 a_col: usize,
364 scratch: &mut ScratchArena<'_, BE>,
365 );
366
367 fn vec_znx_rsh_sub_backend(
368 module: &Module<BE>,
369 base2k: usize,
370 k: usize,
371 res: &mut VecZnxBackendMut<'_, BE>,
372 res_col: usize,
373 a: &VecZnxBackendRef<'_, BE>,
374 a_col: usize,
375 scratch: &mut ScratchArena<'_, BE>,
376 );
377
378 fn vec_znx_rsh_assign_backend(
379 module: &Module<BE>,
380 base2k: usize,
381 k: usize,
382 a: &mut VecZnxBackendMut<'_, BE>,
383 a_col: usize,
384 scratch: &mut ScratchArena<'_, BE>,
385 );
386
387 fn vec_znx_lsh_assign_backend(
388 module: &Module<BE>,
389 base2k: usize,
390 k: usize,
391 a: &mut VecZnxBackendMut<'_, BE>,
392 a_col: usize,
393 scratch: &mut ScratchArena<'_, BE>,
394 );
395
396 fn vec_znx_rotate_backend(
397 module: &Module<BE>,
398 k: i64,
399 res: &mut VecZnxBackendMut<'_, BE>,
400 res_col: usize,
401 a: &VecZnxBackendRef<'_, BE>,
402 a_col: usize,
403 );
404
405 fn vec_znx_rotate_assign_tmp_bytes_backend(module: &Module<BE>) -> usize;
406
407 fn vec_znx_rotate_assign_backend(
408 module: &Module<BE>,
409 k: i64,
410 a: &mut VecZnxBackendMut<'_, BE>,
411 a_col: usize,
412 scratch: &mut ScratchArena<'_, BE>,
413 );
414
415 fn vec_znx_automorphism_backend(
416 module: &Module<BE>,
417 k: i64,
418 res: &mut VecZnxBackendMut<'_, BE>,
419 res_col: usize,
420 a: &VecZnxBackendRef<'_, BE>,
421 a_col: usize,
422 );
423
424 fn vec_znx_automorphism_assign_tmp_bytes_backend(module: &Module<BE>) -> usize;
425
426 fn vec_znx_automorphism_assign_backend(
427 module: &Module<BE>,
428 k: i64,
429 res: &mut VecZnxBackendMut<'_, BE>,
430 res_col: usize,
431 scratch: &mut ScratchArena<'_, BE>,
432 );
433
434 fn vec_znx_mul_xp_minus_one_backend(
435 module: &Module<BE>,
436 k: i64,
437 res: &mut VecZnxBackendMut<'_, BE>,
438 res_col: usize,
439 a: &VecZnxBackendRef<'_, BE>,
440 a_col: usize,
441 );
442
443 fn vec_znx_mul_xp_minus_one_assign_tmp_bytes_backend(module: &Module<BE>) -> usize;
444
445 fn vec_znx_mul_xp_minus_one_assign_backend(
446 module: &Module<BE>,
447 k: i64,
448 res: &mut VecZnxBackendMut<'_, BE>,
449 res_col: usize,
450 scratch: &mut ScratchArena<'_, BE>,
451 );
452
453 fn vec_znx_split_ring_tmp_bytes_backend(module: &Module<BE>) -> usize;
454
455 fn vec_znx_split_ring_backend(
456 module: &Module<BE>,
457 res: &mut [VecZnxBackendMut<'_, BE>],
458 res_col: usize,
459 a: &VecZnxBackendRef<'_, BE>,
460 a_col: usize,
461 scratch: &mut ScratchArena<'_, BE>,
462 );
463
464 fn vec_znx_merge_rings_tmp_bytes_backend(module: &Module<BE>) -> usize;
465
466 fn vec_znx_merge_rings_backend(
467 module: &Module<BE>,
468 res: &mut VecZnxBackendMut<'_, BE>,
469 res_col: usize,
470 a: &[VecZnxBackendRef<'_, BE>],
471 a_col: usize,
472 scratch: &mut ScratchArena<'_, BE>,
473 );
474
475 fn vec_znx_switch_ring_backend(
476 module: &Module<BE>,
477 res: &mut VecZnxBackendMut<'_, BE>,
478 res_col: usize,
479 a: &VecZnxBackendRef<'_, BE>,
480 a_col: usize,
481 );
482
483 fn vec_znx_copy_backend(
484 module: &Module<BE>,
485 res: &mut VecZnxBackendMut<'_, BE>,
486 res_col: usize,
487 a: &VecZnxBackendRef<'_, BE>,
488 a_col: usize,
489 );
490
491 fn vec_znx_copy_range_backend(
492 module: &Module<BE>,
493 res: &mut VecZnxBackendMut<'_, BE>,
494 res_col: usize,
495 res_limb: usize,
496 res_offset: usize,
497 a: &VecZnxBackendRef<'_, BE>,
498 a_col: usize,
499 a_limb: usize,
500 a_offset: usize,
501 len: usize,
502 );
503
504 fn vec_znx_extract_coeff_backend(
505 module: &Module<BE>,
506 res: &mut VecZnxBackendMut<'_, BE>,
507 res_col: usize,
508 a: &VecZnxBackendRef<'_, BE>,
509 a_col: usize,
510 a_coeff: usize,
511 );
512
513 fn vec_znx_fill_uniform_backend(
514 module: &Module<BE>,
515 base2k: usize,
516 res: &mut VecZnxBackendMut<'_, BE>,
517 res_col: usize,
518 seed: [u8; 32],
519 );
520
521 fn vec_znx_fill_normal_backend(
522 module: &Module<BE>,
523 res_base2k: usize,
524 res: &mut VecZnxBackendMut<'_, BE>,
525 res_col: usize,
526 noise_infos: NoiseInfos,
527 seed: [u8; 32],
528 );
529
530 fn vec_znx_add_normal_backend(
531 module: &Module<BE>,
532 res_base2k: usize,
533 res: &mut VecZnxBackendMut<'_, BE>,
534 res_col: usize,
535 noise_infos: NoiseInfos,
536 seed: [u8; 32],
537 );
538}
539
540pub unsafe trait HalVecZnxBigImpl<BE: Backend>: Backend {
546 fn vec_znx_big_from_small_backend(
547 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
548 res_col: usize,
549 a: &VecZnxBackendRef<'_, BE>,
550 a_col: usize,
551 );
552
553 fn vec_znx_big_add_normal_backend(
554 module: &Module<BE>,
555 res_base2k: usize,
556 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
557 res_col: usize,
558 noise_infos: NoiseInfos,
559 seed: [u8; 32],
560 );
561
562 fn vec_znx_big_add_normal(
563 module: &Module<BE>,
564 res_base2k: usize,
565 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
566 res_col: usize,
567 noise_infos: NoiseInfos,
568 source: &mut Source,
569 ) {
570 Self::vec_znx_big_add_normal_backend(module, res_base2k, res, res_col, noise_infos, source.new_seed());
571 }
572
573 fn vec_znx_big_add_into(
574 module: &Module<BE>,
575 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
576 res_col: usize,
577 a: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
578 a_col: usize,
579 b: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
580 b_col: usize,
581 );
582
583 fn vec_znx_big_add_assign(
584 module: &Module<BE>,
585 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
586 res_col: usize,
587 a: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
588 a_col: usize,
589 );
590
591 fn vec_znx_big_add_small_into_backend(
592 module: &Module<BE>,
593 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
594 res_col: usize,
595 a: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
596 a_col: usize,
597 b: &VecZnxBackendRef<'_, BE>,
598 b_col: usize,
599 );
600
601 fn vec_znx_big_add_small_assign(
602 module: &Module<BE>,
603 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
604 res_col: usize,
605 a: &VecZnxBackendRef<'_, BE>,
606 a_col: usize,
607 );
608
609 fn vec_znx_big_sub(
610 module: &Module<BE>,
611 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
612 res_col: usize,
613 a: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
614 a_col: usize,
615 b: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
616 b_col: usize,
617 );
618
619 fn vec_znx_big_sub_assign(
620 module: &Module<BE>,
621 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
622 res_col: usize,
623 a: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
624 a_col: usize,
625 );
626
627 fn vec_znx_big_sub_negate_assign(
628 module: &Module<BE>,
629 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
630 res_col: usize,
631 a: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
632 a_col: usize,
633 );
634
635 fn vec_znx_big_sub_small_a_backend(
636 module: &Module<BE>,
637 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
638 res_col: usize,
639 a: &VecZnxBackendRef<'_, BE>,
640 a_col: usize,
641 b: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
642 b_col: usize,
643 );
644
645 fn vec_znx_big_sub_small_assign(
646 module: &Module<BE>,
647 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
648 res_col: usize,
649 a: &VecZnxBackendRef<'_, BE>,
650 a_col: usize,
651 );
652
653 fn vec_znx_big_sub_small_b_backend(
654 module: &Module<BE>,
655 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
656 res_col: usize,
657 a: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
658 a_col: usize,
659 b: &VecZnxBackendRef<'_, BE>,
660 b_col: usize,
661 );
662
663 fn vec_znx_big_sub_small_negate_assign(
664 module: &Module<BE>,
665 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
666 res_col: usize,
667 a: &VecZnxBackendRef<'_, BE>,
668 a_col: usize,
669 );
670
671 fn vec_znx_big_inner_sum_backend(
672 module: &Module<BE>,
673 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
674 res_col: usize,
675 res_coeff: usize,
676 a: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
677 a_col: usize,
678 );
679
680 fn vec_znx_scalar_product(
681 module: &Module<BE>,
682 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
683 res_col: usize,
684 a: &VecZnxBackendRef<'_, BE>,
685 a_col: usize,
686 b: &ScalarZnxBackendRef<'_, BE>,
687 b_col: usize,
688 );
689
690 fn vec_znx_big_negate(
691 module: &Module<BE>,
692 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
693 res_col: usize,
694 a: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
695 a_col: usize,
696 );
697
698 fn vec_znx_big_negate_assign(module: &Module<BE>, a: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>, a_col: usize);
699
700 fn vec_znx_big_normalize_tmp_bytes(module: &Module<BE>) -> usize;
701
702 #[allow(clippy::too_many_arguments)]
703 fn vec_znx_big_normalize(
704 module: &Module<BE>,
705 res: &mut VecZnxBackendMut<'_, BE>,
706 res_base2k: usize,
707 res_offset: i64,
708 res_col: usize,
709 a: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
710 a_base2k: usize,
711 a_col: usize,
712 scratch: &mut ScratchArena<'_, BE>,
713 );
714
715 fn vec_znx_big_automorphism(
716 module: &Module<BE>,
717 k: i64,
718 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
719 res_col: usize,
720 a: &crate::layouts::VecZnxBigBackendRef<'_, BE>,
721 a_col: usize,
722 );
723
724 fn vec_znx_big_automorphism_assign_tmp_bytes(module: &Module<BE>) -> usize;
725
726 fn vec_znx_big_automorphism_assign(
727 module: &Module<BE>,
728 k: i64,
729 a: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
730 a_col: usize,
731 scratch: &mut ScratchArena<'_, BE>,
732 );
733}
734
735pub unsafe trait HalVecZnxDftImpl<BE: Backend>: Backend {
741 fn vec_znx_dft_apply(
742 module: &Module<BE>,
743 step: usize,
744 offset: usize,
745 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
746 res_col: usize,
747 a: &crate::layouts::VecZnxBackendRef<'_, BE>,
748 a_col: usize,
749 );
750
751 fn vec_znx_idft_apply_tmp_bytes(module: &Module<BE>) -> usize;
752
753 fn vec_znx_idft_apply(
754 module: &Module<BE>,
755 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
756 res_col: usize,
757 a: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
758 a_col: usize,
759 scratch: &mut ScratchArena<'_, BE>,
760 );
761
762 fn vec_znx_idft_apply_tmpa(
763 module: &Module<BE>,
764 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
765 res_col: usize,
766 a: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
767 a_col: usize,
768 );
769
770 fn vec_znx_dft_add_into(
771 module: &Module<BE>,
772 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
773 res_col: usize,
774 a: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
775 a_col: usize,
776 b: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
777 b_col: usize,
778 );
779
780 fn vec_znx_dft_add_scaled_assign(
781 module: &Module<BE>,
782 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
783 res_col: usize,
784 a: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
785 a_col: usize,
786 a_scale: i64,
787 );
788
789 fn vec_znx_dft_add_assign(
790 module: &Module<BE>,
791 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
792 res_col: usize,
793 a: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
794 a_col: usize,
795 );
796
797 fn vec_znx_dft_sub(
798 module: &Module<BE>,
799 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
800 res_col: usize,
801 a: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
802 a_col: usize,
803 b: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
804 b_col: usize,
805 );
806
807 fn vec_znx_dft_sub_assign(
808 module: &Module<BE>,
809 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
810 res_col: usize,
811 a: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
812 a_col: usize,
813 );
814
815 fn vec_znx_dft_sub_negate_assign(
816 module: &Module<BE>,
817 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
818 res_col: usize,
819 a: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
820 a_col: usize,
821 );
822
823 fn vec_znx_dft_copy(
824 module: &Module<BE>,
825 step: usize,
826 offset: usize,
827 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
828 res_col: usize,
829 a: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
830 a_col: usize,
831 );
832
833 fn vec_znx_dft_zero(module: &Module<BE>, res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>, res_col: usize);
834}
835
836pub unsafe trait HalSvpImpl<BE: Backend>: Backend {
842 fn svp_prepare(
843 module: &Module<BE>,
844 res: &mut crate::layouts::SvpPPolBackendMut<'_, BE>,
845 res_col: usize,
846 a: &ScalarZnxBackendRef<'_, BE>,
847 a_col: usize,
848 );
849
850 fn svp_ppol_copy_backend(
851 module: &Module<BE>,
852 res: &mut crate::layouts::SvpPPolBackendMut<'_, BE>,
853 res_col: usize,
854 a: &crate::layouts::SvpPPolBackendRef<'_, BE>,
855 a_col: usize,
856 );
857
858 fn svp_apply_dft(
859 module: &Module<BE>,
860 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
861 res_col: usize,
862 a: &crate::layouts::SvpPPolBackendRef<'_, BE>,
863 a_col: usize,
864 b: &crate::layouts::VecZnxBackendRef<'_, BE>,
865 b_col: usize,
866 );
867
868 fn svp_apply_dft_to_dft(
869 module: &Module<BE>,
870 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
871 res_col: usize,
872 a: &crate::layouts::SvpPPolBackendRef<'_, BE>,
873 a_col: usize,
874 b: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
875 b_col: usize,
876 );
877
878 fn svp_apply_dft_to_dft_assign(
879 module: &Module<BE>,
880 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
881 res_col: usize,
882 a: &crate::layouts::SvpPPolBackendRef<'_, BE>,
883 a_col: usize,
884 );
885}
886
887pub unsafe trait HalVmpImpl<BE: Backend>: Backend {
893 fn vmp_prepare_tmp_bytes(module: &Module<BE>, rows: usize, cols_in: usize, cols_out: usize, size: usize) -> usize;
894
895 fn vmp_prepare(
896 module: &Module<BE>,
897 res: &mut crate::layouts::VmpPMatBackendMut<'_, BE>,
898 a: &crate::layouts::MatZnxBackendRef<'_, BE>,
899 scratch: &mut ScratchArena<'_, BE>,
900 );
901
902 #[allow(clippy::too_many_arguments)]
903 fn vmp_apply_dft_tmp_bytes(
904 module: &Module<BE>,
905 res_size: usize,
906 a_size: usize,
907 b_rows: usize,
908 b_cols_in: usize,
909 b_cols_out: usize,
910 b_size: usize,
911 ) -> usize;
912
913 fn vmp_apply_dft<R>(
914 module: &Module<BE>,
915 res: &mut R,
916 a: &crate::layouts::VecZnxBackendRef<'_, BE>,
917 b: &crate::layouts::VmpPMatBackendRef<'_, BE>,
918 scratch: &mut ScratchArena<'_, BE>,
919 ) where
920 R: crate::layouts::VecZnxDftToBackendMut<BE>;
921
922 #[allow(clippy::too_many_arguments)]
923 fn vmp_apply_dft_to_dft_tmp_bytes(
924 module: &Module<BE>,
925 res_size: usize,
926 a_size: usize,
927 b_rows: usize,
928 b_cols_in: usize,
929 b_cols_out: usize,
930 b_size: usize,
931 ) -> usize;
932
933 fn vmp_apply_dft_to_dft(
934 module: &Module<BE>,
935 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
936 a: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
937 b: &crate::layouts::VmpPMatBackendRef<'_, BE>,
938 limb_offset: usize,
939 scratch: &mut ScratchArena<'_, BE>,
940 );
941
942 #[allow(clippy::too_many_arguments)]
943 fn vmp_apply_dft_to_dft_accumulate_tmp_bytes(
944 module: &Module<BE>,
945 res_size: usize,
946 a_size: usize,
947 b_rows: usize,
948 b_cols_in: usize,
949 b_cols_out: usize,
950 b_size: usize,
951 ) -> usize;
952
953 fn vmp_apply_dft_to_dft_accumulate(
954 module: &Module<BE>,
955 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
956 a: &crate::layouts::VecZnxDftBackendRef<'_, BE>,
957 b: &crate::layouts::VmpPMatBackendRef<'_, BE>,
958 limb_offset: usize,
959 scratch: &mut ScratchArena<'_, BE>,
960 );
961
962 fn vmp_zero(module: &Module<BE>, res: &mut crate::layouts::VmpPMatBackendMut<'_, BE>);
963}
964
965pub unsafe trait HalConvolutionImpl<BE: Backend>: Backend {
971 fn cnv_prepare_left_tmp_bytes(module: &Module<BE>, res_size: usize, a_size: usize) -> usize;
972
973 fn cnv_prepare_left(
974 module: &Module<BE>,
975 res: &mut crate::layouts::CnvPVecLBackendMut<'_, BE>,
976 a: &crate::layouts::VecZnxBackendRef<'_, BE>,
977 mask: i64,
978 scratch: &mut ScratchArena<'_, BE>,
979 );
980
981 fn cnv_prepare_right_tmp_bytes(module: &Module<BE>, res_size: usize, a_size: usize) -> usize;
982
983 fn cnv_prepare_right(
984 module: &Module<BE>,
985 res: &mut crate::layouts::CnvPVecRBackendMut<'_, BE>,
986 a: &crate::layouts::VecZnxBackendRef<'_, BE>,
987 mask: i64,
988 scratch: &mut ScratchArena<'_, BE>,
989 );
990
991 fn cnv_apply_dft_tmp_bytes(module: &Module<BE>, cnv_offset: usize, res_size: usize, a_size: usize, b_size: usize) -> usize;
992
993 fn cnv_by_const_apply_tmp_bytes(
994 module: &Module<BE>,
995 cnv_offset: usize,
996 res_size: usize,
997 a_size: usize,
998 b_size: usize,
999 ) -> usize;
1000
1001 #[allow(clippy::too_many_arguments)]
1002 fn cnv_by_const_apply(
1003 module: &Module<BE>,
1004 cnv_offset: usize,
1005 res: &mut crate::layouts::VecZnxBigBackendMut<'_, BE>,
1006 res_col: usize,
1007 a: &crate::layouts::VecZnxBackendRef<'_, BE>,
1008 a_col: usize,
1009 b: &crate::layouts::VecZnxBackendRef<'_, BE>,
1010 b_col: usize,
1011 b_coeff: usize,
1012 scratch: &mut ScratchArena<'_, BE>,
1013 );
1014
1015 #[allow(clippy::too_many_arguments)]
1016 fn cnv_apply_dft(
1017 module: &Module<BE>,
1018 cnv_offset: usize,
1019 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
1020 res_col: usize,
1021 a: &crate::layouts::CnvPVecLBackendRef<'_, BE>,
1022 a_col: usize,
1023 b: &crate::layouts::CnvPVecRBackendRef<'_, BE>,
1024 b_col: usize,
1025 scratch: &mut ScratchArena<'_, BE>,
1026 );
1027
1028 fn cnv_pairwise_apply_dft_tmp_bytes(
1029 module: &Module<BE>,
1030 cnv_offset: usize,
1031 res_size: usize,
1032 a_size: usize,
1033 b_size: usize,
1034 ) -> usize;
1035
1036 #[allow(clippy::too_many_arguments)]
1037 fn cnv_pairwise_apply_dft(
1038 module: &Module<BE>,
1039 cnv_offset: usize,
1040 res: &mut crate::layouts::VecZnxDftBackendMut<'_, BE>,
1041 res_col: usize,
1042 a: &crate::layouts::CnvPVecLBackendRef<'_, BE>,
1043 b: &crate::layouts::CnvPVecRBackendRef<'_, BE>,
1044 i: usize,
1045 j: usize,
1046 scratch: &mut ScratchArena<'_, BE>,
1047 );
1048
1049 fn cnv_prepare_self_tmp_bytes(module: &Module<BE>, res_size: usize, a_size: usize) -> usize;
1050
1051 fn cnv_prepare_self(
1052 module: &Module<BE>,
1053 left: &mut crate::layouts::CnvPVecLBackendMut<'_, BE>,
1054 right: &mut crate::layouts::CnvPVecRBackendMut<'_, BE>,
1055 a: &crate::layouts::VecZnxBackendRef<'_, BE>,
1056 mask: i64,
1057 scratch: &mut ScratchArena<'_, BE>,
1058 );
1059}