chainrules/scalar_ad/
real.rs1use 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);