I use NLSolvers for this. i had this function defined,as NLSolvers provides the bare minimum:
using NLSolvers,ForwardDiff
function nlsolve(f!,x0,method=TrustRegion(Newton(), Dogleg()),options=NEqOptions())
len = length(x0)
xcache = zeros(eltype(x0),len)
Fcache = zeros(eltype(x0),len)
JCache = zeros(eltype(x0),len,len)
jconfig = ForwardDiff.JacobianConfig(f!,x0,x0)
function j!(J,x)
#@show J
ForwardDiff.jacobian!(J,f!,Fcache,x,jconfig)
end
function fj!(F,J,x)
#@show J,F
ForwardDiff.jacobian!(J,f!,F,x,jconfig)
F,J
end
function jv!(x)
function JacV(Fv,v)
ForwardDiff.jacobian!(JCache,f!,Fcache,v,jconfig)
Fv .= Jcache * v
end
return LinearMap(JacV,length(x))
end
vectorobj = NLSolvers.VectorObjective(f!,j!,fj!,jv!)
vectorprob = NEqProblem(vectorobj)
res = solve(vectorprob, x0,method , options)
end