Skip to content

Commit 0a817bc

Browse files
committed
Upgrade some HighsCDoubles. Only relax out non-zeros
1 parent 0cb4dbd commit 0a817bc

2 files changed

Lines changed: 22 additions & 21 deletions

File tree

highs/mip/HighsCliqueTable.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,16 +1107,16 @@ void HighsCliqueTable::extractCliquesFromCut(const HighsMipSolver& mipsolver,
11071107
for (HighsInt i = 0; i != len; ++i) {
11081108
if (mipsolver.isColContinuous(inds[i])) continue;
11091109

1110-
double boundVal = static_cast<double>((rhs - minact) / vals[i]);
1110+
HighsCDouble impliedBound = (rhs - minact) / vals[i];
11111111
if (vals[i] > 0) {
1112-
boundVal = std::floor(boundVal + globaldom.col_lower_[inds[i]] +
1113-
globaldom.feastol());
1112+
const double boundVal = std::floor(static_cast<double>(
1113+
impliedBound + globaldom.col_lower_[inds[i]] + globaldom.feastol()));
11141114
globaldom.changeBound(HighsBoundType::kUpper, inds[i], boundVal,
11151115
HighsDomain::Reason::unspecified());
11161116
if (globaldom.infeasible()) return;
11171117
} else {
1118-
boundVal = std::ceil(boundVal + globaldom.col_upper_[inds[i]] -
1119-
globaldom.feastol());
1118+
const double boundVal = std::ceil(static_cast<double>(
1119+
impliedBound + globaldom.col_upper_[inds[i]] - globaldom.feastol()));
11201120
globaldom.changeBound(HighsBoundType::kLower, inds[i], boundVal,
11211121
HighsDomain::Reason::unspecified());
11221122
if (globaldom.infeasible()) return;
@@ -1147,10 +1147,9 @@ void HighsCliqueTable::extractCliquesFromCut(const HighsMipSolver& mipsolver,
11471147
if (globaldom.isFixed(col)) continue;
11481148

11491149
if (vals[perm[j]] > 0) {
1150-
double implcolub =
1151-
static_cast<double>(impliedActivity +
1152-
vals[perm[j]] * globaldom.col_lower_[col]) /
1153-
vals[perm[j]];
1150+
double implcolub = static_cast<double>(
1151+
(impliedActivity + vals[perm[j]] * globaldom.col_lower_[col]) /
1152+
vals[perm[j]]);
11541153
if (mipsolver.isColIntegral(col))
11551154
implcolub = std::floor(implcolub + mipsolver.mipdata_->feastol);
11561155

@@ -1173,10 +1172,9 @@ void HighsCliqueTable::extractCliquesFromCut(const HighsMipSolver& mipsolver,
11731172
implics.addVUB(col, bincol, coef, constant);
11741173
}
11751174
} else {
1176-
double implcollb =
1177-
static_cast<double>(impliedActivity +
1178-
vals[perm[j]] * globaldom.col_upper_[col]) /
1179-
vals[perm[j]];
1175+
double implcollb = static_cast<double>(
1176+
(impliedActivity + vals[perm[j]] * globaldom.col_upper_[col]) /
1177+
vals[perm[j]]);
11801178
if (mipsolver.isColIntegral(col))
11811179
implcollb = std::ceil(implcollb - mipsolver.mipdata_->feastol);
11821180

highs/mip/HighsLpRelaxation.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -867,15 +867,15 @@ bool HighsLpRelaxation::computeDualProof(const HighsDomain& globaldomain,
867867
HighsInt start = lp.a_matrix_.start_[i];
868868
HighsInt end = lp.a_matrix_.start_[i + 1];
869869

870-
HighsCDouble sum = lp.col_cost_[i];
870+
HighsCDouble exactVal = lp.col_cost_[i];
871871

872872
for (HighsInt j = start; j != end; ++j) {
873873
if (row_dual[lp.a_matrix_.index_[j]] == 0) continue;
874874
// @FlipRowDual += became -=
875-
sum -= lp.a_matrix_.value_[j] * row_dual[lp.a_matrix_.index_[j]];
875+
exactVal -= lp.a_matrix_.value_[j] * row_dual[lp.a_matrix_.index_[j]];
876876
}
877877

878-
double val = double(sum);
878+
double val = double(exactVal);
879879

880880
if (std::fabs(val) <= mipsolver.options_mip_->small_matrix_value) continue;
881881

@@ -897,11 +897,11 @@ bool HighsLpRelaxation::computeDualProof(const HighsDomain& globaldomain,
897897
if (removeValue) {
898898
if (val < 0) {
899899
if (globaldomain.col_upper_[i] == kHighsInf) return false;
900-
upper -= val * globaldomain.col_upper_[i];
900+
upper -= exactVal * globaldomain.col_upper_[i];
901901
} else {
902902
if (globaldomain.col_lower_[i] == -kHighsInf) return false;
903903

904-
upper -= val * globaldomain.col_lower_[i];
904+
upper -= exactVal * globaldomain.col_lower_[i];
905905
}
906906

907907
continue;
@@ -990,7 +990,10 @@ void HighsLpRelaxation::storeDualInfProof() {
990990
for (HighsInt i : row_ap.getNonzeros()) {
991991
double val = row_ap.getValue(i);
992992

993-
if (std::fabs(val) <= mipsolver.mipdata_->epsilon) continue;
993+
if (std::fabs(val) <= mipsolver.mipdata_->epsilon &&
994+
((val < 0 && globaldomain.col_upper_[i] <= 0) ||
995+
(val > 0 && globaldomain.col_lower_[i] >= 0)))
996+
continue;
994997

995998
bool removeValue = std::abs(val) <= mipsolver.mipdata_->feastol;
996999

@@ -1013,13 +1016,13 @@ void HighsLpRelaxation::storeDualInfProof() {
10131016
hasdualproof = false;
10141017
return;
10151018
}
1016-
upper -= val * globaldomain.col_upper_[i];
1019+
upper -= val * static_cast<HighsCDouble>(globaldomain.col_upper_[i]);
10171020
} else {
10181021
if (globaldomain.col_lower_[i] == -kHighsInf) {
10191022
hasdualproof = false;
10201023
return;
10211024
}
1022-
upper -= val * globaldomain.col_lower_[i];
1025+
upper -= val * static_cast<HighsCDouble>(globaldomain.col_lower_[i]);
10231026
}
10241027

10251028
continue;

0 commit comments

Comments
 (0)