@@ -172,7 +172,6 @@ function finite_difference_jacobian(
172172 vecx = _vec (x)
173173 vecx1 = _vec (x1)
174174 J = jac_prototype isa Nothing ? (sparsity isa Nothing ? Array {eltype(x),2} (undef, length (vecfx), 0 ) : zeros (eltype (x),size (sparsity))) : zero (jac_prototype)
175- @show J
176175 nrows, ncols = size (J)
177176
178177 if ! (sparsity isa Nothing)
@@ -182,83 +181,101 @@ function finite_difference_jacobian(
182181 end
183182
184183 if fdtype == Val{:forward }
185- @inbounds for color_i ∈ 1 : maximum (colorvec)
186- if sparsity isa Nothing
187- x_save = ArrayInterface. allowed_getindex (vecx,color_i)
188- epsilon = compute_epsilon (Val{:forward }, x_save, relstep, absstep, dir)
189- _vecx1 = Base. setindex (vecx,x_save+ epsilon,color_i)
190- _x1 = reshape (_vecx1,size (x))
191- vecfx1 = _vec (f (_x1))
192- dx = (vecfx1- vecfx)/ epsilon
193- if jac_prototype isa Nothing
194- J = hcat (J, dx)
195- else
184+
185+ function calculate_Ji_forward (i)
186+ x_save = ArrayInterface. allowed_getindex (vecx, i)
187+ epsilon = compute_epsilon (Val{:forward }, x_save, relstep, absstep, dir)
188+ _vecx1 = Base. setindex (vecx, x_save+ epsilon, i)
189+ _x1 = reshape (_vecx1,size (x))
190+ vecfx1 = _vec (f (_x1))
191+ dx = (vecfx1- vecfx) / epsilon
192+ return dx
193+ end
194+
195+ if jac_prototype isa Nothing
196+ J = mapreduce (calculate_Ji_forward, hcat, 1 : maximum (colorvec))
197+ else
198+ @inbounds for color_i ∈ 1 : maximum (colorvec)
199+ if sparsity isa Nothing
200+ dx = calculate_Ji (color_i)
196201 J = J + _make_Ji (J, eltype (x), dx, color_i, nrows, ncols)
202+ else
203+ tmp = norm (vecx .* (colorvec .== color_i))
204+ epsilon = compute_epsilon (Val{:forward }, sqrt (tmp), relstep, absstep, dir)
205+ _vecx = @. vecx + epsilon * (colorvec == color_i)
206+ _x = reshape (_vecx,size (x))
207+ vecfx1 = _vec (f (_x))
208+ dx = (vecfx1- vecfx)/ epsilon
209+ Ji = _make_Ji (J,rows_index,cols_index,dx,colorvec,color_i,nrows,ncols)
210+ J = J + Ji
197211 end
198- else
199- tmp = norm (vecx .* (colorvec .== color_i))
200- epsilon = compute_epsilon (Val{:forward }, sqrt (tmp), relstep, absstep, dir)
201- _vecx = @. vecx + epsilon * (colorvec == color_i)
202- _x = reshape (_vecx,size (x))
203- vecfx1 = _vec (f (_x))
204- dx = (vecfx1- vecfx)/ epsilon
205- Ji = _make_Ji (J,rows_index,cols_index,dx,colorvec,color_i,nrows,ncols)
206- J = J + Ji
207212 end
208213 end
209214 elseif fdtype == Val{:central }
210- @inbounds for color_i ∈ 1 : maximum (colorvec)
211- if sparsity isa Nothing
212- x1_save = ArrayInterface. allowed_getindex (vecx1,color_i)
213- x_save = ArrayInterface. allowed_getindex (vecx,color_i)
214- epsilon = compute_epsilon (Val{:forward }, x1_save, relstep, absstep, dir)
215- _vecx1 = Base. setindex (vecx1,x1_save+ epsilon,color_i)
216- _vecx = Base. setindex (vecx,x_save- epsilon,color_i)
217- _x1 = reshape (_vecx1,size (x))
218- _x = reshape (_vecx,size (x))
219- vecfx1 = _vec (f (_x1))
220- vecfx = _vec (f (_x))
221- dx = (vecfx1- vecfx)/ (2 epsilon)
222- if jac_prototype isa Nothing
223- J = hcat (J, dx)
224- else
215+
216+ function calculate_Ji_central (i)
217+ x1_save = ArrayInterface. allowed_getindex (vecx1,i)
218+ x_save = ArrayInterface. allowed_getindex (vecx,i)
219+ epsilon = compute_epsilon (Val{:forward }, x1_save, relstep, absstep, dir)
220+ _vecx1 = Base. setindex (vecx1,x1_save+ epsilon,i)
221+ _vecx = Base. setindex (vecx,x_save- epsilon,i)
222+ _x1 = reshape (_vecx1,size (x))
223+ _x = reshape (_vecx,size (x))
224+ vecfx1 = _vec (f (_x1))
225+ vecfx = _vec (f (_x))
226+ dx = (vecfx1- vecfx)/ (2 epsilon)
227+ return dx
228+ end
229+
230+ if jac_prototype isa Nothing
231+ J = mapreduce (calculate_Ji_central, hcat, 1 : maximum (colorvec))
232+ else
233+ @inbounds for color_i ∈ 1 : maximum (colorvec)
234+ if sparsity isa Nothing
235+ dx = calculate_Ji (color_i)
225236 J = J + _make_Ji (J, eltype (x), dx, color_i, nrows, ncols)
237+ else
238+ tmp = norm (vecx1 .* (colorvec .== color_i))
239+ epsilon = compute_epsilon (Val{:forward }, sqrt (tmp), relstep, absstep, dir)
240+ _vecx1 = @. vecx1 + epsilon * (colorvec == color_i)
241+ _vecx = @. vecx - epsilon * (colorvec == color_i)
242+ _x1 = reshape (_vecx1,size (x))
243+ _x = reshape (_vecx, size (x))
244+ vecfx1 = _vec (f (_x1))
245+ vecfx = _vec (f (_x))
246+ dx = (vecfx1- vecfx)/ (2 epsilon)
247+ Ji = _make_Ji (J,rows_index,cols_index,dx,colorvec,color_i,nrows,ncols)
248+ J = J + Ji
226249 end
227- else
228- tmp = norm (vecx1 .* (colorvec .== color_i))
229- epsilon = compute_epsilon (Val{:forward }, sqrt (tmp), relstep, absstep, dir)
230- _vecx1 = @. vecx1 + epsilon * (colorvec == color_i)
231- _vecx = @. vecx - epsilon * (colorvec == color_i)
232- _x1 = reshape (_vecx1,size (x))
233- _x = reshape (_vecx, size (x))
234- vecfx1 = _vec (f (_x1))
235- vecfx = _vec (f (_x))
236- dx = (vecfx1- vecfx)/ (2 epsilon)
237- Ji = _make_Ji (J,rows_index,cols_index,dx,colorvec,color_i,nrows,ncols)
238- J = J + Ji
239250 end
240251 end
241252 elseif fdtype == Val{:complex } && returntype <: Real
242253 epsilon = eps (eltype (x))
243- @inbounds for color_i ∈ 1 : maximum (colorvec)
244- if sparsity isa Nothing
245- x_save = ArrayInterface. allowed_getindex (vecx,color_i)
246- _vecx = Base. setindex (complex .(vecx),x_save+ im* epsilon,color_i)
247- _x = reshape (_vecx,size (x))
248- vecfx = _vec (f (_x))
249- dx = imag (vecfx)/ epsilon
250- if jac_prototype isa Nothing
251- J = hcat (J, dx)
252- else
254+
255+ function calculate_Ji_complex (i)
256+ x_save = ArrayInterface. allowed_getindex (vecx,i)
257+ _vecx = Base. setindex (complex .(vecx),x_save+ im* epsilon,i)
258+ _x = reshape (_vecx,size (x))
259+ vecfx = _vec (f (_x))
260+ dx = imag (vecfx)/ epsilon
261+ return dx
262+ end
263+
264+ if jac_prototype isa Nothing
265+ J = mapreduce (calculate_Ji_complex, hcat, 1 : maximum (colorvec))
266+ else
267+ @inbounds for color_i ∈ 1 : maximum (colorvec)
268+ if sparsity isa Nothing
269+ dx = calculate_Ji_complex (color_i)
253270 J = J + _make_Ji (J, eltype (x), dx, color_i, nrows, ncols)
271+ else
272+ _vecx = @. vecx + im * epsilon * (colorvec == color_i)
273+ _x = reshape (_vecx,size (x))
274+ vecfx = _vec (f (_x))
275+ dx = imag (vecfx)/ epsilon
276+ Ji = _make_Ji (J,rows_index,cols_index,dx,colorvec,color_i,nrows,ncols)
277+ J = J + Ji
254278 end
255- else
256- _vecx = @. vecx + im * epsilon * (colorvec == color_i)
257- _x = reshape (_vecx,size (x))
258- vecfx = _vec (f (_x))
259- dx = imag (vecfx)/ epsilon
260- Ji = _make_Ji (J,rows_index,cols_index,dx,colorvec,color_i,nrows,ncols)
261- J = J + Ji
262279 end
263280 end
264281 else
0 commit comments