Skip to content

Commit

Permalink
Need independent HighsLpRelaxation instances and mipdata_ = decltype(…
Browse files Browse the repository at this point in the history
…mipdata_)(new HighsMipSolverData(*this)); for each HighsSearch
  • Loading branch information
jajhall committed Feb 10, 2025
1 parent ca95a2f commit e5d28df
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 25 deletions.
4 changes: 2 additions & 2 deletions src/lp_data/HighsOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -769,7 +769,7 @@ class HighsOptions : public HighsOptionsStruct {
record_int = new OptionRecordInt(
"highs_analysis_level", "Analysis level in HiGHS", now_advanced,
&highs_analysis_level, kHighsAnalysisLevelMin,
kHighsAnalysisLevelMin,// kHighsAnalysisLevelMipTime, //
kHighsAnalysisLevelMin, // kHighsAnalysisLevelMipTime, //
kHighsAnalysisLevelMax);
records.push_back(record_int);

Expand Down Expand Up @@ -854,7 +854,7 @@ class HighsOptions : public HighsOptionsStruct {

record_bool = new OptionRecordBool(
"timeless_log", "Suppression of time-based data in logging", true,
&timeless_log, true);//false); //
&timeless_log, true); // false); //
records.push_back(record_bool);

record_string =
Expand Down
21 changes: 11 additions & 10 deletions src/mip/HighsMipSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,6 @@ void HighsMipSolver::run() {
concurrent_searches.push_back(&master_search);

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

// worker_mipsolvers.push_back(HighsMipSolver{*this});
mipworkers.push_back(HighsMipWorker(*this));

Expand All @@ -308,7 +307,8 @@ void HighsMipSolver::run() {
// *options_mip_, *model_, null_solution, false, 0});

// HighsMipSolver& worker_mipsolver = worker_mipsolvers[iSearch];
const HighsMipSolver& worker_mipsolver = mipworkers[iSearch].getMipSolver();
const HighsMipSolver& worker_mipsolver =
mipworkers[iSearch].getMipSolver();

// Do we need root basis?
// worker_mipsolver.rootbasis = this->rootbasis;
Expand All @@ -322,7 +322,8 @@ void HighsMipSolver::run() {
// worker_mipsolver.mipdata_ =
// decltype(mipdata_)(new HighsMipSolverData(*this));

// worker_searches.push_back( HighsSearch{worker_mipsolver, worker_mipsolver.mipdata_->pseudocost});
// 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]);

Expand Down Expand Up @@ -380,10 +381,10 @@ void HighsMipSolver::run() {
//
// if (search.hasNode()) search.dive();
if (iSearch == 0) {
search.dive();
search.dive();
} else if (allow_multiple_dive) {
// if (search.hasNode())
search.dive(iSearch);
// if (search.hasNode())
search.dive(iSearch);
}
assert(iSearch == 0 || !search.performed_dive_);
}
Expand Down Expand Up @@ -584,9 +585,9 @@ void HighsMipSolver::run() {
} // if (!submip && mipdata_->num_nodes >= nextCheck))

// Now perform the node search
const bool multiple_node_search = false;
const bool allow_multiple_node_search = false;
for (HighsInt iSearch = 0; iSearch < mip_search_concurrency; iSearch++) {
if (iSearch > 0 && !multiple_node_search) continue;
if (iSearch > 0 && !allow_multiple_node_search) continue;
HighsSearch& search = *concurrent_searches[iSearch];

// remove the iteration limit when installing a new node
Expand Down Expand Up @@ -986,8 +987,8 @@ void HighsMipSolver::cleanupSolve() {
// Skip this for timeless logging to eliminate diffs with latest
if (!timeless_log)
highsLogUser(options_mip_->log_options, HighsLogType::kInfo,
" Evaluate node max recursion level = %d\n",
int(evaluate_node_max_recursion_level_));
" Evaluate node max recursion level = %d\n",
int(evaluate_node_max_recursion_level_));

if (!timeless_log) analysis_.reportMipTimer();

Expand Down
1 change: 0 additions & 1 deletion src/mip/HighsMipWorker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ HighsMipWorker::HighsMipWorker(const HighsMipSolver& mipsolver__)
pscostinit(pscostinit_),
implicinit(implicinit_),
clqtableinit(clqtableinit_) {

// Register cutpool and conflict pool in local search domain.
search_.getLocalDomain().addCutpool(cutpool_);
search_.getLocalDomain().addConflictPool(conflictpool_);
Expand Down
1 change: 0 additions & 1 deletion src/mip/HighsMipWorker.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

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

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

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

HighsSearch::HighsSearch(const HighsMipSolver& mipsolver, HighsPseudocost& pseudocost)
HighsSearch::HighsSearch(const HighsMipSolver& mipsolver,
HighsPseudocost& pseudocost)
: mipsolver(mipsolver),
lp(nullptr),
localdom(mipsolver.mipdata_->domain),
Expand All @@ -44,7 +46,8 @@ HighsSearch::HighsSearch(const HighsMipSolver& mipsolver, HighsPseudocost& pseud
childselrule = mipsolver.submip ? ChildSelectionRule::kHybridInferenceCost
: ChildSelectionRule::kRootSol;

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

this->localdom.setDomainChangeStack(std::vector<HighsDomainChange>());
Expand Down Expand Up @@ -979,7 +982,7 @@ HighsSearch::NodeResult HighsSearch::evaluateNode(
evaluate_node_global_max_recursion_level_ =
std::max(recursion_level, evaluate_node_global_max_recursion_level_);

// IG make a copy?
// IG make a copy?
HighsMipAnalysis analysis_ = mipsolver.analysis_;
if (recursion_level == 0) {
assert(!analysis_.mipTimerRunning(kMipClockEvaluateNodeInner));
Expand Down Expand Up @@ -2015,18 +2018,19 @@ void HighsSearch::dive(const HighsInt search_id) {

// set iteration limit for each lp solve during the dive to 10 times the
// average nodes
printf("HighsSearch::dive(%d): Address of mipsolver.mipdata_->lp is %p\n", int(search_id), (void *)&mipsolver.mipdata_->lp);
printf("HighsSearch::dive(%d): Address of mipsolver.mipdata_->lp is %p\n",
int(search_id), (void*)&mipsolver.mipdata_->lp);
HighsInt iterlimit = 10 * std::max(mipsolver.mipdata_->lp.getAvgSolveIters(),
mipsolver.mipdata_->avgrootlpiters);
if (!this->hasNode()) return;
performed_dive_ = true;

iterlimit =
std::max({HighsInt{10000}, iterlimit,
HighsInt((3 * mipsolver.mipdata_->firstrootlpiters) / 2)});

mipsolver.mipdata_->lp.setIterationLimit(iterlimit);

if (!this->hasNode()) return;
performed_dive_ = true;

// perform the dive and put the open nodes to the queue
size_t plungestart = mipsolver.mipdata_->num_nodes;
bool considerHeuristics = true;
Expand Down
7 changes: 4 additions & 3 deletions src/mip/HighsSearch.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#include "mip/HighsLpRelaxation.h"
#include "mip/HighsMipSolver.h"

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

// #include "mip/HighsMipWorker.h"
Expand Down Expand Up @@ -163,7 +163,8 @@ class HighsSearch {

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 Expand Up @@ -250,7 +251,7 @@ class HighsSearch {

void printDisplayLine(char first, bool header = false);

void dive(const HighsInt search_id=0);
void dive(const HighsInt search_id = 0);
NodeResult theDive();

HighsDomain& getLocalDomain() { return localdom; }
Expand Down

0 comments on commit e5d28df

Please sign in to comment.