summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémi Flamary <remi.flamary@gmail.com>2018-08-29 14:10:40 +0200
committerRémi Flamary <remi.flamary@gmail.com>2018-08-29 14:10:40 +0200
commit1ec01f082a34c1086ef2df94b78a5d640a66db07 (patch)
treedc905fe366cb4b04187d3b4c760d8a03575ee97b
parentf12153c0c1be6f6377ace0050201409ec1b7e829 (diff)
add notebooks from new examples
-rw-r--r--notebooks/plot_OT_1D_smooth.ipynb302
-rw-r--r--notebooks/plot_free_support_barycenter.ipynb169
-rw-r--r--notebooks/plot_stochastic.ipynb610
3 files changed, 1081 insertions, 0 deletions
diff --git a/notebooks/plot_OT_1D_smooth.ipynb b/notebooks/plot_OT_1D_smooth.ipynb
new file mode 100644
index 0000000..69e71da
--- /dev/null
+++ b/notebooks/plot_OT_1D_smooth.ipynb
@@ -0,0 +1,302 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# 1D smooth optimal transport\n",
+ "\n",
+ "\n",
+ "This example illustrates the computation of EMD, Sinkhorn and smooth OT plans\n",
+ "and their visualization.\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Author: Remi Flamary <remi.flamary@unice.fr>\n",
+ "#\n",
+ "# License: MIT License\n",
+ "\n",
+ "import numpy as np\n",
+ "import matplotlib.pylab as pl\n",
+ "import ot\n",
+ "import ot.plot\n",
+ "from ot.datasets import make_1D_gauss as gauss"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Generate data\n",
+ "-------------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "#%% parameters\n",
+ "\n",
+ "n = 100 # nb bins\n",
+ "\n",
+ "# bin positions\n",
+ "x = np.arange(n, dtype=np.float64)\n",
+ "\n",
+ "# Gaussian distributions\n",
+ "a = gauss(n, m=20, s=5) # m= mean, s= std\n",
+ "b = gauss(n, m=60, s=10)\n",
+ "\n",
+ "# loss matrix\n",
+ "M = ot.dist(x.reshape((n, 1)), x.reshape((n, 1)))\n",
+ "M /= M.max()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plot distributions and loss matrix\n",
+ "----------------------------------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAADFCAYAAABzYARGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xl4U2X2wPHvoWW1yFZEsSCgiGylQEUERHBQdFBRB0cEFVdcBmVUEHQQEZfB0UH9CeIwMo47KCqDK4iAICrSYgsUZEepiiJiEdm6vL8/ToKltCVt09ws5/M8edIkNzcnN2nOfXdxzmGMMcZUVBWvAzDGGBMdLKEYY4wJCksoxhhjgsISijHGmKCwhGKMMSYoLKEYY4wJCksoxhhjgsISijHGmKCwhGKMMSYo4r0OoKjExETXrFkzr8MwxhgDpKen/+ScaxjItmGXUJo1a0ZaWprXYRhjjAFE5OtAt7UqL2OMMUFhCcUYY0xQBJRQRORcEVkrIhtEZHQxj1cXkRm+x5eKSDPf/VVF5HkRWSkia0Tk7uCGb4wxJlwcsQ1FROKAycDZQDawTERmO+dWF9rsOmCnc+4kERkIPAJcBlwKVHfOtReRWsBqEXnVObcl2G/EGFN+ubm5ZGdns2/fPq9DMR6pUaMGSUlJVK1atdz7CKRRvguwwTm3CUBEpgP9gcIJpT8wzvf3TGCSiAjggKNEJB6oCRwAdpU7WhOQOXNg9WoYPhyqWKWmCUB2dja1a9emWbNm6L+uiSXOOXbs2EF2djbNmzcv934C+bk5Htha6Ha2775it3HO5QE5QAM0ufwGfA98AzzmnPu56AuIyFARSRORtO3bt5f5TZjfPfMM/PGPcMcdMGgQ7N/vdUQmEuzbt48GDRpYMolRIkKDBg0qXEKt7PPXLkA+0BhoDtwpIi2KbuScm+qcS3XOpTZsGFB3Z1OEczBmDNx8M5x3Hjz4IMyYoX/n5HgdnYkElkxiWzA+/0CqvL4FmhS6neS7r7htsn3VW3WAHcAg4APnXC7wo4gsAVKBTRUN3Bzqtttg0iS49lr4178gPh6aNtXbPXvCkiWQkOB1lMaYaBZICWUZ0FJEmotINWAgMLvINrOBIb6/BwDznS5W/w1wFoCIHAV0Bb4KRuDmd19/DZMnw9Ch8OyzmkwArrwSXn8dVqyAV17xNkZjjuShhx6ibdu2JCcnk5KSwtKlS70O6TAJvrOy7777jgEDBpS43S+//MLTTz9d6r66desGwMKFCzn//PPLFMesWbNYvfr3ZuyxY8cyb968Mu2jMhwxofjaRIYBc4A1wGvOuSwRGS8iF/o2mwY0EJENwB2Av2vxZCBBRLLQxPScc25FsN9ErHvuOb2++24oWmrt3x/atoVp00IflzGB+uyzz3jnnXdYvnw5K1asYN68eTRp0uTITzyCvLy8IER3uMaNGzNz5swSHy8tofhj+vTTT8v9+kUTyvjx4+nTp0+59xcsAU294px7D3ivyH1jC/29D+0iXPR5u4u73wRPfr4mlD59oLgp0ETguuu0kX7VKmjXLuQhmgjz179CRkZw95mSAk88UfLj33//PYmJiVSvXh2AxMTEg4999NFHjBgxgry8PE499VSmTJlC9erVD07TlJiYSFpaGiNGjGDhwoWMGzeOjRs3smnTJpo2bcpLL73EqFGj+OCDD6hSpQo33HADt956K+np6dxxxx3s3r2bxMRE/vvf/3LccccdEtfmzZsZNGgQu3fvpn///gfv37JlC+effz6rVq0iKyuLa665hgMHDlBQUMAbb7zBvffey8aNG0lJSeHss8+mX79+3HvvvdSrV4+vvvqKdevWkZCQwO7duwHYtWsX/fr1Y8OGDfTu3Zunn36aKlWqHLLNzJkzeeeddxg6dCizZ8/m448/5sEHH+SNN97ggQce4Pzzz2fAgAGlHq8hQ4bw9ttvk5uby+uvv84pp5wSrI8YsJHyEe+jj+CbbzRplOTKK6FqVSulmPB1zjnnsHXrVk4++WRuueUWPv74Y0B7n1199dXMmDGDlStXkpeXx5QpU464v9WrVzNv3jxeffVVpk6dypYtW8jIyGDFihUMHjyY3Nxcbr31VmbOnEl6ejrXXnstf/vb3w7bz/Dhw7n55ptZuXLlYcnG75lnnmH48OFkZGSQlpZGUlISEyZM4MQTTyQjI4NHH30UgOXLl/Pkk0+ybt26w/bxxRdf8NRTT7F69Wo2btzIm2++WeJ769atGxdeeCGPPvooGRkZnHjiiQcfO9LxSkxMZPny5dx888089thjRzyOZRV2k0Oaspk2DerXh4suKnmbxESt+nrxRZgwAXwngcYUq7SSRGVJSEggPT2dxYsXs2DBAi677DImTJhA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\n",
+ "text/plain": [
+ "<Figure size 460.8x216 with 1 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 360x360 with 3 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#%% plot the distributions\n",
+ "\n",
+ "pl.figure(1, figsize=(6.4, 3))\n",
+ "pl.plot(x, a, 'b', label='Source distribution')\n",
+ "pl.plot(x, b, 'r', label='Target distribution')\n",
+ "pl.legend()\n",
+ "\n",
+ "#%% plot distributions and loss matrix\n",
+ "\n",
+ "pl.figure(2, figsize=(5, 5))\n",
+ "ot.plot.plot1D_mat(a, b, M, 'Cost matrix M')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Solve EMD\n",
+ "---------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 360x360 with 3 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#%% EMD\n",
+ "\n",
+ "G0 = ot.emd(a, b, M)\n",
+ "\n",
+ "pl.figure(3, figsize=(5, 5))\n",
+ "ot.plot.plot1D_mat(a, b, G0, 'OT matrix G0')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Solve Sinkhorn\n",
+ "--------------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "It. |Err \n",
+ "-------------------\n",
+ " 0|7.958844e-02|\n",
+ " 10|5.921715e-03|\n",
+ " 20|1.238266e-04|\n",
+ " 30|2.469780e-06|\n",
+ " 40|4.919966e-08|\n",
+ " 50|9.800197e-10|\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 360x360 with 3 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#%% Sinkhorn\n",
+ "\n",
+ "lambd = 2e-3\n",
+ "Gs = ot.sinkhorn(a, b, M, lambd, verbose=True)\n",
+ "\n",
+ "pl.figure(4, figsize=(5, 5))\n",
+ "ot.plot.plot1D_mat(a, b, Gs, 'OT matrix Sinkhorn')\n",
+ "\n",
+ "pl.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Solve Smooth OT\n",
+ "--------------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 360x360 with 3 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 360x360 with 3 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#%% Smooth OT with KL regularization\n",
+ "\n",
+ "lambd = 2e-3\n",
+ "Gsm = ot.smooth.smooth_ot_dual(a, b, M, lambd, reg_type='kl')\n",
+ "\n",
+ "pl.figure(5, figsize=(5, 5))\n",
+ "ot.plot.plot1D_mat(a, b, Gsm, 'OT matrix Smooth OT KL reg.')\n",
+ "\n",
+ "pl.show()\n",
+ "\n",
+ "\n",
+ "#%% Smooth OT with KL regularization\n",
+ "\n",
+ "lambd = 1e-1\n",
+ "Gsm = ot.smooth.smooth_ot_dual(a, b, M, lambd, reg_type='l2')\n",
+ "\n",
+ "pl.figure(6, figsize=(5, 5))\n",
+ "ot.plot.plot1D_mat(a, b, Gsm, 'OT matrix Smooth OT l2 reg.')\n",
+ "\n",
+ "pl.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.6.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/notebooks/plot_free_support_barycenter.ipynb b/notebooks/plot_free_support_barycenter.ipynb
new file mode 100644
index 0000000..b8df589
--- /dev/null
+++ b/notebooks/plot_free_support_barycenter.ipynb
@@ -0,0 +1,169 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# 2D free support Wasserstein barycenters of distributions\n",
+ "\n",
+ "\n",
+ "Illustration of 2D Wasserstein barycenters if discributions that are weighted\n",
+ "sum of diracs.\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Author: Vivien Seguy <vivien.seguy@iip.ist.i.kyoto-u.ac.jp>\n",
+ "#\n",
+ "# License: MIT License\n",
+ "\n",
+ "import numpy as np\n",
+ "import matplotlib.pylab as pl\n",
+ "import ot"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Generate data\n",
+ " -------------\n",
+ "%% parameters and data generation\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "N = 3\n",
+ "d = 2\n",
+ "measures_locations = []\n",
+ "measures_weights = []\n",
+ "\n",
+ "for i in range(N):\n",
+ "\n",
+ " n_i = np.random.randint(low=1, high=20) # nb samples\n",
+ "\n",
+ " mu_i = np.random.normal(0., 4., (d,)) # Gaussian mean\n",
+ "\n",
+ " A_i = np.random.rand(d, d)\n",
+ " cov_i = np.dot(A_i, A_i.transpose()) # Gaussian covariance matrix\n",
+ "\n",
+ " x_i = ot.datasets.make_2D_samples_gauss(n_i, mu_i, cov_i) # Dirac locations\n",
+ " b_i = np.random.uniform(0., 1., (n_i,))\n",
+ " b_i = b_i / np.sum(b_i) # Dirac weights\n",
+ "\n",
+ " measures_locations.append(x_i)\n",
+ " measures_weights.append(b_i)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Compute free support barycenter\n",
+ "-------------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "k = 10 # number of Diracs of the barycenter\n",
+ "X_init = np.random.normal(0., 1., (k, d)) # initial Dirac locations\n",
+ "b = np.ones((k,)) / k # weights of the barycenter (it will not be optimized, only the locations are optimized)\n",
+ "\n",
+ "X = ot.lp.free_support_barycenter(measures_locations, measures_weights, X_init, b)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plot data\n",
+ "---------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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6FH8XpSNKxT5jnymrZ8WcAaIwzj8nrRT6Cxk08FNvLnxzXLLQp1f7jIu6iXVK74/quMo6ibVDXg6viC0rtOa58/2P71Q1RxxOcbu7a17C20VFRXxxhtvMHny5IiMtWdmZvLjjz9y+umnl1vWrFkzbDYbO3bsYNmyZfTp04esrCyWL19OWloaXbp0ITExEYvFwty5c6lbty779+/njDPO4KKLLmLBggU0a9aMTz75BHDXezlw4ABz587l559/RkQ4fPgwgN9yvQAbN27k22+/JSUlhVtuuaVcmd5//vOfrF+/vrjOy8KFC9myZQsrVqzAGMNFF13EN998Q//+/Uu9vkDlikvKy8tjzZo1fPPNN1xzzTWsX7/ebxlhgNWrV7N27Vrq16/P4sWLmTJlCiNGjODIkSMsW7aM6dOn88orr5CZmcmaNWuw2WwcPHgQu93OLbfcwrx582jUqBGzZs3igQceYNq0aYC7p71ixQrmz5/PI488wqJFi/jb3/7GypUreeGFFwC4//77Ofvss5k2bRqHDx8mIyODc845p1xcofhqx1cI4dUYKXQW8vbGt7mm8zVYLdbixy8+5WK+2vlV0NK3KbaUUrNa6iXX492h73LDohvYk7un3AyZZGsyd/a8k0vaXxJwjF/VHHGZ2Ev21r28vfYXX3wxrHXn5ORw6aWX8swzz1C3bl2fbbyX0Fu2bBl33nknWVlZLFu2jLS0NPr16we4x2Hvv/9+vvnmGywWC1lZWezdu5cuXbpw1113ce+99zJs2DDOOussHA4HycnJXHvttQwbNoxhw9xFzPyVzwW46KKLSElxV6oLpUzvwoULWbhwIT169Ch+nVu2bCmX2AOVKy7JW7q4f//+HD16lMOHD3Ps2DGfZYQBzj333OLkOWDAAG688Uays7OZM2cOl156afE/gwkTJmCzuT+W9evXZ/369axfv55zzz0XcL/P3jLHAJdccgkAPXv2JDMz0+f7tXDhQj766COefPJJwF3ZcseOHeXiCsWevD1+x8grIt+Rz66cXbSu27r4sYwTM2hSqwk7ju3w2+NPtiYzvuv4cr3zprWbMm/4PFbvW83/fv0fBwsO0qx2My455RLan9A+7HhVfIm7xF62t+4ViV673W7n0ksvZeTIkcUJY+fOnVx44YUATJgwgQkTJhSPs69bt4709HRatmzJU089Rd26dRk3bhwA77zzDtnZ2axatYqEhATatGlDQUEB7du3Z/Xq1cyfP58HH3yQwYMH89BDD7FixQq++OIL3n//fV544QW+/PLLgOVzS5bZ9VWmt23btqXaG2OYNGkSN9xwQ8B9EKhccUllK+OJCJMnT/ZZRrhsvACjR4/m7bffZubMmbzxxht+4zHG0Llz5+LhL3/xBorVGMOcOXPo0KFDqce///77cnEFk2pLxWqxBr2SVzAWLOXG2UWEV857hVHzR3Gk8Ei54Z4UWwrD2g7jylOv9LlOEaFnk570bFIl1T1UDIu7MXZfvXWvcMbajTFce+21dOzYkTvvvLP48ZYtW7JmzRrWrFnDhAkTAHeP/eOPP6Z+/fpYrVbq16/P4cOHWb58efGB0yNHjtC4cWMSEhL46quv2L59OwC///47tWrVYtSoUUycOJHVq1cXXzRj6NChTJkyhZ9++gkIvXyurzK9ZcsFDxkyhGnTphX3+LOysti3b1+l9hX8Ubr422+/JS0tjbS0NL9lhH0ZO3Zs8eyiTp06Ae7e88svv1ycoA8ePEiHDh3Izs4uTux2u73UwWpffL32559/vvh4wY8//ljBV/uH/i36+z3uUBF2Y/dZ8+TE1BOZO3wuN3W/iSa1miAIVrHS+8TeTBk4hclnTK7R5WZVZMRVYvfXW/fy9torM0Nm6dKlvPXWW3z55Zd0796d7t27+51Z0aVLl+Jx85KPpaWlFVd9HDlyJCtXrqRLly7MmDGjuEzuunXrig90PvLIIzz44IMcO3aMYcOG0bVrV84888zi6ZKhls/1Vaa3QYMG9OvXj/T0dCZOnMh5553HVVddRZ8+fejSpQuXXXZZWHXik5OT6dGjBxMmTOD1118H/JcR9qVJkyZ07Nix+BsOwHXXXUerVq3o2rUr3bp149133yUxMZH333+fe++9l27dutG9e/egs3gGDRrExo0biw+eTp48GbvdTteuXencuTOTJ0+u9OtuWrspGU0zwjpr0iIWBrcaTO1E31ekqpNYh7HpY1l0+SJ+Gv0Ta0avYdqQafRr3k+TugpJ2EXAKqOyRcBuvPFGXn/99YBXJ0pMTOS6664Le6xdRVdeXh5dunRh9erVpKWlVXc4Pvn7TB4pPMKVn1zJ3ty95S4yUfJiEf4uQJFqS2X2hbNpVbdV5INWNVqoRcDiqsf+0UcfBb3kXFFRUfF0NhWbFi1aRMeOHbnllltiNqkHkpaUxuxhsxnTeQx1EuuQYkshxZZCakIqozqNYv4l8+nTrA9J1iSs8sesl1q2WtRPrs+086dpUldRFVc9dqWqUiifSYfLwZ5c99Bfk1pNSLD+MUSz9dBWZm+eTeaRTGon1mboSUMZ2HIgNkvczVlQMaIqy/ZGjDFGxxBVTAi1w2Oz2PzWRjn5hJO5//T7IxmWUiGJmaGY5ORkDhw4EJEZB0qFwxjDgQMHfE4zVSoexEyPvUWLFuzatYvKXuhaqUhKTk4uPlFLqXgTM4k9ISGBk046qbrDUEqpuBczQzFKKaUiQxO7UkrVMJrYlVKqhqmWeewikg1sr/INR1ZDIPIXj6xZdB+FRvdTcLqP3FobYxoFa1Qtib0mEJGVoZwocDzTfRQa3U/B6T6qGB2KUUqpGkYTu1JK1TCa2CvvleoOIA7oPgqN7qfgdB9VgI6xK6VUDaM9dqWUqmE0sSulVA2jiT1MInKXiBgRaVjdscQiEfm3iPwsImtFZK6I1KvumGKFiJwvIr+IyFYRua+644lFItJSRL4SkY0iskFEbqvumOKBJvYwiEhL4DxgR3XHEsM+B9KNMV2BzcCkao4nJoiIFXgR+BPQCbhSRDpVb1QxyQHcZYzpBJwB3KT7KThN7OGZAtwD6BFoP4wxC40x3itbfwdoLVy3DGCrMWabMaYImAkMr+aYYo4xZrcxZrXn9jFgE9C8eqOKfZrYK0lEhgNZxpifqjuWOHIN8Gl1BxEjmgM7S9zfhSasgESkDdAD+L56I4l9MVOPPRaJyCLgRB+LHgDuxz0Mc9wLtJ+MMfM8bR7A/bX6naqMTdUMIlIbmAPcbow5Wt3xxDpN7AEYY87x9biIdAFOAn7yXKO1BbBaRDKMMXuqMMSY4G8/eYnIWGAYMNjoiRNeWUDLEvdbeB5TZYhIAu6k/o4x5oPqjice6AlKESAimUAvY4xWnytDRM4HngYGGGP0uoceImLDfTB5MO6E/gNwlTFmQ7UGFmPE3XOaDhw0xtxe3fHECx1jV9H2AlAH+FxE1ojI1OoOKBZ4DijfDHyG+4DgbE3qPvUDrgbO9nx+1ojI0OoOKtZpj10ppWoY7bErpVQNo4ldKaVqGE3sSilVw2hiV0qpGkYTu1JK1TCa2JVSqobRxK6UUjXM/wOLEmgPgpS5HgAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pl.figure(1)\n",
+ "for (x_i, b_i) in zip(measures_locations, measures_weights):\n",
+ " color = np.random.randint(low=1, high=10 * N)\n",
+ " pl.scatter(x_i[:, 0], x_i[:, 1], s=b * 1000, label='input measure')\n",
+ "pl.scatter(X[:, 0], X[:, 1], s=b * 1000, c='black', marker='^', label='2-Wasserstein barycenter')\n",
+ "pl.title('Data measures and their barycenter')\n",
+ "pl.legend(loc=0)\n",
+ "pl.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.6.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/notebooks/plot_stochastic.ipynb b/notebooks/plot_stochastic.ipynb
new file mode 100644
index 0000000..e784e11
--- /dev/null
+++ b/notebooks/plot_stochastic.ipynb
@@ -0,0 +1,610 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# Stochastic examples\n",
+ "\n",
+ "\n",
+ "This example is designed to show how to use the stochatic optimization\n",
+ "algorithms for descrete and semicontinous measures from the POT library.\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Author: Kilian Fatras <kilian.fatras@gmail.com>\n",
+ "#\n",
+ "# License: MIT License\n",
+ "\n",
+ "import matplotlib.pylab as pl\n",
+ "import numpy as np\n",
+ "import ot\n",
+ "import ot.plot"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "COMPUTE TRANSPORTATION MATRIX FOR SEMI-DUAL PROBLEM\n",
+ "############################################################################\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "------------SEMI-DUAL PROBLEM------------\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"------------SEMI-DUAL PROBLEM------------\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "DISCRETE CASE\n",
+ "Sample two discrete measures for the discrete case\n",
+ "---------------------------------------------\n",
+ "\n",
+ "Define 2 discrete measures a and b, the points where are defined the source\n",
+ "and the target measures and finally the cost matrix c.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "n_source = 7\n",
+ "n_target = 4\n",
+ "reg = 1\n",
+ "numItermax = 1000\n",
+ "\n",
+ "a = ot.utils.unif(n_source)\n",
+ "b = ot.utils.unif(n_target)\n",
+ "\n",
+ "rng = np.random.RandomState(0)\n",
+ "X_source = rng.randn(n_source, 2)\n",
+ "Y_target = rng.randn(n_target, 2)\n",
+ "M = ot.dist(X_source, Y_target)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Call the \"SAG\" method to find the transportation matrix in the discrete case\n",
+ "---------------------------------------------\n",
+ "\n",
+ "Define the method \"SAG\", call ot.solve_semi_dual_entropic and plot the\n",
+ "results.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[[2.55553509e-02 9.96395660e-02 1.76579142e-02 4.31178196e-06]\n",
+ " [1.21640234e-01 1.25357448e-02 1.30225078e-03 7.37891338e-03]\n",
+ " [3.56123975e-03 7.61451746e-02 6.31505947e-02 1.33831456e-07]\n",
+ " [2.61515202e-02 3.34246014e-02 8.28734709e-02 4.07550428e-04]\n",
+ " [9.85500870e-03 7.52288517e-04 1.08262628e-02 1.21423583e-01]\n",
+ " [2.16904253e-02 9.03825797e-04 1.87178503e-03 1.18391107e-01]\n",
+ " [4.15462212e-02 2.65987989e-02 7.23177216e-02 2.39440107e-03]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "method = \"SAG\"\n",
+ "sag_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method,\n",
+ " numItermax)\n",
+ "print(sag_pi)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "SEMICONTINOUS CASE\n",
+ "Sample one general measure a, one discrete measures b for the semicontinous\n",
+ "case\n",
+ "---------------------------------------------\n",
+ "\n",
+ "Define one general measure a, one discrete measures b, the points where\n",
+ "are defined the source and the target measures and finally the cost matrix c.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "n_source = 7\n",
+ "n_target = 4\n",
+ "reg = 1\n",
+ "numItermax = 1000\n",
+ "log = True\n",
+ "\n",
+ "a = ot.utils.unif(n_source)\n",
+ "b = ot.utils.unif(n_target)\n",
+ "\n",
+ "rng = np.random.RandomState(0)\n",
+ "X_source = rng.randn(n_source, 2)\n",
+ "Y_target = rng.randn(n_target, 2)\n",
+ "M = ot.dist(X_source, Y_target)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Call the \"ASGD\" method to find the transportation matrix in the semicontinous\n",
+ "case\n",
+ "---------------------------------------------\n",
+ "\n",
+ "Define the method \"ASGD\", call ot.solve_semi_dual_entropic and plot the\n",
+ "results.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[3.75309361 7.63288278 3.76418767 2.53747778 1.70389504 3.53981297\n",
+ " 2.67663944] [-2.49164966 -2.25281897 -0.77666675 5.52113539]\n",
+ "[[2.19699465e-02 1.03185982e-01 1.76983379e-02 2.87611188e-06]\n",
+ " [1.20688044e-01 1.49823131e-02 1.50635578e-03 5.68043045e-03]\n",
+ " [3.01194583e-03 7.75764779e-02 6.22686313e-02 8.78225379e-08]\n",
+ " [2.28707628e-02 3.52120795e-02 8.44977549e-02 2.76545693e-04]\n",
+ " [1.19721129e-02 1.10087991e-03 1.53333937e-02 1.14450756e-01]\n",
+ " [2.65247890e-02 1.33140544e-03 2.66861405e-03 1.12332334e-01]\n",
+ " [3.71512413e-02 2.86513804e-02 7.53932500e-02 1.66127118e-03]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "method = \"ASGD\"\n",
+ "asgd_pi, log_asgd = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method,\n",
+ " numItermax, log=log)\n",
+ "print(log_asgd['alpha'], log_asgd['beta'])\n",
+ "print(asgd_pi)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Compare the results with the Sinkhorn algorithm\n",
+ "---------------------------------------------\n",
+ "\n",
+ "Call the Sinkhorn algorithm from POT\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[[2.55535622e-02 9.96413843e-02 1.76578860e-02 4.31043335e-06]\n",
+ " [1.21640742e-01 1.25369034e-02 1.30234529e-03 7.37715259e-03]\n",
+ " [3.56096458e-03 7.61460101e-02 6.31500344e-02 1.33788624e-07]\n",
+ " [2.61499607e-02 3.34255577e-02 8.28741973e-02 4.07427179e-04]\n",
+ " [9.85698720e-03 7.52505948e-04 1.08291770e-02 1.21418473e-01]\n",
+ " [2.16947591e-02 9.04086158e-04 1.87228707e-03 1.18386011e-01]\n",
+ " [4.15442692e-02 2.65998963e-02 7.23192701e-02 2.39370724e-03]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "sinkhorn_pi = ot.sinkhorn(a, b, M, reg)\n",
+ "print(sinkhorn_pi)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "PLOT TRANSPORTATION MATRIX\n",
+ "#############################################################################\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plot SAG results\n",
+ "----------------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 360x360 with 3 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pl.figure(4, figsize=(5, 5))\n",
+ "ot.plot.plot1D_mat(a, b, sag_pi, 'semi-dual : OT matrix SAG')\n",
+ "pl.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plot ASGD results\n",
+ "-----------------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 360x360 with 3 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pl.figure(4, figsize=(5, 5))\n",
+ "ot.plot.plot1D_mat(a, b, asgd_pi, 'semi-dual : OT matrix ASGD')\n",
+ "pl.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plot Sinkhorn results\n",
+ "---------------------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 360x360 with 3 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pl.figure(4, figsize=(5, 5))\n",
+ "ot.plot.plot1D_mat(a, b, sinkhorn_pi, 'OT matrix Sinkhorn')\n",
+ "pl.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "COMPUTE TRANSPORTATION MATRIX FOR DUAL PROBLEM\n",
+ "############################################################################\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "------------DUAL PROBLEM------------\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"------------DUAL PROBLEM------------\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "SEMICONTINOUS CASE\n",
+ "Sample one general measure a, one discrete measures b for the semicontinous\n",
+ "case\n",
+ "---------------------------------------------\n",
+ "\n",
+ "Define one general measure a, one discrete measures b, the points where\n",
+ "are defined the source and the target measures and finally the cost matrix c.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "n_source = 7\n",
+ "n_target = 4\n",
+ "reg = 1\n",
+ "numItermax = 100000\n",
+ "lr = 0.1\n",
+ "batch_size = 3\n",
+ "log = True\n",
+ "\n",
+ "a = ot.utils.unif(n_source)\n",
+ "b = ot.utils.unif(n_target)\n",
+ "\n",
+ "rng = np.random.RandomState(0)\n",
+ "X_source = rng.randn(n_source, 2)\n",
+ "Y_target = rng.randn(n_target, 2)\n",
+ "M = ot.dist(X_source, Y_target)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Call the \"SGD\" dual method to find the transportation matrix in the\n",
+ "semicontinous case\n",
+ "---------------------------------------------\n",
+ "\n",
+ "Call ot.solve_dual_entropic and plot the results.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[ 1.67648902 5.3770004 1.70385554 0.4276547 -0.77206786 1.0474898\n",
+ " 0.54202203] [-0.23723788 -0.20259434 1.30855788 8.06179985]\n",
+ "[[2.62451875e-02 1.00499531e-01 1.78515577e-02 4.57450829e-06]\n",
+ " [1.20510690e-01 1.21972758e-02 1.27002374e-03 7.55197481e-03]\n",
+ " [3.65708350e-03 7.67963231e-02 6.38381061e-02 1.41974930e-07]\n",
+ " [2.64286344e-02 3.31748063e-02 8.24445965e-02 4.25479786e-04]\n",
+ " [9.59295422e-03 7.19190875e-04 1.03739180e-02 1.22100712e-01]\n",
+ " [2.09087627e-02 8.55676046e-04 1.77617241e-03 1.17896019e-01]\n",
+ " [4.18792948e-02 2.63326297e-02 7.17598381e-02 2.49335733e-03]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "sgd_dual_pi, log_sgd = ot.stochastic.solve_dual_entropic(a, b, M, reg,\n",
+ " batch_size, numItermax,\n",
+ " lr, log=log)\n",
+ "print(log_sgd['alpha'], log_sgd['beta'])\n",
+ "print(sgd_dual_pi)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Compare the results with the Sinkhorn algorithm\n",
+ "---------------------------------------------\n",
+ "\n",
+ "Call the Sinkhorn algorithm from POT\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[[2.55535622e-02 9.96413843e-02 1.76578860e-02 4.31043335e-06]\n",
+ " [1.21640742e-01 1.25369034e-02 1.30234529e-03 7.37715259e-03]\n",
+ " [3.56096458e-03 7.61460101e-02 6.31500344e-02 1.33788624e-07]\n",
+ " [2.61499607e-02 3.34255577e-02 8.28741973e-02 4.07427179e-04]\n",
+ " [9.85698720e-03 7.52505948e-04 1.08291770e-02 1.21418473e-01]\n",
+ " [2.16947591e-02 9.04086158e-04 1.87228707e-03 1.18386011e-01]\n",
+ " [4.15442692e-02 2.65998963e-02 7.23192701e-02 2.39370724e-03]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "sinkhorn_pi = ot.sinkhorn(a, b, M, reg)\n",
+ "print(sinkhorn_pi)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plot SGD results\n",
+ "-----------------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 360x360 with 3 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pl.figure(4, figsize=(5, 5))\n",
+ "ot.plot.plot1D_mat(a, b, sgd_dual_pi, 'dual : OT matrix SGD')\n",
+ "pl.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plot Sinkhorn results\n",
+ "---------------------\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWAAAAFgCAYAAACFYaNMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAEc5JREFUeJzt3X2QXQV9xvHnMYRBDII0OxYIuBY1DmMl4IovKKUwYoIW246jUl+Ktc3YWgdaWt86baUztdY6No462AAqAkUpQsdBtGAJQ6kQu5FoCSGWUpHwYjalSFAEEp7+cU/sNi57Tzb33l/23u9nZofde84953fD7HfPnj33XicRAGDwnlI9AACMKgIMAEUIMAAUIcAAUIQAA0ARAgwARQgwsBew/Urbm/qw3TfbvqblumfYvnF3l2HuCDCGQhOIf7f9Y9v32z7X9kHNsk/bfrj5eMz249O+/uoAZovt58y2TpJ/SbJ0jtt/he1v2P6h7Qds/6vtFzfbvSTJKXPZLvqPAGPes322pL+W9MeSDpT0UknPknSt7X2TvDPJoiSLJH1I0hd3fp1kRd3kHbb32YP7Pl3SVZI+IelgSYdJOkfSo72Zrvf25PEOGwKMea0J0DmS3p3ka0keT/I9SW+QNC7pLXPY5om2N9t+j+0ttu+z/au2T7X93eYo8wPT1j/O9k22H2zW/aTtfZtlNzSrfbs54n7jtO2/1/b9kj6787bmPkc2+zi2+fpQ21O2T5xh3OdJUpJLk+xI8kiSa5J8p7nv/zt10ByNv9P2fzTzfsq2n+Tf4W9s32j7wGm3fdT2/9j+L9srpt1+qO0vN3PfYft3pi37oO3LbV9s+yFJZzS3XWb787a32d5ge2I3/1fNewQY893LJe0n6YrpNyZ5WNLVkl41x+3+fLPdwyT9maTz1In5iyS9UtKf2n52s+4OSX8gabGkl0k6WdLvNXOc0KxzdHPE/cVp2z9YnSP1lbvM/p+S3ivpYtv7S/qspAuTXD/DnN+VtMP2hbZX2H5Gi8f2WkkvlvRCdX5QvXr6QttPsX1es/yUJD9sFr1E0qbmcX5E0gXT4v0FSZslHSrp9ZI+ZPukaZt9naTLJR0k6ZLmttOa+x0k6cuSPtli9qFCgDHfLZa0Ncn2GZbd1yyfi8cl/WWSx9WJxGJJH0+yLckGSbdJOlqSkqxLcnOS7c3R999J+qUu239C0p8neTTJI7suTHKepDskrZV0iKQ/mWkjSR6S9ApJUeeHxFRzJPrMWfb94SQPJvm+pDWSlk1btlDSper8cPiVJD+etuyuJOcl2SHpwmauZ9o+XNLxkt6b5CdJ1ks6X9Lbpt33piT/mOSJaY/3xiRXN9u7SM2/5yghwJjvtkpa/CTnFQ9pls/FfzdhkKSdwfjBtOWPSFokSbafZ/uq5o9/D6lznrlb+KeS/KTLOudJeoGkTyR50nO6STYmOSPJkmb9QyWtmmW790/7/Mc7H0fjOeocrZ6T5LEnu9+0MC9q9vdAkm3T1r1Lnd8edrq7xRz7jdr5YQKM+e4mdf7g9OvTb7S9SNIKSf88gBnOlXS7pOcmebqkD0ia8bzqNLO+DGEz/ypJF0j6oO2D2wyS5HZJn1MnxHOxUdLbJX3VdturMu6VdLDtA6bddoSke6aPNsd5hhoBxrzWnJ88R9InbC+3vdD2uKTL1DknedEAxjhA0kOSHrb9fEm/u8vyH0j6hd3c5sclTSb5bUlfkfTpmVay/XzbZ9te0nx9uKTTJd28m/v7qSSXqvND5Ou2j2yx/t2SviHpr2zvZ/uFkt4h6eK5zjAqCDDmvSQfUScYH1UnhGvV+ZX35Nl+de+hP5L0G5K2qXPa4Iu7LP+gpAubqw7e0G1jtl8nabn+L+R/KOlY22+eYfVt6vxxbK3tH6kT3lslnT2Hx/FTSS6U9BeSrmt+oHVzujpXndwr6Up1zm9/fU9mGAXmBdkBoAZHwABQhAADQBECDABFCDAAFBmpi57xsxYvXpzx8fHqMYChsm7duq1JxrqtR4BH3Pj4uCYnJ6vHAIaK7bvarMcpCAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgyD7VA6DYpk3SiSdWT4FRtmyZtGpV9RQlOAIGgCIcAY+6pUul66+vngIYSRwBA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFHGS6hlQyPY2SZuq5+ixxZK2Vg/RBzyu+WNpkgO6rbTPICbBXm1TkonqIXrJ9uSwPSaJxzWf2J5ssx6nIACgCAEGgCIEGKurB+iDYXxMEo9rPmn1mPgjHAAU4QgYAIoQYAAoQoBHlO3ltjfZvsP2+6rn6QXbn7G9xfat1bP0iu3Dba+xfZvtDbbPrJ6pF2zvZ/ubtr/dPK5zqmfqFdsLbN9i+6pu6xLgEWR7gaRPSVoh6ShJp9s+qnaqnvicpOXVQ/TYdklnJzlK0kslvWtI/l89KumkJEdLWiZpue2XFs/UK2dK2thmRQI8mo6TdEeSO5M8JukLkl5XPNMeS3KDpAeq5+ilJPcl+Vbz+TZ1vrEPq51qz6Xj4ebLhc3HvL8iwPYSSa+RdH6b9QnwaDpM0t3Tvt6sIfimHna2xyUdI2lt7SS90fyqvl7SFknXJhmGx7VK0nskPdFmZQIMzAO2F0n6kqSzkjxUPU8vJNmRZJmkJZKOs/2C6pn2hO3XStqSZF3b+xDg0XSPpMOnfb2kuQ17IdsL1YnvJUmuqJ6n15I8KGmN5v/5++MlnWb7e+qc1jvJ9sWz3YEAj6Z/k/Rc28+2va+kN0n6cvFMmIFtS7pA0sYkH6uep1dsj9k+qPn8qZJeJen22qn2TJL3J1mSZFyd76nrkrxltvsQ4BGUZLuk35f0T+r8UeeyJBtqp9pzti+VdJOkpbY3235H9Uw9cLykt6pzNLW++Ti1eqgeOETSGtvfUeeA4NokXS/bGjY8FRkAinAEDABF+vKC7IsXL874+Hg/No0eW7du3dYkY9Vz7KkTT/nwnH6Ve/Xf3tDrUWa15m3HDXR/kpRbBnt26don/sED3eE81pcAj4+Pa3Ky1QvCo5jtu6pnAEYVpyAAoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaBIqwAP4xs4AkC1rgEe4jdwBIBSbY6Ah/INHHfHWWd1PgCgl9q8GM9Mb+D4kl1Xsr1S0kpJOuKII3oy3N5i/frqCQAMo579ES7J6iQTSSbGxub9qxsCQN+1CTBv4AgAfdAmwLyBIwD0QddzwEm22975Bo4LJH1mGN7AEQCqtXpHjCRXS7q6z7MAwEjhmXAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFGn1RAxgb3fd5y+Y0/1OPeHXejzJ7HLn7QPdnyQt4MWx9locAQNAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFugbY9mdsb7F96yAGAoBR0eYI+HOSlvd5DgAYOV0DnOQGSQ8MYBYAGCmcAwaAIj0LsO2VtidtT05NTfVqswAwtHoW4CSrk0wkmRjj9UcBoCtOQQBAkTaXoV0q6SZJS21vtv2O/o8FAMOv61sSJTl9EIMAwKjhFAQAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABTp+kw4YD5Y8ZyXz+l+379o/x5PMrtH7p0Y6P4k6bnvXjvwfaIdjoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIm3eFflw22ts32Z7g+0zBzEYAAy7Nq8FsV3S2Um+ZfsASetsX5vktj7PBgBDresRcJL7knyr+XybpI2SDuv3YAAw7HbrHLDtcUnHSPqZl1eyvdL2pO3Jqamp3kwHAEOsdYBtL5L0JUlnJXlo1+VJVieZSDIxNjbWyxkBYCi1CrDtherE95IkV/R3JAAYDW2ugrCkCyRtTPKx/o8EAKOhzRHw8ZLeKukk2+ubj1P7PBcADL2ul6EluVGSBzALAIwUngkHAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQJE2rwcM7PV+8sqj5nS/Ay8b7LfAz/3WDwa6P+zdOAIGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAirR5V+T9bH/T9rdtb7B9ziAGA4Bh1+aJ8I9KOinJw7YXSrrR9leT3Nzn2QBgqLV5V+RIerj5cmHzkX4OBQCjoNU5YNsLbK+XtEXStUnWzrDOStuTtienpqZ6PScADJ1WAU6yI8kySUskHWf7BTOsszrJRJKJsbGxXs8JAENnt66CSPKgpDWSlvdnHAAYHW2ughizfVDz+VMlvUrS7f0eDACGXZurIA6RdKHtBeoE+7IkV/V3LAAYfm2ugviOpGMGMAsAjBSeCQcARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAkTbPhAP2evtvuG9O99v3nnt7PMns9rl5yUD3J0lfuXf9wPeJdjgCBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIq0DrDtBbZvsc0bcgJAD+zOEfCZkjb2axAAGDWtAmx7iaTXSDq/v+MAwOhoewS8StJ7JD3xZCvYXml70vbk1NRUT4YDgGHWNcC2XytpS5J1s62XZHWSiSQTY2NjPRsQAIZVmyPg4yWdZvt7kr4g6STbF/d1KgAYAV0DnOT9SZYkGZf0JknXJXlL3ycDgCHHdcAAUGS33pIoyfWSru/LJAAwYjgCBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaDIbj0RA9hbPf6sub0AlO+5t8eTzG7HPfcNdH+S9MMnHhno/p4x0L3NbxwBA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEVaPRW5eUv6bZJ2SNqeZKKfQwHAKNid14L45SRb+zYJAIwYTkEAQJG2AY6ka2yvs71yphVsr7Q9aXtyamqqdxMCwJBqG+BXJDlW0gpJ77J9wq4rJFmdZCLJxNjY3F4aEABGSasAJ7mn+e8WSVdKOq6fQwHAKOgaYNtPs33Azs8lnSLp1n4PBgDDrs1VEM+UdKXtnev/fZKv9XUqABgBXQOc5E5JRw9gFgAYKVyGBgBFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARXbnBdmBvdbWX3zqnO534KIX9XiS2d39m9sHuj9JeuORCwa6v2seGeju5jWOgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoEirANs+yPbltm+3vdH2y/o9GAAMu7ZPRf64pK8leb3tfSXt38eZAGAkdA2w7QMlnSDpDElK8pikx/o7FgAMvzanIJ4taUrSZ23fYvt820/r81wAMPTaBHgfScdKOjfJMZJ+JOl9u65ke6XtSduTU1NTPR6z1rJlnQ8A6KU254A3S9qcZG3z9eWaIcBJVktaLUkTExPp2YR7gVWrqicAMIy6HgEnuV/S3baXNjedLOm2vk4FACOg7VUQ75Z0SXMFxJ2S3t6/kQBgNLQKcJL1kib6PAsAjBSeCQcARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEWc9P51c2xPSbqr5xtGPzwryVj1EMAo6kuAAQDdcQoCAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKPK/bk07WnJikdoAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ "<Figure size 360x360 with 3 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pl.figure(4, figsize=(5, 5))\n",
+ "ot.plot.plot1D_mat(a, b, sinkhorn_pi, 'OT matrix Sinkhorn')\n",
+ "pl.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.6.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}