-
Notifications
You must be signed in to change notification settings - Fork 25
Description
When solving a model iteratively (only changing the objective function and adding a constraint based on the previous objective value), SCIP sometimes fails when start values are set from the previous solution.
I have observed two distinct errors in this context:
-
SCIP_INVALIDCALL in SCIPaddSolFree()
The example below reproduces this issue. It occured after 12 iterations. -
SCIPsolve(o) yielded SCIP code SCIP_ERROR
This happened in another test environment when setting start values before each iteration.
The error followed a series of SCIP internal errors:
presolved problem has 2360 variables (1355 bin, 0 int, 505 impl, 500 cont) and 2069 constraints
230 constraints of type <varbound>
14 constraints of type <knapsack>
1139 constraints of type <setppc>
431 constraints of type <linear>
243 constraints of type <logicor>
12 constraints of type <bounddisjunction>
Presolving Time: 3.34
transformed 3/4 original solutions to the transformed problem space
[lp.c:11621] ERROR: cannot solve LP when loose variable with infinite best bound is present
[lp.c:12068] ERROR: Error <0> in function call
[lp.c:12257] ERROR: Error <0> in function call
[lp.c:12512] ERROR: Error <0> in function call
[solve.c:1512] ERROR: Error <0> in function call
[solve.c:3096] ERROR: Error <0> in function call
[solve.c:4015] ERROR: Error <0> in function call
[solve.c:4313] ERROR: Error <0> in function call
[solve.c:5106] ERROR: Error <0> in function call
[scip_solve.c:2661] ERROR: Error <0> in function call
Both errors happen due to setting start values as in the example below.
Example that reproduces the first error:
using JuMP, SCIP
function main()
m, n = 100, 150
model = Model(SCIP.Optimizer)
set_silent(model)
@variable(model, x[1:m, 1:n], Bin)
@variable(model, y[1:max(m, n)], Bin)
@constraints(
model,
begin
[i in 1:n], sum(x[:, i]) <= y[i]
[j in 1:m], sum(mod(i, 2) * x[j, i] for i in 1:n) >= sum(y[1:j])
end
)
for k in 1:min(m, n)
indices = [(i, j) for i in 1:m for j in 1:n if (i + j) % k == 0]
@constraint(model, sum(x[i, j] for (i, j) in indices) >= 1)
end
varValues = nothing
for k in 1:20
@info "k = $k"
obj = @expression(
model,
sum(mod(m + n + k, i) * y[i] for i in 1:max(m, n)) +
sum(mod(m + n + k, i + j) * x[i, j] for i in 1:m, j in 1:n)
)
if varValues !== nothing
for (varIdx, val) in varValues
set_start_value(VariableRef(model, varIdx), val)
end
end
@objective(model, Min, obj)
optimize!(model)
if primal_status(model) == FEASIBLE_POINT
varValues = Dict{MOI.VariableIndex, Float64}(
v.index => value(v) for v in all_variables(model)
)
obj_val = objective_value(model)
@constraint(model, obj <= 1.01 * obj_val)
end
end
end
main()
Running this code results in the following:
[ Info: k = 1
[ Info: k = 2
[ Info: k = 3
[ Info: k = 4
[ Info: k = 5
[ Info: k = 6
[ Info: k = 7
[ Info: k = 8
[ Info: k = 9
[ Info: k = 10
[ Info: k = 11
[ Info: k = 12
[primal.c:901] ERROR: Cannot add partial solution to storage: limit reached.
[primal.c:1397] ERROR: Error <-8> in function call
[scip_sol.c:2864] ERROR: Error <-8> in function call
ERROR: LoadError: SCIPaddSolFree(o, sol__, stored_) yielded SCIP code SCIP_INVALIDCALL
Environment:
Julia version: 1.11.7
JuMP version: 1.29.1
SCIP.jl version: 0.12.7
SCIP_PaPILO_jll version: 900.200.200+0
Operating system: Ubuntu 20.04.6