Skip to content

Commit

Permalink
Some DS in place
Browse files Browse the repository at this point in the history
  • Loading branch information
galabovaa committed Feb 4, 2025
1 parent 0275051 commit 37735a6
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 47 deletions.
49 changes: 29 additions & 20 deletions src/mip/HighsMipSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,10 @@ void HighsMipSolver::run() {
const HighsInt num_worker = mip_search_concurrency - 1;

HighsMipWorker main_worker(*this);
HighsSearch master_search{main_worker, mipdata_->pseudocost};

// HighsSearch master_search{main_worker, mipdata_->pseudocost};

HighsSearch master_search{*this, mipdata_->pseudocost};

mipdata_->debugSolution.registerDomain(master_search.getLocalDomain());
HighsSeparation sepa(*this);
Expand Down Expand Up @@ -280,6 +283,7 @@ void HighsMipSolver::run() {
double lowerBoundLastCheck = mipdata_->lower_bound;
analysis_.mipTimerStart(kMipClockSearch);
const bool search_logging = false;

while (master_search.hasNode()) {
// Set up multiple, HighsMipSolver, HighsSearch and
// HighsLpRelaxation instances for the parallel search,
Expand All @@ -289,10 +293,13 @@ void HighsMipSolver::run() {
// std::vector<HighsMipSolver> worker_mipsolvers;
std::vector<HighsMipWorker> mipworkers;

std::vector<HighsSearch> worker_searches;
std::vector<HighsLpRelaxation> worker_lps;
// std::vector<HighsSearch> worker_searches;
// std::vector<HighsLpRelaxation> worker_lps;

std::vector<HighsSearch*> concurrent_searches;

concurrent_searches.push_back(&master_search);

for (HighsInt iSearch = 0; iSearch < num_worker; iSearch++) {

// worker_mipsolvers.push_back(HighsMipSolver{*this});
Expand All @@ -307,30 +314,32 @@ void HighsMipSolver::run() {
// HighsMipSolver& worker_mipsolver = worker_mipsolvers[iSearch];
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]);
// Do we need root basis?
// worker_mipsolver.rootbasis = this->rootbasis;

// Moved these into HighsMipWorker.
// HighsPseudocostInitialization pscostinit(mipdata_->pseudocost, 1);
// mipworker.pscostinit = &pscostinit;
// mipworker.clqtableinit = &mipdata_->cliquetable;
// mipworker.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(&(mipworkers[iSearch].getSearch()));
}

// assert(worker_mipsolvers.size() == num_worker);
assert(mipworkers.size() == num_worker);

assert(worker_searches.size() == num_worker);
// assert(worker_searches.size() == num_worker);
assert(concurrent_searches.size() == mip_search_concurrency);

HighsSearch& worker_search = worker_searches[0];
HighsSearch& worker_search = mipworkers[0].getSearch();

// Lambda for combining limit_reached across searches
auto limitReached = [&]() -> bool {
Expand Down
22 changes: 19 additions & 3 deletions src/mip/HighsMipWorker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,27 @@ HighsMipWorker::HighsMipWorker(const HighsMipSolver& mipsolver__)
mipsolver__.options_mip_->mip_pool_soft_limit),
cliquetable_(mipsolver__.numCol()),
// mipsolver(mipsolver__),
pseudocost(mipsolver__),
search_(mipsolver__, pseudocost) {
pseudocost_(mipsolver__),
// search_(*this, pseudocost_),
search_(mipsolver_, pseudocost_),

pscostinit_(pseudocost_, 1),
clqtableinit_(mipsolver_.numCol()),
implicinit_(mipsolver_),

pscostinit(pscostinit_),
implicinit(implicinit_),
clqtableinit(clqtableinit_) {

// Register cutpool and conflict pool in local search domain.
search_.getLocalDomain().addCutpool(cutpool_);
search_.getLocalDomain().addConflictPool(conflictpool_);

// Initialize mipdata_.
// mipdata_ = decltype(mipdata_)(new HighsMipSolverData(mipsolver__));
// mipdata_->init();
}

const HighsMipSolver& HighsMipWorker::getMipSolver() { return mipsolver_; }
const HighsMipSolver& HighsMipWorker::getMipSolver() { return mipsolver_; }

HighsSearch& HighsMipWorker::getSearch() { return search_; }
37 changes: 28 additions & 9 deletions src/mip/HighsMipWorker.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,19 @@
#include "mip/HighsCliqueTable.h"
#include "mip/HighsConflictPool.h"
#include "mip/HighsCutPool.h"
//#include "mip/HighsDomain.h"

// #include "mip/HighsDomain.h"
#include "mip/HighsImplications.h"

#include "mip/HighsLpRelaxation.h"
#include "mip/HighsMipSolver.h"
#include "mip/HighsSearch.h"
//#include "mip/HighsNodeQueue.h"
//#include "mip/HighsPseudocost.h"
//#include "mip/HighsSeparation.h"
//#include "presolve/HighsSymmetry.h"
//#include "util/HighsHash.h"

// #include "mip/HighsNodeQueue.h"
// #include "mip/HighsPseudocost.h"
// #include "mip/HighsSeparation.h"
// #include "presolve/HighsSymmetry.h"
// #include "util/HighsHash.h"

class HighsMipWorker {
const HighsMipSolver& mipsolver_;
Expand All @@ -32,14 +36,29 @@ class HighsMipWorker {
// HighsMipSolver mipsolver;

// Not sure if this should be here or in HighsSearch.
HighsPseudocost pseudocost;
HighsPseudocost pseudocost_;

HighsSearch search_;

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

const HighsMipSolver& getMipSolver();

HighsSearch& getSearch();

// members for worker threads.
HighsPseudocostInitialization pscostinit_;
HighsCliqueTable clqtableinit_;
HighsImplications implicinit_;

// References to members, initialized to local objects for worker threads,
// modify to mip solver for main worker.
HighsPseudocostInitialization& pscostinit;
HighsCliqueTable& clqtableinit;
HighsImplications& implicinit;

// std::unique_ptr<HighsMipSolverData> mipdata_;
};

#endif
20 changes: 13 additions & 7 deletions src/mip/HighsSearch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,15 @@
#include "mip/HighsMipSolverData.h"
#include "mip/MipTimer.h"

// HighsSearch::HighsSearch(const HighsMipSolver& mipsolver, HighsPseudocost& pseudocost)
HighsSearch::HighsSearch(HighsMipWorker& mipworker, HighsPseudocost& pseudocost)
: mipworker(mipworker),
mipsolver(mipworker.getMipSolver()),
// HighsSearch::HighsSearch(HighsMipWorker& mipworker, HighsPseudocost& pseudocost)
// : mipworker(mipworker),
// mipsolver(mipworker.getMipSolver()),
// localdom(mipworker.getMipSolver().mipdata_->domain),

HighsSearch::HighsSearch(const HighsMipSolver& mipsolver, HighsPseudocost& pseudocost)
: mipsolver(mipsolver),
lp(nullptr),
localdom(mipworker.getMipSolver().mipdata_->domain),
localdom(mipsolver.mipdata_->domain),
pseudocost(pseudocost) {
nnodes = 0;
treeweight = 0.0;
Expand All @@ -37,9 +40,12 @@ HighsSearch::HighsSearch(HighsMipWorker& mipworker, HighsPseudocost& pseudocost)
break_search_ = false;
evaluate_node_global_max_recursion_level_ = 0;
evaluate_node_local_max_recursion_level_ = 0;
childselrule = mipworker.getMipSolver().submip ? ChildSelectionRule::kHybridInferenceCost

childselrule = mipsolver.submip ? ChildSelectionRule::kHybridInferenceCost
: ChildSelectionRule::kRootSol;


// childselrule = mipworker.getMipSolver().submip ? ChildSelectionRule::kHybridInferenceCost
// : ChildSelectionRule::kRootSol;

this->localdom.setDomainChangeStack(std::vector<HighsDomainChange>());
}
Expand Down
23 changes: 15 additions & 8 deletions src/mip/HighsSearch.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,12 @@
#include "mip/HighsConflictPool.h"
#include "mip/HighsDomain.h"
#include "mip/HighsLpRelaxation.h"
// #include "mip/HighsMipSolver.h"
#include "mip/HighsMipWorker.h"
#include "mip/HighsMipSolver.h"

// Remove for now because HighsSearch is a member of HighsMipSolver.
// Circular include?

// #include "mip/HighsMipWorker.h"
#include "mip/HighsNodeQueue.h"
#include "mip/HighsPseudocost.h"
#include "mip/HighsSeparation.h"
Expand All @@ -29,12 +33,12 @@ class HighsCliqueTable;

class HighsSearch {
// Make reference constant.
// const HighsMipSolver& mipsolver;
const HighsMipSolver& mipsolver;

// replace HighsMipSolver with HighsMipWorker
HighsMipWorker& mipworker;
// HighsMipWorker& mipworker;
// points to mipworker.getMipSolver() for minimal changes.
const HighsMipSolver& mipsolver;
// const HighsMipSolver& mipsolver;

HighsLpRelaxation* lp;
HighsDomain localdom;
Expand Down Expand Up @@ -153,10 +157,13 @@ class HighsSearch {
bool orbitsValidInChildNode(const HighsDomainChange& branchChg) const;

public:
// HighsSearch(const HighsMipSolver& mipsolver, HighsPseudocost& pseudocost);
HighsSearch(HighsMipWorker& mipworker, HighsPseudocost& pseudocost);
HighsSearch(const HighsMipSolver& mipsolver, HighsPseudocost& pseudocost);

// HighsSearch(HighsMipWorker& mipworker, HighsPseudocost& pseudocost);

const HighsMipSolver* getMipSolver() { return &mipsolver; }

const HighsMipSolver* getMipSolver() { return &(mipworker.getMipSolver()); }
// const HighsMipSolver* getMipSolver() { return &(mipworker.getMipSolver()); }

void setRINSNeighbourhood(const std::vector<double>& basesol,
const std::vector<double>& relaxsol);
Expand Down

0 comments on commit 37735a6

Please sign in to comment.