@@ -210,13 +210,15 @@ TEST(pdlp_class, run_sub_mittleman)
210210 for (auto solver_mode : solver_mode_list) {
211211 auto settings = pdlp_solver_settings_t <int , double >{};
212212 settings.pdlp_solver_mode = solver_mode;
213+ settings.dual_postsolve = false ;
213214 for (auto [presolve, epsilon] : {std::pair{true , 1e-1 }, std::pair{false , 1e-6 }}) {
214215 settings.presolve = presolve;
215216 settings.method = cuopt::linear_programming::method_t ::PDLP;
216217 const raft::handle_t handle_{};
217218 optimization_problem_solution_t <int , double > solution =
218219 solve_lp (&handle_, op_problem, settings);
219- printf (" running %s mode %d presolve? %d\n " , name.c_str (), (int )solver_mode, presolve);
220+ printf (
221+ " running %s mode %d presolve? %d\n " , name.c_str (), (int )solver_mode, settings.presolve );
220222 EXPECT_EQ ((int )solution.get_termination_status (), CUOPT_TERIMINATION_STATUS_OPTIMAL);
221223 EXPECT_FALSE (is_incorrect_objective (
222224 expected_objective_value,
@@ -857,6 +859,37 @@ TEST(pdlp_class, warm_start)
857859 }
858860}
859861
862+ TEST (pdlp_class, dual_postsolve_size)
863+ {
864+ const raft::handle_t handle_{};
865+
866+ auto path = make_path_absolute (" linear_programming/afiro_original.mps" );
867+ cuopt::mps_parser::mps_data_model_t <int , double > op_problem =
868+ cuopt::mps_parser::parse_mps<int , double >(path, true );
869+
870+ auto solver_settings = pdlp_solver_settings_t <int , double >{};
871+ solver_settings.method = cuopt::linear_programming::method_t ::PDLP;
872+ solver_settings.presolve = true ;
873+
874+ // With dual_postsolve on, dual solution size should match number of constraints
875+ {
876+ solver_settings.dual_postsolve = true ;
877+ optimization_problem_solution_t <int , double > solution =
878+ solve_lp (&handle_, op_problem, solver_settings);
879+ EXPECT_EQ ((int )solution.get_termination_status (), CUOPT_TERIMINATION_STATUS_OPTIMAL);
880+ EXPECT_EQ (solution.get_dual_solution ().size (), op_problem.get_n_variables ());
881+ }
882+
883+ // With dual_postsolve off, dual solution size should be 0
884+ {
885+ solver_settings.dual_postsolve = false ;
886+ optimization_problem_solution_t <int , double > solution =
887+ solve_lp (&handle_, op_problem, solver_settings);
888+ EXPECT_EQ ((int )solution.get_termination_status (), CUOPT_TERIMINATION_STATUS_OPTIMAL);
889+ EXPECT_EQ (solution.get_dual_solution ().size (), 0 );
890+ }
891+ }
892+
860893TEST (dual_simplex, afiro)
861894{
862895 cuopt::linear_programming::pdlp_solver_settings_t <int , double > settings =
0 commit comments