624 T& primal_feasibility_eq_rhs_0,
625 T& primal_feasibility_in_rhs_0,
626 T& dual_feasibility_rhs_0,
627 T& dual_feasibility_rhs_1,
628 T& dual_feasibility_rhs_3,
639 isize n = x_e.rows();
642 dual_residual_scaled = qp_scaled.g.to_eigen();
646 dual_residual_scaled += tmp;
648 precond.unscale_dual_residual_in_place(
649 { proxqp::from_eigen, tmp });
650 dual_feasibility_rhs_0 = infty_norm(tmp);
651 precond.unscale_primal_in_place({ proxqp::from_eigen, x_e });
652 results.info.duality_gap = x_e.dot(data.g);
653 rhs_duality_gap = std::fabs(results.info.duality_gap);
655 const T xHx = (tmp).dot(x_e);
656 results.info.duality_gap += xHx;
657 rhs_duality_gap = std::max(rhs_duality_gap, std::abs(xHx));
659 precond.scale_primal_in_place({ proxqp::from_eigen, x_e });
661 precond.unscale_dual_in_place_eq({ proxsuite::proxqp::from_eigen, y_e });
662 const T by = (data.b).dot(y_e);
663 results.info.duality_gap += by;
664 rhs_duality_gap = std::max(rhs_duality_gap, std::abs(by));
665 precond.scale_dual_in_place_eq({ proxsuite::proxqp::from_eigen, y_e });
667 precond.unscale_dual_in_place_in({ proxsuite::proxqp::from_eigen, z_e });
672 results.info.duality_gap += zl;
673 rhs_duality_gap = std::max(rhs_duality_gap, std::abs(zl));
678 results.info.duality_gap += zu;
679 rhs_duality_gap = std::max(rhs_duality_gap, std::abs(zu));
681 precond.scale_dual_in_place_in({ proxsuite::proxqp::from_eigen, z_e });
687 primal_residual_eq_scaled.setZero();
690 primal_residual_eq_scaled, ATy, qp_scaled.AT.to_eigen(), x_e, y_e);
692 dual_residual_scaled += ATy;
694 precond.unscale_dual_residual_in_place({ proxqp::from_eigen, ATy });
695 dual_feasibility_rhs_1 = infty_norm(ATy);
701 primal_residual_in_scaled_up.setZero();
704 primal_residual_in_scaled_up, CTz, qp_scaled.CT.to_eigen(), x_e, z_e);
706 dual_residual_scaled += CTz;
708 precond.unscale_dual_residual_in_place({ proxqp::from_eigen, CTz });
709 dual_feasibility_rhs_3 = infty_norm(CTz);
711 precond.unscale_primal_residual_in_place_eq(
712 { proxqp::from_eigen, primal_residual_eq_scaled });
713 primal_feasibility_eq_rhs_0 = infty_norm(primal_residual_eq_scaled);
715 precond.unscale_primal_residual_in_place_in(
716 { proxqp::from_eigen, primal_residual_in_scaled_up });
717 primal_feasibility_in_rhs_0 = infty_norm(primal_residual_in_scaled_up);
722 primal_residual_in_scaled_lo =
726 primal_residual_eq_scaled -= b;
727 T primal_feasibility_eq_lhs = infty_norm(primal_residual_eq_scaled);
728 T primal_feasibility_in_lhs = infty_norm(primal_residual_in_scaled_lo);
729 T primal_feasibility_lhs =
730 std::max(primal_feasibility_eq_lhs, primal_feasibility_in_lhs);
732 if ((settings.primal_infeasibility_solving &&
736 results.se = primal_residual_eq_scaled;
737 results.si = primal_residual_in_scaled_lo;
738 precond.unscale_primal_residual_in_place_eq(
739 { proxqp::from_eigen,
740 primal_residual_eq_scaled });
741 tmp.noalias() = qp_scaled.AT.to_eigen() * primal_residual_eq_scaled;
745 precond.unscale_primal_residual_in_place_in(
746 { proxqp::from_eigen,
747 primal_residual_in_scaled_lo });
748 tmp.noalias() += qp_scaled.CT.to_eigen() * primal_residual_in_scaled_lo;
750 precond.unscale_dual_residual_in_place({ proxqp::from_eigen, tmp });
752 primal_feasibility_lhs = infty_norm(tmp);
753 precond.scale_primal_residual_in_place_eq(
754 { proxqp::from_eigen, primal_residual_eq_scaled });
758 precond.scale_primal_residual_in_place_eq(
759 { proxqp::from_eigen, primal_residual_eq_scaled });
761 precond.scale_primal_residual_in_place_in(
762 { proxqp::from_eigen, primal_residual_in_scaled_up });
764 precond.unscale_dual_residual_in_place(
765 { proxqp::from_eigen, dual_residual_scaled });
766 T dual_feasibility_lhs = infty_norm(dual_residual_scaled);
767 precond.scale_dual_residual_in_place(
768 { proxqp::from_eigen, dual_residual_scaled });
770 return proxsuite::linalg::veg::tuplify(primal_feasibility_lhs,
771 dual_feasibility_lhs);