poulpy/backend/src/hal/oep/vec_znx.rs
backend/src/hal/oep/vec_znx.rsRaw
1use rand_distr::Distribution;
2use sampling::source::Source;
3
4use crate::hal::layouts::{Backend, Module, ScalarZnxToRef, Scratch, VecZnxToMut, VecZnxToRef};
5
6/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
7/// * See [vec_znx_normalize_base2k_tmp_bytes_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L245C17-L245C55) for reference code.
8/// * See [crate::hal::api::VecZnxNormalizeTmpBytes] for corresponding public API.
9/// # Safety [crate::doc::backend_safety] for safety contract.
10pub unsafe trait VecZnxNormalizeTmpBytesImpl<B: Backend> {
11 fn vec_znx_normalize_tmp_bytes_impl(module: &Module<B>, n: usize) -> usize;
12}
13
14/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
15/// * See [vec_znx_normalize_base2k_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L212) for reference code.
16/// * See [crate::hal::api::VecZnxNormalize] for corresponding public API.
17/// # Safety [crate::doc::backend_safety] for safety contract.
18pub unsafe trait VecZnxNormalizeImpl<B: Backend> {
19 fn vec_znx_normalize_impl<R, A>(
20 module: &Module<B>,
21 basek: usize,
22 res: &mut R,
23 res_col: usize,
24 a: &A,
25 a_col: usize,
26 scratch: &mut Scratch<B>,
27 ) where
28 R: VecZnxToMut,
29 A: VecZnxToRef;
30}
31
32/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
33/// * See [vec_znx_normalize_base2k_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L212) for reference code.
34/// * See [crate::hal::api::VecZnxNormalizeInplace] for corresponding public API.
35/// # Safety [crate::doc::backend_safety] for safety contract.
36pub unsafe trait VecZnxNormalizeInplaceImpl<B: Backend> {
37 fn vec_znx_normalize_inplace_impl<A>(module: &Module<B>, basek: usize, a: &mut A, a_col: usize, scratch: &mut Scratch<B>)
38 where
39 A: VecZnxToMut;
40}
41
42/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
43/// * See [vec_znx_add_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L86) for reference code.
44/// * See [crate::hal::api::VecZnxAdd] for corresponding public API.
45/// # Safety [crate::doc::backend_safety] for safety contract.
46pub unsafe trait VecZnxAddImpl<B: Backend> {
47 fn vec_znx_add_impl<R, A, C>(module: &Module<B>, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize)
48 where
49 R: VecZnxToMut,
50 A: VecZnxToRef,
51 C: VecZnxToRef;
52}
53
54/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
55/// * See [vec_znx_add_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L86) for reference code.
56/// * See [crate::hal::api::VecZnxAddInplace] for corresponding public API.
57/// # Safety [crate::doc::backend_safety] for safety contract.
58pub unsafe trait VecZnxAddInplaceImpl<B: Backend> {
59 fn vec_znx_add_inplace_impl<R, A>(module: &Module<B>, res: &mut R, res_col: usize, a: &A, a_col: usize)
60 where
61 R: VecZnxToMut,
62 A: VecZnxToRef;
63}
64
65/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
66/// * See [vec_znx_add_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L86) for reference code.
67/// * See [crate::hal::api::VecZnxAddScalarInplace] for corresponding public API.
68/// # Safety [crate::doc::backend_safety] for safety contract.
69pub unsafe trait VecZnxAddScalarInplaceImpl<B: Backend> {
70 fn vec_znx_add_scalar_inplace_impl<R, A>(
71 module: &Module<B>,
72 res: &mut R,
73 res_col: usize,
74 res_limb: usize,
75 a: &A,
76 a_col: usize,
77 ) where
78 R: VecZnxToMut,
79 A: ScalarZnxToRef;
80}
81
82/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
83/// * See [vec_znx_sub_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L125) for reference code.
84/// * See [crate::hal::api::VecZnxSub] for corresponding public API.
85/// # Safety [crate::doc::backend_safety] for safety contract.
86pub unsafe trait VecZnxSubImpl<B: Backend> {
87 fn vec_znx_sub_impl<R, A, C>(module: &Module<B>, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize)
88 where
89 R: VecZnxToMut,
90 A: VecZnxToRef,
91 C: VecZnxToRef;
92}
93
94/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
95/// * See [vec_znx_sub_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L125) for reference code.
96/// * See [crate::hal::api::VecZnxSubABInplace] for corresponding public API.
97/// # Safety [crate::doc::backend_safety] for safety contract.
98pub unsafe trait VecZnxSubABInplaceImpl<B: Backend> {
99 fn vec_znx_sub_ab_inplace_impl<R, A>(module: &Module<B>, res: &mut R, res_col: usize, a: &A, a_col: usize)
100 where
101 R: VecZnxToMut,
102 A: VecZnxToRef;
103}
104
105/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
106/// * See [vec_znx_sub_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L125) for reference code.
107/// * See [crate::hal::api::VecZnxSubBAInplace] for corresponding public API.
108/// # Safety [crate::doc::backend_safety] for safety contract.
109pub unsafe trait VecZnxSubBAInplaceImpl<B: Backend> {
110 fn vec_znx_sub_ba_inplace_impl<R, A>(module: &Module<B>, res: &mut R, res_col: usize, a: &A, a_col: usize)
111 where
112 R: VecZnxToMut,
113 A: VecZnxToRef;
114}
115
116/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
117/// * See [vec_znx_sub_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L125) for reference code.
118/// * See [crate::hal::api::VecZnxSubScalarInplace] for corresponding public API.
119/// # Safety [crate::doc::backend_safety] for safety contract.
120pub unsafe trait VecZnxSubScalarInplaceImpl<B: Backend> {
121 fn vec_znx_sub_scalar_inplace_impl<R, A>(
122 module: &Module<B>,
123 res: &mut R,
124 res_col: usize,
125 res_limb: usize,
126 a: &A,
127 a_col: usize,
128 ) where
129 R: VecZnxToMut,
130 A: ScalarZnxToRef;
131}
132
133/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
134/// * See [vec_znx_negate_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L322C13-L322C31) for reference code.
135/// * See [crate::hal::api::VecZnxNegate] for corresponding public API.
136/// # Safety [crate::doc::backend_safety] for safety contract.
137pub unsafe trait VecZnxNegateImpl<B: Backend> {
138 fn vec_znx_negate_impl<R, A>(module: &Module<B>, res: &mut R, res_col: usize, a: &A, a_col: usize)
139 where
140 R: VecZnxToMut,
141 A: VecZnxToRef;
142}
143
144/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
145/// * See [vec_znx_negate_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L322C13-L322C31) for reference code.
146/// * See [crate::hal::api::VecZnxNegateInplace] for corresponding public API.
147/// # Safety [crate::doc::backend_safety] for safety contract.
148pub unsafe trait VecZnxNegateInplaceImpl<B: Backend> {
149 fn vec_znx_negate_inplace_impl<A>(module: &Module<B>, a: &mut A, a_col: usize)
150 where
151 A: VecZnxToMut;
152}
153
154/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
155/// * See [crate::implementation::cpu_spqlios::vec_znx::vec_znx_rsh_inplace_ref] for reference code.
156/// * See [crate::hal::api::VecZnxRshInplace] for corresponding public API.
157/// # Safety [crate::doc::backend_safety] for safety contract.
158pub unsafe trait VecZnxRshInplaceImpl<B: Backend> {
159 fn vec_znx_rsh_inplace_impl<A>(module: &Module<B>, basek: usize, k: usize, a: &mut A)
160 where
161 A: VecZnxToMut;
162}
163
164/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
165/// * See [crate::implementation::cpu_spqlios::vec_znx::vec_znx_lsh_inplace_ref] for reference code.
166/// * See [crate::hal::api::VecZnxLshInplace] for corresponding public API.
167/// # Safety [crate::doc::backend_safety] for safety contract.
168pub unsafe trait VecZnxLshInplaceImpl<B: Backend> {
169 fn vec_znx_lsh_inplace_impl<A>(module: &Module<B>, basek: usize, k: usize, a: &mut A)
170 where
171 A: VecZnxToMut;
172}
173
174/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
175/// * See [vec_znx_rotate_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L164) for reference code.
176/// * See [crate::hal::api::VecZnxRotate] for corresponding public API.
177/// # Safety [crate::doc::backend_safety] for safety contract.
178pub unsafe trait VecZnxRotateImpl<B: Backend> {
179 fn vec_znx_rotate_impl<R, A>(module: &Module<B>, k: i64, res: &mut R, res_col: usize, a: &A, a_col: usize)
180 where
181 R: VecZnxToMut,
182 A: VecZnxToRef;
183}
184
185/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
186/// * See [vec_znx_rotate_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L164) for reference code.
187/// * See [crate::hal::api::VecZnxRotateInplace] for corresponding public API.
188/// # Safety [crate::doc::backend_safety] for safety contract.
189pub unsafe trait VecZnxRotateInplaceImpl<B: Backend> {
190 fn vec_znx_rotate_inplace_impl<A>(module: &Module<B>, k: i64, a: &mut A, a_col: usize)
191 where
192 A: VecZnxToMut;
193}
194
195/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
196/// * See [vec_znx_automorphism_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L188) for reference code.
197/// * See [crate::hal::api::VecZnxAutomorphism] for corresponding public API.
198/// # Safety [crate::doc::backend_safety] for safety contract.
199pub unsafe trait VecZnxAutomorphismImpl<B: Backend> {
200 fn vec_znx_automorphism_impl<R, A>(module: &Module<B>, k: i64, res: &mut R, res_col: usize, a: &A, a_col: usize)
201 where
202 R: VecZnxToMut,
203 A: VecZnxToRef;
204}
205
206/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
207/// * See [vec_znx_automorphism_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/32a3f5fcce9863b58e949f2dfd5abc1bfbaa09b4/spqlios/arithmetic/vec_znx.c#L188) for reference code.
208/// * See [crate::hal::api::VecZnxAutomorphismInplace] for corresponding public API.
209/// # Safety [crate::doc::backend_safety] for safety contract.
210pub unsafe trait VecZnxAutomorphismInplaceImpl<B: Backend> {
211 fn vec_znx_automorphism_inplace_impl<A>(module: &Module<B>, k: i64, a: &mut A, a_col: usize)
212 where
213 A: VecZnxToMut;
214}
215
216/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
217/// * See [vec_znx_mul_xp_minus_one_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/7160f588da49712a042931ea247b4259b95cefcc/spqlios/arithmetic/vec_znx.c#L200C13-L200C41) for reference code.
218/// * See [crate::hal::api::VecZnxMulXpMinusOne] for corresponding public API.
219/// # Safety [crate::doc::backend_safety] for safety contract.
220pub unsafe trait VecZnxMulXpMinusOneImpl<B: Backend> {
221 fn vec_znx_mul_xp_minus_one_impl<R, A>(module: &Module<B>, p: i64, res: &mut R, res_col: usize, a: &A, a_col: usize)
222 where
223 R: VecZnxToMut,
224 A: VecZnxToRef;
225}
226
227/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
228/// * See [vec_znx_mul_xp_minus_one_ref](https://github.com/phantomzone-org/spqlios-arithmetic/blob/7160f588da49712a042931ea247b4259b95cefcc/spqlios/arithmetic/vec_znx.c#L200C13-L200C41) for reference code.
229/// * See [crate::hal::api::VecZnxMulXpMinusOneInplace] for corresponding public API.
230/// # Safety [crate::doc::backend_safety] for safety contract.
231pub unsafe trait VecZnxMulXpMinusOneInplaceImpl<B: Backend> {
232 fn vec_znx_mul_xp_minus_one_inplace_impl<R>(module: &Module<B>, p: i64, res: &mut R, res_col: usize)
233 where
234 R: VecZnxToMut;
235}
236
237/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
238/// * See [crate::implementation::cpu_spqlios::vec_znx::vec_znx_split_ref] for reference code.
239/// * See [crate::hal::api::VecZnxSplit] for corresponding public API.
240/// # Safety [crate::doc::backend_safety] for safety contract.
241pub unsafe trait VecZnxSplitImpl<B: Backend> {
242 fn vec_znx_split_impl<R, A>(module: &Module<B>, res: &mut [R], res_col: usize, a: &A, a_col: usize, scratch: &mut Scratch<B>)
243 where
244 R: VecZnxToMut,
245 A: VecZnxToRef;
246}
247
248/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
249/// * See [crate::implementation::cpu_spqlios::vec_znx::vec_znx_merge_ref] for reference code.
250/// * See [crate::hal::api::VecZnxMerge] for corresponding public API.
251/// # Safety [crate::doc::backend_safety] for safety contract.
252pub unsafe trait VecZnxMergeImpl<B: Backend> {
253 fn vec_znx_merge_impl<R, A>(module: &Module<B>, res: &mut R, res_col: usize, a: &[A], a_col: usize)
254 where
255 R: VecZnxToMut,
256 A: VecZnxToRef;
257}
258
259/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
260/// * See [crate::implementation::cpu_spqlios::vec_znx::vec_znx_switch_degree_ref] for reference code.
261/// * See [crate::hal::api::VecZnxSwithcDegree] for corresponding public API.
262/// # Safety [crate::doc::backend_safety] for safety contract.
263pub unsafe trait VecZnxSwithcDegreeImpl<B: Backend> {
264 fn vec_znx_switch_degree_impl<R: VecZnxToMut, A: VecZnxToRef>(
265 module: &Module<B>,
266 res: &mut R,
267 res_col: usize,
268 a: &A,
269 a_col: usize,
270 );
271}
272
273/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
274/// * See [crate::implementation::cpu_spqlios::vec_znx::vec_znx_copy_ref] for reference code.
275/// * See [crate::hal::api::VecZnxCopy] for corresponding public API.
276/// # Safety [crate::doc::backend_safety] for safety contract.
277pub unsafe trait VecZnxCopyImpl<B: Backend> {
278 fn vec_znx_copy_impl<R, A>(module: &Module<B>, res: &mut R, res_col: usize, a: &A, a_col: usize)
279 where
280 R: VecZnxToMut,
281 A: VecZnxToRef;
282}
283
284/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
285/// * See [crate::hal::api::VecZnxFillUniform] for corresponding public API.
286/// # Safety [crate::doc::backend_safety] for safety contract.
287pub unsafe trait VecZnxFillUniformImpl<B: Backend> {
288 fn vec_znx_fill_uniform_impl<R>(module: &Module<B>, basek: usize, res: &mut R, res_col: usize, k: usize, source: &mut Source)
289 where
290 R: VecZnxToMut;
291}
292
293#[allow(clippy::too_many_arguments)]
294/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
295/// * See [crate::hal::api::VecZnxFillDistF64] for corresponding public API.
296/// # Safety [crate::doc::backend_safety] for safety contract.
297pub unsafe trait VecZnxFillDistF64Impl<B: Backend> {
298 fn vec_znx_fill_dist_f64_impl<R, D: Distribution<f64>>(
299 module: &Module<B>,
300 basek: usize,
301 res: &mut R,
302 res_col: usize,
303 k: usize,
304 source: &mut Source,
305 dist: D,
306 bound: f64,
307 ) where
308 R: VecZnxToMut;
309}
310
311#[allow(clippy::too_many_arguments)]
312/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
313/// * See [crate::hal::api::VecZnxAddDistF64] for corresponding public API.
314/// # Safety [crate::doc::backend_safety] for safety contract.
315pub unsafe trait VecZnxAddDistF64Impl<B: Backend> {
316 fn vec_znx_add_dist_f64_impl<R, D: Distribution<f64>>(
317 module: &Module<B>,
318 basek: usize,
319 res: &mut R,
320 res_col: usize,
321 k: usize,
322 source: &mut Source,
323 dist: D,
324 bound: f64,
325 ) where
326 R: VecZnxToMut;
327}
328
329#[allow(clippy::too_many_arguments)]
330/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
331/// * See [crate::hal::api::VecZnxFillNormal] for corresponding public API.
332/// # Safety [crate::doc::backend_safety] for safety contract.
333pub unsafe trait VecZnxFillNormalImpl<B: Backend> {
334 fn vec_znx_fill_normal_impl<R>(
335 module: &Module<B>,
336 basek: usize,
337 res: &mut R,
338 res_col: usize,
339 k: usize,
340 source: &mut Source,
341 sigma: f64,
342 bound: f64,
343 ) where
344 R: VecZnxToMut;
345}
346
347#[allow(clippy::too_many_arguments)]
348/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
349/// * See [crate::hal::api::VecZnxAddNormal] for corresponding public API.
350/// # Safety [crate::doc::backend_safety] for safety contract.
351pub unsafe trait VecZnxAddNormalImpl<B: Backend> {
352 fn vec_znx_add_normal_impl<R>(
353 module: &Module<B>,
354 basek: usize,
355 res: &mut R,
356 res_col: usize,
357 k: usize,
358 source: &mut Source,
359 sigma: f64,
360 bound: f64,
361 ) where
362 R: VecZnxToMut;
363}