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