arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/backend/src/hal/api/vec_znx.rs
backend/src/hal/api/vec_znx.rsRaw
  1use rand_distr::Distribution;
  2use sampling::source::Source;
  3
  4use crate::hal::layouts::{Backend, ScalarZnxToRef, Scratch, VecZnxToMut, VecZnxToRef};
  5
  6pub trait VecZnxNormalizeTmpBytes {
  7    /// Returns the minimum number of bytes necessary for normalization.
  8    fn vec_znx_normalize_tmp_bytes(&self, n: usize) -> usize;
  9}
 10
 11pub trait VecZnxNormalize<B: Backend> {
 12    /// Normalizes the selected column of `a` and stores the result into the selected column of `res`.
 13    fn vec_znx_normalize<R, A>(&self, basek: usize, res: &mut R, res_col: usize, a: &A, a_col: usize, scratch: &mut Scratch<B>)
 14    where
 15        R: VecZnxToMut,
 16        A: VecZnxToRef;
 17}
 18
 19pub trait VecZnxNormalizeInplace<B: Backend> {
 20    /// Normalizes the selected column of `a`.
 21    fn vec_znx_normalize_inplace<A>(&self, basek: usize, a: &mut A, a_col: usize, scratch: &mut Scratch<B>)
 22    where
 23        A: VecZnxToMut;
 24}
 25
 26pub trait VecZnxAdd {
 27    /// Adds the selected column of `a` to the selected column of `b` and writes the result on the selected column of `res`.
 28    fn vec_znx_add<R, A, B>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &B, b_col: usize)
 29    where
 30        R: VecZnxToMut,
 31        A: VecZnxToRef,
 32        B: VecZnxToRef;
 33}
 34
 35pub trait VecZnxAddInplace {
 36    /// Adds the selected column of `a` to the selected column of `res` and writes the result on the selected column of `res`.
 37    fn vec_znx_add_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
 38    where
 39        R: VecZnxToMut,
 40        A: VecZnxToRef;
 41}
 42
 43pub trait VecZnxAddScalarInplace {
 44    /// Adds the selected column of `a` on the selected column and limb of `res`.
 45    fn vec_znx_add_scalar_inplace<R, A>(&self, res: &mut R, res_col: usize, res_limb: usize, a: &A, a_col: usize)
 46    where
 47        R: VecZnxToMut,
 48        A: ScalarZnxToRef;
 49}
 50
 51pub trait VecZnxSub {
 52    /// Subtracts the selected column of `b` from the selected column of `a` and writes the result on the selected column of `res`.
 53    fn vec_znx_sub<R, A, B>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &B, b_col: usize)
 54    where
 55        R: VecZnxToMut,
 56        A: VecZnxToRef,
 57        B: VecZnxToRef;
 58}
 59
 60pub trait VecZnxSubABInplace {
 61    /// Subtracts the selected column of `a` from the selected column of `res` inplace.
 62    ///
 63    /// res\[res_col\] -= a\[a_col\]
 64    fn vec_znx_sub_ab_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
 65    where
 66        R: VecZnxToMut,
 67        A: VecZnxToRef;
 68}
 69
 70pub trait VecZnxSubBAInplace {
 71    /// Subtracts the selected column of `res` from the selected column of `a` and inplace mutates `res`
 72    ///
 73    /// res\[res_col\] = a\[a_col\] - res\[res_col\]
 74    fn vec_znx_sub_ba_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
 75    where
 76        R: VecZnxToMut,
 77        A: VecZnxToRef;
 78}
 79
 80pub trait VecZnxSubScalarInplace {
 81    /// Subtracts the selected column of `a` on the selected column and limb of `res`.
 82    fn vec_znx_sub_scalar_inplace<R, A>(&self, res: &mut R, res_col: usize, res_limb: usize, a: &A, a_col: usize)
 83    where
 84        R: VecZnxToMut,
 85        A: ScalarZnxToRef;
 86}
 87
 88pub trait VecZnxNegate {
 89    // Negates the selected column of `a` and stores the result in `res_col` of `res`.
 90    fn vec_znx_negate<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
 91    where
 92        R: VecZnxToMut,
 93        A: VecZnxToRef;
 94}
 95
 96pub trait VecZnxNegateInplace {
 97    /// Negates the selected column of `a`.
 98    fn vec_znx_negate_inplace<A>(&self, a: &mut A, a_col: usize)
 99    where
100        A: VecZnxToMut;
101}
102
103pub trait VecZnxLshInplace {
104    /// Left shift by k bits all columns of `a`.
105    fn vec_znx_lsh_inplace<A>(&self, basek: usize, k: usize, a: &mut A)
106    where
107        A: VecZnxToMut;
108}
109
110pub trait VecZnxRshInplace {
111    /// Right shift by k bits all columns of `a`.
112    fn vec_znx_rsh_inplace<A>(&self, basek: usize, k: usize, a: &mut A)
113    where
114        A: VecZnxToMut;
115}
116
117pub trait VecZnxRotate {
118    /// Multiplies the selected column of `a` by X^k and stores the result in `res_col` of `res`.
119    fn vec_znx_rotate<R, A>(&self, k: i64, res: &mut R, res_col: usize, a: &A, a_col: usize)
120    where
121        R: VecZnxToMut,
122        A: VecZnxToRef;
123}
124
125pub trait VecZnxRotateInplace {
126    /// Multiplies the selected column of `a` by X^k.
127    fn vec_znx_rotate_inplace<A>(&self, k: i64, a: &mut A, a_col: usize)
128    where
129        A: VecZnxToMut;
130}
131
132pub trait VecZnxAutomorphism {
133    /// Applies the automorphism X^i -> X^ik on the selected column of `a` and stores the result in `res_col` column of `res`.
134    fn vec_znx_automorphism<R, A>(&self, k: i64, res: &mut R, res_col: usize, a: &A, a_col: usize)
135    where
136        R: VecZnxToMut,
137        A: VecZnxToRef;
138}
139
140pub trait VecZnxAutomorphismInplace {
141    /// Applies the automorphism X^i -> X^ik on the selected column of `a`.
142    fn vec_znx_automorphism_inplace<A>(&self, k: i64, a: &mut A, a_col: usize)
143    where
144        A: VecZnxToMut;
145}
146
147pub trait VecZnxMulXpMinusOne {
148    fn vec_znx_mul_xp_minus_one<R, A>(&self, p: i64, r: &mut R, r_col: usize, a: &A, a_col: usize)
149    where
150        R: VecZnxToMut,
151        A: VecZnxToRef;
152}
153
154pub trait VecZnxMulXpMinusOneInplace {
155    fn vec_znx_mul_xp_minus_one_inplace<R>(&self, p: i64, r: &mut R, r_col: usize)
156    where
157        R: VecZnxToMut;
158}
159
160pub trait VecZnxSplit<B: Backend> {
161    /// Splits the selected columns of `b` into subrings and copies them them into the selected column of `res`.
162    ///
163    /// # Panics
164    ///
165    /// This method requires that all [crate::hal::layouts::VecZnx] of b have the same ring degree
166    /// and that b.n() * b.len() <= a.n()
167    fn vec_znx_split<R, A>(&self, res: &mut [R], res_col: usize, a: &A, a_col: usize, scratch: &mut Scratch<B>)
168    where
169        R: VecZnxToMut,
170        A: VecZnxToRef;
171}
172
173pub trait VecZnxMerge {
174    /// Merges the subrings of the selected column of `a` into the selected column of `res`.
175    ///
176    /// # Panics
177    ///
178    /// This method requires that all [crate::hal::layouts::VecZnx] of a have the same ring degree
179    /// and that a.n() * a.len() <= b.n()
180    fn vec_znx_merge<R, A>(&self, res: &mut R, res_col: usize, a: &[A], a_col: usize)
181    where
182        R: VecZnxToMut,
183        A: VecZnxToRef;
184}
185
186pub trait VecZnxSwithcDegree {
187    fn vec_znx_switch_degree<R, A>(&self, res: &mut R, res_col: usize, a: &A, col_a: usize)
188    where
189        R: VecZnxToMut,
190        A: VecZnxToRef;
191}
192
193pub trait VecZnxCopy {
194    fn vec_znx_copy<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
195    where
196        R: VecZnxToMut,
197        A: VecZnxToRef;
198}
199
200pub trait VecZnxFillUniform {
201    /// Fills the first `size` size with uniform values in \[-2^{basek-1}, 2^{basek-1}\]
202    fn vec_znx_fill_uniform<R>(&self, basek: usize, res: &mut R, res_col: usize, k: usize, source: &mut Source)
203    where
204        R: VecZnxToMut;
205}
206
207#[allow(clippy::too_many_arguments)]
208pub trait VecZnxFillDistF64 {
209    fn vec_znx_fill_dist_f64<R, D: Distribution<f64>>(
210        &self,
211        basek: usize,
212        res: &mut R,
213        res_col: usize,
214        k: usize,
215        source: &mut Source,
216        dist: D,
217        bound: f64,
218    ) where
219        R: VecZnxToMut;
220}
221
222#[allow(clippy::too_many_arguments)]
223pub trait VecZnxAddDistF64 {
224    /// Adds vector sampled according to the provided distribution, scaled by 2^{-k} and bounded to \[-bound, bound\].
225    fn vec_znx_add_dist_f64<R, D: Distribution<f64>>(
226        &self,
227        basek: usize,
228        res: &mut R,
229        res_col: usize,
230        k: usize,
231        source: &mut Source,
232        dist: D,
233        bound: f64,
234    ) where
235        R: VecZnxToMut;
236}
237
238#[allow(clippy::too_many_arguments)]
239pub trait VecZnxFillNormal {
240    fn vec_znx_fill_normal<R>(
241        &self,
242        basek: usize,
243        res: &mut R,
244        res_col: usize,
245        k: usize,
246        source: &mut Source,
247        sigma: f64,
248        bound: f64,
249    ) where
250        R: VecZnxToMut;
251}
252
253#[allow(clippy::too_many_arguments)]
254pub trait VecZnxAddNormal {
255    /// Adds a discrete normal vector scaled by 2^{-k} with the provided standard deviation and bounded to \[-bound, bound\].
256    fn vec_znx_add_normal<R>(
257        &self,
258        basek: usize,
259        res: &mut R,
260        res_col: usize,
261        k: usize,
262        source: &mut Source,
263        sigma: f64,
264        bound: f64,
265    ) where
266        R: VecZnxToMut;
267}