1
1
// RUN: %target-run-simple-swift
2
2
3
3
import StdlibUnittest
4
- import DifferentiationUnittest
4
+ import _Differentiation
5
5
6
6
var ArrayAutoDiffTests = TestSuite ( " ArrayAutoDiff " )
7
7
8
8
typealias FloatArrayTan = Array < Float > . TangentVector
9
- typealias TrackedFloatArrayTan = Array < Tracked < Float > > . TangentVector
10
9
11
10
ArrayAutoDiffTests . test ( " ArrayIdentity " ) {
12
11
func arrayIdentity( _ x: [ Float ] ) -> [ Float ] {
@@ -24,48 +23,48 @@ ArrayAutoDiffTests.test("ArraySubscript") {
24
23
return array [ 0 ] + array[ 1 ] + array[ 2 ]
25
24
}
26
25
27
- expectEqual (
26
+ expectEqual (
28
27
FloatArrayTan ( [ 1 , 1 , 1 , 0 , 0 , 0 ] ) ,
29
28
gradient ( at: [ 2 , 3 , 4 , 5 , 6 , 7 ] , in: sumFirstThree) )
30
29
}
31
30
32
- ArrayAutoDiffTests . testWithLeakChecking ( " ArrayLiteral " ) {
31
+ ArrayAutoDiffTests . test ( " ArrayLiteral " ) {
33
32
do {
34
- func twoElementLiteral( _ x: Tracked < Float > , _ y: Tracked < Float > ) -> [ Tracked < Float > ] {
33
+ func twoElementLiteral( _ x: Float , _ y: Float ) -> [ Float ] {
35
34
return [ x, y]
36
35
}
37
36
let pb = pullback ( at: 1 , 1 , in: twoElementLiteral)
38
- expectEqual ( ( 1 , 2 ) , pb ( TrackedFloatArrayTan ( [ Tracked < Float > ( 1 ) , Tracked < Float > ( 2 ) ] ) ) )
37
+ expectEqual ( ( 1 , 2 ) , pb ( FloatArrayTan ( [ Float ( 1 ) , Float ( 2 ) ] ) ) )
39
38
}
40
39
41
40
do {
42
41
// TF-952: Test array literal initialized from an address (e.g. `var`).
43
- func twoElementLiteralAddress( _ x: Tracked < Float > , _ y: Tracked < Float > ) -> [ Tracked < Float > ] {
42
+ func twoElementLiteralAddress( _ x: Float , _ y: Float ) -> [ Float ] {
44
43
var result = x
45
44
result = result * y
46
45
return [ result, result]
47
46
}
48
47
let pb = pullback ( at: 3 , 4 , in: twoElementLiteralAddress)
49
- expectEqual ( ( 8 , 6 ) , pb ( TrackedFloatArrayTan ( [ 1 , 1 ] ) ) )
48
+ expectEqual ( ( 8 , 6 ) , pb ( FloatArrayTan ( [ 1 , 1 ] ) ) )
50
49
}
51
50
52
51
do {
53
52
// TF-952: Test array literal initialized with function call results.
54
- func twoElementLiteralFunctionResult( _ x: Tracked < Float > , _ y: Tracked < Float > ) -> [ Tracked < Float > ] {
53
+ func twoElementLiteralFunctionResult( _ x: Float , _ y: Float ) -> [ Float ] {
55
54
return [ x * y, x * y]
56
55
}
57
56
let pb = pullback ( at: 3 , 4 , in: twoElementLiteralFunctionResult)
58
- expectEqual ( ( 8 , 6 ) , pb ( TrackedFloatArrayTan ( [ 1 , 1 ] ) ) )
57
+ expectEqual ( ( 8 , 6 ) , pb ( FloatArrayTan ( [ 1 , 1 ] ) ) )
59
58
}
60
59
61
60
do {
62
61
// TF-975: Test multiple array literals.
63
- func twoElementLiterals( _ x: Tracked < Float > , _ y: Tracked < Float > ) -> [ Tracked < Float > ] {
62
+ func twoElementLiterals( _ x: Float , _ y: Float ) -> [ Float ] {
64
63
let array = [ x * y, x * y]
65
64
return [ array [ 0 ] , array [ 1 ] ]
66
65
}
67
66
let pb = pullback ( at: 3 , 4 , in: twoElementLiterals)
68
- expectEqual ( ( 8 , 6 ) , pb ( TrackedFloatArrayTan ( [ 1 , 1 ] ) ) )
67
+ expectEqual ( ( 8 , 6 ) , pb ( FloatArrayTan ( [ 1 , 1 ] ) ) )
69
68
}
70
69
}
71
70
@@ -96,8 +95,8 @@ struct Struct<T> {
96
95
extension Struct : Differentiable where T: Differentiable { }
97
96
98
97
ArrayAutoDiffTests . test ( " ArrayLiteralStruct " ) {
99
- typealias TV = Struct < Tracked < Float > > . TangentVector
100
- let s = Struct < Tracked < Float > > ( x: 3 , y: 4 )
98
+ typealias TV = Struct < Float > . TangentVector
99
+ let s = Struct < Float > ( x: 3 , y: 4 )
101
100
102
101
do {
103
102
func structElementLiteral< T> ( _ s: Struct < T > ) -> [ T ] {
@@ -106,10 +105,10 @@ ArrayAutoDiffTests.test("ArrayLiteralStruct") {
106
105
func structGeneric< T> ( _ s: Struct < T > ) -> T {
107
106
return structElementLiteral ( s) [ 0 ]
108
107
}
109
- func structConcrete1( _ s: Struct < Tracked < Float > > ) -> Tracked < Float > {
108
+ func structConcrete1( _ s: Struct < Float > ) -> Float {
110
109
return structElementLiteral ( s) [ 0 ] * structElementLiteral( s) [ 1 ]
111
110
}
112
- func structConcrete2( _ s: Struct < Tracked < Float > > ) -> Tracked < Float > {
111
+ func structConcrete2( _ s: Struct < Float > ) -> Float {
113
112
let array = structElementLiteral ( s)
114
113
return array [ 0 ] * array[ 1 ]
115
114
}
@@ -126,11 +125,11 @@ ArrayAutoDiffTests.test("ArrayLiteralStruct") {
126
125
func structGeneric< T> ( _ s: Struct < T > ) -> T {
127
126
return structElementAddressLiteral ( s) [ 0 ]
128
127
}
129
- func structConcrete1( _ s: Struct < Tracked < Float > > ) -> Tracked < Float > {
128
+ func structConcrete1( _ s: Struct < Float > ) -> Float {
130
129
return structElementAddressLiteral ( s) [ 0 ] *
131
130
structElementAddressLiteral( s) [ 1 ]
132
131
}
133
- func structConcrete2( _ s: Struct < Tracked < Float > > ) -> Tracked < Float > {
132
+ func structConcrete2( _ s: Struct < Float > ) -> Float {
134
133
let array = structElementAddressLiteral ( s)
135
134
return array [ 0 ] * array[ 1 ]
136
135
}
@@ -148,11 +147,11 @@ ArrayAutoDiffTests.test("ArrayLiteralStruct") {
148
147
func structGeneric< T> ( _ s: Struct < T > ) -> T {
149
148
return structElementAddressLiteral2 ( s) [ 0 ]
150
149
}
151
- func structConcrete1( _ s: Struct < Tracked < Float > > ) -> Tracked < Float > {
150
+ func structConcrete1( _ s: Struct < Float > ) -> Float {
152
151
return structElementAddressLiteral2 ( s) [ 0 ] *
153
152
structElementAddressLiteral2( s) [ 1 ]
154
153
}
155
- func structConcrete2( _ s: Struct < Tracked < Float > > ) -> Tracked < Float > {
154
+ func structConcrete2( _ s: Struct < Float > ) -> Float {
156
155
let array = structElementAddressLiteral2 ( s)
157
156
return array [ 0 ] * array[ 1 ]
158
157
}
@@ -167,7 +166,7 @@ ArrayAutoDiffTests.test("ArrayLiteralStruct") {
167
166
func applyIndirectResult< T> ( _ x: T , _ y: T ) -> [ Struct < T > ] {
168
167
return [ Struct ( x: x, y: y) , Struct ( x: x, y: y) ]
169
168
}
170
- let pb = pullback ( at: Tracked < Float > ( 3 ) , 4 , in: { applyIndirectResult ( $0, $1) } )
169
+ let pb = pullback ( at: Float ( 3 ) , 4 , in: { applyIndirectResult ( $0, $1) } )
171
170
let v = TV ( x: 1 , y: 1 )
172
171
expectEqual ( ( 2 , 2 ) , pb ( . init( [ v, v] ) ) )
173
172
}
@@ -179,42 +178,42 @@ ArrayAutoDiffTests.test("ArrayLiteralTuple") {
179
178
var tuple = ( x, y)
180
179
return [ tuple. 0 , tuple. 1 ]
181
180
}
182
- let pb = pullback ( at: Tracked < Float > ( 3 ) , 4 , in: { tupleElementGeneric ( $0, $1) } )
181
+ let pb = pullback ( at: Float ( 3 ) , 4 , in: { tupleElementGeneric ( $0, $1) } )
183
182
// FIXME(TF-977): Fix incorrect derivative for array literal with
184
183
// `tuple_element_addr` elements.
185
- // expectEqual((1, 1), pb(TrackedFloatArrayTan ([1, 1])))
186
- expectEqual ( ( 0 , 2 ) , pb ( TrackedFloatArrayTan ( [ 1 , 1 ] ) ) )
184
+ // expectEqual((1, 1), pb(FloatArrayTan ([1, 1])))
185
+ expectEqual ( ( 0 , 2 ) , pb ( FloatArrayTan ( [ 1 , 1 ] ) ) )
187
186
}
188
187
}
189
188
190
- ArrayAutoDiffTests . testWithLeakChecking ( " ArrayLiteralNested " ) {
189
+ ArrayAutoDiffTests . test ( " ArrayLiteralNested " ) {
191
190
do {
192
191
func nested0(
193
- _ x: Tracked < Float > , _ y: Tracked < Float > , _ bool: Bool = true
194
- ) -> [ Tracked < Float > ] {
192
+ _ x: Float , _ y: Float , _ bool: Bool = true
193
+ ) -> [ Float ] {
195
194
let result = [ [ [ [ x, y] ] ] ]
196
195
return result [ 0 ] [ 0 ] [ 0 ]
197
196
}
198
197
let pb = pullback ( at: 3 , 4 , in: { nested0 ( $0, $1) } )
199
- expectEqual ( ( 1 , 1 ) , pb ( TrackedFloatArrayTan ( [ 1 , 1 , 1 , 1 ] ) ) )
198
+ expectEqual ( ( 1 , 1 ) , pb ( FloatArrayTan ( [ 1 , 1 , 1 , 1 ] ) ) )
200
199
}
201
200
202
201
do {
203
202
func nested1(
204
- _ x: Tracked < Float > , _ y: Tracked < Float > , _ bool: Bool = true
205
- ) -> [ Tracked < Float > ] {
203
+ _ x: Float , _ y: Float , _ bool: Bool = true
204
+ ) -> [ Float ] {
206
205
var result = [ [ x, y] , [ x, y] ]
207
206
return result [ 0 ] + result[ 1 ]
208
207
}
209
208
let pb = pullback ( at: 3 , 4 , in: { nested1 ( $0, $1) } )
210
- expectEqual ( ( 2 , 2 ) , pb ( TrackedFloatArrayTan ( [ 1 , 1 , 1 , 1 ] ) ) )
209
+ expectEqual ( ( 2 , 2 ) , pb ( FloatArrayTan ( [ 1 , 1 , 1 , 1 ] ) ) )
211
210
}
212
211
213
212
do {
214
213
// Convoluted function computing `[x + y]`.
215
214
func nested2(
216
- _ x: Tracked < Float > , _ y: Tracked < Float > , _ bool: Bool = true
217
- ) -> [ Tracked < Float > ] {
215
+ _ x: Float , _ y: Float , _ bool: Bool = true
216
+ ) -> [ Float ] {
218
217
var result = [ [ ] , [ x] ]
219
218
result = result + [ ]
220
219
result = result + [ [ ] ]
@@ -224,38 +223,38 @@ ArrayAutoDiffTests.testWithLeakChecking("ArrayLiteralNested") {
224
223
}
225
224
let ( value, pb) = valueWithPullback ( at: 3 , 4 , in: { nested2 ( $0, $1) } )
226
225
expectEqual ( [ 3 , 4 ] , value)
227
- expectEqual ( ( 1 , 1 ) , pb ( TrackedFloatArrayTan ( [ 1 , 1 ] ) ) )
226
+ expectEqual ( ( 1 , 1 ) , pb ( FloatArrayTan ( [ 1 , 1 ] ) ) )
228
227
}
229
228
}
230
229
231
- ArrayAutoDiffTests . testWithLeakChecking ( " ArrayLiteralControlFlow " ) {
230
+ ArrayAutoDiffTests . test ( " ArrayLiteralControlFlow " ) {
232
231
do {
233
232
// TF-922: Test array literal and control flow.
234
233
func controlFlow(
235
- _ x: Tracked < Float > , _ y: Tracked < Float > , _ bool: Bool = true
236
- ) -> [ Tracked < Float > ] {
234
+ _ x: Float , _ y: Float , _ bool: Bool = true
235
+ ) -> [ Float ] {
237
236
var result = [ x * y, x * y]
238
237
let result2 = bool ? result : result
239
238
var result3 = bool ? ( bool ? result2 : result) : result2
240
239
return result3
241
240
}
242
241
let pb = pullback ( at: 3 , 4 , in: { controlFlow ( $0, $1) } )
243
- expectEqual ( ( 8 , 6 ) , pb ( TrackedFloatArrayTan ( [ 1 , 1 ] ) ) )
242
+ expectEqual ( ( 8 , 6 ) , pb ( FloatArrayTan ( [ 1 , 1 ] ) ) )
244
243
}
245
244
246
245
do {
247
246
// TF-922: Test array literal and control flow.
248
247
func controlFlowAddress(
249
- _ x: Tracked < Float > , _ y: Tracked < Float > , _ bool: Bool = true
250
- ) -> [ Tracked < Float > ] {
248
+ _ x: Float , _ y: Float , _ bool: Bool = true
249
+ ) -> [ Float ] {
251
250
var product = x * y // initial value is an address
252
251
var result = [ product, product]
253
252
let result2 = bool ? result : result
254
253
var result3 = bool ? ( bool ? result2 : result) : result2
255
254
return result3
256
255
}
257
256
let pb = pullback ( at: 3 , 4 , in: { controlFlowAddress ( $0, $1) } )
258
- expectEqual ( ( 8 , 6 ) , pb ( TrackedFloatArrayTan ( [ 1 , 1 ] ) ) )
257
+ expectEqual ( ( 8 , 6 ) , pb ( FloatArrayTan ( [ 1 , 1 ] ) ) )
259
258
}
260
259
261
260
do {
@@ -266,22 +265,22 @@ ArrayAutoDiffTests.testWithLeakChecking("ArrayLiteralControlFlow") {
266
265
var result3 = bool ? ( bool ? result2 : result) : result2
267
266
return result3
268
267
}
269
- let pb = pullback ( at: Tracked < Float > ( 3 ) , 4 , in: { controlFlowGeneric ( $0, $1) } )
270
- expectEqual ( ( 1 , 1 ) , pb ( TrackedFloatArrayTan ( [ 1 , 1 ] ) ) )
268
+ let pb = pullback ( at: Float ( 3 ) , 4 , in: { controlFlowGeneric ( $0, $1) } )
269
+ expectEqual ( ( 1 , 1 ) , pb ( FloatArrayTan ( [ 1 , 1 ] ) ) )
271
270
}
272
271
273
272
do {
274
273
// Test nested array literal and control flow.
275
274
func controlFlowNestedLiteral(
276
- _ x: Tracked < Float > , _ y: Tracked < Float > , _ bool: Bool = true
277
- ) -> [ Tracked < Float > ] {
278
- var result : [ [ Tracked < Float > ] ] = [ ]
275
+ _ x: Float , _ y: Float , _ bool: Bool = true
276
+ ) -> [ Float ] {
277
+ var result : [ [ Float ] ] = [ ]
279
278
var result2 = bool ? result + [ [ x] ] : result + [ [ x] ]
280
279
var result3 = bool ? ( bool ? result2 + [ [ y] ] : result2 + [ [ y] ] ) : result2 + [ [ y] ]
281
280
return result3 [ 0 ] + [ result3 [ 1 ] [ 0 ] ]
282
281
}
283
282
let pb = pullback ( at: 3 , 4 , in: { controlFlowNestedLiteral ( $0, $1) } )
284
- expectEqual ( ( 1 , 1 ) , pb ( TrackedFloatArrayTan ( [ 1 , 1 ] ) ) )
283
+ expectEqual ( ( 1 , 1 ) , pb ( FloatArrayTan ( [ 1 , 1 ] ) ) )
285
284
}
286
285
}
287
286
@@ -340,38 +339,38 @@ ArrayAutoDiffTests.test("Array.+") {
340
339
at: TwoArrays ( a: [ ] , b: [ 0 , 0 , 0 , 0 ] ) ,
341
340
in: sumFirstThreeConcatenated) )
342
341
343
- func identity( _ array: [ Tracked < Float > ] ) -> [ Tracked < Float > ] {
344
- var results : [ Tracked < Float > ] = [ ]
342
+ func identity( _ array: [ Float ] ) -> [ Float ] {
343
+ var results : [ Float ] = [ ]
345
344
for i in withoutDerivative ( at: array. indices) {
346
345
results = results + [ array [ i] ]
347
346
}
348
347
return results
349
348
}
350
- let v = TrackedFloatArrayTan ( [ 4 , - 5 , 6 ] )
349
+ let v = FloatArrayTan ( [ 4 , - 5 , 6 ] )
351
350
expectEqual ( v, pullback ( at: [ 1 , 2 , 3 ] , in: identity) ( v) )
352
351
}
353
352
354
353
ArrayAutoDiffTests . test ( " Array.append " ) {
355
- func identity( _ array: [ Tracked < Float > ] ) -> [ Tracked < Float > ] {
356
- var results : [ Tracked < Float > ] = [ ]
354
+ func identity( _ array: [ Float ] ) -> [ Float ] {
355
+ var results : [ Float ] = [ ]
357
356
for i in withoutDerivative ( at: array. indices) {
358
357
results. append ( array [ i] )
359
358
}
360
359
return results
361
360
}
362
- let v = TrackedFloatArrayTan ( [ 4 , - 5 , 6 ] )
361
+ let v = FloatArrayTan ( [ 4 , - 5 , 6 ] )
363
362
expectEqual ( v, pullback ( at: [ 1 , 2 , 3 ] , in: identity) ( v) )
364
363
}
365
364
366
- ArrayAutoDiffTests . testWithLeakChecking ( " Array.init(repeating:count:) " ) {
365
+ ArrayAutoDiffTests . test ( " Array.init(repeating:count:) " ) {
367
366
@differentiable
368
- func repeating( _ x: Tracked < Float > ) -> [ Tracked < Float > ] {
367
+ func repeating( _ x: Float ) -> [ Float ] {
369
368
Array ( repeating: x, count: 10 )
370
369
}
371
- expectEqual ( Tracked < Float > ( 10 ) , gradient ( at: . zero) { x in
370
+ expectEqual ( Float ( 10 ) , gradient ( at: . zero) { x in
372
371
repeating ( x) . differentiableReduce ( 0 , { $0 + $1} ) . value
373
372
} )
374
- expectEqual ( Tracked < Float > ( 20 ) , pullback ( at: . zero, in: { x in
373
+ expectEqual ( Float ( 20 ) , pullback ( at: . zero, in: { x in
375
374
repeating ( x) . differentiableReduce ( 0 , { $0 + $1} ) . value
376
375
} ) ( 2 ) )
377
376
}
0 commit comments