Skip to content
Open
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: 1 addition & 0 deletions cpp/src/pdlp/cuopt_c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1182,6 +1182,7 @@ cuopt_int_t cuOptGetErrorString(cuOptSolution solution,
{
if (solution == nullptr) { return CUOPT_INVALID_ARGUMENT; }
if (error_string_ptr == nullptr) { return CUOPT_INVALID_ARGUMENT; }
if (error_string_size <= 0) { return CUOPT_INVALID_ARGUMENT; }
solution_and_stream_view_t* solution_and_stream_view =
static_cast<solution_and_stream_view_t*>(solution);
std::string error_string = solution_and_stream_view->get_solution()->get_error_status().what();
Expand Down
71 changes: 71 additions & 0 deletions cpp/tests/linear_programming/c_api_tests/c_api_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,77 @@ cuopt_int_t test_bad_parameter_name()
return status;
}

cuopt_int_t test_error_string_invalid_buffer_size()
{
cuOptOptimizationProblem problem = NULL;
cuOptSolverSettings settings = NULL;
cuOptSolution solution = NULL;
cuopt_int_t status;

cuopt_float_t objective[] = {1.0};
cuopt_int_t row_offsets[] = {0, 1};
cuopt_int_t column_indices[] = {0};
cuopt_float_t values[] = {1.0};
char constraint_sense[] = {CUOPT_LESS_THAN};
cuopt_float_t rhs[] = {1.0};
cuopt_float_t lower_bounds[] = {0.0};
cuopt_float_t upper_bounds[] = {1.0};
char variable_types[] = {CUOPT_CONTINUOUS};
char error_string[8] = "unset";

status = cuOptCreateProblem(1,
1,
CUOPT_MINIMIZE,
0.0,
objective,
row_offsets,
column_indices,
values,
constraint_sense,
rhs,
lower_bounds,
upper_bounds,
variable_types,
&problem);
if (status != CUOPT_SUCCESS) {
printf("Error creating optimization problem\n");
goto DONE;
}

status = cuOptCreateSolverSettings(&settings);
if (status != CUOPT_SUCCESS) {
printf("Error creating solver settings\n");
goto DONE;
}

status = cuOptSolve(problem, settings, &solution);
if (status != CUOPT_SUCCESS) {
printf("Error solving problem\n");
goto DONE;
}

status = cuOptGetErrorString(solution, error_string, 0);
if (status != CUOPT_INVALID_ARGUMENT) {
printf("Error: expected invalid argument for zero error buffer size, but got %d\n", status);
goto DONE;
}

status = cuOptGetErrorString(solution, error_string, -1);
if (status != CUOPT_INVALID_ARGUMENT) {
printf("Error: expected invalid argument for negative error buffer size, but got %d\n",
status);
goto DONE;
}

status = CUOPT_SUCCESS;

DONE:
cuOptDestroyProblem(&problem);
cuOptDestroySolverSettings(&settings);
cuOptDestroySolution(&solution);
return status;
}

typedef struct mip_callback_context_t {
cuopt_int_t n_variables;
int get_calls;
Expand Down
5 changes: 5 additions & 0 deletions cpp/tests/linear_programming/c_api_tests/c_api_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ TEST(c_api, solve_time_bb_preemption)

TEST(c_api, bad_parameter_name) { EXPECT_EQ(test_bad_parameter_name(), CUOPT_INVALID_ARGUMENT); }

TEST(c_api, error_string_invalid_buffer_size)
{
EXPECT_EQ(test_error_string_invalid_buffer_size(), CUOPT_SUCCESS);
}

TEST(c_api, mip_get_callbacks_only) { EXPECT_EQ(test_mip_get_callbacks_only(), CUOPT_SUCCESS); }

TEST(c_api, mip_get_set_callbacks) { EXPECT_EQ(test_mip_get_set_callbacks(), CUOPT_SUCCESS); }
Expand Down
1 change: 1 addition & 0 deletions cpp/tests/linear_programming/c_api_tests/c_api_tests.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ cuopt_int_t solve_mps_file(const char* filename,
cuopt_int_t test_missing_file();
cuopt_int_t test_infeasible_problem();
cuopt_int_t test_bad_parameter_name();
cuopt_int_t test_error_string_invalid_buffer_size();
cuopt_int_t test_mip_get_callbacks_only();
cuopt_int_t test_mip_get_set_callbacks();
cuopt_int_t test_ranged_problem(cuopt_int_t* termination_status_ptr, cuopt_float_t* objective_ptr);
Expand Down