-
Notifications
You must be signed in to change notification settings - Fork 10.4k
/
Copy patharray.swift
102 lines (86 loc) · 2.6 KB
/
array.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// RUN: %target-run-simple-swift
import StdlibUnittest
var ArrayAutodiffTests = TestSuite("ArrayAutodiff")
typealias FloatArrayGrad = Array<Float>.TangentVector
ArrayAutodiffTests.test("ArrayIdentity") {
func arrayIdentity(_ x: [Float]) -> [Float] {
return x
}
let backprop = pullback(at: [5, 6, 7, 8], in: arrayIdentity)
expectEqual(
FloatArrayGrad([1, 2, 3, 4]),
backprop(FloatArrayGrad([1, 2, 3, 4])))
}
ArrayAutodiffTests.test("ArraySubscript") {
func sumFirstThree(_ array: [Float]) -> Float {
return array[0] + array[1] + array[2]
}
expectEqual(
FloatArrayGrad([1, 1, 1, 0, 0, 0]),
gradient(at: [2, 3, 4, 5, 6, 7], in: sumFirstThree))
}
ArrayAutodiffTests.test("ArrayConcat") {
struct TwoArrays : Differentiable {
var a: [Float]
var b: [Float]
}
func sumFirstThreeConcatted(_ arrs: TwoArrays) -> Float {
let c = arrs.a + arrs.b
return c[0] + c[1] + c[2]
}
expectEqual(
TwoArrays.TangentVector(
a: FloatArrayGrad([1, 1]),
b: FloatArrayGrad([1, 0])),
gradient(
at: TwoArrays(a: [0, 0], b: [0, 0]),
in: sumFirstThreeConcatted))
expectEqual(
TwoArrays.TangentVector(
a: FloatArrayGrad([1, 1, 1, 0]),
b: FloatArrayGrad([0, 0])),
gradient(
at: TwoArrays(a: [0, 0, 0, 0], b: [0, 0]),
in: sumFirstThreeConcatted))
expectEqual(
TwoArrays.TangentVector(
a: FloatArrayGrad([]),
b: FloatArrayGrad([1, 1, 1, 0])),
gradient(
at: TwoArrays(a: [], b: [0, 0, 0, 0]),
in: sumFirstThreeConcatted))
}
ArrayAutodiffTests.test("Array.DifferentiableView.init") {
@differentiable
func constructView(_ x: [Float]) -> Array<Float>.DifferentiableView {
return Array<Float>.DifferentiableView(x)
}
let backprop = pullback(at: [5, 6, 7, 8], in: constructView)
expectEqual(
FloatArrayGrad([1, 2, 3, 4]),
backprop(FloatArrayGrad([1, 2, 3, 4])))
}
ArrayAutodiffTests.test("Array.DifferentiableView.base") {
@differentiable
func accessBase(_ x: Array<Float>.DifferentiableView) -> [Float] {
return x.base
}
let backprop = pullback(
at: Array<Float>.DifferentiableView([5, 6, 7, 8]),
in: accessBase)
expectEqual(
FloatArrayGrad([1, 2, 3, 4]),
backprop(FloatArrayGrad([1, 2, 3, 4])))
}
ArrayAutodiffTests.test("Array.DifferentiableView : KeyPathIterable") {
struct Container : KeyPathIterable {
let a: Array<Float>.DifferentiableView
}
let container = Container(a: Array<Float>.DifferentiableView([1, 2, 3]))
expectEqual(
[1, 2, 3],
container.recursivelyAllKeyPaths(to: Float.self).map {
container[keyPath: $0]
})
}
runAllTests()