Skip to content

Commit 3487a2a

Browse files
committed
Now propagating terminator to sub-MIPs, but still have to test for it!
1 parent 18b4356 commit 3487a2a

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

highs/mip/HighsMipSolver.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,15 @@ void HighsMipSolver::initialiseTerminator(HighsInt num_instance_,
10131013
this->terminator_.initialise(num_instance_, my_instance_, record_);
10141014
}
10151015

1016+
void HighsMipSolver::initialiseTerminator(const HighsMipSolver& mip_solver) {
1017+
this->terminator_.clear();
1018+
if (!mip_solver.mipdata_->terminatorActive()) return;
1019+
assert(mip_solver.mipdata_->terminatorConcurrency() > 0);
1020+
this->initialiseTerminator(mip_solver.mipdata_->terminatorConcurrency(),
1021+
mip_solver.mipdata_->terminatorMyInstance(),
1022+
mip_solver.terminator_.record);
1023+
}
1024+
10161025
void HighsMipSolver::initialiseMipRace(const HighsInt mip_race_concurrency,
10171026
const HighsInt my_instance,
10181027
MipRaceRecord* record) {

highs/mip/HighsMipSolver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ class HighsMipSolver {
176176
void initialiseTerminator(HighsInt num_instance_ = 0,
177177
HighsInt my_instance_ = kNoThreadInstance,
178178
HighsModelStatus* record_ = nullptr);
179+
void initialiseTerminator(const HighsMipSolver& mip_solver);
179180
bool terminate() const {
180181
return this->termination_status_ != HighsModelStatus::kNotset;
181182
}

highs/mip/HighsPrimalHeuristics.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,9 @@ bool HighsPrimalHeuristics::solveSubMip(
142142
mipsolver.analysis_.mipTimerStart(kMipClockSubMipSolve);
143143
HighsMipSolver submipsolver(*mipsolver.callback_, submipoptions, submip,
144144
solution, true, mipsolver.submip_level + 1);
145+
// Initialise termination_status_ and propagate any terminator to
146+
// the sub-MIP
147+
submipsolver.initialiseTerminator(mipsolver);
145148
submipsolver.rootbasis = &basis;
146149
HighsPseudocostInitialization pscostinit(mipsolver.mipdata_->pseudocost, 1);
147150
submipsolver.pscostinit = &pscostinit;
@@ -152,6 +155,21 @@ bool HighsPrimalHeuristics::solveSubMip(
152155
mipsolver.max_submip_level =
153156
std::max(submipsolver.max_submip_level + 1, mipsolver.max_submip_level);
154157
if (!mipsolver.submip) mipsolver.analysis_.mipTimerStop(kMipClockSubMipSolve);
158+
// 22/07/25: Seems impossible for submipsolver.mipdata_ to be a null
159+
// pointer after calling HighsMipSolver::run(), and assert isn't
160+
// triggered for anything in ctest, but use direct test of
161+
// submipsolver.termination_status_, rather than
162+
// submipsolver.mipdata_.terminatorTerminated()
163+
if (!submipsolver.mipdata_) {
164+
printf("HighsPrimalHeuristics::solveSubMip: submipsolver.mipdata_ is nullptr\n");
165+
assert(submipsolver.mipdata_);
166+
}
167+
if (submipsolver.termination_status_ != HighsModelStatus::kNotset) {
168+
printf("HighsPrimalHeuristics::solveSubMip: termination status is %d\n", int(submipsolver.termination_status_));
169+
mipsolver.termination_status_ = submipsolver.termination_status_;
170+
assert(111==333);
171+
return;
172+
}
155173
if (submipsolver.mipdata_) {
156174
double numUnfixed = mipsolver.mipdata_->integral_cols.size() +
157175
mipsolver.mipdata_->continuous_cols.size();

0 commit comments

Comments
 (0)