Skip to content

Commit 35b5d91

Browse files
feat: termination condition mapping for highs solver (#440)
* feat: termination condition mapping for highs solver * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent d488734 commit 35b5d91

File tree

1 file changed

+27
-4
lines changed

1 file changed

+27
-4
lines changed

linopy/solvers.py

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

839860
if log_fn is not None:
840861
self.solver_options["log_file"] = path_to_string(log_fn)
@@ -850,10 +871,12 @@ def _solve(
850871

851872
h.run()
852873

853-
condition = h.modelStatusToString(h.getModelStatus()).lower()
854-
termination_condition = CONDITION_MAP.get(condition, condition)
874+
condition = h.getModelStatus()
875+
termination_condition = CONDITION_MAP.get(
876+
condition, TerminationCondition.unknown
877+
)
855878
status = Status.from_termination_condition(termination_condition)
856-
status.legacy_status = condition
879+
status.legacy_status = h.modelStatusToString(condition)
857880

858881
if basis_fn:
859882
h.writeBasis(path_to_string(basis_fn))

0 commit comments

Comments
 (0)