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}