diff --git a/.pylintrc b/.pylintrc
index b26aeee4f..23aacadaa 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -129,6 +129,7 @@ disable=R,
wrong-import-order,
xrange-builtin,
zip-builtin-not-iterating,
+ invalid-name,
[REPORTS]
diff --git a/docs/api/linprog.rst b/docs/api/linprog.rst
new file mode 100644
index 000000000..927233fee
--- /dev/null
+++ b/docs/api/linprog.rst
@@ -0,0 +1,12 @@
+Linear programming
+==================
+
+.. currentmodule:: optax.linprog
+
+.. autosummary::
+ rhpdhg
+
+
+Restarted Halpern primal-dual hybrid gradient method
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. autofunction:: rhpdhg
diff --git a/docs/gallery.rst b/docs/gallery.rst
index 5f7a3b134..5d96431b2 100644
--- a/docs/gallery.rst
+++ b/docs/gallery.rst
@@ -209,7 +209,7 @@
.. only:: html
.. image:: /images/examples/linear_assignment_problem.png
- :alt:
+ :alt: Linear assignment problem.
:doc:`_collections/examples/linear_assignment_problem`
@@ -219,6 +219,23 @@
+.. raw:: html
+
+
+
+.. only:: html
+
+ .. image:: /images/examples/linear_programming.png
+ :alt: Linear programming.
+
+ :doc:`_collections/examples/linear_programming`
+
+.. raw:: html
+
+
Linear programming.
+
+
+
.. raw:: html
diff --git a/docs/images/examples/linear_programming.png b/docs/images/examples/linear_programming.png
new file mode 100644
index 000000000..95fdd200c
Binary files /dev/null and b/docs/images/examples/linear_programming.png differ
diff --git a/docs/index.rst b/docs/index.rst
index 694dadc97..6bacaeef8 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -54,6 +54,7 @@ for instructions on installing JAX.
:caption: 📖 Reference
:maxdepth: 2
+ api/linprog
api/assignment
api/optimizers
api/transformations
diff --git a/examples/linear_programming.ipynb b/examples/linear_programming.ipynb
new file mode 100644
index 000000000..980e33b02
--- /dev/null
+++ b/examples/linear_programming.ipynb
@@ -0,0 +1,229 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "205fbe7e-4a73-4ee0-b785-311b870357cf",
+ "metadata": {},
+ "source": [
+ "# Linear programming\n",
+ "\n",
+ "[Linear programming](https://en.wikipedia.org/wiki/Linear_programming) is one of the most important problems in optimization.\n",
+ "\n",
+ "A linear program is an optimization problem of the following form:\n",
+ "\n",
+ "$$\n",
+ "\\begin{align*}\n",
+ " \\text{minimize} \\quad & c \\cdot x \\\\\n",
+ " \\text{subject to} \\quad\n",
+ " & A x = b \\\\\n",
+ " & G x \\leq h\n",
+ "\\end{align*}\n",
+ "$$\n",
+ "\n",
+ "where:\n",
+ "- $c \\in \\mathbb{R}^d$ is a cost vector\n",
+ "- $A \\in \\mathbb{R}^{n \\times d}$ is an equality constraint matrix\n",
+ "- $b \\in \\mathbb{R}^n$ is an equality constraint vector\n",
+ "- $G \\in \\mathbb{R}^{m \\times d}$ is an inequality constraint matrix\n",
+ "- $h \\in \\mathbb{R}^m$ is an inequality constraint vector\n",
+ "\n",
+ "A linear program solver returns a solution $x \\in \\mathbb{R}^d$ to this problem, if one exists.\n",
+ "\n",
+ "Optax has a solver based on the [restarted Halpern primal-dual hybrid gradient (RHPDHG) method](https://arxiv.org/abs/2407.16144), which is a [matrix-free](https://en.wikipedia.org/wiki/Matrix-free_methods) [primal-dual](https://en.wikipedia.org/wiki/Duality_(optimization)) algorithm."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "05d9b905-46aa-477d-ae96-632e797faa9a",
+ "metadata": {},
+ "source": [
+ "## Example\n",
+ "\n",
+ "Consider the following problem:\n",
+ "\n",
+ "$$\n",
+ "\\begin{align*}\n",
+ "\\text{maximize} \\quad 2 x + y & \\\\\n",
+ "\\text{subject to} \\quad\n",
+ "3 x + y &\\leq 21 \\\\\n",
+ "x + y &\\leq 9 \\\\\n",
+ "x + 4 y &\\leq 24\n",
+ "\\end{align*}\n",
+ "$$\n",
+ "\n",
+ "Note that this is a maximization problem.\n",
+ "\n",
+ "First, let's put this problem into the matrix form we described in the introduction."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "e527600d-b231-4c8c-b02a-c73971042fda",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from jax import numpy as jnp\n",
+ "\n",
+ "# We are trying to maximize rather than minimize, so we use a minus sign here.\n",
+ "c = -jnp.array([2, 1])\n",
+ "\n",
+ "# Our problem has no equality constraints, so we use a zero-size A and zero-size b.\n",
+ "A = jnp.zeros([0, 2])\n",
+ "b = jnp.zeros(0)\n",
+ "\n",
+ "G = jnp.array([[3, 1], [1, 1], [1, 4]])\n",
+ "h = jnp.array([21, 9, 24])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "535c5d85-3fa3-4f8b-9b34-35542d81107b",
+ "metadata": {},
+ "source": [
+ "Next, let's import optax and solve it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "d49955a5-573e-4be9-b759-104c18d49bbe",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[5.999964 2.999992] -14.99992\n"
+ ]
+ }
+ ],
+ "source": [
+ "import optax\n",
+ "\n",
+ "x = optax.linprog.rhpdhg(c, A, b, G, h, 1_000_000)['primal']\n",
+ "print(x, c @ x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "469ff08a-6a17-486f-a5f8-9c4ef79dd37c",
+ "metadata": {},
+ "source": [
+ "Up to a small numerical error, the solution is $(6, 3)$, with a profit of $15$.\n",
+ "\n",
+ "Finally, let's plot the solution:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "9688e718-b05a-4869-8a6f-309b6ca1b4de",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "