11/* clang-format off */
22/*
3- * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3+ * SPDX-FileCopyrightText: Copyright (c) 2025-2026 , NVIDIA CORPORATION & AFFILIATES. All rights reserved.
44 * SPDX-License-Identifier: Apache-2.0
55 */
66/* clang-format on */
@@ -623,14 +623,17 @@ f_t compute_initial_primal_infeasibilities(const lp_problem_t<i_t, f_t>& lp,
623623 const std::vector<i_t >& basic_list,
624624 const std::vector<f_t >& x,
625625 std::vector<f_t >& squared_infeasibilities,
626- std::vector<i_t >& infeasibility_indices)
626+ std::vector<i_t >& infeasibility_indices,
627+ f_t & primal_inf)
627628{
628629 const i_t m = lp.num_rows ;
629630 const i_t n = lp.num_cols ;
630- squared_infeasibilities.resize (n, 0.0 );
631+ squared_infeasibilities.resize (n);
632+ std::fill (squared_infeasibilities.begin (), squared_infeasibilities.end (), 0.0 );
631633 infeasibility_indices.reserve (n);
632634 infeasibility_indices.clear ();
633- f_t primal_inf = 0.0 ;
635+ f_t primal_inf_squared = 0.0 ;
636+ primal_inf = 0.0 ;
634637 for (i_t k = 0 ; k < m; ++k) {
635638 const i_t j = basic_list[k];
636639 const f_t lower_infeas = lp.lower [j] - x[j];
@@ -640,10 +643,11 @@ f_t compute_initial_primal_infeasibilities(const lp_problem_t<i_t, f_t>& lp,
640643 const f_t square_infeas = infeas * infeas;
641644 squared_infeasibilities[j] = square_infeas;
642645 infeasibility_indices.push_back (j);
643- primal_inf += square_infeas;
646+ primal_inf_squared += square_infeas;
647+ primal_inf += infeas;
644648 }
645649 }
646- return primal_inf ;
650+ return primal_inf_squared ;
647651}
648652
649653template <typename i_t , typename f_t >
@@ -2241,7 +2245,8 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase,
22412245 assert (superbasic_list.size () == 0 );
22422246 assert (nonbasic_list.size () == n - m);
22432247
2244- if (ft.refactor_basis (lp.A , settings, basic_list, nonbasic_list, vstatus) > 0 ) {
2248+ if (ft.refactor_basis (lp.A , settings, lp.lower , lp.upper , basic_list, nonbasic_list, vstatus) >
2249+ 0 ) {
22452250 return dual::status_t ::NUMERICAL;
22462251 }
22472252
@@ -2268,7 +2273,7 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase,
22682273
22692274#ifdef COMPUTE_DUAL_RESIDUAL
22702275 std::vector<f_t > dual_res1;
2271- compute_dual_residual (lp.A , objective, y, z, dual_res1);
2276+ phase2:: compute_dual_residual (lp.A , objective, y, z, dual_res1);
22722277 f_t dual_res_norm = vector_norm_inf<i_t , f_t >(dual_res1);
22732278 if (dual_res_norm > settings.tight_tol ) {
22742279 settings.log .printf (" || A'*y + z - c || %e\n " , dual_res_norm);
@@ -2357,8 +2362,15 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase,
23572362 std::vector<uint8_t > bounded_variables (n, 0 );
23582363 phase2::compute_bounded_info (lp.lower , lp.upper , bounded_variables);
23592364
2360- f_t primal_infeasibility = phase2::compute_initial_primal_infeasibilities (
2361- lp, settings, basic_list, x, squared_infeasibilities, infeasibility_indices);
2365+ f_t primal_infeasibility;
2366+ f_t primal_infeasibility_squared =
2367+ phase2::compute_initial_primal_infeasibilities (lp,
2368+ settings,
2369+ basic_list,
2370+ x,
2371+ squared_infeasibilities,
2372+ infeasibility_indices,
2373+ primal_infeasibility);
23622374
23632375#ifdef CHECK_BASIC_INFEASIBILITIES
23642376 phase2::check_basic_infeasibilities (basic_list, basic_mark, infeasibility_indices, 0 );
@@ -2556,9 +2568,15 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase,
25562568 std::vector<f_t > unperturbed_x (n);
25572569 phase2::compute_primal_solution_from_basis (
25582570 lp, ft, basic_list, nonbasic_list, vstatus, unperturbed_x);
2559- x = unperturbed_x;
2560- primal_infeasibility = phase2::compute_initial_primal_infeasibilities (
2561- lp, settings, basic_list, x, squared_infeasibilities, infeasibility_indices);
2571+ x = unperturbed_x;
2572+ primal_infeasibility_squared =
2573+ phase2::compute_initial_primal_infeasibilities (lp,
2574+ settings,
2575+ basic_list,
2576+ x,
2577+ squared_infeasibilities,
2578+ infeasibility_indices,
2579+ primal_infeasibility);
25622580 settings.log .printf (" Updated primal infeasibility: %e\n " , primal_infeasibility);
25632581
25642582 objective = lp.objective ;
@@ -2593,9 +2611,15 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase,
25932611 std::vector<f_t > unperturbed_x (n);
25942612 phase2::compute_primal_solution_from_basis (
25952613 lp, ft, basic_list, nonbasic_list, vstatus, unperturbed_x);
2596- x = unperturbed_x;
2597- primal_infeasibility = phase2::compute_initial_primal_infeasibilities (
2598- lp, settings, basic_list, x, squared_infeasibilities, infeasibility_indices);
2614+ x = unperturbed_x;
2615+ primal_infeasibility_squared =
2616+ phase2::compute_initial_primal_infeasibilities (lp,
2617+ settings,
2618+ basic_list,
2619+ x,
2620+ squared_infeasibilities,
2621+ infeasibility_indices,
2622+ primal_infeasibility);
25992623
26002624 const f_t orig_dual_infeas = phase2::dual_infeasibility (
26012625 lp, settings, vstatus, z, settings.tight_tol , settings.dual_tol );
@@ -2810,7 +2834,7 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase,
28102834 delta_xB_0_sparse.i ,
28112835 squared_infeasibilities,
28122836 infeasibility_indices,
2813- primal_infeasibility );
2837+ primal_infeasibility_squared );
28142838 // Update primal infeasibilities due to changes in basic variables
28152839 // from the leaving and entering variables
28162840 phase2::update_primal_infeasibilities (lp,
@@ -2822,7 +2846,7 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase,
28222846 scaled_delta_xB_sparse.i ,
28232847 squared_infeasibilities,
28242848 infeasibility_indices,
2825- primal_infeasibility );
2849+ primal_infeasibility_squared );
28262850 // Update the entering variable
28272851 phase2::update_single_primal_infeasibility (lp.lower ,
28282852 lp.upper ,
@@ -2883,14 +2907,15 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase,
28832907#endif
28842908 if (should_refactor) {
28852909 bool should_recompute_x = false ;
2886- if (ft.refactor_basis (lp.A , settings, basic_list, nonbasic_list, vstatus) > 0 ) {
2910+ if (ft.refactor_basis (
2911+ lp.A , settings, lp.lower , lp.upper , basic_list, nonbasic_list, vstatus) > 0 ) {
28872912 should_recompute_x = true ;
28882913 settings.log .printf (" Failed to factorize basis. Iteration %d\n " , iter);
28892914 if (toc (start_time) > settings.time_limit ) { return dual::status_t ::TIME_LIMIT; }
28902915 i_t count = 0 ;
28912916 i_t deficient_size;
2892- while ((deficient_size =
2893- ft. refactor_basis ( lp.A , settings, basic_list, nonbasic_list, vstatus)) > 0 ) {
2917+ while ((deficient_size = ft. refactor_basis (
2918+ lp.A , settings, lp. lower , lp. upper , basic_list, nonbasic_list, vstatus)) > 0 ) {
28942919 settings.log .printf (" Failed to repair basis. Iteration %d. %d deficient columns.\n " ,
28952920 iter,
28962921 static_cast <int >(deficient_size));
@@ -2912,8 +2937,14 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase,
29122937 lp, ft, basic_list, nonbasic_list, vstatus, unperturbed_x);
29132938 x = unperturbed_x;
29142939 }
2915- phase2::compute_initial_primal_infeasibilities (
2916- lp, settings, basic_list, x, squared_infeasibilities, infeasibility_indices);
2940+ primal_infeasibility_squared =
2941+ phase2::compute_initial_primal_infeasibilities (lp,
2942+ settings,
2943+ basic_list,
2944+ x,
2945+ squared_infeasibilities,
2946+ infeasibility_indices,
2947+ primal_infeasibility);
29172948 }
29182949#ifdef CHECK_BASIC_INFEASIBILITIES
29192950 phase2::check_basic_infeasibilities (basic_list, basic_mark, infeasibility_indices, 7 );
@@ -2951,7 +2982,7 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase,
29512982 iter,
29522983 compute_user_objective (lp, obj),
29532984 infeasibility_indices.size (),
2954- primal_infeasibility ,
2985+ primal_infeasibility_squared ,
29552986 sum_perturb,
29562987 now);
29572988 }
0 commit comments