Skip to content

Commit 04fbd46

Browse files
Merge main into ci/retire-correctness-regression-tests, resolve conflicts
Conflict resolutions: - test_incumbent_callbacks.py: keep PR's removal of swath1.mps from both parametrize lists - test_distance_engine.py: use main's copyright comma format; keep PR's removal of test_compute_cost_matrix and its helper functions - test_socp.py: drop unused EXPECTED_SOCP_3_* constants (inlined by main); keep PR's removal of test_socp_1_barrier_solution and test_general_quadratic_unsymmetric; include new test_rotated_soc_natural_cross_term_barrier_solution added on main Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2 parents 1d66a5f + 438e54c commit 04fbd46

676 files changed

Lines changed: 70236 additions & 11071 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.

.clang-format

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ BreakConstructorInitializers: BeforeColon
5656
BreakInheritanceList: BeforeColon
5757
BreakStringLiterals: true
5858
ColumnLimit: 100
59-
CommentPragmas: '^ IWYU pragma:'
59+
CommentPragmas: '(IWYU pragma:|SPDX-)'
6060
CompactNamespaces: false
6161
ConstructorInitializerAllOnOneLineOrOnePerLine: true
6262
# Kept the below 2 to be the same as `IndentWidth` to keep everything uniform

.claude-plugin/marketplace.json

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -33,47 +33,23 @@
3333
"description": "Numerical optimization (LP, MILP, QP) — concepts, problem-text parsing, and formulation patterns. What LP, MILP, and QP are, required formulation questions, modeling elements, common patterns, and how to parse problem statements (parameters, constraints, decisions, objective). Domain concepts; no API or interface."
3434
},
3535
{
36-
"name": "cuopt-numerical-optimization-api-python",
37-
"source": "./skills/cuopt-numerical-optimization-api-python",
36+
"name": "cuopt-numerical-optimization-api",
37+
"source": "./skills/cuopt-numerical-optimization-api",
3838
"skills": "./",
39-
"description": "Solve LP, MILP, and QP (beta) with the Python API. Use when the user asks about optimization with linear or quadratic objectives, linear constraints, integer variables, scheduling, resource allocation, facility location, production planning, portfolio optimization, or least squares."
40-
},
41-
{
42-
"name": "cuopt-numerical-optimization-api-c",
43-
"source": "./skills/cuopt-numerical-optimization-api-c",
44-
"skills": "./",
45-
"description": "LP, MILP, and QP (beta) with cuOpt — C API only. Use when the user is embedding LP, MILP, or QP in C/C++."
46-
},
47-
{
48-
"name": "cuopt-numerical-optimization-api-cli",
49-
"source": "./skills/cuopt-numerical-optimization-api-cli",
50-
"skills": "./",
51-
"description": "LP, MILP, and QP (beta) with cuOpt — CLI only (MPS files, cuopt_cli). Use when the user is solving LP, MILP, or QP from MPS via command line."
39+
"description": "LP, MILP, and QP (beta) with cuOpt — Python, C, and CLI. Use when the user is solving LP, MILP, or QP with any cuOpt interface."
5240
},
5341
{
5442
"name": "cuopt-multi-objective-exploration",
5543
"source": "./skills/cuopt-multi-objective-exploration",
5644
"skills": "./",
5745
"description": "Trace and interpret the Pareto frontier across competing objectives using repeated single-objective cuOpt solves (weighted-sum and ε-constraint)."
5846
},
59-
{
60-
"name": "cuopt-routing-formulation",
61-
"source": "./skills/cuopt-routing-formulation",
62-
"skills": "./",
63-
"description": "Vehicle routing (VRP, TSP, PDP) — problem types and data requirements. Domain concepts; no API or interface."
64-
},
6547
{
6648
"name": "cuopt-routing-api-python",
6749
"source": "./skills/cuopt-routing-api-python",
6850
"skills": "./",
6951
"description": "Vehicle routing (VRP, TSP, PDP) with cuOpt — Python API only. Use when the user is building or solving routing in Python."
7052
},
71-
{
72-
"name": "cuopt-server-common",
73-
"source": "./skills/cuopt-server-common",
74-
"skills": "./",
75-
"description": "cuOpt REST server — what it does and how requests flow. Domain concepts; no deploy or client code."
76-
},
7753
{
7854
"name": "cuopt-server-api-python",
7955
"source": "./skills/cuopt-server-api-python",

.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/build.yaml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ jobs:
5353
packages: read
5454
pull-requests: read
5555
secrets: inherit # zizmor: ignore[secrets-inherit]
56-
uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@cuda-13.3.0
56+
uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@release/26.08
5757
with:
5858
build_type: ${{ inputs.build_type || 'branch' }}
5959
branch: ${{ inputs.branch }}
@@ -69,7 +69,7 @@ jobs:
6969
packages: read
7070
pull-requests: read
7171
secrets: inherit # zizmor: ignore[secrets-inherit]
72-
uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@cuda-13.3.0
72+
uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@release/26.08
7373
with:
7474
build_type: ${{ inputs.build_type || 'branch' }}
7575
branch: ${{ inputs.branch }}
@@ -84,7 +84,7 @@ jobs:
8484
id-token: write
8585
packages: read
8686
pull-requests: read
87-
uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@cuda-13.3.0
87+
uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@release/26.08
8888
secrets:
8989
CONDA_RAPIDSAI_NIGHTLY_TOKEN: ${{ secrets.CONDA_RAPIDSAI_NIGHTLY_TOKEN }}
9090
CONDA_RAPIDSAI_TOKEN: ${{ secrets.CONDA_RAPIDSAI_TOKEN }}
@@ -101,7 +101,7 @@ jobs:
101101
packages: read
102102
pull-requests: read
103103
secrets: inherit # zizmor: ignore[secrets-inherit]
104-
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuda-13.3.0
104+
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.08
105105
with:
106106
build_type: ${{ inputs.build_type || 'branch' }}
107107
branch: ${{ inputs.branch }}
@@ -119,7 +119,7 @@ jobs:
119119
id-token: write
120120
packages: read
121121
pull-requests: read
122-
uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuda-13.3.0
122+
uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@release/26.08
123123
secrets:
124124
CONDA_RAPIDSAI_WHEELS_NIGHTLY_TOKEN: ${{ secrets.CONDA_RAPIDSAI_WHEELS_NIGHTLY_TOKEN }}
125125
RAPIDSAI_PYPI_TOKEN: ${{ secrets.RAPIDSAI_PYPI_TOKEN }}
@@ -140,7 +140,7 @@ jobs:
140140
packages: read
141141
pull-requests: read
142142
secrets: inherit # zizmor: ignore[secrets-inherit]
143-
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuda-13.3.0
143+
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.08
144144
with:
145145
build_type: ${{ inputs.build_type || 'branch' }}
146146
branch: ${{ inputs.branch }}
@@ -157,7 +157,7 @@ jobs:
157157
id-token: write
158158
packages: read
159159
pull-requests: read
160-
uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuda-13.3.0
160+
uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@release/26.08
161161
secrets:
162162
CONDA_RAPIDSAI_WHEELS_NIGHTLY_TOKEN: ${{ secrets.CONDA_RAPIDSAI_WHEELS_NIGHTLY_TOKEN }}
163163
RAPIDSAI_PYPI_TOKEN: ${{ secrets.RAPIDSAI_PYPI_TOKEN }}
@@ -177,7 +177,7 @@ jobs:
177177
packages: read
178178
pull-requests: read
179179
secrets: inherit # zizmor: ignore[secrets-inherit]
180-
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuda-13.3.0
180+
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.08
181181
with:
182182
build_type: ${{ inputs.build_type || 'branch' }}
183183
branch: ${{ inputs.branch }}
@@ -197,7 +197,7 @@ jobs:
197197
id-token: write
198198
packages: read
199199
pull-requests: read
200-
uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuda-13.3.0
200+
uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@release/26.08
201201
secrets:
202202
CONDA_RAPIDSAI_WHEELS_NIGHTLY_TOKEN: ${{ secrets.CONDA_RAPIDSAI_WHEELS_NIGHTLY_TOKEN }}
203203
RAPIDSAI_PYPI_TOKEN: ${{ secrets.RAPIDSAI_PYPI_TOKEN }}
@@ -218,7 +218,7 @@ jobs:
218218
packages: read
219219
pull-requests: read
220220
secrets: inherit # zizmor: ignore[secrets-inherit]
221-
uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@cuda-13.3.0
221+
uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@release/26.08
222222
with:
223223
build_type: ${{ inputs.build_type || 'branch' }}
224224
node_type: "gpu-l4-latest-1"
@@ -238,7 +238,7 @@ jobs:
238238
packages: read
239239
pull-requests: read
240240
secrets: inherit # zizmor: ignore[secrets-inherit]
241-
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@cuda-13.3.0
241+
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.08
242242
with:
243243
build_type: ${{ inputs.build_type || 'branch' }}
244244
branch: ${{ inputs.branch }}
@@ -259,7 +259,7 @@ jobs:
259259
id-token: write
260260
packages: read
261261
pull-requests: read
262-
uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@cuda-13.3.0
262+
uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@release/26.08
263263
secrets:
264264
CONDA_RAPIDSAI_WHEELS_NIGHTLY_TOKEN: ${{ secrets.CONDA_RAPIDSAI_WHEELS_NIGHTLY_TOKEN }}
265265
RAPIDSAI_PYPI_TOKEN: ${{ secrets.RAPIDSAI_PYPI_TOKEN }}

.github/workflows/build_images.yaml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,28 @@ jobs:
111111
run: |
112112
docker tag "nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-py${PYTHON_SHORT}-${ARCH}" "nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-py${PYTHON_SHORT}-${ARCH}"
113113
docker push "nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-py${PYTHON_SHORT}-${ARCH}"
114+
115+
- name: Build UBI10 image and push to DockerHub and NGC
116+
if: ${{ startsWith(inputs.CUDA_VER, '13.') }}
117+
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
118+
with:
119+
context: ./ci/docker/context
120+
file: ./ci/docker/Dockerfile.ubi
121+
push: true
122+
pull: true
123+
provenance: false
124+
sbom: false
125+
build-args: |
126+
CUDA_VER=${{ inputs.CUDA_VER }}
127+
CUOPT_VER=${{ inputs.CUOPT_VER }}
128+
tags: nvidia/cuopt:${{ inputs.IMAGE_TAG_PREFIX }}-cuda${{ steps.trim.outputs.CUDA_SHORT }}-ubi10-${{ matrix.ARCH }}
129+
130+
- name: Push UBI10 image to NGC
131+
if: ${{ startsWith(inputs.CUDA_VER, '13.') }}
132+
env:
133+
IMAGE_TAG_PREFIX: ${{ inputs.IMAGE_TAG_PREFIX }}
134+
ARCH: ${{ matrix.ARCH }}
135+
CUDA_SHORT: ${{ steps.trim.outputs.CUDA_SHORT }}
136+
run: |
137+
docker tag "nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-${ARCH}" "nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-${ARCH}"
138+
docker push "nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-${ARCH}"
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
# Reusable workflow that runs cuOpt's multi-GPU (NCCL) C++ gtests on a 2-GPU
5+
# runner. It mirrors the single-GPU cpp-test flow (ci/test_cpp.sh): install the
6+
# libcuopt conda test package, then run the gtests — but only those that require
7+
# multiple GPUs. Called by both pr.yaml and test.yaml so the runner label,
8+
# container image and test script are defined in exactly one place.
9+
#
10+
# NCCL communication can only be validated with multiple GPUs (a single device
11+
# cannot host multiple ranks of one communicator). The 2-GPU runner group
12+
# (nv-gpu-amd64-rtxpro6000-2gpu) is enabled for NVIDIA/cuopt in the RAPIDS
13+
# runner configuration.
14+
15+
name: multi-gpu cpp tests
16+
17+
on:
18+
workflow_call:
19+
inputs:
20+
build_type:
21+
required: true
22+
type: string
23+
branch:
24+
type: string
25+
date:
26+
type: string
27+
sha:
28+
type: string
29+
node_type:
30+
description: "custom-job node_type suffix; must be a >=2-GPU runner."
31+
type: string
32+
default: "gpu-rtxpro6000-latest-2"
33+
arch:
34+
type: string
35+
default: "amd64"
36+
container_image:
37+
type: string
38+
default: "rapidsai/ci-conda:26.08-latest"
39+
script:
40+
type: string
41+
default: "ci/test_cpp_multi_gpu.sh"
42+
continue-on-error:
43+
description: "Treat failures as non-blocking (useful while the MG suite is maturing)."
44+
type: boolean
45+
default: false
46+
47+
permissions: {}
48+
49+
jobs:
50+
multi-gpu-cpp-tests:
51+
permissions:
52+
actions: read
53+
contents: read
54+
id-token: write
55+
packages: read
56+
pull-requests: read
57+
uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@release/26.08
58+
with:
59+
build_type: ${{ inputs.build_type }}
60+
branch: ${{ inputs.branch }}
61+
date: ${{ inputs.date }}
62+
sha: ${{ inputs.sha }}
63+
node_type: ${{ inputs.node_type }}
64+
arch: ${{ inputs.arch }}
65+
container_image: ${{ inputs.container_image }}
66+
script: ${{ inputs.script }}
67+
continue-on-error: ${{ inputs.continue-on-error }}

0 commit comments

Comments
 (0)