poulpy/poulpy-cpu-ref/src/reim.rs
poulpy-cpu-ref/src/reim.rsRaw
1use poulpy_hal::reference::fft64::{
2 convolution::{
3 I64ConvolutionByConst1Coeff, I64ConvolutionByConst2Coeffs, I64Extract1BlkContiguous, I64Save1BlkContiguous,
4 i64_convolution_by_const_1coeff_ref, i64_convolution_by_const_2coeffs_ref, i64_extract_1blk_contiguous_ref,
5 i64_save_1blk_contiguous_ref,
6 },
7 reim::{
8 ReimAdd, ReimAddInplace, ReimAddMul, ReimCopy, ReimDFTExecute, ReimFFTTable, ReimFromZnx, ReimIFFTTable, ReimMul,
9 ReimMulInplace, ReimNegate, ReimNegateInplace, ReimSub, ReimSubInplace, ReimSubNegateInplace, ReimToZnx,
10 ReimToZnxInplace, ReimZero, fft_ref, ifft_ref, reim_add_inplace_ref, reim_add_ref, reim_addmul_ref, reim_copy_ref,
11 reim_from_znx_i64_ref, reim_mul_inplace_ref, reim_mul_ref, reim_negate_inplace_ref, reim_negate_ref,
12 reim_sub_inplace_ref, reim_sub_negate_inplace_ref, reim_sub_ref, reim_to_znx_i64_inplace_ref, reim_to_znx_i64_ref,
13 reim_zero_ref,
14 },
15 reim4::{
16 Reim4Convolution1Coeff, Reim4Convolution2Coeffs, Reim4ConvolutionByRealConst1Coeff, Reim4ConvolutionByRealConst2Coeffs,
17 Reim4Extract1BlkContiguous, Reim4Mat1ColProd, Reim4Mat2Cols2ndColProd, Reim4Mat2ColsProd, Reim4Save1Blk,
18 Reim4Save1BlkContiguous, Reim4Save2Blks, reim4_convolution_1coeff_ref, reim4_convolution_2coeffs_ref,
19 reim4_convolution_by_real_const_1coeff_ref, reim4_convolution_by_real_const_2coeffs_ref,
20 reim4_extract_1blk_from_reim_contiguous_ref, reim4_save_1blk_to_reim_contiguous_ref, reim4_save_1blk_to_reim_ref,
21 reim4_save_2blk_to_reim_ref, reim4_vec_mat1col_product_ref, reim4_vec_mat2cols_2ndcol_product_ref,
22 reim4_vec_mat2cols_product_ref,
23 },
24};
25
26use crate::FFT64Ref;
27
28impl ReimDFTExecute<ReimFFTTable<f64>, f64> for FFT64Ref {
29 fn reim_dft_execute(table: &ReimFFTTable<f64>, data: &mut [f64]) {
30 fft_ref(table.m(), table.omg(), data);
31 }
32}
33
34impl ReimDFTExecute<ReimIFFTTable<f64>, f64> for FFT64Ref {
35 fn reim_dft_execute(table: &ReimIFFTTable<f64>, data: &mut [f64]) {
36 ifft_ref(table.m(), table.omg(), data);
37 }
38}
39
40impl ReimFromZnx for FFT64Ref {
41 #[inline(always)]
42 fn reim_from_znx(res: &mut [f64], a: &[i64]) {
43 reim_from_znx_i64_ref(res, a);
44 }
45}
46
47impl ReimToZnx for FFT64Ref {
48 #[inline(always)]
49 fn reim_to_znx(res: &mut [i64], divisor: f64, a: &[f64]) {
50 reim_to_znx_i64_ref(res, divisor, a);
51 }
52}
53
54impl ReimToZnxInplace for FFT64Ref {
55 #[inline(always)]
56 fn reim_to_znx_inplace(res: &mut [f64], divisor: f64) {
57 reim_to_znx_i64_inplace_ref(res, divisor);
58 }
59}
60
61impl ReimAdd for FFT64Ref {
62 #[inline(always)]
63 fn reim_add(res: &mut [f64], a: &[f64], b: &[f64]) {
64 reim_add_ref(res, a, b);
65 }
66}
67
68impl ReimAddInplace for FFT64Ref {
69 #[inline(always)]
70 fn reim_add_inplace(res: &mut [f64], a: &[f64]) {
71 reim_add_inplace_ref(res, a);
72 }
73}
74
75impl ReimSub for FFT64Ref {
76 #[inline(always)]
77 fn reim_sub(res: &mut [f64], a: &[f64], b: &[f64]) {
78 reim_sub_ref(res, a, b);
79 }
80}
81
82impl ReimSubInplace for FFT64Ref {
83 #[inline(always)]
84 fn reim_sub_inplace(res: &mut [f64], a: &[f64]) {
85 reim_sub_inplace_ref(res, a);
86 }
87}
88
89impl ReimSubNegateInplace for FFT64Ref {
90 #[inline(always)]
91 fn reim_sub_negate_inplace(res: &mut [f64], a: &[f64]) {
92 reim_sub_negate_inplace_ref(res, a);
93 }
94}
95
96impl ReimNegate for FFT64Ref {
97 #[inline(always)]
98 fn reim_negate(res: &mut [f64], a: &[f64]) {
99 reim_negate_ref(res, a);
100 }
101}
102
103impl ReimNegateInplace for FFT64Ref {
104 #[inline(always)]
105 fn reim_negate_inplace(res: &mut [f64]) {
106 reim_negate_inplace_ref(res);
107 }
108}
109
110impl ReimMul for FFT64Ref {
111 #[inline(always)]
112 fn reim_mul(res: &mut [f64], a: &[f64], b: &[f64]) {
113 reim_mul_ref(res, a, b);
114 }
115}
116
117impl ReimMulInplace for FFT64Ref {
118 #[inline(always)]
119 fn reim_mul_inplace(res: &mut [f64], a: &[f64]) {
120 reim_mul_inplace_ref(res, a);
121 }
122}
123
124impl ReimAddMul for FFT64Ref {
125 #[inline(always)]
126 fn reim_addmul(res: &mut [f64], a: &[f64], b: &[f64]) {
127 reim_addmul_ref(res, a, b);
128 }
129}
130
131impl ReimCopy for FFT64Ref {
132 #[inline(always)]
133 fn reim_copy(res: &mut [f64], a: &[f64]) {
134 reim_copy_ref(res, a);
135 }
136}
137
138impl ReimZero for FFT64Ref {
139 #[inline(always)]
140 fn reim_zero(res: &mut [f64]) {
141 reim_zero_ref(res);
142 }
143}
144
145impl Reim4Convolution1Coeff for FFT64Ref {
146 fn reim4_convolution_1coeff(k: usize, dst: &mut [f64; 8], a: &[f64], a_size: usize, b: &[f64], b_size: usize) {
147 reim4_convolution_1coeff_ref(k, dst, a, a_size, b, b_size);
148 }
149}
150
151impl Reim4Convolution2Coeffs for FFT64Ref {
152 fn reim4_convolution_2coeffs(k: usize, dst: &mut [f64; 16], a: &[f64], a_size: usize, b: &[f64], b_size: usize) {
153 reim4_convolution_2coeffs_ref(k, dst, a, a_size, b, b_size);
154 }
155}
156
157impl Reim4Extract1BlkContiguous for FFT64Ref {
158 #[inline(always)]
159 fn reim4_extract_1blk_contiguous(m: usize, rows: usize, blk: usize, dst: &mut [f64], src: &[f64]) {
160 reim4_extract_1blk_from_reim_contiguous_ref(m, rows, blk, dst, src);
161 }
162}
163
164impl Reim4Save1BlkContiguous for FFT64Ref {
165 #[inline(always)]
166 fn reim4_save_1blk_contiguous(m: usize, rows: usize, blk: usize, dst: &mut [f64], src: &[f64]) {
167 reim4_save_1blk_to_reim_contiguous_ref(m, rows, blk, dst, src);
168 }
169}
170
171impl Reim4Save1Blk for FFT64Ref {
172 #[inline(always)]
173 fn reim4_save_1blk<const OVERWRITE: bool>(m: usize, blk: usize, dst: &mut [f64], src: &[f64]) {
174 reim4_save_1blk_to_reim_ref::<OVERWRITE>(m, blk, dst, src);
175 }
176}
177
178impl Reim4Save2Blks for FFT64Ref {
179 #[inline(always)]
180 fn reim4_save_2blks<const OVERWRITE: bool>(m: usize, blk: usize, dst: &mut [f64], src: &[f64]) {
181 reim4_save_2blk_to_reim_ref::<OVERWRITE>(m, blk, dst, src);
182 }
183}
184
185impl Reim4Mat1ColProd for FFT64Ref {
186 #[inline(always)]
187 fn reim4_mat1col_prod(nrows: usize, dst: &mut [f64], u: &[f64], v: &[f64]) {
188 reim4_vec_mat1col_product_ref(nrows, dst, u, v);
189 }
190}
191
192impl Reim4Mat2ColsProd for FFT64Ref {
193 #[inline(always)]
194 fn reim4_mat2cols_prod(nrows: usize, dst: &mut [f64], u: &[f64], v: &[f64]) {
195 reim4_vec_mat2cols_product_ref(nrows, dst, u, v);
196 }
197}
198
199impl Reim4Mat2Cols2ndColProd for FFT64Ref {
200 #[inline(always)]
201 fn reim4_mat2cols_2ndcol_prod(nrows: usize, dst: &mut [f64], u: &[f64], v: &[f64]) {
202 reim4_vec_mat2cols_2ndcol_product_ref(nrows, dst, u, v);
203 }
204}
205
206impl Reim4ConvolutionByRealConst1Coeff for FFT64Ref {
207 #[inline(always)]
208 fn reim4_convolution_by_real_const_1coeff(k: usize, dst: &mut [f64; 8], a: &[f64], a_size: usize, b: &[f64]) {
209 reim4_convolution_by_real_const_1coeff_ref(k, dst, a, a_size, b);
210 }
211}
212
213impl Reim4ConvolutionByRealConst2Coeffs for FFT64Ref {
214 #[inline(always)]
215 fn reim4_convolution_by_real_const_2coeffs(k: usize, dst: &mut [f64; 16], a: &[f64], a_size: usize, b: &[f64]) {
216 reim4_convolution_by_real_const_2coeffs_ref(k, dst, a, a_size, b);
217 }
218}
219
220impl I64ConvolutionByConst1Coeff for FFT64Ref {
221 #[inline(always)]
222 fn i64_convolution_by_const_1coeff(k: usize, dst: &mut [i64; 8], a: &[i64], a_size: usize, b: &[i64]) {
223 i64_convolution_by_const_1coeff_ref(k, dst, a, a_size, b);
224 }
225}
226
227impl I64ConvolutionByConst2Coeffs for FFT64Ref {
228 #[inline(always)]
229 fn i64_convolution_by_const_2coeffs(k: usize, dst: &mut [i64; 16], a: &[i64], a_size: usize, b: &[i64]) {
230 i64_convolution_by_const_2coeffs_ref(k, dst, a, a_size, b);
231 }
232}
233
234impl I64Save1BlkContiguous for FFT64Ref {
235 #[inline(always)]
236 fn i64_save_1blk_contiguous(n: usize, offset: usize, rows: usize, blk: usize, dst: &mut [i64], src: &[i64]) {
237 i64_save_1blk_contiguous_ref(n, offset, rows, blk, dst, src);
238 }
239}
240
241impl I64Extract1BlkContiguous for FFT64Ref {
242 #[inline(always)]
243 fn i64_extract_1blk_contiguous(n: usize, offset: usize, rows: usize, blk: usize, dst: &mut [i64], src: &[i64]) {
244 i64_extract_1blk_contiguous_ref(n, offset, rows, blk, dst, src);
245 }
246}