Performance tips

The package ADNLPModels.jl is designed to easily model optimization problems andto allow an efficient access to the NLPModel API. In this tutorial, we will see some tips to ensure the maximum performance of the model.

Use in-place constructor

When dealing with a constrained optimization problem, it is recommended to use in-place constraint functions.

using ADNLPModels, NLPModels
f(x) = sum(x)
x0 = ones(2)
lcon = ucon = ones(1)
c_out(x) = [x[1]]
nlp_out = ADNLPModel(f, x0, c_out, lcon, ucon)

c_in(cx, x) = begin
  cx[1] = x[1]
  return cx
end
nlp_in = ADNLPModel!(f, x0, c_in, lcon, ucon)
ADNLPModel - Model with automatic differentiation backend ADModelBackend{
  ForwardDiffADGradient,
  ForwardDiffADHvprod,
  ForwardDiffADJprod,
  ForwardDiffADJtprod,
  ForwardDiffADJacobian,
  ForwardDiffADHessian,
  ForwardDiffADGHjvprod,
}
  Problem name: Generic
   All variables: ████████████████████ 2      All constraints: ████████████████████ 1     
            free: ████████████████████ 2                 free: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
         low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           fixed: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                fixed: ████████████████████ 1     
          infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
            nnzh: (  0.00% sparsity)   3               linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
                                                    nonlinear: ████████████████████ 1     
                                                         nnzj: (  0.00% sparsity)   2     

  Counters:
             obj: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 grad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 cons: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
        cons_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0             cons_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 jcon: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jgrad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                  jac: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              jac_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
         jac_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                jprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0            jprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
       jprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jtprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0           jtprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
      jtprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 hess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                hprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jhess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jhprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
using BenchmarkTools
cx = rand(1)
x = 18 * ones(2)
@btime cons!(nlp_out, x, cx)
1-element Vector{Float64}:
 18.0
@btime cons!(nlp_in, x, cx)
1-element Vector{Float64}:
 18.0

The difference between the two increases with the dimension.

Note that the same applies to nonlinear least squares problems.

F(x) = [
    x[1];
    x[1] + x[2]^2;
    sin(x[2]);
    exp(x[1] + 0.5)
]
x0 = ones(2)
nequ = 4
nls_out = ADNLSModel(F, x0, nequ)

F!(Fx, x) = begin
  Fx[1] = x[1]
  Fx[2] = x[1] + x[2]^2
  Fx[3] = sin(x[2])
  Fx[4] = exp(x[1] + 0.5)
  return Fx
end
nls_in = ADNLSModel!(F!, x0, nequ)
ADNLSModel - Nonlinear least-squares model with automatic differentiation backend ADModelBackend{
  ForwardDiffADGradient,
  ForwardDiffADHvprod,
  EmptyADbackend,
  EmptyADbackend,
  EmptyADbackend,
  ForwardDiffADHessian,
  EmptyADbackend,
}
  Problem name: Generic
   All variables: ████████████████████ 2      All constraints: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0        All residuals: ████████████████████ 4     
            free: ████████████████████ 2                 free: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0            nonlinear: ████████████████████ 4     
           upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 nnzj: (  0.00% sparsity)   8     
         low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 nnzh: (  0.00% sparsity)   3     
           fixed: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                fixed: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
          infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
            nnzh: (  0.00% sparsity)   3               linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
                                                    nonlinear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
                                                         nnzj: (------% sparsity)         

  Counters:
             obj: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 grad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 cons: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
        cons_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0             cons_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 jcon: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jgrad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                  jac: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              jac_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
         jac_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                jprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0            jprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
       jprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jtprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0           jtprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
      jtprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 hess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                hprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jhess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jhprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0             residual: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
    jac_residual: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0       jprod_residual: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0      jtprod_residual: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
   hess_residual: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0       jhess_residual: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0       hprod_residual: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
Fx = rand(4)
@btime residual!(nls_out, x, Fx)
4-element Vector{Float64}:
  18.0
 342.0
  -0.7509872467716762
   1.0825498775023076e8
@btime residual!(nls_in, x, Fx)
4-element Vector{Float64}:
  18.0
 342.0
  -0.7509872467716762
   1.0825498775023076e8

This phenomenon also extends to related backends.

Fx = rand(4)
v = ones(2)
@btime jprod_residual!(nls_out, x, v, Fx)
4-element Vector{Float64}:
  1.0
 37.0
  0.6603167082440802
  1.0825498775023076e8
@btime jprod_residual!(nls_in, x, v, Fx)
4-element Vector{Float64}:
  1.0
 37.0
  0.6603167082440802
  1.0825498775023076e8

Use only the needed operations

It is tempting to define the most generic and efficient ADNLPModel from the start.

using ADNLPModels, NLPModels, Symbolics
f(x) = (x[1] - x[2])^2
x0 = ones(2)
lcon = ucon = ones(1)
c_in(cx, x) = begin
  cx[1] = x[1]
  return cx
end
nlp = ADNLPModel!(f, x0, c_in, lcon, ucon, show_time = true)
ADNLPModel - Model with automatic differentiation backend ADModelBackend{
  ForwardDiffADGradient,
  ForwardDiffADHvprod,
  ForwardDiffADJprod,
  ForwardDiffADJtprod,
  SparseADJacobian,
  SparseADHessian,
  ForwardDiffADGHjvprod,
}
  Problem name: Generic
   All variables: ████████████████████ 2      All constraints: ████████████████████ 1     
            free: ████████████████████ 2                 free: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
         low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           fixed: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                fixed: ████████████████████ 1     
          infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
            nnzh: (  0.00% sparsity)   3               linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
                                                    nonlinear: ████████████████████ 1     
                                                         nnzj: ( 50.00% sparsity)   1     

  Counters:
             obj: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 grad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 cons: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
        cons_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0             cons_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 jcon: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jgrad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                  jac: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              jac_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
         jac_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                jprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0            jprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
       jprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jtprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0           jtprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
      jtprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 hess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                hprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jhess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jhprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     

However, depending on the size of the problem this might time consuming as initializing each backend takes time. Besides, some solvers may not require all the API to solve the problem. For instance, Percival.jl is matrix-free solver in the sense that it only uses jprod, jtprod and hprod.

using Percival
stats = percival(nlp)
"Execution stats: first-order stationary"
nlp.counters
  Counters:
             obj: ████████████████████ 1                 grad: ████████████████████ 1                 cons: ████████████████████ 1     
        cons_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0             cons_nln: ████████████████████ 1                 jcon: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jgrad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                  jac: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              jac_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
         jac_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                jprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0            jprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
       jprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jtprod: ████████████████████ 1           jtprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
      jtprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 hess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                hprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jhess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jhprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     

Therefore, it is more efficient to avoid preparing Jacobian and Hessian backends in this case.

nlp = ADNLPModel!(f, x0, c_in, lcon, ucon, jacobian_backend = ADNLPModels.EmptyADbackend, hessian_backend = ADNLPModels.EmptyADbackend, show_time = true)
ADNLPModel - Model with automatic differentiation backend ADModelBackend{
  ForwardDiffADGradient,
  ForwardDiffADHvprod,
  ForwardDiffADJprod,
  ForwardDiffADJtprod,
  EmptyADbackend,
  EmptyADbackend,
  ForwardDiffADGHjvprod,
}
  Problem name: Generic
   All variables: ████████████████████ 2      All constraints: ████████████████████ 1     
            free: ████████████████████ 2                 free: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
         low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           fixed: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                fixed: ████████████████████ 1     
          infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
            nnzh: (  0.00% sparsity)   3               linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
                                                    nonlinear: ████████████████████ 1     
                                                         nnzj: (  0.00% sparsity)   2     

  Counters:
             obj: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 grad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 cons: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
        cons_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0             cons_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 jcon: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jgrad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                  jac: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              jac_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
         jac_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                jprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0            jprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
       jprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jtprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0           jtprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
      jtprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 hess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                hprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jhess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jhprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     

or, equivalently, using the matrix_free keyword argument

nlp = ADNLPModel!(f, x0, c_in, lcon, ucon, show_time = true, matrix_free = true)
ADNLPModel - Model with automatic differentiation backend ADModelBackend{
  ForwardDiffADGradient,
  ForwardDiffADHvprod,
  ForwardDiffADJprod,
  ForwardDiffADJtprod,
  EmptyADbackend,
  EmptyADbackend,
  ForwardDiffADGHjvprod,
}
  Problem name: Generic
   All variables: ████████████████████ 2      All constraints: ████████████████████ 1     
            free: ████████████████████ 2                 free: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                lower: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                upper: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
         low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              low/upp: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           fixed: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                fixed: ████████████████████ 1     
          infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               infeas: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
            nnzh: (  0.00% sparsity)   3               linear: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
                                                    nonlinear: ████████████████████ 1     
                                                         nnzj: (  0.00% sparsity)   2     

  Counters:
             obj: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 grad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 cons: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
        cons_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0             cons_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 jcon: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jgrad: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                  jac: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0              jac_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
         jac_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                jprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0            jprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
       jprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jtprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0           jtprod_lin: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
      jtprod_nln: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                 hess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0                hprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     
           jhess: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0               jhprod: ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ 0     

Benchmarks

This package implements several backends for each method and it is possible to design your own backend as well. Then, one way to choose the most efficient one is to run benchmarks.

using ADNLPModels, NLPModels, OptimizationProblems

The package OptimizationProblems.jl provides a collection of optimization problems in JuMP and ADNLPModels syntax.

meta = OptimizationProblems.meta;

288 rows × 17 columns

nvarvariable_nvarnconvariable_nconminimizenamehas_equalities_onlyhas_inequalities_onlyhas_boundshas_fixed_variablesobjtypecontypebest_known_lower_boundbest_known_upper_boundis_feasibledefined_everywhereorigin
Int64BoolInt64BoolBoolStringBoolBoolBoolBoolSymbolSymbolRealRealBool?Bool?Symbol
110001AMPGO020000otherunconstrained-Inf0.8394981missingunknown
210001AMPGO030000otherunconstrained-Inf2.889611missingunknown
310001AMPGO040000otherunconstrained-Inf-2.56661missingunknown
410001AMPGO050000otherunconstrained-Inf-0.01missingunknown
510001AMPGO060000otherunconstrained-Inf3.5177e-431missingunknown
610001AMPGO070000otherunconstrained-Inf2.564751missingunknown
710001AMPGO080000otherunconstrained-Inf-2.09281missingunknown
810001AMPGO090000otherunconstrained-Inf0.9211361missingunknown
910001AMPGO100000otherunconstrained-Inf-0.01missingunknown
1010001AMPGO110000otherunconstrained-Inf-1.01missingunknown
1110001AMPGO120000otherunconstrained-Inf1.01missingunknown
1210001AMPGO130000otherunconstrained-1.5874-1.58741missingunknown
1310001AMPGO140000otherunconstrained-Inf-0.01missingunknown
1410001AMPGO150000otherunconstrained-Inf2.153851missingunknown
1510001AMPGO180000otherunconstrained-Inf4.01missingunknown
1610001AMPGO200000otherunconstrained-Inf3.92246e-431missingunknown
1710001AMPGO210000otherunconstrained-Inf0.01missingunknown
1810001AMPGO220000otherunconstrained-Inf1.01missingunknown
1930101BOX21000otherlinear-Inf0.9422841missingunknown
2030001BOX30000otherunconstrained-Inf662.8681missingunknown
2110001Dus2_10000otherunconstrained-Inf7.389061missingunknown
2210001Dus2_30000otherunconstrained-Inf0.9729731missingunknown
2310001Dus2_90000otherunconstrained-Inf1.01missingunknown
2410001Duscube0000otherunconstrained-Inf-108.01missingunknown
25911001NZF10000otherunconstrained-Inf34698.41missingunknown
2610001Shpak10000otherunconstrained-Inf0.8394981missingunknown
2710001Shpak20000otherunconstrained-Inf-0.7470361missingunknown
2810001Shpak30000otherunconstrained-Inf2.630551missingunknown
2910001Shpak40000otherunconstrained-Inf-0.6774391missingunknown
3010001Shpak50000otherunconstrained-Inf-1.008421missingunknown
3110001Shpak60000otherunconstrained-Inf-1.256671missingunknown
3280501aircrfta1011othergeneral-Inf01missingunknown
3340301allinit0000othergeneral-InfInfmissingmissingunknown
3440401allinitc0000othergeneral-InfInfmissingmissingunknown
3540001allinitu0000otherunconstrained-Inf13.01missingunknown
3620301alsotame0000othergeneral-InfInfmissingmissingunknown
37301501argauss1000othergeneral-InfInfmissingmissingunknown
381001001arglina0000least_squaresunconstrained-Inf500.01missingunknown
391001001arglinb0000least_squaresunconstrained-Inf6.85174e131missingunknown
401001001arglinc0000otherunconstrained-Inf6.38544e131missingunknown
411001001argtrig0000otherunconstrained-Inf0.01missingunknown
421001001arwhead0000otherunconstrained-Inf297.01missingunknown
434901501avion21010othergeneral-InfInfmissingmissingunknown
4431001bard0000least_squaresunconstrained-Inf500.01missingunknown
451001001bdqrtic0000least_squaresunconstrained-Inf21696.01missingunknown
4620001beale0000least_squaresunconstrained-Inf14.20311missingunknown
4760001biggs50011otherunconstrained-Inf-3.156211missingunknown
4860001biggs60000otherunconstrained-Inf-3.156211missingunknown
4920201booth1000othergeneral-InfInfmissingmissingunknown
5010101bqp1var0100othergeneral-Inf0.31251missingunknown
511001001brownal0000least_squaresunconstrained-Inf0.01missingunknown
5220001brownbs0000least_squaresunconstrained-Inf9.99998e111missingunknown
5340001brownden0000least_squaresunconstrained-Inf7.92669e61missingunknown
541001001broyden3d0000least_squaresunconstrained-Inf0.01missingunknown
551001001broydn7d0000otherunconstrained-Inf274.2041missingunknown
561001001brybnd0000least_squaresunconstrained-Inf3600.01missingunknown
5720101bt11000othergeneral-InfInfmissingmissingunknown
58100120311camshape0110othergeneral-InfInfmissingmissingunknown
5910017711chain1000othergeneral-InfInfmissingmissingunknown
601001001chainwoo0000otherunconstrained-Inf3.71954e51missingunknown
619619611channel1000othergeneral-InfInfmissingmissingunknown
621001001chnrosnb_mod0000otherunconstrained-Inf17637.91missingunknown
6320001cliff0000otherunconstrained-Inf4.85165e81missingunknown
649916411clnlbeam1010othergeneral-Inf350.01missingunknown
651001001clplatea0000otherunconstrained-Inf0.01missingunknown
661001001clplateb0000otherunconstrained-Inf0.01missingunknown
671001001clplatec0000otherunconstrained-Inf0.01missingunknown
6810015011controlinvestment1010othergeneral-Inf-0.981missingunknown
691001001cosine0000otherunconstrained-Inf86.88071missingunknown
701001001cragglvy0000otherunconstrained-Inf52823.11missingunknown
711001001curly0000otherunconstrained-Inf-0.006237221missingunknown
721001001curly100000otherunconstrained-Inf-0.006237221missingunknown
731001001curly200000otherunconstrained-Inf-0.01296541missingunknown
741001001curly300000otherunconstrained-Inf-0.0203831missingunknown
75991001dixmaane0000otherunconstrained-Inf731.8331missingunknown
76991001dixmaanf0000otherunconstrained-Inf1348.421missingunknown
77991001dixmaang0000otherunconstrained-Inf2495.831missingunknown
78991001dixmaanh0000otherunconstrained-Inf4974.251missingunknown
79991001dixmaani0000otherunconstrained-Inf663.6461missingunknown
80991001dixmaanj0000otherunconstrained-Inf1281.331missingunknown
81991001dixmaank0000otherunconstrained-Inf2427.651missingunknown
82991001dixmaanl0000otherunconstrained-Inf4903.71missingunknown
83991001dixmaanm0000otherunconstrained-Inf314.3131missingunknown
84991001dixmaann0000otherunconstrained-Inf665.661missingunknown
85991001dixmaano0000otherunconstrained-Inf1196.311missingunknown
86991001dixmaanp0000otherunconstrained-Inf2342.521missingunknown
871001001dixon3dq0000least_squaresunconstrained-Inf8.01missingunknown
881001001dqdrtic0000otherunconstrained-Inf177282.01missingunknown
891001001dqrtic0000otherunconstrained-Inf1.85427e91missingunknown
901001001edensch0000otherunconstrained-Inf1699.01missingunknown
911001001eg20000otherunconstrained-Inf-83.30561missingunknown
929913311elec1000otherquadratic-InfInfmissingmissingunknown
931001001engval10000otherunconstrained-Inf5841.01missingunknown
941001001errinros_mod0000least_squaresunconstrained-Inf3.13991e51missingunknown
951001001extrosnb0000otherunconstrained-Inf39604.01missingunknown
961001001fletcbv20000otherunconstrained-Inf-0.5131081missingunknown
971001001fletcbv3_mod0000otherunconstrained-Inf-0.01879251missingunknown
981001001fletchcr0000otherunconstrained-Inf9900.01missingunknown
991000001fminsrf20000otherunconstrained-Inf2504.271missingunknown
1001001001freuroth0000least_squaresunconstrained-Inf99556.51missingunknown
10130001gaussian0000least_squaresunconstrained-Inf3.88811e-61missingunknown
1021001001genhumps0000otherunconstrained-Inf2.53684e61missingunknown
1031001001genrose0000otherunconstrained-Inf405.1061missingunknown
1041001001genrose_nash0000otherunconstrained-Inf404.1261missingunknown
10531001gulf0000least_squaresunconstrained-Inf0.01missingunknown
10630001helical0000otherunconstrained-Inf0.01missingunknown
1079816811hovercraft1d1000least_squareslinear-InfInfmissingmissingunknown
10820001hs10010otherunconstrained-Inf909.01missingunknown
10920101hs100100othergeneral-InfInfmissingmissingunknown
11070401hs1000100othergeneral-Inf714.01missingunknown
11170501hs1010110othergeneral-InfInfmissingmissingunknown
11270501hs1020110othergeneral-InfInfmissingmissingunknown
11370501hs1030110othergeneral-InfInfmissingmissingunknown
11480501hs1040110othergeneral-InfInfmissingmissingunknown
11580101hs1050110otherlinear-InfInfmissingmissingunknown
11680601hs1060110othergeneral-InfInfmissingmissingunknown
11790601hs1071010othergeneral-InfInfmissingmissingunknown
118901201hs1080110othergeneral-InfInfmissingmissingunknown
11990901hs1090010othergeneral-InfInfmissingmissingunknown
12020101hs110100othergeneral-InfInfmissingmissingunknown
121100001hs1100010otherunconstrained-Inf-43.13431missingunknown
122100301hs1111010othergeneral-InfInfmissingmissingunknown
123100301hs1121010otherlinear-InfInfmissingmissingunknown
124100801hs1130100othergeneral-Inf753.01missingunknown
1251001101hs1140010othergeneral-InfInfmissingmissingunknown
1261301501hs1160110othergeneral-InfInfmissingmissingunknown
127150501hs1170110othergeneral-Inf2400.111missingunknown
1281501701hs1180110otherlinear-Inf942.7161missingunknown
129160801hs1191010otherlinear-InfInfmissingmissingunknown
13020101hs120100othergeneral-Inf0.01missingunknown
13120101hs130110least_squaresgeneral-InfInfmissingmissingunknown
13220201hs140000least_squaresgeneral-InfInfmissingmissingunknown
13320201hs150110othergeneral-InfInfmissingmissingunknown
13420201hs160110othergeneral-InfInfmissingmissingunknown
13520201hs170110othergeneral-InfInfmissingmissingunknown
13620201hs180110othergeneral-InfInfmissingmissingunknown
13720201hs190110othergeneral-InfInfmissingmissingunknown
13820001hs20010otherunconstrained-Inf909.01missingunknown
13920301hs200110othergeneral-InfInfmissingmissingunknown
14020101hs210110otherlinear-InfInfmissingmissingunknown
14140201hs2191000lineargeneral-1.0-1.011unknown
14220201hs220100least_squaresgeneral-InfInfmissingmissingunknown
14320501hs230110least_squaresgeneral-InfInfmissingmissingunknown
14420201hs240110otherlinear-Inf-0.01336461missingunknown
14530001hs250010otherunconstrained-Inf32.8351missingunknown
14630101hs261000othergeneral-Inf21.161missingunknown
14730101hs271000othergeneral-InfInfmissingmissingunknown
14830101hs281000least_squareslinear-Inf13.01missingunknown
14930101hs290100othergeneral-Inf-1.01missingunknown
15020001hs30010otherunconstrained-Inf1.000811missingunknown
15130101hs300110least_squaresgeneral-Inf3.01missingunknown
15230101hs310110othergeneral-Inf19.01missingunknown
15330201hs320010othergeneral-Inf7.21missingunknown
15430201hs330110othergeneral-Inf-3.01missingunknown
15530201hs340110othergeneral-Inf0.01missingunknown
15630101hs350110otherlinear-Inf2.251missingunknown
15730101hs360110otherlinear-Inf-1000.01missingunknown
15830101hs370110otherlinear-Inf-1000.01missingunknown
15940001hs380010otherunconstrained-Inf19192.01missingunknown
16040201hs391000othergeneral-InfInfmissingmissingunknown
16120001hs40010otherunconstrained-Inf3.323571missingunknown
16240301hs401000othergeneral-InfInfmissingmissingunknown
16340101hs411010otherlinear-InfInfmissingmissingunknown
16440201hs421000least_squaresgeneral-InfInfmissingmissingunknown
16540301hs430100othergeneral-Inf0.01missingunknown
16640601hs440110otherlinear-Inf0.01missingunknown
16750001hs450010otherunconstrained-Inf1.733331missingunknown
16850201hs461000othergeneral-InfInfmissingmissingunknown
16950301hs471000othergeneral-Inf20.73811missingunknown
17050201hs481000least_squareslinear-Inf84.01missingunknown
17150201hs491000otherlinear-Inf266.01missingunknown
17220001hs50010otherunconstrained-Inf1.01missingunknown
17350301hs501000otherlinear-Inf7516.01missingunknown
17450301hs511000least_squareslinear-Inf8.51missingunknown
17550301hs521000least_squareslinear-InfInfmissingmissingunknown
17650301hs531010least_squareslinear-InfInfmissingmissingunknown
17760101hs541010otherlinear-InfInfmissingmissingunknown
17860601hs551010otherlinear-InfInfmissingmissingunknown
17970401hs561000othergeneral-InfInfmissingmissingunknown
18020101hs570110least_squaresgeneral-Inf0.03079861missingunknown
18120301hs590110othergeneral-InfInfmissingmissingunknown
18220101hs61000least_squaresgeneral-InfInfmissingmissingunknown
18330101hs601010othergeneral-InfInfmissingmissingunknown
18430201hs611000othergeneral-InfInfmissingmissingunknown
18530101hs621010otherlinear-InfInfmissingmissingunknown
18630201hs631010othergeneral-InfInfmissingmissingunknown
18730101hs640110othergeneral-InfInfmissingmissingunknown
18830101hs650110othergeneral-InfInfmissingmissingunknown
18930201hs660110othergeneral-Inf0.581missingunknown
19040201hs681010othergeneral-InfInf1missingunknown
19140201hs691010othergeneral-InfInf1missingunknown
19220101hs71000othergeneral-InfInfmissingmissingunknown
19340101hs700110othergeneral-Inf0.9878591missingunknown
19440201hs710010othergeneral-InfInfmissingmissingunknown
19540201hs720110othergeneral-InfInfmissingmissingunknown
19640301hs730010othergeneral-InfInfmissingmissingunknown
19740401hs740010othergeneral-InfInfmissingmissingunknown
19840401hs750010othergeneral-InfInfmissingmissingunknown
19940301hs760110otherlinear-Inf-1.251missingunknown
20050201hs771000othergeneral-InfInfmissingmissingunknown
20150301hs781000othergeneral-InfInfmissingmissingunknown
20250301hs791000othergeneral-InfInfmissingmissingunknown
20320201hs81000othergeneral-InfInfmissingmissingunknown
20450301hs801010othergeneral-InfInfmissingmissingunknown
20550301hs811010othergeneral-InfInfmissingmissingunknown
20650301hs830110othergeneral-InfInfmissingmissingunknown
20750301hs840110othergeneral-Inf-2.35124e61missingunknown
208501001hs860110otherlinear-Inf20.01missingunknown
20960401hs871010othergeneral-InfInf1missingunknown
21020101hs91000otherlinear-Inf0.01missingunknown
21160201hs930110othergeneral-Inf137.0661missingunknown
21260401hs950110othergeneral-InfInfmissingmissingunknown
21360401hs960110othergeneral-InfInfmissingmissingunknown
21460401hs970110othergeneral-InfInfmissingmissingunknown
21560401hs980110othergeneral-InfInfmissingmissingunknown
21670201hs991010othergeneral-InfInfmissingmissingunknown
2171001001indef_mod0000otherunconstrained-Inf91.66551missingunknown
2181001001integreq0000least_squaresunconstrained-Inf0.01missingunknown
21920001jennrichsampson0000least_squaresunconstrained-Inf4171.311missingunknown
22040001kowosb0000least_squaresunconstrained-Inf0.02649781missingunknown
2211001001liarwhd0000otherunconstrained-Inf58500.01missingunknown
2221501101lincon0000otherlinear-InfInfmissingmissingunknown
22320201linsv0100otherlinear-InfInfmissingmissingunknown
22430001meyer30000least_squaresunconstrained-Inf1.69361e91missingunknown
22520201mgh01feas1000othergeneral-InfInfmissingmissingunknown
22620001misra1a0000least_squaresunconstrained-Inf500.01missingunknown
2271001001morebv0000least_squaresunconstrained-Inf0.5009421missingunknown
22820001nasty0000otherunconstrained-Inf0.51missingunknown
2291001001ncb200000otherunconstrained-Inf182.0021missingunknown
2301001001ncb20b0000otherunconstrained-Inf200.01missingunknown
2311001001noncvxu20000otherunconstrained-Inf2.63975e61missingunknown
2321001001noncvxun0000otherunconstrained-Inf2.72701e61missingunknown
2331001001nondia0000otherunconstrained-Inf39604.01missingunknown
2341001001nondquar0000otherunconstrained-Inf106.01missingunknown
23550001osborne10000least_squaresunconstrained-Inf7.068761missingunknown
236110001osborne20000least_squaresunconstrained-Inf2.093421missingunknown
23780001palmer1c0000least_squaresunconstrained-Inf3.45295e81missingunknown
23870001palmer1d0000least_squaresunconstrained-Inf2.87266e71missingunknown
23980001palmer2c0000least_squaresunconstrained-Inf2.6894e71missingunknown
24080001palmer3c0000least_squaresunconstrained-Inf8.12197e61missingunknown
24180001palmer4c0000least_squaresunconstrained-Inf8.09445e61missingunknown
24260001palmer5c0000least_squaresunconstrained-Inf25495.01missingunknown
24340001palmer5d0000least_squaresunconstrained-Inf22262.61missingunknown
24480001palmer6c0000least_squaresunconstrained-Inf7.72166e51missingunknown
24580001palmer7c0000least_squaresunconstrained-Inf3.20513e61missingunknown
24680001palmer8c0000least_squaresunconstrained-Inf850271.01missingunknown
2471001001penalty10000least_squaresunconstrained-Inf1.01missingunknown
2481001001penalty20000otherunconstrained-Inf1.68848e61missingunknown
2491001001penalty30000otherunconstrained-Inf1.00639e81missingunknown
25010015011polygon0010otherlinear-InfInf0missingunknown
25110015011polygon10010otherlinear-InfInf0missingunknown
2521001101polygon21010otherlinear-InfInf0missingunknown
253100110011polygon30100othergeneral-Inf-0.01missingunknown
25420001powellbs0000otherunconstrained-Inf0.5676311missingunknown
2551001001powellsg0000otherunconstrained-Inf5375.01missingunknown
2561001001power0000least_squaresunconstrained-Inf2.55025e71missingunknown
2571001001quartc0000otherunconstrained-Inf1.85427e91missingunknown
258109110211robotarm0011othergeneral-InfInfmissingmissingunknown
25920001rosenbrock0000otherunconstrained-Inf32.30861missingunknown
2601001001sbrybnd0000least_squaresunconstrained-Inf1568.01missingunknown
2611001001schmvett0000otherunconstrained-Inf-189.0681missingunknown
2621001001scosine0000otherunconstrained-Inf86.88071missingunknown
2631001001sinquad0000otherunconstrained-Inf0.65611missingunknown
2641001001sparsine0000otherunconstrained-Inf20893.31missingunknown
2651001001sparsqur0000otherunconstrained-Inf1420.311missingunknown
2661001001spmsrtls0000least_squaresunconstrained-Inf49.32391missingunknown
2671001001srosenbr0000otherunconstrained-Inf1210.01missingunknown
26860014411structural0010otherlinear-InfInfmissingmissingunknown
269150401tetra0111othergeneral-InfInfmissingmissingunknown
2701259701922201tetra_duct120111othergeneral-Inf23246.11missingunknown
27164170900001tetra_duct150111othergeneral-Inf10890.91missingunknown
27232010410401tetra_duct200111othergeneral-Inf4959.81missingunknown
27340110484701tetra_foam50111othergeneral-Inf6497.11missingunknown
27425980311601tetra_gear0111othergeneral-Inf4256.381missingunknown
27535700467501tetra_hook0111othergeneral-Inf6157.141missingunknown
276300001threepk0010otherunconstrained-Inf20236.51missingunknown
2771001001tointgss0000otherunconstrained-Inf891.6081missingunknown
2781001001tquartic0000least_squaresunconstrained-Inf0.811missingunknown
27980301triangle0111othergeneral-Inf11.3281missingunknown
28022440189601triangle_deer0111othergeneral-Inf2014.341missingunknown
28113660118201triangle_pacman0111othergeneral-Inf1316.281missingunknown
28244440402501triangle_turtle0111othergeneral-Inf4467.581missingunknown
2831001001tridia0000otherunconstrained-Inf5049.01missingunknown
2841001001vardim0000otherunconstrained-Inf1.31058e141missingunknown
28580001vibrbeam0000least_squaresunconstrained-Inf8231.281missingunknown
286311001watson0000least_squaresunconstrained-Inf500.01missingunknown
2871001001woods0000otherunconstrained-Inf180451.01missingunknown
28830301zangwil31000otherlinear-InfInfmissingmissingunknown

We select the problems that are scalable, so that there size can be modified. By default, the size is close to 100.

scalable_problems = meta[(meta.variable_nvar .== true) .& (meta.ncon .> 0), :name]
13-element Vector{String}:
 "camshape"
 "chain"
 "channel"
 "clnlbeam"
 "controlinvestment"
 "elec"
 "hovercraft1d"
 "polygon"
 "polygon1"
 "polygon2"
 "polygon3"
 "robotarm"
 "structural"
using NLPModelsJuMP, Zygote
list_backends = Dict(
  :forward => ADNLPModels.ForwardDiffADGradient,
  :reverse => ADNLPModels.ReverseDiffADGradient,
  :zygote => ADNLPModels.ZygoteADGradient,
)
Dict{Symbol, DataType} with 3 entries:
  :reverse => ReverseDiffADGradient
  :forward => ForwardDiffADGradient
  :zygote  => ZygoteADGradient
using DataFrames
nprob = length(scalable_problems)
stats = Dict{Symbol, DataFrame}()
for back in union(keys(list_backends), [:jump])
  stats[back] = DataFrame("name" => scalable_problems,
                 "time" => zeros(nprob),
                 "allocs" => zeros(Int, nprob))
end
using BenchmarkTools
nscal = 1000
for name in scalable_problems
  n = eval(Meta.parse("OptimizationProblems.get_" * name * "_nvar(n = $(nscal))"))
  m = eval(Meta.parse("OptimizationProblems.get_" * name * "_ncon(n = $(nscal))"))
  @info " $(name) with $n vars and $m cons"
  global x = ones(n)
  global g = zeros(n)
  global pb = Meta.parse(name)
  global nlp = MathOptNLPModel(OptimizationProblems.PureJuMP.eval(pb)(n = nscal))
  b = @benchmark grad!(nlp, x, g)
  stats[:jump][stats[:jump].name .== name, :time] = [median(b.times)]
  stats[:jump][stats[:jump].name .== name, :allocs] = [median(b.allocs)]
  for back in keys(list_backends)
    nlp = OptimizationProblems.ADNLPProblems.eval(pb)(n = nscal, gradient_backend = list_backends[back], matrix_free = true)
    b = @benchmark grad!(nlp, x, g)
    stats[back][stats[back].name .== name, :time] = [median(b.times)]
    stats[back][stats[back].name .== name, :allocs] = [median(b.allocs)]
  end
end
[ Info:  camshape with 1000 vars and 2003 cons
[ Info:  chain with 1000 vars and 752 cons
[ Info:  channel with 1000 vars and 1000 cons
[ Info:  clnlbeam with 999 vars and 664 cons
[ Info:  controlinvestment with 1000 vars and 500 cons
[ Info:  elec with 999 vars and 333 cons
[ Info:  hovercraft1d with 998 vars and 668 cons
[ Info:  polygon with 1000 vars and 125251 cons
[ Info:  polygon1 with 1000 vars and 500 cons
[ Info:  polygon2 with 1000 vars and 1 cons
[ Info:  polygon3 with 1000 vars and 1000 cons
[ Info:  robotarm with 1009 vars and 1002 cons
[ Info:  structural with 3540 vars and 3652 cons
using Plots, SolverBenchmark
costnames = ["median time (in ns)", "median allocs"]
costs = [
  df -> df.time,
  df -> df.allocs,
]

gr()

profile_solvers(stats, costs, costnames)