Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Convert optimization.jl to sparse #19

Merged
merged 3 commits into from
Jun 17, 2022
Merged

Conversation

odow
Copy link
Collaborator

@odow odow commented Jun 13, 2022

Okay, this at least constructs the sparse hessian. But it generates an invalid number:

(base) oscar@Oscars-MBP rosetta-opf % ~/julia-1.7 --project=. optimization.jl
[info | PowerModels]: extending matpower format with data: areas 1x3
[info | PowerModels]: removing 1 cost terms from generator 4: [4000.0, 0.0]
[info | PowerModels]: removing 1 cost terms from generator 1: [1400.0, 0.0]
[info | PowerModels]: removing 1 cost terms from generator 5: [1000.0, 0.0]
[info | PowerModels]: removing 1 cost terms from generator 2: [1500.0, 0.0]
[info | PowerModels]: removing 1 cost terms from generator 3: [3000.0, 0.0]
[info | PowerModels]: updated generator 4 cost function with order 2 to a function of order 3: [0.0, 4000.0, 0.0]
[info | PowerModels]: updated generator 1 cost function with order 2 to a function of order 3: [0.0, 1400.0, 0.0]
[info | PowerModels]: updated generator 5 cost function with order 2 to a function of order 3: [0.0, 1000.0, 0.0]
[info | PowerModels]: updated generator 2 cost function with order 2 to a function of order 3: [0.0, 1500.0, 0.0]
[info | PowerModels]: updated generator 3 cost function with order 2 to a function of order 3: [0.0, 3000.0, 0.0]
variables: 44, 44, 44
constraints: 53, 53, 53

******************************************************************************
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...:      155
Number of nonzeros in inequality constraint Jacobian.:       36
Number of nonzeros in Lagrangian Hessian.............:      384

Total number of variables............................:       44
                     variables with only lower bounds:        0
                variables with lower and upper bounds:       39
                     variables with only upper bounds:        0
Total number of equality constraints.................:       35
Total number of inequality constraints...............:       18
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:        6
        inequality constraints with only upper bounds:       12

The Lagrangian Hessian contains an invalid number

Number of Iterations....: 0

Number of objective function evaluations             = 1
Number of objective gradient evaluations             = 1
Number of equality constraint evaluations            = 1
Number of inequality constraint evaluations          = 1
Number of equality constraint Jacobian evaluations   = 1
Number of inequality constraint Jacobian evaluations = 1
Number of Lagrangian Hessian evaluations             = 1
Total seconds in IPOPT                               = 0.904

EXIT: Invalid number in NLP function or derivative detected.

Summary
   case........: /Users/oscar/Documents/lanl-ansi/rosetta-opf/data/pglib_opf_case5_pjm.m
   variables...: 44
   constraints.: 53
   feasible....: false
   cost........: 0
   total time..: 58.56174921989441
     data time.: 10.110069036483765
     build time: 4.441245079040527
     solve time: 44.0104341506958

@ccoffrin
Copy link
Member

Thanks @odow. My philosophy is correctness first, performance second. So I would like to keep this in a branch until it can match the level of correctness of the version that is currently on master.

@odow odow changed the title Convert optimization.jl to sparse WIP: Convert optimization.jl to sparse Jun 13, 2022
@odow
Copy link
Collaborator Author

odow commented Jun 13, 2022

My philosophy is correctness first, performance second

Ah. I forgot to add "WIP:" to the title. I'm digging into the correctness issue

@odow
Copy link
Collaborator Author

odow commented Jun 13, 2022

Working with my PR: SciML/Optimization.jl#284

(base) oscar@Oscars-MBP rosetta-opf % ~/julia-1.7 --project=. optimization.jl
[info | PowerModels]: extending matpower format with data: areas 1x3
[info | PowerModels]: removing 1 cost terms from generator 4: [4000.0, 0.0]
[info | PowerModels]: removing 1 cost terms from generator 1: [1400.0, 0.0]
[info | PowerModels]: removing 1 cost terms from generator 5: [1000.0, 0.0]
[info | PowerModels]: removing 1 cost terms from generator 2: [1500.0, 0.0]
[info | PowerModels]: removing 1 cost terms from generator 3: [3000.0, 0.0]
[info | PowerModels]: updated generator 4 cost function with order 2 to a function of order 3: [0.0, 4000.0, 0.0]
[info | PowerModels]: updated generator 1 cost function with order 2 to a function of order 3: [0.0, 1400.0, 0.0]
[info | PowerModels]: updated generator 5 cost function with order 2 to a function of order 3: [0.0, 1000.0, 0.0]
[info | PowerModels]: updated generator 2 cost function with order 2 to a function of order 3: [0.0, 1500.0, 0.0]
[info | PowerModels]: updated generator 3 cost function with order 2 to a function of order 3: [0.0, 3000.0, 0.0]
variables: 44, 44, 44
constraints: 53, 53, 53

******************************************************************************
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...:      155
Number of nonzeros in inequality constraint Jacobian.:       36
Number of nonzeros in Lagrangian Hessian.............:      240

Total number of variables............................:       44
                     variables with only lower bounds:        0
                variables with lower and upper bounds:       39
                     variables with only upper bounds:        0
Total number of equality constraints.................:       35
Total number of inequality constraints...............:       18
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:        6
        inequality constraints with only upper bounds:       12

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0  1.0059989e+02 3.99e+00 2.88e+01  -1.0 0.00e+00    -  0.00e+00 0.00e+00   0
   1  8.3066346e+03 2.47e+00 1.01e+02  -1.0 2.78e+00    -  4.11e-03 3.82e-01h  1
   2  6.7182484e+03 2.36e+00 9.62e+01  -1.0 1.60e+01    -  7.37e-02 4.44e-02f  1
   3  6.6691211e+03 2.30e+00 9.34e+01  -1.0 1.30e+01    -  4.95e-01 2.40e-02f  1
   4  6.5744238e+03 2.04e+00 8.25e+01  -1.0 1.29e+01    -  3.67e-01 1.12e-01f  2
   5  6.8265929e+03 1.80e+00 7.10e+01  -1.0 1.23e+01    -  8.72e-01 1.20e-01h  2
   6  8.8541540e+03 1.08e+00 4.20e+01  -1.0 9.14e+00    -  5.92e-01 4.00e-01h  1
   7  1.0572759e+04 8.62e-01 3.58e+01  -1.0 2.94e+00    -  4.94e-01 2.00e-01h  1
   8  1.7308372e+04 3.63e-02 1.47e+01  -1.0 2.41e+00    -  7.66e-01 9.58e-01h  1
   9  1.7572883e+04 1.33e-02 1.10e+00  -1.0 2.11e+00    -  1.00e+00 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  10  1.7590632e+04 1.69e-03 1.61e-01  -1.0 5.03e-01    -  1.00e+00 1.00e+00h  1
  11  1.7558725e+04 5.24e-03 5.03e-01  -2.5 6.03e-01    -  8.35e-01 9.36e-01f  1
  12  1.7553111e+04 3.34e-03 4.11e+00  -2.5 2.84e-01    -  1.00e+00 8.20e-01h  1
  13  1.7552956e+04 3.24e-05 1.26e-02  -2.5 6.35e-02    -  1.00e+00 1.00e+00h  1
  14  1.7551990e+04 1.35e-05 1.09e+00  -3.8 2.53e-02    -  1.00e+00 9.25e-01h  1
  15  1.7551938e+04 4.46e-08 1.23e-02  -3.8 7.00e-03    -  1.00e+00 1.00e+00f  1
  16  1.7551940e+04 2.35e-10 2.06e-04  -3.8 3.84e-04    -  1.00e+00 1.00e+00h  1
  17  1.7551892e+04 1.75e-07 2.11e-01  -5.7 2.49e-03    -  1.00e+00 9.68e-01f  1
  18  1.7551891e+04 6.82e-11 3.10e-05  -5.7 2.38e-04    -  1.00e+00 1.00e+00f  1
  19  1.7551891e+04 1.59e-14 6.53e-10  -5.7 5.20e-07    -  1.00e+00 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  20  1.7551891e+04 6.34e-12 3.03e-07  -8.6 3.52e-05    -  1.00e+00 1.00e+00f  1
  21  1.7551891e+04 2.84e-14 2.27e-12  -8.6 3.34e-08    -  1.00e+00 1.00e+00h  1

Number of Iterations....: 21

                                   (scaled)                 (unscaled)
Objective...............:   4.3879727096486914e+02    1.7551890838594765e+04
Dual infeasibility......:   2.2670978373976439e-12    9.0683913495905758e-11
Constraint violation....:   1.8371792975813150e-14    2.8421709430404007e-14
Variable bound violation:   2.9463905093507492e-08    2.9463905093507492e-08
Complementarity.........:   2.5059076302146477e-09    1.0023630520858591e-07
Overall NLP error.......:   2.5059076302146477e-09    1.0023630520858591e-07


Number of objective function evaluations             = 28
Number of objective gradient evaluations             = 22
Number of equality constraint evaluations            = 28
Number of inequality constraint evaluations          = 28
Number of equality constraint Jacobian evaluations   = 22
Number of inequality constraint Jacobian evaluations = 22
Number of Lagrangian Hessian evaluations             = 21
Total seconds in IPOPT                               = 1.868

EXIT: Optimal Solution Found.

Summary
   case........: /Users/oscar/Documents/lanl-ansi/rosetta-opf/data/pglib_opf_case5_pjm.m
   variables...: 44
   constraints.: 53
   feasible....: true
   cost........: 17552
   total time..: 58.78733706474304
     data time.: 10.700264930725098
     build time: 4.490694999694824
     solve time: 43.596376180648804

@Vaibhavdixit02
Copy link
Contributor

@odow this last result is with sparsity enabled right?

@odow
Copy link
Collaborator Author

odow commented Jun 13, 2022

this last result is with sparsity enabled right?

Yes. (true, true). You can tell because the dense hessian has a minimum of 990 non-zeros, and yet:

Number of nonzeros in Lagrangian Hessian.............: 240

@Vaibhavdixit02
Copy link
Contributor

Did you dig into the timing comparisons? I ran a few experiments and concluded this -

Looks like there's a bit more compilation latency with AutoModelingToolkit(true, true) but on second runs it is ~20x AutoForwardDiff. I would think if we have a larger dataset we should be able to clearly see the speedup on first runs as well, in which AutoForwardDiff marginally (~1.6x) outperforms in this case.

@ccoffrin
Copy link
Member

ccoffrin commented Jun 13, 2022

I wouldn't pay too much attention to the timing at this time. This is best left for the more comprehensive experiments I run on all of the OPF problem instances. In general, we expect that ForwardDiff will be hard to beat on small dense problems. The benefits for sparsity usually only show up as the problem size increases.

@ccoffrin
Copy link
Member

@odow, could you have a look at this test on this branch,

include("optimization.jl"); solve_opf("data/pglib_opf_case118_ieee.m")

It seems to be working for building the oracles, but during the Ipopt run I get,

variables: 1088, 1088, 1088
constraints: 1539, 1539, 1539

******************************************************************************
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...:     4552
Number of nonzeros in inequality constraint Jacobian.:     1116
Number of nonzeros in Lagrangian Hessian.............:     7436

Total number of variables............................:     1053
                     variables with only lower bounds:        0
                variables with lower and upper bounds:      935
                     variables with only upper bounds:        0
Total number of equality constraints.................:      981
Total number of inequality constraints...............:      558
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:      186
        inequality constraints with only upper bounds:      372

signal (11): Segmentation fault: 11
in expression starting at REPL[1]:1
jl_gc_pool_alloc at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
...

@odow
Copy link
Collaborator Author

odow commented Jun 13, 2022

Can reproduce.

Full trace is

signal (11): Segmentation fault: 11
in expression starting at REPL[1]:1
jl_gc_pool_alloc at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_gc_alloc at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
_new_array_ at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
_new_array at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_alloc_array_1d at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
Array at ./boot.jl:457 [inlined]
Array at ./boot.jl:466 [inlined]
fill at ./array.jl:473 [inlined]
fill at ./array.jl:471 [inlined]
InstructionStream at ./compiler/ssair/ir.jl:195
NewNodeStream at ./compiler/ssair/ir.jl:269 [inlined]
NewNodeStream at ./compiler/ssair/ir.jl:269 [inlined]
IncrementalCompact at ./compiler/ssair/ir.jl:636
ir_inline_item! at ./compiler/ssair/inlining.jl:367
batch_inline! at ./compiler/ssair/inlining.jl:594
ssa_inlining_pass! at ./compiler/ssair/inlining.jl:83
jfptr_ssa_inlining_passNOT._14954.clone_1 at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
run_passes at ./compiler/optimize.jl:307
optimize at ./compiler/optimize.jl:296 [inlined]
_typeinf at ./compiler/typeinfer.jl:255
typeinf at ./compiler/typeinfer.jl:209
typeinf_edge at ./compiler/typeinfer.jl:823 [inlined]
abstract_call_method at ./compiler/abstractinterpretation.jl:504
abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:105
abstract_call_known at ./compiler/abstractinterpretation.jl:1342
abstract_call at ./compiler/abstractinterpretation.jl:1397
abstract_apply at ./compiler/abstractinterpretation.jl:987
abstract_call_known at ./compiler/abstractinterpretation.jl:1249
abstract_call at ./compiler/abstractinterpretation.jl:1397
abstract_call at ./compiler/abstractinterpretation.jl:1382
abstract_eval_statement at ./compiler/abstractinterpretation.jl:1534
typeinf_local at ./compiler/abstractinterpretation.jl:1918
typeinf_nocycle at ./compiler/abstractinterpretation.jl:2014
_typeinf at ./compiler/typeinfer.jl:226
typeinf at ./compiler/typeinfer.jl:209
typeinf_edge at ./compiler/typeinfer.jl:823 [inlined]
abstract_call_method at ./compiler/abstractinterpretation.jl:504
abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:105
abstract_call_known at ./compiler/abstractinterpretation.jl:1342
abstract_call at ./compiler/abstractinterpretation.jl:1397
abstract_call at ./compiler/abstractinterpretation.jl:1382
abstract_eval_statement at ./compiler/abstractinterpretation.jl:1534
typeinf_local at ./compiler/abstractinterpretation.jl:1918
typeinf_nocycle at ./compiler/abstractinterpretation.jl:2014
_typeinf at ./compiler/typeinfer.jl:226
typeinf at ./compiler/typeinfer.jl:209
typeinf_ext at ./compiler/typeinfer.jl:909
typeinf_ext_toplevel at ./compiler/typeinfer.jl:942
typeinf_ext_toplevel at ./compiler/typeinfer.jl:938
jfptr_typeinf_ext_toplevel_9610.clone_1 at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_type_infer at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_generate_fptr at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_compile_method_internal at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_invoke at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
unknown function (ip: 0x17c0cd6b9)
unknown function (ip: 0x17c0cd3f1)
RuntimeGeneratedFunction at /Users/oscar/.julia/packages/RuntimeGeneratedFunctions/KrkGo/src/RuntimeGeneratedFunctions.jl:117 [inlined]
macro expansion at /Users/oscar/.julia/packages/Symbolics/NLMWJ/src/build_function.jl:335 [inlined]
macro expansion at /Users/oscar/.julia/packages/SymbolicUtils/9IZDP/src/code.jl:351 [inlined]
macro expansion at /Users/oscar/.julia/packages/RuntimeGeneratedFunctions/KrkGo/src/RuntimeGeneratedFunctions.jl:129 [inlined]
macro expansion at ./none:0 [inlined]
generated_callfunc at ./none:0
unknown function (ip: 0x17c0cd201)
unknown function (ip: 0x17c069799)
unknown function (ip: 0x17c0694d1)
RuntimeGeneratedFunction at /Users/oscar/.julia/packages/RuntimeGeneratedFunctions/KrkGo/src/RuntimeGeneratedFunctions.jl:117 [inlined]
macro expansion at /Users/oscar/.julia/packages/Symbolics/NLMWJ/src/build_function.jl:335 [inlined]
macro expansion at /Users/oscar/.julia/packages/SymbolicUtils/9IZDP/src/code.jl:351 [inlined]
macro expansion at /Users/oscar/.julia/packages/RuntimeGeneratedFunctions/KrkGo/src/RuntimeGeneratedFunctions.jl:129 [inlined]
macro expansion at ./none:0 [inlined]
generated_callfunc at ./none:0
unknown function (ip: 0x17c0692e1)
unknown function (ip: 0x17c0691b9)
unknown function (ip: 0x17c069151)
RuntimeGeneratedFunction at /Users/oscar/.julia/packages/RuntimeGeneratedFunctions/KrkGo/src/RuntimeGeneratedFunctions.jl:117 [inlined]
#100 at /Users/oscar/.julia/packages/Optimization/C5BBJ/src/function/mtk.jl:57
unknown function (ip: 0x17c069079)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
eval_hessian_lagrangian at /Users/oscar/.julia/packages/OptimizationMOI/2Ifbm/src/OptimizationMOI.jl:159
unknown function (ip: 0x17c068d42)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
_eval_hessian_lagrangian at /Users/oscar/.julia/packages/Ipopt/M2QE8/src/MOI_wrapper.jl:1038
eval_h_cb at /Users/oscar/.julia/packages/Ipopt/M2QE8/src/MOI_wrapper.jl:1108
unknown function (ip: 0x17c06762d)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
_Eval_H_CB at /Users/oscar/.julia/packages/Ipopt/M2QE8/src/C_wrapper.jl:122
unknown function (ip: 0x173c5a021)
_ZN5Ipopt16StdInterfaceTNLP6eval_hEiPKdbdiS2_biPiS3_Pd at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt11TNLPAdapter6Eval_hERKNS_6VectorEdS3_S3_RNS_9SymMatrixE at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt12OrigIpoptNLP1hERKNS_6VectorEdS3_S3_ at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt25IpoptCalculatedQuantities18curr_exact_hessianEv at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt19ExactHessianUpdater13UpdateHessianEv at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt14IpoptAlgorithm8OptimizeEb at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt16IpoptApplication13call_optimizeEv at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt16IpoptApplication11OptimizeNLPERKNS_8SmartPtrINS_3NLPEEERNS1_INS_16AlgorithmBuilderEEE at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt16IpoptApplication11OptimizeNLPERKNS_8SmartPtrINS_3NLPEEE at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt16IpoptApplication12OptimizeTNLPERKNS_8SmartPtrINS_4TNLPEEE at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
IpoptSolve at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
IpoptSolve at /Users/oscar/.julia/packages/Ipopt/M2QE8/src/C_wrapper.jl:433
optimize! at /Users/oscar/.julia/packages/Ipopt/M2QE8/src/MOI_wrapper.jl:1225
#__solve#20 at /Users/oscar/.julia/packages/OptimizationMOI/2Ifbm/src/OptimizationMOI.jl:276
__solve at /Users/oscar/.julia/packages/OptimizationMOI/2Ifbm/src/OptimizationMOI.jl:224 [inlined]
#solve#492 at /Users/oscar/.julia/packages/SciMLBase/UEAKN/src/solve.jl:56 [inlined]
solve at /Users/oscar/.julia/packages/SciMLBase/UEAKN/src/solve.jl:56
unknown function (ip: 0x173c5f68d)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
solve_opf at /Users/oscar/Documents/lanl-ansi/rosetta-opf/optimization.jl:340
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
do_call at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
eval_body at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_interpret_toplevel_thunk at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_toplevel_eval_flex at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_toplevel_eval_flex at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_toplevel_eval_flex at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_toplevel_eval_in at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
eval at ./boot.jl:373 [inlined]
eval_user_input at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:150
repl_backend_loop at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:246
start_repl_backend at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:231
#run_repl#47 at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:364
run_repl at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:351
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
#930 at ./client.jl:394
jfptr_YY.930_24448.clone_1 at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_f__call_latest at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
#invokelatest#2 at ./essentials.jl:716 [inlined]
invokelatest at ./essentials.jl:714 [inlined]
run_main_repl at ./client.jl:379
exec_options at ./client.jl:309
_start at ./client.jl:495
jfptr__start_24435.clone_1 at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
true_main at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_repl_entrypoint at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
Allocations: 332872519 (Pool: 332773123; Big: 99396); GC: 137
zsh: segmentation fault  ~/julia-1.7 --project=.

@odow
Copy link
Collaborator Author

odow commented Jun 13, 2022

Okay, digging in, I think this is a problem with problem-size issue with RuntimeGeneratedFunctions.

Things work okay for pglib_opf_case73_ieee_rts.m, but they break with pglib_opf_case89_pegase.m.

This one is the slightly different:

signal (11): Segmentation fault: 11
in expression starting at REPL[12]:1
jl_gc_pool_alloc at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_gc_alloc at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
_new_array_ at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
_new_array at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_alloc_array_1d at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
Array at ./boot.jl:457 [inlined]
Array at ./boot.jl:466 [inlined]
zeros at ./array.jl:525 [inlined]
zeros at ./array.jl:521 [inlined]
BitSet at ./bitset.jl:18 [inlined]
basic_blocks_starts at ./compiler/ssair/ir.jl:37
compute_basic_blocks at ./compiler/ssair/ir.jl:83
inflate_ir at ./compiler/ssair/legacy.jl:15
inflate_ir at ./compiler/ssair/legacy.jl:10
InliningTodo at ./compiler/ssair/inlining.jl:864
jfptr_InliningTodo_7832.clone_1 at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
resolve_todo at ./compiler/ssair/inlining.jl:795
maybe_handle_const_call! at ./compiler/ssair/inlining.jl:1305
assemble_inline_todo! at ./compiler/ssair/inlining.jl:1389
ssa_inlining_pass! at ./compiler/ssair/inlining.jl:80
jfptr_ssa_inlining_passNOT._14954.clone_1 at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
run_passes at ./compiler/optimize.jl:307
optimize at ./compiler/optimize.jl:296 [inlined]
_typeinf at ./compiler/typeinfer.jl:255
typeinf at ./compiler/typeinfer.jl:209
typeinf_edge at ./compiler/typeinfer.jl:823 [inlined]
abstract_call_method at ./compiler/abstractinterpretation.jl:504
abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:105
abstract_call_known at ./compiler/abstractinterpretation.jl:1342
abstract_call at ./compiler/abstractinterpretation.jl:1397
abstract_apply at ./compiler/abstractinterpretation.jl:987
abstract_call_known at ./compiler/abstractinterpretation.jl:1249
abstract_call at ./compiler/abstractinterpretation.jl:1397
abstract_call at ./compiler/abstractinterpretation.jl:1382
abstract_eval_statement at ./compiler/abstractinterpretation.jl:1534
typeinf_local at ./compiler/abstractinterpretation.jl:1918
typeinf_nocycle at ./compiler/abstractinterpretation.jl:2014
_typeinf at ./compiler/typeinfer.jl:226
typeinf at ./compiler/typeinfer.jl:209
typeinf_edge at ./compiler/typeinfer.jl:823 [inlined]
abstract_call_method at ./compiler/abstractinterpretation.jl:504
abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:105
abstract_call_known at ./compiler/abstractinterpretation.jl:1342
abstract_call at ./compiler/abstractinterpretation.jl:1397
abstract_call at ./compiler/abstractinterpretation.jl:1382
abstract_eval_statement at ./compiler/abstractinterpretation.jl:1534
typeinf_local at ./compiler/abstractinterpretation.jl:1918
typeinf_nocycle at ./compiler/abstractinterpretation.jl:2014
_typeinf at ./compiler/typeinfer.jl:226
typeinf at ./compiler/typeinfer.jl:209
typeinf_ext at ./compiler/typeinfer.jl:909
typeinf_ext_toplevel at ./compiler/typeinfer.jl:942
typeinf_ext_toplevel at ./compiler/typeinfer.jl:938
jfptr_typeinf_ext_toplevel_9610.clone_1 at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_type_infer at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_generate_fptr at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_compile_method_internal at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_invoke at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
unknown function (ip: 0x1b5c2f5e9)
unknown function (ip: 0x1b5c2f1f1)
RuntimeGeneratedFunction at /Users/oscar/.julia/packages/RuntimeGeneratedFunctions/KrkGo/src/RuntimeGeneratedFunctions.jl:117 [inlined]
macro expansion at /Users/oscar/.julia/packages/Symbolics/NLMWJ/src/build_function.jl:335 [inlined]
macro expansion at /Users/oscar/.julia/packages/SymbolicUtils/9IZDP/src/code.jl:351 [inlined]
macro expansion at /Users/oscar/.julia/packages/RuntimeGeneratedFunctions/KrkGo/src/RuntimeGeneratedFunctions.jl:129 [inlined]
macro expansion at ./none:0 [inlined]
generated_callfunc at ./none:0
unknown function (ip: 0x1b5c2f111)
unknown function (ip: 0x10a6f86c9)
unknown function (ip: 0x10a6f8401)
RuntimeGeneratedFunction at /Users/oscar/.julia/packages/RuntimeGeneratedFunctions/KrkGo/src/RuntimeGeneratedFunctions.jl:117 [inlined]
macro expansion at /Users/oscar/.julia/packages/Symbolics/NLMWJ/src/build_function.jl:335 [inlined]
macro expansion at /Users/oscar/.julia/packages/SymbolicUtils/9IZDP/src/code.jl:351 [inlined]
macro expansion at /Users/oscar/.julia/packages/RuntimeGeneratedFunctions/KrkGo/src/RuntimeGeneratedFunctions.jl:129 [inlined]
macro expansion at ./none:0 [inlined]
generated_callfunc at ./none:0
unknown function (ip: 0x10a6f8211)
unknown function (ip: 0x10a6f80e9)
unknown function (ip: 0x10a6f8081)
RuntimeGeneratedFunction at /Users/oscar/.julia/packages/RuntimeGeneratedFunctions/KrkGo/src/RuntimeGeneratedFunctions.jl:117 [inlined]
#100 at /Users/oscar/.julia/packages/Optimization/C5BBJ/src/function/mtk.jl:57
unknown function (ip: 0x10a6f7fa9)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
eval_hessian_lagrangian at /Users/oscar/.julia/packages/OptimizationMOI/2Ifbm/src/OptimizationMOI.jl:159
unknown function (ip: 0x10a6f7d62)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
_eval_hessian_lagrangian at /Users/oscar/.julia/packages/Ipopt/M2QE8/src/MOI_wrapper.jl:1038
eval_h_cb at /Users/oscar/.julia/packages/Ipopt/M2QE8/src/MOI_wrapper.jl:1108
unknown function (ip: 0x175e9452d)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
_Eval_H_CB at /Users/oscar/.julia/packages/Ipopt/M2QE8/src/C_wrapper.jl:122
unknown function (ip: 0x175c314c1)
_ZN5Ipopt16StdInterfaceTNLP6eval_hEiPKdbdiS2_biPiS3_Pd at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt11TNLPAdapter6Eval_hERKNS_6VectorEdS3_S3_RNS_9SymMatrixE at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt12OrigIpoptNLP1hERKNS_6VectorEdS3_S3_ at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt25IpoptCalculatedQuantities18curr_exact_hessianEv at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt19ExactHessianUpdater13UpdateHessianEv at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt14IpoptAlgorithm8OptimizeEb at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt16IpoptApplication13call_optimizeEv at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt16IpoptApplication11OptimizeNLPERKNS_8SmartPtrINS_3NLPEEERNS1_INS_16AlgorithmBuilderEEE at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt16IpoptApplication11OptimizeNLPERKNS_8SmartPtrINS_3NLPEEE at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
_ZN5Ipopt16IpoptApplication12OptimizeTNLPERKNS_8SmartPtrINS_4TNLPEEE at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
IpoptSolve at /Users/oscar/.julia/artifacts/cba75c2e8fa2f7bee4f5e4cfa7e353b4e6e4ef89/lib/libipopt.3.dylib (unknown line)
IpoptSolve at /Users/oscar/.julia/packages/Ipopt/M2QE8/src/C_wrapper.jl:433
optimize! at /Users/oscar/.julia/packages/Ipopt/M2QE8/src/MOI_wrapper.jl:1225
#__solve#20 at /Users/oscar/.julia/packages/OptimizationMOI/2Ifbm/src/OptimizationMOI.jl:276
__solve at /Users/oscar/.julia/packages/OptimizationMOI/2Ifbm/src/OptimizationMOI.jl:224 [inlined]
#solve#492 at /Users/oscar/.julia/packages/SciMLBase/UEAKN/src/solve.jl:56 [inlined]
solve at /Users/oscar/.julia/packages/SciMLBase/UEAKN/src/solve.jl:56
unknown function (ip: 0x175ee69fd)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
solve_opf at /Users/oscar/Documents/lanl-ansi/rosetta-opf/optimization.jl:340
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
do_call at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
eval_body at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_interpret_toplevel_thunk at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_toplevel_eval_flex at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_toplevel_eval_flex at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_toplevel_eval_in at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
eval at ./boot.jl:373 [inlined]
eval_user_input at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:150
repl_backend_loop at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:246
start_repl_backend at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:231
#run_repl#47 at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:364
run_repl at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:351
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
#930 at ./client.jl:394
jfptr_YY.930_24448.clone_1 at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_f__call_latest at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
#invokelatest#2 at ./essentials.jl:716 [inlined]
invokelatest at ./essentials.jl:714 [inlined]
run_main_repl at ./client.jl:379
exec_options at ./client.jl:309
_start at ./client.jl:495
jfptr__start_24435.clone_1 at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
jl_apply_generic at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
true_main at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
jl_repl_entrypoint at /Applications/Julia-1.7.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.7.dylib (unknown line)
Allocations: 712500434 (Pool: 711747834; Big: 752600); GC: 213
zsh: segmentation fault  ~/julia-1.7 --project=.

We're still pretty small here, but it requires on the order of 1.5x10^3 hessians of size 10^3 square.

It looks like this might be SciML/RuntimeGeneratedFunctions.jl#13 and JuliaLang/julia#45173 since it looks to be a problem in the IR, and we have a very large number of constants.

@ccoffrin
Copy link
Member

@Vaibhavdixit02 although this still has this crash issue, it appears to be a net-win for scalability, FD got up to 30 bus systems this PR is getting to about 73 buses (a 2x size increase). So I am going to merge this and make it the new "official" implementation.

@ccoffrin ccoffrin merged commit 14db7e1 into main Jun 17, 2022
@ccoffrin ccoffrin deleted the od/sparse-optimization branch June 17, 2022 23:45
@Vaibhavdixit02
Copy link
Contributor

Vaibhavdixit02 commented Jun 18, 2022

Great 🎉
The silver lining to the issue seems to that Jeff's already on top of it so it should get fixed in next Julia versions, so we can scale more hopefully!

@odow
Copy link
Collaborator Author

odow commented Jun 18, 2022

so we can scale more hopefully!

I guess as reference, we really want to get to the 30,000 bus system, and ideally even larger. So we still need to find 3 orders of magnitude 😆

@Vaibhavdixit02
Copy link
Contributor

Vaibhavdixit02 commented Jun 18, 2022

Oh 😂
Though seriously in that case I wonder how the tradeoff in symbolic implementation will scale, it does have the promise but in my very limited experience I am beginning to see that there are practical issues to runtime in case of these symbolic algorithms, I am not an expert in anyway in this though..

@Vaibhavdixit02
Copy link
Contributor

But, if it is very sparse, hence not a proportional increase in the amount of symbolic simplifications needed, I think it might be the best bet

@ccoffrin
Copy link
Member

@Vaibhavdixit02 here is the precise timing info if you are curious. I did confirm the bug reported by @odow, the code runs into the Julia crash for test cases with more than 73 buses.

Case Vars Cons JuMP NLPModels Optimization
case3_lmbd 24 28 1.22e-02 2.01e+01 1.77e+00
case5_pjm 44 53 1.75e-02 1.51e-01 1.99e-01
case14_ieee 118 169 6.54e-01 2.30e+01 7.98e+00
case24_ieee_rts 266 315 5.38e-01 4.53e+01 2.14e+01
case30_ieee 236 348 6.16e-01 3.65e+01 2.43e+01
case30_as 236 348 6.05e-01 3.05e+01 2.25e+01
case39_epri 282 401 6.95e-02 6.00e+01 2.95e+01
case57_ieee 448 675 6.45e-01 1.05e+02 8.19e+01
case60_c 518 737 6.41e-01 2.19e+02 1.06e+02
case73_ieee_rts 824 987 6.45e-01 5.97e+02 2.68e+02

@ChrisRackauckas
Copy link

But, if it is very sparse, hence not a proportional increase in the amount of symbolic simplifications needed, I think it might be the best bet

It doesn't do the symbolic simplifications right now, you'd have to structural_simplify

@ChrisRackauckas
Copy link

Is there an easy MWE for @YingboMa to run to try the structural_simplify on it?

@ccoffrin
Copy link
Member

The running the optimization.jl file from the command line should work as long as you have the required packages installed. In this case it would be,

import PowerModels
import Optimization
import OptimizationMOI
import ModelingToolkit
import Ipopt

From inside the REPL I am usually doing include("optimization.jl"); solve_opf("data/pglib_opf_case5_pjm.m") to test things while doing dev.

If the documentation for how to run things in the README.md could be improved let me know.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants