@@ -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 ;
0 commit comments