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#[allow(missing_docs)]
14pub trait SimdComplexField:
15 SubsetOf<Self>
16 + SupersetOf<f64>
17 + Field
18 + Clone
19 + Neg<Output = Self>
20+ Send
23 + Sync
24 + Any
25 + 'static
26 + Debug
27 + NumAssignOps
28 + NumOps
29 + PartialEq
30{
31 type SimdRealField: SimdRealField<SimdBool = <Self as SimdValue>::SimdBool>;
33 complex_trait_methods!(SimdRealField, simd_);
34
35 fn simd_horizontal_sum(self) -> Self::Element;
37
38 fn simd_horizontal_product(self) -> Self::Element;
40}
41
42impl<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}