Skip to content

Commit b9110cb

Browse files
Merge pull request #107 from kanav99/kg/fastoop
Out of place optimizations
2 parents 0382836 + e890b3d commit b9110cb

1 file changed

Lines changed: 89 additions & 59 deletions

File tree

src/jacobians.jl

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

Comments
 (0)