|
1 | 1 | mutable struct JacobianCache{CacheType1,CacheType2,CacheType3,ColorType,SparsityType,fdtype,returntype} |
2 | 2 | x1 :: CacheType1 |
| 3 | + x2 :: CacheType1 |
3 | 4 | fx :: CacheType2 |
4 | 5 | fx1 :: CacheType3 |
5 | 6 | colorvec :: ColorType |
@@ -96,7 +97,8 @@ function JacobianCache( |
96 | 97 | @assert eltype(fx1) == T2 |
97 | 98 | _fx = fx |
98 | 99 | end |
99 | | - JacobianCache{typeof(_x1),typeof(_fx),typeof(fx1),typeof(colorvec),typeof(sparsity),fdtype,returntype}(_x1,_fx,fx1,colorvec,sparsity) |
| 100 | + _x2 = similar(_x1) |
| 101 | + JacobianCache{typeof(_x1),typeof(_fx),typeof(fx1),typeof(colorvec),typeof(sparsity),fdtype,returntype}(_x1,_x2,_fx,fx1,colorvec,sparsity) |
100 | 102 | end |
101 | 103 |
|
102 | 104 | function _make_Ji(::SparseMatrixCSC, rows_index,cols_index,dx,colorvec,color_i,nrows,ncols) |
@@ -334,7 +336,7 @@ function finite_difference_jacobian!( |
334 | 336 | m, n = size(J) |
335 | 337 | _color = reshape(colorvec, axes(x)...) |
336 | 338 |
|
337 | | - x1, fx, fx1 = cache.x1, cache.fx, cache.fx1 |
| 339 | + x1, x2, fx, fx1 = cache.x1, cache.x2, cache.fx, cache.fx1 |
338 | 340 | copyto!(x1, x) |
339 | 341 | vfx = _vec(fx) |
340 | 342 |
|
@@ -377,8 +379,8 @@ function finite_difference_jacobian!( |
377 | 379 | # Now return x1 back to its original value |
378 | 380 | ArrayInterface.allowed_setindex!(x1, x1_save, color_i) |
379 | 381 | else # Perturb along the colorvec vector |
380 | | - @. fx1 = x1 * (_color == color_i) |
381 | | - tmp = norm(fx1) |
| 382 | + @. x2 = x1 * (_color == color_i) |
| 383 | + tmp = norm(x2) |
382 | 384 | epsilon = compute_epsilon(Val(:forward), sqrt(tmp), relstep, absstep, dir) |
383 | 385 | @. x1 = x1 + epsilon * (_color == color_i) |
384 | 386 | f(fx1, x1) |
@@ -420,8 +422,8 @@ function finite_difference_jacobian!( |
420 | 422 | @. J[:,color_i] = (vfx1 - vfx) / 2epsilon |
421 | 423 | ArrayInterface.allowed_setindex!(x1, x_save, color_i) |
422 | 424 | else # Perturb along the colorvec vector |
423 | | - @. fx1 = x1 * (_color == color_i) |
424 | | - tmp = norm(fx1) |
| 425 | + @. x2 = x1 * (_color == color_i) |
| 426 | + tmp = norm(x2) |
425 | 427 | epsilon = compute_epsilon(Val(:central), sqrt(tmp), relstep, absstep, dir) |
426 | 428 | @. x1 = x1 + epsilon * (_color == color_i) |
427 | 429 | @. x = x - epsilon * (_color == color_i) |
|
0 commit comments