simba/simd/
simd_complex.rs

1use num::{NumAssignOps, NumOps, Zero};
2use std::any::Any;
3use std::f64;
4use std::fmt::Debug;
5use std::ops::Neg;
6
7use crate::scalar::{ComplexField, Field, SubsetOf, SupersetOf};
8use crate::simd::{SimdRealField, SimdValue};
9
10/// Lane-wise generalisation of `ComplexField` for SIMD complex fields.
11///
12/// Each lane of an SIMD complex field should contain one complex field.
13#[allow(missing_docs)]
14pub trait SimdComplexField:
15SubsetOf<Self>
16+ SupersetOf<f32>
17+ SupersetOf<f64>
18+ Field
19+ Clone
20+ Neg<Output=Self>
21//    + MeetSemilattice
22//    + JoinSemilattice
23+ Send
24+ Sync
25+ Any
26+ 'static
27+ Debug
28+ NumAssignOps
29+ NumOps
30+ PartialEq
31{
32    /// Type of the coefficients of a complex number.
33    type SimdRealField: SimdRealField<SimdBool=<Self as SimdValue>::SimdBool>;
34    complex_trait_methods!(SimdRealField, simd_);
35
36    /// Computes the sum of all the lanes of `self`.
37    fn simd_horizontal_sum(self) -> Self::Element;
38
39    /// Computes the product of all the lanes of `self`.
40    fn simd_horizontal_product(self) -> Self::Element;
41}
42
43// Blanket impl: ComplexField => SimdComplexField
44impl<T: ComplexField> SimdComplexField for T {
45    type SimdRealField = T::RealField;
46
47    #[inline(always)]
48    fn from_simd_real(re: Self::SimdRealField) -> Self {
49        Self::from_real(re)
50    }
51    #[inline(always)]
52    fn simd_real(self) -> Self::SimdRealField {
53        self.real()
54    }
55    #[inline(always)]
56    fn simd_imaginary(self) -> Self::SimdRealField {
57        self.imaginary()
58    }
59    #[inline(always)]
60    fn simd_modulus(self) -> Self::SimdRealField {
61        self.modulus()
62    }
63    #[inline(always)]
64    fn simd_modulus_squared(self) -> Self::SimdRealField {
65        self.modulus_squared()
66    }
67    #[inline(always)]
68    fn simd_argument(self) -> Self::SimdRealField {
69        self.argument()
70    }
71    #[inline(always)]
72    fn simd_norm1(self) -> Self::SimdRealField {
73        self.norm1()
74    }
75    #[inline(always)]
76    fn simd_scale(self, factor: Self::SimdRealField) -> Self {
77        self.scale(factor)
78    }
79    #[inline(always)]
80    fn simd_unscale(self, factor: Self::SimdRealField) -> Self {
81        self.unscale(factor)
82    }
83    #[inline(always)]
84    fn simd_to_polar(self) -> (Self::SimdRealField, Self::SimdRealField) {
85        self.to_polar()
86    }
87    #[inline(always)]
88    fn simd_to_exp(self) -> (Self::SimdRealField, Self) {
89        self.to_exp()
90    }
91    #[inline(always)]
92    fn simd_signum(self) -> Self {
93        self.signum()
94    }
95
96    #[inline(always)]
97    fn simd_floor(self) -> Self {
98        self.floor()
99    }
100    #[inline(always)]
101    fn simd_ceil(self) -> Self {
102        self.ceil()
103    }
104    #[inline(always)]
105    fn simd_round(self) -> Self {
106        self.round()
107    }
108    #[inline(always)]
109    fn simd_trunc(self) -> Self {
110        self.trunc()
111    }
112    #[inline(always)]
113    fn simd_fract(self) -> Self {
114        self.fract()
115    }
116    #[inline(always)]
117    fn simd_mul_add(self, a: Self, b: Self) -> Self {
118        self.mul_add(a, b)
119    }
120
121    #[inline(always)]
122    fn simd_abs(self) -> Self::SimdRealField {
123        self.abs()
124    }
125    #[inline(always)]
126    fn simd_hypot(self, other: Self) -> Self::SimdRealField {
127        self.hypot(other)
128    }
129
130    #[inline(always)]
131    fn simd_recip(self) -> Self {
132        self.recip()
133    }
134    #[inline(always)]
135    fn simd_conjugate(self) -> Self {
136        self.conjugate()
137    }
138    #[inline(always)]
139    fn simd_sin(self) -> Self {
140        self.sin()
141    }
142    #[inline(always)]
143    fn simd_cos(self) -> Self {
144        self.cos()
145    }
146    #[inline(always)]
147    fn simd_sin_cos(self) -> (Self, Self) {
148        self.sin_cos()
149    }
150    #[inline(always)]
151    fn simd_sinh_cosh(self) -> (Self, Self) {
152        self.sinh_cosh()
153    }
154    #[inline(always)]
155    fn simd_tan(self) -> Self {
156        self.tan()
157    }
158    #[inline(always)]
159    fn simd_asin(self) -> Self {
160        self.asin()
161    }
162    #[inline(always)]
163    fn simd_acos(self) -> Self {
164        self.acos()
165    }
166    #[inline(always)]
167    fn simd_atan(self) -> Self {
168        self.atan()
169    }
170    #[inline(always)]
171    fn simd_sinh(self) -> Self {
172        self.sinh()
173    }
174    #[inline(always)]
175    fn simd_cosh(self) -> Self {
176        self.cosh()
177    }
178    #[inline(always)]
179    fn simd_tanh(self) -> Self {
180        self.tanh()
181    }
182    #[inline(always)]
183    fn simd_asinh(self) -> Self {
184        self.asinh()
185    }
186    #[inline(always)]
187    fn simd_acosh(self) -> Self {
188        self.acosh()
189    }
190    #[inline(always)]
191    fn simd_atanh(self) -> Self {
192        self.atanh()
193    }
194
195    #[inline(always)]
196    fn simd_sinc(self) -> Self {
197        self.sinc()
198    }
199    #[inline(always)]
200    fn simd_sinhc(self) -> Self {
201        self.sinhc()
202    }
203
204    #[inline(always)]
205    fn simd_cosc(self) -> Self {
206        self.cosc()
207    }
208    #[inline(always)]
209    fn simd_coshc(self) -> Self {
210        self.coshc()
211    }
212
213    #[inline(always)]
214    fn simd_log(self, base: Self::SimdRealField) -> Self {
215        self.log(base)
216    }
217    #[inline(always)]
218    fn simd_log2(self) -> Self {
219        self.log2()
220    }
221    #[inline(always)]
222    fn simd_log10(self) -> Self {
223        self.log10()
224    }
225    #[inline(always)]
226    fn simd_ln(self) -> Self {
227        self.ln()
228    }
229    #[inline(always)]
230    fn simd_ln_1p(self) -> Self {
231        self.ln_1p()
232    }
233    #[inline(always)]
234    fn simd_sqrt(self) -> Self {
235        self.sqrt()
236    }
237    #[inline(always)]
238    fn simd_exp(self) -> Self {
239        self.exp()
240    }
241    #[inline(always)]
242    fn simd_exp2(self) -> Self {
243        self.exp2()
244    }
245    #[inline(always)]
246    fn simd_exp_m1(self) -> Self {
247        self.exp_m1()
248    }
249    #[inline(always)]
250    fn simd_powi(self, n: i32) -> Self {
251        self.powi(n)
252    }
253    #[inline(always)]
254    fn simd_powf(self, n: Self::SimdRealField) -> Self {
255        self.powf(n)
256    }
257    #[inline(always)]
258    fn simd_powc(self, n: Self) -> Self {
259        self.powc(n)
260    }
261    #[inline(always)]
262    fn simd_cbrt(self) -> Self {
263        self.cbrt()
264    }
265
266    #[inline(always)]
267    fn simd_horizontal_sum(self) -> Self::Element {
268        self
269    }
270    #[inline(always)]
271    fn simd_horizontal_product(self) -> Self::Element {
272        self
273    }
274}