simba/simd/
simd_complex.rs1use 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:
15SubsetOf<Self>
16+ SupersetOf<f32>
17+ SupersetOf<f64>
18+ Field
19+ Clone
20+ Neg<Output=Self>
21+ Send
24+ Sync
25+ Any
26+ 'static
27+ Debug
28+ NumAssignOps
29+ NumOps
30+ PartialEq
31{
32 type SimdRealField: SimdRealField<SimdBool=<Self as SimdValue>::SimdBool>;
34 complex_trait_methods!(SimdRealField, simd_);
35
36 fn simd_horizontal_sum(self) -> Self::Element;
38
39 fn simd_horizontal_product(self) -> Self::Element;
41}
42
43impl<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}