From b4a09e1d4dcb1ccd8f35130da9a52384b44b0f69 Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Mon, 30 Jun 2025 11:14:04 +0200 Subject: [PATCH 1/6] Add max degeneracyFactor --- highs/mip/HighsSearch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/highs/mip/HighsSearch.cpp b/highs/mip/HighsSearch.cpp index 0473b73c1fd..dacf2a00ca5 100644 --- a/highs/mip/HighsSearch.cpp +++ b/highs/mip/HighsSearch.cpp @@ -1208,7 +1208,7 @@ HighsSearch::NodeResult HighsSearch::branch() { } } - double degeneracyFac = lp->computeLPDegneracy(localdom); + double degeneracyFac = std::min(10.0, lp->computeLPDegneracy(localdom)); pseudocost.setDegeneracyFactor(degeneracyFac); if (degeneracyFac >= 10.0) pseudocost.setMinReliable(0); // if (!mipsolver.submip) From 6f930b8dee54f570203a7fb9c95612705ec3d296 Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Mon, 30 Jun 2025 11:24:18 +0200 Subject: [PATCH 2/6] Lower parallelism filter threshold --- highs/mip/HighsCutPool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/highs/mip/HighsCutPool.cpp b/highs/mip/HighsCutPool.cpp index 067c6bc7c2c..10f10fce016 100644 --- a/highs/mip/HighsCutPool.cpp +++ b/highs/mip/HighsCutPool.cpp @@ -317,7 +317,7 @@ void HighsCutPool::separate(const std::vector& sol, HighsDomain& domain, for (const std::pair& p : efficacious_cuts) { bool discard = false; - double maxpar = 0.1; + double maxpar = 0.05; for (HighsInt k : cutset.cutindices) { if (getParallelism(k, p.second) > maxpar) { discard = true; From 181132e23150a0f442e702d91eed16cc0eb344bd Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Mon, 30 Jun 2025 11:24:36 +0200 Subject: [PATCH 3/6] Lower bound change acceptance threshold --- highs/mip/HighsDomain.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/highs/mip/HighsDomain.cpp b/highs/mip/HighsDomain.cpp index 50118c49614..8bf6ecc6227 100644 --- a/highs/mip/HighsDomain.cpp +++ b/highs/mip/HighsDomain.cpp @@ -62,7 +62,7 @@ static inline double boundRange(double upper_bound, double lower_bound, double tolerance, HighsVarType var_type) { double range = upper_bound - lower_bound; return range - (var_type == HighsVarType::kContinuous - ? std::max(0.3 * range, 1000.0 * tolerance) + ? std::max(0.15 * range, 1000.0 * tolerance) : tolerance); } @@ -1353,7 +1353,7 @@ double HighsDomain::adjustedUb(HighsInt col, HighsCDouble boundVal, else relativeImprove /= std::max(std::fabs(col_upper_[col]), std::fabs(bound)); - accept = relativeImprove >= 0.3; + accept = relativeImprove >= 0.15; } else accept = false; } @@ -1385,7 +1385,7 @@ double HighsDomain::adjustedLb(HighsInt col, HighsCDouble boundVal, else relativeImprove /= std::max(std::fabs(col_lower_[col]), std::fabs(bound)); - accept = relativeImprove >= 0.3; + accept = relativeImprove >= 0.15; } else accept = false; } From 64b1a3d94c122034a74f50eaf846ac7f67ae48ea Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Tue, 1 Jul 2025 12:09:13 +0200 Subject: [PATCH 4/6] Revert parallelism threshold change --- highs/mip/HighsCutPool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/highs/mip/HighsCutPool.cpp b/highs/mip/HighsCutPool.cpp index 10f10fce016..067c6bc7c2c 100644 --- a/highs/mip/HighsCutPool.cpp +++ b/highs/mip/HighsCutPool.cpp @@ -317,7 +317,7 @@ void HighsCutPool::separate(const std::vector& sol, HighsDomain& domain, for (const std::pair& p : efficacious_cuts) { bool discard = false; - double maxpar = 0.05; + double maxpar = 0.1; for (HighsInt k : cutset.cutindices) { if (getParallelism(k, p.second) > maxpar) { discard = true; From 6af72c2e67b5f3640f54c41335fcdd694c4c4bfd Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Tue, 1 Jul 2025 12:23:21 +0200 Subject: [PATCH 5/6] Change domain change threshold from .15 to .2 --- highs/mip/HighsDomain.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/highs/mip/HighsDomain.cpp b/highs/mip/HighsDomain.cpp index 8bf6ecc6227..0aca5e2bb5c 100644 --- a/highs/mip/HighsDomain.cpp +++ b/highs/mip/HighsDomain.cpp @@ -62,7 +62,7 @@ static inline double boundRange(double upper_bound, double lower_bound, double tolerance, HighsVarType var_type) { double range = upper_bound - lower_bound; return range - (var_type == HighsVarType::kContinuous - ? std::max(0.15 * range, 1000.0 * tolerance) + ? std::max(0.2 * range, 1000.0 * tolerance) : tolerance); } @@ -1353,7 +1353,7 @@ double HighsDomain::adjustedUb(HighsInt col, HighsCDouble boundVal, else relativeImprove /= std::max(std::fabs(col_upper_[col]), std::fabs(bound)); - accept = relativeImprove >= 0.15; + accept = relativeImprove >= 0.2; } else accept = false; } @@ -1385,7 +1385,7 @@ double HighsDomain::adjustedLb(HighsInt col, HighsCDouble boundVal, else relativeImprove /= std::max(std::fabs(col_lower_[col]), std::fabs(bound)); - accept = relativeImprove >= 0.15; + accept = relativeImprove >= 0.2; } else accept = false; } From 629c4b82ce932810d6b92e97310bb3cdc68427e6 Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Wed, 13 Aug 2025 18:53:22 +0200 Subject: [PATCH 6/6] Add const_boundchg_threshold --- highs/mip/HighsDomain.cpp | 7 ++++--- highs/mip/HighsDomain.h | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/highs/mip/HighsDomain.cpp b/highs/mip/HighsDomain.cpp index 0aca5e2bb5c..54fff69a9bf 100644 --- a/highs/mip/HighsDomain.cpp +++ b/highs/mip/HighsDomain.cpp @@ -62,7 +62,8 @@ static inline double boundRange(double upper_bound, double lower_bound, double tolerance, HighsVarType var_type) { double range = upper_bound - lower_bound; return range - (var_type == HighsVarType::kContinuous - ? std::max(0.2 * range, 1000.0 * tolerance) + ? std::max(HighsDomain::cont_boundchg_threshold * range, + 1000.0 * tolerance) : tolerance); } @@ -1353,7 +1354,7 @@ double HighsDomain::adjustedUb(HighsInt col, HighsCDouble boundVal, else relativeImprove /= std::max(std::fabs(col_upper_[col]), std::fabs(bound)); - accept = relativeImprove >= 0.2; + accept = relativeImprove >= cont_boundchg_threshold; } else accept = false; } @@ -1385,7 +1386,7 @@ double HighsDomain::adjustedLb(HighsInt col, HighsCDouble boundVal, else relativeImprove /= std::max(std::fabs(col_lower_[col]), std::fabs(bound)); - accept = relativeImprove >= 0.2; + accept = relativeImprove >= cont_boundchg_threshold; } else accept = false; } diff --git a/highs/mip/HighsDomain.h b/highs/mip/HighsDomain.h index 5321a2199d2..d928ce6ab5b 100644 --- a/highs/mip/HighsDomain.h +++ b/highs/mip/HighsDomain.h @@ -339,6 +339,8 @@ class HighsDomain { std::vector col_lower_; std::vector col_upper_; + static constexpr double cont_boundchg_threshold = 0.2; + HighsDomain(HighsMipSolver& mipsolver); HighsDomain(const HighsDomain& other)