arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_fft64_ref/reim.rs
poulpy-backend/src/cpu_fft64_ref/reim.rsRaw
  1use poulpy_hal::reference::fft64::{
  2    reim::{
  3        ReimAdd, ReimAddInplace, ReimAddMul, ReimCopy, ReimDFTExecute, ReimFFTTable, ReimFromZnx, ReimIFFTTable, ReimMul,
  4        ReimMulInplace, ReimNegate, ReimNegateInplace, ReimSub, ReimSubABInplace, ReimSubBAInplace, ReimToZnx, ReimToZnxInplace,
  5        ReimZero, fft_ref, ifft_ref, reim_add_inplace_ref, reim_add_ref, reim_addmul_ref, reim_copy_ref, reim_from_znx_i64_ref,
  6        reim_mul_inplace_ref, reim_mul_ref, reim_negate_inplace_ref, reim_negate_ref, reim_sub_ab_inplace_ref,
  7        reim_sub_ba_inplace_ref, reim_sub_ref, reim_to_znx_i64_inplace_ref, reim_to_znx_i64_ref, reim_zero_ref,
  8    },
  9    reim4::{
 10        Reim4Extract1Blk, Reim4Mat1ColProd, Reim4Mat2Cols2ndColProd, Reim4Mat2ColsProd, Reim4Save1Blk, Reim4Save2Blks,
 11        reim4_extract_1blk_from_reim_ref, reim4_save_1blk_to_reim_ref, reim4_save_2blk_to_reim_ref,
 12        reim4_vec_mat1col_product_ref, reim4_vec_mat2cols_2ndcol_product_ref, reim4_vec_mat2cols_product_ref,
 13    },
 14};
 15
 16use crate::FFT64Ref;
 17
 18impl ReimDFTExecute<ReimFFTTable<f64>, f64> for FFT64Ref {
 19    fn reim_dft_execute(table: &ReimFFTTable<f64>, data: &mut [f64]) {
 20        fft_ref(table.m(), table.omg(), data);
 21    }
 22}
 23
 24impl ReimDFTExecute<ReimIFFTTable<f64>, f64> for FFT64Ref {
 25    fn reim_dft_execute(table: &ReimIFFTTable<f64>, data: &mut [f64]) {
 26        ifft_ref(table.m(), table.omg(), data);
 27    }
 28}
 29
 30impl ReimFromZnx for FFT64Ref {
 31    #[inline(always)]
 32    fn reim_from_znx(res: &mut [f64], a: &[i64]) {
 33        reim_from_znx_i64_ref(res, a);
 34    }
 35}
 36
 37impl ReimToZnx for FFT64Ref {
 38    #[inline(always)]
 39    fn reim_to_znx(res: &mut [i64], divisor: f64, a: &[f64]) {
 40        reim_to_znx_i64_ref(res, divisor, a);
 41    }
 42}
 43
 44impl ReimToZnxInplace for FFT64Ref {
 45    #[inline(always)]
 46    fn reim_to_znx_inplace(res: &mut [f64], divisor: f64) {
 47        reim_to_znx_i64_inplace_ref(res, divisor);
 48    }
 49}
 50
 51impl ReimAdd for FFT64Ref {
 52    #[inline(always)]
 53    fn reim_add(res: &mut [f64], a: &[f64], b: &[f64]) {
 54        reim_add_ref(res, a, b);
 55    }
 56}
 57
 58impl ReimAddInplace for FFT64Ref {
 59    #[inline(always)]
 60    fn reim_add_inplace(res: &mut [f64], a: &[f64]) {
 61        reim_add_inplace_ref(res, a);
 62    }
 63}
 64
 65impl ReimSub for FFT64Ref {
 66    #[inline(always)]
 67    fn reim_sub(res: &mut [f64], a: &[f64], b: &[f64]) {
 68        reim_sub_ref(res, a, b);
 69    }
 70}
 71
 72impl ReimSubABInplace for FFT64Ref {
 73    #[inline(always)]
 74    fn reim_sub_ab_inplace(res: &mut [f64], a: &[f64]) {
 75        reim_sub_ab_inplace_ref(res, a);
 76    }
 77}
 78
 79impl ReimSubBAInplace for FFT64Ref {
 80    #[inline(always)]
 81    fn reim_sub_ba_inplace(res: &mut [f64], a: &[f64]) {
 82        reim_sub_ba_inplace_ref(res, a);
 83    }
 84}
 85
 86impl ReimNegate for FFT64Ref {
 87    #[inline(always)]
 88    fn reim_negate(res: &mut [f64], a: &[f64]) {
 89        reim_negate_ref(res, a);
 90    }
 91}
 92
 93impl ReimNegateInplace for FFT64Ref {
 94    #[inline(always)]
 95    fn reim_negate_inplace(res: &mut [f64]) {
 96        reim_negate_inplace_ref(res);
 97    }
 98}
 99
100impl ReimMul for FFT64Ref {
101    #[inline(always)]
102    fn reim_mul(res: &mut [f64], a: &[f64], b: &[f64]) {
103        reim_mul_ref(res, a, b);
104    }
105}
106
107impl ReimMulInplace for FFT64Ref {
108    #[inline(always)]
109    fn reim_mul_inplace(res: &mut [f64], a: &[f64]) {
110        reim_mul_inplace_ref(res, a);
111    }
112}
113
114impl ReimAddMul for FFT64Ref {
115    #[inline(always)]
116    fn reim_addmul(res: &mut [f64], a: &[f64], b: &[f64]) {
117        reim_addmul_ref(res, a, b);
118    }
119}
120
121impl ReimCopy for FFT64Ref {
122    #[inline(always)]
123    fn reim_copy(res: &mut [f64], a: &[f64]) {
124        reim_copy_ref(res, a);
125    }
126}
127
128impl ReimZero for FFT64Ref {
129    #[inline(always)]
130    fn reim_zero(res: &mut [f64]) {
131        reim_zero_ref(res);
132    }
133}
134
135impl Reim4Extract1Blk for FFT64Ref {
136    #[inline(always)]
137    fn reim4_extract_1blk(m: usize, rows: usize, blk: usize, dst: &mut [f64], src: &[f64]) {
138        reim4_extract_1blk_from_reim_ref(m, rows, blk, dst, src);
139    }
140}
141
142impl Reim4Save1Blk for FFT64Ref {
143    #[inline(always)]
144    fn reim4_save_1blk<const OVERWRITE: bool>(m: usize, blk: usize, dst: &mut [f64], src: &[f64]) {
145        reim4_save_1blk_to_reim_ref::<OVERWRITE>(m, blk, dst, src);
146    }
147}
148
149impl Reim4Save2Blks for FFT64Ref {
150    #[inline(always)]
151    fn reim4_save_2blks<const OVERWRITE: bool>(m: usize, blk: usize, dst: &mut [f64], src: &[f64]) {
152        reim4_save_2blk_to_reim_ref::<OVERWRITE>(m, blk, dst, src);
153    }
154}
155
156impl Reim4Mat1ColProd for FFT64Ref {
157    #[inline(always)]
158    fn reim4_mat1col_prod(nrows: usize, dst: &mut [f64], u: &[f64], v: &[f64]) {
159        reim4_vec_mat1col_product_ref(nrows, dst, u, v);
160    }
161}
162
163impl Reim4Mat2ColsProd for FFT64Ref {
164    #[inline(always)]
165    fn reim4_mat2cols_prod(nrows: usize, dst: &mut [f64], u: &[f64], v: &[f64]) {
166        reim4_vec_mat2cols_product_ref(nrows, dst, u, v);
167    }
168}
169
170impl Reim4Mat2Cols2ndColProd for FFT64Ref {
171    #[inline(always)]
172    fn reim4_mat2cols_2ndcol_prod(nrows: usize, dst: &mut [f64], u: &[f64], v: &[f64]) {
173        reim4_vec_mat2cols_2ndcol_product_ref(nrows, dst, u, v);
174    }
175}