Skip to content

Commit aa54dbd

Browse files
committed
Now running presolve before AC solve
1 parent 6ac2ee0 commit aa54dbd

File tree

2 files changed

+54
-16
lines changed

2 files changed

+54
-16
lines changed

highs/mip/HighsLpRelaxation.cpp

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,11 +1076,6 @@ HighsLpRelaxation::Status HighsLpRelaxation::run(bool resolve_on_error) {
10761076
// lpsolver.setOptionValue("output_flag", true);
10771077
const bool valid_basis = lpsolver.getBasis().valid;
10781078

1079-
if (!valid_basis && this->solved_first_lp) {
1080-
std::string get_presolve;
1081-
lpsolver.getOptionValue("presolve", get_presolve);
1082-
}
1083-
10841079
if (mipsolver.analysis_.analyse_mip_time &&
10851080
!mipsolver.submip &&
10861081
!this->solved_first_lp) {
@@ -1089,7 +1084,6 @@ HighsLpRelaxation::Status HighsLpRelaxation::run(bool resolve_on_error) {
10891084
mipsolver.timer_.read(),
10901085
valid_basis ? "" : "out");
10911086
}
1092-
10931087
// Determine the solver
10941088
//
10951089
// Currently use simplex by default, unless IPM is requested
@@ -1121,7 +1115,27 @@ HighsLpRelaxation::Status HighsLpRelaxation::run(bool resolve_on_error) {
11211115
bool use_simplex = !use_ipm;
11221116
if (use_ipm) {
11231117
assert(!valid_basis);
1118+
const bool ipm_logging = true;
1119+
if (ipm_logging) {
1120+
std::string presolve;
1121+
lpsolver.getOptionValue("presolve", presolve);
1122+
printf("\nHighsLpRelaxation::run Solving the root node with IPM, using presolve = %s\n", presolve.c_str());
1123+
bool output_flag;
1124+
lpsolver.getOptionValue("output_flag", output_flag);
1125+
assert(output_flag == false);
1126+
(void)output_flag;
1127+
lpsolver.setOptionValue("output_flag", !mipsolver.submip);
1128+
}
1129+
const bool dump_ipm_lp = false;
1130+
if (dump_ipm_lp && !mipsolver.submip) {
1131+
const std::string file_name = mipsolver.model_->model_name_ + "_root.mps";
1132+
printf("HighsMipSolverData::startAnalyticCenterComputation: Calling lpsolver.writeModel(%s)\n", file_name.c_str());
1133+
lpsolver.writeModel(file_name);
1134+
fflush(stdout);
1135+
exit(1);
1136+
}
11241137
callstatus = lpsolver.run();
1138+
if (ipm_logging) lpsolver.setOptionValue("output_flag", false);
11251139
if (callstatus == HighsStatus::kError) {
11261140
lpsolver.setOptionValue("solver", kSimplexString);
11271141
use_simplex = true;
@@ -1309,7 +1323,19 @@ HighsLpRelaxation::Status HighsLpRelaxation::run(bool resolve_on_error) {
13091323
// istanbul-no-cutoff
13101324
ipm.setOptionValue("simplex_iteration_limit",
13111325
info.simplex_iteration_count);
1326+
const bool ipm_logging = true;
1327+
if (ipm_logging) {
1328+
std::string presolve;
1329+
ipm.getOptionValue("presolve", presolve);
1330+
printf("\nHighsLpRelaxation::run After lpsolver reached iteration limit, solving with IPM, using presolve = %s\n", presolve.c_str());
1331+
bool output_flag;
1332+
ipm.getOptionValue("output_flag", output_flag);
1333+
assert(output_flag == false);
1334+
(void)output_flag;
1335+
ipm.setOptionValue("output_flag", !mipsolver.submip);
1336+
}
13121337
ipm.run();
1338+
if (ipm_logging) ipm.setOptionValue("output_flag", false);
13131339
if (use_hipo && !ipm.getBasis().valid) {
13141340
printf(
13151341
"In HighsLpRelaxation::run HiPO has failed to get a valid basis: "

highs/mip/HighsMipSolverData.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -345,10 +345,9 @@ void HighsMipSolverData::startAnalyticCenterComputation(
345345
// due to early return in the root node evaluation
346346
Highs ipm;
347347
ipm.setOptionValue("output_flag", false);
348-
// ipm.setOptionValue("output_flag", !mipsolver.submip);
349348
const std::vector<double>& sol = ipm.getSolution().col_value;
350349
// Don't use presolve - because the MIP has already been presolved?
351-
const bool use_presolve = false;
350+
const bool use_presolve = true;
352351
const std::string presolve = use_presolve ? kHighsChooseString : kHighsOffString;
353352
ipm.setOptionValue("presolve", presolve);
354353
// Determine the solver
@@ -370,18 +369,31 @@ void HighsMipSolverData::startAnalyticCenterComputation(
370369
ipm.setOptionValue("solver", ipm_solver);
371370
ipm.setOptionValue("ipm_iteration_limit", 200);
372371
ipm.setOptionValue("run_crossover", kHighsOffString);
373-
ipm.setOptionValue("solve_relaxation", true);
374372
HighsLp lpmodel(*mipsolver.model_);
375373
lpmodel.col_cost_.assign(lpmodel.num_col_, 0.0);
374+
lpmodel.integrality_.clear();
376375
ipm.passModel(std::move(lpmodel));
377-
378-
// if (!mipsolver.submip) {
379-
// const std::string file_name = mipsolver.model_->model_name_ +
380-
// "_ipm.mps"; printf("Calling ipm.writeModel(%s)\n",
381-
// file_name.c_str()); fflush(stdout); ipm.writeModel(file_name);
382-
// }
383-
376+
const bool dump_ipm_lp = false;
377+
if (dump_ipm_lp && !mipsolver.submip) {
378+
const std::string file_name = mipsolver.model_->model_name_ + "_ac.mps";
379+
printf("HighsMipSolverData::startAnalyticCenterComputation: Calling ipm.writeModel(%s)\n", file_name.c_str());
380+
ipm.writeModel(file_name);
381+
fflush(stdout);
382+
exit(1);
383+
}
384+
const bool ipm_logging = false;
385+
if (ipm_logging) {
386+
std::string presolve;
387+
ipm.getOptionValue("presolve", presolve);
388+
printf("\nHighsMipSolverData::startAnalyticCenterComputation Solving for the AC with IPM, using presolve = %s\n", presolve.c_str());
389+
bool output_flag;
390+
ipm.getOptionValue("output_flag", output_flag);
391+
assert(output_flag == false);
392+
(void)output_flag;
393+
ipm.setOptionValue("output_flag", !mipsolver.submip);
394+
}
384395
ipm.run();
396+
if (ipm_logging) ipm.setOptionValue("output_flag", false);
385397
if (use_hipo && mip_ipm_solver == kHighsChooseString && HighsInt(sol.size()) != mipsolver.numCol()) {
386398
printf(
387399
"In HighsMipSolverData::startAnalyticCenterComputation HiPO has "

0 commit comments

Comments
 (0)