Skip to main content

poulpy_hal/delegates/
vec_znx_dft.rs

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}