Indicator constraints with quadratic terms may have bugs?

When I use the indicator constraint, I find that it sometimes causes the model to be infeasible, but I can solve the model when I set a feasible solution as a constraint.

I know that the indicator can only contain linear constraints, so I create a variable to represent the quadratic terms in it. juMP doesn’t report errors, but sometimes it doesn’t work and I’m confused.

My code is as follow:

indt = @variable(model, [1:pipeNum, 1:Horizon], binary=true)

for ij in setdiff(1:pipeNum, ijGC), t in 1:Horizon
    x_M_t_avg = (x_M_t[ij, 1, t] + x_M_t[ij, 2, t]) / 2
    i, j = idx2ft(GS_fnode, GS_tnode, ij)
    term1 = @variable(model)
    term2 = @variable(model)
    term3 = @variable(model)
    @constraints(model, begin
        term1 == x_M_t_avg^2
        term2 == x_p_t[i, t]^2
        term3 == x_p_t[j, t]^2
    end)
    @constraints(model, begin
        indt[ij, t] => {x_p_t[i, t] - x_p_t[j, t] >= 0}
        indt[ij, t] => {x_M_t_avg >= 0}
        indt[ij, t] => {term1 == GS_K2[ij] .* (term2 - term3)}

        !indt[ij, t] => {x_p_t[i, t] - x_p_t[j, t] <= 0}
        !indt[ij, t] => {x_M_t_avg <= 0}
        !indt[ij, t] => {-term1 == GS_K2[ij] .* (term2 - term3)}
    end)
end

Can you provide the solver and data to make this reproducible?

What do you mean by doesn’t work?

What happens if you use set_start_value.(x_M_t, feasible_solution_x_M_t) instead?

But if your claim is that Gurobi reports infeasible without the constraint, and feasible with the constraint, then this seems like a problem in Gurobi, not JuMP or Gurobi.jl. You should contact Gurobi support.

You can create an MPS file to send them by going

optimize!(model)
GRBwrite(unsafe_backend(model), "model.mps")

Thank you very much! I contacted Gurobi and they reported it as a bug.

3 Likes

I contacted Gurobi and they reported it as a bug

Nice work!