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