Nonconvex.jl is a package that aims to interface all the major nonlinear and mixed integer nonlinear programming packages in Julia using a function-based API. Zygote.jl is used for automatic differentiation (AD) and ChainRules.jl can be used to define analytic gradients or custom adjoint rules for functions. Ipopt.jl, NLopt.jl, Percival.jl and Juniper.jl are some of the packages wrapped in Nonconvex.jl as of the writing of this abstract.
The method of moving asymptotes is also natively implemented in the package. The first order augmented Lagrangian algorithm implemented in Percival.jl is particularly suitable for the AD-based approach because efficient adjoint rules of block constraints can be used when calculating the gradient of the augmented Lagrangian instead of computing the entire Jacobian of the constraint functions. The nice thing about having a function-based API is that registering functions with JuMP.jl and splatting inputs are not needed anymore thus simplifying the nonlinear and mixed integer nonlinear optimization interface. Future work includes using ModelingToolkit.jl to reverse-engineer the objective and constraint functions, generating mathematical expressions where possible thus allowing the use of expression-based nonlinear and mixed integer nonlinear solvers such as Alpine.jl.