Skip to content

Commit b55bac2

Browse files
committed
feat: termination condition mapping for highs solver
1 parent 67e13a1 commit b55bac2

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

linopy/solvers.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -828,7 +828,28 @@ def _solve(
828828
-------
829829
Result
830830
"""
831-
CONDITION_MAP: dict[str, str] = {}
831+
# https://ergo-code.github.io/HiGHS/dev/structures/enums/#HighsModelStatus
832+
CONDITION_MAP: dict[highspy.HighsModelStatus, TerminationCondition] = {
833+
highspy.HighsModelStatus.kNotset: TerminationCondition.unknown,
834+
highspy.HighsModelStatus.kLoadError: TerminationCondition.internal_solver_error,
835+
highspy.HighsModelStatus.kModelError: TerminationCondition.internal_solver_error,
836+
highspy.HighsModelStatus.kPresolveError: TerminationCondition.internal_solver_error,
837+
highspy.HighsModelStatus.kSolveError: TerminationCondition.internal_solver_error,
838+
highspy.HighsModelStatus.kPostsolveError: TerminationCondition.internal_solver_error,
839+
highspy.HighsModelStatus.kModelEmpty: TerminationCondition.unknown,
840+
highspy.HighsModelStatus.kMemoryLimit: TerminationCondition.resource_interrupt,
841+
highspy.HighsModelStatus.kOptimal: TerminationCondition.optimal,
842+
highspy.HighsModelStatus.kInfeasible: TerminationCondition.infeasible,
843+
highspy.HighsModelStatus.kUnboundedOrInfeasible: TerminationCondition.infeasible_or_unbounded,
844+
highspy.HighsModelStatus.kUnbounded: TerminationCondition.unbounded,
845+
highspy.HighsModelStatus.kObjectiveBound: TerminationCondition.terminated_by_limit,
846+
highspy.HighsModelStatus.kObjectiveTarget: TerminationCondition.terminated_by_limit,
847+
highspy.HighsModelStatus.kTimeLimit: TerminationCondition.time_limit,
848+
highspy.HighsModelStatus.kIterationLimit: TerminationCondition.iteration_limit,
849+
highspy.HighsModelStatus.kSolutionLimit: TerminationCondition.terminated_by_limit,
850+
highspy.HighsModelStatus.kInterrupt: TerminationCondition.user_interrupt,
851+
highspy.HighsModelStatus.kUnknown: TerminationCondition.unknown,
852+
}
832853

833854
if log_fn is not None:
834855
self.solver_options["log_file"] = path_to_string(log_fn)
@@ -844,10 +865,10 @@ def _solve(
844865

845866
h.run()
846867

847-
condition = h.modelStatusToString(h.getModelStatus()).lower()
848-
termination_condition = CONDITION_MAP.get(condition, condition)
868+
condition = h.getModelStatus()
869+
termination_condition = CONDITION_MAP.get(condition, TerminationCondition.unknown)
849870
status = Status.from_termination_condition(termination_condition)
850-
status.legacy_status = condition
871+
status.legacy_status = h.modelStatusToString(condition)
851872

852873
if basis_fn:
853874
h.writeBasis(path_to_string(basis_fn))

0 commit comments

Comments
 (0)