Skip to content

Commit 7058fc4

Browse files
committed
Introduced HighsMipSolver::initialiseMipRace
1 parent e895296 commit 7058fc4

File tree

4 files changed

+30
-8
lines changed

4 files changed

+30
-8
lines changed

check/TestMipSolver.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,7 @@ TEST_CASE("issue-2432", "[highs_test_mip_solver]") {
10371037
}
10381038

10391039
TEST_CASE("mip-race", "[highs_test_mip_solver]") {
1040-
const bool ci_test = true; // false;//
1040+
const bool ci_test = false;//true; //
10411041
const std::string model = ci_test ? "flugpl" : "fiball";
10421042
// "neos-3381206-awhea";
10431043
const std::string model_file =

highs/mip/HighsMipSolver.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,12 @@ HighsMipSolver::HighsMipSolver(HighsCallback& callback,
4444
implicinit(nullptr) {
4545
assert(!submip || submip_level > 0);
4646
max_submip_level = 0;
47+
// Initialise empty terminator, since this sets termination_status_
48+
// to HighsModelStatus::kNotset...
4749
initialiseTerminator();
50+
// ... and empty MIP race
51+
initialiseMipRace();
52+
assert(termination_status_ == HighsModelStatus::kNotset);
4853
if (solution.value_valid) {
4954
#ifndef NDEBUG
5055
// MIP solver doesn't check row residuals, but they should be OK
@@ -994,15 +999,24 @@ bool HighsMipSolver::solutionFeasible(const HighsLp* lp,
994999
return feasible;
9951000
}
9961001

1002+
std::vector<HighsModelStatus> HighsMipSolver::initialiseTerminatorRecord(
1003+
HighsInt num_instance) const {
1004+
std::vector<HighsModelStatus> record(num_instance, HighsModelStatus::kNotset);
1005+
return record;
1006+
}
1007+
9971008
void HighsMipSolver::initialiseTerminator(HighsInt num_instance_,
9981009
HighsInt my_instance_,
9991010
HighsModelStatus* record_) {
10001011
this->termination_status_ = HighsModelStatus::kNotset;
1012+
this->terminator_.clear();
10011013
this->terminator_.initialise(num_instance_, my_instance_, record_);
10021014
}
10031015

1004-
std::vector<HighsModelStatus> HighsMipSolver::initialiseTerminatorRecord(
1005-
HighsInt num_instance) const {
1006-
std::vector<HighsModelStatus> record(num_instance, HighsModelStatus::kNotset);
1007-
return record;
1016+
void HighsMipSolver::initialiseMipRace(const HighsInt mip_race_concurrency,
1017+
const HighsInt my_instance,
1018+
MipRaceRecord* record) {
1019+
this->mip_race_.clear();
1020+
this->mip_race_.initialise(mip_race_concurrency, my_instance, record,
1021+
this->options_mip_->log_options);
10081022
}

highs/mip/HighsMipSolver.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ class HighsMipSolver {
167167
double& bound_violation, double& row_violation,
168168
double& integrality_violation, HighsCDouble& obj) const;
169169

170+
void initialiseMipRace(const HighsInt mip_race_concurrency = 0,
171+
const HighsInt my_instance_ = kNoThreadInstance,
172+
MipRaceRecord* record_ = nullptr);
173+
170174
std::vector<HighsModelStatus> initialiseTerminatorRecord(
171175
HighsInt num_instance) const;
172176
void initialiseTerminator(HighsInt num_instance_ = 0,

highs/mip/HighsMipSolverData.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2937,8 +2937,11 @@ void MipRaceRecord::initialise(const HighsInt mip_race_concurrency,
29372937
this->clear();
29382938
MipRaceIncumbent incumbent_;
29392939
incumbent_.initialise(num_col);
2940-
for (HighsInt instance = 0; instance < mip_race_concurrency; instance++)
2940+
// Loop from 1...
2941+
for (HighsInt instance = 1; instance < mip_race_concurrency; instance++)
29412942
this->incumbent.push_back(incumbent_);
2943+
// ... and move incumbent_ to complete the vector of incumbents
2944+
this->incumbent.push_back(std::move(incumbent_));
29422945
}
29432946

29442947
HighsInt MipRaceRecord::concurrency() const {
@@ -2980,11 +2983,11 @@ void MipRace::initialise(const HighsInt mip_race_concurrency,
29802983
const HighsInt my_instance_, MipRaceRecord* record_,
29812984
const HighsLogOptions log_options_) {
29822985
this->clear();
2983-
assert(mip_race_concurrency > 0);
29842986
this->my_instance = my_instance_;
29852987
this->record = record_;
29862988
this->log_options = log_options_;
2987-
this->last_incumbent_read.assign(mip_race_concurrency, kMipRaceNoSolution);
2989+
if (mip_race_concurrency > 0)
2990+
this->last_incumbent_read.assign(mip_race_concurrency, kMipRaceNoSolution);
29882991
}
29892992

29902993
HighsInt MipRace::concurrency() const {
@@ -3034,6 +3037,7 @@ void HighsTerminator::clear() {
30343037

30353038
void HighsTerminator::initialise(HighsInt num_instance_, HighsInt my_instance_,
30363039
HighsModelStatus* record_) {
3040+
this->clear();
30373041
this->num_instance = num_instance_;
30383042
this->my_instance = my_instance_;
30393043
this->record = record_;

0 commit comments

Comments
 (0)