Skip to content

Commit c502d1f

Browse files
committed
Flip termination conditional in HighsMipSolver::cleanupSolve() in preparation for limiting termination by sub-MIPs
1 parent 3487a2a commit c502d1f

File tree

4 files changed

+29
-19
lines changed

4 files changed

+29
-19
lines changed

check/TestMipSolver.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,13 +1038,13 @@ TEST_CASE("issue-2432", "[highs_test_mip_solver]") {
10381038

10391039
TEST_CASE("mip-race", "[highs_test_mip_solver]") {
10401040
const bool ci_test = true; // false;//
1041-
const std::string model = ci_test ? "flugpl" : "fiball";
1041+
const std::string model = ci_test ? "rgn" : "fiball"; //flugpl
10421042
// "neos-3381206-awhea";
10431043
const std::string model_file =
10441044
ci_test ? std::string(HIGHS_DIR) + "/check/instances/" + model + ".mps"
10451045
: "/srv/miplib2017/" + model + ".mps.gz";
10461046
Highs h;
1047-
if (ci_test) h.setOptionValue("output_flag", dev_run);
1047+
// if (ci_test) h.setOptionValue("output_flag", dev_run);
10481048
const HighsInt mip_race_concurrency = ci_test ? 2 : 4;
10491049
h.setOptionValue("mip_race_concurrency", mip_race_concurrency);
10501050
REQUIRE(h.readModel(model_file) == HighsStatus::kOk);

highs/mip/HighsMipSolver.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,10 @@ void HighsMipSolver::run() {
302302

303303
mipdata_->heuristics.flushStatistics();
304304
analysis_.mipTimerStop(kMipClockDivePrimalHeuristics);
305+
if (mipdata_->terminatorTerminated()) {
306+
cleanupSolve();
307+
return;
308+
}
305309
}
306310
}
307311

@@ -694,21 +698,22 @@ void HighsMipSolver::run() {
694698
}
695699

696700
void HighsMipSolver::cleanupSolve() {
697-
if (!submip && mipdata_->terminatorActive()) {
701+
if (mipdata_->terminatorActive()) {
698702
if (!mipdata_->terminatorTerminated()) {
699-
// No other instance has terminated the MIP race, so terminate
700-
// it
703+
// No other instance has terminated, so terminate it
701704
highsLogUser(options_mip_->log_options, HighsLogType::kInfo,
702-
"instance%d: terminate %6.4f (MIP)\n",
705+
"instance%d: terminate %6.4f (%sMIP)\n",
703706
int(this->mipdata_->terminatorMyInstance()),
704-
this->timer_.read());
707+
this->timer_.read(),
708+
submip ? "sub-" : "");
705709
mipdata_->terminatorTerminate();
706710
} else {
707711
// Indicate that this instance has been interrupted
708712
highsLogUser(options_mip_->log_options, HighsLogType::kInfo,
709-
"instance%d: terminated %6.4f (MIP)\n",
713+
"instance%d: terminated %6.4f (%sMIP)\n",
710714
int(this->mipdata_->terminatorMyInstance()),
711-
this->timer_.read());
715+
this->timer_.read(),
716+
submip ? "sub-" : "");
712717
modelstatus_ = HighsModelStatus::kHighsInterrupt;
713718
}
714719
mipdata_->terminatorReport();

highs/mip/HighsMipSolverData.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2420,17 +2420,19 @@ void HighsMipSolverData::evaluateRootNode() {
24202420
bool HighsMipSolverData::checkLimits(int64_t nodeOffset) const {
24212421
const HighsOptions& options = *mipsolver.options_mip_;
24222422

2423-
// MIP race may have terminated
2424-
if (!mipsolver.submip && terminatorActive()) {
2423+
// This MIP instance may have been terminated
2424+
if (terminatorActive()) {
24252425
highsLogUser(options.log_options, HighsLogType::kInfo,
2426-
"instance%d: terminated? %6.4f (MIP)\n",
2426+
"instance%d: terminated? %6.4f (%sMIP)\n",
24272427
int(this->terminatorMyInstance()),
2428-
this->mipsolver.timer_.read());
2428+
this->mipsolver.timer_.read(),
2429+
mipsolver.submip ? "sub-" : "");
24292430
if (this->terminatorTerminated()) {
24302431
highsLogUser(options.log_options, HighsLogType::kInfo,
2431-
"instance%d: terminated %6.4f (MIP)\n",
2432+
"instance%d: terminated %6.4f (%sMIP)\n",
24322433
int(this->terminatorMyInstance()),
2433-
this->mipsolver.timer_.read());
2434+
this->mipsolver.timer_.read(),
2435+
mipsolver.submip ? "sub-" : "");
24342436
return true;
24352437
}
24362438
}
@@ -2726,7 +2728,6 @@ HighsInt HighsMipSolverData::mipRaceNewSolution(const HighsInt instance,
27262728
}
27272729

27282730
void HighsMipSolverData::mipRaceReport() const {
2729-
assert(!mipsolver.submip);
27302731
if (mipsolver.mip_race_.record) mipsolver.mip_race_.report();
27312732
}
27322733

highs/mip/HighsPrimalHeuristics.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ bool HighsPrimalHeuristics::solveSubMip(
145145
// Initialise termination_status_ and propagate any terminator to
146146
// the sub-MIP
147147
submipsolver.initialiseTerminator(mipsolver);
148+
printf("HighsPrimalHeuristics::solveSubMip: %d submipsolver.termination_status_ = %d\n",
149+
int(submipsolver.terminator_.my_instance), int(submipsolver.termination_status_));
148150
submipsolver.rootbasis = &basis;
149151
HighsPseudocostInitialization pscostinit(mipsolver.mipdata_->pseudocost, 1);
150152
submipsolver.pscostinit = &pscostinit;
@@ -165,10 +167,10 @@ bool HighsPrimalHeuristics::solveSubMip(
165167
assert(submipsolver.mipdata_);
166168
}
167169
if (submipsolver.termination_status_ != HighsModelStatus::kNotset) {
168-
printf("HighsPrimalHeuristics::solveSubMip: termination status is %d\n", int(submipsolver.termination_status_));
170+
printf("HighsPrimalHeuristics::solveSubMip: %d termination status is %d\n",
171+
int(submipsolver.terminator_.my_instance), int(submipsolver.termination_status_));
169172
mipsolver.termination_status_ = submipsolver.termination_status_;
170-
assert(111==333);
171-
return;
173+
return false;
172174
}
173175
if (submipsolver.mipdata_) {
174176
double numUnfixed = mipsolver.mipdata_->integral_cols.size() +
@@ -561,6 +563,7 @@ void HighsPrimalHeuristics::RENS(const std::vector<double>& tmp) {
561563
500, // std::max(50, int(0.05 *
562564
// (mipsolver.mipdata_->num_leaves))),
563565
200 + mipsolver.mipdata_->num_nodes / 20, 12);
566+
if (mipsolver.mipdata_->terminatorTerminated()) return;
564567
if (!solve_sub_mip_return) {
565568
int64_t new_lp_iterations = lp_iterations + heur.getLocalLpIterations();
566569
if (new_lp_iterations + mipsolver.mipdata_->heuristic_lp_iterations >
@@ -853,6 +856,7 @@ void HighsPrimalHeuristics::RINS(const std::vector<double>& relaxationsol) {
853856
500, // std::max(50, int(0.05 *
854857
// (mipsolver.mipdata_->num_leaves))),
855858
200 + mipsolver.mipdata_->num_nodes / 20, 12);
859+
if (mipsolver.mipdata_->terminatorTerminated()) return;
856860
if (!solve_sub_mip_return) {
857861
int64_t new_lp_iterations = lp_iterations + heur.getLocalLpIterations();
858862
if (new_lp_iterations + mipsolver.mipdata_->heuristic_lp_iterations >

0 commit comments

Comments
 (0)