Skip to content

Commit e9ad65c

Browse files
committed
use mapreduce
1 parent 925c5be commit e9ad65c

1 file changed

Lines changed: 82 additions & 65 deletions

File tree

src/jacobians.jl

Lines changed: 82 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -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)/(2epsilon)
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)/(2epsilon)
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)/(2epsilon)
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)/(2epsilon)
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

Comments
 (0)