From 72183f5835886b499521fc5f9c204dee549015ce Mon Sep 17 00:00:00 2001 From: carlosgmartin Date: Tue, 17 Dec 2024 09:43:06 -0800 Subject: [PATCH] Add linear program solver based on the restarted Halpern primal-dual hybrid gradient (rHPDHG) algorithm. --- .pylintrc | 1 + docs/api/linprog.rst | 12 + docs/gallery.rst | 19 +- docs/images/examples/linear_programming.png | Bin 0 -> 78609 bytes docs/index.rst | 1 + examples/linear_programming.ipynb | 229 ++++++++++++++++++++ optax/__init__.py | 2 + optax/_src/alias.py | 2 +- optax/linprog/__init__.py | 19 ++ optax/linprog/_rhpdhg.py | 215 ++++++++++++++++++ optax/linprog/_rhpdhg_test.py | 95 ++++++++ pyproject.toml | 3 +- 12 files changed, 595 insertions(+), 3 deletions(-) create mode 100644 docs/api/linprog.rst create mode 100644 docs/images/examples/linear_programming.png create mode 100644 examples/linear_programming.ipynb create mode 100644 optax/linprog/__init__.py create mode 100644 optax/linprog/_rhpdhg.py create mode 100644 optax/linprog/_rhpdhg_test.py 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 0000000000000000000000000000000000000000..95fdd200c1d046aa19d28d49ee6dae638a3a27cc GIT binary patch literal 78609 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

TYL>Zi^CrdJJi`8T$*h=W0{Y~``QL3h69 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" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "def plot_lp(c, A, b, G, h, x):\n", + " fig, ax = plt.subplots()\n", + "\n", + " for Ai, bi in zip(A, b):\n", + " ax.axline((0, bi / Ai[1]), (bi / Ai[0], 0), label=\"equality constraint\", c=\"purple\")\n", + "\n", + " for Gi, hi in zip(G, h):\n", + " ax.axline((0, hi / Gi[1]), (hi / Gi[0], 0), label=\"inequality constraint\", c=\"orange\")\n", + "\n", + " plt.arrow(x[0], x[1], -c[0].item(), -c[1].item(), width=0.1, ec=\"none\", fc=\"green\", label=\"profit\", zorder=2)\n", + "\n", + " ax.plot(*x, \"o\", label=\"solution\")\n", + "\n", + " ax.legend()\n", + " ax.set(aspect=\"equal\", xlim=(-1, 13), ylim=(-1, 13))\n", + " plt.show()\n", + "\n", + "plot_lp(c, A, b, G, h, x)" + ] + }, + { + "cell_type": "markdown", + "id": "5090f3a1-92b7-4835-b953-6bb571ec2828", + "metadata": {}, + "source": [ + "As you can see, the solution goes \"as far as it can go\" in the direction of increasing profit.\n", + "\n", + "If we change the profit vector, we end up in a different place, because we want to maximize in a different direction:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "05284d21-3d97-4a11-a84a-0e88830ce00b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4.0000005 5. ] -19.0\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "

" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "c = -jnp.array([1, 3])\n", + "x = optax.linprog.rhpdhg(c, A, b, G, h, 1_000_000)['primal']\n", + "print(x, c @ x)\n", + "plot_lp(c, A, b, G, h, x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16ad881e-bee1-4981-8b71-ee2f1fcdab62", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/optax/__init__.py b/optax/__init__.py index 0840b1d5a..f623db676 100644 --- a/optax/__init__.py +++ b/optax/__init__.py @@ -19,6 +19,7 @@ from optax import assignment from optax import contrib +from optax import linprog from optax import losses from optax import monte_carlo from optax import perturbations @@ -364,6 +365,7 @@ "lion", "linear_onecycle_schedule", "linear_schedule", + "linprog", "log_cosh", "lookahead", "LookaheadParams", diff --git a/optax/_src/alias.py b/optax/_src/alias.py index b2c2d1865..d251e2341 100644 --- a/optax/_src/alias.py +++ b/optax/_src/alias.py @@ -2482,7 +2482,7 @@ def lbfgs( ... ) ... params = optax.apply_updates(params, updates) ... print('Objective function: ', f(params)) - Objective function: 7.5166864 + Objective function: 7.516686... Objective function: 7.460699e-14 Objective function: 2.6505726e-28 Objective function: 0.0 diff --git a/optax/linprog/__init__.py b/optax/linprog/__init__.py new file mode 100644 index 000000000..6e27365a2 --- /dev/null +++ b/optax/linprog/__init__.py @@ -0,0 +1,19 @@ +# Copyright 2024 DeepMind Technologies Limited. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""The linear programming sub-package.""" + +# pylint:disable=g-importing-member + +from optax.linprog._rhpdhg import solve_general as rhpdhg diff --git a/optax/linprog/_rhpdhg.py b/optax/linprog/_rhpdhg.py new file mode 100644 index 000000000..01a98b155 --- /dev/null +++ b/optax/linprog/_rhpdhg.py @@ -0,0 +1,215 @@ +# Copyright 2024 DeepMind Technologies Limited. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""The restarted Halpern primal-dual hybrid gradient method.""" + +from jax import lax, numpy as jnp +from optax import tree_utils as otu + + +def solve_canonical( + c, A, b, iters, reflect=True, restarts=True, tau=None, sigma=None +): + r"""Solves a linear program using the restarted Halpern primal-dual hybrid + gradient (RHPDHG) method. + + Minimizes :math:`c \cdot x` subject to :math:`A x = b` and :math:`x \geq 0`. + + See also `MPAX `_. + + Args: + c: Cost vector. + A: Equality constraint matrix. + b: Equality constraint vector. + iters: Number of iterations to run the solver for. + reflect: Use reflection. See paper for details. + restarts: Use restarts. See paper for details. + tau: Primal step size. See paper for details. + sigma: Dual step size. See paper for details. + + Returns: + A dictionary whose entries are as follows: + - primal: The final primal solution. + - dual: The final dual solution. + - primal_iterates: The primal iterates. + - dual_iterates: The dual iterates. + + Examples: + >>> from jax import numpy as jnp + >>> import optax + >>> c = -jnp.array([2, 1]) + >>> A = jnp.zeros([0, 2]) + >>> b = jnp.zeros(0) + >>> G = jnp.array([[3, 1], [1, 1], [1, 4]]) + >>> h = jnp.array([21, 9, 24]) + >>> x = optax.linprog.rhpdhg(c, A, b, G, h, 1_000_000)['primal'] + >>> print(x[0]) + 5.99... + >>> print(x[1]) + 2.99... + + References: + Haihao Lu, Jinwen Yang, `Restarted Halpern PDHG for Linear Programming + `_, 2024 + Haihao Lu, Zedong Peng, Jinwen Yang, `MPAX: Mathematical Programming in JAX + `_, 2024 + """ + + if tau is None or sigma is None: + A_norm = jnp.linalg.norm(A, axis=(0, 1), ord=2) + if tau is None: + tau = 1 / (2 * A_norm) + if sigma is None: + sigma = 1 / (2 * A_norm) + + def T(z): + # primal dual hybrid gradient (PDHG) + x, y = z + xn = x + tau * (y @ A - c) + xn = xn.clip(min=0) + yn = y + sigma * (b - A @ (2 * xn - x)) + return xn, yn + + def H(z, k, z0): + # Halpern PDHG + Tz = T(z) + if reflect: + zc = otu.tree_sub(otu.tree_scalar_mul(2, Tz), z) + else: + zc = Tz + kp2 = k + 2 + zn = otu.tree_add( + otu.tree_scalar_mul((k + 1) / kp2, zc), + otu.tree_scalar_mul(1 / kp2, z0), + ) + return zn, Tz + + def update(carry, _): + z, k, z0, d0 = carry + zn, Tz = H(z, k, z0) + + if restarts: + d = otu.tree_l2_norm(otu.tree_sub(z, Tz), squared=True) + restart = d <= d0 * jnp.exp(-2) + new_carry = otu.tree_where( + restart, + (zn, 0, zn, d), + (zn, k + 1, z0, d0), + ) + else: + new_carry = zn, k + 1, z0, d0 + + return new_carry, z + + def run(): + m, n = A.shape + x = jnp.zeros(n) + y = jnp.zeros(m) + z0 = x, y + d0 = otu.tree_l2_norm(otu.tree_sub(z0, T(z0)), squared=True) + (z, _, _, _), zs = lax.scan(update, (z0, 0, z0, d0), length=iters) + x, y = z + xs, ys = zs + return { + "primal": x, + "dual": y, + "primal_iterates": xs, + "dual_iterates": ys, + } + + return run() + + +def general_to_canonical(c, A, b, G, h): + """Converts a linear program from general form to canonical form. + + The solution to the new linear program will consist of the concatenation of + - the positive part of x + - the negative part of x + - slacks + + That is, we go from + + Minimize c · x subject to + A x = b + G x ≤ h + + to + + Minimize c · (x⁺ - x⁻) subject to + A (x⁺ - x⁻) = b + G (x⁺ - x⁻) + s = h + x⁺, x⁻, s ≥ 0 + + Args: + c: Cost vector. + A: Equality constraint matrix. + b: Equality constraint vector. + G: Inequality constraint matrix. + h: Inequality constraint vector. + + Returns: + A triple (c', A', b') representing the corresponding canonical form. + """ + c_can = jnp.concatenate([c, -c, jnp.zeros(h.size)]) + G_ = jnp.concatenate([G, -G, jnp.eye(h.size)], 1) + A_ = jnp.concatenate([A, -A, jnp.zeros([b.size, h.size])], 1) + A_can = jnp.concatenate([A_, G_], 0) + b_can = jnp.concatenate([b, h]) + return c_can, A_can, b_can + + +def solve_general( + c, A, b, G, h, iters, reflect=True, restarts=True, tau=None, sigma=None +): + r"""Solves a linear program using the restarted Halpern primal-dual hybrid + gradient (RHPDHG) method. + + Minimizes :math:`c \cdot x` subject to :math:`A x = b` and :math:`G x \leq h`. + + See also `MPAX `_. + + Args: + c: Cost vector. + A: Equality constraint matrix. + b: Equality constraint vector. + G: Inequality constraint matrix. + h: Inequality constraint vector. + iters: Number of iterations to run the solver for. + reflect: Use reflection. See paper for details. + restarts: Use restarts. See paper for details. + tau: Primal step size. See paper for details. + sigma: Dual step size. See paper for details. + + Returns: + A dictionary whose entries are as follows: + - primal: The final primal solution. + - slacks: The final primal slack values. + - canonical_result: The result for the canonical program that was used + internally to find this solution. See paper for details. + + References: + Haihao Lu, Jinwen Yang, `Restarted Halpern PDHG for Linear Programming + `_, 2024 + Haihao Lu, Zedong Peng, Jinwen Yang, `MPAX: Mathematical Programming in JAX + `_, 2024 + """ + canonical = general_to_canonical(c, A, b, G, h) + result = solve_canonical(*canonical, iters, reflect, restarts, tau, sigma) + x_pos, x_neg, slacks = jnp.split(result["primal"], [c.size, c.size * 2]) + return { + "primal": x_pos - x_neg, + "slacks": slacks, + "canonical_result": result, + } diff --git a/optax/linprog/_rhpdhg_test.py b/optax/linprog/_rhpdhg_test.py new file mode 100644 index 000000000..d2d2832b9 --- /dev/null +++ b/optax/linprog/_rhpdhg_test.py @@ -0,0 +1,95 @@ +# Copyright 2024 DeepMind Technologies Limited. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for the restarted Halpern primal-dual hybrid gradient method.""" + +from functools import partial + +from absl.testing import absltest +from absl.testing import parameterized +import jax +from jax import numpy as jnp +import numpy as np +import cvxpy as cp + +from optax.linprog import rhpdhg + + +def solve_cvxpy(c, A, b, G, h): + x = cp.Variable(c.size) + constraints = [] + if A.shape[0] > 0: + constraints.append(A @ x == b) + if G.shape[0] > 0: + constraints.append(G @ x <= h) + objective = cp.Minimize(c @ x) + problem = cp.Problem(objective, constraints) + problem.solve(solver='GLPK') + return x.value, problem.status + + +class RHPDHGTest(parameterized.TestCase): + + def setUp(self): + super().setUp() + self.f = jax.jit(partial(rhpdhg, iters=100_000)) + + @parameterized.parameters( + dict(n_vars=n_vars, n_eq=n_eq, n_ineq=n_ineq) + for n_vars in range(8) + for n_eq in range(n_vars) + for n_ineq in range(8) + if n_eq + n_ineq >= n_vars + # Make sure set of solvable LPs with these shapes is not null in measure. + ) + def test_hungarian_algorithm(self, n_vars, n_eq, n_ineq): + # Find a solvable LP. + while True: + + c = np.random.normal(size=(n_vars,)) + A = np.random.normal(size=(n_eq, n_vars)) + b = np.random.normal(size=(n_eq,)) + G = np.random.normal(size=(n_ineq, n_vars)) + h = np.random.normal(size=(n_ineq,)) + + # For numerical testing purposes, constrain x to [-limit, limit]. + limit = 5 + G = jnp.concatenate([G, jnp.eye(n_vars), -jnp.eye(n_vars)]) + h = jnp.concatenate([h, jnp.full(n_vars * 2, limit)]) + + r, status = solve_cvxpy(c, A, b, G, h) + + if status == 'optimal': + break + + result = self.f(c, A, b, G, h) + x = result['primal'] + + rtol = 1e-2 + atol = 1e-2 + + with self.subTest('x approximately satisfies equality constraints'): + np.testing.assert_allclose(A @ x, b, rtol=rtol, atol=atol) + + with self.subTest('x approximately satisfies inequality constraints'): + np.testing.assert_allclose((G @ x).clip(min=h), h, rtol=rtol, atol=atol) + + with self.subTest('x is approximately as good as the reference solution'): + cx = c @ x + cr = c @ r + np.testing.assert_allclose(cx.clip(min=cr), cr, rtol=rtol, atol=atol) + + +if __name__ == '__main__': + absltest.main() diff --git a/pyproject.toml b/pyproject.toml index 7bccb6db3..1d21ce9ea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,8 @@ test = [ "dm-tree>=0.1.7", "flax>=0.5.3", "scipy>=1.7.1", - "scikit-learn" + "scikit-learn", + "cvxpy[GLPK]", ] examples = [