1
1
struct DeivVecTag end
2
2
3
3
# J(f(x))*v
4
- function auto_jacvec! (dy, f, x, v,
5
- cache1 = ForwardDiff. Dual {DeivVecTag} .(x, v),
6
- cache2 = ForwardDiff. Dual {DeivVecTag} .(x, v))
7
- cache1 .= Dual {DeivVecTag} .(x, v)
8
- f (cache2,cache1)
4
+ function auto_jacvec! (
5
+ dy,
6
+ f,
7
+ x,
8
+ v,
9
+ cache1 = Dual {DeivVecTag} .(x, reshape (v, size (x))),
10
+ cache2 = similar (cache1),
11
+ )
12
+ cache1 .= Dual {DeivVecTag} .(x, reshape (v, size (x)))
13
+ f (cache2, cache1)
9
14
dy .= partials .(cache2, 1 )
10
15
end
16
+
11
17
function auto_jacvec (f, x, v)
12
- fval = f ( map ((xi, vi) -> Dual {typeof(ForwardDiff.Tag(f,eltype(x)))} (xi, vi), x, v ))
13
- map (u -> partials (u)[ 1 ], fval )
18
+ vv = reshape (v, axes (x ))
19
+ vec ( partials .( vec ( f (ForwardDiff . Dual {DeivVecTag} .(x, vv))), 1 ) )
14
20
end
15
21
16
- function num_jacvec! (dy,f,x,v,cache1 = similar (v),
17
- cache2 = similar (v);
18
- compute_f0 = true )
19
- compute_f0 && (f (cache1,x))
22
+ function num_jacvec! (
23
+ dy,
24
+ f,
25
+ x,
26
+ v,
27
+ cache1 = similar (v),
28
+ cache2 = similar (v);
29
+ compute_f0 = true ,
30
+ )
31
+ vv = reshape (v, axes (x))
32
+ compute_f0 && (f (cache1, x))
20
33
T = eltype (x)
21
34
# Should it be min? max? mean?
22
35
ϵ = sqrt (eps (real (T))) * max (one (real (T)), abs (norm (x)))
23
- @. x += ϵ* v
24
- f (cache2,x)
25
- @. x -= ϵ* v
26
- @. dy = (cache2 - cache1)/ ϵ
36
+ @. x += ϵ * vv
37
+ f (cache2, x)
38
+ @. x -= ϵ * vv
39
+ @. dy = (cache2 - cache1) / ϵ
27
40
end
28
41
29
- function num_jacvec (f,x,v,f0= nothing )
42
+ function num_jacvec (f, x, v, f0 = nothing )
43
+ vv = reshape (v, axes (x))
30
44
f0 === nothing ? _f0 = f (x) : _f0 = f0
31
45
T = eltype (x)
32
46
# Should it be min? max? mean?
33
47
ϵ = sqrt (eps (real (T))) * max (one (real (T)), abs (minimum (x)))
34
- ( f (x.+ ϵ .* v ) .- _f0). / ϵ
48
+ vec (( f (x .+ ϵ .* vv ) .- _f0) ./ ϵ)
35
49
end
36
50
37
- function num_hesvec! (dy,f,x,v,
38
- cache1 = similar (v),
39
- cache2 = similar (v),
40
- cache3 = similar (v))
41
- cache = FiniteDiff. GradientCache (v[1 ],cache1,Val{:central })
42
- g = let f= f,cache= cache
43
- (dx,x) -> FiniteDiff. finite_difference_gradient! (dx,f,x,cache)
51
+ function num_hesvec! (
52
+ dy,
53
+ f,
54
+ x,
55
+ v,
56
+ cache1 = similar (v),
57
+ cache2 = similar (v),
58
+ cache3 = similar (v),
59
+ )
60
+ cache = FiniteDiff. GradientCache (v[1 ], cache1, Val{:central })
61
+ g = let f = f, cache = cache
62
+ (dx, x) -> FiniteDiff. finite_difference_gradient! (dx, f, x, cache)
44
63
end
45
64
T = eltype (x)
46
65
# Should it be min? max? mean?
47
66
ϵ = sqrt (eps (real (T))) * max (one (real (T)), abs (norm (x)))
48
- @. x += ϵ* v
49
- g (cache2,x)
50
- @. x -= 2 ϵ* v
51
- g (cache3,x)
52
- @. dy = (cache2 - cache3)/ (2 ϵ)
67
+ @. x += ϵ * v
68
+ g (cache2, x)
69
+ @. x -= 2 ϵ * v
70
+ g (cache3, x)
71
+ @. dy = (cache2 - cache3) / (2 ϵ)
53
72
end
54
73
55
- function num_hesvec (f,x, v)
56
- g = (x) -> FiniteDiff. finite_difference_gradient (f,x)
74
+ function num_hesvec (f, x, v)
75
+ g = (x) -> FiniteDiff. finite_difference_gradient (f, x)
57
76
T = eltype (x)
58
77
# Should it be min? max? mean?
59
78
ϵ = sqrt (eps (real (T))) * max (one (real (T)), abs (norm (x)))
60
- x += ϵ* v
79
+ x += ϵ * v
61
80
gxp = g (x)
62
- x -= 2 ϵ* v
81
+ x -= 2 ϵ * v
63
82
gxm = g (x)
64
- (gxp - gxm)/ (2 ϵ)
83
+ (gxp - gxm) / (2 ϵ)
65
84
end
66
85
67
- function numauto_hesvec! (dy,f,x,v,
68
- cache = ForwardDiff. GradientConfig (f,v),
69
- cache1 = similar (v),
70
- cache2 = similar (v))
71
- g = let f= f,x= x,cache= cache
72
- g = (dx,x) -> ForwardDiff. gradient! (dx,f,x,cache)
86
+ function numauto_hesvec! (
87
+ dy,
88
+ f,
89
+ x,
90
+ v,
91
+ cache = ForwardDiff. GradientConfig (f, v),
92
+ cache1 = similar (v),
93
+ cache2 = similar (v),
94
+ )
95
+ g = let f = f, x = x, cache = cache
96
+ g = (dx, x) -> ForwardDiff. gradient! (dx, f, x, cache)
73
97
end
74
98
T = eltype (x)
75
99
# Should it be min? max? mean?
76
100
ϵ = sqrt (eps (real (T))) * max (one (real (T)), abs (norm (x)))
77
- @. x += ϵ* v
78
- g (cache1,x)
79
- @. x -= 2 ϵ* v
80
- g (cache2,x)
81
- @. dy = (cache1 - cache2)/ (2 ϵ)
101
+ @. x += ϵ * v
102
+ g (cache1, x)
103
+ @. x -= 2 ϵ * v
104
+ g (cache2, x)
105
+ @. dy = (cache1 - cache2) / (2 ϵ)
82
106
end
83
107
84
- function numauto_hesvec (f,x, v)
85
- g = (x) -> ForwardDiff. gradient (f,x)
108
+ function numauto_hesvec (f, x, v)
109
+ g = (x) -> ForwardDiff. gradient (f, x)
86
110
T = eltype (x)
87
111
# Should it be min? max? mean?
88
112
ϵ = sqrt (eps (real (T))) * max (one (real (T)), abs (norm (x)))
89
- x += ϵ* v
113
+ x += ϵ * v
90
114
gxp = g (x)
91
- x -= 2 ϵ* v
115
+ x -= 2 ϵ * v
92
116
gxm = g (x)
93
- (gxp - gxm)/ (2 ϵ)
117
+ (gxp - gxm) / (2 ϵ)
94
118
end
95
119
96
- function autonum_hesvec! (dy,f,x,v,
97
- cache1 = ForwardDiff. Dual {DeivVecTag} .(x, v),
98
- cache2 = ForwardDiff. Dual {DeivVecTag} .(x, v))
99
- cache = FiniteDiff. GradientCache (v[1 ],cache1,Val{:central })
100
- g = (dx,x) -> FiniteDiff. finite_difference_gradient! (dx,f,x,cache)
120
+ function autonum_hesvec! (
121
+ dy,
122
+ f,
123
+ x,
124
+ v,
125
+ cache1 = ForwardDiff. Dual {DeivVecTag} .(x, v),
126
+ cache2 = ForwardDiff. Dual {DeivVecTag} .(x, v),
127
+ )
128
+ cache = FiniteDiff. GradientCache (v[1 ], cache1, Val{:central })
129
+ g = (dx, x) -> FiniteDiff. finite_difference_gradient! (dx, f, x, cache)
101
130
cache1 .= Dual {DeivVecTag} .(x, v)
102
- g (cache2,cache1)
131
+ g (cache2, cache1)
103
132
dy .= partials .(cache2, 1 )
104
133
end
105
134
106
- function autonum_hesvec (f,x, v)
107
- g = (x) -> FiniteDiff. finite_difference_gradient (f,x)
135
+ function autonum_hesvec (f, x, v)
136
+ g = (x) -> FiniteDiff. finite_difference_gradient (f, x)
108
137
partials .(g (Dual {DeivVecTag} .(x, v)), 1 )
109
138
end
110
139
111
- function num_hesvecgrad! (dy,g,x,v,
112
- cache2 = similar (v),
113
- cache3 = similar (v))
140
+ function num_hesvecgrad! (dy, g, x, v, cache2 = similar (v), cache3 = similar (v))
114
141
T = eltype (x)
115
142
# Should it be min? max? mean?
116
143
ϵ = sqrt (eps (real (T))) * max (one (real (T)), abs (norm (x)))
117
- @. x += ϵ* v
118
- g (cache2,x)
119
- @. x -= 2 ϵ* v
120
- g (cache3,x)
121
- @. dy = (cache2 - cache3)/ (2 ϵ)
144
+ @. x += ϵ * v
145
+ g (cache2, x)
146
+ @. x -= 2 ϵ * v
147
+ g (cache3, x)
148
+ @. dy = (cache2 - cache3) / (2 ϵ)
122
149
end
123
150
124
- function num_hesvecgrad (g,x, v)
151
+ function num_hesvecgrad (g, x, v)
125
152
T = eltype (x)
126
153
# Should it be min? max? mean?
127
154
ϵ = sqrt (eps (real (T))) * max (one (real (T)), abs (norm (x)))
128
- x += ϵ* v
155
+ x += ϵ * v
129
156
gxp = g (x)
130
- x -= 2 ϵ* v
157
+ x -= 2 ϵ * v
131
158
gxm = g (x)
132
- (gxp - gxm)/ (2 ϵ)
159
+ (gxp - gxm) / (2 ϵ)
133
160
end
134
161
135
- function auto_hesvecgrad! (dy,g,x,v,
136
- cache2 = ForwardDiff. Dual {DeivVecTag} .(x, v),
137
- cache3 = ForwardDiff. Dual {DeivVecTag} .(x, v))
162
+ function auto_hesvecgrad! (
163
+ dy,
164
+ g,
165
+ x,
166
+ v,
167
+ cache2 = ForwardDiff. Dual {DeivVecTag} .(x, v),
168
+ cache3 = ForwardDiff. Dual {DeivVecTag} .(x, v),
169
+ )
138
170
cache2 .= Dual {DeivVecTag} .(x, v)
139
- g (cache3,cache2)
171
+ g (cache3, cache2)
140
172
dy .= partials .(cache3, 1 )
141
173
end
142
174
143
- function auto_hesvecgrad (g,x, v)
175
+ function auto_hesvecgrad (g, x, v)
144
176
partials .(g (Dual {DeivVecTag} .(x, v)), 1 )
145
177
end
146
178
@@ -154,26 +186,28 @@ struct JacVec{F,T1,T2,xType}
154
186
autodiff:: Bool
155
187
end
156
188
157
- function JacVec (f,x:: AbstractArray ;autodiff= true )
189
+ function JacVec (f, x:: AbstractArray ; autodiff = true )
158
190
if autodiff
159
191
cache1 = ForwardDiff. Dual {DeivVecTag} .(x, x)
160
192
cache2 = ForwardDiff. Dual {DeivVecTag} .(x, x)
161
193
else
162
194
cache1 = similar (x)
163
195
cache2 = similar (x)
164
196
end
165
- JacVec (f,cache1,cache2,x, autodiff)
197
+ JacVec (f, cache1, cache2, x, autodiff)
166
198
end
167
199
168
- Base. size (L:: JacVec ) = (length (L. cache1),length (L. cache1))
169
- Base. size (L:: JacVec ,i:: Int ) = length (L. cache1)
170
- Base.:* (L:: JacVec ,v:: AbstractVector ) = L. autodiff ? auto_jacvec (_x-> L. f (_x),L. x,v) : num_jacvec (_x-> L. f (_x),L. x,v)
200
+ Base. size (L:: JacVec ) = (length (L. cache1), length (L. cache1))
201
+ Base. size (L:: JacVec , i:: Int ) = length (L. cache1)
202
+ Base.:* (L:: JacVec , v:: AbstractVector ) =
203
+ L. autodiff ? auto_jacvec (_x -> L. f (_x), L. x, v) :
204
+ num_jacvec (_x -> L. f (_x), L. x, v)
171
205
172
- function LinearAlgebra. mul! (dy:: AbstractVector ,L:: JacVec ,v:: AbstractVector )
206
+ function LinearAlgebra. mul! (dy:: AbstractVector , L:: JacVec , v:: AbstractVector )
173
207
if L. autodiff
174
- auto_jacvec! (dy,(_y,_x)-> L. f (_y,_x),L. x,v, L. cache1,L. cache2)
208
+ auto_jacvec! (dy, (_y, _x) -> L. f (_y, _x), L. x, v, L. cache1, L. cache2)
175
209
else
176
- num_jacvec! (dy,(_y,_x)-> L. f (_y,_x),L. x,v, L. cache1,L. cache2)
210
+ num_jacvec! (dy, (_y, _x) -> L. f (_y, _x), L. x, v, L. cache1, L. cache2)
177
211
end
178
212
end
179
213
@@ -186,28 +220,29 @@ struct HesVec{F,T1,T2,xType}
186
220
autodiff:: Bool
187
221
end
188
222
189
- function HesVec (f,x:: AbstractArray ;autodiff= true )
223
+ function HesVec (f, x:: AbstractArray ; autodiff = true )
190
224
if autodiff
191
- cache1 = ForwardDiff. GradientConfig (f,x)
225
+ cache1 = ForwardDiff. GradientConfig (f, x)
192
226
cache2 = similar (x)
193
227
cache3 = similar (x)
194
228
else
195
229
cache1 = similar (x)
196
230
cache2 = similar (x)
197
231
cache3 = similar (x)
198
232
end
199
- HesVec (f,cache1,cache2,cache3,x, autodiff)
233
+ HesVec (f, cache1, cache2, cache3, x, autodiff)
200
234
end
201
235
202
- Base. size (L:: HesVec ) = (length (L. cache2),length (L. cache2))
203
- Base. size (L:: HesVec ,i:: Int ) = length (L. cache2)
204
- Base.:* (L:: HesVec ,v:: AbstractVector ) = L. autodiff ? numauto_hesvec (L. f,L. x,v) : num_hesvec (L. f,L. x,v)
236
+ Base. size (L:: HesVec ) = (length (L. cache2), length (L. cache2))
237
+ Base. size (L:: HesVec , i:: Int ) = length (L. cache2)
238
+ Base.:* (L:: HesVec , v:: AbstractVector ) =
239
+ L. autodiff ? numauto_hesvec (L. f, L. x, v) : num_hesvec (L. f, L. x, v)
205
240
206
- function LinearAlgebra. mul! (dy:: AbstractVector ,L:: HesVec ,v:: AbstractVector )
241
+ function LinearAlgebra. mul! (dy:: AbstractVector , L:: HesVec , v:: AbstractVector )
207
242
if L. autodiff
208
- numauto_hesvec! (dy,L. f,L. x,v, L. cache1,L. cache2,L. cache3)
243
+ numauto_hesvec! (dy, L. f, L. x, v, L. cache1, L. cache2, L. cache3)
209
244
else
210
- num_hesvec! (dy,L. f,L. x,v, L. cache1,L. cache2,L. cache3)
245
+ num_hesvec! (dy, L. f, L. x, v, L. cache1, L. cache2, L. cache3)
211
246
end
212
247
end
213
248
@@ -219,25 +254,30 @@ struct HesVecGrad{G,T1,T2,uType}
219
254
autodiff:: Bool
220
255
end
221
256
222
- function HesVecGrad (g,x:: AbstractArray ;autodiff= false )
257
+ function HesVecGrad (g, x:: AbstractArray ; autodiff = false )
223
258
if autodiff
224
259
cache1 = ForwardDiff. Dual {DeivVecTag} .(x, x)
225
260
cache2 = ForwardDiff. Dual {DeivVecTag} .(x, x)
226
261
else
227
262
cache1 = similar (x)
228
263
cache2 = similar (x)
229
264
end
230
- HesVecGrad (g,cache1,cache2,x, autodiff)
265
+ HesVecGrad (g, cache1, cache2, x, autodiff)
231
266
end
232
267
233
- Base. size (L:: HesVecGrad ) = (length (L. cache2),length (L. cache2))
234
- Base. size (L:: HesVecGrad ,i:: Int ) = length (L. cache2)
235
- Base.:* (L:: HesVecGrad ,v:: AbstractVector ) = L. autodiff ? auto_hesvecgrad (L. g,L. x,v) : num_hesvecgrad (L. g,L. x,v)
268
+ Base. size (L:: HesVecGrad ) = (length (L. cache2), length (L. cache2))
269
+ Base. size (L:: HesVecGrad , i:: Int ) = length (L. cache2)
270
+ Base.:* (L:: HesVecGrad , v:: AbstractVector ) =
271
+ L. autodiff ? auto_hesvecgrad (L. g, L. x, v) : num_hesvecgrad (L. g, L. x, v)
236
272
237
- function LinearAlgebra. mul! (dy:: AbstractVector ,L:: HesVecGrad ,v:: AbstractVector )
273
+ function LinearAlgebra. mul! (
274
+ dy:: AbstractVector ,
275
+ L:: HesVecGrad ,
276
+ v:: AbstractVector ,
277
+ )
238
278
if L. autodiff
239
- auto_hesvecgrad! (dy,L. g,L. x,v, L. cache1,L. cache2)
279
+ auto_hesvecgrad! (dy, L. g, L. x, v, L. cache1, L. cache2)
240
280
else
241
- num_hesvecgrad! (dy,L. g,L. x,v, L. cache1,L. cache2)
281
+ num_hesvecgrad! (dy, L. g, L. x, v, L. cache1, L. cache2)
242
282
end
243
283
end
0 commit comments