`dual_objective_value` in JuMP.solution_summary

I have a question: what is the dual_objective_value below

julia> JuMP.solution_summary(model)
solution_summary(; result = 1, verbose = false)
├ solver_name          : Gurobi
├ Termination
│ ├ termination_status : OPTIMAL
│ ├ result_count       : 1
│ ├ raw_status         : Model was solved to optimality (subject to tolerances), and an optimal solution is available.
│ └ objective_bound    : 3.14159e+00
├ Solution (result = 1)
│ ├ primal_status        : FEASIBLE_POINT
│ ├ dual_status          : FEASIBLE_POINT
│ ├ objective_value      : 3.14159e+00
│ └ dual_objective_value : 3.14159e+00
└ Work counters
  ├ solve_time (sec)   : 2.53916e-04
  ├ simplex_iterations : 0
  ├ barrier_iterations : 0
  └ node_count         : 0

Which Gurobi’s attribute did it refer to? (I fail to identify)

It doesn’t correspond to any Gurobi attribute.

dual_objective_value(model) is equivalent to querying the MOI.DualObjectiveValue attribute. This attribute returns the objective value of the dual problem.

Here’s the code:

Because Gurobi doesn’t provide access to the dual objective value, we manually compute it based on the constraint duals.

Gurobi does have ObjBound, but I think we had cases in the past where this was not always equivalent to the dual objective for LPs: Model Attributes - Gurobi Optimizer Reference Manual

1 Like

Inspired by a recent post where an LP is solved to suboptimality, I think it makes some sense to have relative gap/feasible solution/objective bound for LPs also. But it seems that Gurobi only has MIPGap, not applied to LPs. (no more comments unless I find that more needs are required in the future.)

I believe we can make the information of solution_summary richer.