Skip to content

Commit e895296

Browse files
committed
Cleaned up; formatted
1 parent 4ad6e3b commit e895296

File tree

6 files changed

+65
-51
lines changed

6 files changed

+65
-51
lines changed

check/TestMipSolver.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1047,7 +1047,6 @@ TEST_CASE("mip-race", "[highs_test_mip_solver]") {
10471047
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);
1050-
// h.setOptionValue("mip_race_read_solutions", false);
10511050
REQUIRE(h.readModel(model_file) == HighsStatus::kOk);
10521051
REQUIRE(h.run() == HighsStatus::kOk);
10531052

highs/lp_data/Highs.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4042,7 +4042,8 @@ HighsStatus Highs::callSolveMip() {
40424042
MipRaceRecord mip_race_record;
40434043
mip_race_record.initialise(mip_race_concurrency, lp.num_col_);
40444044
// Set up the shared memory for the concurrent MIP terminator
4045-
auto terminator_record = solver.initialiseTerminatorRecord(mip_race_concurrency);
4045+
auto terminator_record =
4046+
solver.initialiseTerminatorRecord(mip_race_concurrency);
40464047
// Don't allow callbacks for workers
40474048
HighsCallback worker_callback = callback_;
40484049
worker_callback.clear();
@@ -4066,7 +4067,8 @@ HighsStatus Highs::callSolveMip() {
40664067
instance_options.random_seed = options_.random_seed + instance;
40674068
std::string worker_log_file =
40684069
"mip_worker" + std::to_string(instance) + ".log";
4069-
highsOpenLogFile(instance_options, worker_log_file);
4070+
if (options_.output_flag)
4071+
highsOpenLogFile(instance_options, worker_log_file);
40704072
worker_options.push_back(instance_options);
40714073
/*
40724074
HighsMipSolver worker_instance(worker_callback, worker_options[instance],

highs/mip/HighsMipSolver.cpp

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -689,26 +689,26 @@ void HighsMipSolver::run() {
689689
}
690690

691691
void HighsMipSolver::cleanupSolve() {
692-
if (!submip) {
693-
if (mipdata_->terminatorActive()) {
694-
if (!mipdata_->terminatorTerminated()) {
695-
// No other instance has terminated the MIP race, so terminate
696-
// it
697-
highsLogUser(options_mip_->log_options, HighsLogType::kInfo,
698-
"instance%d: terminate %6.4f (MIP)\n",
699-
int(this->mipdata_->mipRaceMyInstance()),
700-
this->timer_.read());
701-
mipdata_->terminatorTerminate();
702-
} else {
703-
// Indicate that this instance has been interrupted
704-
highsLogUser(options_mip_->log_options, HighsLogType::kInfo,
705-
"instance%d: terminated %6.4f (MIP)\n",
706-
int(this->mipdata_->mipRaceMyInstance()),
707-
this->timer_.read());
708-
modelstatus_ = HighsModelStatus::kHighsInterrupt;
709-
}
710-
if (mipdata_->mipRaceActive()) mipdata_->mipRaceReport();
692+
if (!submip && mipdata_->terminatorActive()) {
693+
if (!mipdata_->terminatorTerminated()) {
694+
// No other instance has terminated the MIP race, so terminate
695+
// it
696+
highsLogUser(options_mip_->log_options, HighsLogType::kInfo,
697+
"instance%d: terminate %6.4f (MIP)\n",
698+
int(this->mipdata_->terminatorMyInstance()),
699+
this->timer_.read());
700+
mipdata_->terminatorTerminate();
701+
} else {
702+
// Indicate that this instance has been interrupted
703+
highsLogUser(options_mip_->log_options, HighsLogType::kInfo,
704+
"instance%d: terminated %6.4f (MIP)\n",
705+
int(this->mipdata_->terminatorMyInstance()),
706+
this->timer_.read());
707+
modelstatus_ = HighsModelStatus::kHighsInterrupt;
711708
}
709+
mipdata_->terminatorReport();
710+
// Report on any active MIP race
711+
mipdata_->mipRaceReport();
712712
}
713713

714714
// Force a final logging line

highs/mip/HighsMipSolver.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ struct HighsTerminator {
6666
void clear();
6767
void initialise(HighsInt num_instance_, HighsInt my_instance_,
6868
HighsModelStatus* record_);
69+
HighsInt concurrency() const;
6970
void terminate();
7071
bool terminated() const;
7172
HighsModelStatus terminationStatus() const;
@@ -166,7 +167,8 @@ class HighsMipSolver {
166167
double& bound_violation, double& row_violation,
167168
double& integrality_violation, HighsCDouble& obj) const;
168169

169-
std::vector<HighsModelStatus> initialiseTerminatorRecord(HighsInt num_instance) const;
170+
std::vector<HighsModelStatus> initialiseTerminatorRecord(
171+
HighsInt num_instance) const;
170172
void initialiseTerminator(HighsInt num_instance_ = 0,
171173
HighsInt my_instance_ = kNoThreadInstance,
172174
HighsModelStatus* record_ = nullptr);

highs/mip/HighsMipSolverData.cpp

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,8 +1331,10 @@ void HighsMipSolverData::performRestart() {
13311331
// changed offset_
13321332
runSetup();
13331333
if (mipsolver.terminate()) {
1334-
printf("HighsMipSolverData::performRestart() mipsolver.termination_status_ = %d\n",
1335-
int(mipsolver.termination_status_));
1334+
printf(
1335+
"HighsMipSolverData::performRestart() mipsolver.termination_status_ = "
1336+
"%d\n",
1337+
int(mipsolver.termination_status_));
13361338
return;
13371339
}
13381340

@@ -2387,7 +2389,7 @@ void HighsMipSolverData::evaluateRootNode() {
23872389
analysis.mipTimerStart(kMipClockPerformRestart);
23882390
performRestart();
23892391
analysis.mipTimerStop(kMipClockPerformRestart);
2390-
if (mipsolver.terminate()) return;
2392+
if (mipsolver.terminate()) return;
23912393
++numRestartsRoot;
23922394
if (mipsolver.modelstatus_ == HighsModelStatus::kNotset) {
23932395
clockOff(analysis);
@@ -2419,12 +2421,16 @@ bool HighsMipSolverData::checkLimits(int64_t nodeOffset) const {
24192421
const HighsOptions& options = *mipsolver.options_mip_;
24202422

24212423
// MIP race may have terminated
2422-
if (!mipsolver.submip) {
2424+
if (!mipsolver.submip && terminatorActive()) {
24232425
highsLogUser(options.log_options, HighsLogType::kInfo,
2424-
"instance%d: terminated? %6.4f (MIP)\n", int(this->mipRaceMyInstance()), this->mipsolver.timer_.read());
2426+
"instance%d: terminated? %6.4f (MIP)\n",
2427+
int(this->terminatorMyInstance()),
2428+
this->mipsolver.timer_.read());
24252429
if (this->terminatorTerminated()) {
24262430
highsLogUser(options.log_options, HighsLogType::kInfo,
2427-
"instance%d: terminated %6.4f (MIP)\n", int(this->mipRaceMyInstance()), this->mipsolver.timer_.read());
2431+
"instance%d: terminated %6.4f (MIP)\n",
2432+
int(this->terminatorMyInstance()),
2433+
this->mipsolver.timer_.read());
24282434
return true;
24292435
}
24302436
}
@@ -2698,12 +2704,6 @@ void HighsMipSolverData::queryExternalSolution(
26982704
}
26992705
}
27002706

2701-
HighsInt HighsMipSolverData::mipRaceMyInstance() const {
2702-
assert(!mipsolver.submip);
2703-
if (!mipsolver.mip_race_.record) return kNoThreadInstance;
2704-
return mipsolver.mip_race_.my_instance;
2705-
}
2706-
27072707
HighsInt HighsMipSolverData::mipRaceConcurrency() const {
27082708
assert(!mipsolver.submip);
27092709
if (!mipsolver.mip_race_.record) return 0;
@@ -2727,21 +2727,33 @@ HighsInt HighsMipSolverData::mipRaceNewSolution(const HighsInt instance,
27272727

27282728
void HighsMipSolverData::mipRaceReport() const {
27292729
assert(!mipsolver.submip);
2730-
if (mipsolver.terminator_.record) mipsolver.terminator_.report(mipsolver.options_mip_->log_options);
2731-
if (mipsolver.mip_race_.record) mipsolver.mip_race_.report();
2730+
if (mipsolver.mip_race_.record) mipsolver.mip_race_.report();
2731+
}
2732+
2733+
HighsInt HighsMipSolverData::terminatorConcurrency() const {
2734+
return mipsolver.terminator_.num_instance;
2735+
}
2736+
2737+
HighsInt HighsMipSolverData::terminatorMyInstance() const {
2738+
return mipsolver.terminator_.my_instance;
27322739
}
27332740

27342741
void HighsMipSolverData::terminatorTerminate() {
2735-
assert(mipsolver.terminator_.num_instance > 0);
2742+
assert(terminatorActive());
27362743
mipsolver.terminator_.terminate();
27372744
}
27382745

27392746
bool HighsMipSolverData::terminatorTerminated() const {
2740-
if (this->terminatorActive())
2747+
if (this->terminatorActive())
27412748
mipsolver.termination_status_ = mipsolver.terminator_.terminationStatus();
27422749
return mipsolver.termination_status_ != HighsModelStatus::kNotset;
27432750
}
27442751

2752+
void HighsMipSolverData::terminatorReport() const {
2753+
if (this->terminatorActive())
2754+
mipsolver.terminator_.report(mipsolver.options_mip_->log_options);
2755+
}
2756+
27452757
static double possInfRelDiff(const double v0, const double v1,
27462758
const double den) {
27472759
double rel_diff;
@@ -2918,9 +2930,7 @@ HighsInt MipRaceIncumbent::read(const HighsInt last_incumbent_read,
29182930
: kMipRaceNoSolution;
29192931
}
29202932

2921-
void MipRaceRecord::clear() {
2922-
this->incumbent.clear();
2923-
}
2933+
void MipRaceRecord::clear() { this->incumbent.clear(); }
29242934

29252935
void MipRaceRecord::initialise(const HighsInt mip_race_concurrency,
29262936
const HighsInt num_col) {
@@ -3022,14 +3032,15 @@ void HighsTerminator::clear() {
30223032
this->record = nullptr;
30233033
}
30243034

3025-
void HighsTerminator::initialise(HighsInt num_instance_,
3026-
HighsInt my_instance_,
3027-
HighsModelStatus* record_) {
3035+
void HighsTerminator::initialise(HighsInt num_instance_, HighsInt my_instance_,
3036+
HighsModelStatus* record_) {
30283037
this->num_instance = num_instance_;
30293038
this->my_instance = my_instance_;
30303039
this->record = record_;
30313040
}
30323041

3042+
HighsInt HighsTerminator::concurrency() const { return this->num_instance; }
3043+
30333044
void HighsTerminator::terminate() {
30343045
assert(this->record);
30353046
assert(this->my_instance < this->num_instance);
@@ -3047,9 +3058,8 @@ HighsModelStatus HighsTerminator::terminationStatus() const {
30473058

30483059
void HighsTerminator::report(const HighsLogOptions log_options) const {
30493060
highsLogUser(log_options, HighsLogType::kInfo, "\nTerminator: ");
3050-
for (HighsInt instance = 0; instance < this->num_instance; instance++)
3061+
for (HighsInt instance = 0; instance < this->num_instance; instance++)
30513062
highsLogUser(log_options, HighsLogType::kInfo, " %20d",
3052-
int(this->record[instance]));
3063+
int(this->record[instance]));
30533064
highsLogUser(log_options, HighsLogType::kInfo, "\n");
30543065
}
3055-

highs/mip/HighsMipSolverData.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -302,16 +302,17 @@ struct HighsMipSolverData {
302302
const ExternalMipSolutionQueryOrigin external_solution_query_origin);
303303

304304
HighsInt mipRaceConcurrency() const;
305-
bool mipRaceActive() const { return mipRaceConcurrency() > 0; }
306-
HighsInt mipRaceMyInstance() const;
307305
void mipRaceUpdate();
308306
HighsInt mipRaceNewSolution(const HighsInt instance, double& objective_value,
309307
std::vector<double>& solution);
310308
void mipRaceReport() const;
311309

310+
HighsInt terminatorConcurrency() const;
311+
bool terminatorActive() const { return terminatorConcurrency() > 0; }
312+
HighsInt terminatorMyInstance() const;
312313
void terminatorTerminate();
313314
bool terminatorTerminated() const;
314-
bool terminatorActive() const { return mipsolver.terminator_.num_instance > 0; }
315+
void terminatorReport() const;
315316
};
316317

317318
#endif

0 commit comments

Comments
 (0)