@@ -171,7 +171,7 @@ function finite_difference_jacobian(
171171 end
172172 vecx = _vec (x)
173173 vecx1 = _vec (x1)
174- J = jac_prototype isa Nothing ? (sparsity isa Nothing ? false .* vecfx.* vecx ' : zeros (eltype (x),size (sparsity))) : zero (jac_prototype)
174+ J = jac_prototype isa Nothing ? (sparsity isa Nothing ? Array {eltype(x),2} (undef, length ( vecfx), 0 ) : zeros (eltype (x),size (sparsity))) : zero (jac_prototype)
175175 nrows, ncols = size (J)
176176
177177 if ! (sparsity isa Nothing)
@@ -181,71 +181,101 @@ function finite_difference_jacobian(
181181 end
182182
183183 if fdtype == Val{:forward }
184- @inbounds for color_i ∈ 1 : maximum (colorvec)
185- if sparsity isa Nothing
186- x_save = ArrayInterface. allowed_getindex (vecx,color_i)
187- epsilon = compute_epsilon (Val{:forward }, x_save, relstep, absstep, dir)
188- _vecx1 = Base. setindex (vecx,x_save+ epsilon,color_i)
189- _x1 = reshape (_vecx1,size (x))
190- vecfx1 = _vec (f (_x1))
191- dx = (vecfx1- vecfx)/ epsilon
192- J = J + _make_Ji (J, eltype (x), dx, color_i, nrows, ncols)
193- else
194- tmp = norm (vecx .* (colorvec .== color_i))
195- epsilon = compute_epsilon (Val{:forward }, sqrt (tmp), relstep, absstep, dir)
196- _vecx = @. vecx + epsilon * (colorvec == color_i)
197- _x = reshape (_vecx,size (x))
198- vecfx1 = _vec (f (_x))
199- dx = (vecfx1- vecfx)/ epsilon
200- Ji = _make_Ji (J,rows_index,cols_index,dx,colorvec,color_i,nrows,ncols)
201- J = J + Ji
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 && sparsity 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)
201+ 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
211+ end
202212 end
203213 end
204214 elseif fdtype == Val{:central }
205- @inbounds for color_i ∈ 1 : maximum (colorvec)
206- if sparsity isa Nothing
207- x1_save = ArrayInterface. allowed_getindex (vecx1,color_i)
208- x_save = ArrayInterface. allowed_getindex (vecx,color_i)
209- epsilon = compute_epsilon (Val{:forward }, x1_save, relstep, absstep, dir)
210- _vecx1 = Base. setindex (vecx1,x1_save+ epsilon,color_i)
211- _vecx = Base. setindex (vecx,x_save- epsilon,color_i)
212- _x1 = reshape (_vecx1,size (x))
213- _x = reshape (_vecx,size (x))
214- vecfx1 = _vec (f (_x1))
215- vecfx = _vec (f (_x))
216- dx = (vecfx1- vecfx)/ (2 epsilon)
217- J = J + _make_Ji (J, eltype (x), dx, color_i, nrows, ncols)
218- else
219- tmp = norm (vecx1 .* (colorvec .== color_i))
220- epsilon = compute_epsilon (Val{:forward }, sqrt (tmp), relstep, absstep, dir)
221- _vecx1 = @. vecx1 + epsilon * (colorvec == color_i)
222- _vecx = @. vecx - epsilon * (colorvec == color_i)
223- _x1 = reshape (_vecx1,size (x))
224- _x = reshape (_vecx, size (x))
225- vecfx1 = _vec (f (_x1))
226- vecfx = _vec (f (_x))
227- dx = (vecfx1- vecfx)/ (2 epsilon)
228- Ji = _make_Ji (J,rows_index,cols_index,dx,colorvec,color_i,nrows,ncols)
229- J = J + Ji
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 && sparsity 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)
236+ 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
249+ end
230250 end
231251 end
232252 elseif fdtype == Val{:complex } && returntype <: Real
233253 epsilon = eps (eltype (x))
234- @inbounds for color_i ∈ 1 : maximum (colorvec)
235- if sparsity isa Nothing
236- x_save = ArrayInterface. allowed_getindex (vecx,color_i)
237- _vecx = Base. setindex (complex .(vecx),x_save+ im* epsilon,color_i)
238- _x = reshape (_vecx,size (x))
239- vecfx = _vec (f (_x))
240- dx = imag (vecfx)/ epsilon
241- J = J + _make_Ji (J, eltype (x), dx, color_i, nrows, ncols)
242- else
243- _vecx = @. vecx + im * epsilon * (colorvec == color_i)
244- _x = reshape (_vecx,size (x))
245- vecfx = _vec (f (_x))
246- dx = imag (vecfx)/ epsilon
247- Ji = _make_Ji (J,rows_index,cols_index,dx,colorvec,color_i,nrows,ncols)
248- J = J + Ji
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 && sparsity 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)
270+ 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
278+ end
249279 end
250280 end
251281 else
0 commit comments