From 0275051cc7c391bb92c370397f0c9fbda75eb7cd Mon Sep 17 00:00:00 2001 From: Ivet Galabova Date: Tue, 4 Feb 2025 15:49:00 +0000 Subject: [PATCH] WIP --- src/mip/HighsMipSolver.cpp | 8 ++++++-- src/mip/HighsMipWorker.cpp | 20 +++++++++++--------- src/mip/HighsMipWorker.h | 6 +++--- src/mip/HighsSearch.cpp | 20 ++++++++++++++------ src/mip/HighsSearch.h | 16 +++++++++++----- 5 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/mip/HighsMipSolver.cpp b/src/mip/HighsMipSolver.cpp index f8cb26bd20..0c0f3e118a 100644 --- a/src/mip/HighsMipSolver.cpp +++ b/src/mip/HighsMipSolver.cpp @@ -237,7 +237,8 @@ void HighsMipSolver::run() { const HighsInt mip_search_concurrency = options_mip_->mip_search_concurrency; const HighsInt num_worker = mip_search_concurrency - 1; - HighsSearch master_search{*this, mipdata_->pseudocost}; + HighsMipWorker main_worker(*this); + HighsSearch master_search{main_worker, mipdata_->pseudocost}; mipdata_->debugSolution.registerDomain(master_search.getLocalDomain()); HighsSeparation sepa(*this); @@ -304,17 +305,20 @@ void HighsMipSolver::run() { // *options_mip_, *model_, null_solution, false, 0}); // HighsMipSolver& worker_mipsolver = worker_mipsolvers[iSearch]; - HighsMipSolver& worker_mipsolver = mipworkers[iSearch].getMipSolver(); + const HighsMipSolver& worker_mipsolver = mipworkers[iSearch].getMipSolver(); worker_mipsolver.rootbasis = this->rootbasis; HighsPseudocostInitialization pscostinit(mipdata_->pseudocost, 1); worker_mipsolver.pscostinit = &pscostinit; worker_mipsolver.clqtableinit = &mipdata_->cliquetable; worker_mipsolver.implicinit = &mipdata_->implications; + worker_mipsolver.mipdata_ = decltype(mipdata_)(new HighsMipSolverData(*this)); + worker_searches.push_back( HighsSearch{worker_mipsolver, worker_mipsolver.mipdata_->pseudocost}); + worker_lps.push_back(HighsLpRelaxation{mipdata_->lp}); worker_searches[iSearch].setLpRelaxation(&worker_lps[iSearch]); concurrent_searches.push_back(&worker_searches[iSearch]); diff --git a/src/mip/HighsMipWorker.cpp b/src/mip/HighsMipWorker.cpp index 6cb5aae904..8504f7d4ec 100644 --- a/src/mip/HighsMipWorker.cpp +++ b/src/mip/HighsMipWorker.cpp @@ -9,17 +9,19 @@ HighsMipWorker::HighsMipWorker(const HighsMipSolver& mipsolver__) : mipsolver_(mipsolver__), - lprelaxation_(mipsolver__), - cutpool_(mipsolver__.numCol(), mipsolver__.options_mip_->mip_pool_age_limit, + lprelaxation_(mipsolver__), + cutpool_(mipsolver__.numCol(), + mipsolver__.options_mip_->mip_pool_age_limit, mipsolver__.options_mip_->mip_pool_soft_limit), conflictpool_(5 * mipsolver__.options_mip_->mip_pool_age_limit, mipsolver__.options_mip_->mip_pool_soft_limit), cliquetable_(mipsolver__.numCol()), - mipsolver(mipsolver__), - pseudocost(mipsolver), - search_(mipsolver, pseudocost) {} + // mipsolver(mipsolver__), + pseudocost(mipsolver__), + search_(mipsolver__, pseudocost) { + // Register cutpool and conflict pool in local search domain. + search_.getLocalDomain().addCutpool(cutpool_); + search_.getLocalDomain().addConflictPool(conflictpool_); +} - -HighsMipSolver& HighsMipWorker::getMipSolver() { - return mipsolver; -} \ No newline at end of file +const HighsMipSolver& HighsMipWorker::getMipSolver() { return mipsolver_; } \ No newline at end of file diff --git a/src/mip/HighsMipWorker.h b/src/mip/HighsMipWorker.h index c752c07ae0..81f7332cd3 100644 --- a/src/mip/HighsMipWorker.h +++ b/src/mip/HighsMipWorker.h @@ -29,7 +29,7 @@ class HighsMipWorker { HighsCliqueTable cliquetable_; // Not sure if this should be here or elsewhere. - HighsMipSolver mipsolver; + // HighsMipSolver mipsolver; // Not sure if this should be here or in HighsSearch. HighsPseudocost pseudocost; @@ -37,9 +37,9 @@ class HighsMipWorker { HighsSearch search_; public: - HighsMipWorker(const HighsMipSolver& mipsolver); + HighsMipWorker(const HighsMipSolver& mipsolver__); - HighsMipSolver& getMipSolver(); + const HighsMipSolver& getMipSolver(); }; #endif diff --git a/src/mip/HighsSearch.cpp b/src/mip/HighsSearch.cpp index 03448e66a4..3f686c2355 100644 --- a/src/mip/HighsSearch.cpp +++ b/src/mip/HighsSearch.cpp @@ -15,10 +15,12 @@ #include "mip/HighsMipSolverData.h" #include "mip/MipTimer.h" -HighsSearch::HighsSearch(HighsMipSolver& mipsolver, HighsPseudocost& pseudocost) - : mipsolver(mipsolver), +// HighsSearch::HighsSearch(const HighsMipSolver& mipsolver, HighsPseudocost& pseudocost) +HighsSearch::HighsSearch(HighsMipWorker& mipworker, HighsPseudocost& pseudocost) + : mipworker(mipworker), + mipsolver(mipworker.getMipSolver()), lp(nullptr), - localdom(mipsolver.mipdata_->domain), + localdom(mipworker.getMipSolver().mipdata_->domain), pseudocost(pseudocost) { nnodes = 0; treeweight = 0.0; @@ -35,8 +37,10 @@ HighsSearch::HighsSearch(HighsMipSolver& mipsolver, HighsPseudocost& pseudocost) break_search_ = false; evaluate_node_global_max_recursion_level_ = 0; evaluate_node_local_max_recursion_level_ = 0; - childselrule = mipsolver.submip ? ChildSelectionRule::kHybridInferenceCost + childselrule = mipworker.getMipSolver().submip ? ChildSelectionRule::kHybridInferenceCost : ChildSelectionRule::kRootSol; + + this->localdom.setDomainChangeStack(std::vector()); } @@ -968,7 +972,9 @@ HighsSearch::NodeResult HighsSearch::evaluateNode( std::max(recursion_level, evaluate_node_local_max_recursion_level_); evaluate_node_global_max_recursion_level_ = std::max(recursion_level, evaluate_node_global_max_recursion_level_); - HighsMipAnalysis& analysis_ = mipsolver.analysis_; + + // IG make a copy? + HighsMipAnalysis analysis_ = mipsolver.analysis_; if (recursion_level == 0) { assert(!analysis_.mipTimerRunning(kMipClockEvaluateNodeInner)); analysis_.mipTimerStart(kMipClockEvaluateNodeInner); @@ -1993,7 +1999,9 @@ void HighsSearch::dive() { break_search_ = false; return; } - HighsMipAnalysis& analysis_ = mipsolver.analysis_; + + // IG make a copy? After const mip solver in highs search. + HighsMipAnalysis analysis_ = mipsolver.analysis_; const HighsOptions* options_mip_ = mipsolver.options_mip_; const bool search_logging = false; if (!mipsolver.submip) { diff --git a/src/mip/HighsSearch.h b/src/mip/HighsSearch.h index 66dbb8b800..08549833ae 100644 --- a/src/mip/HighsSearch.h +++ b/src/mip/HighsSearch.h @@ -15,7 +15,8 @@ #include "mip/HighsConflictPool.h" #include "mip/HighsDomain.h" #include "mip/HighsLpRelaxation.h" -#include "mip/HighsMipSolver.h" +// #include "mip/HighsMipSolver.h" +#include "mip/HighsMipWorker.h" #include "mip/HighsNodeQueue.h" #include "mip/HighsPseudocost.h" #include "mip/HighsSeparation.h" @@ -27,9 +28,13 @@ class HighsImplications; class HighsCliqueTable; class HighsSearch { - HighsMipSolver& mipsolver; + // Make reference constant. + // const HighsMipSolver& mipsolver; + // replace HighsMipSolver with HighsMipWorker - // HighsMipWorker& mipworker; + HighsMipWorker& mipworker; + // points to mipworker.getMipSolver() for minimal changes. + const HighsMipSolver& mipsolver; HighsLpRelaxation* lp; HighsDomain localdom; @@ -148,9 +153,10 @@ class HighsSearch { bool orbitsValidInChildNode(const HighsDomainChange& branchChg) const; public: - HighsSearch(HighsMipSolver& mipsolver, HighsPseudocost& pseudocost); + // HighsSearch(const HighsMipSolver& mipsolver, HighsPseudocost& pseudocost); + HighsSearch(HighsMipWorker& mipworker, HighsPseudocost& pseudocost); - HighsMipSolver* getMipSolver() { return &mipsolver; } + const HighsMipSolver* getMipSolver() { return &(mipworker.getMipSolver()); } void setRINSNeighbourhood(const std::vector& basesol, const std::vector& relaxsol);