Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion cpp/src/mip/problem/problem_helpers.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,6 @@ static void convert_to_maximization_problem(detail::problem_t<i_t, f_t>& op_prob
// negating objective coeffs
op_problem.presolve_data.objective_scaling_factor =
-op_problem.presolve_data.objective_scaling_factor;
op_problem.presolve_data.objective_offset = -op_problem.presolve_data.objective_offset;
}

/*
Expand Down
36 changes: 36 additions & 0 deletions cpp/tests/linear_programming/pdlp_test.cu
Original file line number Diff line number Diff line change
Expand Up @@ -906,6 +906,42 @@ TEST(pdlp_class, run_empty_matrix_dual_simplex)
EXPECT_FALSE(solution.get_additional_termination_information().solved_by_pdlp);
}

TEST(pdlp_class, test_max)
{
const raft::handle_t handle_{};

auto path = make_path_absolute("linear_programming/good-max.mps");
cuopt::mps_parser::mps_data_model_t<int, double> op_problem =
cuopt::mps_parser::parse_mps<int, double>(path);

auto solver_settings = pdlp_solver_settings_t<int, double>{};
solver_settings.method = cuopt::linear_programming::method_t::PDLP;

optimization_problem_solution_t<int, double> solution =
solve_lp(&handle_, op_problem, solver_settings);
EXPECT_EQ((int)solution.get_termination_status(), CUOPT_TERIMINATION_STATUS_OPTIMAL);
EXPECT_NEAR(
solution.get_additional_termination_information().primal_objective, 17.0, factor_tolerance);
}

TEST(pdlp_class, test_max_with_offset)
{
const raft::handle_t handle_{};

auto path = make_path_absolute("linear_programming/max_offset.mps");
cuopt::mps_parser::mps_data_model_t<int, double> op_problem =
cuopt::mps_parser::parse_mps<int, double>(path);

auto solver_settings = pdlp_solver_settings_t<int, double>{};
solver_settings.method = cuopt::linear_programming::method_t::PDLP;

optimization_problem_solution_t<int, double> solution =
solve_lp(&handle_, op_problem, solver_settings);
EXPECT_EQ((int)solution.get_termination_status(), CUOPT_TERIMINATION_STATUS_OPTIMAL);
EXPECT_NEAR(
solution.get_additional_termination_information().primal_objective, 0.0, factor_tolerance);
}

} // namespace cuopt::linear_programming::test

CUOPT_TEST_PROGRAM_MAIN()
19 changes: 19 additions & 0 deletions datasets/linear_programming/good-max.mps
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
NAME MAXEX
OBJSENSE
MAX
ROWS
N OBJ
L LIM1
COLUMNS
X1 OBJ 2 LIM1 1
X2 OBJ 3 LIM1 2
X3 OBJ 1 LIM1 1
RHS
RHS1 LIM1 10
BOUNDS
LO BND1 X1 0
UP BND1 X1 4
LO BND1 X2 0
UP BND1 X2 6
LO BND1 X3 0
ENDATA
25 changes: 25 additions & 0 deletions datasets/linear_programming/max_offset.mps
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
NAME
OBJSENSE
MAXIMIZE
ROWS
N OBJ
L c1
COLUMNS
x1 c1 3
x1 OBJ 1
x2 c1 2
x2 OBJ 2
x3 c1 1
x3 OBJ 3
RHS
rhs c1 2
rhs OBJ 4
RANGES
BOUNDS
LO bounds x1 0
PL bounds x1
LO bounds x2 0
PL bounds x2
LO bounds x3 0
UP bounds x3 1
ENDATA