Giter VIP home page Giter VIP logo

Comments (10)

odow avatar odow commented on July 18, 2024

I realized that duplicated nonzero entries (same matrix position) are not summed up.

This is a known feature and intentional on our part.

It arises because of how MathOptInterface computes the Hessian using automatic differentiation. Can you share a reproducible example that demonstrates the issue? There might be somethings we can do to improve.

We have some work underway to allow switching the AD backend for some problems. See:

At the moment, you can use AmplNLWriter to switch to the NL formulation:

using JuMP, Ipopt
model = Model(Ipopt.Optimizer)

becomes

using JuMP, AmplNLWriter, Ipopt_jll
model = Model(() -> AmplNLWriter.Optimizer(Ipopt_jll.amplexe))

If the problem is nicely structured, you could also try https://github.com/odow/MathOptSymbolicAD.jl

from ipopt.jl.

marco83pt avatar marco83pt commented on July 18, 2024

Dear Odow,
Thanks a lot for your support. It is really appreciated. Sure, here a replicable test case.

First piece of code:

m = read_from_file("demos\\problem.nl") set_optimizer(m, Ipopt.Optimizer) @time jump_solve_time = optimize!(m)

Returns:
12.683538 seconds (6.26 M allocations: 542.467 MiB, 3.35% gc time)
Number of nonzeros in equality constraint Jacobian...: 65471
Number of nonzeros in inequality constraint Jacobian.: 13976
Number of nonzeros in Lagrangian Hessian.............: 314291
Total seconds in IPOPT = 11.674
Objective...............: 2.3836722884185951e+03 2.3836722884185951e+03
Number of Iterations....: 41

Second piece of code:

m = read_from_file("demos\\problem.nl") set_optimizer(m, () -> AmplNLWriter.Optimizer(Ipopt_jll.amplexe)) @time ampl_solve_time = optimize!(m)

Returns:
8.320853 seconds (5.85 M allocations: 402.056 MiB, 1.75% gc time)
Number of nonzeros in equality constraint Jacobian...: 65471
Number of nonzeros in inequality constraint Jacobian.: 13976
Number of nonzeros in Lagrangian Hessian.............: 36439
Total seconds in IPOPT = 6.914
Objective...............: 2.3836722884185870e+03 2.3836722884185870e+03
Number of Iterations....: 41

Considerations:

  • Same solution, same objective function, same number of iterations
  • Via JuMP: 314291 nnz in Hessian, Via AMPL/nl: 36439 nnz in Hessian (almost 10x less)
  • Solution time with JuMP: 11.6 s, via AMPL/nl: 6

I hope this data set can help you understand this behaviour better. With bigger cases, this slowdown is also amplified.

problem.zip

from ipopt.jl.

odow avatar odow commented on July 18, 2024

Do you have the JuMP script that builds the model?

from ipopt.jl.

odow avatar odow commented on July 18, 2024

Here's what I get. It's hard to say more without the JuMP script. The NL file doesn't preserve all of the structure. For example, it treats linear constraints as nonlinear, where as JuMP+Ipopt.jl directly has special detection and support for linear and quadratic functions.

But I'd mark this as expected behavior. The choice of AD system can have a large impact on the solve time, and no single AD system is best for all models. So it's nice that we can easily try out multiple different ones:

julia> using JuMP

julia> import AmplNLWriter

julia> import Ipopt

julia> import Ipopt_jll

julia> import MathOptSymbolicAD

julia> model = read_from_file("/Users/Oscar/Downloads/problem.nl")
A JuMP Model
Minimization problem with:
Variables: 8744
Objective function type: Nonlinear
`VariableRef`-in-`MathOptInterface.GreaterThan{Float64}`: 4724 constraints
`VariableRef`-in-`MathOptInterface.LessThan{Float64}`: 4724 constraints
Nonlinear: 15029 constraints
Model mode: AUTOMATIC
CachingOptimizer state: NO_OPTIMIZER
Solver name: No optimizer attached.

julia> set_optimizer(model, Ipopt.Optimizer)

julia> @time optimize!(model)
This is Ipopt version 3.14.4, running with linear solver MUMPS 5.4.1.

Number of nonzeros in equality constraint Jacobian...:    65471
Number of nonzeros in inequality constraint Jacobian.:    13976
Number of nonzeros in Lagrangian Hessian.............:   314291

Total number of variables............................:     8718
                     variables with only lower bounds:        0
                variables with lower and upper bounds:     4698
                     variables with only upper bounds:        0
Total number of equality constraints.................:     8041
Total number of inequality constraints...............:     6988
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:     6988
        inequality constraints with only upper bounds:        0

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0  1.2061341e+03 1.31e+01 2.52e+01  -1.0 0.00e+00    -  0.00e+00 0.00e+00   0
   1  1.3795678e+03 1.14e+01 1.33e+01  -1.0 6.12e+00    -  1.04e-02 1.31e-01h  1
   2  1.3651384e+03 1.11e+01 1.22e+01  -1.0 1.35e+01    -  6.53e-02 2.22e-02f  1
   3  1.4170592e+03 1.03e+01 8.58e+00  -1.0 1.24e+01    -  4.36e-01 7.11e-02h  1
   4  1.8085839e+03 4.98e+00 5.47e+00  -1.0 9.05e+00    -  1.90e-01 4.87e-01h  1
   5  2.0721391e+03 2.29e+00 2.62e+00  -1.0 3.45e+00    -  5.16e-01 5.30e-01h  1
   6  2.1845834e+03 1.34e+00 1.79e+00  -1.0 4.89e+00    -  3.31e-01 4.09e-01h  1
   7  2.2408122e+03 9.41e-01 1.67e+00  -1.0 2.76e+00    -  1.48e-01 2.98e-01h  1
   8  2.2606240e+03 8.02e-01 1.18e+00  -1.0 1.90e+00    -  4.36e-01 1.48e-01h  1
   9  2.2878726e+03 6.16e-01 1.06e+00  -1.0 1.50e+00    -  3.65e-01 2.32e-01h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  10  2.3122630e+03 4.42e-01 7.08e-01  -1.0 1.09e+00    -  1.50e-01 2.82e-01h  1
  11  2.3328322e+03 2.91e-01 6.89e-01  -1.7 1.22e+00    -  2.85e-01 3.42e-01h  1
  12  2.3392720e+03 2.53e-01 4.92e-01  -1.7 2.49e+00    -  1.72e-01 1.29e-01h  1
  13  2.3434938e+03 2.28e-01 3.69e-01  -1.7 1.38e+00    -  1.90e-01 1.01e-01h  1
  14  2.3477968e+03 2.02e-01 3.51e-01  -1.7 1.07e+00    -  1.18e-01 1.12e-01h  1
  15  2.3502357e+03 1.86e-01 6.20e+00  -1.7 9.47e-01    -  7.57e-01 8.01e-02h  1
  16  2.3702492e+03 1.05e-01 1.09e+00  -1.7 1.97e+00    -  1.08e-02 4.49e-01h  1
  17  2.3784950e+03 7.88e-02 8.06e-01  -1.7 1.59e+00    -  1.00e+00 2.53e-01h  1
  18  2.4020780e+03 9.54e-03 1.33e+00  -1.7 7.65e-01    -  1.30e-01 1.00e+00h  1
  19  2.4029110e+03 9.74e-05 1.30e-02  -1.7 9.84e-02    -  1.00e+00 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  20  2.3928236e+03 1.22e-02 6.46e-02  -3.8 8.91e-01    -  8.21e-01 9.62e-01f  1
  21  2.3897847e+03 1.41e-02 1.57e+00  -3.8 1.56e+00    -  7.10e-01 2.85e-01f  1
  22  2.3875809e+03 1.30e-02 4.98e+00  -3.8 1.97e+00    -  8.70e-01 2.19e-01f  1
  23  2.3852591e+03 1.43e-02 8.37e+00  -3.8 1.17e+00    -  1.00e+00 3.18e-01f  1
  24  2.3847405e+03 1.24e-02 6.89e+00  -3.8 2.72e+00    -  1.00e+00 1.55e-01f  1
  25  2.3841607e+03 9.14e-03 8.39e+00  -3.8 2.76e+00    -  5.17e-01 3.20e-01f  1
  26  2.3838886e+03 6.33e-03 1.35e+01  -3.8 2.34e+00    -  5.83e-01 3.34e-01h  1
  27  2.3838154e+03 4.33e-03 1.17e+01  -3.8 1.99e+00    -  5.73e-01 3.32e-01h  1
  28  2.3837640e+03 2.58e-03 9.41e+00  -3.8 1.00e+00    -  9.75e-01 4.24e-01h  1
  29  2.3837400e+03 7.95e-04 2.74e+00  -3.8 6.09e-01    -  7.86e-01 7.07e-01h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  30  2.3837407e+03 5.22e-05 2.00e-04  -3.8 1.71e-01    -  1.00e+00 1.00e+00h  1
  31  2.3837030e+03 9.63e-05 2.18e+00  -5.7 9.49e-01    -  7.83e-01 5.35e-01f  1
  32  2.3836811e+03 3.37e-04 5.59e-01  -5.7 2.00e+00    -  6.92e-01 7.10e-01f  1
  33  2.3836736e+03 2.13e-04 2.58e-01  -5.7 1.02e+00    -  7.61e-01 9.29e-01f  1
  34  2.3836732e+03 3.40e-05 3.14e-02  -5.7 2.27e-01    -  1.00e+00 8.54e-01f  1
  35  2.3836731e+03 1.70e-05 1.66e-02  -5.7 5.13e-02    -  1.00e+00 5.00e-01f  2
  36  2.3836731e+03 2.20e-07 2.82e-07  -5.7 2.91e-02    -  1.00e+00 1.00e+00h  1
  37  2.3836725e+03 7.11e-07 1.67e-03  -8.6 8.63e-02    -  7.90e-01 7.81e-01f  1
  38  2.3836723e+03 1.59e-06 3.15e-03  -8.6 2.05e-01    -  8.92e-01 9.72e-01f  1
  39  2.3836723e+03 2.43e-08 6.03e-08  -8.6 5.45e-03    -  1.00e+00 1.00e+00f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  40  2.3836723e+03 4.49e-10 1.03e-08  -8.6 1.32e-01    -  1.00e+00 1.00e+00h  1
  41  2.3836723e+03 2.74e-11 6.32e-10  -9.0 6.90e-03    -  1.00e+00 1.00e+00h  1

Number of Iterations....: 41

                                   (scaled)                 (unscaled)
Objective...............:   2.3836722884186038e+03    2.3836722884186038e+03
Dual infeasibility......:   6.3247362678235533e-10    6.3247362678235533e-10
Constraint violation....:   2.7384317036194261e-11    2.7384317036194261e-11
Variable bound violation:   1.2994724585269068e-07    1.2994724585269068e-07
Complementarity.........:   1.2578999124635368e-09    1.2578999124635368e-09
Overall NLP error.......:   1.2578999124635368e-09    1.2578999124635368e-09


Number of objective function evaluations             = 43
Number of objective gradient evaluations             = 42
Number of equality constraint evaluations            = 43
Number of inequality constraint evaluations          = 43
Number of equality constraint Jacobian evaluations   = 42
Number of inequality constraint Jacobian evaluations = 42
Number of Lagrangian Hessian evaluations             = 41
Total seconds in IPOPT                               = 9.758

EXIT: Optimal Solution Found.
 10.555810 seconds (10.55 M allocations: 669.945 MiB, 2.58% gc time)

julia> @time optimize!(model; _differentiation_backend = MathOptSymbolicAD.DefaultBackend())
This is Ipopt version 3.14.4, running with linear solver MUMPS 5.4.1.

Number of nonzeros in equality constraint Jacobian...:    65471
Number of nonzeros in inequality constraint Jacobian.:    13976
Number of nonzeros in Lagrangian Hessian.............:    36439

Total number of variables............................:     8718
                     variables with only lower bounds:        0
                variables with lower and upper bounds:     4698
                     variables with only upper bounds:        0
Total number of equality constraints.................:     8041
Total number of inequality constraints...............:     6988
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:     6988
        inequality constraints with only upper bounds:        0

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0  1.2061341e+03 1.31e+01 2.52e+01  -1.0 0.00e+00    -  0.00e+00 0.00e+00   0
   1  1.3795678e+03 1.14e+01 1.33e+01  -1.0 6.12e+00    -  1.04e-02 1.31e-01h  1
   2  1.3651384e+03 1.11e+01 1.22e+01  -1.0 1.35e+01    -  6.53e-02 2.22e-02f  1
   3  1.4170592e+03 1.03e+01 8.58e+00  -1.0 1.24e+01    -  4.36e-01 7.11e-02h  1
   4  1.8085839e+03 4.98e+00 5.47e+00  -1.0 9.05e+00    -  1.90e-01 4.87e-01h  1
   5  2.0721391e+03 2.29e+00 2.62e+00  -1.0 3.45e+00    -  5.16e-01 5.30e-01h  1
   6  2.1845834e+03 1.34e+00 1.79e+00  -1.0 4.89e+00    -  3.31e-01 4.09e-01h  1
   7  2.2408122e+03 9.41e-01 1.67e+00  -1.0 2.76e+00    -  1.48e-01 2.98e-01h  1
   8  2.2606240e+03 8.02e-01 1.18e+00  -1.0 1.90e+00    -  4.36e-01 1.48e-01h  1
   9  2.2878726e+03 6.16e-01 1.06e+00  -1.0 1.50e+00    -  3.65e-01 2.32e-01h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  10  2.3122630e+03 4.42e-01 7.08e-01  -1.0 1.09e+00    -  1.50e-01 2.82e-01h  1
  11  2.3328322e+03 2.91e-01 6.89e-01  -1.7 1.22e+00    -  2.85e-01 3.42e-01h  1
  12  2.3392720e+03 2.53e-01 4.92e-01  -1.7 2.49e+00    -  1.72e-01 1.29e-01h  1
  13  2.3434938e+03 2.28e-01 3.69e-01  -1.7 1.38e+00    -  1.90e-01 1.01e-01h  1
  14  2.3477968e+03 2.02e-01 3.51e-01  -1.7 1.07e+00    -  1.18e-01 1.12e-01h  1
  15  2.3502357e+03 1.86e-01 6.20e+00  -1.7 9.47e-01    -  7.57e-01 8.01e-02h  1
  16  2.3702492e+03 1.05e-01 1.09e+00  -1.7 1.97e+00    -  1.08e-02 4.49e-01h  1
  17  2.3784950e+03 7.88e-02 8.06e-01  -1.7 1.59e+00    -  1.00e+00 2.53e-01h  1
  18  2.4020780e+03 9.54e-03 1.33e+00  -1.7 7.65e-01    -  1.30e-01 1.00e+00h  1
  19  2.4029110e+03 9.74e-05 1.30e-02  -1.7 9.84e-02    -  1.00e+00 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  20  2.3928236e+03 1.22e-02 6.46e-02  -3.8 8.91e-01    -  8.21e-01 9.62e-01f  1
  21  2.3897847e+03 1.41e-02 1.57e+00  -3.8 1.56e+00    -  7.10e-01 2.85e-01f  1
  22  2.3875809e+03 1.30e-02 4.98e+00  -3.8 1.97e+00    -  8.70e-01 2.19e-01f  1
  23  2.3852591e+03 1.43e-02 8.37e+00  -3.8 1.17e+00    -  1.00e+00 3.18e-01f  1
  24  2.3847405e+03 1.24e-02 6.89e+00  -3.8 2.72e+00    -  1.00e+00 1.55e-01f  1
  25  2.3841607e+03 9.14e-03 8.39e+00  -3.8 2.76e+00    -  5.17e-01 3.20e-01f  1
  26  2.3838886e+03 6.33e-03 1.35e+01  -3.8 2.34e+00    -  5.83e-01 3.34e-01h  1
  27  2.3838154e+03 4.33e-03 1.17e+01  -3.8 1.99e+00    -  5.73e-01 3.32e-01h  1
  28  2.3837640e+03 2.58e-03 9.41e+00  -3.8 1.00e+00    -  9.75e-01 4.24e-01h  1
  29  2.3837400e+03 7.95e-04 2.74e+00  -3.8 6.09e-01    -  7.86e-01 7.07e-01h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  30  2.3837407e+03 5.22e-05 2.00e-04  -3.8 1.71e-01    -  1.00e+00 1.00e+00h  1
  31  2.3837030e+03 9.63e-05 2.18e+00  -5.7 9.49e-01    -  7.83e-01 5.35e-01f  1
  32  2.3836811e+03 3.37e-04 5.59e-01  -5.7 2.00e+00    -  6.92e-01 7.10e-01f  1
  33  2.3836736e+03 2.13e-04 2.58e-01  -5.7 1.02e+00    -  7.61e-01 9.29e-01f  1
  34  2.3836732e+03 3.40e-05 3.14e-02  -5.7 2.27e-01    -  1.00e+00 8.54e-01f  1
  35  2.3836731e+03 1.70e-05 1.66e-02  -5.7 5.13e-02    -  1.00e+00 5.00e-01f  2
  36  2.3836731e+03 2.20e-07 2.82e-07  -5.7 2.91e-02    -  1.00e+00 1.00e+00h  1
  37  2.3836725e+03 7.11e-07 1.67e-03  -8.6 8.63e-02    -  7.90e-01 7.81e-01f  1
  38  2.3836723e+03 1.59e-06 3.15e-03  -8.6 2.05e-01    -  8.92e-01 9.72e-01f  1
  39  2.3836723e+03 2.43e-08 6.03e-08  -8.6 5.45e-03    -  1.00e+00 1.00e+00f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  40  2.3836723e+03 4.49e-10 1.03e-08  -8.6 1.32e-01    -  1.00e+00 1.00e+00h  1
  41  2.3836723e+03 2.74e-11 6.33e-10  -9.0 6.90e-03    -  1.00e+00 1.00e+00h  1

Number of Iterations....: 41

                                   (scaled)                 (unscaled)
Objective...............:   2.3836722884186111e+03    2.3836722884186111e+03
Dual infeasibility......:   6.3252805544783373e-10    6.3252805544783373e-10
Constraint violation....:   2.7385524403733541e-11    2.7385524403733541e-11
Variable bound violation:   1.2994724585269068e-07    1.2994724585269068e-07
Complementarity.........:   1.2578999131652345e-09    1.2578999131652345e-09
Overall NLP error.......:   1.2578999131652345e-09    1.2578999131652345e-09


Number of objective function evaluations             = 43
Number of objective gradient evaluations             = 42
Number of equality constraint evaluations            = 43
Number of inequality constraint evaluations          = 43
Number of equality constraint Jacobian evaluations   = 42
Number of inequality constraint Jacobian evaluations = 42
Number of Lagrangian Hessian evaluations             = 41
Total seconds in IPOPT                               = 4.730

EXIT: Optimal Solution Found.
 18.420762 seconds (67.16 M allocations: 2.622 GiB, 3.35% gc time)

julia> set_optimizer(model, () -> AmplNLWriter.Optimizer(Ipopt_jll.amplexe))

julia> @time optimize!(model)
Ipopt 3.14.4: 

******************************************************************************
This program contains Ipopt, a library for large-scale nonlinear optimization.
 Ipopt is released as open source code under the Eclipse Public License (EPL).
         For more information visit https://github.com/coin-or/Ipopt
******************************************************************************

This is Ipopt version 3.14.4, running with linear solver MUMPS 5.4.1.

Number of nonzeros in equality constraint Jacobian...:    65471
Number of nonzeros in inequality constraint Jacobian.:    13976
Number of nonzeros in Lagrangian Hessian.............:    36439

Total number of variables............................:     8718
                     variables with only lower bounds:        0
                variables with lower and upper bounds:     4698
                     variables with only upper bounds:        0
Total number of equality constraints.................:     8041
Total number of inequality constraints...............:     6988
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:     6988
        inequality constraints with only upper bounds:        0

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0  1.2061341e+03 1.31e+01 2.52e+01  -1.0 0.00e+00    -  0.00e+00 0.00e+00   0
   1  1.3795678e+03 1.14e+01 1.33e+01  -1.0 6.12e+00    -  1.04e-02 1.31e-01h  1
   2  1.3651384e+03 1.11e+01 1.22e+01  -1.0 1.35e+01    -  6.53e-02 2.22e-02f  1
   3  1.4170592e+03 1.03e+01 8.58e+00  -1.0 1.24e+01    -  4.36e-01 7.11e-02h  1
   4  1.8085839e+03 4.98e+00 5.47e+00  -1.0 9.05e+00    -  1.90e-01 4.87e-01h  1
   5  2.0721391e+03 2.29e+00 2.62e+00  -1.0 3.45e+00    -  5.16e-01 5.30e-01h  1
   6  2.1845834e+03 1.34e+00 1.79e+00  -1.0 4.89e+00    -  3.31e-01 4.09e-01h  1
   7  2.2408122e+03 9.41e-01 1.67e+00  -1.0 2.76e+00    -  1.48e-01 2.98e-01h  1
   8  2.2606240e+03 8.02e-01 1.18e+00  -1.0 1.90e+00    -  4.36e-01 1.48e-01h  1
   9  2.2878726e+03 6.16e-01 1.06e+00  -1.0 1.50e+00    -  3.65e-01 2.32e-01h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  10  2.3122630e+03 4.42e-01 7.08e-01  -1.0 1.09e+00    -  1.50e-01 2.82e-01h  1
  11  2.3328322e+03 2.91e-01 6.89e-01  -1.7 1.22e+00    -  2.85e-01 3.42e-01h  1
  12  2.3392720e+03 2.53e-01 4.92e-01  -1.7 2.49e+00    -  1.72e-01 1.29e-01h  1
  13  2.3434938e+03 2.28e-01 3.69e-01  -1.7 1.38e+00    -  1.90e-01 1.01e-01h  1
  14  2.3477968e+03 2.02e-01 3.51e-01  -1.7 1.07e+00    -  1.18e-01 1.12e-01h  1
  15  2.3502357e+03 1.86e-01 6.20e+00  -1.7 9.47e-01    -  7.57e-01 8.01e-02h  1
  16  2.3702492e+03 1.05e-01 1.09e+00  -1.7 1.97e+00    -  1.08e-02 4.49e-01h  1
  17  2.3784950e+03 7.88e-02 8.06e-01  -1.7 1.59e+00    -  1.00e+00 2.53e-01h  1
  18  2.4020780e+03 9.54e-03 1.33e+00  -1.7 7.65e-01    -  1.30e-01 1.00e+00h  1
  19  2.4029110e+03 9.74e-05 1.30e-02  -1.7 9.84e-02    -  1.00e+00 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  20  2.3928236e+03 1.22e-02 6.46e-02  -3.8 8.91e-01    -  8.21e-01 9.62e-01f  1
  21  2.3897847e+03 1.41e-02 1.57e+00  -3.8 1.56e+00    -  7.10e-01 2.85e-01f  1
  22  2.3875809e+03 1.30e-02 4.98e+00  -3.8 1.97e+00    -  8.70e-01 2.19e-01f  1
  23  2.3852591e+03 1.43e-02 8.37e+00  -3.8 1.17e+00    -  1.00e+00 3.18e-01f  1
  24  2.3847405e+03 1.24e-02 6.89e+00  -3.8 2.72e+00    -  1.00e+00 1.55e-01f  1
  25  2.3841607e+03 9.14e-03 8.39e+00  -3.8 2.76e+00    -  5.17e-01 3.20e-01f  1
  26  2.3838886e+03 6.33e-03 1.35e+01  -3.8 2.34e+00    -  5.83e-01 3.34e-01h  1
  27  2.3838154e+03 4.33e-03 1.17e+01  -3.8 1.99e+00    -  5.73e-01 3.32e-01h  1
  28  2.3837640e+03 2.58e-03 9.41e+00  -3.8 1.00e+00    -  9.75e-01 4.24e-01h  1
  29  2.3837400e+03 7.95e-04 2.74e+00  -3.8 6.09e-01    -  7.86e-01 7.07e-01h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  30  2.3837407e+03 5.22e-05 2.00e-04  -3.8 1.71e-01    -  1.00e+00 1.00e+00h  1
  31  2.3837030e+03 9.63e-05 2.18e+00  -5.7 9.49e-01    -  7.83e-01 5.35e-01f  1
  32  2.3836811e+03 3.37e-04 5.59e-01  -5.7 2.00e+00    -  6.92e-01 7.10e-01f  1
  33  2.3836736e+03 2.13e-04 2.58e-01  -5.7 1.02e+00    -  7.61e-01 9.29e-01f  1
  34  2.3836732e+03 3.40e-05 3.14e-02  -5.7 2.27e-01    -  1.00e+00 8.54e-01f  1
  35  2.3836731e+03 1.70e-05 1.66e-02  -5.7 5.13e-02    -  1.00e+00 5.00e-01f  2
  36  2.3836731e+03 2.20e-07 2.82e-07  -5.7 2.91e-02    -  1.00e+00 1.00e+00h  1
  37  2.3836725e+03 7.11e-07 1.67e-03  -8.6 8.63e-02    -  7.90e-01 7.81e-01f  1
  38  2.3836723e+03 1.59e-06 3.15e-03  -8.6 2.05e-01    -  8.92e-01 9.72e-01f  1
  39  2.3836723e+03 2.43e-08 6.03e-08  -8.6 5.45e-03    -  1.00e+00 1.00e+00f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  40  2.3836723e+03 4.49e-10 1.03e-08  -8.6 1.32e-01    -  1.00e+00 1.00e+00h  1
  41  2.3836723e+03 2.74e-11 6.32e-10  -9.0 6.90e-03    -  1.00e+00 1.00e+00h  1

Number of Iterations....: 41

                                   (scaled)                 (unscaled)
Objective...............:   2.3836722884185924e+03    2.3836722884185924e+03
Dual infeasibility......:   6.3249250062102252e-10    6.3249250062102252e-10
Constraint violation....:   2.7393740054115767e-11    2.7393740054115767e-11
Variable bound violation:   1.2994724585269068e-07    1.2994724585269068e-07
Complementarity.........:   1.2578999130247670e-09    1.2578999130247670e-09
Overall NLP error.......:   1.2578999130247670e-09    1.2578999130247670e-09


Number of objective function evaluations             = 43
Number of objective gradient evaluations             = 42
Number of equality constraint evaluations            = 43
Number of inequality constraint evaluations          = 43
Number of equality constraint Jacobian evaluations   = 42
Number of inequality constraint Jacobian evaluations = 42
Number of Lagrangian Hessian evaluations             = 41
Total seconds in IPOPT                               = 5.219

EXIT: Optimal Solution Found.
 10.613051 seconds (14.07 M allocations: 896.936 MiB, 2.69% gc time, 1.43% compilation time)

from ipopt.jl.

marco83pt avatar marco83pt commented on July 18, 2024

Hi Oscar,
Thanks a lot for your description. Unfortunately, I cannot share the JuMP script, but I can give you an overall description of the problem. It is an energy application (AKA optimal power flow) where there are two sets of variables, complex generation from one side and complex voltages from the other side. Each variable has an upper and a lower bound. The relationship between variables is driven by the power balance for each node (or bus). Power balance is a sparse set of non-linear equality constraints. The shape is the product of voltages and trigonometric functions (because they are complex numbers) equal to power injection for each bus. That's all.
What are the other options that I could test for the "_differentiation_backend"?

Best Regards,
Marco

from ipopt.jl.

odow avatar odow commented on July 18, 2024

Unfortunately, I cannot share the JuMP script

  • Are you using @constraint for linear and quadratic constraints?
  • Are you using @variable(model, lower <= x <= upper) for variable bounds?
  • Are you using @NLexpression at all?

It's hard to offer advice without the JuMP script. Can you remove any confidential data and share a minimal reproducible example?

What are the other options that I could test for the "_differentiation_backend"?

That' mostly it, at present. The idea is that someone could write a specialized AD system for their model class and easily integrate it, but I've only written the symbolic AD as a proof of concept.

from ipopt.jl.

marco83pt avatar marco83pt commented on July 18, 2024

Hi Oscar,
here I summary of what has been done at the modelling level:
Example of variable:

@variable(m, vmin[b+1] <= vmag[b=0:nbus-1] <= vmax[b+1], start = 1.)
@variable(m, pmim[g+1] <= genp[g=0:ngen-1] <= pmax[g+1], start = 0.)

Example of non-linear constraint:

# Active Power Balance Constraints
@NLconstraint(m, pbal[b=0:nbus-1], -vmag[b] * sum(vmag[j] * (yr[b+1][ij] * cos(vang[b]-vang[j]) + yi[b+1][ij] * sin(vang[b]-vang[j])) for (ij, j) in enumerate(yidx[b+1])) - vmag[b]^2 * ydr[b+1] + sum(genp[g] for g in gmap[b+1]) == demp[b+1])

The objective function is has only linear and quadratic terms, then I used

@objective(m, Min, ...)

That's all.

BR/
Marco

from ipopt.jl.

odow avatar odow commented on July 18, 2024

Ah okay. I think this is just a bad case for JuMP's reverse AD, because there are many constraints which are quite dense. We compute the Hessian constraint-by-constraint, and so if you have the same variable pairs appearing in multiple constraints then they will appear as two non-zeros, instead of being collated into a single entry.

Have you tried using the formulations in https://github.com/lanl-ansi/PowerModels.jl?

from ipopt.jl.

marco83pt avatar marco83pt commented on July 18, 2024

Hi Oscar,
Thanks a lot for your feedback. Related to the problem modelling, this is not dense because for significant instances, the nnz are <1% compared to the matrix size. However, based on your sentences: "if you have the same variable pairs appearing in multiple constraints, then they will appear as two non-zeros" I will switch to AmplNLWriter.Optimizer(Ipopt_jll.amplexe) definitively.
Then, using this way to communicate to IPOPT, is it possible to initialize (warm start) the solution properly (i.e., passing x0 and also dual and Lagrange multiplier)?

BR/
Marco

from ipopt.jl.

odow avatar odow commented on July 18, 2024

Related to the problem modelling, this is not dense because for significant instances, the nnz are <1% compared to the matrix size

I guess "quite" is relative. Dense enough to cause an issue for the AD system.

. is it possible to initialize (warm start) the solution properly

You can use variable primal starts with the NL interface, but not the dual Lagrange multipliers.

from ipopt.jl.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.