@@ -29,11 +29,7 @@ function _finite_difference!(df::AbstractArray{<:Real}, f, x::AbstractArray{<:Re
29
29
if fdtype == Val{:forward }
30
30
epsilon_factor = compute_epsilon_factor (Val{:forward }, epsilon_elemtype)
31
31
@. epsilon = compute_epsilon (Val{:forward }, x, epsilon_factor)
32
- if typeof (fx) == Void
33
- @. df = (f (x+ epsilon) - f (x)) / epsilon
34
- else
35
- @. df = (f (x+ epsilon) - fx) / epsilon
36
- end
32
+ @. df = (f (x+ epsilon) - f (x)) / epsilon
37
33
elseif fdtype == Val{:central }
38
34
epsilon_factor = compute_epsilon_factor (Val{:central }, eltype (x))
39
35
@. epsilon = compute_epsilon (Val{:central }, x, epsilon_factor)
@@ -85,15 +81,10 @@ Optimized implementations for StridedArrays.
85
81
function _finite_difference! (df:: StridedArray{<:Real} , f, x:: Real ,
86
82
fdtype:: DataType , :: Type{Val{:Real}} , :: Type{Val{:Default}} ,
87
83
fx, epsilon, return_type)
88
-
89
84
epsilon_elemtype = compute_epsilon_elemtype (epsilon, x)
90
85
if fdtype == Val{:forward }
91
86
epsilon = compute_epsilon (Val{:forward }, x)
92
- if typeof (fx) == Void
93
- df .= (f (x+ epsilon) - f (x)) / epsilon
94
- else
95
- df .= (f (x+ epsilon) - fx) / epsilon
96
- end
87
+ df .= (f (x+ epsilon) - f (x)) / epsilon
97
88
elseif fdtype == Val{:central }
98
89
epsilon = compute_epsilon (Val{:central }, x)
99
90
df .= (f (x+ epsilon) - f (x- epsilon)) / (2 * epsilon)
@@ -117,11 +108,7 @@ function _finite_difference!(df::StridedArray{<:Real}, f, x::StridedArray{<:Real
117
108
@inbounds for i in 1 : length (x)
118
109
epsilon = compute_epsilon (Val{:forward }, x[i], epsilon_factor)
119
110
x_plus = x[i] + epsilon
120
- if typeof (fx) == Void
121
- df[i] = (f (x_plus) - f (x[i])) / epsilon
122
- else
123
- df[i] = (f (x_plus) - fx[i]) / epsilon
124
- end
111
+ df[i] = (f (x_plus) - f (x[i])) / epsilon
125
112
end
126
113
elseif fdtype == Val{:central }
127
114
epsilon_factor = compute_epsilon_factor (Val{:central }, epsilon_elemtype)
@@ -150,11 +137,7 @@ function _finite_difference!(df::StridedArray{<:Number}, f, x::Number,
150
137
epsilon_elemtype = compute_epsilon_elemtype (epsilon, x)
151
138
if fdtype == Val{:forward }
152
139
epsilon = compute_epsilon (Val{:forward }, real (x[i]))
153
- if typeof (fx) == Void
154
- df .= ( real ( f (x+ epsilon) - f (x) ) + im* imag ( f (x+ im* epsilon) - f (x) ) ) / epsilon
155
- else
156
- df .= ( real ( f (x+ epsilon) - fx ) + im* imag ( f (x+ im* epsilon) - fx )) / epsilon
157
- end
140
+ df .= ( real ( f (x+ epsilon) - f (x) ) + im* imag ( f (x+ im* epsilon) - f (x) ) ) / epsilon
158
141
elseif fdtype == Val{:central }
159
142
epsilon = compute_epsilon (Val{:central }, real (x[i]))
160
143
df .= (real (f (x+ epsilon) - f (x- epsilon)) + im* imag (f (x+ im* epsilon) - f (x- im* epsilon))) / (2 * epsilon)
@@ -174,11 +157,7 @@ function _finite_difference!(df::StridedArray{<:Number}, f, x::StridedArray{<:Nu
174
157
epsilon_factor = compute_epsilon_factor (Val{:forward }, epsilon_elemtype)
175
158
@inbounds for i in 1 : length (x)
176
159
epsilon = compute_epsilon (Val{:forward }, real (x[i]), epsilon_factor)
177
- if typeof (fx) == Void
178
- df[i] = ( real ( f (x[i]+ epsilon) - f (x[i]) ) + im* imag ( f (x[i]+ im* epsilon) - f (x[i]) ) ) / epsilon
179
- else
180
- df[i] = ( real ( f (x[i]+ epsilon) - fx[i] ) + im* imag ( f (x[i]+ im* epsilon) - fx[i] )) / epsilon
181
- end
160
+ df[i] = ( real ( f (x[i]+ epsilon) - f (x[i]) ) + im* imag ( f (x[i]+ im* epsilon) - f (x[i]) ) ) / epsilon
182
161
end
183
162
elseif fdtype == Val{:central }
184
163
epsilon_factor = compute_epsilon_factor (Val{:central }, epsilon_elemtype)
@@ -214,23 +193,15 @@ function finite_difference(f, x::T, fdtype::DataType, funtype::DataType=Val{:Rea
214
193
end
215
194
216
195
@inline function finite_difference_kernel (f, x:: T , :: Type{Val{:forward}} , :: Type{Val{:Real}} , epsilon:: T , fx:: Union{Void,T} = nothing ) where T<: Real
217
- if typeof (fx) == Void
218
- return (f (x+ epsilon) - f (x)) / epsilon
219
- else
220
- return (f (x+ epsilon) - fx) / epsilon
221
- end
196
+ return (f (x+ epsilon) - f (x)) / epsilon
222
197
end
223
198
224
199
@inline function finite_difference_kernel (f, x:: T , :: Type{Val{:central}} , :: Type{Val{:Real}} , epsilon:: T , :: Union{Void,T} = nothing ) where T<: Real
225
200
(f (x+ epsilon) - f (x- epsilon)) / (2 * epsilon)
226
201
end
227
202
228
203
@inline function finite_difference_kernel (f, x:: Number , :: Type{Val{:forward}} , :: Type{Val{:Complex}} , epsilon:: Real , fx:: Union{Void,<:Number} = nothing )
229
- if typeof (fx) == Void
230
- return real ((f (x[i]+ epsilon) - f (x[i]))) / epsilon + im* imag ((f (x[i]+ im* epsilon) - f (x[i]))) / epsilon
231
- else
232
- return real ((f (x[i]+ epsilon) - fx[i])) / epsilon + im* imag ((f (x[i]+ im* epsilon) - fx[i])) / epsilon
233
- end
204
+ return real ((f (x[i]+ epsilon) - f (x[i]))) / epsilon + im* imag ((f (x[i]+ im* epsilon) - f (x[i]))) / epsilon
234
205
end
235
206
236
207
@inline function finite_difference_kernel (f, x:: Number , :: Type{Val{:central}} , :: Type{Val{:Complex}} , epsilon:: Real , fx:: Union{Void,<:Number} = nothing )
0 commit comments