Skip to main content

poulpy_hal/oep/
hal_impl.rs

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
11/// Module construction extension point.
12///
13/// # Safety
14/// Implementations must return a module handle that is valid for the backend
15/// and ring degree, and uphold the backend safety contract.
16pub unsafe trait HalModuleImpl<BE: Backend>: Backend {
17    #[allow(clippy::new_ret_no_self)]
18    fn new(n: u64) -> Module<BE>;
19}
20
21/// Coefficient-domain `VecZnx` extension point.
22///
23/// # Safety
24/// Implementations must uphold the backend safety contract for layout access,
25/// aliasing, scratch usage, and arithmetic correctness.
26pub 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
540/// Big-coefficient `VecZnxBig` extension point.
541///
542/// # Safety
543/// Implementations must uphold the backend safety contract for backend-native
544/// accumulator layouts and arithmetic correctness.
545pub 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
735/// Prepared / DFT-domain `VecZnxDft` extension point.
736///
737/// # Safety
738/// Implementations must uphold the backend safety contract for prepared-domain
739/// layouts, transforms, and arithmetic correctness.
740pub 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
836/// Scalar-vector product family extension point.
837///
838/// # Safety
839/// Implementations must uphold the backend safety contract for prepared
840/// polynomial layouts and arithmetic correctness.
841pub 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
887/// Vector-matrix product family extension point.
888///
889/// # Safety
890/// Implementations must uphold the backend safety contract for prepared matrix
891/// layouts, scratch usage, and arithmetic correctness.
892pub 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
965/// Convolution family extension point.
966///
967/// # Safety
968/// Implementations must uphold the backend safety contract for prepared
969/// convolution layouts, scratch usage, and arithmetic correctness.
970pub 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}