1use crate::{
2 api::{
3 VecZnxDftAddAssign, VecZnxDftAddInto, VecZnxDftAddScaledAssign, VecZnxDftAlloc, VecZnxDftApply, VecZnxDftAutomorphism,
4 VecZnxDftAutomorphismPlan, VecZnxDftBytesOf, VecZnxDftCopy, VecZnxDftFromBytes, VecZnxDftSub, VecZnxDftSubAssign,
5 VecZnxDftSubNegateAssign, VecZnxDftZero, VecZnxIdftApply, VecZnxIdftApplyTmpA, VecZnxIdftApplyTmpBytes,
6 VecZnxIdftNormalizeConsume, VecZnxIdftNormalizeConsumeTmpBytes,
7 },
8 layouts::{
9 Backend, Module, ScratchArena, VecZnxBackendMut, VecZnxBackendRef, VecZnxBigBackendMut, VecZnxDftBackendMut,
10 VecZnxDftBackendRef, VecZnxDftOwned,
11 },
12 oep::HalVecZnxDftImpl,
13};
14
15macro_rules! impl_vec_znx_dft_delegate {
16 ($trait:ty, $($body:item)+) => {
17 impl<B> $trait for Module<B>
18 where
19 B: Backend<ZnxWord = i64> + HalVecZnxDftImpl<B>,
20 {
21 $($body)+
22 }
23 };
24}
25
26impl<B: Backend> VecZnxDftFromBytes<B> for Module<B> {
27 fn vec_znx_dft_from_bytes(&self, cols: usize, size: usize, bytes: Vec<u8>) -> VecZnxDftOwned<B> {
28 VecZnxDftOwned::<B>::from_bytes(self.n(), cols, size, bytes)
29 }
30}
31
32impl<B: Backend> VecZnxDftBytesOf for Module<B> {
33 fn bytes_of_vec_znx_dft(&self, cols: usize, size: usize) -> usize {
34 B::bytes_of_vec_znx_dft(self.n(), cols, size)
35 }
36}
37
38impl<B: Backend> VecZnxDftAlloc<B> for Module<B> {
39 fn vec_znx_dft_alloc(&self, cols: usize, size: usize) -> VecZnxDftOwned<B> {
40 VecZnxDftOwned::<B>::alloc(self.n(), cols, size)
41 }
42}
43
44impl_vec_znx_dft_delegate!(
45 VecZnxIdftApplyTmpBytes,
46 fn vec_znx_idft_apply_tmp_bytes(&self) -> usize {
47 B::vec_znx_idft_apply_tmp_bytes(self)
48 }
49);
50
51impl_vec_znx_dft_delegate!(
52 VecZnxIdftApply<B>,
53 fn vec_znx_idft_apply(
54 &self,
55 res: &mut VecZnxBigBackendMut<'_, B>,
56 res_col: usize,
57 a: &VecZnxDftBackendRef<'_, B>,
58 a_col: usize,
59 scratch: &mut ScratchArena<'_, B>,
60 ) {
61 B::vec_znx_idft_apply(self, res, res_col, a, a_col, scratch)
62 }
63);
64
65impl_vec_znx_dft_delegate!(
66 VecZnxIdftNormalizeConsumeTmpBytes,
67 fn vec_znx_idft_normalize_consume_tmp_bytes(&self, res_size: usize, a_size: usize) -> usize {
68 B::vec_znx_idft_normalize_consume_tmp_bytes(self, res_size, a_size)
69 }
70);
71
72impl_vec_znx_dft_delegate!(
73 VecZnxIdftNormalizeConsume<B>,
74 fn vec_znx_idft_normalize_consume(
75 &self,
76 res: &mut VecZnxBackendMut<'_, B>,
77 res_base2k: usize,
78 res_k: usize,
79 res_col: usize,
80 a: &mut VecZnxDftBackendMut<'_, B>,
81 a_col: usize,
82 a_base2k: usize,
83 addend: Option<(&VecZnxBackendRef<'_, B>, usize)>,
84 scratch: &mut ScratchArena<'_, B>,
85 ) {
86 B::vec_znx_idft_normalize_consume(self, res, res_base2k, res_k, res_col, a, a_col, a_base2k, addend, scratch);
87 }
88);
89
90impl_vec_znx_dft_delegate!(
91 VecZnxIdftApplyTmpA<B>,
92 fn vec_znx_idft_apply_tmpa(
93 &self,
94 res: &mut VecZnxBigBackendMut<'_, B>,
95 res_col: usize,
96 a: &mut VecZnxDftBackendMut<'_, B>,
97 a_col: usize,
98 ) {
99 B::vec_znx_idft_apply_tmpa(self, res, res_col, a, a_col);
100 }
101);
102
103impl_vec_znx_dft_delegate!(
104 VecZnxDftApply<B>,
105 fn vec_znx_dft_apply(
106 &self,
107 step: usize,
108 offset: usize,
109 res: &mut VecZnxDftBackendMut<'_, B>,
110 res_col: usize,
111 a: &VecZnxBackendRef<'_, B>,
112 a_col: usize,
113 ) {
114 B::vec_znx_dft_apply(self, step, offset, res, res_col, a, a_col);
115 }
116);
117
118impl_vec_znx_dft_delegate!(
119 VecZnxDftAddInto<B>,
120 fn vec_znx_dft_add_into(
121 &self,
122 res: &mut VecZnxDftBackendMut<'_, B>,
123 res_col: usize,
124 a: &VecZnxDftBackendRef<'_, B>,
125 a_col: usize,
126 b: &VecZnxDftBackendRef<'_, B>,
127 b_col: usize,
128 ) {
129 B::vec_znx_dft_add_into(self, res, res_col, a, a_col, b, b_col);
130 }
131);
132
133impl_vec_znx_dft_delegate!(
134 VecZnxDftAddAssign<B>,
135 fn vec_znx_dft_add_assign(
136 &self,
137 res: &mut VecZnxDftBackendMut<'_, B>,
138 res_col: usize,
139 a: &VecZnxDftBackendRef<'_, B>,
140 a_col: usize,
141 ) {
142 B::vec_znx_dft_add_assign(self, res, res_col, a, a_col);
143 }
144);
145
146impl_vec_znx_dft_delegate!(
147 VecZnxDftAddScaledAssign<B>,
148 fn vec_znx_dft_add_scaled_assign(
149 &self,
150 res: &mut VecZnxDftBackendMut<'_, B>,
151 res_col: usize,
152 a: &VecZnxDftBackendRef<'_, B>,
153 a_col: usize,
154 a_scale: i64,
155 ) {
156 B::vec_znx_dft_add_scaled_assign(self, res, res_col, a, a_col, a_scale);
157 }
158);
159
160impl_vec_znx_dft_delegate!(
161 VecZnxDftSub<B>,
162 fn vec_znx_dft_sub(
163 &self,
164 res: &mut VecZnxDftBackendMut<'_, B>,
165 res_col: usize,
166 a: &VecZnxDftBackendRef<'_, B>,
167 a_col: usize,
168 b: &VecZnxDftBackendRef<'_, B>,
169 b_col: usize,
170 ) {
171 B::vec_znx_dft_sub(self, res, res_col, a, a_col, b, b_col);
172 }
173);
174
175impl_vec_znx_dft_delegate!(
176 VecZnxDftSubAssign<B>,
177 fn vec_znx_dft_sub_assign(
178 &self,
179 res: &mut VecZnxDftBackendMut<'_, B>,
180 res_col: usize,
181 a: &VecZnxDftBackendRef<'_, B>,
182 a_col: usize,
183 ) {
184 B::vec_znx_dft_sub_assign(self, res, res_col, a, a_col);
185 }
186);
187
188impl_vec_znx_dft_delegate!(
189 VecZnxDftSubNegateAssign<B>,
190 fn vec_znx_dft_sub_negate_assign(
191 &self,
192 res: &mut VecZnxDftBackendMut<'_, B>,
193 res_col: usize,
194 a: &VecZnxDftBackendRef<'_, B>,
195 a_col: usize,
196 ) {
197 B::vec_znx_dft_sub_negate_assign(self, res, res_col, a, a_col);
198 }
199);
200
201impl_vec_znx_dft_delegate!(
202 VecZnxDftCopy<B>,
203 fn vec_znx_dft_copy(
204 &self,
205 step: usize,
206 offset: usize,
207 res: &mut VecZnxDftBackendMut<'_, B>,
208 res_col: usize,
209 a: &VecZnxDftBackendRef<'_, B>,
210 a_col: usize,
211 ) {
212 B::vec_znx_dft_copy(self, step, offset, res, res_col, a, a_col);
213 }
214);
215
216impl_vec_znx_dft_delegate!(
217 VecZnxDftZero<B>,
218 fn vec_znx_dft_zero(&self, res: &mut VecZnxDftBackendMut<'_, B>, res_col: usize) {
219 B::vec_znx_dft_zero(self, res, res_col);
220 }
221);
222
223impl<B> VecZnxDftAutomorphismPlan<B> for Module<B>
224where
225 B: Backend + HalVecZnxDftImpl<B>,
226{
227 type Plan = <B as HalVecZnxDftImpl<B>>::AutomorphismPlan;
228
229 fn vec_znx_dft_automorphism_plan(&self, p: i64) -> Self::Plan {
230 B::vec_znx_dft_automorphism_plan(self, p)
231 }
232}
233
234impl<B> VecZnxDftAutomorphism<B> for Module<B>
235where
236 B: Backend + HalVecZnxDftImpl<B>,
237{
238 fn vec_znx_dft_automorphism_with_plan(
239 &self,
240 plan: &Self::Plan,
241 res: &mut VecZnxDftBackendMut<'_, B>,
242 res_col: usize,
243 a: &VecZnxDftBackendRef<'_, B>,
244 a_col: usize,
245 ) {
246 B::vec_znx_dft_automorphism_with_plan(self, plan, res, res_col, a, a_col);
247 }
248
249 fn vec_znx_dft_automorphism_add_with_plan(
250 &self,
251 plan: &Self::Plan,
252 res: &mut VecZnxDftBackendMut<'_, B>,
253 res_col: usize,
254 a: &VecZnxDftBackendRef<'_, B>,
255 a_col: usize,
256 ) {
257 B::vec_znx_dft_automorphism_add_with_plan(self, plan, res, res_col, a, a_col);
258 }
259}