lanl-ansi / Juniper.jl

A JuMP-based Nonlinear Integer Program Solver
https://lanl-ansi.github.io/Juniper.jl/stable/
MIT License
179 stars 22 forks source link

value not defined #247

Closed GabrielPonte closed 2 years ago

GabrielPonte commented 2 years ago

Hi, I'm trying to solve this logdet problem. There was a bug with mosek at the beginning, but now I'm able to get its solution of the continuous relaxation. Unfortunately, now I'm receiving an error when trying to solve the integer problem using Juniper. I tried the solvers SCS and Mosek and both sent the same error : UndefVarError: value not defined I didn't find this issue in here, so I'm creating this one.

using JuMP, LinearAlgebra, MosekTools, SCS, Juniper
n = 10;
m = 3;
s = 5;
u = rand(1:3,n);
A =rand(n,m);
x_ls = [1 1 1 1 1 0 0 0 0 0];
function lower_triangular(A)
    return [A[i, j] for i = 1:size(A, 1) for j = 1:i]
end
nl_solver = optimizer_with_attributes(SCS.Optimizer);
minlp_solver = optimizer_with_attributes(Juniper.Optimizer, "nl_solver"=>nl_solver)
model = Model(minlp_solver);
@variable(model,t);
@variable(model, x[1:n],Int);
@constraint(model, s-sum(x)==0);
for i = (1:n)
    set_lower_bound(x[i],0);
    set_upper_bound(x[i],u[i]);
end
set_start_value.(x, vec(x_ls))
B = lower_triangular(A'*diagm(x)*A);
@constraint(model, [t; 1; B] in MOI.LogDetConeTriangle(m));
@objective(model, Max, t);
optimize!(model)

SCS can solve the continuous relaxation without any problems. Here's the log that I get when running the code above:

nl_solver         : MathOptInterface.OptimizerWithAttributes(SCS.Optimizer, Pair{MathOptInterface.AbstractOptimizerAttribute, Any}[])
feasibility_pump  : false
log_levels        : [:Options, :Table, :Info]

#Variables: 11
#IntBinVar: 10
Obj Sense: Max

Status of relaxation: OPTIMAL
Time for relaxation: 0.03099989891052246
Relaxation Obj: 0.8838738534884668

 ONodes   CLevel          Incumbent                   BestBound            Gap    Time   Restarts  GainGap  
============================================================================================================
----------------------------------------------------------------------------
    SCS v2.1.2 - Splitting Conic Solver
    (c) Brendan O'Donoghue, Stanford University, 2012
----------------------------------------------------------------------------
Lin-sys: sparse-indirect, nnz in A = 109, CG tol ~ 1/iter^(2.00)
eps = 1.00e-005, alpha = 1.50, max_iters = 5000, normalize = 1, scale = 1.00
acceleration_lookback = 10, rho_x = 1.00e-003
Variables n = 20, constraints m = 52
Cones:  primal zero / dual free vars: 1
    linear vars: 21
    sd vars: 21, sd blks: 1
    exp vars: 9, dual exp vars: 0
Setup time: 5.38e-005s
----------------------------------------------------------------------------
 Iter | pri res | dua res | rel gap | pri obj | dua obj | kap/tau | time (s)
----------------------------------------------------------------------------
     0|2.87e+019 4.02e+019 1.00e+000 -2.77e+020 1.20e+020 1.94e+020 2.00e-004 
   100|1.95e-004 4.56e-004 1.52e-005 2.11e+000 2.11e+000 2.97e-017 9.16e-003 
   140|5.13e-006 7.49e-006 4.74e-007 2.11e+000 2.11e+000 3.08e-016 1.26e-002 
----------------------------------------------------------------------------
Status: Solved
Timing: Solve time: 1.26e-002s
    Lin-sys: avg # CG iterations: 6.46, avg solve time: 3.12e-006s
    Cones: avg projection time: 7.73e-005s
    Acceleration: avg step time: 7.03e-006s
----------------------------------------------------------------------------
Error metrics:
dist(s, K) = 1.1944e-009, dist(y, K*) = 1.8150e-009, s'y/|s||y| = 2.5162e-011
primal res: |Ax + s - b|_2 / (1 + |b|_2) = 5.1258e-006
dual res:   |A'y + c|_2 / (1 + |c|_2) = 7.4939e-006
rel gap:    |c'x + b'y| / (1 + |c'x| + |b'y|) = 4.7411e-007
----------------------------------------------------------------------------
c'x = 2.1088, -b'y = 2.1088
============================================================================
----------------------------------------------------------------------------
    SCS v2.1.2 - Splitting Conic Solver
    (c) Brendan O'Donoghue, Stanford University, 2012
----------------------------------------------------------------------------
Lin-sys: sparse-indirect, nnz in A = 109, CG tol ~ 1/iter^(2.00)
eps = 1.00e-005, alpha = 1.50, max_iters = 5000, normalize = 1, scale = 1.00
acceleration_lookback = 10, rho_x = 1.00e-003
Variables n = 20, constraints m = 52
Cones:  primal zero / dual free vars: 1
    linear vars: 21
    sd vars: 21, sd blks: 1
    exp vars: 9, dual exp vars: 0
Setup time: 4.44e-005s
----------------------------------------------------------------------------
 Iter | pri res | dua res | rel gap | pri obj | dua obj | kap/tau | time (s)
----------------------------------------------------------------------------
     0|3.14e+019 2.33e+019 1.00e+000 -3.46e+020 4.32e+019 3.53e+020 1.07e-004 
   100|9.26e-007 2.18e-006 3.11e-006 -8.84e-001 -8.84e-001 3.41e-016 1.11e-002 
----------------------------------------------------------------------------
Status: Solved
Timing: Solve time: 1.11e-002s
    Lin-sys: avg # CG iterations: 4.86, avg solve time: 2.29e-006s
    Cones: avg projection time: 9.94e-005s
    Acceleration: avg step time: 6.77e-006s
----------------------------------------------------------------------------
Error metrics:
dist(s, K) = 2.2600e-016, dist(y, K*) = 1.5016e-009, s'y/|s||y| = 2.6413e-011
primal res: |Ax + s - b|_2 / (1 + |b|_2) = 9.2567e-007
dual res:   |A'y + c|_2 / (1 + |c|_2) = 2.1783e-006
rel gap:    |c'x + b'y| / (1 + |c'x| + |b'y|) = 3.1140e-006
----------------------------------------------------------------------------
c'x = -0.8839, -b'y = -0.8839
============================================================================
┌ Warning: MathOptInterface.VariablePrimalStart() is not supported by SCS.GeometricConicForm{Float64, SCS.SparseMatrixCSRtoCSC{Int64}, NTuple{8, DataType}}. This information will be discarded.
└ @ MathOptInterface.Utilities C:\Users\Cliente\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:290
┌ Warning: MathOptInterface.VariablePrimalStart() is not supported by SCS.GeometricConicForm{Float64, SCS.SparseMatrixCSRtoCSC{Int64}, NTuple{8, DataType}}. This information will be discarded.
└ @ MathOptInterface.Utilities C:\Users\Cliente\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:290
UndefVarError: value not defined

Stacktrace:
  [1] set_subsolver_option!
    @ C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\util.jl:289 [inlined]
  [2] set_subsolver_option!(model::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{SCS.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}}}, subsolver_name::String, param::String, change::Pair{Float64, Float64})
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\util.jl:292
  [3] process_node!(m::Juniper.JuniperProblem, step_obj::Juniper.StepObj, cnode::Juniper.BnBNode, disc2var_idx::Vector{Int64}, temp::Bool; restarts::Int64)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:67
  [4] process_node!
    @ C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:56 [inlined]
  [5] branch!(m::Juniper.JuniperProblem, opts::Juniper.SolverOptions, step_obj::Juniper.StepObj, counter::Int64, disc2var_idx::Vector{Int64}; temp::Bool)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:161
  [6] branch_strong_on!(m::Juniper.JuniperProblem, opts::Juniper.SolverOptions, step_obj::Juniper.StepObj, reasonable_disc_vars::Vector{Int64}, disc2var_idx::Vector{Int64}, strong_restart::Bool, counter::Int64)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\bb_strategies.jl:164
  [7] branch_strong!(m::Juniper.JuniperProblem, opts::Juniper.SolverOptions, disc2var_idx::Vector{Int64}, step_obj::Juniper.StepObj, counter::Int64)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\bb_strategies.jl:275
  [8] get_branching_disc_idx!(m::Juniper.JuniperProblem, step_obj::Juniper.StepObj, opts::Juniper.SolverOptions, disc2var_idx::Vector{Int64}, gains::Juniper.GainObj, counter::Int64)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:29
  [9] one_branch_step!(m1::Juniper.JuniperProblem, incumbent::Nothing, opts::Juniper.SolverOptions, step_obj::Juniper.StepObj, disc2var_idx::Vector{Int64}, gains::Juniper.GainObj, counter::Int64)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:311
 [10] solve_sequential(tree::Juniper.BnBTreeObj, last_table_arr::Vector{Any}, time_bnb_solve_start::Float64, fields::Vector{Symbol}, field_chars::Vector{Int64}, time_obj::Juniper.TimeObj)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:408
 [11] solvemip(tree::Juniper.BnBTreeObj)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:608
 [12] optimize!(model::Juniper.Optimizer)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\MOI_wrapper\MOI_wrapper.jl:297
 [13] optimize!(b::MathOptInterface.Bridges.LazyBridgeOptimizer{Juniper.Optimizer})
    @ MathOptInterface.Bridges C:\Users\Cliente\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:319
 [14] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}})
    @ MathOptInterface.Utilities C:\Users\Cliente\.julia\packages\MathOptInterface\YDdD3\src\Utilities\cachingoptimizer.jl:252
 [15] optimize!(model::Model, optimizer_factory::Nothing; bridge_constraints::Bool, ignore_optimize_hook::Bool, kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ JuMP C:\Users\Cliente\.julia\packages\JuMP\klrjG\src\optimizer_interface.jl:185
 [16] optimize! (repeats 2 times)
    @ C:\Users\Cliente\.julia\packages\JuMP\klrjG\src\optimizer_interface.jl:157 [inlined]
 [17] top-level scope
    @ In[10]:19
 [18] eval
    @ .\boot.jl:373 [inlined]
 [19] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
    @ Base .\loading.jl:1196

And here's the log using Mosek

nl_solver         : MathOptInterface.OptimizerWithAttributes(Mosek.Optimizer, Pair{MathOptInterface.AbstractOptimizerAttribute, Any}[])
feasibility_pump  : false
log_levels        : [:Options, :Table, :Info]

#Variables: 11
#IntBinVar: 10
Obj Sense: Max

Problem
  Name                   :                 
  Objective sense        : max             
  Type                   : CONIC (conic optimization problem)
  Constraints            : 32              
  Cones                  : 3               
  Scalar variables       : 29              
  Matrix variables       : 1               
  Integer variables      : 0               

Optimizer started.
Presolve started.
Linear dependency checker started.
Linear dependency checker terminated.
Eliminator started.
Freed constraints in eliminator : 0
Eliminator terminated.
Eliminator - tries                  : 1                 time                   : 0.00            
Lin. dep.  - tries                  : 1                 time                   : 0.00            
Lin. dep.  - number                 : 0               
Presolve terminated. Time: 0.00    
Problem
  Name                   :                 
  Objective sense        : max             
  Type                   : CONIC (conic optimization problem)
  Constraints            : 32              
  Cones                  : 3               
  Scalar variables       : 29              
  Matrix variables       : 1               
  Integer variables      : 0               

Optimizer  - threads                : 4               
Optimizer  - solved problem         : the primal      
Optimizer  - Constraints            : 21
Optimizer  - Cones                  : 4
Optimizer  - Scalar variables       : 13                conic                  : 13              
Optimizer  - Semi-definite variables: 1                 scalarized             : 21              
Factor     - setup time             : 0.00              dense det. time        : 0.00            
Factor     - ML order time          : 0.00              GP order time          : 0.00            
Factor     - nonzeros before factor : 231               after factor           : 231             
Factor     - dense dim.             : 0                 flops                  : 5.11e+03        
ITE PFEAS    DFEAS    GFEAS    PRSTATUS   POBJ              DOBJ              MU       TIME  
0   2.4e+00  1.3e+00  5.9e+00  0.00e+00   -2.483515197e+00  2.415306005e+00   1.0e+00  0.00  
1   7.8e-01  4.1e-01  1.3e+00  -4.65e-03  -6.275013502e-01  1.380937496e+00   3.2e-01  0.00  
2   2.1e-01  1.1e-01  2.5e-01  4.30e-01   -9.103595276e-01  -2.500277110e-01  8.7e-02  0.00  
3   9.1e-02  4.8e-02  9.1e-02  4.97e-01   -1.377889745e+00  -1.044266559e+00  3.7e-02  0.00  
4   1.6e-02  8.5e-03  7.2e-03  8.00e-01   -1.871024954e+00  -1.809303920e+00  6.6e-03  0.00  
5   3.6e-03  1.9e-03  9.3e-04  7.78e-01   -2.048269039e+00  -2.035079045e+00  1.5e-03  0.00  
6   2.5e-04  1.3e-04  1.8e-05  9.62e-01   -2.103867815e+00  -2.102928856e+00  1.0e-04  0.00  
7   2.1e-05  1.1e-05  4.3e-07  9.91e-01   -2.108365357e+00  -2.108288722e+00  8.5e-06  0.00  
8   9.0e-07  4.8e-07  3.9e-09  9.98e-01   -2.108788937e+00  -2.108785635e+00  3.7e-07  0.02  
9   1.9e-08  1.0e-08  1.2e-11  1.00e+00   -2.108809281e+00  -2.108809211e+00  7.9e-09  0.02  
10  2.1e-09  1.6e-09  4.5e-13  1.00e+00   -2.108809722e+00  -2.108809714e+00  8.5e-10  0.02  
Optimizer terminated. Time: 0.02    

Incumbent using start values: -2.108809722273232
Optimizer started.
Optimizer terminated. Time: 0.00    

Status of relaxation: OPTIMAL
Time for relaxation: 0.01100015640258789
Relaxation Obj: 0.8838794353285663

 ONodes   CLevel          Incumbent                   BestBound            Gap    Time   Restarts  GainGap  
============================================================================================================
UndefVarError: value not defined

Stacktrace:
  [1] set_subsolver_option!
    @ C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\util.jl:289 [inlined]
  [2] set_subsolver_option!(model::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, subsolver_name::String, param::String, change::Pair{Float64, Float64})
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\util.jl:292
  [3] process_node!(m::Juniper.JuniperProblem, step_obj::Juniper.StepObj, cnode::Juniper.BnBNode, disc2var_idx::Vector{Int64}, temp::Bool; restarts::Int64)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:67
  [4] process_node!
    @ C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:56 [inlined]
  [5] branch!(m::Juniper.JuniperProblem, opts::Juniper.SolverOptions, step_obj::Juniper.StepObj, counter::Int64, disc2var_idx::Vector{Int64}; temp::Bool)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:161
  [6] branch_strong_on!(m::Juniper.JuniperProblem, opts::Juniper.SolverOptions, step_obj::Juniper.StepObj, reasonable_disc_vars::Vector{Int64}, disc2var_idx::Vector{Int64}, strong_restart::Bool, counter::Int64)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\bb_strategies.jl:164
  [7] branch_strong!(m::Juniper.JuniperProblem, opts::Juniper.SolverOptions, disc2var_idx::Vector{Int64}, step_obj::Juniper.StepObj, counter::Int64)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\bb_strategies.jl:275
  [8] get_branching_disc_idx!(m::Juniper.JuniperProblem, step_obj::Juniper.StepObj, opts::Juniper.SolverOptions, disc2var_idx::Vector{Int64}, gains::Juniper.GainObj, counter::Int64)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:29
  [9] one_branch_step!(m1::Juniper.JuniperProblem, incumbent::Juniper.Incumbent, opts::Juniper.SolverOptions, step_obj::Juniper.StepObj, disc2var_idx::Vector{Int64}, gains::Juniper.GainObj, counter::Int64)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:311
 [10] solve_sequential(tree::Juniper.BnBTreeObj, last_table_arr::Vector{Any}, time_bnb_solve_start::Float64, fields::Vector{Symbol}, field_chars::Vector{Int64}, time_obj::Juniper.TimeObj)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:406
 [11] solvemip(tree::Juniper.BnBTreeObj)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\BnBTree.jl:608
 [12] optimize!(model::Juniper.Optimizer)
    @ Juniper C:\Users\Cliente\.julia\packages\Juniper\8wso7\src\MOI_wrapper\MOI_wrapper.jl:297
 [13] optimize!(b::MathOptInterface.Bridges.LazyBridgeOptimizer{Juniper.Optimizer})
    @ MathOptInterface.Bridges C:\Users\Cliente\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:319
 [14] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}})
    @ MathOptInterface.Utilities C:\Users\Cliente\.julia\packages\MathOptInterface\YDdD3\src\Utilities\cachingoptimizer.jl:252
 [15] optimize!(model::Model, optimizer_factory::Nothing; bridge_constraints::Bool, ignore_optimize_hook::Bool, kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ JuMP C:\Users\Cliente\.julia\packages\JuMP\klrjG\src\optimizer_interface.jl:185
 [16] optimize! (repeats 2 times)
    @ C:\Users\Cliente\.julia\packages\JuMP\klrjG\src\optimizer_interface.jl:157 [inlined]
 [17] top-level scope
    @ In[9]:19
 [18] eval
    @ .\boot.jl:373 [inlined]
 [19] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
    @ Base .\loading.jl:1196

Could you please help me with this new issue?

odow commented 2 years ago

What is import Pkg; Pkg.status()? It looks like you might have an old version installed.

odow commented 2 years ago

Fixed in an older version: https://github.com/lanl-ansi/Juniper.jl/pull/214.

Please update to the latest version of Juniper.

GabrielPonte commented 2 years ago

Oh, I was using Juniper 0.7.0. It worked!!!! Thanks!!