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, 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}