Skip to content

MIT-Lu-Lab/cuPDLPx

Repository files navigation

cuPDLPx: A GPU-Accelerated First-Order LP Solver

License GitHub release PyPI version arXiv arXiv

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

$$\begin{aligned} \min_{x} \quad & c^\top x \\\ \text{s.t.} \quad & \ell_c \le Ax \le u_c, \\\ & \ell_v \le x \le u_v. \end{aligned}$$

Our work is presented in two papers:

Installation

Requirements

  • GPU: NVIDIA GPU with CUDA 12.4+.
  • Build Tools: CMake (≥ 3.22), GCC, NVCC.

Build from Source

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-first

This will create the solver binary at ./build/cupdlpx.

Verifying the Installation

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.

Python Package Installation

To use cuPDLPx in Python, you can install the pre-built package cupdlpx directly from PyPI:

pip install cupdlpx

Or build from source:

git clone https://github.com/MIT-Lu-Lab/cuPDLPx.git
cd cuPDLPx
pip install .

Usage & Interfaces

Command-line Interface

After building the project, the ./build/cupdlpx binary can be invoked from the command line as follows:

./build/cupdlpx [OPTIONS] <mps_file> <output_directory>

Arguments

  • <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.

Solver Options

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

Output Files

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

Python Interface

The cupdlpx Python package supports building and solving LPs directly with NumPy and SciPy. Documentation and examples are available in the Python API Guide.

C Interface

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.

Reference

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}
}

License

cuPDLPx is licensed under the Apache 2.0 License. See the LICENSE file for details.