@@ -627,52 +627,76 @@ void Iterate::finalResiduals(Info& info) const {
627627 }
628628}
629629
630+ void Iterate::setReg (LinearSolver& LS , OptionNla opt) {
631+ // extract regularisation
632+ LS .getReg (total_reg);
633+
634+ // easy access to primal/dual regularisation
635+ if (opt == kOptionNlaNormEq ) {
636+ Rp = nullptr ;
637+ Rd = total_reg.data ();
638+ } else {
639+ Rp = total_reg.data ();
640+ Rd = &total_reg[model->n ()];
641+ }
642+ }
643+
630644void Iterate::residuals6x6 (const NewtonDir& d) {
631645 const std::vector<double >& dx = d.x ;
632646 const std::vector<double >& dy = d.y ;
633647 const std::vector<double >& dxl = d.xl ;
634648 const std::vector<double >& dxu = d.xu ;
635649 const std::vector<double >& dzl = d.zl ;
636650 const std::vector<double >& dzu = d.zu ;
651+ const Int m = model->m ();
652+ const Int n = model->n ();
653+ assert (Rd);
637654
638655 // res1,2,3,4,5,6 contain the rhs of the linear system
639656
640- // ires1 = res1 - A * dx
657+ // ires1 = res1 - A * dx - Rd * dy
641658 ires.r1 = res.r1 ;
642659 model->A ().alphaProductPlusY (-1.0 , dx, ires.r1 );
660+ for (Int i = 0 ; i < m; ++i) {
661+ ires.r1 [i] -= Rd[i] * dy[i];
662+ }
643663
644664 // ires2 = res2 - dx + dxl
645- for (Int i = 0 ; i < model-> n () ; ++i)
665+ for (Int i = 0 ; i < n ; ++i)
646666 if (model->hasLb (i))
647667 ires.r2 [i] = res.r2 [i] - dx[i] + dxl[i];
648668 else
649669 ires.r2 [i] = 0.0 ;
650670
651671 // ires3 = res3 - dx - dxu
652- for (Int i = 0 ; i < model-> n () ; ++i)
672+ for (Int i = 0 ; i < n ; ++i)
653673 if (model->hasUb (i))
654674 ires.r3 [i] = res.r3 [i] - dx[i] - dxu[i];
655675 else
656676 ires.r3 [i] = 0.0 ;
657677
658- // ires4 = res4 - A^T * dy - dzl + dzu
678+ // ires4 = res4 - A^T * dy - dzl + dzu + Rp * dx
659679 ires.r4 = res.r4 ;
660- for (Int i = 0 ; i < model-> n () ; ++i) {
680+ for (Int i = 0 ; i < n ; ++i) {
661681 if (model->hasLb (i)) ires.r4 [i] -= dzl[i];
662682 if (model->hasUb (i)) ires.r4 [i] += dzu[i];
663683 }
664684 model->A ().alphaProductPlusY (-1.0 , dy, ires.r4 , true );
685+ for (Int i = 0 ; i < n; ++i) {
686+ double reg_p = Rp ? Rp[i] : regul.primal ;
687+ ires.r4 [i] += reg_p * dx[i];
688+ }
665689
666690 // ires5 = res5 - zl * dxl - xl * dzl
667- for (Int i = 0 ; i < model-> n () ; ++i) {
691+ for (Int i = 0 ; i < n ; ++i) {
668692 if (model->hasLb (i))
669693 ires.r5 [i] = res.r5 [i] - zl[i] * dxl[i] - xl[i] * dzl[i];
670694 else
671695 ires.r5 [i] = 0.0 ;
672696 }
673697
674698 // ires6 = res6 - zu * dxu - xu * dzu
675- for (Int i = 0 ; i < model-> n () ; ++i) {
699+ for (Int i = 0 ; i < n ; ++i) {
676700 if (model->hasUb (i))
677701 ires.r6 [i] = res.r6 [i] - zu[i] * dxu[i] - xu[i] * dzu[i];
678702 else
0 commit comments