diff --git a/src/Highs.h b/src/Highs.h index 451312a494..d5ce465b1d 100644 --- a/src/Highs.h +++ b/src/Highs.h @@ -21,9 +21,9 @@ #include "lp_data/HighsRanging.h" #include "lp_data/HighsSolutionDebug.h" #include "model/HighsModel.h" -#include "util/HighsExceptions.h" #include "presolve/ICrash.h" #include "presolve/PresolveComponent.h" +#include "util/HighsExceptions.h" /** * @brief Return the version diff --git a/src/presolve/HPresolve.cpp b/src/presolve/HPresolve.cpp index 08aa0fef18..16cbcaf1cb 100644 --- a/src/presolve/HPresolve.cpp +++ b/src/presolve/HPresolve.cpp @@ -3685,10 +3685,18 @@ HPresolve::Result HPresolve::rowPresolve(HighsPostsolveStack& postsolve_stack, // assert(non_fractional); if (!non_fractional) return Result::kPrimalInfeasible; } - postsolve_stack.fixedColAtLower(nonzero.index(), - model->col_lower_[nonzero.index()], - model->col_cost_[nonzero.index()], - getColumnVector(nonzero.index())); + try { + postsolve_stack.fixedColAtLower( + nonzero.index(), model->col_lower_[nonzero.index()], + model->col_cost_[nonzero.index()], + getColumnVector(nonzero.index())); + } catch (const DataStackOverflow& e) { + highsLogUser(options->log_options, HighsLogType::kError, + "Problem too large for Presolve, try without\n"); + highsLogUser(options->log_options, HighsLogType::kInfo, + "Specific error raised:\n%s\n", e.what()); + return Result::kPrimalInfeasible; + } if (model->col_upper_[nonzero.index()] > model->col_lower_[nonzero.index()]) changeColUpper(nonzero.index(), diff --git a/src/util/HighsDataStack.h b/src/util/HighsDataStack.h index b52c11251f..2eecffff1c 100644 --- a/src/util/HighsDataStack.h +++ b/src/util/HighsDataStack.h @@ -52,6 +52,7 @@ class HighsDataStack { } std::memcpy(data.data() + dataSize, &r, sizeof(T)); } + template ::type = 0> void pop(T& r) { diff --git a/src/util/HighsExceptions.h b/src/util/HighsExceptions.h index 69f28e627c..110b27034f 100644 --- a/src/util/HighsExceptions.h +++ b/src/util/HighsExceptions.h @@ -2,7 +2,7 @@ #include class DataStackOverflow : public std::runtime_error { -public: - explicit DataStackOverflow(const std::string& msg) - : std::runtime_error(msg) {} + public: + explicit DataStackOverflow(const std::string& msg) + : std::runtime_error(msg) {} };