|
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