arnaucube
arnaucube/poulpyPublic Self-hosted repository
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}