From dd0b69ee57e25be42782a6da6a77ea173843b4bf Mon Sep 17 00:00:00 2001 From: Ramakrishna Prabhu Date: Wed, 28 Jan 2026 14:07:13 -0600 Subject: [PATCH 01/27] update --- RELEASE-NOTES.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 3112b56ec..d72e0a758 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,6 +1,26 @@ # Release Notes +## Release Notes 26.02 +### New Features (26.02) + +- + +### Breaking Changes (26.02) + +- + +### Improvements (26.02) + +- + +### Bug Fixes (26.02) + +- + +### Documentation (26.02) + +- ## Release Notes 25.12 From aad24250b189c31d2cb68f12a0c20cef5102a026 Mon Sep 17 00:00:00 2001 From: Ramakrishna Prabhu Date: Wed, 28 Jan 2026 16:24:30 -0600 Subject: [PATCH 02/27] Add details about agentic skill --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index f497d6b67..82844a123 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ + # cuOpt - GPU accelerated Optimization Engine [![Build Status](https://github.com/NVIDIA/cuopt/actions/workflows/build.yaml/badge.svg)](https://github.com/NVIDIA/cuopt/actions/workflows/build.yaml) @@ -153,6 +154,10 @@ cuOpt follows the RAPIDS release schedule and is part of the **"others"** catego For current release timelines and dates, refer to the [RAPIDS Maintainers Docs](https://docs.rapids.ai/maintainers/). +## For AI Coding Agents + +See [AGENTS.md](./AGENTS.md) for agent-specific guidelines. + ## Contributing Guide Review the [CONTRIBUTING.md](CONTRIBUTING.md) file for information on how to contribute code and issues to the project. From 3b575f17ffd3fb6e3ce5f19c8fe4959fe228acef Mon Sep 17 00:00:00 2001 From: Nicolas Blin <31096601+Kh4ster@users.noreply.github.com> Date: Thu, 5 Feb 2026 09:30:24 +0100 Subject: [PATCH 03/27] Update RELEASE-NOTES.md Added batch PDLP and related improvements to the release notes --- RELEASE-NOTES.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index d72e0a758..4b5ebb5b3 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -4,7 +4,8 @@ ### New Features (26.02) -- +- Add option to use batch PDLP instead of parallel Dual Simplex when running Strong Branching at the root [#805](https://github.com/NVIDIA/cuopt/pull/805) (off by default). Based on [Batched First-Order Methods for Parallel LP Solving in MIP](https://arxiv.org/abs/2601.21990) ([Nicolas Blin](https://github.com/Kh4ster), [Stefano Gualandi](https://github.com/stegua), [Christopher Maes](https://github.com/chris-maes), [Andrea Lodi](https://github.com/andrealodi), [Bartolomeo Stellato](https://github.com/bstellato)) +- New infeasiblity detection for PDLP's default solver mode Stable3 (off by default) [#805](https://github.com/NVIDIA/cuopt/pull/805) ### Breaking Changes (26.02) @@ -12,7 +13,7 @@ ### Improvements (26.02) -- +- Improved primal/dual warm start for PDLP's default solver mode Stable3 [#805](https://github.com/NVIDIA/cuopt/pull/805) ### Bug Fixes (26.02) From 193887480b1c5f357cd827e53704ba845273a6f9 Mon Sep 17 00:00:00 2001 From: Ramakrishna Prabhu Date: Thu, 5 Feb 2026 14:47:14 -0600 Subject: [PATCH 04/27] update release notes --- RELEASE-NOTES.md | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 4b5ebb5b3..5cebed49c 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -4,8 +4,15 @@ ### New Features (26.02) -- Add option to use batch PDLP instead of parallel Dual Simplex when running Strong Branching at the root [#805](https://github.com/NVIDIA/cuopt/pull/805) (off by default). Based on [Batched First-Order Methods for Parallel LP Solving in MIP](https://arxiv.org/abs/2601.21990) ([Nicolas Blin](https://github.com/Kh4ster), [Stefano Gualandi](https://github.com/stegua), [Christopher Maes](https://github.com/chris-maes), [Andrea Lodi](https://github.com/andrealodi), [Bartolomeo Stellato](https://github.com/bstellato)) -- New infeasiblity detection for PDLP's default solver mode Stable3 (off by default) [#805](https://github.com/NVIDIA/cuopt/pull/805) +- Parallel reliability branching inside MIP solver +- Cuts are now added at the root node: Gomory, Knapsack, MIR, CG +- Add option to use batch PDLP instead of parallel Dual Simplex when running Strong Branching at the root (off by default). Based on [Batched First-Order Methods for Parallel LP Solving in MIP](https://arxiv.org/abs/2601.21990) ([Nicolas Blin](https://github.com/Kh4ster), [Stefano Gualandi](https://github.com/stegua), [Christopher Maes](https://github.com/chris-maes), [Andrea Lodi](https://github.com/andrealodi), [Bartolomeo Stellato](https://github.com/bstellato)) +- BatchPDLP solver option for initializing pseudocosts via strong-branching +- New infeasibility detection for PDLP's default solver mode Stable3 (off by default) +- Solutions callbacks added to C API +- Multiple new diving techniques added for finding integer feasible solutions +- PSLP presolve option for LP +- Add batch solve for routing to boost throughput for many similar instances ### Breaking Changes (26.02) @@ -13,15 +20,32 @@ ### Improvements (26.02) -- Improved primal/dual warm start for PDLP's default solver mode Stable3 [#805](https://github.com/NVIDIA/cuopt/pull/805) +- Improved primal/dual warm start for PDLP's default solver mode Stable3 +- Quadratic objectives can now be constructed via a matrix in Python API +- QP barrier now updates and solves augmented system on the GPU +- Probing implications and better variable ordering to strengthen presolve and branching +- Replace deprecated cuDF Column/Buffer APIs with pylibcudf and public cuDF interfaces +- Modernize dependency pinnings; make CUDA runtime linkage static for portability +- Build/tooling: add `--split-compile`, `--jobserver`, Clang host build, ThreadSanitizer, improved container scripts, and branch/commit metadata in images +- Use explicit `cudaStream_t` with `cub::DeviceTransform` and non-blocking streams for GPU control +- Enable barrier LP tests, add regression testing, and add SonarQube static analysis ### Bug Fixes (26.02) -- +- Fix out-of-bounds in dense-column detection in barrier +- Correct infeasible-list handling to avoid incorrect infeasibility reports +- Fix race conditions found via Clang host build + ThreadSanitizer +- Resolve CUDA–Numba version mismatches with cuDF +- Fix device code to include required trailing return types +- Fix crossover dualization issues in LP crossover +- Repair container build and test failures +- Miscellaneous additional fixes and stability improvements ### Documentation (26.02) -- +- Update README and top-level docs for current build and usage +- Document new repository branching strategies and release-cycle details in README and CONTRIBUTING +- Add best practices for batch solving ## Release Notes 25.12 From ecc1e4feb42d8cd51e5f828c96644416596514b5 Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Thu, 5 Feb 2026 12:52:49 -0800 Subject: [PATCH 05/27] Update RELEASE-NOTES.md --- RELEASE-NOTES.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 5cebed49c..b942fc10d 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -5,10 +5,9 @@ ### New Features (26.02) - Parallel reliability branching inside MIP solver -- Cuts are now added at the root node: Gomory, Knapsack, MIR, CG -- Add option to use batch PDLP instead of parallel Dual Simplex when running Strong Branching at the root (off by default). Based on [Batched First-Order Methods for Parallel LP Solving in MIP](https://arxiv.org/abs/2601.21990) ([Nicolas Blin](https://github.com/Kh4ster), [Stefano Gualandi](https://github.com/stegua), [Christopher Maes](https://github.com/chris-maes), [Andrea Lodi](https://github.com/andrealodi), [Bartolomeo Stellato](https://github.com/bstellato)) -- BatchPDLP solver option for initializing pseudocosts via strong-branching -- New infeasibility detection for PDLP's default solver mode Stable3 (off by default) +- Mixed Integer Gomory, Knapsack, Mixed Integer Round, and Strong Chvatal Gomory cuts are now added at root node +- Added an option to use batch PDLP when running strong branching at the root. Based on [Batched First-Order Methods for Parallel LP Solving in MIP](https://arxiv.org/abs/2601.21990) ([Nicolas Blin](https://github.com/Kh4ster), [Stefano Gualandi](https://github.com/stegua), [Christopher Maes](https://github.com/chris-maes), [Andrea Lodi](https://github.com/andrealodi), [Bartolomeo Stellato](https://github.com/bstellato)) +- New infeasibility detection option for PDLP's default solver mode Stable3 - Solutions callbacks added to C API - Multiple new diving techniques added for finding integer feasible solutions - PSLP presolve option for LP @@ -33,7 +32,7 @@ ### Bug Fixes (26.02) - Fix out-of-bounds in dense-column detection in barrier -- Correct infeasible-list handling to avoid incorrect infeasibility reports +- Correct infeasible-list handling to avoid incorrect infeasibility reports in dual simplex - Fix race conditions found via Clang host build + ThreadSanitizer - Resolve CUDA–Numba version mismatches with cuDF - Fix device code to include required trailing return types From c28927a975e6068db825e6f8fe5cbc4e6eef97a7 Mon Sep 17 00:00:00 2001 From: Ramakrishnap <42624703+rgsl888prabhu@users.noreply.github.com> Date: Fri, 6 Feb 2026 09:46:50 -0600 Subject: [PATCH 06/27] Update RELEASE-NOTES.md --- RELEASE-NOTES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index b942fc10d..8065412d0 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -8,14 +8,14 @@ - Mixed Integer Gomory, Knapsack, Mixed Integer Round, and Strong Chvatal Gomory cuts are now added at root node - Added an option to use batch PDLP when running strong branching at the root. Based on [Batched First-Order Methods for Parallel LP Solving in MIP](https://arxiv.org/abs/2601.21990) ([Nicolas Blin](https://github.com/Kh4ster), [Stefano Gualandi](https://github.com/stegua), [Christopher Maes](https://github.com/chris-maes), [Andrea Lodi](https://github.com/andrealodi), [Bartolomeo Stellato](https://github.com/bstellato)) - New infeasibility detection option for PDLP's default solver mode Stable3 -- Solutions callbacks added to C API +- Solutions callbacks added to C API, additionally cuopt supports dual_bound and user_data. - Multiple new diving techniques added for finding integer feasible solutions - PSLP presolve option for LP - Add batch solve for routing to boost throughput for many similar instances ### Breaking Changes (26.02) -- +- Solutions callbacks added to C API, additionally cuopt supports dual_bound and user_data. ### Improvements (26.02) From c46403f2bbc45527bc399f536bccf1bc5fc95f4f Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Fri, 6 Feb 2026 08:11:59 -0800 Subject: [PATCH 07/27] Update README.md --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 82844a123..4595205cb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# cuOpt - GPU accelerated Optimization Engine +# cuOpt - GPU-accelerated Optimization Engine [![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.02.00-blue)](https://github.com/NVIDIA/cuopt/releases) @@ -12,13 +12,16 @@ -NVIDIA® cuOpt™ is a GPU-accelerated optimization engine that excels in mixed integer linear programming (MILP), linear programming (LP), quadratic programming (QP) and vehicle routing problems (VRP). It enables near real-time solutions for large-scale challenges with millions of variables and constraints, offering -easy integration into existing solvers and seamless deployment across hybrid and multi-cloud environments. +NVIDIA® cuOpt™ is a GPU-accelerated optimization engine that excels in mixed integer linear programming (MILP), linear programming (LP), quadratic programming (QP) and vehicle routing problems (VRP). It enables near real-time solutions for large-scale LPs with millions of variables and constraints, and MIPs with hundreds of thousands of variables. cuOpt offers easy integration into existing modeling languages and seamless deployment across hybrid and multi-cloud environments. The core engine is written in C++ and wrapped with a C API, Python API and Server API. For the latest stable version ensure you are on the `main` branch. +## Latest Documentation + +[cuOpt Documentation](https://docs.nvidia.com/cuopt/user-guide/latest/introduction.html)) + ## Supported APIs cuOpt supports the following APIs: From 69b68ad0cdc5f86e80c7f28163fe1257f75399cb Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Fri, 6 Feb 2026 08:12:32 -0800 Subject: [PATCH 08/27] Update RELEASE-NOTES.md Co-authored-by: Rajesh Gandham --- RELEASE-NOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 8065412d0..5efd1748f 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -10,7 +10,7 @@ - New infeasibility detection option for PDLP's default solver mode Stable3 - Solutions callbacks added to C API, additionally cuopt supports dual_bound and user_data. - Multiple new diving techniques added for finding integer feasible solutions -- PSLP presolve option for LP +- The PSLP presolver (https://github.com/dance858/PSLP) is enabled by default for LP problems. To disable set presolve value to 0. - Add batch solve for routing to boost throughput for many similar instances ### Breaking Changes (26.02) From 4d72e6aa00bc79a137cb51da1316536275cada0e Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Fri, 6 Feb 2026 08:19:50 -0800 Subject: [PATCH 09/27] Update RELEASE-NOTES.md --- RELEASE-NOTES.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 5efd1748f..0ad31179d 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -4,18 +4,18 @@ ### New Features (26.02) -- Parallel reliability branching inside MIP solver -- Mixed Integer Gomory, Knapsack, Mixed Integer Round, and Strong Chvatal Gomory cuts are now added at root node +- New parallel reliability branching inside MIP solver +- Mixed Integer Gomory, Mixed Integer Rounding, Knapsack and Strong Chvatal Gomory cuts are now added at root node - Added an option to use batch PDLP when running strong branching at the root. Based on [Batched First-Order Methods for Parallel LP Solving in MIP](https://arxiv.org/abs/2601.21990) ([Nicolas Blin](https://github.com/Kh4ster), [Stefano Gualandi](https://github.com/stegua), [Christopher Maes](https://github.com/chris-maes), [Andrea Lodi](https://github.com/andrealodi), [Bartolomeo Stellato](https://github.com/bstellato)) - New infeasibility detection option for PDLP's default solver mode Stable3 -- Solutions callbacks added to C API, additionally cuopt supports dual_bound and user_data. +- Solutions callbacks added to C API. Users can now retrieve the dual bound and pass in user data. - Multiple new diving techniques added for finding integer feasible solutions -- The PSLP presolver (https://github.com/dance858/PSLP) is enabled by default for LP problems. To disable set presolve value to 0. -- Add batch solve for routing to boost throughput for many similar instances +- The [PSLP presolver](https://github.com/dance858/PSLP) is enabled by default for LP problems. Use the presolve option to select Papilo or disable. +- Added a batch solve for routing to boost throughput for many similar instances ### Breaking Changes (26.02) -- Solutions callbacks added to C API, additionally cuopt supports dual_bound and user_data. +- The signature of the solution callbacks have changed for the Python API ### Improvements (26.02) @@ -36,7 +36,7 @@ - Fix race conditions found via Clang host build + ThreadSanitizer - Resolve CUDA–Numba version mismatches with cuDF - Fix device code to include required trailing return types -- Fix crossover dualization issues in LP crossover +- Fix issue in crossover after dualization in barrier - Repair container build and test failures - Miscellaneous additional fixes and stability improvements From e22836b99ba6256acf061f9c6227df4cc3e30598 Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Fri, 6 Feb 2026 08:20:39 -0800 Subject: [PATCH 10/27] Update RELEASE-NOTES.md --- RELEASE-NOTES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 0ad31179d..ca9d080b7 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -22,6 +22,7 @@ - Improved primal/dual warm start for PDLP's default solver mode Stable3 - Quadratic objectives can now be constructed via a matrix in Python API - QP barrier now updates and solves augmented system on the GPU +- Improved performance for LP folding - Probing implications and better variable ordering to strengthen presolve and branching - Replace deprecated cuDF Column/Buffer APIs with pylibcudf and public cuDF interfaces - Modernize dependency pinnings; make CUDA runtime linkage static for portability From a8484a4095125707c8db211bf3919a9d60e95e66 Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Fri, 6 Feb 2026 08:24:38 -0800 Subject: [PATCH 11/27] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4595205cb..e0cc784cd 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# cuOpt - GPU-accelerated Optimization Engine +# 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.02.00-blue)](https://github.com/NVIDIA/cuopt/releases) From 474dad5c194c772c84ffe2fd2c07168aebe98b38 Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Fri, 6 Feb 2026 08:25:14 -0800 Subject: [PATCH 12/27] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e0cc784cd..12ebfcece 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ NVIDIA® cuOpt™ is a GPU-accelerated optimization engine that excels in mixed The core engine is written in C++ and wrapped with a C API, Python API and Server API. -For the latest stable version ensure you are on the `main` branch. +For the latest version ensure you are on the `main` branch. ## Latest Documentation From 2d446707950e3bb2c8f56d80c4e80d4de95e953f Mon Sep 17 00:00:00 2001 From: Rajesh Gandham Date: Mon, 9 Feb 2026 10:14:09 -0800 Subject: [PATCH 13/27] Updated the docs for warm start breaking change, QP general availability --- RELEASE-NOTES.md | 4 +++- docs/cuopt/source/cuopt-c/lp-qp-milp/lp-qp-example.rst | 3 --- .../cuopt-python/lp-qp-milp/examples/qp_matrix_example.py | 3 --- .../cuopt-python/lp-qp-milp/examples/simple_qp_example.py | 3 --- .../cuopt/source/cuopt-python/lp-qp-milp/lp-qp-milp-api.rst | 3 --- .../source/cuopt-python/lp-qp-milp/lp-qp-milp-examples.rst | 3 --- .../cuopt-server/examples/lp/examples/warmstart_example.py | 6 ++++++ docs/cuopt/source/faq.rst | 5 +++++ docs/cuopt/source/lp-qp-features.rst | 3 --- 9 files changed, 14 insertions(+), 19 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index ca9d080b7..0d329bb8a 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -4,18 +4,20 @@ ### New Features (26.02) +- Quadratic programming (QP) solver is now generally available (previously beta) - New parallel reliability branching inside MIP solver - Mixed Integer Gomory, Mixed Integer Rounding, Knapsack and Strong Chvatal Gomory cuts are now added at root node - Added an option to use batch PDLP when running strong branching at the root. Based on [Batched First-Order Methods for Parallel LP Solving in MIP](https://arxiv.org/abs/2601.21990) ([Nicolas Blin](https://github.com/Kh4ster), [Stefano Gualandi](https://github.com/stegua), [Christopher Maes](https://github.com/chris-maes), [Andrea Lodi](https://github.com/andrealodi), [Bartolomeo Stellato](https://github.com/bstellato)) - New infeasibility detection option for PDLP's default solver mode Stable3 - Solutions callbacks added to C API. Users can now retrieve the dual bound and pass in user data. - Multiple new diving techniques added for finding integer feasible solutions -- The [PSLP presolver](https://github.com/dance858/PSLP) is enabled by default for LP problems. Use the presolve option to select Papilo or disable. +- The [PSLP presolver](https://github.com/dance858/PSLP) is enabled by default for LP problems. Use the presolve option to select Papilo or disable. - Added a batch solve for routing to boost throughput for many similar instances ### Breaking Changes (26.02) - The signature of the solution callbacks have changed for the Python API +- To use PDLP warm start, presolve must now be explicitly disabled by setting `CUOPT_PRESOLVE=0`. Previously, presolve was disabled automatically. ### Improvements (26.02) diff --git a/docs/cuopt/source/cuopt-c/lp-qp-milp/lp-qp-example.rst b/docs/cuopt/source/cuopt-c/lp-qp-milp/lp-qp-example.rst index fc382bbbb..07182501f 100644 --- a/docs/cuopt/source/cuopt-c/lp-qp-milp/lp-qp-example.rst +++ b/docs/cuopt/source/cuopt-c/lp-qp-milp/lp-qp-example.rst @@ -143,9 +143,6 @@ You should see the following output: Simple Quadratic Programming Example ------------------------------------ -.. note:: - The QP solver is currently in beta. - This example demonstrates how to use the cuOpt C API for quadratic programming. The example code is available at ``examples/cuopt-c/lp/simple_qp_example.c`` (:download:`download `): diff --git a/docs/cuopt/source/cuopt-python/lp-qp-milp/examples/qp_matrix_example.py b/docs/cuopt/source/cuopt-python/lp-qp-milp/examples/qp_matrix_example.py index f822ead9f..40609f4a1 100644 --- a/docs/cuopt/source/cuopt-python/lp-qp-milp/examples/qp_matrix_example.py +++ b/docs/cuopt/source/cuopt-python/lp-qp-milp/examples/qp_matrix_example.py @@ -5,9 +5,6 @@ Quadratic Programming Matrix Example ==================================== -.. note:: - The QP solver is currently in beta. - This example demonstrates how to formulate and solve a Quadratic Programming (QP) problem represented in a matrix format using the cuOpt Python API. diff --git a/docs/cuopt/source/cuopt-python/lp-qp-milp/examples/simple_qp_example.py b/docs/cuopt/source/cuopt-python/lp-qp-milp/examples/simple_qp_example.py index d9ff455e8..7a91b060b 100644 --- a/docs/cuopt/source/cuopt-python/lp-qp-milp/examples/simple_qp_example.py +++ b/docs/cuopt/source/cuopt-python/lp-qp-milp/examples/simple_qp_example.py @@ -5,9 +5,6 @@ Simple Quadratic Programming Example ==================================== -.. note:: - The QP solver is currently in beta. - This example demonstrates how to formulate and solve a simple Quadratic Programming (QP) problem using the cuOpt Python API. diff --git a/docs/cuopt/source/cuopt-python/lp-qp-milp/lp-qp-milp-api.rst b/docs/cuopt/source/cuopt-python/lp-qp-milp/lp-qp-milp-api.rst index 3a4f603d4..0c8923d2c 100644 --- a/docs/cuopt/source/cuopt-python/lp-qp-milp/lp-qp-milp-api.rst +++ b/docs/cuopt/source/cuopt-python/lp-qp-milp/lp-qp-milp-api.rst @@ -18,9 +18,6 @@ LP, QP and MILP API Reference :members: :undoc-members: -.. note:: - The QP solver is currently in beta. - .. autoclass:: cuopt.linear_programming.problem.QuadraticExpression :members: :undoc-members: diff --git a/docs/cuopt/source/cuopt-python/lp-qp-milp/lp-qp-milp-examples.rst b/docs/cuopt/source/cuopt-python/lp-qp-milp/lp-qp-milp-examples.rst index 76dfb7d74..a3412d1a8 100644 --- a/docs/cuopt/source/cuopt-python/lp-qp-milp/lp-qp-milp-examples.rst +++ b/docs/cuopt/source/cuopt-python/lp-qp-milp/lp-qp-milp-examples.rst @@ -33,9 +33,6 @@ The response is as follows: Simple Quadratic Programming Example ------------------------------------ -.. note:: - The QP solver is currently in beta. - :download:`simple_qp_example.py ` .. literalinclude:: examples/simple_qp_example.py diff --git a/docs/cuopt/source/cuopt-server/examples/lp/examples/warmstart_example.py b/docs/cuopt/source/cuopt-server/examples/lp/examples/warmstart_example.py index aea4b557c..860ef0bbe 100644 --- a/docs/cuopt/source/cuopt-server/examples/lp/examples/warmstart_example.py +++ b/docs/cuopt/source/cuopt-server/examples/lp/examples/warmstart_example.py @@ -10,6 +10,11 @@ Note: Warmstart is only applicable to LP, not for MILP. +Important: + To use warm start with PDLP, presolve must be explicitly disabled. + Set "presolve": "off" in solver_config, as presolve transforms the problem + and the warm start solution from the original problem cannot be applied. + Requirements: - cuOpt server running (default: localhost:5000) - cuopt_sh_client package installed @@ -53,6 +58,7 @@ def main(): "solver_config": { "tolerances": {"optimality": 0.0001}, "pdlp_solver_mode": 1, # Stable2 + "presolve": 0, }, } diff --git a/docs/cuopt/source/faq.rst b/docs/cuopt/source/faq.rst index f288f3f38..c88fa33cb 100644 --- a/docs/cuopt/source/faq.rst +++ b/docs/cuopt/source/faq.rst @@ -375,6 +375,11 @@ Linear Programming FAQs We use PaPILO presolve at the root node. It is enabled by default for MIP and disabled by default for LP. For LP, dual postsolve is not supported, for this reason dual solution and reduced costs are filled with Nans. +.. dropdown:: How do I use warm start with PDLP? + + To use warm start functionality with PDLP, you must explicitly disable presolve by setting CUOPT_PRESOLVE=0 in solver_config. + This is required because presolve transforms the problem, and the warm start solution from the original problem + cannot be applied to the presolved problem. Mixed Integer Linear Programming FAQs -------------------------------------- diff --git a/docs/cuopt/source/lp-qp-features.rst b/docs/cuopt/source/lp-qp-features.rst index fde57017e..2b2d9d823 100644 --- a/docs/cuopt/source/lp-qp-features.rst +++ b/docs/cuopt/source/lp-qp-features.rst @@ -58,9 +58,6 @@ There are two ways to specify constraints to the LP solver: Quadratic Programming --------------------- -.. note:: - The QP solver is currently in beta. - cuOpt supports problems with quadratic objectives of the form: .. code-block:: text From da9d9f638a795e5abd943cd524c7457060c950d5 Mon Sep 17 00:00:00 2001 From: Ramakrishna Prabhu Date: Mon, 9 Feb 2026 16:00:51 -0600 Subject: [PATCH 14/27] Add TSP bathmode doc --- .../routing/examples/tsp_batch_example.py | 51 +++++++++++++++++++ .../source/cuopt-python/routing/index.rst | 1 + .../cuopt-python/routing/routing-api.rst | 2 + .../cuopt-python/routing/routing-examples.rst | 42 +++++++++++++++ docs/cuopt/source/routing-features.rst | 5 ++ 5 files changed, 101 insertions(+) create mode 100644 docs/cuopt/source/cuopt-python/routing/examples/tsp_batch_example.py create mode 100644 docs/cuopt/source/cuopt-python/routing/routing-examples.rst diff --git a/docs/cuopt/source/cuopt-python/routing/examples/tsp_batch_example.py b/docs/cuopt/source/cuopt-python/routing/examples/tsp_batch_example.py new file mode 100644 index 000000000..fdd4a8838 --- /dev/null +++ b/docs/cuopt/source/cuopt-python/routing/examples/tsp_batch_example.py @@ -0,0 +1,51 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# TSP batch solve example: solve multiple TSP instances in one call for higher throughput. +# Use this when you have many similar routing problems (e.g., many small TSPs) to solve. + +import cudf +import numpy as np + +from cuopt import routing + + +def create_tsp_cost_matrix(n_locations): + """Create a simple symmetric cost matrix for a TSP of size n_locations.""" + cost_matrix = np.zeros((n_locations, n_locations), dtype=np.float32) + for i in range(n_locations): + for j in range(n_locations): + cost_matrix[i, j] = abs(i - j) + return cudf.DataFrame(cost_matrix) + + +def main(): + # Define multiple TSP sizes to solve in one batch + tsp_sizes = [5, 8, 10, 6, 7, 9] + + # Build one DataModel per TSP + data_models = [] + for n_locations in tsp_sizes: + cost_matrix = create_tsp_cost_matrix(n_locations) + dm = routing.DataModel(n_locations, 1) # n_locations, 1 vehicle (TSP) + dm.add_cost_matrix(cost_matrix) + data_models.append(dm) + + # Shared solver settings for the batch + settings = routing.SolverSettings() + settings.set_time_limit(5.0) + + # Solve all TSPs in batch (parallel execution) + solutions = routing.BatchSolve(data_models, settings) + + # Inspect results + print(f"Solved {len(solutions)} TSPs in batch.") + for i, (size, solution) in enumerate(zip(tsp_sizes, solutions)): + status = solution.get_status() + status_str = "SUCCESS" if status == routing.SolutionStatus.SUCCESS else status + vehicle_count = solution.get_vehicle_count() + print(f" TSP {i} (size {size}): status={status_str}, vehicles={vehicle_count}") + + +if __name__ == "__main__": + main() diff --git a/docs/cuopt/source/cuopt-python/routing/index.rst b/docs/cuopt/source/cuopt-python/routing/index.rst index 64abac5f8..eaeb735b4 100644 --- a/docs/cuopt/source/cuopt-python/routing/index.rst +++ b/docs/cuopt/source/cuopt-python/routing/index.rst @@ -11,4 +11,5 @@ This section contains details on the cuOpt routing optimization Python API. :titlesonly: routing-api.rst + routing-examples.rst Routing Example diff --git a/docs/cuopt/source/cuopt-python/routing/routing-api.rst b/docs/cuopt/source/cuopt-python/routing/routing-api.rst index e5e8c0881..41b7894d2 100644 --- a/docs/cuopt/source/cuopt-python/routing/routing-api.rst +++ b/docs/cuopt/source/cuopt-python/routing/routing-api.rst @@ -25,6 +25,8 @@ cuOpt Routing Python API Reference .. autofunction:: cuopt.routing.Solve +.. autofunction:: cuopt.routing.BatchSolve + .. autoclass:: cuopt.routing.Assignment :members: :undoc-members: diff --git a/docs/cuopt/source/cuopt-python/routing/routing-examples.rst b/docs/cuopt/source/cuopt-python/routing/routing-examples.rst new file mode 100644 index 000000000..5a2b1feee --- /dev/null +++ b/docs/cuopt/source/cuopt-python/routing/routing-examples.rst @@ -0,0 +1,42 @@ +======================================== +Routing Examples +======================================== + +This section contains examples for the cuOpt routing Python API. + +TSP batch mode +-------------- + +The routing Python API supports **batch mode** for solving many TSP (or routing) instances in a single call. Instead of calling :func:`cuopt.routing.Solve` repeatedly, you build a list of :class:`cuopt.routing.DataModel` objects and call :func:`cuopt.routing.BatchSolve`. The solver runs the problems in parallel to improve throughput. + +**When to use batch mode:** + +- You have **many similar routing problems** (e.g., dozens or hundreds of small TSPs). +- You want to **maximize throughput** by utilizing the GPU across multiple problems at once. +- Problem sizes and structure are compatible with the same :class:`cuopt.routing.SolverSettings` (e.g., same time limit). + +**Returns:** A list of :class:`cuopt.routing.Assignment` objects, one per input data model, in the same order as ``data_model_list``. Use :meth:`cuopt.routing.Assignment.get_status` and other assignment methods to inspect each solution. + +The following example builds several TSPs of different sizes, solves them in one batch, and prints a short summary per solution. + +:download:`tsp_batch_example.py ` + +.. literalinclude:: examples/tsp_batch_example.py + :language: python + :linenos: + +Sample output: + +.. code-block:: text + + Solved 6 TSPs in batch. + TSP 0 (size 5): status=SUCCESS, vehicles=1 + TSP 1 (size 8): status=SUCCESS, vehicles=1 + TSP 2 (size 10): status=SUCCESS, vehicles=1 + ... + +**Notes:** + +- All problems in the batch use the **same** :class:`cuopt.routing.SolverSettings` (e.g., time limit, solver options). +- Callbacks are not supported in batch mode. +- For best practices when batching many instances, see the *Add best practices for batch solving* note in the release documentation. diff --git a/docs/cuopt/source/routing-features.rst b/docs/cuopt/source/routing-features.rst index 9e044ff58..7442bbd21 100644 --- a/docs/cuopt/source/routing-features.rst +++ b/docs/cuopt/source/routing-features.rst @@ -13,6 +13,11 @@ The Routing solver is available in two forms: Both options provide the same routing optimization capabilities while offering flexibility in deployment and integration approaches. +Batch Solving (TSP) +------------------------------ + +The Python API supports solving multiple TSP (or routing) instances in a single call via **batch mode**. Use :func:`cuopt.routing.BatchSolve` with a list of :class:`cuopt.routing.DataModel` objects to run many problems in parallel and improve throughput. See :doc:`cuopt-python/routing/routing-examples` for details and an example. + Heterogeneous Fleet ------------------------------ From 772e01fa794a4a6e1da44f7ae6e2da1a5bd7cf44 Mon Sep 17 00:00:00 2001 From: Alice Boucher Date: Tue, 10 Feb 2026 08:42:11 +0000 Subject: [PATCH 15/27] determinism release notes --- RELEASE-NOTES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 0d329bb8a..7044f31f4 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -13,6 +13,7 @@ - Multiple new diving techniques added for finding integer feasible solutions - The [PSLP presolver](https://github.com/dance858/PSLP) is enabled by default for LP problems. Use the presolve option to select Papilo or disable. - Added a batch solve for routing to boost throughput for many similar instances +- Added experimental support for determinism in the parallel branch-and-bound solver. GPU heuristics are not supported yet in this mode. ### Breaking Changes (26.02) @@ -31,6 +32,7 @@ - Build/tooling: add `--split-compile`, `--jobserver`, Clang host build, ThreadSanitizer, improved container scripts, and branch/commit metadata in images - Use explicit `cudaStream_t` with `cub::DeviceTransform` and non-blocking streams for GPU control - Enable barrier LP tests, add regression testing, and add SonarQube static analysis +- Added parameter for specifying the random seed used by the solver ### Bug Fixes (26.02) From 57dcf32a19c2ebae3c37bc27ade2a9b4e0d64bda Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Tue, 10 Feb 2026 08:04:30 -0800 Subject: [PATCH 16/27] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 12ebfcece..ed4395999 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ For the latest version ensure you are on the `main` branch. ## Latest Documentation -[cuOpt Documentation](https://docs.nvidia.com/cuopt/user-guide/latest/introduction.html)) +[cuOpt Documentation](https://docs.nvidia.com/cuopt/user-guide/latest/introduction.html) ## Supported APIs From e172eece5fc95ee3ef06236795e7499ba1e0a7f2 Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Tue, 10 Feb 2026 08:05:43 -0800 Subject: [PATCH 17/27] Update RELEASE-NOTES.md --- RELEASE-NOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 7044f31f4..6f9d0a425 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -4,10 +4,10 @@ ### New Features (26.02) -- Quadratic programming (QP) solver is now generally available (previously beta) - New parallel reliability branching inside MIP solver - Mixed Integer Gomory, Mixed Integer Rounding, Knapsack and Strong Chvatal Gomory cuts are now added at root node - Added an option to use batch PDLP when running strong branching at the root. Based on [Batched First-Order Methods for Parallel LP Solving in MIP](https://arxiv.org/abs/2601.21990) ([Nicolas Blin](https://github.com/Kh4ster), [Stefano Gualandi](https://github.com/stegua), [Christopher Maes](https://github.com/chris-maes), [Andrea Lodi](https://github.com/andrealodi), [Bartolomeo Stellato](https://github.com/bstellato)) +- Quadratic programming (QP) solver is now generally available (previously beta) - New infeasibility detection option for PDLP's default solver mode Stable3 - Solutions callbacks added to C API. Users can now retrieve the dual bound and pass in user data. - Multiple new diving techniques added for finding integer feasible solutions From cd8397f6f534d0b7d86537b9df9539424e928bde Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Tue, 10 Feb 2026 08:07:10 -0800 Subject: [PATCH 18/27] Update RELEASE-NOTES.md --- RELEASE-NOTES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 6f9d0a425..918f7505b 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -76,6 +76,7 @@ - A crash in the incumbent test is resolved. - Fixed memory leaks in Barrier and PDLP's cuSPARSE usage. +- Fixed an issue with incorrect signs of dual variables and reduced costs on maximization problems. - The explored nodes in the MIP log now correctly reflects the actual nodes examined. - A compilation issue in the solve_MIP benchmarking executable is fixed, restoring benchmark builds. - A logger bug when log_to_console is false is fixed. From 96066103b8cf9ad4be47f0d31d080cb722a6a44d Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Tue, 10 Feb 2026 08:07:59 -0800 Subject: [PATCH 19/27] Update RELEASE-NOTES.md --- RELEASE-NOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 918f7505b..33dc9a93f 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -17,7 +17,7 @@ ### Breaking Changes (26.02) -- The signature of the solution callbacks have changed for the Python API +- The signatures of the solution callbacks have changed for the Python API - To use PDLP warm start, presolve must now be explicitly disabled by setting `CUOPT_PRESOLVE=0`. Previously, presolve was disabled automatically. ### Improvements (26.02) From 1ecffa8b518b19e4a6e8d37131a0ddff110255e9 Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Tue, 10 Feb 2026 08:11:52 -0800 Subject: [PATCH 20/27] Update RELEASE-NOTES.md --- RELEASE-NOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 33dc9a93f..523021be8 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -36,6 +36,7 @@ ### Bug Fixes (26.02) +- Fixed an issue with incorrect signs of dual variables and reduced costs on maximization problems. - Fix out-of-bounds in dense-column detection in barrier - Correct infeasible-list handling to avoid incorrect infeasibility reports in dual simplex - Fix race conditions found via Clang host build + ThreadSanitizer @@ -76,7 +77,6 @@ - A crash in the incumbent test is resolved. - Fixed memory leaks in Barrier and PDLP's cuSPARSE usage. -- Fixed an issue with incorrect signs of dual variables and reduced costs on maximization problems. - The explored nodes in the MIP log now correctly reflects the actual nodes examined. - A compilation issue in the solve_MIP benchmarking executable is fixed, restoring benchmark builds. - A logger bug when log_to_console is false is fixed. From df5757532150ca32b96060b2abbfea2be6a5c9d0 Mon Sep 17 00:00:00 2001 From: Chris Maes Date: Tue, 10 Feb 2026 08:13:40 -0800 Subject: [PATCH 21/27] Update RELEASE-NOTES.md --- RELEASE-NOTES.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 523021be8..9d697a00c 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -11,14 +11,14 @@ - New infeasibility detection option for PDLP's default solver mode Stable3 - Solutions callbacks added to C API. Users can now retrieve the dual bound and pass in user data. - Multiple new diving techniques added for finding integer feasible solutions -- The [PSLP presolver](https://github.com/dance858/PSLP) is enabled by default for LP problems. Use the presolve option to select Papilo or disable. +- The [PSLP presolver](https://github.com/dance858/PSLP) is enabled by default for LP problems. Use the presolve option to select Papilo or disable - Added a batch solve for routing to boost throughput for many similar instances -- Added experimental support for determinism in the parallel branch-and-bound solver. GPU heuristics are not supported yet in this mode. +- Added experimental support for determinism in the parallel branch-and-bound solver. GPU heuristics are not supported yet in this mode ### Breaking Changes (26.02) - The signatures of the solution callbacks have changed for the Python API -- To use PDLP warm start, presolve must now be explicitly disabled by setting `CUOPT_PRESOLVE=0`. Previously, presolve was disabled automatically. +- To use PDLP warm start, presolve must now be explicitly disabled by setting `CUOPT_PRESOLVE=0`. Previously, presolve was disabled automatically ### Improvements (26.02) @@ -36,7 +36,7 @@ ### Bug Fixes (26.02) -- Fixed an issue with incorrect signs of dual variables and reduced costs on maximization problems. +- Fixed an issue with incorrect signs of dual variables and reduced costs on maximization problems - Fix out-of-bounds in dense-column detection in barrier - Correct infeasible-list handling to avoid incorrect infeasibility reports in dual simplex - Fix race conditions found via Clang host build + ThreadSanitizer From 9e686362b3d6d9a809d6e912aaf8c032feed1ea1 Mon Sep 17 00:00:00 2001 From: Christopher Maes Date: Tue, 10 Feb 2026 10:29:30 -0800 Subject: [PATCH 22/27] Document new parameters. Style fixes --- .../routing/examples/tsp_batch_example.py | 8 +- docs/cuopt/source/lp-qp-milp-settings.rst | 95 ++++++++++++++++++- 2 files changed, 98 insertions(+), 5 deletions(-) diff --git a/docs/cuopt/source/cuopt-python/routing/examples/tsp_batch_example.py b/docs/cuopt/source/cuopt-python/routing/examples/tsp_batch_example.py index fdd4a8838..f64881bc7 100644 --- a/docs/cuopt/source/cuopt-python/routing/examples/tsp_batch_example.py +++ b/docs/cuopt/source/cuopt-python/routing/examples/tsp_batch_example.py @@ -42,9 +42,13 @@ def main(): print(f"Solved {len(solutions)} TSPs in batch.") for i, (size, solution) in enumerate(zip(tsp_sizes, solutions)): status = solution.get_status() - status_str = "SUCCESS" if status == routing.SolutionStatus.SUCCESS else status + status_str = ( + "SUCCESS" if status == routing.SolutionStatus.SUCCESS else status + ) vehicle_count = solution.get_vehicle_count() - print(f" TSP {i} (size {size}): status={status_str}, vehicles={vehicle_count}") + print( + f" TSP {i} (size {size}): status={status_str}, vehicles={vehicle_count}" + ) if __name__ == "__main__": diff --git a/docs/cuopt/source/lp-qp-milp-settings.rst b/docs/cuopt/source/lp-qp-milp-settings.rst index 37b362eea..f089b49ed 100644 --- a/docs/cuopt/source/lp-qp-milp-settings.rst +++ b/docs/cuopt/source/lp-qp-milp-settings.rst @@ -1,9 +1,9 @@ ================================= -LP, QP and MILP Settings +LP, QP, and MILP Settings ================================= -This page describes the parameter settings available for cuOpt's LP, QP and MILP solvers. These parameters are set as :ref:`parameter constants ` in case of C API and in case of Server Thin client as raw strings. +This page describes the parameter settings available for cuOpt's LP, QP, and MILP solvers. These parameters are set as :ref:`parameter constants ` in case of C API and in case of Server Thin client as raw strings. Please refer to examples in :doc:`C ` and :doc:`Server Thin client ` for more details. .. note:: @@ -372,7 +372,7 @@ Scaling ``CUOPT_MIP_SCALING`` controls if scaling should be applied to the MIP problem. When true scaling is applied, when false, no scaling is applied. -.. note:: the defaulte value is true. +.. note:: the defaulte value is false. Absolute Tolerance @@ -424,3 +424,92 @@ If the Best Objective and the Dual Bound are both zero the gap is zero. If the b gap is infinity. .. note:: the default value is ``1e-4``. + + +Cut Passes +^^^^^^^^^^ + +``CUOPT_MIP_CUT_PASSES`` controls the number of cut passes to run. Set this value to 0 to disable cuts. Set this value to larger numbers to perform more cut passes. + +.. note:: the default value is ``10``. + +Mixed Integer Rounding Cuts +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``CUOPT_MIP_MIXED_INTEGER_ROUNDING_CUTS`` controls whether to use mixed integer rounding cuts. +The default value of ``-1`` (automatic) means that the solver will decide whether to use mixed integer rounding cuts based on the problem characteristics. +Set this value to 1 to enable mixed integer rounding cuts. +Set this value to 0 to disable mixed integer rounding cuts. + +.. note:: the default value is ``-1`` (automatic). + +Mixed Integer Gomory Cuts +^^^^^^^^^^^^^^^^^^^^^^^^^ + +``CUOPT_MIP_MIXED_INTEGER_GOMORY_CUTS`` controls whether to use mixed integer Gomory cuts. +The default value of ``-1`` (automatic) means that the solver will decide whether to use mixed integer Gomory cuts based on the problem characteristics. +Set this value to 1 to enable mixed integer Gomory cuts. +Set this value to 0 to disable mixed integer Gomory cuts. + +.. note:: the default value is ``-1`` (automatic). + +Strong Chvatal-Gomory Cuts +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``CUOPT_MIP_STRONG_CHVATAL_GOMORY_CUTS`` controls whether to use strong Chvatal-Gomory cuts. +The default value of ``-1`` (automatic) means that the solver will decide whether to use strong Chvatal-Gomory cuts based on the problem characteristics. +Set this value to 1 to enable strong Chvatal Gomory cuts. +Set this value to 0 to disable strong Chvatal Gomory cuts. + +.. note:: the default value is ``-1`` (automatic). + +Knapsack Cuts +^^^^^^^^^^^^^ + +``CUOPT_MIP_KNAPSACK_CUTS`` controls whether to use knapsack cuts. +The default value of ``-1`` (automatic) means that the solver will decide whether to use knapsack cuts based on the problem characteristics. +Set this value to 1 to enable knapsack cuts. +Set this value to 0 to disable knapsack cuts. + +.. note:: the default value is ``-1`` (automatic). + + +Cut Change Threshold +^^^^^^^^^^^^^^^^^^^^ + +``CUOPT_MIP_CUT_CHANGE_THRESHOLD`` controls the threshold for the improvement in the dual bound per cut pass. +Larger values require the dual bound to improve significantly in each cut pass. +Set this value to 0 to allow the cut passes to continue even if the dual bound does not improve. + +.. note:: the default value is ``1e-3``. + +Cut Min Orthogonality +^^^^^^^^^^^^^^^^^^^^^ + +``CUOPT_MIP_CUT_MIN_ORTHOGONALITY`` controls the minimum orthogonality required for a cut to be added to the LP relaxation. +Set this value close to 1, to require all cuts be close to orthogonal to each other. +Set this value close to zero to allow more cuts to be added to the LP relaxation. + +.. note:: the default value is ``0.5``. + +Reduced Cost Strengthening +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``CUOPT_MIP_REDUCED_COST_STRENGTHENING`` controls whether to use reduced-cost strengthening. +When enabled, the solver will use integer feasible solutions to strengthen the bounds of integer variables. +The default value of ``-1`` (automatic) means that the solver will decide whether to use reduced-cost strengthening based on the problem characteristics. +Set this value to 0 to disable reduced-cost strengthening. +Set this value to 1 to perform reduced-cost strengthening during the root cut passes. +Set this value to 2 to perform reduced-cost strengthening during the root cut passes and after strong branching. + +.. note:: the default value is ``-1`` (automatic). + +Reliability Branching +^^^^^^^^^^^^^^^^^^^^^ + +``CUOPT_MIP_RELIABILITY_BRANCHING`` controls the reliability branching mode. +The default value of ``-1`` (automatic) means that the solver will decide whether to use reliability branching, and the reliability branching factor, based on the problem characteristics. +Set this value to 0 to disable reliability branching. +Set this value to k > 0, to enable reliability branching. A variable will be considered reliable if it has been branched on k times. + +.. note:: the default value is ``-1`` (automatic). From 6faaa30491568865f81cf139cba78b3f0a29bad5 Mon Sep 17 00:00:00 2001 From: Ishika Roy <41401566+Iroy30@users.noreply.github.com> Date: Tue, 10 Feb 2026 15:32:42 -0600 Subject: [PATCH 23/27] Update lp-qp-milp-settings.rst --- docs/cuopt/source/lp-qp-milp-settings.rst | 82 +++++++++++------------ 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/docs/cuopt/source/lp-qp-milp-settings.rst b/docs/cuopt/source/lp-qp-milp-settings.rst index f089b49ed..51c6142c2 100644 --- a/docs/cuopt/source/lp-qp-milp-settings.rst +++ b/docs/cuopt/source/lp-qp-milp-settings.rst @@ -23,7 +23,7 @@ may run slightly over the limit. If set along with the iteration limit, cuOpt wi the first limit (iteration or time) is hit. -.. note:: by default there is no time limit. So cuOpt will run until it finds an optimal solution, +.. note:: By default there is no time limit. So cuOpt will run until it finds an optimal solution, or proves the problem is infeasible or unbounded. @@ -33,25 +33,25 @@ Log to Console ``CUOPT_LOG_TO_CONSOLE`` controls whether cuOpt should log information to the console during a solve. If true, a logging info is written to the console, if false no logging info is written to the console (logs may still be written to a file.) -.. note:: the default value is true. +.. note:: The default value is true. Log File ^^^^^^^^ ``CUOPT_LOG_FILE`` controls the name of a log file where cuOpt should write information about the solve. -.. note:: the default value is ``""`` and no log file is written. This setting is ignored by the cuOpt service, use the log callback feature instead. +.. note:: The default value is ``""`` and no log file is written. This setting is ignored by the cuOpt service, use the log callback feature instead. Solution File ^^^^^^^^^^^^^ ``CUOPT_SOLUTION_FILE`` controls the name of a file where cuOpt should write the solution. -.. note:: the default value is ``""`` and no solution file is written. This setting is ignored by the cuOpt service. +.. note:: The default value is ``""`` and no solution file is written. This setting is ignored by the cuOpt service. User Problem File ^^^^^^^^^^^^^^^^^ ``CUOPT_USER_PROBLEM_FILE`` controls the name of a file where cuOpt should write the user problem. -.. note:: the default value is ``""`` and no user problem file is written. This setting is ignored by the cuOpt service. +.. note:: The default value is ``""`` and no user problem file is written. This setting is ignored by the cuOpt service. Num CPU Threads ^^^^^^^^^^^^^^^ @@ -59,7 +59,7 @@ Num CPU Threads the amount of CPU resources cuOpt uses. Set this to a large value to improve solve times for CPU parallel parts of the solvers. -.. note:: by default the number of CPU threads is automatically determined based on the number of CPU cores. +.. note:: By default the number of CPU threads is automatically determined based on the number of CPU cores. Presolve ^^^^^^^^ @@ -123,7 +123,7 @@ For performance reasons, cuOpt's does not constantly checks for iteration limit, the solver might run a few extra iterations over the limit. If set along with the time limit, cuOpt will stop at the first limit (iteration or time) reached. -.. note:: by default there is no iteration limit. So, cuOpt will run until it finds an optimal solution, +.. note:: By default there is no iteration limit. So, cuOpt will run until it finds an optimal solution, or proves the problem is infeasible or unbounded. @@ -141,7 +141,7 @@ is not always accurate. Some problems detected as infeasible may converge under Detecting infeasibility consumes both more runtime and memory. The added runtime is between 3% and 7%, the added memory consumption is between 10% and 20%. -.. note:: by default PDLP will not detect infeasibility. Dual simplex will always detect infeasibility +.. note:: By default PDLP will not detect infeasibility. Dual simplex will always detect infeasibility regardless of this setting. Strict Infeasibility @@ -151,7 +151,7 @@ Strict Infeasibility is detected as infeasible, PDLP will stop. When false both the current and average solution need to be detected as infeasible for PDLP to stop. -.. note:: the default value is false. +.. note:: The default value is false. .. _crossover: @@ -165,7 +165,7 @@ between their bounds. Enabling crossover allows the user to obtain a high-qualit that lies at a vertex of the feasible region. If n is the number of variables, and m is the number of constraints, n - m variables will be on their bounds in a basic solution. -.. note:: the default value is false. +.. note:: The default value is false. Save Best Primal So Far ^^^^^^^^^^^^^^^^^^^^^^^ @@ -176,21 +176,21 @@ With this parameter set to true, PDLP * If no primal feasible was found, the one with the lowest primal residual will be kept * If two have the same primal residual, the one with the best objective will be kept -.. note:: the default value is false. +.. note:: The default value is false. First Primal Feasible ^^^^^^^^^^^^^^^^^^^^^ ``CUOPT_FIRST_PRIMAL_FEASIBLE`` controls whether PDLP should stop when the first primal feasible solution is found. -.. note:: the default value is false. +.. note:: The default value is false. Per Constraint Residual ^^^^^^^^^^^^^^^^^^^^^^^ ``CUOPT_PER_CONSTRAINT_RESIDUAL`` controls whether PDLP should compute the primal & dual residual per constraint instead of globally. -.. note:: the default value is false. +.. note:: The default value is false. Barrier Solver Settings ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -206,7 +206,7 @@ Folding * ``0``: Disable folding * ``1``: Force folding to run -.. note:: the default value is ``-1`` (automatic). +.. note:: The default value is ``-1`` (automatic). Dualize """"""" @@ -217,7 +217,7 @@ Dualize * ``0``: Don't attempt to dualize * ``1``: Force dualize -.. note:: the default value is ``-1`` (automatic). +.. note:: The default value is ``-1`` (automatic). Ordering """""""" @@ -228,7 +228,7 @@ Ordering * ``0``: cuDSS default ordering * ``1``: AMD (Approximate Minimum Degree) ordering -.. note:: the default value is ``-1`` (automatic). +.. note:: The default value is ``-1`` (automatic). Augmented System """""""""""""""" @@ -239,7 +239,7 @@ Augmented System * ``0``: Solve the ADAT system (normal equations) * ``1``: Solve the augmented system -.. note:: the default value is ``-1`` (automatic). The augmented system may be more stable for some problems, while ADAT may be faster for others. +.. note:: The default value is ``-1`` (automatic). The augmented system may be more stable for some problems, while ADAT may be faster for others. Eliminate Dense Columns """""""""""""""""""""""" @@ -252,7 +252,7 @@ However, extra solves must be performed at each iteration. This setting only has an effect when the ADAT (normal equation) system is solved. -.. note:: the default value is ``true``. +.. note:: The default value is ``true``. cuDSS Deterministic Mode """"""""""""""""""""""""" @@ -262,7 +262,7 @@ cuDSS Deterministic Mode * ``true``: Use deterministic mode * ``false``: Use non-deterministic mode (default) -.. note:: the default value is ``false``. Enable deterministic mode if reproducibility is more important than performance. +.. note:: The default value is ``false``. Enable deterministic mode if reproducibility is more important than performance. Dual Initial Point """""""""""""""""" @@ -273,7 +273,7 @@ Dual Initial Point * ``0``: Use an initial point from a heuristic approach based on the paper "On Implementing Mehrotra's Predictor–Corrector Interior-Point Method for Linear Programming" (SIAM J. Optimization, 1992) by Lustig, Martsten, Shanno. * ``1``: Use an initial point from solving a least squares problem that minimizes the norms of the dual variables and reduced costs while statisfying the dual equality constraints. -.. note:: the default value is ``-1`` (automatic). +.. note:: The default value is ``-1`` (automatic). Absolute Primal Tolerance ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -299,7 +299,7 @@ The primal feasibility condition is computed as follows:: primal_feasiblity < absolute_primal_tolerance + relative_primal_tolerance * l2_norm(b) -.. note:: the default value is ``1e-4``. +.. note:: The default value is ``1e-4``. Absolute Dual Tolerance ^^^^^^^^^^^^^^^^^^^^^^^ @@ -312,7 +312,7 @@ The dual feasibility condition is computed as follows:: dual_feasiblity < absolute_dual_tolerance + relative_dual_tolerance * l2_norm(c) -.. note:: the default value is ``1e-4``. +.. note:: The default value is ``1e-4``. Relative Dual Tolerance ^^^^^^^^^^^^^^^^^^^^^^^ @@ -323,7 +323,7 @@ The dual feasibility condition is computed as follows:: dual_feasiblity < absolute_dual_tolerance + relative_dual_tolerance * l2_norm(c) -.. note:: the default value is ``1e-4``. +.. note:: The default value is ``1e-4``. Absolute Gap Tolerance @@ -336,7 +336,7 @@ The duality gap is computed as follows:: duality_gap < absolute_gap_tolerance + relative_gap_tolerance * (|primal_objective| + |dual_objective|) -.. note:: the default value is ``1e-4``. +.. note:: The default value is ``1e-4``. Relative Gap Tolerance @@ -348,7 +348,7 @@ The duality gap is computed as follows:: duality_gap < absolute_gap_tolerance + relative_gap_tolerance * (|primal_objective| + |dual_objective|) -.. note:: the default value is ``1e-4``. +.. note:: The default value is ``1e-4``. Mixed Integer Linear Programming @@ -364,7 +364,7 @@ Heuristics only bound is improved via the GPU. When set to false, both the GPU and CPU are used and the dual bound is improved on the CPU. -.. note:: the default value is false. +.. note:: The default value is false. Scaling ^^^^^^^ @@ -372,7 +372,7 @@ Scaling ``CUOPT_MIP_SCALING`` controls if scaling should be applied to the MIP problem. When true scaling is applied, when false, no scaling is applied. -.. note:: the defaulte value is false. +.. note:: The default value is false. Absolute Tolerance @@ -380,14 +380,14 @@ Absolute Tolerance ``CUOPT_MIP_ABSOLUTE_TOLERANCE`` controls the MIP absolute tolerance. -.. note:: the default value is ``1e-6``. +.. note:: The default value is ``1e-6``. Relative Tolerance ^^^^^^^^^^^^^^^^^^ ``CUOPT_MIP_RELATIVE_TOLERANCE`` controls the MIP relative tolerance. -.. note:: the default value is ``1e-12``. +.. note:: The default value is ``1e-12``. Integrality Tolerance @@ -396,7 +396,7 @@ Integrality Tolerance ``CUOPT_MIP_INTEGRALITY_TOLERANCE`` controls the MIP integrality tolerance. A variable is considered to be integral, if it is within the integrality tolerance of an integer. -.. note:: the default value is ``1e-5``. +.. note:: The default value is ``1e-5``. Absolute MIP Gap ^^^^^^^^^^^^^^^^ @@ -411,7 +411,7 @@ when minimizing or when maximizing. -.. note:: the default value is ``1e-10``. +.. note:: The default value is ``1e-10``. Relative MIP Gap ^^^^^^^^^^^^^^^^ @@ -423,7 +423,7 @@ Relative MIP Gap If the Best Objective and the Dual Bound are both zero the gap is zero. If the best objective value is zero, the gap is infinity. -.. note:: the default value is ``1e-4``. +.. note:: The default value is ``1e-4``. Cut Passes @@ -431,7 +431,7 @@ Cut Passes ``CUOPT_MIP_CUT_PASSES`` controls the number of cut passes to run. Set this value to 0 to disable cuts. Set this value to larger numbers to perform more cut passes. -.. note:: the default value is ``10``. +.. note:: The default value is ``10``. Mixed Integer Rounding Cuts ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -441,7 +441,7 @@ The default value of ``-1`` (automatic) means that the solver will decide whethe Set this value to 1 to enable mixed integer rounding cuts. Set this value to 0 to disable mixed integer rounding cuts. -.. note:: the default value is ``-1`` (automatic). +.. note:: The default value is ``-1`` (automatic). Mixed Integer Gomory Cuts ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -451,7 +451,7 @@ The default value of ``-1`` (automatic) means that the solver will decide whethe Set this value to 1 to enable mixed integer Gomory cuts. Set this value to 0 to disable mixed integer Gomory cuts. -.. note:: the default value is ``-1`` (automatic). +.. note:: The default value is ``-1`` (automatic). Strong Chvatal-Gomory Cuts ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -461,7 +461,7 @@ The default value of ``-1`` (automatic) means that the solver will decide whethe Set this value to 1 to enable strong Chvatal Gomory cuts. Set this value to 0 to disable strong Chvatal Gomory cuts. -.. note:: the default value is ``-1`` (automatic). +.. note:: The default value is ``-1`` (automatic). Knapsack Cuts ^^^^^^^^^^^^^ @@ -471,7 +471,7 @@ The default value of ``-1`` (automatic) means that the solver will decide whethe Set this value to 1 to enable knapsack cuts. Set this value to 0 to disable knapsack cuts. -.. note:: the default value is ``-1`` (automatic). +.. note:: The default value is ``-1`` (automatic). Cut Change Threshold @@ -481,7 +481,7 @@ Cut Change Threshold Larger values require the dual bound to improve significantly in each cut pass. Set this value to 0 to allow the cut passes to continue even if the dual bound does not improve. -.. note:: the default value is ``1e-3``. +.. note:: The default value is ``1e-3``. Cut Min Orthogonality ^^^^^^^^^^^^^^^^^^^^^ @@ -490,7 +490,7 @@ Cut Min Orthogonality Set this value close to 1, to require all cuts be close to orthogonal to each other. Set this value close to zero to allow more cuts to be added to the LP relaxation. -.. note:: the default value is ``0.5``. +.. note:: The default value is ``0.5``. Reduced Cost Strengthening ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -502,7 +502,7 @@ Set this value to 0 to disable reduced-cost strengthening. Set this value to 1 to perform reduced-cost strengthening during the root cut passes. Set this value to 2 to perform reduced-cost strengthening during the root cut passes and after strong branching. -.. note:: the default value is ``-1`` (automatic). +.. note:: The default value is ``-1`` (automatic). Reliability Branching ^^^^^^^^^^^^^^^^^^^^^ @@ -512,4 +512,4 @@ The default value of ``-1`` (automatic) means that the solver will decide whethe Set this value to 0 to disable reliability branching. Set this value to k > 0, to enable reliability branching. A variable will be considered reliable if it has been branched on k times. -.. note:: the default value is ``-1`` (automatic). +.. note:: The default value is ``-1`` (automatic). From 548f9c90a76787ccabb024cf4757f8f9ffd8e1f9 Mon Sep 17 00:00:00 2001 From: Ishika Roy <41401566+Iroy30@users.noreply.github.com> Date: Tue, 10 Feb 2026 15:33:29 -0600 Subject: [PATCH 24/27] Update routing-examples.rst --- docs/cuopt/source/cuopt-python/routing/routing-examples.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cuopt/source/cuopt-python/routing/routing-examples.rst b/docs/cuopt/source/cuopt-python/routing/routing-examples.rst index 5a2b1feee..5aebd989d 100644 --- a/docs/cuopt/source/cuopt-python/routing/routing-examples.rst +++ b/docs/cuopt/source/cuopt-python/routing/routing-examples.rst @@ -4,7 +4,7 @@ Routing Examples This section contains examples for the cuOpt routing Python API. -TSP batch mode +TSP Batch Mode -------------- The routing Python API supports **batch mode** for solving many TSP (or routing) instances in a single call. Instead of calling :func:`cuopt.routing.Solve` repeatedly, you build a list of :class:`cuopt.routing.DataModel` objects and call :func:`cuopt.routing.BatchSolve`. The solver runs the problems in parallel to improve throughput. From 4f83c390d483dc93091a80fa4027e0d32d7a3450 Mon Sep 17 00:00:00 2001 From: Ishika Roy <41401566+Iroy30@users.noreply.github.com> Date: Tue, 10 Feb 2026 16:04:06 -0600 Subject: [PATCH 25/27] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ed4395999..5cbdc8b63 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,11 @@ -NVIDIA® cuOpt™ is a GPU-accelerated optimization engine that excels in mixed integer linear programming (MILP), linear programming (LP), quadratic programming (QP) and vehicle routing problems (VRP). It enables near real-time solutions for large-scale LPs with millions of variables and constraints, and MIPs with hundreds of thousands of variables. cuOpt offers easy integration into existing modeling languages and seamless deployment across hybrid and multi-cloud environments. +NVIDIA® cuOpt™ is a GPU-accelerated optimization engine that excels in mixed integer linear programming (MILP), linear programming (LP), quadratic programming (QP), and vehicle routing problems (VRP). It enables near real-time solutions for large-scale LPs with millions of variables and constraints, and MIPs with hundreds of thousands of variables. cuOpt offers easy integration into existing modeling languages and seamless deployment across hybrid and multi-cloud environments. The core engine is written in C++ and wrapped with a C API, Python API and Server API. -For the latest version ensure you are on the `main` branch. +For the latest version, ensure you are on the `main` branch. ## Latest Documentation From 847df85263417be3abaccf340903b41c4ef35854 Mon Sep 17 00:00:00 2001 From: Ishika Roy <41401566+Iroy30@users.noreply.github.com> Date: Tue, 10 Feb 2026 16:05:30 -0600 Subject: [PATCH 26/27] Update RELEASE-NOTES.md --- RELEASE-NOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 9d697a00c..752f11aac 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -9,7 +9,7 @@ - Added an option to use batch PDLP when running strong branching at the root. Based on [Batched First-Order Methods for Parallel LP Solving in MIP](https://arxiv.org/abs/2601.21990) ([Nicolas Blin](https://github.com/Kh4ster), [Stefano Gualandi](https://github.com/stegua), [Christopher Maes](https://github.com/chris-maes), [Andrea Lodi](https://github.com/andrealodi), [Bartolomeo Stellato](https://github.com/bstellato)) - Quadratic programming (QP) solver is now generally available (previously beta) - New infeasibility detection option for PDLP's default solver mode Stable3 -- Solutions callbacks added to C API. Users can now retrieve the dual bound and pass in user data. +- Solutions callbacks added to C API. Users can now retrieve the dual bound and pass in user data - Multiple new diving techniques added for finding integer feasible solutions - The [PSLP presolver](https://github.com/dance858/PSLP) is enabled by default for LP problems. Use the presolve option to select Papilo or disable - Added a batch solve for routing to boost throughput for many similar instances From 75682ff2cead4d19b6efb5df93bd4c3d55c09dca Mon Sep 17 00:00:00 2001 From: Ishika Roy <41401566+Iroy30@users.noreply.github.com> Date: Tue, 10 Feb 2026 16:09:42 -0600 Subject: [PATCH 27/27] Update faq.rst --- docs/cuopt/source/faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cuopt/source/faq.rst b/docs/cuopt/source/faq.rst index 59a88a1db..66744819f 100644 --- a/docs/cuopt/source/faq.rst +++ b/docs/cuopt/source/faq.rst @@ -376,7 +376,7 @@ Linear Programming FAQs .. dropdown:: How do I use warm start with PDLP? - To use warm start functionality with PDLP, you must explicitly disable presolve by setting CUOPT_PRESOLVE=0 in solver_config. + To use warm start functionality with PDLP, you must explicitly disable presolve by setting ``CUOPT_PRESOLVE=0`` in solver_config. This is required because presolve transforms the problem, and the warm start solution from the original problem cannot be applied to the presolved problem.