From 0f1a6f9f4be9eb23e0c63b387e45dbd927f343a6 Mon Sep 17 00:00:00 2001 From: Jake Awe Date: Thu, 19 Mar 2026 11:02:52 -0500 Subject: [PATCH 001/107] Revert "Prepare release/26.04" This reverts commit 4d5f5e530f0e506314562a5ba80530cbb90f056e. --- .github/workflows/build.yaml | 28 ++++++++--------- .github/workflows/pr.yaml | 30 +++++++++---------- .github/workflows/test.yaml | 10 +++---- .../trigger-breaking-change-alert.yaml | 2 +- RAPIDS_BRANCH | 2 +- .../routing/routing-example.ipynb | 2 +- docs/cuopt/source/faq.rst | 2 +- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 3eb1f1f066..593d48bd74 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -45,7 +45,7 @@ concurrency: jobs: cpp-build: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -55,7 +55,7 @@ jobs: python-build: needs: [cpp-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -65,7 +65,7 @@ jobs: upload-conda: needs: [cpp-build, python-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -73,7 +73,7 @@ jobs: sha: ${{ inputs.sha }} wheel-build-cuopt-mps-parser: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -88,7 +88,7 @@ jobs: wheel-publish-cuopt-mps-parser: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -99,7 +99,7 @@ jobs: wheel-build-libcuopt: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -112,7 +112,7 @@ jobs: wheel-publish-libcuopt: needs: wheel-build-libcuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -123,7 +123,7 @@ jobs: wheel-build-cuopt: needs: [wheel-build-cuopt-mps-parser, wheel-build-libcuopt] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -135,7 +135,7 @@ jobs: wheel-publish-cuopt: needs: wheel-build-cuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -145,7 +145,7 @@ jobs: package-type: python wheel-build-cuopt-server: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -160,7 +160,7 @@ jobs: wheel-publish-cuopt-server: needs: wheel-build-cuopt-server secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -171,7 +171,7 @@ jobs: docs-build: needs: [python-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} node_type: "gpu-l4-latest-1" @@ -185,7 +185,7 @@ jobs: script: "ci/build_docs.sh" wheel-build-cuopt-sh-client: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -201,7 +201,7 @@ jobs: wheel-publish-cuopt-sh-client: needs: wheel-build-cuopt-sh-client secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 47a3bd9fca..95741c1fb5 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -34,7 +34,7 @@ jobs: - wheel-build-cuopt-sh-client - test-self-hosted-server secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@python-3.14 if: always() with: needs: ${{ toJSON(needs) }} @@ -111,7 +111,7 @@ jobs: changed-files: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@python-3.14 with: files_yaml: | build_docs: @@ -279,20 +279,20 @@ jobs: - '!gemini-extension.json' checks: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@python-3.14 with: enable_check_generated_files: false conda-cpp-build: needs: [checks, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_cpp.sh matrix_filter: ${{ needs.compute-matrix-filters.outputs.conda_lean_filter }} conda-cpp-tests: needs: [conda-cpp-build, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@python-3.14 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_cpp with: build_type: pull-request @@ -308,14 +308,14 @@ jobs: conda-python-build: needs: [conda-cpp-build, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_python.sh matrix_filter: ${{ needs.compute-matrix-filters.outputs.conda_test_filter }} conda-python-tests: needs: [conda-python-build, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@python-3.14 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda with: run_codecov: false @@ -332,7 +332,7 @@ jobs: docs-build: needs: [conda-python-build, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@python-3.14 if: fromJSON(needs.changed-files.outputs.changed_file_groups).build_docs with: build_type: pull-request @@ -345,7 +345,7 @@ jobs: wheel-build-cuopt-mps-parser: needs: compute-matrix-filters secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_wheel_cuopt_mps_parser.sh @@ -357,7 +357,7 @@ jobs: wheel-build-libcuopt: needs: [wheel-build-cuopt-mps-parser, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: # build for every combination of arch and CUDA version, but only for the latest Python matrix_filter: ${{ needs.compute-matrix-filters.outputs.libcuopt_filter }} @@ -368,7 +368,7 @@ jobs: wheel-build-cuopt: needs: [wheel-build-cuopt-mps-parser, wheel-build-libcuopt, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_wheel_cuopt.sh @@ -377,7 +377,7 @@ jobs: matrix_filter: ${{ needs.compute-matrix-filters.outputs.wheel_lean_filter }} wheel-tests-cuopt: needs: [wheel-build-cuopt, wheel-build-cuopt-mps-parser, wheel-build-cuopt-sh-client, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@python-3.14 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels with: build_type: pull-request @@ -393,7 +393,7 @@ jobs: wheel-build-cuopt-server: needs: [checks, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_wheel_cuopt_server.sh @@ -405,7 +405,7 @@ jobs: wheel-build-cuopt-sh-client: needs: compute-matrix-filters secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_wheel_cuopt_sh_client.sh @@ -417,7 +417,7 @@ jobs: matrix_filter: ${{ needs.compute-matrix-filters.outputs.cuopt_sh_client_filter }} wheel-tests-cuopt-server: needs: [wheel-build-cuopt, wheel-build-cuopt-server, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@python-3.14 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels with: build_type: pull-request diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9ad7609e8a..e88b7829f5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -27,7 +27,7 @@ on: jobs: conda-cpp-tests: - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@main with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -42,7 +42,7 @@ jobs: script-env-secret-3-key: CUOPT_AWS_SECRET_ACCESS_KEY script-env-secret-3-value: ${{ secrets.CUOPT_AWS_SECRET_ACCESS_KEY }} conda-python-tests: - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@main with: run_codecov: false build_type: ${{ inputs.build_type }} @@ -58,7 +58,7 @@ jobs: script-env-secret-3-key: CUOPT_AWS_SECRET_ACCESS_KEY script-env-secret-3-value: ${{ secrets.CUOPT_AWS_SECRET_ACCESS_KEY }} wheel-tests-cuopt: - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@main with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -73,7 +73,7 @@ jobs: script-env-secret-3-key: CUOPT_AWS_SECRET_ACCESS_KEY script-env-secret-3-value: ${{ secrets.CUOPT_AWS_SECRET_ACCESS_KEY }} wheel-tests-cuopt-server: - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@main with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -89,7 +89,7 @@ jobs: script-env-secret-3-value: ${{ secrets.CUOPT_AWS_SECRET_ACCESS_KEY }} conda-notebook-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} diff --git a/.github/workflows/trigger-breaking-change-alert.yaml b/.github/workflows/trigger-breaking-change-alert.yaml index d394b97db4..57b178740c 100644 --- a/.github/workflows/trigger-breaking-change-alert.yaml +++ b/.github/workflows/trigger-breaking-change-alert.yaml @@ -15,7 +15,7 @@ jobs: trigger-notifier: if: contains(github.event.pull_request.labels.*.name, 'breaking') secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/breaking-change-alert.yaml@release/26.04 + uses: rapidsai/shared-workflows/.github/workflows/breaking-change-alert.yaml@main with: sender_login: ${{ github.event.sender.login }} sender_avatar: ${{ github.event.sender.avatar_url }} diff --git a/RAPIDS_BRANCH b/RAPIDS_BRANCH index d5ea6ced53..ba2906d066 100644 --- a/RAPIDS_BRANCH +++ b/RAPIDS_BRANCH @@ -1 +1 @@ -release/26.04 +main diff --git a/docs/cuopt/source/cuopt-python/routing/routing-example.ipynb b/docs/cuopt/source/cuopt-python/routing/routing-example.ipynb index 9df5e2c0c7..9cfc05f9bb 100644 --- a/docs/cuopt/source/cuopt-python/routing/routing-example.ipynb +++ b/docs/cuopt/source/cuopt-python/routing/routing-example.ipynb @@ -147,7 +147,7 @@ "metadata": {}, "source": [ "#### Compressed Sparse Row (CSR) representation of above weighted waypoint graph.\n", - "For details on the CSR encoding of the above graph see the [cost_matrix_and_waypoint_graph_creation.ipynb](https://github.com/NVIDIA/cuopt-examples/blob/release/26.04/intra-factory_transport/cost_matrix_and_waypoint_graph_creation.ipynb) notebook." + "For details on the CSR encoding of the above graph see the [cost_matrix_and_waypoint_graph_creation.ipynb](https://github.com/NVIDIA/cuopt-examples/blob/main/intra-factory_transport/cost_matrix_and_waypoint_graph_creation.ipynb) notebook." ] }, { diff --git a/docs/cuopt/source/faq.rst b/docs/cuopt/source/faq.rst index 1985052531..0c3a0e219f 100644 --- a/docs/cuopt/source/faq.rst +++ b/docs/cuopt/source/faq.rst @@ -283,7 +283,7 @@ Routing FAQ So in either case, task locations are actually integer indices into another structure. - If you have (lat, long) values, then you can generate a cost matrix using a map API. cuOpt does not directly connect to a third-party map engine, but that can be done outside of cuOpt as shown `here `__. + If you have (lat, long) values, then you can generate a cost matrix using a map API. cuOpt does not directly connect to a third-party map engine, but that can be done outside of cuOpt as shown `here `__. .. dropdown:: Is it possible to define constraints such as refrigerated vehicles required for certain orders? From e2ea6872842475d01f95e3ed8f8abaee0534fdc9 Mon Sep 17 00:00:00 2001 From: Jake Awe <50372925+AyodeAwe@users.noreply.github.com> Date: Thu, 19 Mar 2026 11:15:30 -0500 Subject: [PATCH 002/107] Update to 26.06 (#975) This PR updates the repository to version 26.06. This is part of the 26.04 release burndown process. --- .claude-plugin/marketplace.json | 2 +- .cursor-plugin/plugin.json | 2 +- .github/workflows/build.yaml | 30 +++++------ .../workflows/build_test_publish_images.yaml | 2 +- .github/workflows/pr.yaml | 32 ++++++------ .github/workflows/test.yaml | 2 +- README.md | 12 ++--- VERSION | 2 +- .../all_cuda-129_arch-aarch64.yaml | 10 ++-- .../all_cuda-129_arch-x86_64.yaml | 10 ++-- .../all_cuda-131_arch-aarch64.yaml | 10 ++-- .../all_cuda-131_arch-x86_64.yaml | 10 ++-- dependencies.yaml | 50 +++++++++---------- gemini-extension.json | 2 +- helmchart/cuopt-server/Chart.yaml | 4 +- helmchart/cuopt-server/values.yaml | 2 +- python/cuopt/pyproject.toml | 18 +++---- python/cuopt_self_hosted/pyproject.toml | 2 +- python/cuopt_server/pyproject.toml | 2 +- python/libcuopt/pyproject.toml | 8 +-- skills/cuopt-developer/SKILL.md | 2 +- skills/cuopt-installation-api-c/SKILL.md | 2 +- skills/cuopt-installation-api-python/SKILL.md | 2 +- skills/cuopt-installation-common/SKILL.md | 2 +- skills/cuopt-installation-developer/SKILL.md | 2 +- skills/cuopt-lp-milp-api-c/SKILL.md | 2 +- skills/cuopt-lp-milp-api-cli/SKILL.md | 2 +- skills/cuopt-lp-milp-api-python/SKILL.md | 2 +- skills/cuopt-qp-api-c/SKILL.md | 2 +- skills/cuopt-qp-api-cli/SKILL.md | 2 +- skills/cuopt-qp-api-python/SKILL.md | 2 +- skills/cuopt-routing-api-python/SKILL.md | 2 +- skills/cuopt-server-api-python/SKILL.md | 2 +- skills/cuopt-server-common/SKILL.md | 2 +- skills/cuopt-user-rules/SKILL.md | 2 +- skills/lp-milp-formulation/SKILL.md | 2 +- skills/qp-formulation/SKILL.md | 2 +- skills/routing-formulation/SKILL.md | 2 +- skills/skill-evolution/SKILL.md | 4 +- 39 files changed, 126 insertions(+), 126 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 4c5df380f6..6ddf2583c4 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -5,7 +5,7 @@ }, "metadata": { "description": "Agent skills for NVIDIA cuOpt: routing (VRP, TSP, PDP), LP/MILP/QP, installation (Python/C/developer), and REST server.", - "version": "26.04.00" + "version": "26.06.00" }, "plugins": [ { diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index 5f34873671..e740506140 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "nvidia-cuopt-skills", "description": "Agent skills for NVIDIA cuOpt: routing (VRP, TSP, PDP), LP/MILP/QP, installation (Python/C/developer), and REST server. Use when building or solving optimization with cuOpt.", - "version": "26.04.00", + "version": "26.06.00", "author": { "name": "NVIDIA" }, diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 593d48bd74..a945cde8ec 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -45,7 +45,7 @@ concurrency: jobs: cpp-build: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -55,7 +55,7 @@ jobs: python-build: needs: [cpp-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -65,7 +65,7 @@ jobs: upload-conda: needs: [cpp-build, python-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -73,7 +73,7 @@ jobs: sha: ${{ inputs.sha }} wheel-build-cuopt-mps-parser: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -88,7 +88,7 @@ jobs: wheel-publish-cuopt-mps-parser: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -99,7 +99,7 @@ jobs: wheel-build-libcuopt: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -112,7 +112,7 @@ jobs: wheel-publish-libcuopt: needs: wheel-build-libcuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -123,7 +123,7 @@ jobs: wheel-build-cuopt: needs: [wheel-build-cuopt-mps-parser, wheel-build-libcuopt] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -135,7 +135,7 @@ jobs: wheel-publish-cuopt: needs: wheel-build-cuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -145,7 +145,7 @@ jobs: package-type: python wheel-build-cuopt-server: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -160,7 +160,7 @@ jobs: wheel-publish-cuopt-server: needs: wheel-build-cuopt-server secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -171,7 +171,7 @@ jobs: docs-build: needs: [python-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} node_type: "gpu-l4-latest-1" @@ -181,11 +181,11 @@ jobs: arch: "amd64" file_to_upload: "docs/cuopt/build/html/" artifact-name: "cuopt_docs" - container_image: "rapidsai/ci-conda:26.04-latest" + container_image: "rapidsai/ci-conda:26.06-latest" script: "ci/build_docs.sh" wheel-build-cuopt-sh-client: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -201,7 +201,7 @@ jobs: wheel-publish-cuopt-sh-client: needs: wheel-build-cuopt-sh-client secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@main with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} diff --git a/.github/workflows/build_test_publish_images.yaml b/.github/workflows/build_test_publish_images.yaml index f8f7366e13..17d4e9ab57 100644 --- a/.github/workflows/build_test_publish_images.yaml +++ b/.github/workflows/build_test_publish_images.yaml @@ -55,7 +55,7 @@ jobs: compute-matrix: runs-on: ubuntu-latest container: - image: rapidsai/ci-conda:26.04-latest + image: rapidsai/ci-conda:26.06-latest outputs: MATRIX: ${{ steps.compute-matrix.outputs.MATRIX }} CUOPT_VER: ${{ steps.compute-cuopt-ver.outputs.CUOPT_VER }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 95741c1fb5..a652c23b9a 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -34,7 +34,7 @@ jobs: - wheel-build-cuopt-sh-client - test-self-hosted-server secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@main if: always() with: needs: ${{ toJSON(needs) }} @@ -111,7 +111,7 @@ jobs: changed-files: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@main with: files_yaml: | build_docs: @@ -279,20 +279,20 @@ jobs: - '!gemini-extension.json' checks: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@main with: enable_check_generated_files: false conda-cpp-build: needs: [checks, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@main with: build_type: pull-request script: ci/build_cpp.sh matrix_filter: ${{ needs.compute-matrix-filters.outputs.conda_lean_filter }} conda-cpp-tests: needs: [conda-cpp-build, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@main if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_cpp with: build_type: pull-request @@ -308,14 +308,14 @@ jobs: conda-python-build: needs: [conda-cpp-build, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@main with: build_type: pull-request script: ci/build_python.sh matrix_filter: ${{ needs.compute-matrix-filters.outputs.conda_test_filter }} conda-python-tests: needs: [conda-python-build, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@main if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda with: run_codecov: false @@ -332,7 +332,7 @@ jobs: docs-build: needs: [conda-python-build, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main if: fromJSON(needs.changed-files.outputs.changed_file_groups).build_docs with: build_type: pull-request @@ -340,12 +340,12 @@ jobs: arch: "amd64" file_to_upload: "docs/cuopt/build/html/" artifact-name: "cuopt_docs" - container_image: "rapidsai/ci-conda:26.04-latest" + container_image: "rapidsai/ci-conda:26.06-latest" script: "ci/build_docs.sh" wheel-build-cuopt-mps-parser: needs: compute-matrix-filters secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main with: build_type: pull-request script: ci/build_wheel_cuopt_mps_parser.sh @@ -357,7 +357,7 @@ jobs: wheel-build-libcuopt: needs: [wheel-build-cuopt-mps-parser, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main with: # build for every combination of arch and CUDA version, but only for the latest Python matrix_filter: ${{ needs.compute-matrix-filters.outputs.libcuopt_filter }} @@ -368,7 +368,7 @@ jobs: wheel-build-cuopt: needs: [wheel-build-cuopt-mps-parser, wheel-build-libcuopt, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main with: build_type: pull-request script: ci/build_wheel_cuopt.sh @@ -377,7 +377,7 @@ jobs: matrix_filter: ${{ needs.compute-matrix-filters.outputs.wheel_lean_filter }} wheel-tests-cuopt: needs: [wheel-build-cuopt, wheel-build-cuopt-mps-parser, wheel-build-cuopt-sh-client, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@main if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels with: build_type: pull-request @@ -393,7 +393,7 @@ jobs: wheel-build-cuopt-server: needs: [checks, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main with: build_type: pull-request script: ci/build_wheel_cuopt_server.sh @@ -405,7 +405,7 @@ jobs: wheel-build-cuopt-sh-client: needs: compute-matrix-filters secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main with: build_type: pull-request script: ci/build_wheel_cuopt_sh_client.sh @@ -417,7 +417,7 @@ jobs: matrix_filter: ${{ needs.compute-matrix-filters.outputs.cuopt_sh_client_filter }} wheel-tests-cuopt-server: needs: [wheel-build-cuopt, wheel-build-cuopt-server, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@python-3.14 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@main if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels with: build_type: pull-request diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e88b7829f5..a8cc5f2943 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -97,5 +97,5 @@ jobs: sha: ${{ inputs.sha }} node_type: "gpu-l4-latest-1" arch: "amd64" - container_image: "rapidsai/ci-conda:26.04-latest" + container_image: "rapidsai/ci-conda:26.06-latest" script: ci/test_notebooks.sh diff --git a/README.md b/README.md index 379a48c350..95c8598d77 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # cuOpt - GPU-accelerated Optimization [![Build Status](https://github.com/NVIDIA/cuopt/actions/workflows/build.yaml/badge.svg)](https://github.com/NVIDIA/cuopt/actions/workflows/build.yaml) -[![Version](https://img.shields.io/badge/version-26.04.00-blue)](https://github.com/NVIDIA/cuopt/releases) +[![Version](https://img.shields.io/badge/version-26.06.00-blue)](https://github.com/NVIDIA/cuopt/releases) [![Documentation](https://img.shields.io/badge/docs-latest-brightgreen)](https://docs.nvidia.com/cuopt/user-guide/latest/introduction.html) [![Docker Hub](https://img.shields.io/badge/docker-nvidia%2Fcuopt-blue?logo=docker)](https://hub.docker.com/r/nvidia/cuopt) [![Examples](https://img.shields.io/badge/examples-cuopt--examples-orange)](https://github.com/NVIDIA/cuopt-examples) @@ -83,7 +83,7 @@ For CUDA 12.x: pip install \ --extra-index-url=https://pypi.nvidia.com \ nvidia-cuda-runtime-cu12==12.9.* \ - cuopt-server-cu12==26.04.* cuopt-sh-client==26.04.* + cuopt-server-cu12==26.06.* cuopt-sh-client==26.06.* ``` Development wheels are available as nightlies, please update `--extra-index-url` to `https://pypi.anaconda.org/rapidsai-wheels-nightly/simple/` to install latest nightly packages. @@ -91,7 +91,7 @@ Development wheels are available as nightlies, please update `--extra-index-url` pip install --pre \ --extra-index-url=https://pypi.nvidia.com \ --extra-index-url=https://pypi.anaconda.org/rapidsai-wheels-nightly/simple/ \ - cuopt-server-cu12==26.04.* cuopt-sh-client==26.04.* + cuopt-server-cu12==26.06.* cuopt-sh-client==26.06.* ``` For CUDA 13.x: @@ -99,7 +99,7 @@ For CUDA 13.x: ```bash pip install \ --extra-index-url=https://pypi.nvidia.com \ - cuopt-server-cu13==26.04.* cuopt-sh-client==26.04.* + cuopt-server-cu13==26.06.* cuopt-sh-client==26.06.* ``` Development wheels are available as nightlies, please update `--extra-index-url` to `https://pypi.anaconda.org/rapidsai-wheels-nightly/simple/` to install latest nightly packages. @@ -107,7 +107,7 @@ Development wheels are available as nightlies, please update `--extra-index-url` pip install --pre \ --extra-index-url=https://pypi.nvidia.com \ --extra-index-url=https://pypi.anaconda.org/rapidsai-wheels-nightly/simple/ \ - cuopt-server-cu13==26.04.* cuopt-sh-client==26.04.* + cuopt-server-cu13==26.06.* cuopt-sh-client==26.06.* ``` @@ -118,7 +118,7 @@ cuOpt can be installed with conda (via [miniforge](https://github.com/conda-forg All other dependencies are installed automatically when `cuopt-server` and `cuopt-sh-client` are installed. ```bash -conda install -c rapidsai -c conda-forge -c nvidia cuopt-server=26.04.* cuopt-sh-client=26.04.* +conda install -c rapidsai -c conda-forge -c nvidia cuopt-server=26.06.* cuopt-sh-client=26.06.* ``` We also provide [nightly conda packages](https://anaconda.org/rapidsai-nightly) built from the HEAD diff --git a/VERSION b/VERSION index 0bd0e8a95b..cdb610a24d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -26.04.00 +26.06.00 diff --git a/conda/environments/all_cuda-129_arch-aarch64.yaml b/conda/environments/all_cuda-129_arch-aarch64.yaml index ecef112dd5..104e7e70d1 100644 --- a/conda/environments/all_cuda-129_arch-aarch64.yaml +++ b/conda/environments/all_cuda-129_arch-aarch64.yaml @@ -18,7 +18,7 @@ dependencies: - cuda-python>=12.9.2,<13.0 - cuda-sanitizer-api - cuda-version=12.9 -- cudf==26.4.*,>=0.0.0a0 +- cudf==26.6.*,>=0.0.0a0 - cupy>=13.6.0 - cxx-compiler - cython>=3.0.3 @@ -32,8 +32,8 @@ dependencies: - libcurand-dev - libcusolver-dev - libcusparse-dev -- libraft-headers==26.4.*,>=0.0.0a0 -- librmm==26.4.*,>=0.0.0a0 +- libraft-headers==26.6.*,>=0.0.0a0 +- librmm==26.6.*,>=0.0.0a0 - make - msgpack-numpy==0.4.8 - msgpack-python==1.1.2 @@ -50,7 +50,7 @@ dependencies: - pip - pre-commit - psutil>=6.0.0 -- pylibraft==26.4.*,>=0.0.0a0 +- pylibraft==26.6.*,>=0.0.0a0 - pyrsistent - pytest-cov - pytest<9.0 @@ -59,7 +59,7 @@ dependencies: - rapids-build-backend>=0.4.0,<0.5.0 - rapids-logger==0.2.*,>=0.0.0a0 - requests -- rmm==26.4.*,>=0.0.0a0 +- rmm==26.6.*,>=0.0.0a0 - scikit-build-core>=0.11.0 - scipy>=1.14.1 - sphinx diff --git a/conda/environments/all_cuda-129_arch-x86_64.yaml b/conda/environments/all_cuda-129_arch-x86_64.yaml index 35c825280c..06aa6121f9 100644 --- a/conda/environments/all_cuda-129_arch-x86_64.yaml +++ b/conda/environments/all_cuda-129_arch-x86_64.yaml @@ -18,7 +18,7 @@ dependencies: - cuda-python>=12.9.2,<13.0 - cuda-sanitizer-api - cuda-version=12.9 -- cudf==26.4.*,>=0.0.0a0 +- cudf==26.6.*,>=0.0.0a0 - cupy>=13.6.0 - cxx-compiler - cython>=3.0.3 @@ -32,8 +32,8 @@ dependencies: - libcurand-dev - libcusolver-dev - libcusparse-dev -- libraft-headers==26.4.*,>=0.0.0a0 -- librmm==26.4.*,>=0.0.0a0 +- libraft-headers==26.6.*,>=0.0.0a0 +- librmm==26.6.*,>=0.0.0a0 - make - msgpack-numpy==0.4.8 - msgpack-python==1.1.2 @@ -50,7 +50,7 @@ dependencies: - pip - pre-commit - psutil>=6.0.0 -- pylibraft==26.4.*,>=0.0.0a0 +- pylibraft==26.6.*,>=0.0.0a0 - pyrsistent - pytest-cov - pytest<9.0 @@ -59,7 +59,7 @@ dependencies: - rapids-build-backend>=0.4.0,<0.5.0 - rapids-logger==0.2.*,>=0.0.0a0 - requests -- rmm==26.4.*,>=0.0.0a0 +- rmm==26.6.*,>=0.0.0a0 - scikit-build-core>=0.11.0 - scipy>=1.14.1 - sphinx diff --git a/conda/environments/all_cuda-131_arch-aarch64.yaml b/conda/environments/all_cuda-131_arch-aarch64.yaml index 2b717d4e98..a68ebf1285 100644 --- a/conda/environments/all_cuda-131_arch-aarch64.yaml +++ b/conda/environments/all_cuda-131_arch-aarch64.yaml @@ -18,7 +18,7 @@ dependencies: - cuda-python>=13.0.1,<14.0 - cuda-sanitizer-api - cuda-version=13.1 -- cudf==26.4.*,>=0.0.0a0 +- cudf==26.6.*,>=0.0.0a0 - cupy>=13.6.0 - cxx-compiler - cython>=3.0.3 @@ -32,8 +32,8 @@ dependencies: - libcurand-dev - libcusolver-dev - libcusparse-dev -- libraft-headers==26.4.*,>=0.0.0a0 -- librmm==26.4.*,>=0.0.0a0 +- libraft-headers==26.6.*,>=0.0.0a0 +- librmm==26.6.*,>=0.0.0a0 - make - msgpack-numpy==0.4.8 - msgpack-python==1.1.2 @@ -50,7 +50,7 @@ dependencies: - pip - pre-commit - psutil>=6.0.0 -- pylibraft==26.4.*,>=0.0.0a0 +- pylibraft==26.6.*,>=0.0.0a0 - pyrsistent - pytest-cov - pytest<9.0 @@ -59,7 +59,7 @@ dependencies: - rapids-build-backend>=0.4.0,<0.5.0 - rapids-logger==0.2.*,>=0.0.0a0 - requests -- rmm==26.4.*,>=0.0.0a0 +- rmm==26.6.*,>=0.0.0a0 - scikit-build-core>=0.11.0 - scipy>=1.14.1 - sphinx diff --git a/conda/environments/all_cuda-131_arch-x86_64.yaml b/conda/environments/all_cuda-131_arch-x86_64.yaml index f605a83f3b..043d55e148 100644 --- a/conda/environments/all_cuda-131_arch-x86_64.yaml +++ b/conda/environments/all_cuda-131_arch-x86_64.yaml @@ -18,7 +18,7 @@ dependencies: - cuda-python>=13.0.1,<14.0 - cuda-sanitizer-api - cuda-version=13.1 -- cudf==26.4.*,>=0.0.0a0 +- cudf==26.6.*,>=0.0.0a0 - cupy>=13.6.0 - cxx-compiler - cython>=3.0.3 @@ -32,8 +32,8 @@ dependencies: - libcurand-dev - libcusolver-dev - libcusparse-dev -- libraft-headers==26.4.*,>=0.0.0a0 -- librmm==26.4.*,>=0.0.0a0 +- libraft-headers==26.6.*,>=0.0.0a0 +- librmm==26.6.*,>=0.0.0a0 - make - msgpack-numpy==0.4.8 - msgpack-python==1.1.2 @@ -50,7 +50,7 @@ dependencies: - pip - pre-commit - psutil>=6.0.0 -- pylibraft==26.4.*,>=0.0.0a0 +- pylibraft==26.6.*,>=0.0.0a0 - pyrsistent - pytest-cov - pytest<9.0 @@ -59,7 +59,7 @@ dependencies: - rapids-build-backend>=0.4.0,<0.5.0 - rapids-logger==0.2.*,>=0.0.0a0 - requests -- rmm==26.4.*,>=0.0.0a0 +- rmm==26.6.*,>=0.0.0a0 - scikit-build-core>=0.11.0 - scipy>=1.14.1 - sphinx diff --git a/dependencies.yaml b/dependencies.yaml index 014889c7d5..db60f63569 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -311,7 +311,7 @@ dependencies: common: - output_types: [conda] packages: - - libcuopt-tests==26.4.*,>=0.0.0a0 + - libcuopt-tests==26.6.*,>=0.0.0a0 build_wheels: common: - output_types: [requirements, pyproject] @@ -413,7 +413,7 @@ dependencies: common: - output_types: conda packages: - - &libcuopt_unsuffixed libcuopt==26.4.*,>=0.0.0a0 + - &libcuopt_unsuffixed libcuopt==26.6.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -426,18 +426,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - libcuopt-cu12==26.4.*,>=0.0.0a0 + - libcuopt-cu12==26.6.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - libcuopt-cu13==26.4.*,>=0.0.0a0 + - libcuopt-cu13==26.6.*,>=0.0.0a0 - {matrix: null, packages: [*libcuopt_unsuffixed]} depends_on_cuopt: common: - output_types: conda packages: - - &cuopt_unsuffixed cuopt==26.4.*,>=0.0.0a0 + - &cuopt_unsuffixed cuopt==26.6.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -450,18 +450,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - cuopt-cu12==26.4.*,>=0.0.0a0 + - cuopt-cu12==26.6.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - cuopt-cu13==26.4.*,>=0.0.0a0 + - cuopt-cu13==26.6.*,>=0.0.0a0 - {matrix: null, packages: [*cuopt_unsuffixed]} depends_on_cuopt_server: common: - output_types: conda packages: - - &cuopt_server_unsuffixed cuopt-server==26.4.*,>=0.0.0a0 + - &cuopt_server_unsuffixed cuopt-server==26.6.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -474,18 +474,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - cuopt-server-cu12==26.4.*,>=0.0.0a0 + - cuopt-server-cu12==26.6.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - cuopt-server-cu13==26.4.*,>=0.0.0a0 + - cuopt-server-cu13==26.6.*,>=0.0.0a0 - {matrix: null, packages: [*cuopt_server_unsuffixed]} depends_on_cuopt_sh_client: common: - output_types: [conda, requirements, pyproject] packages: - - &cuopt_sh_client_unsuffixed cuopt-sh-client==26.4.*,>=0.0.0a0 + - &cuopt_sh_client_unsuffixed cuopt-sh-client==26.6.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -495,7 +495,7 @@ dependencies: common: - output_types: [requirements, pyproject, conda] packages: - - cuopt-mps-parser==26.4.*,>=0.0.0a0 + - cuopt-mps-parser==26.6.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -505,12 +505,12 @@ dependencies: common: - output_types: conda packages: - - libraft-headers==26.4.*,>=0.0.0a0 + - libraft-headers==26.6.*,>=0.0.0a0 depends_on_librmm: common: - output_types: conda packages: - - &librmm_unsuffixed librmm==26.4.*,>=0.0.0a0 + - &librmm_unsuffixed librmm==26.6.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -522,12 +522,12 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - librmm-cu12==26.4.*,>=0.0.0a0 + - librmm-cu12==26.6.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - librmm-cu13==26.4.*,>=0.0.0a0 + - librmm-cu13==26.6.*,>=0.0.0a0 - {matrix: null, packages: [*librmm_unsuffixed]} depends_on_cupy: common: @@ -562,7 +562,7 @@ dependencies: common: - output_types: conda packages: - - &rmm_unsuffixed rmm==26.4.*,>=0.0.0a0 + - &rmm_unsuffixed rmm==26.6.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -574,12 +574,12 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - rmm-cu12==26.4.*,>=0.0.0a0 + - rmm-cu12==26.6.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - rmm-cu13==26.4.*,>=0.0.0a0 + - rmm-cu13==26.6.*,>=0.0.0a0 - matrix: packages: - *rmm_unsuffixed @@ -588,7 +588,7 @@ dependencies: common: - output_types: conda packages: - - &cudf_unsuffixed cudf==26.4.*,>=0.0.0a0 + - &cudf_unsuffixed cudf==26.6.*,>=0.0.0a0 - output_types: requirements packages: - --extra-index-url=https://pypi.anaconda.org/rapidsai-wheels-nightly/simple @@ -599,12 +599,12 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - cudf-cu12==26.4.*,>=0.0.0a0 + - cudf-cu12==26.6.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - cudf-cu13==26.4.*,>=0.0.0a0 + - cudf-cu13==26.6.*,>=0.0.0a0 - matrix: packages: - *cudf_unsuffixed @@ -613,7 +613,7 @@ dependencies: common: - output_types: conda packages: - - &pylibraft_unsuffixed pylibraft==26.4.*,>=0.0.0a0 + - &pylibraft_unsuffixed pylibraft==26.6.*,>=0.0.0a0 - output_types: requirements packages: - --extra-index-url=https://pypi.anaconda.org/rapidsai-wheels-nightly/simple @@ -624,12 +624,12 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - pylibraft-cu12==26.4.*,>=0.0.0a0 + - pylibraft-cu12==26.6.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - pylibraft-cu13==26.4.*,>=0.0.0a0 + - pylibraft-cu13==26.6.*,>=0.0.0a0 - matrix: packages: - *pylibraft_unsuffixed diff --git a/gemini-extension.json b/gemini-extension.json index b4c6b764a4..c5ef9883f8 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,6 +1,6 @@ { "name": "nvidia-cuopt-skills", "description": "Agent skills for NVIDIA cuOpt optimization engine: routing, LP/MILP/QP, installation, and server.", - "version": "26.04.00", + "version": "26.06.00", "contextFileName": "AGENTS.md" } diff --git a/helmchart/cuopt-server/Chart.yaml b/helmchart/cuopt-server/Chart.yaml index 074d94bec9..811ac067cb 100644 --- a/helmchart/cuopt-server/Chart.yaml +++ b/helmchart/cuopt-server/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 26.4.0 +appVersion: 26.6.0 description: A Helm chart for NVIDIA cuOpt Server with GPU support home: https://docs.nvidia.com/cuopt/user-guide/latest/resources.html keywords: @@ -14,4 +14,4 @@ name: cuopt-server sources: - https://docs.nvidia.com/cuopt/user-guide/latest/resources.html type: application -version: 26.4.0 +version: 26.6.0 diff --git a/helmchart/cuopt-server/values.yaml b/helmchart/cuopt-server/values.yaml index 5218596552..6adafea79e 100644 --- a/helmchart/cuopt-server/values.yaml +++ b/helmchart/cuopt-server/values.yaml @@ -7,7 +7,7 @@ replicaCount: 1 image: repository: nvidia/cuopt pullPolicy: IfNotPresent - tag: "26.4.0-cuda12.9-py3.12" + tag: "26.6.0-cuda12.9-py3.12" imagePullSecrets: [] nameOverride: "" diff --git a/python/cuopt/pyproject.toml b/python/cuopt/pyproject.toml index e86b5bdd73..eff7e01769 100644 --- a/python/cuopt/pyproject.toml +++ b/python/cuopt/pyproject.toml @@ -20,18 +20,18 @@ license = "Apache-2.0" requires-python = ">=3.11" dependencies = [ "cuda-python>=13.0.1,<14.0", - "cudf==26.4.*,>=0.0.0a0", - "cuopt-mps-parser==26.4.*,>=0.0.0a0", + "cudf==26.6.*,>=0.0.0a0", + "cuopt-mps-parser==26.6.*,>=0.0.0a0", "cupy-cuda13x>=13.6.0", - "libcuopt==26.4.*,>=0.0.0a0", + "libcuopt==26.6.*,>=0.0.0a0", "numba-cuda>=0.22.1", "numba>=0.60.0,<0.65.0", "numpy>=1.23.5,<3.0", "pandas>=2.0", - "pylibraft==26.4.*,>=0.0.0a0", + "pylibraft==26.6.*,>=0.0.0a0", "pyyaml>=6.0.0", "rapids-logger==0.2.*,>=0.0.0a0", - "rmm==26.4.*,>=0.0.0a0", + "rmm==26.6.*,>=0.0.0a0", "scipy>=1.14.1", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. classifiers = [ @@ -101,12 +101,12 @@ dependencies-file = "../../dependencies.yaml" matrix-entry = "cuda_suffixed=true;use_cuda_wheels=true" requires = [ "cmake>=3.30.4", - "cuopt-mps-parser==26.4.*,>=0.0.0a0", + "cuopt-mps-parser==26.6.*,>=0.0.0a0", "cupy-cuda13x>=13.6.0", "cython>=3.0.3", - "libcuopt==26.4.*,>=0.0.0a0", + "libcuopt==26.6.*,>=0.0.0a0", "ninja", - "pylibraft==26.4.*,>=0.0.0a0", + "pylibraft==26.6.*,>=0.0.0a0", "rapids-logger==0.2.*,>=0.0.0a0", - "rmm==26.4.*,>=0.0.0a0", + "rmm==26.6.*,>=0.0.0a0", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. diff --git a/python/cuopt_self_hosted/pyproject.toml b/python/cuopt_self_hosted/pyproject.toml index 7645c99ed0..43aa80a5b3 100644 --- a/python/cuopt_self_hosted/pyproject.toml +++ b/python/cuopt_self_hosted/pyproject.toml @@ -20,7 +20,7 @@ license = "Apache-2.0" license-files = ["LICENSE"] requires-python = ">=3.11" dependencies = [ - "cuopt-mps-parser==26.4.*,>=0.0.0a0", + "cuopt-mps-parser==26.6.*,>=0.0.0a0", "msgpack-numpy==0.4.8", "msgpack==1.1.2", "requests", diff --git a/python/cuopt_server/pyproject.toml b/python/cuopt_server/pyproject.toml index d24cfcbd77..ce96c884be 100644 --- a/python/cuopt_server/pyproject.toml +++ b/python/cuopt_server/pyproject.toml @@ -21,7 +21,7 @@ license = "Apache-2.0" license-files = ["LICENSE"] requires-python = ">=3.11" dependencies = [ - "cuopt==26.4.*,>=0.0.0a0", + "cuopt==26.6.*,>=0.0.0a0", "cupy-cuda13x>=13.6.0", "fastapi", "jsonref==1.1.0", diff --git a/python/libcuopt/pyproject.toml b/python/libcuopt/pyproject.toml index 2507971a0f..e5c0c58fab 100644 --- a/python/libcuopt/pyproject.toml +++ b/python/libcuopt/pyproject.toml @@ -30,8 +30,8 @@ classifiers = [ "Programming Language :: Python :: 3.14", ] dependencies = [ - "cuopt-mps-parser==26.4.*,>=0.0.0a0", - "librmm==26.4.*,>=0.0.0a0", + "cuopt-mps-parser==26.6.*,>=0.0.0a0", + "librmm==26.6.*,>=0.0.0a0", "nvidia-cublas", "nvidia-cudart", "nvidia-cudss", @@ -81,8 +81,8 @@ dependencies-file = "../../dependencies.yaml" matrix-entry = "cuda_suffixed=true;use_cuda_wheels=true" requires = [ "cmake>=3.30.4", - "cuopt-mps-parser==26.4.*,>=0.0.0a0", - "librmm==26.4.*,>=0.0.0a0", + "cuopt-mps-parser==26.6.*,>=0.0.0a0", + "librmm==26.6.*,>=0.0.0a0", "ninja", "rapids-logger==0.2.*,>=0.0.0a0", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. diff --git a/skills/cuopt-developer/SKILL.md b/skills/cuopt-developer/SKILL.md index 12419153ac..99743f9171 100644 --- a/skills/cuopt-developer/SKILL.md +++ b/skills/cuopt-developer/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-developer -version: "26.04.00" +version: "26.06.00" description: Contribute to NVIDIA cuOpt codebase including C++/CUDA, Python, server, docs, and CI. Use when the user wants to modify solver internals, add features, submit PRs, or understand the codebase architecture. --- diff --git a/skills/cuopt-installation-api-c/SKILL.md b/skills/cuopt-installation-api-c/SKILL.md index 747382e3c7..bd4d60becc 100644 --- a/skills/cuopt-installation-api-c/SKILL.md +++ b/skills/cuopt-installation-api-c/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-installation-api-c -version: "26.04.00" +version: "26.06.00" description: Install cuOpt for C — conda, locate lib/headers, verification. Use when the user is installing or verifying the C API. Standalone; no common skill. --- diff --git a/skills/cuopt-installation-api-python/SKILL.md b/skills/cuopt-installation-api-python/SKILL.md index a3d7a5e5d2..771f5ec8b0 100644 --- a/skills/cuopt-installation-api-python/SKILL.md +++ b/skills/cuopt-installation-api-python/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-installation-api-python -version: "26.04.00" +version: "26.06.00" description: Install cuOpt for Python — pip, conda, Docker, verification. Use when the user is installing or verifying the Python API. Standalone; no common skill. --- diff --git a/skills/cuopt-installation-common/SKILL.md b/skills/cuopt-installation-common/SKILL.md index 6ceb9f9000..88534fb810 100644 --- a/skills/cuopt-installation-common/SKILL.md +++ b/skills/cuopt-installation-common/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-installation-common -version: "26.04.00" +version: "26.06.00" description: Install cuOpt — system and environment requirements only. Domain concepts; no install commands or interface guidance. --- diff --git a/skills/cuopt-installation-developer/SKILL.md b/skills/cuopt-installation-developer/SKILL.md index a002498853..1f3dff0d3f 100644 --- a/skills/cuopt-installation-developer/SKILL.md +++ b/skills/cuopt-installation-developer/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-installation-developer -version: "26.04.00" +version: "26.06.00" description: Developer installation — build cuOpt from source, run tests. Use when the user wants to set up a dev environment to contribute or modify cuOpt. --- diff --git a/skills/cuopt-lp-milp-api-c/SKILL.md b/skills/cuopt-lp-milp-api-c/SKILL.md index 53df3de63e..74b0d5dc92 100644 --- a/skills/cuopt-lp-milp-api-c/SKILL.md +++ b/skills/cuopt-lp-milp-api-c/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-lp-milp-api-c -version: "26.04.00" +version: "26.06.00" description: LP and MILP with cuOpt — C API only. Use when the user is embedding LP/MILP in C/C++. --- diff --git a/skills/cuopt-lp-milp-api-cli/SKILL.md b/skills/cuopt-lp-milp-api-cli/SKILL.md index cbdc1e7778..1f8e8a157c 100644 --- a/skills/cuopt-lp-milp-api-cli/SKILL.md +++ b/skills/cuopt-lp-milp-api-cli/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-lp-milp-api-cli -version: "26.04.00" +version: "26.06.00" description: LP and MILP with cuOpt — CLI only (MPS files, cuopt_cli). Use when the user is solving from MPS via command line. --- diff --git a/skills/cuopt-lp-milp-api-python/SKILL.md b/skills/cuopt-lp-milp-api-python/SKILL.md index a7cd9a59f2..e8435867db 100644 --- a/skills/cuopt-lp-milp-api-python/SKILL.md +++ b/skills/cuopt-lp-milp-api-python/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-lp-milp-api-python -version: "26.04.00" +version: "26.06.00" description: Solve Linear Programming (LP) and Mixed-Integer Linear Programming (MILP) with the Python API. Use when the user asks about optimization with linear constraints, integer variables, scheduling, resource allocation, facility location, or production planning. --- diff --git a/skills/cuopt-qp-api-c/SKILL.md b/skills/cuopt-qp-api-c/SKILL.md index bc1efb63d3..85014b81fd 100644 --- a/skills/cuopt-qp-api-c/SKILL.md +++ b/skills/cuopt-qp-api-c/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-qp-api-c -version: "26.04.00" +version: "26.06.00" description: Quadratic Programming (QP) with cuOpt — C API. Use when the user is embedding QP in C/C++. --- diff --git a/skills/cuopt-qp-api-cli/SKILL.md b/skills/cuopt-qp-api-cli/SKILL.md index 5f8a8e848a..7aec559126 100644 --- a/skills/cuopt-qp-api-cli/SKILL.md +++ b/skills/cuopt-qp-api-cli/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-qp-api-cli -version: "26.04.00" +version: "26.06.00" description: QP with cuOpt — CLI (e.g. cuopt_cli with QP-capable input). Use when the user is solving QP from the command line. --- diff --git a/skills/cuopt-qp-api-python/SKILL.md b/skills/cuopt-qp-api-python/SKILL.md index b85b9e3db2..39533aaeca 100644 --- a/skills/cuopt-qp-api-python/SKILL.md +++ b/skills/cuopt-qp-api-python/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-qp-api-python -version: "26.04.00" +version: "26.06.00" description: Quadratic Programming (QP) with cuOpt — Python API only (beta). Use when the user is building or solving QP in Python. --- diff --git a/skills/cuopt-routing-api-python/SKILL.md b/skills/cuopt-routing-api-python/SKILL.md index d8bf736f8f..c386107241 100644 --- a/skills/cuopt-routing-api-python/SKILL.md +++ b/skills/cuopt-routing-api-python/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-routing-api-python -version: "26.04.00" +version: "26.06.00" description: Vehicle routing (VRP, TSP, PDP) with cuOpt — Python API only. Use when the user is building or solving routing in Python. --- diff --git a/skills/cuopt-server-api-python/SKILL.md b/skills/cuopt-server-api-python/SKILL.md index b340e9883f..7d6ed175dd 100644 --- a/skills/cuopt-server-api-python/SKILL.md +++ b/skills/cuopt-server-api-python/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-server-api-python -version: "26.04.00" +version: "26.06.00" description: cuOpt REST server — start server, endpoints, Python/curl client examples. Use when the user is deploying or calling the REST API. --- diff --git a/skills/cuopt-server-common/SKILL.md b/skills/cuopt-server-common/SKILL.md index f23c9c4a5f..cc2a3728d5 100644 --- a/skills/cuopt-server-common/SKILL.md +++ b/skills/cuopt-server-common/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-server-common -version: "26.04.00" +version: "26.06.00" description: cuOpt REST server — what it does and how requests flow. Domain concepts; no deploy or client code. --- diff --git a/skills/cuopt-user-rules/SKILL.md b/skills/cuopt-user-rules/SKILL.md index 0777b9af15..87734f72a2 100644 --- a/skills/cuopt-user-rules/SKILL.md +++ b/skills/cuopt-user-rules/SKILL.md @@ -1,6 +1,6 @@ --- name: cuopt-user-rules -version: "26.04.00" +version: "26.06.00" description: Base behavior rules for using NVIDIA cuOpt. Read this FIRST before any cuOpt user task (routing, LP/MILP, QP, installation, server). Covers handling incomplete questions, clarifying data requirements, verifying understanding, and running commands safely. --- diff --git a/skills/lp-milp-formulation/SKILL.md b/skills/lp-milp-formulation/SKILL.md index 64431a04c4..e429282033 100644 --- a/skills/lp-milp-formulation/SKILL.md +++ b/skills/lp-milp-formulation/SKILL.md @@ -1,6 +1,6 @@ --- name: lp-milp-formulation -version: "26.04.00" +version: "26.06.00" description: LP/MILP concepts and going from problem text to formulation. What LP/MILP are, required formulation questions, typical modeling elements, and how to parse problem statements (parameters, constraints, decisions, objective). --- diff --git a/skills/qp-formulation/SKILL.md b/skills/qp-formulation/SKILL.md index c87b887fbc..60aed00ede 100644 --- a/skills/qp-formulation/SKILL.md +++ b/skills/qp-formulation/SKILL.md @@ -1,6 +1,6 @@ --- name: qp-formulation -version: "26.04.00" +version: "26.06.00" description: Quadratic Programming (QP) — problem form and constraints. Domain concepts; no API or interface. QP is beta. --- diff --git a/skills/routing-formulation/SKILL.md b/skills/routing-formulation/SKILL.md index 4ab8d6419d..9cf8060cdf 100644 --- a/skills/routing-formulation/SKILL.md +++ b/skills/routing-formulation/SKILL.md @@ -1,6 +1,6 @@ --- name: routing-formulation -version: "26.04.00" +version: "26.06.00" description: Vehicle routing (VRP, TSP, PDP) — problem types and data requirements. Domain concepts; no API or interface. --- diff --git a/skills/skill-evolution/SKILL.md b/skills/skill-evolution/SKILL.md index d77fba1a3f..f3605795b7 100644 --- a/skills/skill-evolution/SKILL.md +++ b/skills/skill-evolution/SKILL.md @@ -1,6 +1,6 @@ --- name: skill-evolution -version: "26.04.00" +version: "26.06.00" description: After solving a non-trivial problem, detect generalizable learnings and propose skill updates so future interactions benefit automatically. Always active — applies to every interaction. --- @@ -182,7 +182,7 @@ When skill evolution creates an entirely new skill directory, add `origin: skill ```yaml --- name: new-skill-name -version: "26.04.00" +version: "26.06.00" description: ... origin: skill-evolution --- From d03e197ff1130d0c529ecc4e96fc72305691eecf Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Mon, 30 Mar 2026 17:53:17 -0500 Subject: [PATCH 003/107] Add missing thrust headers across C++ sources (#997) Fixes CI build failure where `thrust::make_transform_output_iterator` was not found in `infeasibility_information.cu` when building with CUDA 13.1.1 ([CI log](https://github.com/NVIDIA/cuopt/actions/runs/23632772472/job/68835651782#step:11:2154)). The codebase relied on transitive includes to resolve thrust symbols. This PR applies the Include What You Use (IWYU) principle: each of the 45 affected `.cu`/`.cuh`/`.hpp` files now directly includes the thrust headers for symbols it uses (`transform_iterator.h`, `transform_output_iterator.h`, `zip_iterator.h`, `tuple.h`, `device_ptr.h`, `transform_reduce.h`, `extrema.h`). ## Issue Closes #996 Authors: - Bradley Dice (https://github.com/bdice) - Ramakrishnap (https://github.com/rgsl888prabhu) Approvers: - Miles Lubin (https://github.com/mlubin) - Ramakrishnap (https://github.com/rgsl888prabhu) - Vyas Ramasubramani (https://github.com/vyasr) URL: https://github.com/NVIDIA/cuopt/pull/997 --- cpp/CMakeLists.txt | 5 +++++ cpp/src/barrier/barrier.cu | 2 ++ cpp/src/barrier/iterative_refinement.hpp | 1 + .../mip_heuristics/feasibility_jump/feasibility_jump.cu | 1 + .../feasibility_jump/feasibility_jump_kernels.cu | 2 ++ cpp/src/mip_heuristics/feasibility_jump/fj_cpu.cu | 3 +++ .../mip_heuristics/local_search/rounding/bounds_repair.cu | 2 ++ .../local_search/rounding/bounds_repair.cuh | 3 +++ .../local_search/rounding/constraint_prop.cu | 2 ++ .../local_search/rounding/lb_bounds_repair.cu | 2 ++ cpp/src/mip_heuristics/presolve/bounds_presolve.cu | 1 + .../presolve/conditional_bound_strengthening.cu | 6 ++++++ cpp/src/mip_heuristics/presolve/lb_probing_cache.cu | 2 ++ .../presolve/load_balanced_bounds_presolve.cu | 1 + .../presolve/load_balanced_bounds_presolve_helpers.cuh | 3 ++- cpp/src/mip_heuristics/presolve/multi_probe.cu | 1 + cpp/src/mip_heuristics/presolve/probing_cache.cu | 3 +++ cpp/src/mip_heuristics/presolve/trivial_presolve.cuh | 2 ++ cpp/src/mip_heuristics/problem/problem.cu | 3 +++ cpp/src/mip_heuristics/problem/problem_helpers.cuh | 2 ++ cpp/src/mip_heuristics/solution/solution.cu | 1 + cpp/src/pdlp/initial_scaling_strategy/initial_scaling.cu | 2 ++ cpp/src/pdlp/pdhg.cu | 2 ++ cpp/src/pdlp/pdlp.cu | 1 + cpp/src/pdlp/restart_strategy/pdlp_restart_strategy.cu | 2 ++ .../step_size_strategy/adaptive_step_size_strategy.cu | 3 +++ .../pdlp/termination_strategy/convergence_information.cu | 1 + .../termination_strategy/infeasibility_information.cu | 8 ++++++++ cpp/src/pdlp/utils.cuh | 2 ++ cpp/src/routing/local_search/compute_compatible.cu | 4 +++- cpp/src/routing/route/break_route.cuh | 4 +++- cpp/src/routing/route/capacity_route.cuh | 5 ++++- cpp/src/routing/route/dimensions_route.cuh | 4 +++- cpp/src/routing/route/distance_route.cuh | 4 +++- cpp/src/routing/route/mismatch_route.cuh | 4 +++- cpp/src/routing/route/pdp_route.cuh | 4 +++- cpp/src/routing/route/prize_route.cuh | 4 +++- cpp/src/routing/route/route.cuh | 2 ++ cpp/src/routing/route/service_time_route.cuh | 4 +++- cpp/src/routing/route/tasks_route.cuh | 4 +++- cpp/src/routing/route/time_route.cuh | 4 +++- cpp/src/routing/route/tsp_route.cuh | 4 +++- cpp/src/routing/route/vehicle_fixed_cost_route.cuh | 4 +++- cpp/src/routing/solution/route_node_map.cuh | 3 ++- cpp/src/routing/utilities/check_input.cu | 1 + cpp/src/utilities/copy_helpers.hpp | 1 + docs/cuopt/source/versions1.json | 8 ++++++-- 47 files changed, 120 insertions(+), 17 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 1946012ca4..5836736433 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -492,11 +492,14 @@ rapids_cpm_find( add_executable(cuopt_cli cuopt_cli.cpp) +# PIE executable: auditwheel/patchelf expands .dynstr/RPATH when repairing wheels; non-PIE +# (ET_EXEC) binaries are prone to corrupt segment layout. PIE (ET_DYN) survives RPATH edits. set_target_properties(cuopt_cli PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON CXX_SCAN_FOR_MODULES OFF + POSITION_INDEPENDENT_CODE ON ) target_compile_options(cuopt_cli @@ -504,6 +507,8 @@ target_compile_options(cuopt_cli "$<$:${CUOPT_CUDA_FLAGS}>" ) +target_link_options(cuopt_cli PRIVATE -pie) + target_include_directories(cuopt_cli PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" diff --git a/cpp/src/barrier/barrier.cu b/cpp/src/barrier/barrier.cu index 075323744d..76ed1927b1 100644 --- a/cpp/src/barrier/barrier.cu +++ b/cpp/src/barrier/barrier.cu @@ -40,7 +40,9 @@ #include #include +#include #include +#include namespace cuopt::linear_programming::dual_simplex { diff --git a/cpp/src/barrier/iterative_refinement.hpp b/cpp/src/barrier/iterative_refinement.hpp index d37760cd07..69e72d66bc 100644 --- a/cpp/src/barrier/iterative_refinement.hpp +++ b/cpp/src/barrier/iterative_refinement.hpp @@ -13,6 +13,7 @@ #include #include +#include #include #include #include diff --git a/cpp/src/mip_heuristics/feasibility_jump/feasibility_jump.cu b/cpp/src/mip_heuristics/feasibility_jump/feasibility_jump.cu index e9cf0760de..504eec38e4 100644 --- a/cpp/src/mip_heuristics/feasibility_jump/feasibility_jump.cu +++ b/cpp/src/mip_heuristics/feasibility_jump/feasibility_jump.cu @@ -23,6 +23,7 @@ #include #include +#include #include #include #include diff --git a/cpp/src/mip_heuristics/feasibility_jump/feasibility_jump_kernels.cu b/cpp/src/mip_heuristics/feasibility_jump/feasibility_jump_kernels.cu index ebbb761277..e9137503a5 100644 --- a/cpp/src/mip_heuristics/feasibility_jump/feasibility_jump_kernels.cu +++ b/cpp/src/mip_heuristics/feasibility_jump/feasibility_jump_kernels.cu @@ -14,6 +14,8 @@ #include +#include + #include #include "feasibility_jump_impl_common.cuh" diff --git a/cpp/src/mip_heuristics/feasibility_jump/fj_cpu.cu b/cpp/src/mip_heuristics/feasibility_jump/fj_cpu.cu index b3bc0d688e..f24e93a39a 100644 --- a/cpp/src/mip_heuristics/feasibility_jump/fj_cpu.cu +++ b/cpp/src/mip_heuristics/feasibility_jump/fj_cpu.cu @@ -15,6 +15,9 @@ #include +#include +#include + #include #include #include diff --git a/cpp/src/mip_heuristics/local_search/rounding/bounds_repair.cu b/cpp/src/mip_heuristics/local_search/rounding/bounds_repair.cu index f3233cc8f4..6512ad05da 100644 --- a/cpp/src/mip_heuristics/local_search/rounding/bounds_repair.cu +++ b/cpp/src/mip_heuristics/local_search/rounding/bounds_repair.cu @@ -8,8 +8,10 @@ #include "bounds_repair.cuh" #include +#include #include #include +#include #include #include #include diff --git a/cpp/src/mip_heuristics/local_search/rounding/bounds_repair.cuh b/cpp/src/mip_heuristics/local_search/rounding/bounds_repair.cuh index 29161c5d25..e4f1b4a866 100644 --- a/cpp/src/mip_heuristics/local_search/rounding/bounds_repair.cuh +++ b/cpp/src/mip_heuristics/local_search/rounding/bounds_repair.cuh @@ -13,6 +13,9 @@ #include #include +#include +#include + namespace cuopt::linear_programming::detail { // from the paper, probability of choosing random candidate= noise parameter diff --git a/cpp/src/mip_heuristics/local_search/rounding/constraint_prop.cu b/cpp/src/mip_heuristics/local_search/rounding/constraint_prop.cu index 8db4d7ae85..51c103c74f 100644 --- a/cpp/src/mip_heuristics/local_search/rounding/constraint_prop.cu +++ b/cpp/src/mip_heuristics/local_search/rounding/constraint_prop.cu @@ -16,8 +16,10 @@ #include #include #include +#include #include #include +#include namespace cuopt::linear_programming::detail { diff --git a/cpp/src/mip_heuristics/local_search/rounding/lb_bounds_repair.cu b/cpp/src/mip_heuristics/local_search/rounding/lb_bounds_repair.cu index 7d074aea5e..10973f1565 100644 --- a/cpp/src/mip_heuristics/local_search/rounding/lb_bounds_repair.cu +++ b/cpp/src/mip_heuristics/local_search/rounding/lb_bounds_repair.cu @@ -8,8 +8,10 @@ #include "lb_bounds_repair.cuh" #include +#include #include #include +#include #include #include #include diff --git a/cpp/src/mip_heuristics/presolve/bounds_presolve.cu b/cpp/src/mip_heuristics/presolve/bounds_presolve.cu index d78f8beb16..0a7c9de41a 100644 --- a/cpp/src/mip_heuristics/presolve/bounds_presolve.cu +++ b/cpp/src/mip_heuristics/presolve/bounds_presolve.cu @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include diff --git a/cpp/src/mip_heuristics/presolve/conditional_bound_strengthening.cu b/cpp/src/mip_heuristics/presolve/conditional_bound_strengthening.cu index 13412614b8..24cac7129f 100644 --- a/cpp/src/mip_heuristics/presolve/conditional_bound_strengthening.cu +++ b/cpp/src/mip_heuristics/presolve/conditional_bound_strengthening.cu @@ -17,6 +17,12 @@ #include "cusparse.h" #include + +#include +#include +#include +#include + #include "conditional_bound_strengthening.cuh" #include diff --git a/cpp/src/mip_heuristics/presolve/lb_probing_cache.cu b/cpp/src/mip_heuristics/presolve/lb_probing_cache.cu index 3a6d1bce21..bbb58c0164 100644 --- a/cpp/src/mip_heuristics/presolve/lb_probing_cache.cu +++ b/cpp/src/mip_heuristics/presolve/lb_probing_cache.cu @@ -10,7 +10,9 @@ #include #include +#include #include +#include #include #include diff --git a/cpp/src/mip_heuristics/presolve/load_balanced_bounds_presolve.cu b/cpp/src/mip_heuristics/presolve/load_balanced_bounds_presolve.cu index 0d16c26cae..f48eae1de8 100644 --- a/cpp/src/mip_heuristics/presolve/load_balanced_bounds_presolve.cu +++ b/cpp/src/mip_heuristics/presolve/load_balanced_bounds_presolve.cu @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include diff --git a/cpp/src/mip_heuristics/presolve/load_balanced_bounds_presolve_helpers.cuh b/cpp/src/mip_heuristics/presolve/load_balanced_bounds_presolve_helpers.cuh index cbcd91a7d7..f276840bdf 100644 --- a/cpp/src/mip_heuristics/presolve/load_balanced_bounds_presolve_helpers.cuh +++ b/cpp/src/mip_heuristics/presolve/load_balanced_bounds_presolve_helpers.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2022-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -10,6 +10,7 @@ #include "load_balanced_bounds_presolve_kernels.cuh" #include "load_balanced_partition_helpers.cuh" +#include #include #include #include diff --git a/cpp/src/mip_heuristics/presolve/multi_probe.cu b/cpp/src/mip_heuristics/presolve/multi_probe.cu index 7789b3281b..f798957e1c 100644 --- a/cpp/src/mip_heuristics/presolve/multi_probe.cu +++ b/cpp/src/mip_heuristics/presolve/multi_probe.cu @@ -9,6 +9,7 @@ #include #include +#include #include #include #include diff --git a/cpp/src/mip_heuristics/presolve/probing_cache.cu b/cpp/src/mip_heuristics/presolve/probing_cache.cu index 18f678c7e0..e0b8f554b0 100644 --- a/cpp/src/mip_heuristics/presolve/probing_cache.cu +++ b/cpp/src/mip_heuristics/presolve/probing_cache.cu @@ -14,7 +14,10 @@ #include #include +#include +#include #include +#include #include #include diff --git a/cpp/src/mip_heuristics/presolve/trivial_presolve.cuh b/cpp/src/mip_heuristics/presolve/trivial_presolve.cuh index 568719dfd8..28162d7482 100644 --- a/cpp/src/mip_heuristics/presolve/trivial_presolve.cuh +++ b/cpp/src/mip_heuristics/presolve/trivial_presolve.cuh @@ -14,9 +14,11 @@ #include #include +#include #include #include #include +#include #include #include #include diff --git a/cpp/src/mip_heuristics/problem/problem.cu b/cpp/src/mip_heuristics/problem/problem.cu index 90d80f5948..f5bbda1c29 100644 --- a/cpp/src/mip_heuristics/problem/problem.cu +++ b/cpp/src/mip_heuristics/problem/problem.cu @@ -27,9 +27,12 @@ #include #include #include +#include +#include #include #include #include +#include #include #include diff --git a/cpp/src/mip_heuristics/problem/problem_helpers.cuh b/cpp/src/mip_heuristics/problem/problem_helpers.cuh index ebc8a488ea..939702e97d 100644 --- a/cpp/src/mip_heuristics/problem/problem_helpers.cuh +++ b/cpp/src/mip_heuristics/problem/problem_helpers.cuh @@ -19,8 +19,10 @@ #include #include #include +#include #include #include +#include namespace cuopt::linear_programming::detail { template diff --git a/cpp/src/mip_heuristics/solution/solution.cu b/cpp/src/mip_heuristics/solution/solution.cu index 531d54372c..b5506024f9 100644 --- a/cpp/src/mip_heuristics/solution/solution.cu +++ b/cpp/src/mip_heuristics/solution/solution.cu @@ -19,6 +19,7 @@ #include #include +#include #include #include #include diff --git a/cpp/src/pdlp/initial_scaling_strategy/initial_scaling.cu b/cpp/src/pdlp/initial_scaling_strategy/initial_scaling.cu index b618550f6e..a76b1773f9 100644 --- a/cpp/src/pdlp/initial_scaling_strategy/initial_scaling.cu +++ b/cpp/src/pdlp/initial_scaling_strategy/initial_scaling.cu @@ -22,6 +22,8 @@ #include #include +#include +#include #include namespace cuopt::linear_programming::detail { diff --git a/cpp/src/pdlp/pdhg.cu b/cpp/src/pdlp/pdhg.cu index 74df7fee01..cb16c9d662 100644 --- a/cpp/src/pdlp/pdhg.cu +++ b/cpp/src/pdlp/pdhg.cu @@ -30,6 +30,8 @@ #include +#include + #include namespace cuopt::linear_programming::detail { diff --git a/cpp/src/pdlp/pdlp.cu b/cpp/src/pdlp/pdlp.cu index 82e79098a7..40d907e469 100644 --- a/cpp/src/pdlp/pdlp.cu +++ b/cpp/src/pdlp/pdlp.cu @@ -35,6 +35,7 @@ #include #include +#include #include #include diff --git a/cpp/src/pdlp/restart_strategy/pdlp_restart_strategy.cu b/cpp/src/pdlp/restart_strategy/pdlp_restart_strategy.cu index 149e99a431..05da0350d0 100644 --- a/cpp/src/pdlp/restart_strategy/pdlp_restart_strategy.cu +++ b/cpp/src/pdlp/restart_strategy/pdlp_restart_strategy.cu @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -39,6 +40,7 @@ #include #include #include +#include #include diff --git a/cpp/src/pdlp/step_size_strategy/adaptive_step_size_strategy.cu b/cpp/src/pdlp/step_size_strategy/adaptive_step_size_strategy.cu index d17a88dd29..c95ed67ca6 100644 --- a/cpp/src/pdlp/step_size_strategy/adaptive_step_size_strategy.cu +++ b/cpp/src/pdlp/step_size_strategy/adaptive_step_size_strategy.cu @@ -28,6 +28,9 @@ #include +#include +#include + #include namespace cuopt::linear_programming::detail { diff --git a/cpp/src/pdlp/termination_strategy/convergence_information.cu b/cpp/src/pdlp/termination_strategy/convergence_information.cu index ab0c921cc7..b4da4ffbde 100644 --- a/cpp/src/pdlp/termination_strategy/convergence_information.cu +++ b/cpp/src/pdlp/termination_strategy/convergence_information.cu @@ -25,6 +25,7 @@ #include #include +#include #include #include diff --git a/cpp/src/pdlp/termination_strategy/infeasibility_information.cu b/cpp/src/pdlp/termination_strategy/infeasibility_information.cu index dbb35b732d..37972ba442 100644 --- a/cpp/src/pdlp/termination_strategy/infeasibility_information.cu +++ b/cpp/src/pdlp/termination_strategy/infeasibility_information.cu @@ -24,6 +24,14 @@ #include #include +#include +#include +#include +#include +#include +#include +#include + namespace cuopt::linear_programming::detail { template infeasibility_information_t::infeasibility_information_t( diff --git a/cpp/src/pdlp/utils.cuh b/cpp/src/pdlp/utils.cuh index 138c9c2ab9..77bc6b18ce 100644 --- a/cpp/src/pdlp/utils.cuh +++ b/cpp/src/pdlp/utils.cuh @@ -24,6 +24,8 @@ #include #include +#include +#include #include #include diff --git a/cpp/src/routing/local_search/compute_compatible.cu b/cpp/src/routing/local_search/compute_compatible.cu index 8386cb087b..457e970632 100644 --- a/cpp/src/routing/local_search/compute_compatible.cu +++ b/cpp/src/routing/local_search/compute_compatible.cu @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2023-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -9,6 +9,8 @@ #include "compute_compatible.cuh" #include "local_search.cuh" +#include +#include #include #include diff --git a/cpp/src/routing/route/break_route.cuh b/cpp/src/routing/route/break_route.cuh index 68ab015646..1d5b3472f9 100644 --- a/cpp/src/routing/route/break_route.cuh +++ b/cpp/src/routing/route/break_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -17,6 +17,8 @@ #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/capacity_route.cuh b/cpp/src/routing/route/capacity_route.cuh index a39ef46a93..388e573c1c 100644 --- a/cpp/src/routing/route/capacity_route.cuh +++ b/cpp/src/routing/route/capacity_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2021-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -17,6 +17,9 @@ #include #include + +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/dimensions_route.cuh b/cpp/src/routing/route/dimensions_route.cuh index d1131ea550..bc08ba9819 100644 --- a/cpp/src/routing/route/dimensions_route.cuh +++ b/cpp/src/routing/route/dimensions_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2021-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -30,6 +30,8 @@ #include #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/distance_route.cuh b/cpp/src/routing/route/distance_route.cuh index e01c552080..a5f98c13ce 100644 --- a/cpp/src/routing/route/distance_route.cuh +++ b/cpp/src/routing/route/distance_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2021-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -17,6 +17,8 @@ #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/mismatch_route.cuh b/cpp/src/routing/route/mismatch_route.cuh index d72f01735a..78975750e0 100644 --- a/cpp/src/routing/route/mismatch_route.cuh +++ b/cpp/src/routing/route/mismatch_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2023-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -15,6 +15,8 @@ #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/pdp_route.cuh b/cpp/src/routing/route/pdp_route.cuh index dc9b8ad699..dd20e2fec3 100644 --- a/cpp/src/routing/route/pdp_route.cuh +++ b/cpp/src/routing/route/pdp_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2021-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -17,6 +17,8 @@ #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/prize_route.cuh b/cpp/src/routing/route/prize_route.cuh index 0330d14590..80b27061b5 100644 --- a/cpp/src/routing/route/prize_route.cuh +++ b/cpp/src/routing/route/prize_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2023-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -17,6 +17,8 @@ #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/route.cuh b/cpp/src/routing/route/route.cuh index e6367a4836..b624acb903 100644 --- a/cpp/src/routing/route/route.cuh +++ b/cpp/src/routing/route/route.cuh @@ -11,6 +11,8 @@ #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/service_time_route.cuh b/cpp/src/routing/route/service_time_route.cuh index b35e53c2d8..03c48b2e42 100644 --- a/cpp/src/routing/route/service_time_route.cuh +++ b/cpp/src/routing/route/service_time_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2023-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -15,6 +15,8 @@ #include #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/tasks_route.cuh b/cpp/src/routing/route/tasks_route.cuh index 6da9e4372a..3624d647e7 100644 --- a/cpp/src/routing/route/tasks_route.cuh +++ b/cpp/src/routing/route/tasks_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2021-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -15,6 +15,8 @@ #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/time_route.cuh b/cpp/src/routing/route/time_route.cuh index bb5ec653e1..21448c4273 100644 --- a/cpp/src/routing/route/time_route.cuh +++ b/cpp/src/routing/route/time_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2021-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -17,6 +17,8 @@ #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/tsp_route.cuh b/cpp/src/routing/route/tsp_route.cuh index ee1ba5370c..9b7eeeee56 100644 --- a/cpp/src/routing/route/tsp_route.cuh +++ b/cpp/src/routing/route/tsp_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -16,6 +16,8 @@ #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/route/vehicle_fixed_cost_route.cuh b/cpp/src/routing/route/vehicle_fixed_cost_route.cuh index 83ea5db481..1e246fbb6e 100644 --- a/cpp/src/routing/route/vehicle_fixed_cost_route.cuh +++ b/cpp/src/routing/route/vehicle_fixed_cost_route.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -14,6 +14,8 @@ #include +#include + namespace cuopt { namespace routing { namespace detail { diff --git a/cpp/src/routing/solution/route_node_map.cuh b/cpp/src/routing/solution/route_node_map.cuh index 25a6c4919b..a4a1b171aa 100644 --- a/cpp/src/routing/solution/route_node_map.cuh +++ b/cpp/src/routing/solution/route_node_map.cuh @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2023-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -8,6 +8,7 @@ #pragma once #include +#include #include #include #include diff --git a/cpp/src/routing/utilities/check_input.cu b/cpp/src/routing/utilities/check_input.cu index e902f2d460..eccc3179bb 100644 --- a/cpp/src/routing/utilities/check_input.cu +++ b/cpp/src/routing/utilities/check_input.cu @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include diff --git a/cpp/src/utilities/copy_helpers.hpp b/cpp/src/utilities/copy_helpers.hpp index 36a4659059..6aa9efbab8 100644 --- a/cpp/src/utilities/copy_helpers.hpp +++ b/cpp/src/utilities/copy_helpers.hpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include diff --git a/docs/cuopt/source/versions1.json b/docs/cuopt/source/versions1.json index 3e986996a4..507dfe57a4 100644 --- a/docs/cuopt/source/versions1.json +++ b/docs/cuopt/source/versions1.json @@ -1,10 +1,14 @@ [ { - "version": "26.04.00", - "url": "https://docs.nvidia.com/cuopt/user-guide/26.04.00/", + "version": "26.06.00", + "url": "https://docs.nvidia.com/cuopt/user-guide/26.06.00/", "name": "latest", "preferred": true }, + { + "version": "26.04.00", + "url": "https://docs.nvidia.com/cuopt/user-guide/26.04.00/" + }, { "version": "26.02.00", "url": "https://docs.nvidia.com/cuopt/user-guide/26.02.00/" From 2cf8b3239fc1b8c8480d0a999fc2f207478e7605 Mon Sep 17 00:00:00 2001 From: Jake Awe <50372925+AyodeAwe@users.noreply.github.com> Date: Tue, 31 Mar 2026 09:44:59 -0500 Subject: [PATCH 004/107] Update versions1.json as part of version bump (#1004) `update-version.sh` updates VERSION and all associated files, but `docs/cuopt/source/versions1.json` was not included. This caused the pre-commit style check to fail on main after the 26.04 burndown version bump -- `versions1.json` still referenced 26.04.00 while VERSION had moved to 26.06.00. This adds a call to `ci/utils/update_doc_versions.py` at the end of `update-version.sh` so the docs version switcher is updated atomically as part of every version bump, rather than relying on the pre-commit hook to catch the gap after the fact. Authors: - Jake Awe (https://github.com/AyodeAwe) Approvers: - Ramakrishnap (https://github.com/rgsl888prabhu) URL: https://github.com/NVIDIA/cuopt/pull/1004 --- ci/release/update-version.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci/release/update-version.sh b/ci/release/update-version.sh index 3d6c356b3d..9a67bb65a5 100755 --- a/ci/release/update-version.sh +++ b/ci/release/update-version.sh @@ -152,3 +152,6 @@ elif [[ "${RUN_CONTEXT}" == "release" ]]; then sed_runner "s|\\bmain\\b|release/${NEXT_SHORT_TAG}|g" docs/cuopt/source/faq.rst sed_runner "s|\\bmain\\b|release/${NEXT_SHORT_TAG}|g" docs/cuopt/source/cuopt-python/routing/routing-example.ipynb fi + +# Update docs version switcher to include the new version +python ci/utils/update_doc_versions.py From 3b2156c98940bdd035d2e5ab40cf92990049ce1f Mon Sep 17 00:00:00 2001 From: Ramakrishna Prabhu Date: Tue, 31 Mar 2026 11:05:56 -0500 Subject: [PATCH 005/107] Bump wheel size for libcuopt to 490 --- ci/validate_wheel.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/validate_wheel.sh b/ci/validate_wheel.sh index 6541c0e2d1..420f89c801 100755 --- a/ci/validate_wheel.sh +++ b/ci/validate_wheel.sh @@ -26,7 +26,7 @@ if [[ "${package_dir}" == "python/libcuopt" ]]; then ) else PYDISTCHECK_ARGS+=( - --max-allowed-size-compressed '485Mi' + --max-allowed-size-compressed '490Mi' ) fi elif [[ "${package_dir}" != "python/cuopt" ]] && \ From 39b3b477d1e1bf4af469d7fbaa46e43984bc0bc5 Mon Sep 17 00:00:00 2001 From: Miles Lubin Date: Tue, 31 Mar 2026 14:30:04 -0400 Subject: [PATCH 006/107] Tweak testing instructions in CONTRIBUTING.md (#1000) The instructions fail for me without `./`. `WAYPOINT_MATRIXTEST` fails with an obscure error if `CUOPT_HOME` isn't exported. Authors: - Miles Lubin (https://github.com/mlubin) Approvers: - Rajesh Gandham (https://github.com/rg20) URL: https://github.com/NVIDIA/cuopt/pull/1000 --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2835786ae4..2bdb307ca7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -117,7 +117,7 @@ Architecture: - Clone the repository: ```bash -CUOPT_HOME=$(pwd)/cuopt +export CUOPT_HOME=$(pwd)/cuopt git clone https://github.com/NVIDIA/cuopt.git $CUOPT_HOME cd $CUOPT_HOME ``` @@ -193,7 +193,7 @@ To build all libraries and tests, simply run To run the C++ tests, run ```bash -cd $CUOPT_HOME/datasets && get_test_data.sh +cd $CUOPT_HOME/datasets && ./get_test_data.sh cd $CUOPT_HOME && datasets/linear_programming/download_pdlp_test_dataset.sh datasets/mip/download_miplib_test_dataset.sh export RAPIDS_DATASET_ROOT_DIR=$CUOPT_HOME/datasets/ @@ -205,7 +205,7 @@ To run python tests, run - To run `cuopt` tests: ```bash -cd $CUOPT_HOME/datasets && get_test_data.sh +cd $CUOPT_HOME/datasets && ./get_test_data.sh cd $CUOPT_HOME && datasets/linear_programming/download_pdlp_test_dataset.sh datasets/mip/download_miplib_test_dataset.sh export RAPIDS_DATASET_ROOT_DIR=$CUOPT_HOME/datasets/ From 490f29e86c6304043a56dc5ad19b3b656e072fde Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Wed, 1 Apr 2026 09:06:36 -0700 Subject: [PATCH 007/107] Make infra team as default code owner to any files which are not specifically added to a particular group (#1013) This change make infra team as default code-owners in case a file/folder is not explicitly added in codeowners list to ensure infra team will cover and provide reviews. Authors: - Ramakrishnap (https://github.com/rgsl888prabhu) Approvers: - James Lamb (https://github.com/jameslamb) URL: https://github.com/NVIDIA/cuopt/pull/1013 --- .github/CODEOWNERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7958eac440..cdbf4df577 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,6 @@ +# Default owner for paths with no later, more specific match +* @nvidia/cuopt-infra-codeowners + #cpp code owners cpp/ @nvidia/cuopt-engine-codeowners From 1d61c7d1af22c600ed535d1b997cab9050f8d115 Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Wed, 1 Apr 2026 12:36:41 -0700 Subject: [PATCH 008/107] Bump libcuopt size by 5 mb (#1016) ## Description There were failure due to increase in wheel size, so bumping the wheel size limit for libcuopt https://github.com/NVIDIA/cuopt/actions/runs/23821469086/job/69435078088?pr=1015 ## Checklist - [x] I am familiar with the [Contributing Guidelines](https://github.com/NVIDIA/cuopt/blob/HEAD/CONTRIBUTING.md). - Testing - [ ] New or existing tests cover these changes - [ ] Added tests - [ ] Created an issue to follow-up - [x] NA - Documentation - [ ] The documentation is up to date with these changes - [ ] Added new documentation - [x] NA --- ci/validate_wheel.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/validate_wheel.sh b/ci/validate_wheel.sh index 420f89c801..79188cacc3 100755 --- a/ci/validate_wheel.sh +++ b/ci/validate_wheel.sh @@ -22,11 +22,11 @@ PYDISTCHECK_ARGS=( if [[ "${package_dir}" == "python/libcuopt" ]]; then if [[ "${RAPIDS_CUDA_MAJOR}" == "12" ]]; then PYDISTCHECK_ARGS+=( - --max-allowed-size-compressed '645Mi' + --max-allowed-size-compressed '650Mi' ) else PYDISTCHECK_ARGS+=( - --max-allowed-size-compressed '490Mi' + --max-allowed-size-compressed '495Mi' ) fi elif [[ "${package_dir}" != "python/cuopt" ]] && \ From 2d93109c9b4ec12f8f75cfd1783d1c42fe9684f5 Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:28:33 -0700 Subject: [PATCH 009/107] Update sonarcube host link to Nvidia (#1015) Update sonarcube host link to Nvidia Authors: - Ramakrishnap (https://github.com/rgsl888prabhu) Approvers: - Trevor McKay (https://github.com/tmckayus) URL: https://github.com/NVIDIA/cuopt/pull/1015 --- sonar-project.properties | 2 +- sonarqube/sonar-branches.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sonar-project.properties b/sonar-project.properties index ae8d6bd25c..7dafbc9969 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -5,6 +5,6 @@ sonar.projectKey=GPUSW_cuOpt_Nvidia-cuOpt_cuopt sonar.projectName=NVIDIA cuOpt sonar.projectVersion=1.0 - +sonar.host.url=https://sonar.nvidia.com # Source code location sonar.sources=. diff --git a/sonarqube/sonar-branches.txt b/sonarqube/sonar-branches.txt index a75ecac679..14fe38226d 100644 --- a/sonarqube/sonar-branches.txt +++ b/sonarqube/sonar-branches.txt @@ -5,7 +5,7 @@ # Main development branches main -release/26.02 +release/26.04 # Add release branches as needed # release/v1.0 From 40c8f04a12974751687c7cad986b395119c75d33 Mon Sep 17 00:00:00 2001 From: Miles Lubin Date: Fri, 3 Apr 2026 14:20:45 -0400 Subject: [PATCH 010/107] Exclude L1TESTs from contributing instructions (#1034) These tests are expensive, currently broken, and aren't covered under CI. New contributors will be confused if they see failing tests, so they should be excluded from the instructions. Authors: - Miles Lubin (https://github.com/mlubin) Approvers: - Hugo Linsenmaier (https://github.com/hlinsen) - Ramakrishnap (https://github.com/rgsl888prabhu) URL: https://github.com/NVIDIA/cuopt/pull/1034 --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2bdb307ca7..666a086d99 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -197,8 +197,9 @@ cd $CUOPT_HOME/datasets && ./get_test_data.sh cd $CUOPT_HOME && datasets/linear_programming/download_pdlp_test_dataset.sh datasets/mip/download_miplib_test_dataset.sh export RAPIDS_DATASET_ROOT_DIR=$CUOPT_HOME/datasets/ -ctest --test-dir ${CUOPT_HOME}/cpp/build # libcuopt +ctest --test-dir ${CUOPT_HOME}/cpp/build -E L1TEST # libcuopt ``` +`L1TEST`s are excluded because they are expensive and not run as part of the typical development process. To run python tests, run From 81a61ef862de988e4a9734d938a974c833303229 Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:44:22 -0500 Subject: [PATCH 011/107] Bump libcuopt wheel size (#1087) ## Description libcuopt wheel-build is failing because of the size. ## Checklist - [x] I am familiar with the [Contributing Guidelines](https://github.com/NVIDIA/cuopt/blob/HEAD/CONTRIBUTING.md). - Testing - [ ] New or existing tests cover these changes - [ ] Added tests - [ ] Created an issue to follow-up - [x] NA - Documentation - [ ] The documentation is up to date with these changes - [ ] Added new documentation - [x] NA --- ci/validate_wheel.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/validate_wheel.sh b/ci/validate_wheel.sh index 79188cacc3..4d6180637f 100755 --- a/ci/validate_wheel.sh +++ b/ci/validate_wheel.sh @@ -22,11 +22,11 @@ PYDISTCHECK_ARGS=( if [[ "${package_dir}" == "python/libcuopt" ]]; then if [[ "${RAPIDS_CUDA_MAJOR}" == "12" ]]; then PYDISTCHECK_ARGS+=( - --max-allowed-size-compressed '650Mi' + --max-allowed-size-compressed '665Mi' ) else PYDISTCHECK_ARGS+=( - --max-allowed-size-compressed '495Mi' + --max-allowed-size-compressed '505Mi' ) fi elif [[ "${package_dir}" != "python/cuopt" ]] && \ From ce83522f01589251b960408946c10801bf8fe1c1 Mon Sep 17 00:00:00 2001 From: Miles Lubin Date: Thu, 9 Apr 2026 12:45:03 -0400 Subject: [PATCH 012/107] CONTRIBUTING.md: Recommend local conda environments (#1085) Using a global conda environment is error prone because `./build.sh` modifies it. We should recommend a local environment instead. --- .gitignore | 3 +++ CONTRIBUTING.md | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 4829b2ecd0..7fd191dc39 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,6 @@ docs/cuopt/build cpp/include/cuopt/semantic_version.hpp !datasets/quadratic_programming !datasets/quadratic_programming/** + +# conda env (recommended name) +.cuopt_env diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a935201f21..8c596c3a47 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -136,9 +136,9 @@ Please install conda if you don't have it already. You can install [miniforge](h # create the conda environment (assuming in base `cuopt` directory) # note: cuOpt currently doesn't support `channel_priority: strict`; # use `channel_priority: flexible` instead -conda env create --name cuopt_dev --file conda/environments/all_cuda-131_arch-$(uname -m).yaml +conda env create -p ./.cuopt_env --file conda/environments/all_cuda-131_arch-$(uname -m).yaml # activate the environment -conda activate cuopt_dev +conda activate ./.cuopt_env ``` - **Note**: the conda environment files are updated frequently, so the From f5842df471ff36926e39b2bdcda5473ebde8a591 Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:38:35 -0500 Subject: [PATCH 013/107] Replace strtok with thread-safe strtok_r in MPS parser (#1088) ## Summary Replace `strtok()` with `strtok_r()` in `parse_string()` to make MPS file parsing thread-safe. `strtok` uses internal static state, so concurrent parsing from multiple threads corrupts tokenization. ## Testing No new tests added. Existing MPS parser tests cover this code path. ## Documentation No documentation changes needed. Authors: - Ramakrishnap (https://github.com/rgsl888prabhu) Approvers: - Miles Lubin (https://github.com/mlubin) URL: https://github.com/NVIDIA/cuopt/pull/1088 --- cpp/libmps_parser/src/mps_parser.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cpp/libmps_parser/src/mps_parser.cpp b/cpp/libmps_parser/src/mps_parser.cpp index 6a81b3b6c1..586544331f 100644 --- a/cpp/libmps_parser/src/mps_parser.cpp +++ b/cpp/libmps_parser/src/mps_parser.cpp @@ -582,7 +582,8 @@ void mps_parser_t::parse_string(char* buf) // raft::common::nvtx::range fun_scope("parse string"); // Faster than C++ std::get_line - char* c_line = strtok(buf, "\n"); + char* saveptr = nullptr; + char* c_line = strtok_r(buf, "\n", &saveptr); bool skip_line = false; mps_parser_expects(c_line != nullptr, @@ -768,7 +769,7 @@ void mps_parser_t::parse_string(char* buf) "Ended up at a bad parser state! Line=%s", std::string(line).c_str()); } - } while ((c_line = strtok(nullptr, "\n")) != nullptr); + } while ((c_line = strtok_r(nullptr, "\n", &saveptr)) != nullptr); mps_parser_expects(!objective_name.empty(), error_type_t::ValidationError, "No objective found!"); mps_parser_expects( From 24fdb60f6350e8c06afdf3bc2ff73e83bf9c3267 Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Fri, 10 Apr 2026 09:59:49 -0500 Subject: [PATCH 014/107] Update to clang 20.1.8 (#1090) Contributes to https://github.com/rapidsai/build-planning/issues/267 This PR updates the clang version to 20.1.8. Authors: - Bradley Dice (https://github.com/bdice) Approvers: - James Lamb (https://github.com/jameslamb) URL: https://github.com/NVIDIA/cuopt/pull/1090 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 87a3faaf92..24ea8782d0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: notebooks ) - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v20.1.4 + rev: v20.1.8 hooks: - id: clang-format files: \.(cu|cuh|h|hpp|cpp|inl)$ From 90e37ab870c6a22375b88ea8cf6b5d24eb07bc82 Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Tue, 14 Apr 2026 10:06:26 -0500 Subject: [PATCH 015/107] bump nightly test to 26.06 (#1091) Bumpy nightly tests for 26.06 and disable 26.04 Authors: - Ramakrishnap (https://github.com/rgsl888prabhu) Approvers: - Trevor McKay (https://github.com/tmckayus) URL: https://github.com/NVIDIA/cuopt/pull/1091 --- .github/workflows/nightly.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly.yaml b/.github/workflows/nightly.yaml index c5e2b5f674..b640168513 100644 --- a/.github/workflows/nightly.yaml +++ b/.github/workflows/nightly.yaml @@ -17,7 +17,7 @@ jobs: matrix: cuopt_branch: - "main" - - "release/26.04" + - "release/26.06" steps: - uses: actions/checkout@v4 - name: Trigger Pipeline From b497a5b36ed2e9026b0bd376629f8e8590672719 Mon Sep 17 00:00:00 2001 From: Hugo Linsenmaier Date: Tue, 14 Apr 2026 08:17:03 -0700 Subject: [PATCH 016/107] Require openssl so that conda verson is found before system lib (#1084) Before this PR the system lib of openssl was picked causing potential GLIBC version mismatches on certain machines `-- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "3.0.13")` With this PR we explicitly require openssl which forces Cmake to look for the conda path first. This fixes unexpected compile errors. Authors: - Hugo Linsenmaier (https://github.com/hlinsen) - Ramakrishnap (https://github.com/rgsl888prabhu) Approvers: - Ramakrishnap (https://github.com/rgsl888prabhu) URL: https://github.com/NVIDIA/cuopt/pull/1084 --- cpp/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 06523bf404..abc6a19ab2 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -293,6 +293,14 @@ find_package(CUDSS REQUIRED) # gRPC can come from either: # - an installed CMake package (gRPCConfig.cmake), or # - an in-tree build (e.g. python/libcuopt uses FetchContent(grpc), which defines gRPC::grpc++). + +if(NOT TARGET OpenSSL::SSL) + find_package(OpenSSL CONFIG QUIET) + if(NOT OpenSSL_FOUND AND NOT OPENSSL_FOUND) + find_package(OpenSSL REQUIRED) + endif() +endif() + if(NOT TARGET gRPC::grpc++) find_package(gRPC CONFIG REQUIRED) endif() From 9fe95f252112a3f55359a2cf465b923422a87123 Mon Sep 17 00:00:00 2001 From: Nikolay Poperechnyi <11064107+np96@users.noreply.github.com> Date: Tue, 14 Apr 2026 21:00:17 +0300 Subject: [PATCH 017/107] fix(cuda_helpers): clear sticky error and avoid cache poisoning in set_shmem_of_kernel (#1095) When cudaFuncSetAttribute fails (e.g. requested size exceeds device limit), the previous implementation stored the failed size in the shmem_sizes cache and left a sticky CUDA error in the last-error slot. Subsequent calls for the same kernel would see the cached (invalid) size and skip the attribute call, silently proceeding without the required shared memory. The sticky error would later be caught by an unrelated RAFT_CHECK_CUDA, producing a confusing cudaErrorInvalidValue crash. Fix: - Only update the cache on success. - On failure, consume the error with cudaGetLastError() so it cannot surface later, then return false. - Add five unit tests in ROUTING_UNIT_TEST covering zero request, normal request, too-large returns false, cache not poisoned on failure, and no sticky error after failure. ## Issue https://github.com/NVIDIA/cuopt/issues/1094 Authors: - Nikolay Poperechnyi (https://github.com/np96) Approvers: - Hugo Linsenmaier (https://github.com/hlinsen) - Ramakrishnap (https://github.com/rgsl888prabhu) URL: https://github.com/NVIDIA/cuopt/pull/1095 --- cpp/src/utilities/cuda_helpers.cuh | 44 ++++++++-- cpp/tests/routing/CMakeLists.txt | 1 + .../routing/unit_tests/set_shmem_of_kernel.cu | 85 +++++++++++++++++++ 3 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 cpp/tests/routing/unit_tests/set_shmem_of_kernel.cu diff --git a/cpp/src/utilities/cuda_helpers.cuh b/cpp/src/utilities/cuda_helpers.cuh index 946099648d..84c0a590be 100644 --- a/cpp/src/utilities/cuda_helpers.cuh +++ b/cpp/src/utilities/cuda_helpers.cuh @@ -18,6 +18,7 @@ #include #include #include +#include #include namespace cuopt { @@ -175,24 +176,49 @@ HDI To bit_cast(const From& src) return *(To*)(&src); } +/** + * @brief Raises the dynamic shared-memory limit for a CUDA kernel, with caching. + * + * Calls cudaFuncSetAttribute(cudaFuncAttributeMaxDynamicSharedMemorySize) only when + * @p dynamic_request_size exceeds the previously set limit for @p function. The + * per-kernel high-water mark is stored in a process-wide cache so that repeated + * calls with the same or smaller sizes are cheap shared-lock reads. + * + * Thread safety: safe to call concurrently from multiple host threads. + * + * @param function Host pointer to the __global__ kernel function. + * @param dynamic_request_size Requested dynamic shared memory in bytes. + * A value of 0 is a no-op and always returns true. + * @return true if the attribute was successfully set (or was already sufficient). + * @return false if cudaFuncSetAttribute failed (e.g. size exceeds device limit); + * the sticky CUDA error is consumed so it cannot surface later. + */ template inline bool set_shmem_of_kernel(Function* function, size_t dynamic_request_size) { - static std::mutex mtx; + static std::shared_mutex mtx; static std::unordered_map shmem_sizes; if (dynamic_request_size != 0) { dynamic_request_size = raft::alignTo(dynamic_request_size, size_t(1024)); - size_t current_size = shmem_sizes[function]; - if (dynamic_request_size > current_size) { - std::lock_guard lock(mtx); - current_size = shmem_sizes[function]; - if (dynamic_request_size > current_size) { - cudaFuncSetAttribute( - function, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_request_size); + { + std::shared_lock rlock(mtx); + auto it = shmem_sizes.find(function); + if (it != shmem_sizes.end() && dynamic_request_size <= it->second) { return true; } + } + + std::unique_lock wlock(mtx); + size_t current_size = shmem_sizes.count(function) ? shmem_sizes[function] : 0; + if (dynamic_request_size > current_size) { + auto err = cudaFuncSetAttribute( + function, cudaFuncAttributeMaxDynamicSharedMemorySize, dynamic_request_size); + if (err == cudaSuccess) { shmem_sizes[function] = dynamic_request_size; - return (cudaSuccess == cudaGetLastError()); + return true; + } else { + cudaGetLastError(); // clear sticky error so later RAFT_CHECK_CUDA doesn't catch it + return false; } } } diff --git a/cpp/tests/routing/CMakeLists.txt b/cpp/tests/routing/CMakeLists.txt index 99cfdb9de5..6f08c50e0f 100644 --- a/cpp/tests/routing/CMakeLists.txt +++ b/cpp/tests/routing/CMakeLists.txt @@ -33,4 +33,5 @@ ConfigureTest(ROUTING_UNIT_TEST ${CMAKE_CURRENT_SOURCE_DIR}/unit_tests/objective_function.cu ${CMAKE_CURRENT_SOURCE_DIR}/unit_tests/top_k.cu ${CMAKE_CURRENT_SOURCE_DIR}/unit_tests/batch_tsp.cu + ${CMAKE_CURRENT_SOURCE_DIR}/unit_tests/set_shmem_of_kernel.cu ) diff --git a/cpp/tests/routing/unit_tests/set_shmem_of_kernel.cu b/cpp/tests/routing/unit_tests/set_shmem_of_kernel.cu new file mode 100644 index 0000000000..cebd3a94ba --- /dev/null +++ b/cpp/tests/routing/unit_tests/set_shmem_of_kernel.cu @@ -0,0 +1,85 @@ +/* clang-format off */ +/* + * SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/* clang-format on */ + +#include + +#include + +#include + +namespace cuopt { +namespace test { + +/// @brief Dummy kernel used to test a zero-byte shared-memory request. +__global__ void kernel_zero() {} +/// @brief Dummy kernel used to test a normal (within-limit) shared-memory request. +__global__ void kernel_normal() {} +/// @brief Dummy kernel used to test a too-large shared-memory request (first call). +__global__ void kernel_too_large_a() {} +/// @brief Dummy kernel used to test a too-large shared-memory request (repeated call). +__global__ void kernel_too_large_b() {} +/// @brief Dummy kernel used to verify that a failed request leaves no sticky CUDA error. +__global__ void kernel_sticky_error() {} + +/// @brief Zero request is a no-op and must return true. +TEST(set_shmem_of_kernel, zero_request) +{ + EXPECT_TRUE(set_shmem_of_kernel(kernel_zero, 0)); + EXPECT_EQ(cudaSuccess, cudaGetLastError()); +} + +/// @brief A modest request well within device limits must succeed. +TEST(set_shmem_of_kernel, normal_request) +{ + EXPECT_TRUE(set_shmem_of_kernel(kernel_normal, 4096)); + EXPECT_EQ(cudaSuccess, cudaGetLastError()); +} + +/// @brief Requesting more shared memory than the device supports must return false. +TEST(set_shmem_of_kernel, too_large_returns_false) +{ + int shmem_max{}; + ASSERT_EQ(cudaSuccess, + cudaDeviceGetAttribute(&shmem_max, cudaDevAttrMaxSharedMemoryPerBlockOptin, 0)) + << "cudaDeviceGetAttribute(cudaDevAttrMaxSharedMemoryPerBlockOptin) failed"; + size_t too_large = static_cast(shmem_max) + 1024; + + EXPECT_FALSE(set_shmem_of_kernel(kernel_too_large_a, too_large)); + EXPECT_EQ(cudaSuccess, cudaGetLastError()); +} + +/// @brief A second call with the same too-large size must still return false. +TEST(set_shmem_of_kernel, cache_not_poisoned_on_failure) +{ + int shmem_max{}; + ASSERT_EQ(cudaSuccess, + cudaDeviceGetAttribute(&shmem_max, cudaDevAttrMaxSharedMemoryPerBlockOptin, 0)) + << "cudaDeviceGetAttribute(cudaDevAttrMaxSharedMemoryPerBlockOptin) failed"; + size_t too_large = static_cast(shmem_max) + 1024; + + EXPECT_FALSE(set_shmem_of_kernel(kernel_too_large_b, too_large)); + EXPECT_FALSE(set_shmem_of_kernel(kernel_too_large_b, too_large)); // must not return true + EXPECT_EQ(cudaSuccess, cudaGetLastError()); +} + +/// @brief A failed call must not leave a sticky CUDA error that would be caught +/// later by an unrelated RAFT_CHECK_CUDA. +TEST(set_shmem_of_kernel, no_sticky_error_after_failure) +{ + int shmem_max{}; + ASSERT_EQ(cudaSuccess, + cudaDeviceGetAttribute(&shmem_max, cudaDevAttrMaxSharedMemoryPerBlockOptin, 0)) + << "cudaDeviceGetAttribute(cudaDevAttrMaxSharedMemoryPerBlockOptin) failed"; + size_t too_large = static_cast(shmem_max) + 1024; + + EXPECT_FALSE( + set_shmem_of_kernel(kernel_sticky_error, too_large)); // confirm failure branch taken + EXPECT_EQ(cudaSuccess, cudaGetLastError()); +} + +} // namespace test +} // namespace cuopt From 4c304db240aa05786dd28dccb3efe74814070747 Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:11:16 -0500 Subject: [PATCH 018/107] Fix duplicate libmps_parser.so in libcuopt wheel (#1092) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - The `mps_parser` install target in `cpp/libmps_parser/CMakeLists.txt` hardcoded `DESTINATION lib`, while the parent `cpp/CMakeLists.txt` installs to the platform-correct `lib64` (on x86_64) via `rapids_cmake_install_lib_dir()`. This caused `libmps_parser.so` to appear in **both** `lib/` and `lib64/` in the libcuopt wheel, wasting ~350 KB. - Replaced the hardcoded `lib` with `rapids_cmake_install_lib_dir()` so both install commands resolve to the same directory, eliminating the duplicate. ## Details In the current `libcuopt_cu13` wheel (`libcuopt_cu13-26.6.0a103`), `libmps_parser.so` (357,240 bytes) appears twice: ``` 357240 libcuopt/lib/libmps_parser.so 357240 libcuopt/lib64/libmps_parser.so ``` The root cause is two independent `install(TARGETS mps_parser ...)` commands: 1. `cpp/libmps_parser/CMakeLists.txt:139` → `DESTINATION lib` (hardcoded) 2. `cpp/CMakeLists.txt:576` → `DESTINATION ${_LIB_DEST}` → `lib64` (via `rapids_cmake_install_lib_dir`) ## Test plan - [ ] Verify the libcuopt wheel only contains `libmps_parser.so` in `lib64/`, not in `lib/` - [ ] Verify standalone `mps_parser` build still installs to the correct platform lib directory - [ ] Verify `cuopt-mps-parser` Python wheel build is unaffected (uses `EXCLUDE_FROM_ALL` + custom destinations) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Authors: - Ramakrishnap (https://github.com/rgsl888prabhu) Approvers: - Trevor McKay (https://github.com/tmckayus) - James Lamb (https://github.com/jameslamb) URL: https://github.com/NVIDIA/cuopt/pull/1092 --- cpp/libmps_parser/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cpp/libmps_parser/CMakeLists.txt b/cpp/libmps_parser/CMakeLists.txt index 427d4ac17b..ea6b50cff2 100644 --- a/cpp/libmps_parser/CMakeLists.txt +++ b/cpp/libmps_parser/CMakeLists.txt @@ -136,8 +136,9 @@ endif(BUILD_TESTS) # ################################################################################################## # * mps_parser Install ---------------------------------------------------------------------------- +rapids_cmake_install_lib_dir(mps_parser_lib_dir) install(TARGETS mps_parser - DESTINATION lib + DESTINATION ${mps_parser_lib_dir} EXPORT mps-parser-exports) install(DIRECTORY include/mps_parser/ From 1f2fb22fc7e2e7e02bc8bf181fdb51fb5f45de33 Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:46:38 -0500 Subject: [PATCH 019/107] Fix double va_start undefined behavior in error handling (#1086) ## Summary Remove duplicate `va_start()` calls in `cuopt_expects()`, `mps_parser_expects()`, and `mps_parser_expects_fatal()`. Calling `va_start()` twice on the same `va_list` without an intervening `va_end()` is undefined behavior per the C standard. ## Testing No new tests added. Existing unit tests cover these error handling paths. ## Documentation No documentation changes needed. Authors: - Ramakrishnap (https://github.com/rgsl888prabhu) Approvers: - Miles Lubin (https://github.com/mlubin) URL: https://github.com/NVIDIA/cuopt/pull/1086 --- cpp/include/cuopt/error.hpp | 2 -- cpp/libmps_parser/src/utilities/error.hpp | 6 +----- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/cpp/include/cuopt/error.hpp b/cpp/include/cuopt/error.hpp index 9dd547adbb..9a8f62a428 100644 --- a/cpp/include/cuopt/error.hpp +++ b/cpp/include/cuopt/error.hpp @@ -100,9 +100,7 @@ inline void cuopt_expects(bool cond, error_type_t error_type, const char* fmt, . if (not cond) { va_list args; va_start(args, fmt); - char msg[2048]; - va_start(args, fmt); vsnprintf(msg, sizeof(msg), fmt, args); va_end(args); diff --git a/cpp/libmps_parser/src/utilities/error.hpp b/cpp/libmps_parser/src/utilities/error.hpp index 4ce68f5098..595a29059d 100644 --- a/cpp/libmps_parser/src/utilities/error.hpp +++ b/cpp/libmps_parser/src/utilities/error.hpp @@ -1,6 +1,6 @@ /* clang-format off */ /* - * SPDX-FileCopyrightText: Copyright (c) 2023-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ /* clang-format on */ @@ -49,9 +49,7 @@ inline void mps_parser_expects(bool cond, error_type_t error_type, const char* f if (not cond) { va_list args; va_start(args, fmt); - char msg[2048]; - va_start(args, fmt); vsnprintf(msg, sizeof(msg), fmt, args); va_end(args); @@ -75,9 +73,7 @@ inline void mps_parser_expects_fatal(bool cond, error_type_t error_type, const c if (not cond) { va_list args; va_start(args, fmt); - char msg[2048]; - va_start(args, fmt); vsnprintf(msg, sizeof(msg), fmt, args); va_end(args); std::string error_string = error_to_string(error_type); From 331be33904fa92b2779546840d7bd29ea57e2b5d Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Thu, 16 Apr 2026 12:22:04 -0500 Subject: [PATCH 020/107] docs(readme): use py3.13 docker tags (py3.14 not supported) (#1112) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - README's `docker pull` commands reference `py3.14` tags, but Python 3.14 is not currently supported - Updates the two `docker pull` snippets and the accompanying `-cuda*-py3.14` note to `py3.13`, matching the worked example immediately after it (`25.10.0-cuda12.9-py3.13`) ## Test plan - [ ] Verify the updated `docker pull nvidia/cuopt:latest-cuda12.9-py3.13` and `latest-cuda13.0-py3.13` tags exist on [Docker Hub](https://hub.docker.com/r/nvidia/cuopt/tags) 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 (1M context) --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 95c8598d77..0108019ee5 100644 --- a/README.md +++ b/README.md @@ -130,13 +130,13 @@ Users can pull the cuOpt container from the NVIDIA container registry. ```bash # For CUDA 12.x -docker pull nvidia/cuopt:latest-cuda12.9-py3.14 +docker pull nvidia/cuopt:latest-cuda12.9-py3.13 # For CUDA 13.x -docker pull nvidia/cuopt:latest-cuda13.0-py3.14 +docker pull nvidia/cuopt:latest-cuda13.0-py3.13 ``` -Note: The ``latest`` tag is the latest stable release of cuOpt. If you want to use a specific version, you can use the ``-cuda12.9-py3.14`` or ``-cuda13.0-py3.14`` tag. For example, to use cuOpt 25.10.0, you can use the ``25.10.0-cuda12.9-py3.13`` or ``25.10.0-cuda13.0-py3.13`` tag. Please refer to `cuOpt dockerhub page `_ for the list of available tags. +Note: The ``latest`` tag is the latest stable release of cuOpt. If you want to use a specific version, you can use the ``-cuda12.9-py3.13`` or ``-cuda13.0-py3.13`` tag. For example, to use cuOpt 25.10.0, you can use the ``25.10.0-cuda12.9-py3.13`` or ``25.10.0-cuda13.0-py3.13`` tag. Please refer to [cuOpt dockerhub page](https://hub.docker.com/r/nvidia/cuopt/tags) for the list of available tags. More information about the cuOpt container can be found [here](https://docs.nvidia.com/cuopt/user-guide/latest/cuopt-server/quick-start.html#container-from-docker-hub). From cfa7ce4d05ef261cfbc4e2a5483abf4481347eb1 Mon Sep 17 00:00:00 2001 From: Miles Lubin Date: Thu, 16 Apr 2026 15:45:46 -0400 Subject: [PATCH 021/107] Fix typo in Constraint docstring (#1113) Authors: - Miles Lubin (https://github.com/mlubin) Approvers: - Chris Maes (https://github.com/chris-maes) - Ishika Roy (https://github.com/Iroy30) URL: https://github.com/NVIDIA/cuopt/pull/1113 --- python/cuopt/cuopt/linear_programming/problem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/cuopt/cuopt/linear_programming/problem.py b/python/cuopt/cuopt/linear_programming/problem.py index 5976ee7bb0..62164f365f 100644 --- a/python/cuopt/cuopt/linear_programming/problem.py +++ b/python/cuopt/cuopt/linear_programming/problem.py @@ -1192,7 +1192,7 @@ class Constraint: ConstraintName : str Name of the constraint. Sense : LE, GE or EQ - Row sense. LE for >=, GE for <= or EQ for == . + Row sense. LE for <=, GE for >= or EQ for == . RHS : float Constraint right-hand side value. Slack : float From 46b809ae50a7cb7f22eeef1b4f24dbe4ede57346 Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Thu, 16 Apr 2026 14:53:09 -0500 Subject: [PATCH 022/107] fix(security): remove insecure SSL verification bypass in dataset downloaders (#1108) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Remove `ssl.CERT_NONE` and `check_hostname = False` bypass for `plato.asu.edu` URLs in dataset download scripts - The site has a valid SSL certificate — the bypass was unnecessary and flagged by SonarQube as 2 Medium-severity vulnerabilities - Clean up unused `import ssl` Fixes SonarQube rules `python:S4830` and `python:S5527` (the only 2 open security vulnerabilities in the report). ## Test plan - [ ] Run `regression/get_datasets.py` and verify plato.asu.edu downloads succeed without SSL bypass - [ ] Run `benchmarks/linear_programming/utils/get_datasets.py` and verify same --- benchmarks/linear_programming/utils/get_datasets.py | 10 +--------- regression/get_datasets.py | 10 +--------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/benchmarks/linear_programming/utils/get_datasets.py b/benchmarks/linear_programming/utils/get_datasets.py index 29d23e57de..2966b2f14b 100644 --- a/benchmarks/linear_programming/utils/get_datasets.py +++ b/benchmarks/linear_programming/utils/get_datasets.py @@ -5,7 +5,6 @@ import argparse import urllib.request import urllib.parse -import ssl import subprocess @@ -632,14 +631,7 @@ def download(url, dst): if os.path.exists(dst): return print(f"Downloading {url} into {dst}...") - # Bypass SSL verification for plato.asu.edu URLs - if "plato.asu.edu" in url: - context = ssl.create_default_context() - context.check_hostname = False - context.verify_mode = ssl.CERT_NONE - response = urllib.request.urlopen(url, context=context) - else: - response = urllib.request.urlopen(url) + response = urllib.request.urlopen(url) data = response.read() with open(dst, "wb") as fp: fp.write(data) diff --git a/regression/get_datasets.py b/regression/get_datasets.py index bb2a9f23d3..d267551885 100644 --- a/regression/get_datasets.py +++ b/regression/get_datasets.py @@ -5,7 +5,6 @@ import sys import urllib.request import urllib.parse -import ssl import subprocess @@ -824,14 +823,7 @@ def download(url, dst): if os.path.exists(dst): return print(f"Downloading {url} into {dst}...") - # Bypass SSL verification for plato.asu.edu URLs - if "plato.asu.edu" in url: - context = ssl.create_default_context() - context.check_hostname = False - context.verify_mode = ssl.CERT_NONE - response = urllib.request.urlopen(url, context=context) - else: - response = urllib.request.urlopen(url) + response = urllib.request.urlopen(url) data = response.read() with open(dst, "wb") as fp: fp.write(data) From 3f0d27ff44acbff886ecb1c1fa9febc4033c93b4 Mon Sep 17 00:00:00 2001 From: Sri Kainkaryam Date: Thu, 16 Apr 2026 17:04:21 -0500 Subject: [PATCH 023/107] Latency reductions for concurrent mode (#1083) These changes reduce concurrent-halt latency in the LP solve path by checking the halt flag at more points before long synchronous work and by moving expensive cleanup off the return path when we exit with `CONCURRENT_LIMIT`. - Added earlier concurrent-halt checks in barrier and dual simplex around expensive non-interruptible steps, including barrier matrix/factorization setup, phase 2 initialization, and basis refactorization/transposes. - Changed `basis_update_mpf_t `and `barrier_solver_t` from stack-owned temporaries to `std::unique_ptr` in the affected solve paths so their destruction can be deferred on `CONCURRENT_LIMIT`. - On `CONCURRENT_LIMIT`, detached cleanup threads now take ownership of large temporary solver state so the main solve path can return sooner instead of blocking on teardown. - Preserved solver progress metadata on early exit where applicable. The intended behavior is unchanged aside from returning more quickly when a concurrent halt is requested, particularly in paths that previously spent significant time in setup or destruction before exiting. (Description co-authored with Codex) ## Results case | Presolve without | Presolve with | Delta presolve | Solve without | Solve with | Delta solve | Overhead without | Overhead with | Delta overhead | Improvement % | Total without | Total with | Delta total -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- Dual2_5000 | 10.11 | 10.27 | 0.16 | 24.57 | 24.52 | -0.05 | 9.81 | 4.61 | -5.2 | -53% | 34.37 | 29.12 | -5.25 L2CTA3D | 4.45 | 4.02 | -0.43 | 6.19 | 5.08 | -1.11 | 4.68 | 2.9 | -1.79 | -38% | 10.87 | 7.98 | -2.9 a2864 | 1.97 | 1.33 | -0.64 | 2.09 | 1.45 | -0.64 | 0.21 | 0.12 | -0.09 | -43% | 2.3 | 1.57 | -0.73 square41 | 0.9 | 0.67 | -0.23 | 6.22 | 5.64 | -0.58 | 0 | 0 | 0 | 0% | 6.22 | 5.64 | -0.58 scpm1 | 0.35 | 0.35 | 0 | 1.65 | 1.41 | -0.24 | 0.55 | 0.61 | 0.06 | 11% | 2.2 | 2.02 | -0.18 woodlands09 | 0.31 | 0.31 | 0 | 0.44 | 0.45 | 0.01 | 0.51 | 0.44 | -0.08 | -16% | 0.95 | 0.88 | -0.07 graph40-40 | 0.15 | 0.15 | 0 | 0.22 | 0.21 | 0 | 0.54 | 0.48 | -0.06 | -11% | 0.76 | 0.69 | -0.07 savsched1 | 0.21 | 0.22 | 0.01 | 0.4 | 0.4 | 0 | 0.72 | 0.66 | -0.05 | -7% | 1.12 | 1.07 | -0.05 datt256_lp | 0.14 | 0.15 | 0.01 | 0.3 | 0.31 | 0.01 | 0.22 | 0.16 | -0.06 | -27% | 0.52 | 0.47 | -0.04 neos-3025225 | 0.52 | 0.53 | 0.01 | 2.31 | 2.35 | 0.04 | 0.03 | 0.03 | 0 | 0% | 2.35 | 2.39 | 0.04 ex10 | 0.11 | 0.11 | 0 | 0.26 | 0.24 | -0.02 | 0.16 | 0.19 | 0.03 | 19% | 0.42 | 0.43 | 0.02 neos-5251015 | 0.18 | 0.17 | -0.01 | 0.52 | 0.51 | -0.01 | 0.67 | 0.73 | 0.07 | 10% | 1.18 | 1.24 | 0.06 set-cover-model | 1.23 | 1.3 | 0.07 | 7.38 | 7.57 | 0.19 | 0.19 | 0.77 | 0.57 | 300% | 7.57 | 8.33 | 0.77 dlr1 | 2.32 | 2.37 | 0.05 | 12.02 | 12.67 | 0.65 | 0.05 | 0.06 | 0.01 | 20% | 12.07 | 12.72 | 0.66 thk_48 | 3.39 | 3.77 | 0.38 | 15.96 | 17.22 | 1.26 | 0.72 | 0.61 | -0.11 | -15% | 16.68 | 17.82 | 1.15 thk_63 | 3.64 | 4.68 | 1.04 | 12.12 | 13.55 | 1.42 | 0.7 | 0.73 | 0.04 | 6% | 12.82 | 14.28 | 1.46 @rg20 wanted me to note this here: With regards to moving the destructor to a separate thread, we think there is an underlying issue that we probably want to understand first and fix any bug. The changes for moving the destructor to a detached thread has been removed. (Please see comments below) cc @chris-maes ## Issue Authors: - Sri Kainkaryam (https://github.com/srib) Approvers: - Chris Maes (https://github.com/chris-maes) - Rajesh Gandham (https://github.com/rg20) URL: https://github.com/NVIDIA/cuopt/pull/1083 --- cpp/src/barrier/barrier.cu | 15 +++++++++++ cpp/src/dual_simplex/basis_updates.cpp | 17 +++++++++++- cpp/src/dual_simplex/phase2.cpp | 25 ++++++++++++++++- cpp/src/dual_simplex/solve.cpp | 37 +++++++++++++++++--------- 4 files changed, 80 insertions(+), 14 deletions(-) diff --git a/cpp/src/barrier/barrier.cu b/cpp/src/barrier/barrier.cu index 902e691e64..778038db1f 100644 --- a/cpp/src/barrier/barrier.cu +++ b/cpp/src/barrier/barrier.cu @@ -1094,6 +1094,7 @@ class iteration_data_t { std::sort(column_nz_permutation.begin(), column_nz_permutation.end(), [&column_nz](i_t i, i_t j) { return column_nz[i] < column_nz[j]; }); + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { return; } // We then compute the exact sparsity pattern for columns of A whose where // the number of nonzeros is less than a threshold. This part can be done @@ -1124,6 +1125,7 @@ class iteration_data_t { // The best way to do that is to have A stored in CSR format. csr_matrix_t A_row(0, 0, 0); A.to_compressed_row(A_row); + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { return; } std::vector histogram(m + 1, 0); for (i_t j = 0; j < n; j++) { @@ -1253,6 +1255,7 @@ class iteration_data_t { std::sort(permutation.begin(), permutation.end(), [&delta_nz](i_t i, i_t j) { return delta_nz[i] < delta_nz[j]; }); + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { return; } // Now we make a forward pass and compute the number of nonzeros in C // assuming we had included column j @@ -2297,6 +2300,12 @@ i_t barrier_solver_t::gpu_compute_search_direction(iteration_data_tfactorize(data.device_augmented); #ifdef CHOLESKY_DEBUG_CHECK @@ -2305,6 +2314,12 @@ i_t barrier_solver_t::gpu_compute_search_direction(iteration_data_tfactorize(data.device_ADAT); } diff --git a/cpp/src/dual_simplex/basis_updates.cpp b/cpp/src/dual_simplex/basis_updates.cpp index 9c56ada50e..fdf8acf07d 100644 --- a/cpp/src/dual_simplex/basis_updates.cpp +++ b/cpp/src/dual_simplex/basis_updates.cpp @@ -2431,7 +2431,22 @@ int basis_update_mpf_t::refactor_basis( assert(q.size() == A.m); reorder_basic_list(q, basic_list); // We no longer need q after reordering the basic list work_estimate_ += 3 * q.size(); - reset(); + + // Check halt before the transpose operations: these can take hundreds of ms + // on large problems (L0 and U0 each have O(fill-in) nonzeros) and have no + // internal halt checks. Catching the flag here avoids the dead zone. + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { + return CONCURRENT_HALT_RETURN; + } + // Inline reset() so we can check halt between the two transposes. + clear(); + L0_.transpose(L0_transpose_); + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { + return CONCURRENT_HALT_RETURN; + } + U0_.transpose(U0_transpose_); + work_estimate_ += 6 * L0_.col_start[L0_.n] + 6 * U0_.col_start[U0_.n]; + reset_stats(); return 0; } diff --git a/cpp/src/dual_simplex/phase2.cpp b/cpp/src/dual_simplex/phase2.cpp index 5b1130796e..75e5ecae3c 100644 --- a/cpp/src/dual_simplex/phase2.cpp +++ b/cpp/src/dual_simplex/phase2.cpp @@ -2488,7 +2488,6 @@ dual::status_t dual_phase2(i_t phase, const i_t n = lp.num_cols; std::vector basic_list(m); std::vector nonbasic_list; - std::vector superbasic_list; basis_update_mpf_t ft(m, settings.refactor_frequency); const bool initialize_basis = true; return dual_phase2_with_advanced_basis(phase, @@ -2688,6 +2687,10 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase, vector_norm2(delta_y_steepest_edge)); } + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { + return dual::status_t::CONCURRENT_LIMIT; + } + if (phase == 2) { settings.log.printf(" Iter Objective Num Inf. Sum Inf. Perturb Time\n"); } @@ -2735,10 +2738,18 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase, phase2::check_basic_infeasibilities(basic_list, basic_mark, infeasibility_indices, 0); #endif + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { + return dual::status_t::CONCURRENT_LIMIT; + } + csc_matrix_t A_transpose(1, 1, 0); lp.A.transpose(A_transpose); phase2_work_estimate += 2 * lp.A.col_start[lp.A.n]; + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { + return dual::status_t::CONCURRENT_LIMIT; + } + f_t obj = compute_objective(lp, x); phase2_work_estimate += 2 * n; @@ -2908,6 +2919,9 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase, phase2::compute_delta_y(ft, basic_leaving_index, direction, delta_y_sparse, UTsol_sparse); } timers.btran_time += timers.stop_timer(); + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { + return dual::status_t::CONCURRENT_LIMIT; + } const f_t steepest_edge_norm_check = delta_y_sparse.norm2_squared(); phase2_work_estimate += 2 * delta_y_sparse.i.size(); @@ -2966,6 +2980,9 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase, } } timers.delta_z_time += timers.stop_timer(); + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { + return dual::status_t::CONCURRENT_LIMIT; + } #ifdef COMPUTE_DUAL_RESIDUAL std::vector dual_residual; @@ -3301,6 +3318,9 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase, } timers.ftran_time += timers.stop_timer(); + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { + return dual::status_t::CONCURRENT_LIMIT; + } #ifdef CHECK_PRIMAL_STEP std::vector residual(m); @@ -3331,6 +3351,9 @@ dual::status_t dual_phase2_with_advanced_basis(i_t phase, #endif assert(steepest_edge_status == 0); timers.se_norms_time += timers.stop_timer(); + if (settings.concurrent_halt != nullptr && *settings.concurrent_halt == 1) { + return dual::status_t::CONCURRENT_LIMIT; + } timers.start_timer(); // x <- x + delta_x diff --git a/cpp/src/dual_simplex/solve.cpp b/cpp/src/dual_simplex/solve.cpp index b7c619f246..82d922eec3 100644 --- a/cpp/src/dual_simplex/solve.cpp +++ b/cpp/src/dual_simplex/solve.cpp @@ -120,16 +120,17 @@ lp_status_t solve_linear_program_advanced(const lp_problem_t& original std::vector basic_list(m); std::vector nonbasic_list; basis_update_mpf_t ft(m, settings.refactor_frequency); - return solve_linear_program_with_advanced_basis(original_lp, - start_time, - settings, - original_solution, - ft, - basic_list, - nonbasic_list, - vstatus, - edge_norms, - work_unit_context); + lp_status_t result = solve_linear_program_with_advanced_basis(original_lp, + start_time, + settings, + original_solution, + ft, + basic_list, + nonbasic_list, + vstatus, + edge_norms, + work_unit_context); + return result; } template @@ -222,7 +223,10 @@ lp_status_t solve_linear_program_with_advanced_basis( if (phase1_status == dual::status_t::TIME_LIMIT) { return lp_status_t::TIME_LIMIT; } if (phase1_status == dual::status_t::WORK_LIMIT) { return lp_status_t::WORK_LIMIT; } if (phase1_status == dual::status_t::ITERATION_LIMIT) { return lp_status_t::ITERATION_LIMIT; } - if (phase1_status == dual::status_t::CONCURRENT_LIMIT) { return lp_status_t::CONCURRENT_LIMIT; } + if (phase1_status == dual::status_t::CONCURRENT_LIMIT) { + original_solution.iterations = iter; + return lp_status_t::CONCURRENT_LIMIT; + } phase1_obj = phase1_solution.objective; if (phase1_obj > -settings.primal_tol) { settings.log.printf("Dual feasible solution found.\n"); @@ -309,7 +313,10 @@ lp_status_t solve_linear_program_with_advanced_basis( if (status == dual::status_t::TIME_LIMIT) { lp_status = lp_status_t::TIME_LIMIT; } if (status == dual::status_t::WORK_LIMIT) { lp_status = lp_status_t::WORK_LIMIT; } if (status == dual::status_t::ITERATION_LIMIT) { lp_status = lp_status_t::ITERATION_LIMIT; } - if (status == dual::status_t::CONCURRENT_LIMIT) { lp_status = lp_status_t::CONCURRENT_LIMIT; } + if (status == dual::status_t::CONCURRENT_LIMIT) { + original_solution.iterations = iter; + return lp_status_t::CONCURRENT_LIMIT; + } if (status == dual::status_t::NUMERICAL) { lp_status = lp_status_t::NUMERICAL_ISSUES; } if (status == dual::status_t::CUTOFF) { lp_status = lp_status_t::CUTOFF; } original_solution.iterations = iter; @@ -581,6 +588,8 @@ lp_status_t solve_linear_program_with_barrier(const user_problem_t& us solution.iterations = barrier_solution.iterations; } + if (barrier_status == lp_status_t::CONCURRENT_LIMIT) { return lp_status_t::CONCURRENT_LIMIT; } + // If we aren't doing crossover, we're done if (!settings.crossover || barrier_lp.Q.n > 0) { return barrier_status; } @@ -681,6 +690,10 @@ lp_status_t solve_linear_program(const user_problem_t& user_problem, std::vector edge_norms; lp_status_t status = solve_linear_program_advanced( original_lp, start_time, settings, lp_solution, vstatus, edge_norms); + if (status == lp_status_t::CONCURRENT_LIMIT) { + solution.iterations = lp_solution.iterations; + return lp_status_t::CONCURRENT_LIMIT; + } uncrush_primal_solution(user_problem, original_lp, lp_solution.x, solution.x); uncrush_dual_solution( user_problem, original_lp, lp_solution.y, lp_solution.z, solution.y, solution.z); From c034027b208d561f61298467fc03bc4c75b68020 Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Fri, 17 Apr 2026 10:08:48 -0500 Subject: [PATCH 024/107] Add CTest labels for selective C++ test execution (#1102) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Add two CTest labels — `routing` and `numopt` — to all C++ test executables - Extend `ConfigureTest()` CMake macro with optional `LABELS` keyword (backward compatible) | Label | Scope | |-------|-------| | `routing` | VRP, TSP, distance engine (9 tests) | | `numopt` | LP, MIP, QP, dual simplex, MPS parser, gRPC, CLI (22 tests) | ### Usage ```bash ctest -L routing # only routing tests ctest -L numopt # only numerical optimization tests ctest # all (unchanged default) ``` ## Test plan - [ ] `cmake --build` succeeds - [ ] `ctest -L routing` runs only routing tests - [ ] `ctest -L numopt` runs only numopt tests - [ ] Full CI passes unchanged Authors: - Ramakrishnap (https://github.com/rgsl888prabhu) Approvers: - Miles Lubin (https://github.com/mlubin) - James Lamb (https://github.com/jameslamb) URL: https://github.com/NVIDIA/cuopt/pull/1102 --- cpp/libmps_parser/tests/CMakeLists.txt | 1 + cpp/tests/CMakeLists.txt | 12 ++++++-- cpp/tests/distance_engine/CMakeLists.txt | 4 +-- cpp/tests/dual_simplex/CMakeLists.txt | 4 +-- cpp/tests/linear_programming/CMakeLists.txt | 6 ++-- .../linear_programming/grpc/CMakeLists.txt | 3 ++ cpp/tests/mip/CMakeLists.txt | 28 +++++++++---------- cpp/tests/qp/CMakeLists.txt | 2 +- cpp/tests/routing/CMakeLists.txt | 23 +++++++++------ cpp/tests/utilities/CMakeLists.txt | 5 ++-- 10 files changed, 55 insertions(+), 33 deletions(-) diff --git a/cpp/libmps_parser/tests/CMakeLists.txt b/cpp/libmps_parser/tests/CMakeLists.txt index 2d86a1da18..7de1739fac 100644 --- a/cpp/libmps_parser/tests/CMakeLists.txt +++ b/cpp/libmps_parser/tests/CMakeLists.txt @@ -53,4 +53,5 @@ endfunction() ConfigureTest(MPS_PARSER_TEST mps_parser_test.cpp ) + set_tests_properties(MPS_PARSER_TEST PROPERTIES LABELS "numopt") ################################################################################################### diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt index a73a3361ce..4e225270b1 100644 --- a/cpp/tests/CMakeLists.txt +++ b/cpp/tests/CMakeLists.txt @@ -1,4 +1,4 @@ -# cmake-format: off +# cmake-format: off # SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # cmake-format: on @@ -34,8 +34,12 @@ endif() set(CUOPT_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) # ################################################################ ------------------------------------------------------------------ +# ConfigureTest(NAME source1.cu source2.cu [LABELS label1 label2 ...]) +# +# LABELS sets CTest labels for selective local test execution via `ctest -L