Hessians
Hessians are a crucial ingredient in NewtonSolvers and SimpleSolvers.NewtonOptimizerStates.
using SimpleSolvers
using LinearAlgebra: norm
x = rand(3)
obj = OptimizerProblem(x -> norm(x - vcat(0., 0., 1.)) ^ 2, x)
hes = HessianAutodiff(obj, x)HessianAutodiff{Float64, Main.var"#2#3", ForwardDiff.HessianConfig{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3}, 3}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3}}}}(Main.var"#2#3"(), ForwardDiff.HessianConfig{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3}, 3}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3}}}(ForwardDiff.JacobianConfig{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3}}}((Partials(1.0, 0.0, 0.0), Partials(0.0, 1.0, 0.0), Partials(0.0, 0.0, 1.0)), ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3}[Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(6.95173313831274e-310,6.9517331383143e-310,6.9517305918502e-310,6.95173059189445e-310), Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(6.9517331383222e-310,6.9517305920494e-310,6.9517331383673e-310,6.9517305920494e-310), Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(6.9517305570964e-310,6.95177105251594e-310,6.95173055197236e-310,6.9517753084646e-310)]), ForwardDiff.GradientConfig{ForwardDiff.Tag{Main.var"#2#3", Float64}, ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3}, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3}, 3}}}((Partials(Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(1.0,0.0,0.0,0.0), Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(0.0,0.0,0.0,0.0), Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(0.0,0.0,0.0,0.0)), Partials(Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(0.0,0.0,0.0,0.0), Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(1.0,0.0,0.0,0.0), Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(0.0,0.0,0.0,0.0)), Partials(Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(0.0,0.0,0.0,0.0), Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(0.0,0.0,0.0,0.0), Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(1.0,0.0,0.0,0.0))), ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, ForwardDiff.Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}, Float64, 3}, 3}[Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(2.5e-323,2.5e-323,6.95173568305674e-310,6.9517356830583e-310),Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(3.0e-323,4.4e-323,6.9517356830599e-310,6.9517356830615e-310),Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(5.0e-323,6.0e-323,6.95173568306306e-310,6.95173568306464e-310),Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(6.4e-323,7.0e-323,6.9517356830662e-310,6.9517356830678e-310)), Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(7.4e-323,8.0e-323,6.9517356830694e-310,6.95173568307097e-310),Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(8.4e-323,1.0e-322,6.95173568307255e-310,6.95173568307413e-310),Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(1.04e-322,1.14e-322,6.9517356830757e-310,6.9517356830773e-310),Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(1.2e-322,1.24e-322,6.95173568307887e-310,6.95173568308045e-310)), Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(1.3e-322,1.4e-322,6.95173568308203e-310,6.9517356830836e-310),Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(1.43e-322,1.43e-322,6.9517356830852e-310,6.9517356830868e-310),Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(1.5e-322,1.53e-322,6.95173568308836e-310,6.95173568308994e-310),Dual{ForwardDiff.Tag{Main.var"#2#3", Float64}}(1.6e-322,1.6e-322,6.9517356830915e-310,6.9517356830931e-310))])))The instance of HessianAutodiff can be called:
hes(x)3×3 Matrix{Float64}:
2.0 0.0 0.0
0.0 2.0 -1.11022e-16
5.55112e-17 1.11022e-16 2.0Or alternative in-place:
H = SimpleSolvers.alloc_h(x)
hes(H, x)
H3×3 Matrix{Float64}:
2.0 0.0 0.0
0.0 2.0 -1.11022e-16
5.55112e-17 1.11022e-16 2.0