Skip to content

Commit 01d5c53

Browse files
committed
Various changes
1. Fixed collection of bounds information from Gurobi 2. Fixed xfr of results information from pycoek to pyomo
1 parent b573ae4 commit 01d5c53

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

Diff for: lib/coek/coek/solvers/gurobi/gurobi.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ void GurobiSolver::collect_results(Model& model, std::shared_ptr<SolverResults>&
142142
results->termination_condition = TerminationCondition::convergence_criteria_satisfied;
143143
results->solution_status = SolutionStatus::optimal;
144144
results->objective_value = gmodel->getObjective().getValue();
145-
results->objective_bound = results->objective_value;
145+
results->objective_bound = gmodel->get(GRB_DoubleAttr_ObjBound);
146146

147147
// Collect values of Gurobi variables
148148
for (auto& var : model.repn->variables) {
@@ -155,6 +155,8 @@ void GurobiSolver::collect_results(Model& model, std::shared_ptr<SolverResults>&
155155
else if (status == GRB_SUBOPTIMAL) {
156156
results->termination_condition = TerminationCondition::other_termination_limit;
157157
results->solution_status = SolutionStatus::feasible;
158+
results->objective_value = gmodel->getObjective().getValue();
159+
results->objective_bound = gmodel->get(GRB_DoubleAttr_ObjBound);
158160
results->error_message
159161
= "Unable to satisfy optimality tolerances; a sub-optimal solution is available";
160162

Diff for: lib/coek/test/test_examples.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,8 @@ TEST_CASE("gurobi_examples", "[smoke]")
303303
auto res = solver.solve(m);
304304
REQUIRE(coek::check_optimal_termination(res));
305305

306+
REQUIRE(res->objective_value == Approx(28750.0));
307+
REQUIRE(res->objective_bound == Approx(28750.0));
306308
check(m.get_variables(), simplelp1_soln);
307309
}
308310
// SECTION("simplelp1_solve") { simplelp1_solve(); }

Diff for: lib/pyomo_coek/pyomo_coek/components_only/solvers.py

+38-5
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,42 @@
1919
from pyomo_coek.components_only.constraint import Constraint
2020
from pyomo_coek.components_only.variable import Var
2121

22+
from pyomo.opt.results.solution import SolutionStatus
23+
from pyomo.opt.results.solver import TerminationCondition
2224

2325
_nlp_solvers = {
2426
"ipopt",
2527
}
2628

29+
poek2pyomo_termination_condition = \
30+
{
31+
"convergence_criteria_satisfied": TerminationCondition.optimal,
32+
"time_limit": TerminationCondition.maxTimeLimit,
33+
"iteration_limit": TerminationCondition.maxIterations,
34+
"objective_limit": TerminationCondition.minFunctionValue,
35+
"min_step_length": TerminationCondition.minStepLength,
36+
"other_termination_limit": TerminationCondition.unknown,
37+
"unbounded": TerminationCondition.unbounded,
38+
"proven_infeasible": TerminationCondition.infeasible,
39+
"locally_infeasible": TerminationCondition.infeasible,
40+
"infeasible_or_unbounded": TerminationCondition.infeasibleOrUnbounded,
41+
"error": TerminationCondition.error,
42+
"interrupted": TerminationCondition.resourceInterrupt,
43+
"licensing_problems": TerminationCondition.licensingProblems,
44+
"solver_not_available": TerminationCondition.unknown,
45+
"empty_model": TerminationCondition.unknown,
46+
"invalid_model_for_solver": TerminationCondition.unknown,
47+
"unknown": TerminationCondition.unknown
48+
}
49+
poek2pyomo_solution_status = \
50+
{
51+
"unknown": SolutionStatus.unknown, #
52+
"no_solution": SolutionStatus.other, # SolutionStatus.noSolution
53+
"infeasible": SolutionStatus.infeasible, # SolutionStatus.infeasible
54+
"feasible": SolutionStatus.feasible, # SolutionStatus.feasible
55+
"optimal": SolutionStatus.optimal # SolutionStatus.optimal
56+
}
57+
2758

2859
class MySolutionLoader(SolutionLoader):
2960
def get_primals(self, vars_to_load=None):
@@ -153,12 +184,14 @@ def solve(self, model: _BlockData, timer: HierarchicalTimer = None) -> Results:
153184
# WARNING - This information needs to be pulled from the coek solver
154185
res = Results()
155186
res.solution_loader = self.solution_loader
156-
res.termination_condition = TerminationCondition.optimal
157-
if self._poek_model:
187+
res.termination_condition = poek2pyomo_termination_condition[_res.termination_condition]
188+
res.solution_status = poek2pyomo_solution_status[_res.solution_status]
189+
if pk.check_optimal_termination(_res):
158190
res.best_feasible_objective = self._poek_model.get_objective().value
159-
res.best_objective_bound = self._poek_model.get_objective().value
160-
elif self._poek_nlp_model:
161-
res.best_feasible_objective = self._poek_nlp_model.get_objective().value
191+
if self._poek_model:
192+
res.best_objective_bound = _res.objective_bound
193+
elif self._poek_nlp_model:
194+
pass
162195
return res
163196

164197
# WEH - This is a hack

0 commit comments

Comments
 (0)