SkillAgentSearch skills...

CuPDLPx

A GPU-Accelerated First-Order LP Solver

Install / Use

/learn @MIT-Lu-Lab/CuPDLPx

README

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.20), GCC, NVCC.

SpMV backend is selected automatically at compile time based on cuSPARSE version:

  • cusparseSpMV — CUDA 12.4 – 13.1 (cuSPARSE < 12.7.3)
  • cusparseSpMVOp — CUDA 13.1 Update 1+ (cuSPARSE ≥ 12.7.3)

Build from Source

Clone the repository and compile the project using CMake.

git clone git@github.com: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 | Verbose logging (enabled by default). | true | | -q, --quiet | flag | Disable verbose logging. | false | | --time_limit | double | Time limit in seconds. | 3600.0 | | --iter_limit | int | Iteration limit. | 2147483647 | | --opt_norm | string | Norm for optimality criteria: l2 or linf | l2 | | --eps_opt | double | Relative optimality tolerance. | 1e-4 | | --eps_feas | double | Relative feasibility tolerance. | 1e-4 | | --l_inf_ruiz_iter | int | Iterations for L-inf Ruiz rescaling| 10 | | --no_pock_chambolle | flag | Disable Pock-Chambolle rescaling | enabled | | --pock_chambolle_alpha | float | Value for Pock-Chambolle alpha | 1.0 | | --no_bound_obj_rescaling | flag | Disable bound objective rescaling | enabled | | --eval_freq | int | Termination evaluation frequency | 200 | | --sv_max_iter | int | Max iterations for singular value estimation | 5000 | | --sv_tol | float | Tolerance for singular value estimation | 1e-4 | | --no_presolve | flag | Disable presolve | enabled | | -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.

Julia Interface

CuPDLPx.jl provides a JuMP/MathOptInterface wrapper for cuPDLPx, enabling cuPDLPx to be used as a solver backend for JuMP models. Documentation and examples are available at: CuPDLPx.jl.

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.

View on GitHub
GitHub Stars138
CategoryEducation
Updated11h ago
Forks15

Languages

Cuda

Security Score

100/100

Audited on Apr 8, 2026

No findings