Skip to content

Named Constraints Error with Gurobi #105

@pulsipher

Description

@pulsipher

I am trying to implement the FAC example from the JuMP paper, but using POI to update the M value. However, this is incurring some strange errors. (I am using JuMP v1.1 and POI v0.4)

using JuMP, ParametricOptInterface, Gurobi
const POI = ParametricOptInterface

function create_model(G, F, M_start)
    # Initialize the model object
    model = Model(() -> POI.Optimizer(Gurobi.Optimizer()))

    # Add the variables
    @variable(model, d)
    @variable(model, 0  y[1:F, 1:2]  1)
    @variable(model, z[0:G, 0:G, 1:F], Bin)
    @variable(model, 0  s[0:G, 0:G, 1:F])
    @variable(model, r[0:G, 0:G, 1:F, 1:2])
    @variable(model, Mp in POI.Parameter(M_start))
    
    # Set the objective
    @objective(model, Min, d)
    
    # Add the constraints
    @constraint(model, [i  0:G, j  0:G], sum(z[i,j,f] for f  1:F) == 1)
    @constraint(model, con[i  0:G, j  0:G, f  1:F], s[i,j,f] == d + Mp*(1 - z[i,j,f]))
    @constraint(model, [i  0:G, j  0:G, f  1:F], r[i,j,f,1] == i/G - y[f,1])
    @constraint(model, [i  0:G, j  0:G, f  1:F], r[i,j,f,2] == j/G - y[f,2])
    @constraint(model, [i  0:G, j  0:G, f  1:F], r[i,j,f,1]^2 + r[i,j,f,2]^2  s[i,j,f]^2)

    # Return the model
    return model
end

m = create_model(4, 4, 4.0)
optimize!(m) 
ERROR: The index MathOptInterface.ConstraintIndex{MathOptInterface.ScalarQuadraticFunction{Float64}, MathOptInterface.EqualTo{Float64}}(1) is invalid. Note that an index becomes invalid after it has been deleted.
Stacktrace:
  [1] _info
    @ C:\Users\bbgui\.julia\packages\Gurobi\cnAYk\src\MOI_wrapper\MOI_wrapper.jl:2332 [inlined]
  [2] set
    @ C:\Users\bbgui\.julia\packages\Gurobi\cnAYk\src\MOI_wrapper\MOI_wrapper.jl:2487 [inlined]
  [3] set
    @ C:\Users\bbgui\.julia\packages\ParametricOptInterface\3MNVD\src\ParametricOptInterface.jl:446 [inlined]
  [4] set
    @ C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\Bridges\bridge_optimizer.jl:1420 [inlined]
  [5] _pass_attribute(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{ParametricOptInterface.Optimizer{Float64, Gurobi.Optimizer}}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}, index_map::MathOptInterface.Utilities.IndexMap, cis_src::Vector{MathOptInterface.ConstraintIndex{MathOptInterface.ScalarQuadraticFunction{Float64}, MathOptInterface.EqualTo{Float64}}}, attr::MathOptInterface.ConstraintName)
    @ MathOptInterface.Utilities C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\Utilities\copy.jl:134
  [6] pass_attributes(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{ParametricOptInterface.Optimizer{Float64, Gurobi.Optimizer}}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}, index_map::MathOptInterface.Utilities.IndexMap, cis_src::Vector{MathOptInterface.ConstraintIndex{MathOptInterface.ScalarQuadraticFunction{Float64}, MathOptInterface.EqualTo{Float64}}})
    @ MathOptInterface.Utilities C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\Utilities\copy.jl:119
  [7] _pass_constraints(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{ParametricOptInterface.Optimizer{Float64, Gurobi.Optimizer}}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}, index_map::MathOptInterface.Utilities.IndexMap, variable_constraints_not_added::Vector{Any})
    @ MathOptInterface.Utilities C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\Utilities\copy.jl:313
  [8] default_copy_to(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{ParametricOptInterface.Optimizer{Float64, Gurobi.Optimizer}}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}})
    @ MathOptInterface.Utilities C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\Utilities\copy.jl:481
  [9] #copy_to#7
    @ C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\Bridges\bridge_optimizer.jl:421 [inlined]
 [10] copy_to
    @ C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\Bridges\bridge_optimizer.jl:421 [inlined]
 [11] optimize!
    @ C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\MathOptInterface.jl:80 [inlined]
 [12] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.Bridges.LazyBridgeOptimizer{ParametricOptInterface.Optimizer{Float64, Gurobi.Optimizer}}, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}})
    @ MathOptInterface.Utilities C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\Utilities\cachingoptimizer.jl:310
 [13] optimize!(model::Model; ignore_optimize_hook::Bool, kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ JuMP C:\Users\bbgui\.julia\packages\JuMP\0C6kd\src\optimizer_interface.jl:161
 [14] optimize!(model::Model)
    @ JuMP C:\Users\bbgui\.julia\packages\JuMP\0C6kd\src\optimizer_interface.jl:143
 [15] top-level scope
    @ REPL[13]:1

Strangely, if I remove the constraint name a different error is incurred:

using JuMP, ParametricOptInterface, Gurobi
const POI = ParametricOptInterface

function create_model(G, F, M_start)
    # Initialize the model object
    model = Model(() -> POI.Optimizer(Gurobi.Optimizer()))

    # Add the variables
    @variable(model, d)
    @variable(model, 0  y[1:F, 1:2]  1)
    @variable(model, z[0:G, 0:G, 1:F], Bin)
    @variable(model, 0  s[0:G, 0:G, 1:F])
    @variable(model, r[0:G, 0:G, 1:F, 1:2])
    @variable(model, Mp in POI.Parameter(M_start))
    
    # Set the objective
    @objective(model, Min, d)
    
    # Add the constraints
    @constraint(model, [i  0:G, j  0:G], sum(z[i,j,f] for f  1:F) == 1)
    @constraint(model, [i  0:G, j  0:G, f  1:F], s[i,j,f] == d + Mp*(1 - z[i,j,f]))
    @constraint(model, [i  0:G, j  0:G, f  1:F], r[i,j,f,1] == i/G - y[f,1])
    @constraint(model, [i  0:G, j  0:G, f  1:F], r[i,j,f,2] == j/G - y[f,2])
    @constraint(model, [i  0:G, j  0:G, f  1:F], r[i,j,f,1]^2 + r[i,j,f,2]^2  s[i,j,f]^2)

    # Return the model
    return model
end

m = create_model(2, 2, 4.0)
optimize!(m) 
Gurobi Optimizer version 9.5.0 build v9.5.0rc5 (win64)
Thread count: 8 physical cores, 16 logical processors, using up to 16 threads
Optimize a model with 63 rows, 77 columns and 144 nonzeros
Model fingerprint: 0x6c4035d3
Model has 18 quadratic constraints
Variable types: 59 continuous, 18 integer (18 binary)
Coefficient statistics:
  Matrix range     [1e+00, 4e+00]
  QMatrix range    [1e+00, 1e+00]
  Objective range  [1e+00, 1e+00]
  Bounds range     [1e+00, 1e+00]
  RHS range        [5e-01, 4e+00]
Presolve removed 21 rows and 21 columns
Presolve time: 0.00s
Presolved: 42 rows, 56 columns, 102 nonzeros
Presolved model has 18 quadratic constraint(s)
Variable types: 47 continuous, 9 integer (9 binary)

Root relaxation: objective 0.000000e+00, 0 iterations, 0.00 seconds (0.00 work units)

    Nodes    |    Current Node    |     Objective Bounds      |     Work
 Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time

H    0     0                       0.7071069    0.00000   100%     -    0s
*    0     0               0       0.7071069    0.00000   100%     -    0s
H    0     0                       0.7071068    0.00000   100%     -    0s
*    0     0               0       0.7071068    0.00000   100%     -    0s
H    0     0                       0.7071068    0.00000   100%     -    0s
     0     0    0.00000    0    6    0.70711    0.00000   100%     -    0s
H    0     0                       0.5590172    0.00000   100%     -    0s
     0     0    0.00000    0    8    0.55902    0.00000   100%     -    0s
     0     0    0.00000    0    8    0.55902    0.00000   100%     -    0s
H    0     0                       0.5590168    0.00000   100%     -    0s
     0     2    0.00000    0    8    0.55902    0.00000   100%     -    0s
H    3     8                       0.5590168    0.11881  78.7%  11.3    0s
*   35     4               4       0.5590168    0.54668  2.21%   5.0    0s
*   36     4               4       0.5590165    0.54668  2.21%   4.9    0s
*   39     0               4       0.5590161    0.54668  2.21%   4.7    0s

Cutting planes:
  Gomory: 1
  Implied bound: 2
  MIR: 11

Explored 45 nodes (252 simplex iterations) in 0.07 seconds (0.02 work units)
Thread count was 16 (of 16 available processors)

Solution count 8: 0.559016 0.559017 0.559017 ... 0.707107

Optimal solution found (tolerance 1.00e-04)
Warning: max constraint violation (1.9584e-06) exceeds tolerance
Best objective 5.590161137321e-01, best bound 5.590161137321e-01, gap 0.0000%

User-callback calls 473, time in user-callback 0.00 sec
ERROR: Gurobi Error 10005: Unable to retrieve attribute 'Pi'
Stacktrace:
  [1] _check_ret
    @ C:\Users\bbgui\.julia\packages\Gurobi\cnAYk\src\MOI_wrapper\MOI_wrapper.jl:317 [inlined]
  [2] get(model::Gurobi.Optimizer, attr::MathOptInterface.ConstraintDual, c::MathOptInterface.ConstraintIndex{MathOptInterface.ScalarAffineFunction{Float64}, MathOptInterface.EqualTo{Float64}})
    @ Gurobi C:\Users\bbgui\.julia\packages\Gurobi\cnAYk\src\MOI_wrapper\MOI_wrapper.jl:3099
  [3] calculate_parameters_in_ci!(param_dual_cum_sum::Vector{Float64}, optimizer::Gurobi.Optimizer, param_array::Vector{MathOptInterface.ScalarAffineTerm{Float64}}, ci::MathOptInterface.ConstraintIndex{MathOptInterface.ScalarAffineFunction{Float64}, MathOptInterface.EqualTo{Float64}})
    @ ParametricOptInterface C:\Users\bbgui\.julia\packages\ParametricOptInterface\3MNVD\src\duals.jl:106
  [4] update_duals_with_quadratic_constraint_cache!(param_dual_cum_sum::Vector{Float64}, model::ParametricOptInterface.Optimizer{Float64, Gurobi.Optimizer}, quadratic_constraint_cache_pc_inner::MathOptInterface.Utilities.DoubleDicts.DoubleDictInner{MathOptInterface.ScalarQuadraticFunction{Float64}, MathOptInterface.EqualTo{Float64}, Vector{MathOptInterface.ScalarAffineTerm{Float64}}})
    @ ParametricOptInterface C:\Users\bbgui\.julia\packages\ParametricOptInterface\3MNVD\src\duals.jl:90
  [5] update_duals_with_quadratic_constraint_cache!(param_dual_cum_sum::Vector{Float64}, model::ParametricOptInterface.Optimizer{Float64, Gurobi.Optimizer})
    @ ParametricOptInterface C:\Users\bbgui\.julia\packages\ParametricOptInterface\3MNVD\src\duals.jl:69
  [6] calculate_dual_of_parameters(model::ParametricOptInterface.Optimizer{Float64, Gurobi.Optimizer})
    @ ParametricOptInterface C:\Users\bbgui\.julia\packages\ParametricOptInterface\3MNVD\src\duals.jl:8
  [7] optimize!
    @ C:\Users\bbgui\.julia\packages\ParametricOptInterface\3MNVD\src\ParametricOptInterface.jl:1280 [inlined]
  [8] optimize!
    @ C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\Bridges\bridge_optimizer.jl:348 [inlined]
  [9] optimize!
    @ C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\MathOptInterface.jl:81 [inlined]
 [10] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.Bridges.LazyBridgeOptimizer{ParametricOptInterface.Optimizer{Float64, Gurobi.Optimizer}}, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}})
    @ MathOptInterface.Utilities C:\Users\bbgui\.julia\packages\MathOptInterface\ElZ45\src\Utilities\cachingoptimizer.jl:310
 [11] optimize!(model::Model; ignore_optimize_hook::Bool, kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ JuMP C:\Users\bbgui\.julia\packages\JuMP\0C6kd\src\optimizer_interface.jl:161
 [12] optimize!(model::Model)
    @ JuMP C:\Users\bbgui\.julia\packages\JuMP\0C6kd\src\optimizer_interface.jl:143
 [13] top-level scope
    @ REPL[20]:1

I could be doing something wrong, but I suspect this is a bug.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions