From e4723ed69f2e9bac6b5111762b4833c6dc4db3d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Fuhrmann?= Date: Mon, 7 Nov 2022 18:29:17 +0100 Subject: [PATCH 1/2] Allow to access fx from jac_cache via public API --- docs/src/index.md | 4 ++++ src/SparseDiffTools.jl | 3 ++- src/differentiation/compute_jacobian_ad.jl | 4 ++++ test/test_ad.jl | 14 +++++++++++++- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index b5021908..4c3c4c21 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -183,6 +183,10 @@ forwarddiff_color_jacobian!(J::AbstractMatrix{<:Number}, `dx` is a pre-allocated output vector which is used to declare the output size, and thus allows for specifying a non-square Jacobian. +Also, it is possible retrieve the function value via `value(jac_cache)` or +`value!(result, jac_cache)` + + If one is using an out-of-place function `f(x)`, then the alternative form ca be used: diff --git a/src/SparseDiffTools.jl b/src/SparseDiffTools.jl index 9ad635e7..dc82af25 100644 --- a/src/SparseDiffTools.jl +++ b/src/SparseDiffTools.jl @@ -42,7 +42,8 @@ export contract_color, autonum_hesvec, autonum_hesvec!, num_hesvecgrad, num_hesvecgrad!, auto_hesvecgrad, auto_hesvecgrad!, - JacVec, HesVec, HesVecGrad + JacVec, HesVec, HesVecGrad, + value! include("coloring/high_level.jl") include("coloring/backtracking_coloring.jl") diff --git a/src/differentiation/compute_jacobian_ad.jl b/src/differentiation/compute_jacobian_ad.jl index 7e4d1ff6..92bab423 100644 --- a/src/differentiation/compute_jacobian_ad.jl +++ b/src/differentiation/compute_jacobian_ad.jl @@ -8,6 +8,10 @@ struct ForwardColorJacCache{T, T2, T3, T4, T5, T6} chunksize::Int end + +ForwardDiff.value(cache::ForwardColorJacCache)= ForwardDiff.value.(cache.fx) +value!(fx,cache::ForwardColorJacCache)= fx.=ForwardDiff.value.(cache.fx) + getsize(::Val{N}) where {N} = N getsize(N::Integer) = N void_setindex!(args...) = (setindex!(args...); return) diff --git a/test/test_ad.jl b/test/test_ad.jl index 60718034..4ee39b7b 100644 --- a/test/test_ad.jl +++ b/test/test_ad.jl @@ -1,5 +1,5 @@ using SparseDiffTools -using ForwardDiff: Dual, jacobian +using ForwardDiff: Dual, jacobian, value using SparseArrays, Test using LinearAlgebra using BlockBandedMatrices, ArrayInterfaceBlockBandedMatrices @@ -212,6 +212,12 @@ jac_cache = ForwardColorJacCache(f, x, colorvec = repeat(1:3, 10), sparsity = _J forwarddiff_color_jacobian!(_J1, f, x, jac_cache) @test _J1 ≈ J @test fcalls == 1 +dx=similar(x) +f(dx,x) +@test value(jac_cache) == dx +dx1 = similar(dx) +value!(dx1,jac_cache) +@test dx1 == dx fcalls = 0 _J1 = similar(_J) @@ -227,6 +233,12 @@ jac_cache = ForwardColorJacCache(f, x, colorvec = repeat(1:3, 10), sparsity = _J forwarddiff_color_jacobian!(_denseJ1, f, x, jac_cache) @test _denseJ1 ≈ J @test fcalls == 1 +dx=similar(x) +f(dx,x) +@test value(jac_cache) == dx +dx1 = similar(dx) +value!(dx1,jac_cache) +@test dx1 == dx _Jt = similar(Tridiagonal(J)) forwarddiff_color_jacobian!(_Jt, f, x, colorvec = repeat(1:3, 10), sparsity = _Jt) From 023c741015b44c7233fade504e15ce275fcbbac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Fuhrmann?= Date: Mon, 7 Nov 2022 19:08:09 +0100 Subject: [PATCH 2/2] fix formatting --- src/differentiation/compute_jacobian_ad.jl | 5 ++--- test/test_ad.jl | 16 ++++++++-------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/differentiation/compute_jacobian_ad.jl b/src/differentiation/compute_jacobian_ad.jl index 92bab423..513fc7f7 100644 --- a/src/differentiation/compute_jacobian_ad.jl +++ b/src/differentiation/compute_jacobian_ad.jl @@ -8,9 +8,8 @@ struct ForwardColorJacCache{T, T2, T3, T4, T5, T6} chunksize::Int end - -ForwardDiff.value(cache::ForwardColorJacCache)= ForwardDiff.value.(cache.fx) -value!(fx,cache::ForwardColorJacCache)= fx.=ForwardDiff.value.(cache.fx) +ForwardDiff.value(cache::ForwardColorJacCache) = ForwardDiff.value.(cache.fx) +value!(fx, cache::ForwardColorJacCache) = fx .= ForwardDiff.value.(cache.fx) getsize(::Val{N}) where {N} = N getsize(N::Integer) = N diff --git a/test/test_ad.jl b/test/test_ad.jl index 4ee39b7b..749008ca 100644 --- a/test/test_ad.jl +++ b/test/test_ad.jl @@ -212,11 +212,11 @@ jac_cache = ForwardColorJacCache(f, x, colorvec = repeat(1:3, 10), sparsity = _J forwarddiff_color_jacobian!(_J1, f, x, jac_cache) @test _J1 ≈ J @test fcalls == 1 -dx=similar(x) -f(dx,x) -@test value(jac_cache) == dx +dx = similar(x) +f(dx, x) +@test value(jac_cache) == dx dx1 = similar(dx) -value!(dx1,jac_cache) +value!(dx1, jac_cache) @test dx1 == dx fcalls = 0 @@ -233,11 +233,11 @@ jac_cache = ForwardColorJacCache(f, x, colorvec = repeat(1:3, 10), sparsity = _J forwarddiff_color_jacobian!(_denseJ1, f, x, jac_cache) @test _denseJ1 ≈ J @test fcalls == 1 -dx=similar(x) -f(dx,x) -@test value(jac_cache) == dx +dx = similar(x) +f(dx, x) +@test value(jac_cache) == dx dx1 = similar(dx) -value!(dx1,jac_cache) +value!(dx1, jac_cache) @test dx1 == dx _Jt = similar(Tridiagonal(J))