From c6277970ce3c92d6590b576f59191fb8afe3730a Mon Sep 17 00:00:00 2001 From: Robert Schwarz Date: Fri, 28 Mar 2025 22:26:09 +0100 Subject: [PATCH 1/2] check status on Highs_getColIntegrality (fail some tests) --- mip/highs.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mip/highs.py b/mip/highs.py index d7325d25..bc9c7ec1 100644 --- a/mip/highs.py +++ b/mip/highs.py @@ -678,6 +678,7 @@ def check(status): if status == STATUS_ERROR: raise mip.InterfacingError("Unknown error in call to HiGHS.") + return status class SolverHighs(mip.Solver): @@ -1432,11 +1433,9 @@ def var_set_obj(self: "SolverHighs", var: "mip.Var", value: numbers.Real): def var_get_var_type(self: "SolverHighs", var: "mip.Var") -> str: var_type = ffi.new("int*") - ret = self._lib.Highs_getColIntegrality(self._model, var.idx, var_type) + check(self._lib.Highs_getColIntegrality(self._model, var.idx, var_type)) if var_type[0] not in self._highs_type_map: - raise ValueError( - f"Invalid variable type returned by HiGHS: {var_type[0]} (ret={ret})" - ) + raise ValueError(f"Invalid variable type returned by HiGHS: {var_type[0]}.") return self._highs_type_map[var_type[0]] def var_set_var_type(self: "SolverHighs", var: "mip.Var", value: str): From 77e973a7f3f182beb1b0eb0a8168e818cf5fcce1 Mon Sep 17 00:00:00 2001 From: Robert Schwarz Date: Fri, 28 Mar 2025 22:30:17 +0100 Subject: [PATCH 2/2] work around unexpected Highs_getColIntegrality error --- mip/highs.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mip/highs.py b/mip/highs.py index bc9c7ec1..2399c373 100644 --- a/mip/highs.py +++ b/mip/highs.py @@ -1432,6 +1432,11 @@ def var_set_obj(self: "SolverHighs", var: "mip.Var", value: numbers.Real): check(self._lib.Highs_changeColCost(self._model, var.idx, value)) def var_get_var_type(self: "SolverHighs", var: "mip.Var") -> str: + # Highs_getColIntegrality only works if some variable is not continuous. + # Since we want this method to always work, we need to catch this case first. + if self._num_int_vars == 0: + return mip.CONTINUOUS + var_type = ffi.new("int*") check(self._lib.Highs_getColIntegrality(self._model, var.idx, var_type)) if var_type[0] not in self._highs_type_map: