@@ -15,13 +15,37 @@ import SwiftShims
15
15
16
16
% from SwiftFloatingPointTypes import all_floating_point_types
17
17
% for self_type in all_floating_point_types ( ) :
18
- % Self = self_type. stdlib_name
18
+ % {
19
+ Self = self_type. stdlib_name
20
+ bits = self_type. bits
19
21
20
- % if self_type. bits == 80 :
22
+ def Availability( bits) :
23
+ if bits == 16 :
24
+ return '@available ( macOS 9999 , iOS 9999 , tvOS 9999 , watchOS 9999 , * ) '
25
+ return ''
26
+ } %
27
+
28
+ % if bits == 80 :
21
29
#if !(os(Windows) || os(Android)) && (arch(i386) || arch(x86_64))
22
30
% end
23
31
32
+ //===----------------------------------------------------------------------===//
33
+ // Protocol conformances
34
+ //===----------------------------------------------------------------------===//
35
+
36
+ ${ Availability ( bits) }
37
+ extension ${ Self} : Differentiable {
38
+ ${ Availability ( bits) }
39
+ public typealias TangentVector = ${ Self}
40
+
41
+ ${ Availability ( bits) }
42
+ public mutating func move( along direction: TangentVector ) {
43
+ self += direction
44
+ }
45
+ }
46
+
24
47
/// Derivatives of standard unary operators.
48
+ ${ Availability ( bits) }
25
49
extension ${ Self} {
26
50
@usableFromInline
27
51
@_transparent
@@ -41,7 +65,9 @@ extension ${Self} {
41
65
}
42
66
43
67
/// Derivatives of standard binary operators.
68
+ ${ Availability ( bits) }
44
69
extension ${ Self} {
70
+ ${ Availability ( bits) }
45
71
@inlinable // FIXME(sil-serialize-all)
46
72
@_transparent
47
73
@derivative ( of: + )
@@ -51,6 +77,7 @@ extension ${Self} {
51
77
return ( lhs + rhs, { v in ( v, v) } )
52
78
}
53
79
80
+ ${ Availability ( bits) }
54
81
@inlinable // FIXME(sil-serialize-all)
55
82
@_transparent
56
83
@derivative ( of: + )
@@ -60,6 +87,7 @@ extension ${Self} {
60
87
return ( lhs + rhs, { ( dlhs, drhs) in dlhs + drhs } )
61
88
}
62
89
90
+ ${ Availability ( bits) }
63
91
@inlinable // FIXME(sil-serialize-all)
64
92
@_transparent
65
93
@derivative ( of: += )
@@ -70,6 +98,7 @@ extension ${Self} {
70
98
return ( ( ) , { v in v } )
71
99
}
72
100
101
+ ${ Availability( bits ) }
73
102
@inlinable // FIXME(sil-serialize-all)
74
103
@_transparent
75
104
@derivative ( of: += )
@@ -80,6 +109,7 @@ extension ${Self} {
80
109
return ( ( ) , { $0 += $1 } )
81
110
}
82
111
112
+ ${ Availability( bits) }
83
113
@inlinable // FIXME(sil-serialize-all)
84
114
@_transparent
85
115
@derivative( of: - )
@@ -89,6 +119,7 @@ extension ${Self} {
89
119
return ( lhs - rhs, { v in ( v, - v) } )
90
120
}
91
121
122
+ ${ Availability ( bits) }
92
123
@inlinable // FIXME(sil-serialize-all)
93
124
@_transparent
94
125
@derivative ( of: - )
@@ -98,6 +129,7 @@ extension ${Self} {
98
129
return ( lhs - rhs, { ( dlhs, drhs) in dlhs - drhs } )
99
130
}
100
131
132
+ ${ Availability ( bits) }
101
133
@inlinable // FIXME(sil-serialize-all)
102
134
@_transparent
103
135
@derivative ( of: -= )
@@ -108,6 +140,7 @@ extension ${Self} {
108
140
return ( ( ) , { v in - v } )
109
141
}
110
142
143
+ ${ Availability( bits ) }
111
144
@inlinable // FIXME(sil-serialize-all)
112
145
@_transparent
113
146
@derivative ( of: -= )
@@ -118,6 +151,7 @@ extension ${Self} {
118
151
return ( ( ) , { $0 -= $1 } )
119
152
}
120
153
154
+ ${ Availability( bits) }
121
155
@inlinable // FIXME(sil-serialize-all)
122
156
@_transparent
123
157
@derivative ( of: * )
@@ -127,6 +161,7 @@ extension ${Self} {
127
161
return ( lhs * rhs, { v in ( rhs * v, lhs * v) } )
128
162
}
129
163
164
+ ${ Availability ( bits) }
130
165
@inlinable // FIXME(sil-serialize-all)
131
166
@_transparent
132
167
@derivative ( of: * )
@@ -136,6 +171,7 @@ extension ${Self} {
136
171
return ( lhs * rhs, { ( dlhs, drhs) in lhs * drhs + rhs * dlhs } )
137
172
}
138
173
174
+ ${ Availability ( bits) }
139
175
@inlinable // FIXME(sil-serialize-all)
140
176
@_transparent
141
177
@derivative ( of: *= )
@@ -150,6 +186,7 @@ extension ${Self} {
150
186
} )
151
187
}
152
188
189
+ ${ Availability( bits ) }
153
190
@inlinable // FIXME(sil-serialize-all)
154
191
@_transparent
155
192
@derivative ( of: *= )
@@ -160,6 +197,7 @@ extension ${Self} {
160
197
return ( ( ) , { $0 *= $1 } )
161
198
}
162
199
200
+ ${ Availability( bits ) }
163
201
@inlinable // FIXME(sil-serialize-all)
164
202
@_transparent
165
203
@derivative( of: / )
@@ -169,6 +207,7 @@ extension ${Self} {
169
207
return ( lhs / rhs, { v in ( v / rhs, - lhs / ( rhs * rhs) * v) } )
170
208
}
171
209
210
+ ${ Availability( bits ) }
172
211
@inlinable // FIXME(sil-serialize-all)
173
212
@_transparent
174
213
@derivative ( of: / )
@@ -178,6 +217,7 @@ extension ${Self} {
178
217
return ( lhs / rhs, { ( dlhs , drhs ) in dlhs / rhs - lhs / ( rhs * rhs) * drhs } )
179
218
}
180
219
220
+ ${ Availability( bits ) }
181
221
@inlinable // FIXME(sil-serialize-all)
182
222
@_transparent
183
223
@derivative ( of: /= )
@@ -192,6 +232,7 @@ extension ${Self} {
192
232
} )
193
233
}
194
234
235
+ ${ Availability( bits ) }
195
236
@inlinable // FIXME(sil-serialize-all)
196
237
@_transparent
197
238
@derivative ( of: /= )
@@ -203,31 +244,28 @@ extension ${Self} {
203
244
}
204
245
}
205
246
206
- % if self_type . bits == 80 :
247
+ % if bits == 80 :
207
248
#endif
208
249
% end
209
250
% end
210
251
211
- extension FloatingPoint where Self : Differentiable ,
212
- Self == Self . TangentVector {
213
- /// The vector-Jacobian product function of `addingProduct`. Returns the
214
- /// original result and pullback of `addingProduct` with respect to `self`,
215
- /// `lhs` and `rhs`.
216
- @inlinable
252
+ extension FloatingPoint
253
+ where
254
+ Self : Differentiable ,
255
+ Self == Self . TangentVector
256
+ {
257
+ @inlinable // FIXME(sil-serialize-all)
217
258
@derivative ( of: addingProduct)
218
259
func _vjpAddingProduct(
219
260
_ lhs: Self , _ rhs: Self
220
261
) -> ( value: Self , pullback: ( Self ) -> ( Self , Self , Self ) ) {
221
262
return ( addingProduct ( lhs, rhs) , { _ in ( 1 , rhs, lhs) } )
222
263
}
223
264
224
- /// The vector-Jacobian product function of `squareRoot`. Returns the original
225
- /// result and pullback of `squareRoot` with respect to `self`.
226
265
@inlinable // FIXME(sil-serialize-all)
227
266
@derivative ( of: squareRoot)
228
267
func _vjpSquareRoot( ) -> ( value: Self , pullback: ( Self ) -> Self ) {
229
268
let y = squareRoot ( )
230
269
return ( y, { v in v / ( 2 * y) } )
231
270
}
232
271
}
233
-
0 commit comments