|
21 | 21 | #include <vector> |
22 | 22 |
|
23 | 23 | #include "Highs.h" |
| 24 | +#include "absl/log/log.h" |
24 | 25 | #include "absl/status/status.h" |
25 | 26 | #include "absl/status/statusor.h" |
26 | 27 | #include "absl/strings/str_cat.h" |
@@ -222,43 +223,51 @@ absl::StatusOr<MPSolutionResponse> HighsSolveProto( |
222 | 223 | const absl::Time time_before = absl::Now(); |
223 | 224 | UserTimer user_timer; |
224 | 225 | user_timer.Start(); |
225 | | - HighsStatus run_status = highs.run(); |
226 | | - switch (run_status) { |
227 | | - case HighsStatus::kError: { |
228 | | - response.set_status(MPSOLVER_NOT_SOLVED); |
229 | | - response.set_status_str("Error running HiGHS run()"); |
230 | | - return response; |
231 | | - } |
232 | | - case HighsStatus::kWarning: { |
233 | | - response.set_status_str("Warning HiGHS run()"); |
| 226 | + const HighsStatus run_status = highs.run(); |
| 227 | + VLOG(2) << "run_status: " << highsStatusToString(run_status); |
| 228 | + if (run_status == HighsStatus::kError) { |
| 229 | + response.set_status(MPSOLVER_NOT_SOLVED); |
| 230 | + response.set_status_str("Error running HiGHS run()"); |
| 231 | + return response; |
| 232 | + } |
| 233 | + const HighsModelStatus model_status = highs.getModelStatus(); |
| 234 | + VLOG(2) << "model_status: " << highs.modelStatusToString(model_status); |
| 235 | + |
| 236 | + switch (model_status) { |
| 237 | + case HighsModelStatus::kOptimal: |
| 238 | + response.set_status(MPSOLVER_OPTIMAL); |
| 239 | + break; |
| 240 | + case HighsModelStatus::kUnboundedOrInfeasible: |
| 241 | + response.set_status_str( |
| 242 | + "The model may actually be unbounded: HiGHS returned " |
| 243 | + "kUnboundedOrInfeasible"); |
| 244 | + response.set_status(MPSOLVER_INFEASIBLE); |
| 245 | + break; |
| 246 | + case HighsModelStatus::kInfeasible: |
| 247 | + response.set_status(MPSOLVER_INFEASIBLE); |
| 248 | + break; |
| 249 | + case HighsModelStatus::kUnbounded: |
| 250 | + response.set_status(MPSOLVER_UNBOUNDED); |
| 251 | + break; |
| 252 | + case HighsModelStatus::kTimeLimit: // ABSL_FALLTHROUGH_INTENDED |
| 253 | + case HighsModelStatus::kIterationLimit: // ABSL_FALLTHROUGH_INTENDED |
| 254 | + case HighsModelStatus::kInterrupt: // ABSL_FALLTHROUGH_INTENDED |
| 255 | + case HighsModelStatus::kSolutionLimit: // ABSL_FALLTHROUGH_INTENDED |
| 256 | + case HighsModelStatus::kMemoryLimit: { |
| 257 | + const HighsInfo& info = highs.getInfo(); |
| 258 | + if (info.primal_solution_status == kSolutionStatusFeasible) { |
| 259 | + response.set_status(MPSOLVER_FEASIBLE); |
| 260 | + } else { |
| 261 | + response.set_status(MPSOLVER_UNKNOWN_STATUS); |
| 262 | + } |
234 | 263 | break; |
235 | 264 | } |
236 | | - case HighsStatus::kOk: { |
237 | | - HighsModelStatus model_status = highs.getModelStatus(); |
238 | | - switch (model_status) { |
239 | | - case HighsModelStatus::kOptimal: |
240 | | - response.set_status(MPSOLVER_OPTIMAL); |
241 | | - break; |
242 | | - case HighsModelStatus::kUnboundedOrInfeasible: |
243 | | - response.set_status_str( |
244 | | - "The model may actually be unbounded: HiGHS returned " |
245 | | - "kUnboundedOrInfeasible"); |
246 | | - response.set_status(MPSOLVER_INFEASIBLE); |
247 | | - break; |
248 | | - case HighsModelStatus::kInfeasible: |
249 | | - response.set_status(MPSOLVER_INFEASIBLE); |
250 | | - break; |
251 | | - case HighsModelStatus::kUnbounded: |
252 | | - response.set_status(MPSOLVER_UNBOUNDED); |
253 | | - break; |
254 | | - default: { |
255 | | - // TODO(user): report feasible status. |
256 | | - const HighsInfo& info = highs.getInfo(); |
257 | | - if (info.primal_solution_status == kSolutionStatusFeasible) |
258 | | - response.set_status(MPSOLVER_FEASIBLE); |
259 | | - break; |
260 | | - } |
| 265 | + default: { |
| 266 | + const HighsInfo& info = highs.getInfo(); |
| 267 | + if (info.primal_solution_status == kSolutionStatusFeasible) { |
| 268 | + response.set_status(MPSOLVER_FEASIBLE); |
261 | 269 | } |
| 270 | + break; |
262 | 271 | } |
263 | 272 | } |
264 | 273 |
|
|
0 commit comments