Skip to content

Commit 9b55988

Browse files
committed
Merge branch 'main' into fix-qcqp-nonconvex-reject
Signed-off-by: YUWEN Chen <yuwchen@nvidia.com> # Conflicts: # cpp/tests/socp/general_quadratic_test.cu
2 parents e5cae5a + 1eb0d17 commit 9b55988

444 files changed

Lines changed: 5509 additions & 5142 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.coderabbit.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ reviews:
7171
- Suggest documenting thread-safety, GPU requirements, numerical behavior
7272
- For breaking changes, recommend migration notes
7373
74-
- path: "cpp/include/cuopt/linear_programming/cuopt_c.h"
74+
- path: "cpp/include/cuopt/mathematical_optimization/cuopt_c.h"
7575
instructions: |
7676
This is the C ABI surface. Flag ANY change to struct layout, function
7777
signatures, enum values, or typedef shape as potentially ABI-breaking.

.github/.coderabbit_review_guide.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ from the actual code and from `.clang-format`.
5454
- Private/protected member variables: trailing underscore (e.g. `error_type_`)
5555
- Project macros: `SCREAMING_SNAKE_CASE` with `CUOPT_` prefix (e.g. `CUOPT_EXPECTS`)
5656
- **File extensions**: `.hpp`/`.cpp` for C++ host code; `.cuh`/`.cu` for CUDA;
57-
`.h` reserved for the C ABI surface (`cpp/include/cuopt/linear_programming/cuopt_c.h`).
57+
`.h` reserved for the C ABI surface (`cpp/include/cuopt/mathematical_optimization/cuopt_c.h`).
5858
- **Column limit**: 100 (set in `.clang-format`).
5959
- **Error handling**: `throw` + `cuopt_expects(...)` / `CUOPT_EXPECTS(...)`
6060
macros from `cpp/include/cuopt/error.hpp`, which throw `cuopt::logic_error`.
@@ -113,7 +113,7 @@ CodeRabbit should focus on what they do *not* cover:
113113

114114
### C API
115115

116-
The C API surface is intentionally narrow — `cpp/include/cuopt/linear_programming/cuopt_c.h`.
116+
The C API surface is intentionally narrow — `cpp/include/cuopt/mathematical_optimization/cuopt_c.h`.
117117

118118
- **Any change to `cuopt_c.h` should be flagged for maintainer awareness** (ABI-sensitive). There is no formal ABI-versioning macro today, so phrase it as "this changes the C ABI surface — confirm this is intentional and documented."
119119

@@ -149,7 +149,7 @@ Bug Patterns" section to avoid duplication.
149149
- Missing RAII in exception paths (cuOpt uses exceptions)
150150

151151
**API surface**
152-
- Any change to `cpp/include/cuopt/linear_programming/cuopt_c.h` — flag as ABI-sensitive
152+
- Any change to `cpp/include/cuopt/mathematical_optimization/cuopt_c.h` — flag as ABI-sensitive
153153
- Python API changes without `DeprecationWarning`
154154
- Server API endpoint changes without deprecation path
155155

.github/workflows/pr.yaml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ jobs:
3434
- wheel-tests-cuopt-server
3535
- wheel-build-cuopt-sh-client
3636
- test-self-hosted-server
37+
- pr-test-summary
3738
permissions:
3839
contents: read
3940
uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@main
@@ -623,3 +624,25 @@ jobs:
623624
with:
624625
build_type: pull-request
625626
script: ci/test_self_hosted_service.sh
627+
pr-test-summary:
628+
needs:
629+
- conda-cpp-tests
630+
- conda-python-tests
631+
- wheel-tests-cuopt
632+
- wheel-tests-cuopt-server
633+
- test-self-hosted-server
634+
if: always()
635+
continue-on-error: true
636+
runs-on: ubuntu-latest
637+
permissions:
638+
actions: read
639+
pull-requests: write
640+
steps:
641+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
642+
with:
643+
persist-credentials: false
644+
sparse-checkout: ci/utils/pr_test_summary.py
645+
sparse-checkout-cone-mode: false
646+
- run: python3 ci/utils/pr_test_summary.py
647+
env:
648+
GH_TOKEN: ${{ github.token }}

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ __pycache__
1212
*.dylib
1313
.cache
1414
.vscode
15+
.cursor/
1516
*.swp
1617
*.pytest_cache
1718
*.manifest

benchmarks/linear_programming/cuopt/benchmark_helper.hpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77

88
#pragma once
99

10-
#include <cuopt/linear_programming/io/parser.hpp>
11-
#include <cuopt/linear_programming/optimization_problem_interface.hpp>
12-
#include <cuopt/linear_programming/pdlp/pdlp_hyper_params.cuh>
13-
#include <cuopt/linear_programming/pdlp/solver_solution.hpp>
14-
#include <cuopt/linear_programming/solve.hpp>
10+
#include <cuopt/mathematical_optimization/io/parser.hpp>
11+
#include <cuopt/mathematical_optimization/optimization_problem_interface.hpp>
12+
#include <cuopt/mathematical_optimization/pdlp/pdlp_hyper_params.cuh>
13+
#include <cuopt/mathematical_optimization/pdlp/solver_solution.hpp>
14+
#include <cuopt/mathematical_optimization/solve.hpp>
1515

1616
#include <raft/sparse/detail/cusparse_wrappers.h>
1717
#include <raft/core/cusparse_macros.hpp>
@@ -57,9 +57,8 @@ void parse_value(std::istringstream& iss, bool& value)
5757
iss >> std::boolalpha >> value;
5858
}
5959

60-
void fill_pdlp_hyper_params(
61-
const std::string& pdlp_hyper_params_path,
62-
cuopt::linear_programming::pdlp_hyper_params::pdlp_hyper_params_t& params)
60+
void fill_pdlp_hyper_params(const std::string& pdlp_hyper_params_path,
61+
cuopt::mathematical_optimization::pdlp::pdlp_hyper_params_t& params)
6362
{
6463
if (!std::filesystem::exists(pdlp_hyper_params_path)) {
6564
std::cerr << "PDLP config file path is not a valid: " << pdlp_hyper_params_path << std::endl;
@@ -205,8 +204,9 @@ std::vector<T> read_vector_from_file(const std::string& filename)
205204
}
206205

207206
template <typename i_t, typename f_t>
208-
void write_problem_info(const cuopt::linear_programming::io::mps_data_model_t<i_t, f_t>& op_problem,
209-
const std::string& filename)
207+
void write_problem_info(
208+
const cuopt::mathematical_optimization::io::mps_data_model_t<i_t, f_t>& op_problem,
209+
const std::string& filename)
210210
{
211211
std::ofstream file(filename);
212212
if (!file) {
@@ -222,8 +222,9 @@ void write_problem_info(const cuopt::linear_programming::io::mps_data_model_t<i_
222222
}
223223

224224
template <typename i_t, typename f_t>
225-
void read_problem_info(cuopt::linear_programming::optimization_problem_t<i_t, f_t>& op_problem,
226-
const std::string& filename)
225+
void read_problem_info(
226+
cuopt::mathematical_optimization::optimization_problem_t<i_t, f_t>& op_problem,
227+
const std::string& filename)
227228
{
228229
std::ifstream file(filename);
229230
if (!file) {
@@ -274,8 +275,8 @@ void mps_file_to_binary(const std::filesystem::path& filename)
274275

275276
std::string p = std::string(filename);
276277

277-
cuopt::linear_programming::io::mps_data_model_t<int, double> op_problem =
278-
cuopt::linear_programming::io::read_mps<int, double>(p);
278+
cuopt::mathematical_optimization::io::mps_data_model_t<int, double> op_problem =
279+
cuopt::mathematical_optimization::io::read_mps<int, double>(p);
279280

280281
auto filename_string = filename.filename().string();
281282

benchmarks/linear_programming/cuopt/initial_problem_check.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct violation {
3030
};
3131

3232
bool test_constraint_and_variable_sanity(
33-
const cuopt::linear_programming::io::mps_data_model_t<int, double>& op_problem,
33+
const cuopt::mathematical_optimization::io::mps_data_model_t<int, double>& op_problem,
3434
const std::vector<double>& primal_vars,
3535
double abs_tol,
3636
double rel_tol,

benchmarks/linear_programming/cuopt/run_mip.cpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
#include "miplib2017_bks.hpp"
1010

1111
#include <cstdio>
12-
#include <cuopt/linear_programming/io/parser.hpp>
13-
#include <cuopt/linear_programming/mip/solver_settings.hpp>
14-
#include <cuopt/linear_programming/mip/solver_solution.hpp>
15-
#include <cuopt/linear_programming/optimization_problem_interface.hpp>
16-
#include <cuopt/linear_programming/solve.hpp>
12+
#include <cuopt/mathematical_optimization/io/parser.hpp>
13+
#include <cuopt/mathematical_optimization/mip/solver_settings.hpp>
14+
#include <cuopt/mathematical_optimization/mip/solver_solution.hpp>
15+
#include <cuopt/mathematical_optimization/optimization_problem_interface.hpp>
16+
#include <cuopt/mathematical_optimization/solve.hpp>
1717
#include <utilities/logger.hpp>
1818

1919
#include <raft/core/handle.hpp>
@@ -152,7 +152,7 @@ int run_single_file(std::string file_path,
152152
bool deterministic)
153153
{
154154
const raft::handle_t handle_{};
155-
cuopt::linear_programming::mip_solver_settings_t<int, double> settings;
155+
cuopt::mathematical_optimization::mip_solver_settings_t<int, double> settings;
156156
std::string base_filename = file_path.substr(file_path.find_last_of("/\\") + 1);
157157
// if output directory is given, set the log file
158158
if (write_log_file) {
@@ -167,13 +167,13 @@ int run_single_file(std::string file_path,
167167
}
168168

169169
constexpr bool input_mps_strict = false;
170-
cuopt::linear_programming::io::mps_data_model_t<int, double> mps_data_model;
170+
cuopt::mathematical_optimization::io::mps_data_model_t<int, double> mps_data_model;
171171
bool parsing_failed = false;
172172
{
173173
CUOPT_LOG_INFO("running file %s on gpu : %d", base_filename.c_str(), device);
174174
try {
175175
mps_data_model =
176-
cuopt::linear_programming::io::read_mps<int, double>(file_path, input_mps_strict);
176+
cuopt::mathematical_optimization::io::read_mps<int, double>(file_path, input_mps_strict);
177177
} catch (const std::logic_error& e) {
178178
CUOPT_LOG_ERROR("MPS parser execption: %s", e.what());
179179
parsing_failed = true;
@@ -211,14 +211,14 @@ int run_single_file(std::string file_path,
211211
settings.determinism_mode = deterministic ? CUOPT_MODE_DETERMINISTIC : CUOPT_MODE_OPPORTUNISTIC;
212212
settings.tolerances.relative_tolerance = 1e-12;
213213
settings.tolerances.absolute_tolerance = 1e-6;
214-
settings.presolver = cuopt::linear_programming::presolver_t::Default;
214+
settings.presolver = cuopt::mathematical_optimization::presolver_t::Default;
215215
settings.reliability_branching = reliability_branching;
216216
settings.clique_cuts = -1;
217217
settings.seed = 42;
218-
cuopt::linear_programming::benchmark_info_t benchmark_info;
218+
cuopt::mathematical_optimization::benchmark_info_t benchmark_info;
219219
settings.benchmark_info_ptr = &benchmark_info;
220220
auto start_run_solver = std::chrono::high_resolution_clock::now();
221-
auto solution = cuopt::linear_programming::solve_mip(&handle_, mps_data_model, settings);
221+
auto solution = cuopt::mathematical_optimization::solve_mip(&handle_, mps_data_model, settings);
222222
CUOPT_LOG_INFO(
223223
"first obj: %f last improvement of best feasible: %f last improvement after recombination: %f",
224224
benchmark_info.objective_of_initial_population,
@@ -231,9 +231,9 @@ int run_single_file(std::string file_path,
231231
CUOPT_LOG_INFO("run_solver %d", duration.count());
232232
handle_.sync_stream();
233233
int sol_found = int(solution.get_termination_status() ==
234-
cuopt::linear_programming::mip_termination_status_t::FeasibleFound ||
234+
cuopt::mathematical_optimization::mip_termination_status_t::FeasibleFound ||
235235
solution.get_termination_status() ==
236-
cuopt::linear_programming::mip_termination_status_t::Optimal);
236+
cuopt::mathematical_optimization::mip_termination_status_t::Optimal);
237237
double obj_val = sol_found ? solution.get_objective_value() : std::numeric_limits<double>::max();
238238
if (sol_found) {
239239
CUOPT_LOG_INFO("%s: solution found, obj: %f", base_filename.c_str(), obj_val);
@@ -254,16 +254,16 @@ int run_single_file(std::string file_path,
254254
1000.0;
255255
std::string _status_str;
256256
switch (solution.get_termination_status()) {
257-
case cuopt::linear_programming::mip_termination_status_t::Optimal:
257+
case cuopt::mathematical_optimization::mip_termination_status_t::Optimal:
258258
_status_str = "Optimal";
259259
break;
260-
case cuopt::linear_programming::mip_termination_status_t::FeasibleFound:
260+
case cuopt::mathematical_optimization::mip_termination_status_t::FeasibleFound:
261261
_status_str = "FeasibleFound";
262262
break;
263-
case cuopt::linear_programming::mip_termination_status_t::TimeLimit:
263+
case cuopt::mathematical_optimization::mip_termination_status_t::TimeLimit:
264264
_status_str = "TimeLimit";
265265
break;
266-
case cuopt::linear_programming::mip_termination_status_t::Infeasible:
266+
case cuopt::mathematical_optimization::mip_termination_status_t::Infeasible:
267267
_status_str = "Infeasible";
268268
break;
269269
default: _status_str = "Other"; break;
@@ -281,7 +281,7 @@ int run_single_file(std::string file_path,
281281
int decimal_places = 2;
282282
double mip_gap = solution.get_mip_gap();
283283
int is_optimal = solution.get_termination_status() ==
284-
cuopt::linear_programming::mip_termination_status_t::Optimal
284+
cuopt::mathematical_optimization::mip_termination_status_t::Optimal
285285
? 1
286286
: 0;
287287
ss << std::fixed << std::setprecision(decimal_places) << base_filename << "," << sol_found << ","

benchmarks/linear_programming/cuopt/run_pdlp.cu

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
*/
66
/* clang-format on */
77

8-
#include <cuopt/linear_programming/io/parser.hpp>
9-
#include <cuopt/linear_programming/optimization_problem_interface.hpp>
10-
#include <cuopt/linear_programming/pdlp/solver_solution.hpp>
11-
#include <cuopt/linear_programming/solve.hpp>
12-
#include <cuopt/linear_programming/solver_settings.hpp>
8+
#include <cuopt/mathematical_optimization/io/parser.hpp>
9+
#include <cuopt/mathematical_optimization/optimization_problem_interface.hpp>
10+
#include <cuopt/mathematical_optimization/pdlp/solver_solution.hpp>
11+
#include <cuopt/mathematical_optimization/solve.hpp>
12+
#include <cuopt/mathematical_optimization/solver_settings.hpp>
1313

1414
#include <raft/sparse/detail/cusparse_wrappers.h>
1515
#include <raft/core/cusparse_macros.hpp>
@@ -85,50 +85,55 @@ static void parse_arguments(argparse::ArgumentParser& program)
8585
.choices("default", "single", "double", "mixed");
8686
}
8787

88-
static cuopt::linear_programming::presolver_t string_to_presolver(const std::string& presolver)
88+
static cuopt::mathematical_optimization::presolver_t string_to_presolver(
89+
const std::string& presolver)
8990
{
90-
if (presolver == "None") return cuopt::linear_programming::presolver_t::None;
91-
if (presolver == "Papilo") return cuopt::linear_programming::presolver_t::Papilo;
92-
if (presolver == "PSLP") return cuopt::linear_programming::presolver_t::PSLP;
93-
if (presolver == "Default") return cuopt::linear_programming::presolver_t::Default;
94-
return cuopt::linear_programming::presolver_t::Default;
91+
if (presolver == "None") return cuopt::mathematical_optimization::presolver_t::None;
92+
if (presolver == "Papilo") return cuopt::mathematical_optimization::presolver_t::Papilo;
93+
if (presolver == "PSLP") return cuopt::mathematical_optimization::presolver_t::PSLP;
94+
if (presolver == "Default") return cuopt::mathematical_optimization::presolver_t::Default;
95+
return cuopt::mathematical_optimization::presolver_t::Default;
9596
}
9697

97-
static cuopt::linear_programming::pdlp_precision_t string_to_pdlp_precision(
98+
static cuopt::mathematical_optimization::pdlp_precision_t string_to_pdlp_precision(
9899
const std::string& precision)
99100
{
100-
if (precision == "single") return cuopt::linear_programming::pdlp_precision_t::SinglePrecision;
101-
if (precision == "double") return cuopt::linear_programming::pdlp_precision_t::DoublePrecision;
102-
if (precision == "mixed") return cuopt::linear_programming::pdlp_precision_t::MixedPrecision;
103-
return cuopt::linear_programming::pdlp_precision_t::DefaultPrecision;
101+
if (precision == "single")
102+
return cuopt::mathematical_optimization::pdlp_precision_t::SinglePrecision;
103+
if (precision == "double")
104+
return cuopt::mathematical_optimization::pdlp_precision_t::DoublePrecision;
105+
if (precision == "mixed")
106+
return cuopt::mathematical_optimization::pdlp_precision_t::MixedPrecision;
107+
return cuopt::mathematical_optimization::pdlp_precision_t::DefaultPrecision;
104108
}
105109

106-
static cuopt::linear_programming::pdlp_solver_mode_t string_to_pdlp_solver_mode(
110+
static cuopt::mathematical_optimization::pdlp_solver_mode_t string_to_pdlp_solver_mode(
107111
const std::string& mode)
108112
{
109-
if (mode == "Stable1") return cuopt::linear_programming::pdlp_solver_mode_t::Stable1;
113+
if (mode == "Stable1") return cuopt::mathematical_optimization::pdlp_solver_mode_t::Stable1;
110114
if (mode == "Stable2")
111-
return cuopt::linear_programming::pdlp_solver_mode_t::Stable2;
115+
return cuopt::mathematical_optimization::pdlp_solver_mode_t::Stable2;
112116
else if (mode == "Methodical1")
113-
return cuopt::linear_programming::pdlp_solver_mode_t::Methodical1;
117+
return cuopt::mathematical_optimization::pdlp_solver_mode_t::Methodical1;
114118
else if (mode == "Fast1")
115-
return cuopt::linear_programming::pdlp_solver_mode_t::Fast1;
119+
return cuopt::mathematical_optimization::pdlp_solver_mode_t::Fast1;
116120
else if (mode == "Stable3")
117-
return cuopt::linear_programming::pdlp_solver_mode_t::Stable3;
118-
return cuopt::linear_programming::pdlp_solver_mode_t::Stable3;
121+
return cuopt::mathematical_optimization::pdlp_solver_mode_t::Stable3;
122+
return cuopt::mathematical_optimization::pdlp_solver_mode_t::Stable3;
119123
}
120124

121-
static cuopt::linear_programming::pdlp_solver_settings_t<int, double> create_solver_settings(
125+
static cuopt::mathematical_optimization::pdlp_solver_settings_t<int, double> create_solver_settings(
122126
const argparse::ArgumentParser& program)
123127
{
124-
cuopt::linear_programming::pdlp_solver_settings_t<int, double> settings{};
128+
cuopt::mathematical_optimization::pdlp_solver_settings_t<int, double> settings{};
125129

126130
settings.time_limit = program.get<double>("--time-limit");
127131
settings.iteration_limit = program.get<int>("--iteration-limit");
128132
settings.set_optimality_tolerance(program.get<double>("--optimality-tolerance"));
129133
settings.pdlp_solver_mode =
130134
string_to_pdlp_solver_mode(program.get<std::string>("--pdlp-solver-mode"));
131-
settings.method = static_cast<cuopt::linear_programming::method_t>(program.get<int>("--method"));
135+
settings.method =
136+
static_cast<cuopt::mathematical_optimization::method_t>(program.get<int>("--method"));
132137
settings.crossover = program.get<int>("--crossover");
133138
settings.presolver = string_to_presolver(program.get<std::string>("--presolver"));
134139
settings.pdlp_precision = string_to_pdlp_precision(program.get<std::string>("--pdlp-precision"));
@@ -148,13 +153,13 @@ static int run_solver(const argparse::ArgumentParser& program, const raft::handl
148153
}
149154

150155
// Parse MPS file
151-
cuopt::linear_programming::io::mps_data_model_t<int, double> op_problem =
152-
cuopt::linear_programming::io::read_mps<int, double>(program.get<std::string>("--path"));
156+
cuopt::mathematical_optimization::io::mps_data_model_t<int, double> op_problem =
157+
cuopt::mathematical_optimization::io::read_mps<int, double>(program.get<std::string>("--path"));
153158

154159
// Solve LP problem
155160
bool problem_checking = true;
156-
cuopt::linear_programming::optimization_problem_solution_t<int, double> solution =
157-
cuopt::linear_programming::solve_lp(
161+
cuopt::mathematical_optimization::optimization_problem_solution_t<int, double> solution =
162+
cuopt::mathematical_optimization::solve_lp(
158163
&handle_, op_problem, settings, problem_checking, use_pdlp_solver_mode);
159164

160165
// Write solution to file if requested

0 commit comments

Comments
 (0)