- 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 (Nicolas Blin, Stefano Gualandi, Christopher Maes, Andrea Lodi, Bartolomeo Stellato)
- 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
- The PSLP presolver 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
- 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
- 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
- Build/tooling: add
--split-compile,--jobserver, Clang host build, ThreadSanitizer, improved container scripts, and branch/commit metadata in images - Use explicit
cudaStream_twithcub::DeviceTransformand 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
- 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
- Resolve CUDA–Numba version mismatches with cuDF
- Fix device code to include required trailing return types
- Fix issue in crossover after dualization in barrier
- Repair container build and test failures
- Miscellaneous additional fixes and stability improvements
- 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
- New quadratic programming solver using the barrier method (currently in beta).
- Support for quadratic objectives added to the C and Python modeling APIs.
- LP concurrent mode now supports multiple GPUs. PDLP and barrier can now be run on separate GPUs.
- MIP root relaxation solves now use concurrent mode: PDLP, barrier, and dual simplex.
- RINS heuristic adds a new improvement strategy in the MIP solver.
- Basis factorizations are now reused in the branch and bound tree.
- Improvement in propagating bounds from parent to child nodes in the branch and bound tree.
- GMRES with Cholesky/LDL preconditioning is now used for iterative refinement on QPs.
- Improved numerical stability of dual simplex when the basis is ill-conditioned.
- Improved robustness in barrier and PDLP: fixed cuSPARSE related leaks and added RAII-style wrappers for cuSPARSE structures.
- Papilo-based presolve carries over implied integer information from reductions, improving consistency of integrality handling.
- Build and CI workflows improved through assertion-default changes, better handling of git-hash rebuilds, and fixes to the nightly build matrix.
- Reduced package sizes by adjusting build outputs and test-only library linkage, and the TSP dataset download logic disables unneeded downloads.
- A crash in the incumbent test is resolved.
- Fixed memory leaks in Barrier and PDLP's cuSPARSE usage.
- 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.
- Routing fixes improve TSP behavior when order locations are set.
- Nightly container testing and CI handling fix issues in the nightly container test suite and build jobs.
- A cuDF build_column deprecation issue fixed to keep compatibility with newer cuDF versions.
- Missing parameters added to the documentation for LP and MILP.
- Release notes added to the main repository for easy access.
- Examples in the documentation improved.
- The openapi spec for the service showed the 'status' value for LP/MILP results as an int but it is actually a string.
- New barrier method for solving LPs. Uses cuDSS for sparse Cholesky / LDT.
- Concurrent mode for LPs now uses PDLP, dual simplex, and barrier
- New PDLP solver mode Stable3.
- MIP presolve using Papilo (enabled by default). LP presolve using Papilo (optional).
- Parallel branch and bound on the CPU: multiple best-first search and diving threads
- New PDLP Solver mode Stable3 is the default
- Add setting "CUOPT_BARRIER_DUAL_INITIAL_POINT" to change the dual initial point used by barrier
- CPUFJ for local search + simple rounding
- FP as a local search
- Sub-MIP recombiner and B&B global variable changes
- Implement GF(2) presolve reduction
- Implement node presolve
- CUDA 13/12.9 support
- Build and test with CUDA 13.0.0
- Add read/write MPS and relaxation to python API
- Decompression for
.mps.gzand.mps.bz2files - Enable parallelism for root node presolve
- Enable singleton stuffing and use Papilo default params
- Make infeasibility checks consistent between the main solver and presolver
- Add maximization support for root node presolve
- Performance improvement in dual simplex's right-looking LU factorization
- Fix high GPU memory usage
- Print cuOpt version / machine info before solving
cuopt-server: update dependencies (drop httpx, add psutil)- Add nightly testing of cuOpt jump interface
- Compression tests are not run when compression is disabled
- Add sanitizer build option- Heuristic Improvements: balance between generation and improvement heuristics
- Loosen presolve tolerance and update timers to report cumulative presolve/solve time
- Warn in case a dependent library is not found in libcuopt load
- Combined variable bounds
- Add Commit Sha to container for reference
- use GCC 14, consolidate dependency groups, update pre-commit hooks
- Add support for nightly
cuopt-examplesnotebook testing - Reduce hard-coded version usage in repo
- Container to work on all different users including root
- Changes to download LP and MILP datasets, and also disable cvxpy testing for 3.10
- Faster engine compile time
- Fix pre-commit for trailing whitespace and end of file
- Merge update version and fix version format bugs
- This library now supports the QPS format, which is an extension of the standard MPS format for representing quadratic programming problems.
- Fix variables out of bounds caused by CPUFJ LP scratch thread
- Fix the maybe-uninitialized compilation error
- Fix linking errors in the test suite when disabling C adaptor
- Compute relative gap with respect to user objectives
- Add http timeout values for general, send, and receive to client
- Fix bug in
fixed_problem_computation - Remove
limiting_resource_adaptorleftover - Add support for cuda13 container and fix cuda13 lib issues in wheel
- Return Infeasible if the user problem contains crossing bounds
- Fix out-of-bound access in
clean_up_infeasibilities - Empty columns with infinite bounds are not removed
- Add tutorial video links to Decompression
- Add warmstart, model update, update docs
- add docs on CI workflow inputs
- Add name to drop-down for video link
- Add video link to the docs and to the Readme
- Add documentation on nightly installation commands
- Fix version in version tab, change log, and fix typos
- Doc update for container version update, and add
nvidia-cuda-runtimeas a dependency
- Added Python API for LP and MILP (#223)
- Fixed versioning for nightly and release package (#175)
- New heuristic improvements (#178)
- Add helm chart for cuOpt service (#224)
- Add nightly container support (#180)
- Adding deb package support as a beta feature (#190)
- Use cusparsespmv_preprocess() now that Raft implements it (#120)
- Create a bash script to run MPS files in parallel (#87)
- Several fixes needed to compile cuOpt with LLVM (#121)
- Small fixes for corner cases (#130)
- Small improvements on how paths are handled in tests (#129)
- Update cxxopts to v3.3.1 (#128)
- Bump actions/checkout in nightly.yaml to v4 (#230)
- Remove CUDA 11 specific changes from repo (#222)
- Heuristic improvements with solution hash, MAB and simplex root solution (#216)
- Various typos in comments and strings, note on result dir (#200)
- Split very large tests into smaller individual test cases (#152)
- Fix compile error when using clang with C++20 (#145)
- Relax pinnings on several dependencies, remove nvidia channel (#125)
- Fix compile error when building with clang (#119)
- cuOpt service add healthcheck for / (#114)
- refactor(shellcheck): fix all remaining shellcheck errors/warnings (#99)
- Add CTK 12.9 fatbin flags to maintain existing binary sizes (#58)
- Fixed a segfault on bnatt500 due to small mu leading to inf/nan (#254)
- Fixed a bug in basis repair. Recover from numerical issues in primal update (#249)
- Unset NDEBUG in cmake in assert mode (#248)
- Manual cuda graph creation in load balanced bounds presolve (#242)
- Fixed bug on initial solution size in the check and cuda set device order (#226)
- Disable cuda graph in batched PDLP (#225)
- Fix logging levels format with timestamps (#201)
- Fix bug in scaling of dual slacks and sign of dual variables for >= constraints (#191)
- Fix inversion crossover bug with PDP and prize collection (#179)
- Fix a bug in extract_best_per_route kernel (#156)
- Fix several bugs appeared in unit testing of JuMP interface (#149)
- Fix incorrect reported solving time (#131)
- Fix max offset (#113)
- Fix batch graph capture issue caused by pinned memory allocator (#110)
- Fix bug in optimization_problem_solution_t::copy_from (#109)
- Fix issue when problem has an empty problem in PDLP (#107)
- Fix crash on models with variables but no constraints (#105)
- Fix inversion of constraint bounds in conditional bounds presolve (#75)
- Fix data initialization in create depot node for max travel time feature (#74)
- Added more pre-commit checks to ensure coding standards (#213)
- Mention GAMS and GAMSPy in third-party modeling languages page in documentation (#206)
- Enable doc build workflow and build script for PR and Nightly (#203)
- Fix the link to Python docs in README (#118)
- Add link checker for doc build and test (#229)
- Added concurrent mode that runs PDLP and Dual Simplex together
- Added crossover from PDLP to Dual Simplex
- Added a C API for LP and MILP
- PDLP: Faster iterations and new more robust default PDLPSolverMode Stable2
- Added support for writing out mps file containing user problem. Useful for debugging
- NoTermination is now a NumericalError
- Split cuOpt as libcuopt and cuopt wheel
- Hook up MILP Gap parameters and add info about number of nodes explored and simplex iterations
- FJ bug fixes, tests and improvements
- Allow no time limit in MILP
- Refactor routing
- Probing cache optimization
- Diversity improvements for routing
- Enable more compile warnings and faster compile by bypassing rapids fetch
- Constraint prop based on load balanced bounds update
- Logger file handling and bug fixes on MILP
- Add shellcheck to pre-commit and fix warnings
- In the solution,
termination_statusshould be cast to correct enum. - Fixed a bug using vehicle IDs in construct feasible solution algorithm.
- FP recombiner probing bug fix.
- Fix concurrent LP crashes.
- Fix print relative dual residual.
- Handle empty problems gracefully.
- Improve breaks to allow dimensions at arbitrary places in the route.
- Free var elimination with a substitute variable for each free variable.
- Fixed race condition when resetting vehicle IDs in heterogenous mode.
- cuOpt self-hosted client, some MILPs do not have all fields in
lp_stats. - Fixed RAPIDS logger usage.
- Handle LP state more cleanly, per solution.
- Fixed routing solver intermittent failures.
- Gracefully exit when the problem is infeasible after presolve.
- Fixed bug on dual resizing.
- Fix occasional incorrect solution bound on maximization problems
- Fix inversion of constraint bounds in conditional bounds presolve
- Pdlp fix batch cuda graph
- Fix obj constant on max. Fix undefined memory access at root
- Allow long client version in service version check, this fixes the issue in case version is of the format 25.05.00.dev0
- Restructure documentation to accommodate new APIs