diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index bdb9651..5805f36 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -19,7 +19,7 @@ jobs: - '1' steps: - uses: actions/checkout@v4 - - uses: julia-actions/setup-julia@v1 + - uses: julia-actions/setup-julia@v2 with: version: ${{ matrix.version }} - uses: actions/cache@v4 diff --git a/.github/workflows/Downstream.yml b/.github/workflows/Downstream.yml index f3339ac..6447099 100644 --- a/.github/workflows/Downstream.yml +++ b/.github/workflows/Downstream.yml @@ -20,7 +20,7 @@ jobs: - {user: SciML, repo: OrdinaryDiffEq.jl, group: InterfaceII} steps: - uses: actions/checkout@v4 - - uses: julia-actions/setup-julia@v1 + - uses: julia-actions/setup-julia@v2 with: version: ${{ matrix.julia-version }} arch: x64 diff --git a/Project.toml b/Project.toml index 6248c44..e118751 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "FiniteDiff" uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" -version = "2.23.0" +version = "2.23.1" [deps] ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" diff --git a/src/hessians.jl b/src/hessians.jl index 9c069c7..1b43156 100644 --- a/src/hessians.jl +++ b/src/hessians.jl @@ -137,6 +137,12 @@ function finite_difference_hessian!(H,f,x, if inplace === Val(true) _xpp, _xpm, _xmp, _xmm = xpp, xpm, xmp, xmm + copyto!(xpp,x) + copyto!(xpm,x) + copyto!(xmp,x) + copyto!(xmm,x) + else # ignore the cache since immutable + xpp, xpm, xmp, xmm = copy(x), copy(x), copy(x), copy(x) end for i = 1:n diff --git a/test/finitedifftests.jl b/test/finitedifftests.jl index 29ae9de..a0b31b8 100644 --- a/test/finitedifftests.jl +++ b/test/finitedifftests.jl @@ -348,17 +348,17 @@ end _g(x) = x[1]^2 + x[2] _∇g(x) = [2x[1], 1.0] x = [1.0, 3.0] - fx = _g(x) + fx = _g(x) c1, c2 = zero(x), zero(x) c3 = zero(x) res = zero(x) gcache = FiniteDiff.GradientCache{Float64, Vector{Float64}, Vector{Float64}, Vector{Float64}, Val(:forward), Float64, Val(false)}(fx, c1, c2, c3) FiniteDiff.finite_difference_gradient!(res, _g, x, gcache) - @test res ≈ _∇g(x) + @test res ≈ _∇g(x) x = [2.7, 1.0] gcache = @set gcache.fx = _g(x) FiniteDiff.finite_difference_gradient!(res, _g, x, gcache) - @test res ≈ _∇g(x) + @test res ≈ _∇g(x) end # Jacobian tests @@ -488,7 +488,7 @@ f_in = oopf(x) @test err_func(FiniteDiff.finite_difference_jacobian(oopf, x, complex_cache), J_ref) < 1e-14 end -# Test default colorvec construction +# Test default colorvec construction θ = rand(2) y0 = rand(1) cache = FiniteDiff.JacobianCache(copy(θ), copy(y0), copy(y0), Val(:forward)) @@ -540,3 +540,11 @@ Base.getindex(x::ImmutableVector, i::Integer) = x.x[i] @test J ≈ Matrix(I, 2, 2) end end + +@testset "Hessian Cache test" begin + # https://github.com/JuliaDiff/FiniteDiff.jl/issues/185 + f(x) = sum(abs2, x) + x1, x2 = float.(1:4), float.(5:8); + @test FiniteDiff.finite_difference_hessian(f, x1, FiniteDiff.HessianCache(x1)) == Diagonal(2*ones(4)) + @test FiniteDiff.finite_difference_hessian(f, x1, FiniteDiff.HessianCache(x2)) == Diagonal(2*ones(4)) +end