Skip to content

Commit bc4631a

Browse files
committed
Add extra safety net for relaxing out bounds
1 parent 0cb4dbd commit bc4631a

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

‎highs/mip/HighsDomain.cpp‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3043,8 +3043,10 @@ bool HighsDomain::ConflictSet::resolveLinearGeq(HighsCDouble M, double Mupper,
30433043
M -= reasonDomchg.delta;
30443044
// ++numDropped;
30453045
} else {
3046-
while (relaxLb <= localdom.prevboundval_[locdomchg.pos].first)
3046+
while (locdomchg.pos != -1 &&
3047+
relaxLb <= localdom.prevboundval_[locdomchg.pos].first)
30473048
locdomchg.pos = localdom.prevboundval_[locdomchg.pos].second;
3049+
if (locdomchg.pos == -1) return false;
30483050

30493051
// bound can be relaxed
30503052
M += vals[i] * (static_cast<HighsCDouble>(relaxLb) - lb);
@@ -3078,8 +3080,10 @@ bool HighsDomain::ConflictSet::resolveLinearGeq(HighsCDouble M, double Mupper,
30783080
// ++numDropped;
30793081
} else {
30803082
// bound can be relaxed
3081-
while (relaxUb >= localdom.prevboundval_[locdomchg.pos].first)
3083+
while (locdomchg.pos != -1 &&
3084+
relaxUb >= localdom.prevboundval_[locdomchg.pos].first)
30823085
locdomchg.pos = localdom.prevboundval_[locdomchg.pos].second;
3086+
if (locdomchg.pos == -1) return false;
30833087

30843088
M += vals[i] * (static_cast<HighsCDouble>(relaxUb) - ub);
30853089
// ++numRelaxed;
@@ -3163,8 +3167,10 @@ bool HighsDomain::ConflictSet::resolveLinearLeq(HighsCDouble M, double Mlower,
31633167
// ++numDropped;
31643168
} else {
31653169
// bound can be relaxed
3166-
while (relaxLb <= localdom.prevboundval_[locdomchg.pos].first)
3170+
while (locdomchg.pos != -1 &&
3171+
relaxLb <= localdom.prevboundval_[locdomchg.pos].first)
31673172
locdomchg.pos = localdom.prevboundval_[locdomchg.pos].second;
3173+
if (locdomchg.pos == -1) return false;
31683174

31693175
M += vals[i] * (static_cast<HighsCDouble>(relaxLb) - lb);
31703176
// ++numRelaxed;
@@ -3197,8 +3203,10 @@ bool HighsDomain::ConflictSet::resolveLinearLeq(HighsCDouble M, double Mlower,
31973203
// ++numDropped;
31983204
} else {
31993205
// bound can be relaxed
3200-
while (relaxUb >= localdom.prevboundval_[locdomchg.pos].first)
3206+
while (locdomchg.pos != -1 &&
3207+
relaxUb >= localdom.prevboundval_[locdomchg.pos].first)
32013208
locdomchg.pos = localdom.prevboundval_[locdomchg.pos].second;
3209+
if (locdomchg.pos == -1) return false;
32023210

32033211
M += vals[i] * (static_cast<HighsCDouble>(relaxUb) - ub);
32043212
// ++numRelaxed;

0 commit comments

Comments
 (0)