import JuMP, Gurobi
function objf(x, y) return (y - 2)^2/4 - x * y end
B = JuMP.Model(() -> Gurobi.Optimizer());
JuMP.@variable(B, 0 <= x <= 1);
JuMP.@variable(B, 0 <= y);
JuMP.@objective(B, Min, objf(x, y));
JuMP.optimize!(B); # see the following logging
JuMP.solution_summary(B) # see the following printing
Gurobi Optimizer version 12.0.1 build v12.0.1rc0 (win64 - Windows 11.0 (26100.2))
CPU model: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz, instruction set [SSE2|AVX|AVX2|AVX512]
Thread count: 4 physical cores, 8 logical processors, using up to 8 threads
Optimize a model with 0 rows, 2 columns and 0 nonzeros
Model fingerprint: 0x5b406e53
Model has 2 quadratic objective terms
Coefficient statistics:
Matrix range [0e+00, 0e+00]
Objective range [1e+00, 1e+00]
QObjective range [5e-01, 2e+00]
Bounds range [1e+00, 1e+00]
RHS range [0e+00, 0e+00]
Continuous model is non-convex -- solving as a MIP
Found heuristic solution: objective 1.0000000
Found heuristic solution: objective 0.8925000
Presolve removed 0 rows and 2 columns
Presolve time: 0.00s
Presolve: All rows and columns removed
Explored 0 nodes (0 simplex iterations) in 0.00 seconds (0.00 work units)
Thread count was 1 (of 8 available processors)
Solution count 3: -3 0.8925 1
No other solutions better than -3
Optimal solution found (tolerance 1.00e-04)
Best objective -3.000000000000e+00, best bound -3.000000000000e+00, gap 0.0000%
User-callback calls 90, time in user-callback 0.00 sec
* Solver : Gurobi
* Status
Result count : 3
Termination status : OPTIMAL
Message from the solver:
"Model was solved to optimality (subject to tolerances), and an optimal solution is available."
* Candidate solution (result #1)
Primal status : FEASIBLE_POINT
Dual status : NO_SOLUTION
Objective value : -3.00000e+00
Objective bound : -3.00000e+00
Relative gap : 0.00000e+00
Dual objective value : -3.00000e+00
* Work counters
Solve time (sec) : 0.00000e+00
Simplex iterations : 0
Barrier iterations : 0
Node count : 0
I find that JuMP’s solution_summary
appears to be seriously incorrect.
As a comparison, Gurobi’s logging is correct:
Optimal solution found (tolerance 1.00e-04)
Best objective -3.000000000000e+00, best bound -3.000000000000e+00, gap 0.0000%
Gurobi’s is correct in that it singled out this vital standalone quantity best bound
, which in math sense called “best dual bound”, This quantity is from the dual side, it is not related to any primal side solutions.
However, JuMP.solution_summary
did NOT furnish this vital quantity. Or it incorrectly put it in the block entitled Candidate solution (result #1)
.
The Objective bound
associated with Candidate solution (result #1)
is nonsensical. (it is not the value 1e100
nonsensical, it is the relationship incorrect.) (Did I express myself well?)