Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
galabovaa committed Feb 4, 2025
1 parent f00f5fa commit 0275051
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 25 deletions.
8 changes: 6 additions & 2 deletions src/mip/HighsMipSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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]);
Expand Down
20 changes: 11 additions & 9 deletions src/mip/HighsMipWorker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
const HighsMipSolver& HighsMipWorker::getMipSolver() { return mipsolver_; }
6 changes: 3 additions & 3 deletions src/mip/HighsMipWorker.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,17 @@ 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;

HighsSearch search_;

public:
HighsMipWorker(const HighsMipSolver& mipsolver);
HighsMipWorker(const HighsMipSolver& mipsolver__);

HighsMipSolver& getMipSolver();
const HighsMipSolver& getMipSolver();
};

#endif
20 changes: 14 additions & 6 deletions src/mip/HighsSearch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<HighsDomainChange>());
}

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down
16 changes: 11 additions & 5 deletions src/mip/HighsSearch.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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;
Expand Down Expand Up @@ -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<double>& basesol,
const std::vector<double>& relaxsol);
Expand Down

0 comments on commit 0275051

Please sign in to comment.