Skip to content

Commit 1ad053b

Browse files
committed
Add dual post solve test
1 parent c7f609b commit 1ad053b

File tree

1 file changed

+34
-1
lines changed

1 file changed

+34
-1
lines changed

cpp/tests/linear_programming/pdlp_test.cu

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
860893
TEST(dual_simplex, afiro)
861894
{
862895
cuopt::linear_programming::pdlp_solver_settings_t<int, double> settings =

0 commit comments

Comments
 (0)