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