Skip to content

Commit a91c38e

Browse files
committed
Removed final residuals calculation
1 parent 79d6335 commit a91c38e

File tree

5 files changed

+27
-119
lines changed

5 files changed

+27
-119
lines changed

highs/ipm/hipo/ipm/Iterate.cpp

Lines changed: 23 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -443,96 +443,34 @@ Int Iterate::finalResiduals(Info& info) const {
443443
// compute it.
444444

445445
if (!info.ipx_used) {
446-
std::vector<double> x_local, xl_local, xu_local, y_local, zl_local,
447-
zu_local, slack_local;
448-
449-
model.postprocess(x_local, xl_local, xu_local, slack_local, y_local,
450-
zl_local, zu_local, *this);
451-
452-
Int m, n;
453-
HighsSparseMatrix A;
454-
std::vector<double> b, c, lower, upper;
455-
std::vector<char> constraints;
456-
double offset;
457-
458-
if (!model.lpOrig()) return kStatusError;
459-
fillInIpxData(*model.lpOrig(), n, m, offset, c, lower, upper, A.start_,
460-
A.index_, A.value_, b, constraints);
461-
A.num_col_ = n;
462-
A.num_row_ = m;
463-
464-
if (model.qp()) {
465-
if (!model.QOrig()) return kStatusError;
466-
}
467-
468-
assert(x_local.size() == c.size());
469-
assert(y_local.size() == b.size());
470-
471-
// res1 = b - slack - A*x
472-
std::vector<double> res1 = b;
473-
vectorAdd(res1, slack_local, -1.0);
474-
A.alphaProductPlusY(-1.0, x_local, res1);
475-
476-
// res2 = lower - x + xl
477-
std::vector<double> res2(n);
478-
for (Int i = 0; i < n; ++i) {
479-
if (std::isfinite(lower[i]))
480-
res2[i] = lower[i] - x_local[i] + xl_local[i];
481-
}
446+
info.p_obj = pobj;
447+
info.d_obj = dobj;
448+
info.pd_gap = pdgap;
482449

483-
// res3 = upper - x - xu
484-
std::vector<double> res3(n);
485-
for (Int i = 0; i < n; ++i) {
486-
if (std::isfinite(upper[i]))
487-
res3[i] = upper[i] - x_local[i] - xu_local[i];
450+
double& pinf = info.p_res_abs;
451+
for (Int i = 0; i < model.m(); ++i) {
452+
double val = std::abs(res.r1[i]);
453+
if (model.scaled()) val /= model.rowScale(i);
454+
pinf = std::max(pinf, val);
488455
}
489-
490-
// res4 = c - A^T * y - zl + zu + Q * x
491-
std::vector<double> res4(n);
492-
A.alphaProductPlusY(-1.0, y_local, res4, true);
493-
if (model.qp())
494-
model.QOrig()->alphaProductPlusY(model.sense(), x_local, res4);
495-
for (Int i = 0; i < n; ++i) {
496-
if (std::isfinite(lower[i])) res4[i] -= zl_local[i];
497-
if (std::isfinite(upper[i])) res4[i] += zu_local[i];
498-
res4[i] += c[i];
456+
for (Int i = 0; i < model.n(); ++i) {
457+
double val = std::abs(res.r2[i]);
458+
if (model.scaled()) val *= model.colScale(i);
459+
pinf = std::max(pinf, val);
460+
461+
val = std::abs(res.r3[i]);
462+
if (model.scaled()) val *= model.colScale(i);
463+
pinf = std::max(pinf, val);
499464
}
465+
info.p_res_rel = pinf / (1.0 + model.normUnscaledRhs());
500466

501-
double norm_rhs = infNorm(b);
502-
for (Int i = 0; i < n; ++i) {
503-
if (std::isfinite(lower[i]))
504-
norm_rhs = std::max(norm_rhs, std::abs(lower[i]));
505-
if (std::isfinite(upper[i]))
506-
norm_rhs = std::max(norm_rhs, std::abs(upper[i]));
467+
double& dinf = info.d_res_abs;
468+
for (Int i = 0; i < model.n(); ++i) {
469+
double val = std::abs(res.r4[i]);
470+
if (model.scaled()) val /= model.colScale(i);
471+
dinf = std::max(dinf, val);
507472
}
508-
509-
info.p_res_abs = infNorm(res1);
510-
info.p_res_abs = std::max(info.p_res_abs, infNorm(res2));
511-
info.p_res_abs = std::max(info.p_res_abs, infNorm(res3));
512-
info.p_res_rel = info.p_res_abs / (1.0 + norm_rhs);
513-
514-
info.d_res_abs = infNorm(res4);
515-
info.d_res_rel = info.d_res_abs / (1.0 + infNorm(c));
516-
517-
const double quad_term_local =
518-
model.qp() ? model.sense() * model.QOrig()->objectiveValue(x_local)
519-
: 0.0;
520-
521-
double pobj = offset;
522-
pobj += dotProd(c, x_local);
523-
pobj += quad_term_local;
524-
525-
double dobj = offset;
526-
dobj += dotProd(y_local, b);
527-
for (Int i = 0; i < n; ++i) {
528-
if (std::isfinite(lower[i])) dobj += lower[i] * zl_local[i];
529-
if (std::isfinite(upper[i])) dobj -= upper[i] * zu_local[i];
530-
}
531-
dobj -= quad_term_local;
532-
533-
info.p_obj = pobj;
534-
info.d_obj = dobj;
535-
info.pd_gap = std::abs(pobj - dobj) / (1.0 + 0.5 * std::abs(pobj + dobj));
473+
info.d_res_rel = dinf / (1.0 + model.normUnscaledObj());
536474

537475
} else {
538476
info.p_res_abs = info.ipx_info.abs_presidual;

highs/ipm/hipo/ipm/Iterate.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,6 @@ struct Iterate {
151151
std::vector<double>& y_cmp,
152152
std::vector<double>& z_cmp) const;
153153

154-
// ===================================================================================
155-
// Compute residuals after solution has been found, postprocessed and
156-
// unscaled.
157-
// ===================================================================================
158154
Int finalResiduals(Info& info) const;
159155

160156
// ===================================================================================

highs/ipm/hipo/ipm/Model.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ Int Model::init(const HighsLp& lp, const HighsHessian& Q) {
2020
if (checkData()) return kStatusBadModel;
2121

2222
lp_orig_ = &lp;
23-
Q_orig_ = &Q;
2423
n_orig_ = n_;
2524
m_orig_ = m_;
2625
A_.num_col_ = n_;

highs/ipm/hipo/ipm/Model.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ class Model {
3434
Int n_orig_{};
3535
Int m_orig_{};
3636
const HighsLp* lp_orig_ = nullptr;
37-
const HighsHessian* Q_orig_ = nullptr;
3837
double offset_;
3938
ObjSense sense_ = ObjSense::kMinimize;
4039
std::vector<double> rhs_orig_;
@@ -99,7 +98,6 @@ class Model {
9998
Int n_orig() const { return n_orig_; }
10099
Int m_orig() const { return m_orig_; }
101100
const HighsLp* lpOrig() const { return lp_orig_; }
102-
const HighsHessian* QOrig() const { return Q_orig_; }
103101
const std::vector<double>& rhsOrig() const { return rhs_orig_; }
104102
const std::vector<char>& constraintsOrig() const { return constraints_orig_; }
105103
bool qp() const { return !Q_.empty(); }

highs/ipm/hipo/ipm/Solver.cpp

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,7 +1132,8 @@ bool Solver::checkBadIter() {
11321132
} else if (stagnation) {
11331133
// stagnation detected, solution may still be good for highs kktCheck
11341134
if (checkTerminationKkt()) {
1135-
logH_.printw("HiPO stagnated but HiGHS considers the solution acceptable\n");
1135+
logH_.printw(
1136+
"HiPO stagnated but HiGHS considers the solution acceptable\n");
11361137
logH_.print("=== Primal-dual feasible point found\n");
11371138
info_.status = kStatusPDFeas;
11381139
} else
@@ -1188,6 +1189,8 @@ bool Solver::checkTerminationKkt() {
11881189
// options, not the original)
11891190
Hoptions_.output_flag = logH_.debug(2);
11901191

1192+
if (!model_.lpOrig()) return false;
1193+
11911194
getHipoNonVertexSolution(Hoptions_, *model_.lpOrig(), model_.n_orig(),
11921195
model_.m_orig(), model_.rhsOrig(),
11931196
model_.constraintsOrig(), *this, model_status,
@@ -1302,32 +1305,6 @@ void Solver::printSummary() const {
13021305
log_stream << textline("IPX iterations:") << integer(info_.ipx_info.iter)
13031306
<< "\n";
13041307

1305-
if (info_.status >= kStatusImprecise) {
1306-
log_stream << textline("Primal residual rel/abs:")
1307-
<< sci(info_.p_res_rel, 0, 2) << " / "
1308-
<< sci(info_.p_res_abs, 0, 2) << '\n';
1309-
1310-
log_stream << textline("Dual residual rel/abs:")
1311-
<< sci(info_.d_res_rel, 0, 2) << " / "
1312-
<< sci(info_.d_res_abs, 0, 2) << '\n';
1313-
1314-
log_stream << textline("Primal objective") << sci(info_.p_obj, 0, 8)
1315-
<< '\n';
1316-
log_stream << textline("Dual objective") << sci(info_.d_obj, 0, 8) << '\n';
1317-
1318-
log_stream << textline("Primal-dual gap:") << sci(info_.pd_gap, 0, 2)
1319-
<< '\n';
1320-
}
1321-
1322-
if (info_.ipx_used &&
1323-
(info_.ipx_info.status_crossover == IPX_STATUS_optimal ||
1324-
info_.ipx_info.status_crossover == IPX_STATUS_imprecise)) {
1325-
log_stream << textline("Basis solution primal infeas:")
1326-
<< sci(info_.ipx_info.primal_infeas, 0, 2) << '\n';
1327-
log_stream << textline("Basis solution dual infeas:")
1328-
<< sci(info_.ipx_info.dual_infeas, 0, 2) << '\n';
1329-
}
1330-
13311308
if (logH_.debug(1)) {
13321309
log_stream << textline("Correctors:") << integer(info_.correctors) << '\n';
13331310
log_stream << textline("Factorisations:") << integer(info_.factor_number)

0 commit comments

Comments
 (0)