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