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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [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/// * See [crate::doc::backend_safety] for safety contract.
241pub unsafe trait VecZnxSplitImpl<B: Backend> {
242 fn vec_znx_split_impl<R, A>(
243 module: &Module<B>,
244 res: &mut Vec<R>,
245 res_col: usize,
246 a: &A,
247 a_col: usize,
248 scratch: &mut Scratch<B>,
249 ) where
250 R: VecZnxToMut,
251 A: VecZnxToRef;
252}
253
254/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
255/// * See [crate::implementation::cpu_spqlios::vec_znx::vec_znx_merge_ref] for reference code.
256/// * See [crate::hal::api::VecZnxMerge] for corresponding public API.
257/// * See [crate::doc::backend_safety] for safety contract.
258pub unsafe trait VecZnxMergeImpl<B: Backend> {
259 fn vec_znx_merge_impl<R, A>(module: &Module<B>, res: &mut R, res_col: usize, a: Vec<A>, a_col: usize)
260 where
261 R: VecZnxToMut,
262 A: VecZnxToRef;
263}
264
265/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
266/// * See [crate::implementation::cpu_spqlios::vec_znx::vec_znx_switch_degree_ref] for reference code.
267/// * See [crate::hal::api::VecZnxSwithcDegree] for corresponding public API.
268/// * See [crate::doc::backend_safety] for safety contract.
269pub unsafe trait VecZnxSwithcDegreeImpl<B: Backend> {
270 fn vec_znx_switch_degree_impl<R: VecZnxToMut, A: VecZnxToRef>(
271 module: &Module<B>,
272 res: &mut R,
273 res_col: usize,
274 a: &A,
275 a_col: usize,
276 );
277}
278
279/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
280/// * See [crate::implementation::cpu_spqlios::vec_znx::vec_znx_copy_ref] for reference code.
281/// * See [crate::hal::api::VecZnxCopy] for corresponding public API.
282/// * See [crate::doc::backend_safety] for safety contract.
283pub unsafe trait VecZnxCopyImpl<B: Backend> {
284 fn vec_znx_copy_impl<R, A>(module: &Module<B>, res: &mut R, res_col: usize, a: &A, a_col: usize)
285 where
286 R: VecZnxToMut,
287 A: VecZnxToRef;
288}
289
290/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
291/// * See [crate::hal::api::VecZnxFillUniform] for corresponding public API.
292/// * See [crate::doc::backend_safety] for safety contract.
293pub unsafe trait VecZnxFillUniformImpl<B: Backend> {
294 fn vec_znx_fill_uniform_impl<R>(module: &Module<B>, basek: usize, res: &mut R, res_col: usize, k: usize, source: &mut Source)
295 where
296 R: VecZnxToMut;
297}
298
299/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
300/// * See [crate::hal::api::VecZnxFillDistF64] for corresponding public API.
301/// * See [crate::doc::backend_safety] for safety contract.
302pub unsafe trait VecZnxFillDistF64Impl<B: Backend> {
303 fn vec_znx_fill_dist_f64_impl<R, D: Distribution<f64>>(
304 module: &Module<B>,
305 basek: usize,
306 res: &mut R,
307 res_col: usize,
308 k: usize,
309 source: &mut Source,
310 dist: D,
311 bound: f64,
312 ) where
313 R: VecZnxToMut;
314}
315
316/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
317/// * See [crate::hal::api::VecZnxAddDistF64] for corresponding public API.
318/// * See [crate::doc::backend_safety] for safety contract.
319pub unsafe trait VecZnxAddDistF64Impl<B: Backend> {
320 fn vec_znx_add_dist_f64_impl<R, D: Distribution<f64>>(
321 module: &Module<B>,
322 basek: usize,
323 res: &mut R,
324 res_col: usize,
325 k: usize,
326 source: &mut Source,
327 dist: D,
328 bound: f64,
329 ) where
330 R: VecZnxToMut;
331}
332
333/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
334/// * See [crate::hal::api::VecZnxFillNormal] for corresponding public API.
335/// * See [crate::doc::backend_safety] for safety contract.
336pub unsafe trait VecZnxFillNormalImpl<B: Backend> {
337 fn vec_znx_fill_normal_impl<R>(
338 module: &Module<B>,
339 basek: usize,
340 res: &mut R,
341 res_col: usize,
342 k: usize,
343 source: &mut Source,
344 sigma: f64,
345 bound: f64,
346 ) where
347 R: VecZnxToMut;
348}
349
350/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
351/// * See [crate::hal::api::VecZnxAddNormal] for corresponding public API.
352/// * See [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}