|
19 | 19 | from pyomo_coek.components_only.constraint import Constraint
|
20 | 20 | from pyomo_coek.components_only.variable import Var
|
21 | 21 |
|
| 22 | +from pyomo.opt.results.solution import SolutionStatus |
| 23 | +from pyomo.opt.results.solver import TerminationCondition |
22 | 24 |
|
23 | 25 | _nlp_solvers = {
|
24 | 26 | "ipopt",
|
25 | 27 | }
|
26 | 28 |
|
| 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 | + |
27 | 58 |
|
28 | 59 | class MySolutionLoader(SolutionLoader):
|
29 | 60 | def get_primals(self, vars_to_load=None):
|
@@ -153,12 +184,14 @@ def solve(self, model: _BlockData, timer: HierarchicalTimer = None) -> Results:
|
153 | 184 | # WARNING - This information needs to be pulled from the coek solver
|
154 | 185 | res = Results()
|
155 | 186 | 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): |
158 | 190 | 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 |
162 | 195 | return res
|
163 | 196 |
|
164 | 197 | # WEH - This is a hack
|
|
0 commit comments