Skip to content

Commit 2f5ddc5

Browse files
committed
Give all lp relaxations a index
1 parent 6ec6465 commit 2f5ddc5

File tree

3 files changed

+27
-16
lines changed

3 files changed

+27
-16
lines changed

highs/mip/HighsLpRelaxation.cpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ double HighsLpRelaxation::slackUpper(HighsInt row,
169169
return kHighsInf;
170170
}
171171

172-
HighsLpRelaxation::HighsLpRelaxation(const HighsMipSolver& mipsolver)
172+
HighsLpRelaxation::HighsLpRelaxation(const HighsMipSolver& mipsolver,
173+
HighsInt index)
173174
: mipsolver(mipsolver) {
174175
lpsolver.setOptionValue("output_flag", false);
175176
lpsolver.setOptionValue("random_seed", mipsolver.options_mip_->random_seed);
@@ -189,9 +190,11 @@ HighsLpRelaxation::HighsLpRelaxation(const HighsMipSolver& mipsolver)
189190
currentbasisstored = false;
190191
adjustSymBranchingCol = true;
191192
row_ep.size = 0;
193+
index_ = index;
192194
}
193195

194-
HighsLpRelaxation::HighsLpRelaxation(const HighsLpRelaxation& other)
196+
HighsLpRelaxation::HighsLpRelaxation(const HighsLpRelaxation& other,
197+
HighsInt index)
195198
: mipsolver(other.mipsolver),
196199
lprows(other.lprows),
197200
fractionalints(other.fractionalints),
@@ -214,6 +217,7 @@ HighsLpRelaxation::HighsLpRelaxation(const HighsLpRelaxation& other)
214217
lastAgeCall = 0;
215218
objective = -kHighsInf;
216219
row_ep.size = 0;
220+
index_ = index;
217221
}
218222

219223
void HighsLpRelaxation::loadModel() {
@@ -927,7 +931,8 @@ void HighsLpRelaxation::storeDualInfProof() {
927931
for (HighsInt j = 0; j < len; ++j) row_ap.add(inds[j], weight * vals[j]);
928932
}
929933

930-
const HighsDomain& globaldomain = mipsolver.mipdata_->domain;
934+
assert(index_ <= mipsolver.mipdata_->domains.size() - 1);
935+
const HighsDomain& globaldomain = mipsolver.mipdata_->domains[index_];
931936

932937
for (HighsInt i : row_ap.getNonzeros()) {
933938
double val = row_ap.getValue(i);
@@ -972,7 +977,7 @@ void HighsLpRelaxation::storeDualInfProof() {
972977
}
973978

974979
dualproofrhs = double(upper);
975-
mipsolver.mipdata_->domain.tightenCoefficients(
980+
mipsolver.mipdata_->domains[index_].tightenCoefficients(
976981
dualproofinds.data(), dualproofvals.data(), dualproofinds.size(),
977982
dualproofrhs);
978983

@@ -993,12 +998,14 @@ void HighsLpRelaxation::storeDualUBProof() {
993998
dualproofinds.clear();
994999
dualproofvals.clear();
9951000

996-
if (lpsolver.getSolution().dual_valid)
997-
hasdualproof = computeDualProof(mipsolver.mipdata_->domain,
1001+
if (lpsolver.getSolution().dual_valid) {
1002+
assert(index_ <= mipsolver.mipdata_->domains.size() - 1);
1003+
hasdualproof = computeDualProof(mipsolver.mipdata_->domains[index_],
9981004
mipsolver.mipdata_->upper_limit,
9991005
dualproofinds, dualproofvals, dualproofrhs);
1000-
else
1006+
} else {
10011007
hasdualproof = false;
1008+
}
10021009

10031010
if (!hasdualproof) dualproofrhs = kHighsInf;
10041011
}
@@ -1330,8 +1337,11 @@ HighsLpRelaxation::Status HighsLpRelaxation::resolveLp(HighsDomain* domain) {
13301337
if (lpsolver.getBasis().col_status[i] == HighsBasisStatus::kBasic)
13311338
continue;
13321339

1333-
const double glb = mipsolver.mipdata_->domain.col_lower_[i];
1334-
const double gub = mipsolver.mipdata_->domain.col_upper_[i];
1340+
assert(index_ <= mipsolver.mipdata_->domains.size() - 1);
1341+
const double glb =
1342+
mipsolver.mipdata_->domains[index_].col_lower_[i];
1343+
const double gub =
1344+
mipsolver.mipdata_->domains[index_].col_upper_[i];
13351345

13361346
if (std::min(gub - sol.col_value[i], sol.col_value[i] - glb) <=
13371347
mipsolver.mipdata_->feastol)

highs/mip/HighsLpRelaxation.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ class HighsLpRelaxation {
8484
HighsInt maxNumFractional;
8585
Status status;
8686
bool adjustSymBranchingCol;
87+
HighsInt index_;
8788

8889
void storeDualInfProof();
8990

@@ -92,9 +93,9 @@ class HighsLpRelaxation {
9293
bool checkDualProof() const;
9394

9495
public:
95-
HighsLpRelaxation(const HighsMipSolver& mip);
96+
HighsLpRelaxation(const HighsMipSolver& mip, HighsInt index = 0);
9697

97-
HighsLpRelaxation(const HighsLpRelaxation& other);
98+
HighsLpRelaxation(const HighsLpRelaxation& other, HighsInt index = 0);
9899

99100
void getCutPool(HighsInt& num_col, HighsInt& num_cut,
100101
std::vector<double>& cut_lower,

highs/mip/HighsMipSolver.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -321,13 +321,13 @@ void HighsMipSolver::run() {
321321
for (int i = 1; i < mip_search_concurrency; i++) {
322322
if (mipdata_->numRestarts <= mipdata_->numRestartsRoot) {
323323
mipdata_->domains.emplace_back(mipdata_->domain);
324-
mipdata_->lps.emplace_back(mipdata_->lp);
324+
mipdata_->lps.emplace_back(mipdata_->lp, i);
325325
mipdata_->cutpools.emplace_back(
326-
HighsCutPool(numCol(), options_mip_->mip_pool_age_limit,
327-
options_mip_->mip_pool_soft_limit, i));
326+
numCol(), options_mip_->mip_pool_age_limit,
327+
options_mip_->mip_pool_soft_limit, i);
328328
mipdata_->conflictpools.emplace_back(
329-
HighsConflictPool(5 * options_mip_->mip_pool_age_limit,
330-
options_mip_->mip_pool_soft_limit));
329+
5 * options_mip_->mip_pool_age_limit,
330+
options_mip_->mip_pool_soft_limit);
331331
mipdata_->workers.emplace_back(
332332
*this, mipdata_->lps.back(), mipdata_->domains.back(),
333333
mipdata_->cutpools.back(), mipdata_->conflictpools.back());

0 commit comments

Comments
 (0)