cuPDLPx is a GPU-accelerated linear programming solver based on a restarted Halpern PDHG method specifically tailored for GPU architectures. It incorporates a Halpern update scheme, an adaptive restart scheme, and a PID-controlled primal weight, resulting in substantial empirical improvements over its predecessor, cuPDLP, on standard LP benchmark suites.
cuPDLPx solves linear programs of the form
Our work is presented in two papers:
-
Computational Paper: cuPDLPx: A Further Enhanced GPU-Based First-Order Solver for Linear Programming details the practical innovations that give cuPDLPx its performance edge.
-
Theoretical Paper: Restarted Halpern PDHG for Linear Programming provides the mathematical foundation for our method.
- GPU: NVIDIA GPU with CUDA 12.4+.
- Build Tools: CMake (≥ 3.22), GCC, NVCC.
Clone the repository and compile the project using CMake.
git clone [email protected]:MIT-Lu-Lab/cuPDLPx.git
cd cuPDLPx
cmake -B build
cmake --build build --clean-firstThis will create the solver binary at ./build/cupdlpx.
Run a small test problem to confirm that the solver was built correctly.
# 1. Download a test instance from the MIPLIB library
wget -P test/ https://miplib.zib.de/WebData/instances/2club200v15p5scn.mps.gz
# 2. Solve the problem and write output to the current directory (.)
./build/cupdlpx test/2club200v15p5scn.mps.gz test/If the solver runs and creates output files, your installation is successful.
To use cuPDLPx in Python, you can install the pre-built package cupdlpx directly from PyPI:
pip install cupdlpxOr build from source:
git clone https://github.com/MIT-Lu-Lab/cuPDLPx.git
cd cuPDLPx
pip install .
After building the project, the ./build/cupdlpx binary can be invoked from the command line as follows:
./build/cupdlpx [OPTIONS] <mps_file> <output_directory><mps_file>: The path to the input linear programming problem. Both plain (.mps) and gzipped (.mps.gz) files are supported.<output_directory>: The directory where the output files will be saved.
| Option | Type | Description | Default |
|---|---|---|---|
-h, --help |
flag |
Display the help message. | N/A |
-v, --verbose |
flag |
Enable verbose logging. | false |
--time_limit |
double |
Time limit in seconds. | 3600.0 |
--iter_limit |
int |
Iteration limit. | 2147483647 |
--eps_opt |
double |
Relative optimality tolerance. | 1e-4 |
--eps_feas |
double |
Relative feasibility tolerance. | 1e-4 |
--eps_infeas_detect |
double |
Infeasibility detection tolerance. | 1e-10 |
-f,--feasibility_polishing |
flag |
Run the polishing loop | false |
--eps_feas_polish |
double |
Relative tolerance for polishing | 1e-6 |
The solver generates three text files in the specified <output_directory>. The filenames are derived from the input file's basename. For an input INSTANCE.mps.gz, the output will be:
<output_directory>/
├── INSTANCE_summary.txt # Statistics, timings, and termination status
├── INSTANCE_primal_solution.txt # Primal solution vector
└── INSTANCE_dual_solution.txt # Dual solution vector
The cupdlpx Python package supports building and solving LPs directly with NumPy and SciPy.
Documentation and examples are available in the Python API Guide.
The public C API is defined in header file include/cupdlpx.h. A detailed description with usage examples can be found in the C API Guide.
If you use cuPDLPx or the ideas in your work, please cite the source below.
@article{lu2025cupdlpx,
title={cuPDLPx: A Further Enhanced GPU-Based First-Order Solver for Linear Programming},
author={Lu, Haihao and Peng, Zedong and Yang, Jinwen},
journal={arXiv preprint arXiv:2507.14051},
year={2025}
}
@article{lu2024restarted,
title={Restarted Halpern PDHG for linear programming},
author={Lu, Haihao and Yang, Jinwen},
journal={arXiv preprint arXiv:2407.16144},
year={2024}
}cuPDLPx is licensed under the Apache 2.0 License. See the LICENSE file for details.