arnaucube
arnaucube/poulpyPublic Self-hosted repository
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}