PEPit.jl

PEPit.jl is a Julia implementation of Performance Estimation Programming for computer-assisted worst-case analysis of first-order algorithms. A user describes an algorithm in symbolic Julia code, declares the class of functions or operators under study, specifies initial conditions and performance metrics, and asks PEPit.jl to build and solve the resulting semidefinite program through JuMP-compatible solvers.

The package follows the mathematical workflow of Python PEPit, but the documentation here describes the Julia API and implementation. In particular, points, gradients, and iterates are represented by Point objects; function values and inner products are represented by Expression objects; and solve! turns those symbolic relations into a JuMP SDP with a Gram matrix variable.

Documentation map

  • Quick start: build and solve a first PEP in Julia.
  • Core workflow: main PEP objects and solver entry points.
  • Function classes: interpolation models for convex, smooth, strongly convex, Lipschitz, and related function classes.
  • Operator classes: monotone, cocoercive, Lipschitz, nonexpansive, and linear operator models.
  • Primitive steps: reusable symbolic building blocks for algorithm descriptions.
  • Examples: categorized links to Julia example scripts.
  • Tutorials: literate Julia, notebook, PDF, and Pluto tutorial assets.

Solvers

The default solver in solve! is Clarabel.Optimizer. The package also supports other JuMP-compatible conic solvers, including Mosek when a license is available. Solver choice is passed as a keyword argument:

tau = solve!(problem; solver = Clarabel.Optimizer, verbose = false)

Explicit dual certificates

Use solve_dual! to build the primal SDP, dualize it with Dualization.jl, and return a DualPEPCertificate. The certificate stores multipliers for performance metrics, initial conditions, class constraints, and PSD blocks.