1use crate::{
2 api::{
3 VecZnxBigAdd, VecZnxBigAddInplace, VecZnxBigAddNormal, VecZnxBigAddSmall, VecZnxBigAddSmallInplace, VecZnxBigAlloc,
4 VecZnxBigAutomorphism, VecZnxBigAutomorphismInplace, VecZnxBigAutomorphismInplaceTmpBytes, VecZnxBigBytesOf,
5 VecZnxBigFromBytes, VecZnxBigFromSmall, VecZnxBigNegate, VecZnxBigNegateInplace, VecZnxBigNormalize,
6 VecZnxBigNormalizeTmpBytes, VecZnxBigSub, VecZnxBigSubInplace, VecZnxBigSubNegateInplace, VecZnxBigSubSmallA,
7 VecZnxBigSubSmallB, VecZnxBigSubSmallInplace, VecZnxBigSubSmallNegateInplace,
8 },
9 layouts::{Backend, Module, Scratch, VecZnxBigOwned, VecZnxBigToMut, VecZnxBigToRef, VecZnxToMut, VecZnxToRef},
10 oep::{
11 VecZnxBigAddImpl, VecZnxBigAddInplaceImpl, VecZnxBigAddNormalImpl, VecZnxBigAddSmallImpl, VecZnxBigAddSmallInplaceImpl,
12 VecZnxBigAllocBytesImpl, VecZnxBigAllocImpl, VecZnxBigAutomorphismImpl, VecZnxBigAutomorphismInplaceImpl,
13 VecZnxBigAutomorphismInplaceTmpBytesImpl, VecZnxBigFromBytesImpl, VecZnxBigFromSmallImpl, VecZnxBigNegateImpl,
14 VecZnxBigNegateInplaceImpl, VecZnxBigNormalizeImpl, VecZnxBigNormalizeTmpBytesImpl, VecZnxBigSubImpl,
15 VecZnxBigSubInplaceImpl, VecZnxBigSubNegateInplaceImpl, VecZnxBigSubSmallAImpl, VecZnxBigSubSmallBImpl,
16 VecZnxBigSubSmallInplaceImpl, VecZnxBigSubSmallNegateInplaceImpl,
17 },
18 source::Source,
19};
20
21impl<B> VecZnxBigFromSmall<B> for Module<B>
22where
23 B: Backend + VecZnxBigFromSmallImpl<B>,
24{
25 fn vec_znx_big_from_small<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
26 where
27 R: VecZnxBigToMut<B>,
28 A: VecZnxToRef,
29 {
30 B::vec_znx_big_from_small_impl(res, res_col, a, a_col);
31 }
32}
33
34impl<B> VecZnxBigAlloc<B> for Module<B>
35where
36 B: Backend + VecZnxBigAllocImpl<B>,
37{
38 fn vec_znx_big_alloc(&self, cols: usize, size: usize) -> VecZnxBigOwned<B> {
39 B::vec_znx_big_alloc_impl(self.n(), cols, size)
40 }
41}
42
43impl<B> VecZnxBigFromBytes<B> for Module<B>
44where
45 B: Backend + VecZnxBigFromBytesImpl<B>,
46{
47 fn vec_znx_big_from_bytes(&self, cols: usize, size: usize, bytes: Vec<u8>) -> VecZnxBigOwned<B> {
48 B::vec_znx_big_from_bytes_impl(self.n(), cols, size, bytes)
49 }
50}
51
52impl<B> VecZnxBigBytesOf for Module<B>
53where
54 B: Backend + VecZnxBigAllocBytesImpl<B>,
55{
56 fn bytes_of_vec_znx_big(&self, cols: usize, size: usize) -> usize {
57 B::vec_znx_big_bytes_of_impl(self.n(), cols, size)
58 }
59}
60
61impl<B> VecZnxBigAddNormal<B> for Module<B>
62where
63 B: Backend + VecZnxBigAddNormalImpl<B>,
64{
65 fn vec_znx_big_add_normal<R: VecZnxBigToMut<B>>(
66 &self,
67 base2k: usize,
68 res: &mut R,
69 res_col: usize,
70 k: usize,
71 source: &mut Source,
72 sigma: f64,
73 bound: f64,
74 ) {
75 B::add_normal_impl(self, base2k, res, res_col, k, source, sigma, bound);
76 }
77}
78
79impl<B> VecZnxBigAdd<B> for Module<B>
80where
81 B: Backend + VecZnxBigAddImpl<B>,
82{
83 fn vec_znx_big_add<R, A, C>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize)
84 where
85 R: VecZnxBigToMut<B>,
86 A: VecZnxBigToRef<B>,
87 C: VecZnxBigToRef<B>,
88 {
89 B::vec_znx_big_add_impl(self, res, res_col, a, a_col, b, b_col);
90 }
91}
92
93impl<B> VecZnxBigAddInplace<B> for Module<B>
94where
95 B: Backend + VecZnxBigAddInplaceImpl<B>,
96{
97 fn vec_znx_big_add_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
98 where
99 R: VecZnxBigToMut<B>,
100 A: VecZnxBigToRef<B>,
101 {
102 B::vec_znx_big_add_inplace_impl(self, res, res_col, a, a_col);
103 }
104}
105
106impl<B> VecZnxBigAddSmall<B> for Module<B>
107where
108 B: Backend + VecZnxBigAddSmallImpl<B>,
109{
110 fn vec_znx_big_add_small<R, A, C>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize)
111 where
112 R: VecZnxBigToMut<B>,
113 A: VecZnxBigToRef<B>,
114 C: VecZnxToRef,
115 {
116 B::vec_znx_big_add_small_impl(self, res, res_col, a, a_col, b, b_col);
117 }
118}
119
120impl<B> VecZnxBigAddSmallInplace<B> for Module<B>
121where
122 B: Backend + VecZnxBigAddSmallInplaceImpl<B>,
123{
124 fn vec_znx_big_add_small_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
125 where
126 R: VecZnxBigToMut<B>,
127 A: VecZnxToRef,
128 {
129 B::vec_znx_big_add_small_inplace_impl(self, res, res_col, a, a_col);
130 }
131}
132
133impl<B> VecZnxBigSub<B> for Module<B>
134where
135 B: Backend + VecZnxBigSubImpl<B>,
136{
137 fn vec_znx_big_sub<R, A, C>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize)
138 where
139 R: VecZnxBigToMut<B>,
140 A: VecZnxBigToRef<B>,
141 C: VecZnxBigToRef<B>,
142 {
143 B::vec_znx_big_sub_impl(self, res, res_col, a, a_col, b, b_col);
144 }
145}
146
147impl<B> VecZnxBigSubInplace<B> for Module<B>
148where
149 B: Backend + VecZnxBigSubInplaceImpl<B>,
150{
151 fn vec_znx_big_sub_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
152 where
153 R: VecZnxBigToMut<B>,
154 A: VecZnxBigToRef<B>,
155 {
156 B::vec_znx_big_sub_inplace_impl(self, res, res_col, a, a_col);
157 }
158}
159
160impl<B> VecZnxBigSubNegateInplace<B> for Module<B>
161where
162 B: Backend + VecZnxBigSubNegateInplaceImpl<B>,
163{
164 fn vec_znx_big_sub_negate_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
165 where
166 R: VecZnxBigToMut<B>,
167 A: VecZnxBigToRef<B>,
168 {
169 B::vec_znx_big_sub_negate_inplace_impl(self, res, res_col, a, a_col);
170 }
171}
172
173impl<B> VecZnxBigSubSmallA<B> for Module<B>
174where
175 B: Backend + VecZnxBigSubSmallAImpl<B>,
176{
177 fn vec_znx_big_sub_small_a<R, A, C>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize)
178 where
179 R: VecZnxBigToMut<B>,
180 A: VecZnxToRef,
181 C: VecZnxBigToRef<B>,
182 {
183 B::vec_znx_big_sub_small_a_impl(self, res, res_col, a, a_col, b, b_col);
184 }
185}
186
187impl<B> VecZnxBigSubSmallInplace<B> for Module<B>
188where
189 B: Backend + VecZnxBigSubSmallInplaceImpl<B>,
190{
191 fn vec_znx_big_sub_small_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
192 where
193 R: VecZnxBigToMut<B>,
194 A: VecZnxToRef,
195 {
196 B::vec_znx_big_sub_small_inplace_impl(self, res, res_col, a, a_col);
197 }
198}
199
200impl<B> VecZnxBigSubSmallB<B> for Module<B>
201where
202 B: Backend + VecZnxBigSubSmallBImpl<B>,
203{
204 fn vec_znx_big_sub_small_b<R, A, C>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize)
205 where
206 R: VecZnxBigToMut<B>,
207 A: VecZnxBigToRef<B>,
208 C: VecZnxToRef,
209 {
210 B::vec_znx_big_sub_small_b_impl(self, res, res_col, a, a_col, b, b_col);
211 }
212}
213
214impl<B> VecZnxBigSubSmallNegateInplace<B> for Module<B>
215where
216 B: Backend + VecZnxBigSubSmallNegateInplaceImpl<B>,
217{
218 fn vec_znx_big_sub_small_negate_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
219 where
220 R: VecZnxBigToMut<B>,
221 A: VecZnxToRef,
222 {
223 B::vec_znx_big_sub_small_negate_inplace_impl(self, res, res_col, a, a_col);
224 }
225}
226
227impl<B> VecZnxBigNegate<B> for Module<B>
228where
229 B: Backend + VecZnxBigNegateImpl<B>,
230{
231 fn vec_znx_big_negate<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
232 where
233 R: VecZnxBigToMut<B>,
234 A: VecZnxBigToRef<B>,
235 {
236 B::vec_znx_big_negate_impl(self, res, res_col, a, a_col);
237 }
238}
239
240impl<B> VecZnxBigNegateInplace<B> for Module<B>
241where
242 B: Backend + VecZnxBigNegateInplaceImpl<B>,
243{
244 fn vec_znx_big_negate_inplace<A>(&self, a: &mut A, a_col: usize)
245 where
246 A: VecZnxBigToMut<B>,
247 {
248 B::vec_znx_big_negate_inplace_impl(self, a, a_col);
249 }
250}
251
252impl<B> VecZnxBigNormalizeTmpBytes for Module<B>
253where
254 B: Backend + VecZnxBigNormalizeTmpBytesImpl<B>,
255{
256 fn vec_znx_big_normalize_tmp_bytes(&self) -> usize {
257 B::vec_znx_big_normalize_tmp_bytes_impl(self)
258 }
259}
260
261impl<B> VecZnxBigNormalize<B> for Module<B>
262where
263 B: Backend + VecZnxBigNormalizeImpl<B>,
264{
265 fn vec_znx_big_normalize<R, A>(
266 &self,
267 res_basek: usize,
268 res: &mut R,
269 res_col: usize,
270 a_basek: usize,
271 a: &A,
272 a_col: usize,
273 scratch: &mut Scratch<B>,
274 ) where
275 R: VecZnxToMut,
276 A: VecZnxBigToRef<B>,
277 {
278 B::vec_znx_big_normalize_impl(self, res_basek, res, res_col, a_basek, a, a_col, scratch);
279 }
280}
281
282impl<B> VecZnxBigAutomorphism<B> for Module<B>
283where
284 B: Backend + VecZnxBigAutomorphismImpl<B>,
285{
286 fn vec_znx_big_automorphism<R, A>(&self, k: i64, res: &mut R, res_col: usize, a: &A, a_col: usize)
287 where
288 R: VecZnxBigToMut<B>,
289 A: VecZnxBigToRef<B>,
290 {
291 B::vec_znx_big_automorphism_impl(self, k, res, res_col, a, a_col);
292 }
293}
294
295impl<B> VecZnxBigAutomorphismInplaceTmpBytes for Module<B>
296where
297 B: Backend + VecZnxBigAutomorphismInplaceTmpBytesImpl<B>,
298{
299 fn vec_znx_big_automorphism_inplace_tmp_bytes(&self) -> usize {
300 B::vec_znx_big_automorphism_inplace_tmp_bytes_impl(self)
301 }
302}
303
304impl<B> VecZnxBigAutomorphismInplace<B> for Module<B>
305where
306 B: Backend + VecZnxBigAutomorphismInplaceImpl<B>,
307{
308 fn vec_znx_big_automorphism_inplace<A>(&self, k: i64, a: &mut A, a_col: usize, scratch: &mut Scratch<B>)
309 where
310 A: VecZnxBigToMut<B>,
311 {
312 B::vec_znx_big_automorphism_inplace_impl(self, k, a, a_col, scratch);
313 }
314}