chainrules/scalar_ad/
real.rs

1use super::ScalarAd;
2use num_traits::{Float, FloatConst, Zero};
3
4macro_rules! impl_scalar_ad_real {
5    ($ty:ty) => {
6        impl ScalarAd for $ty {
7            type Real = $ty;
8
9            fn conj(self) -> Self {
10                self
11            }
12
13            fn recip(self) -> Self {
14                <$ty as Float>::recip(self)
15            }
16
17            fn cbrt(self) -> Self {
18                <$ty as Float>::cbrt(self)
19            }
20
21            fn sqrt(self) -> Self {
22                <$ty as Float>::sqrt(self)
23            }
24
25            fn exp(self) -> Self {
26                <$ty as Float>::exp(self)
27            }
28
29            fn exp2(self) -> Self {
30                <$ty as Float>::exp2(self)
31            }
32
33            fn exp10(self) -> Self {
34                <$ty as Float>::exp(self * <$ty as FloatConst>::LN_10())
35            }
36
37            fn expm1(self) -> Self {
38                <$ty as Float>::exp_m1(self)
39            }
40
41            fn ln(self) -> Self {
42                <$ty as Float>::ln(self)
43            }
44
45            fn log1p(self) -> Self {
46                <$ty as Float>::ln_1p(self)
47            }
48
49            fn log2(self) -> Self {
50                <$ty as Float>::log2(self)
51            }
52
53            fn log10(self) -> Self {
54                <$ty as Float>::log10(self)
55            }
56
57            fn sin(self) -> Self {
58                <$ty as Float>::sin(self)
59            }
60
61            fn cos(self) -> Self {
62                <$ty as Float>::cos(self)
63            }
64
65            fn tan(self) -> Self {
66                <$ty as Float>::tan(self)
67            }
68
69            fn tanh(self) -> Self {
70                <$ty as Float>::tanh(self)
71            }
72
73            fn asin(self) -> Self {
74                <$ty as Float>::asin(self)
75            }
76
77            fn acos(self) -> Self {
78                <$ty as Float>::acos(self)
79            }
80
81            fn atan(self) -> Self {
82                <$ty as Float>::atan(self)
83            }
84
85            fn sinh(self) -> Self {
86                <$ty as Float>::sinh(self)
87            }
88
89            fn cosh(self) -> Self {
90                <$ty as Float>::cosh(self)
91            }
92
93            fn asinh(self) -> Self {
94                <$ty as Float>::asinh(self)
95            }
96
97            fn acosh(self) -> Self {
98                <$ty as Float>::acosh(self)
99            }
100
101            fn atanh(self) -> Self {
102                <$ty as Float>::atanh(self)
103            }
104
105            fn abs(self) -> Self::Real {
106                <$ty as Float>::abs(self)
107            }
108
109            fn abs2(self) -> Self::Real {
110                self * self
111            }
112
113            fn real(self) -> Self::Real {
114                self
115            }
116
117            fn imag(self) -> Self::Real {
118                <$ty as Zero>::zero()
119            }
120
121            fn angle(self) -> Self::Real {
122                <$ty as Float>::atan2(<$ty as Zero>::zero(), self)
123            }
124
125            fn powf(self, exponent: Self::Real) -> Self {
126                <$ty as Float>::powf(self, exponent)
127            }
128
129            fn powi(self, exponent: i32) -> Self {
130                <$ty as Float>::powi(self, exponent)
131            }
132
133            fn pow(self, exponent: Self) -> Self {
134                <$ty as Float>::powf(self, exponent)
135            }
136
137            fn from_real(value: Self::Real) -> Self {
138                value
139            }
140
141            fn from_i32(value: i32) -> Self {
142                value as $ty
143            }
144        }
145    };
146}
147
148impl_scalar_ad_real!(f32);
149impl_scalar_ad_real!(f64);