{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "E_-S77MmiOou" }, "source": [ "# Low-Rank Gromov-Wasserstein\n", "\n", "We try in this colab the low-rank (LR) Gromov-Wasserstein Solver, proposed by {cite}`scetbon:22`, a follow up to the LR Sinkhorn solver in {cite}`scetbon:21`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import sys\n", "\n", "if \"google.colab\" in sys.modules:\n", " !pip install -q git+https://github.com/ott-jax/ott@main" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import jax\n", "import jax.numpy as jnp\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "from ott.geometry import pointcloud\n", "from ott.problems.quadratic import quadratic_problem\n", "from ott.solvers.quadratic import gromov_wasserstein" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "executionInfo": { "elapsed": 3060, "status": "ok", "timestamp": 1642798306380, "user": { "displayName": "Marco Cuturi", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gj0UBKLFbdRpYhnFiILEQ2AgXibacTBJBwmBsE4=s64", "userId": "04861232750708981029" }, "user_tz": -60 }, "id": "PfiRNdhVW8hT" }, "outputs": [], "source": [ "def create_points(rng, n, m, d1, d2):\n", " rngs = jax.random.split(rng, 5)\n", " x = jax.random.uniform(rngs[0], (n, d1))\n", " y = jax.random.uniform(rngs[1], (m, d2))\n", " a = jax.random.uniform(rngs[2], (n,))\n", " b = jax.random.uniform(rngs[3], (m,))\n", " a = a / jnp.sum(a)\n", " b = b / jnp.sum(b)\n", " z = jax.random.uniform(rngs[4], (m, d1))\n", " return x, y, a, b, z\n", "\n", "\n", "rng = jax.random.PRNGKey(0)\n", "n, m, d1, d2 = 24, 17, 2, 3\n", "x, y, a, b, z = create_points(rng, n, m, d1, d2)" ] }, { "cell_type": "markdown", "metadata": { "id": "y4aQGprB_oeW" }, "source": [ "Create two toy point clouds of heterogeneous size, and add a third geometry to provide a fused problem {cite}`vayer:20`." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "executionInfo": { "elapsed": 53, "status": "ok", "timestamp": 1642798306574, "user": { "displayName": "Marco Cuturi", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gj0UBKLFbdRpYhnFiILEQ2AgXibacTBJBwmBsE4=s64", "userId": "04861232750708981029" }, "user_tz": -60 }, "id": "pN_f36ACALET" }, "outputs": [], "source": [ "geom_xx = pointcloud.PointCloud(x)\n", "geom_yy = pointcloud.PointCloud(y)\n", "geom_xy = pointcloud.PointCloud(x, z)\n", "prob = quadratic_problem.QuadraticProblem(\n", " geom_xx,\n", " geom_yy,\n", " geom_xy=geom_xy,\n", " a=a,\n", " b=b,\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "dS49krqd_weJ" }, "source": [ "Solve the problem using the Solve the problem using the low-rank solver, utilizing {class}`~ott.solvers.linear.sinkhorn_lr.LRSinkhorn` solver under the hood." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "executionInfo": { "elapsed": 10229, "status": "ok", "timestamp": 1642798316999, "user": { "displayName": "Marco Cuturi", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gj0UBKLFbdRpYhnFiILEQ2AgXibacTBJBwmBsE4=s64", "userId": "04861232750708981029" }, "user_tz": -60 }, "id": "bVmhqrCdkXxw" }, "outputs": [], "source": [ "solver = gromov_wasserstein.GromovWasserstein(rank=6)\n", "ot_gwlr = solver(prob)" ] }, { "cell_type": "markdown", "metadata": { "id": "vxDoBrusUHmq" }, "source": [ "Run it with entropic {class}`~ott.solvers.quadratic.gromov_wasserstein.GromovWasserstein` solver for the sake of comparison." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "executionInfo": { "elapsed": 5119, "status": "ok", "timestamp": 1642798322374, "user": { "displayName": "Marco Cuturi", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gj0UBKLFbdRpYhnFiILEQ2AgXibacTBJBwmBsE4=s64", "userId": "04861232750708981029" }, "user_tz": -60 }, "id": "i6viNhAp8txm" }, "outputs": [], "source": [ "solver = gromov_wasserstein.GromovWasserstein(epsilon=0.05)\n", "ot_gw = solver(prob)" ] }, { "cell_type": "markdown", "metadata": { "id": "w35fLv3oIwLW" }, "source": [ "One can notice that their outputs are quantitatively similar." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "height": 545 }, "executionInfo": { "elapsed": 785, "status": "ok", "timestamp": 1642798323297, "user": { "displayName": "Marco Cuturi", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gj0UBKLFbdRpYhnFiILEQ2AgXibacTBJBwmBsE4=s64", "userId": "04861232750708981029" }, "user_tz": -60 }, "id": "HMfUh6uE8kdG", "outputId": "3feef227-b93c-4783-fba0-09e366f416ea" }, "outputs": [ { "data": { "image/png": "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U6dOWdQ3GAwYMmQItFotvvjiC4sv0Htt3rwZ06ZNw0svvYQlS5bUWe7q1au19n3zzTf417/+JZ0LuDv9eNu2bRbbwoULAQCzZs3Ctm3bpJlEHTt2xLFjx/C///3P4rgbN26EVqtF9+7dAQBNmzbF008/jYMHD1q81++//x4HDx7Eb37zG2mftceUy8rKAgC8+OKLdb5/anwemTup16xZI6Vp5KZPn4533nkHu3btQt++ffHaa6/B3d0df/vb31BRUVFrimHNl//p06fx7rvvSvv79++Pzz//HF5eXrXukrWFn58f+vfvj/feew9VVVVo2bIlvvzySxQUFNh9zHv17t0bO3bswNNPP40XXngB27dvh4eHh2LZ9u3b409/+hMWLlyIfv364fnnn4eXlxf+85//ICwsDOnp6WjRogVmz56N+fPnIyEhAc8++yxOnz6NDz/8EL169cLLL78MAPj6668xdepUjBw5Eh07dsSdO3fw8ccfw83NDSNGjJDO2aNHD3z11VdYsmSJlNaLiYkBcHea64ABA7Bnz577vseYmBiMHDkSs2fPxpUrV9C+fXusX78eFy5cwOrVqy3Kjh07Fnv37rUIbgkJCTh//jxmzZqFAwcO4MCBA9JrISEh0hfq4cOHMXbsWAQGBmLw4MH45JNPLI7dp08fqfeXlJQEb29v9OnTB8HBwfjuu++watUq+Pj44C9/+YtUR+ku72bNmgEAevXqZXGH+cyZM/H555+jX79+mDp1KgIDA/HZZ5/h888/x29/+1uLVNq7776LnJwcPPXUU5g2bRoAYNmyZQgICMCcOXPsOiYAVFdXY/PmzejduzfatWtX918KNT7OHAB5GGoGbOvaagbi8vPzRXx8vGjSpInw8fERgwYNEgcPHlQ8Zs3gcXFxsbTvwIEDAkCtqY11qRlgvnr1aq3XLl68KIYPHy6aNWsm/P39xciRI8Xly5cFAJGWlvbAY9S854KCAmkfFO6k3rFjh3B3dxdJSUkPHFRfs2aN+NWvfiW8vLxE8+bNxYABA8SuXbssyixfvlxEREQIDw8PERISIiZPnix+/vln6fXz58+LV199VbRr107odDoREBAgBg0aJL766iuL45w6dUr0799fmmYpH7CGldNchbg7A+zNN98Uer1eeHl5iV69eons7Oxa5QYMGCDu/adwv8+M/PwP+nytXbtW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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_ot(ot, leg):\n", " plt.imshow(ot.matrix, cmap=\"Purples\")\n", " plt.colorbar()\n", " plt.title(leg + \" cost: \" + str(ot.costs[ot.costs > 0][-1]))\n", " plt.show()\n", "\n", "\n", "plot_ot(ot_gwlr, \"Low rank\")\n", "plot_ot(ot_gw, \"Entropic\")" ] } ], "metadata": { "colab": { "collapsed_sections": [], "last_runtime": { "build_target": "//learning/deepmind/public/tools/ml_python:ml_notebook", "kind": "private" }, "name": "GWLRSinkhorn.ipynb", "provenance": [ { "file_id": "1AYbnnVVudg2LCcmepy2CL8g00EzOx4Jx", "timestamp": 1642072748057 } ] }, "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.10.8" } }, "nbformat": 4, "nbformat_minor": 1 }