{"nbformat_minor": 0, "worksheets": [{"cells": [{"source": ["Dijkstra and Fast Marching Algorithms\n", "=====================================\n", "\n*Important:* Please read the [installation page](http://gpeyre.github.io/numerical-tours/installation_matlab/) for details about how to install the toolboxes.\n", "$\\newcommand{\\dotp}[2]{\\langle #1, #2 \\rangle}$\n", "$\\newcommand{\\enscond}[2]{\\lbrace #1, #2 \\rbrace}$\n", "$\\newcommand{\\pd}[2]{ \\frac{ \\partial #1}{\\partial #2} }$\n", "$\\newcommand{\\umin}[1]{\\underset{#1}{\\min}\\;}$\n", "$\\newcommand{\\umax}[1]{\\underset{#1}{\\max}\\;}$\n", "$\\newcommand{\\umin}[1]{\\underset{#1}{\\min}\\;}$\n", "$\\newcommand{\\uargmin}[1]{\\underset{#1}{argmin}\\;}$\n", "$\\newcommand{\\norm}[1]{\\|#1\\|}$\n", "$\\newcommand{\\abs}[1]{\\left|#1\\right|}$\n", "$\\newcommand{\\choice}[1]{ \\left\\{ \\begin{array}{l} #1 \\end{array} \\right. }$\n", "$\\newcommand{\\pa}[1]{\\left(#1\\right)}$\n", "$\\newcommand{\\diag}[1]{{diag}\\left( #1 \\right)}$\n", "$\\newcommand{\\qandq}{\\quad\\text{and}\\quad}$\n", "$\\newcommand{\\qwhereq}{\\quad\\text{where}\\quad}$\n", "$\\newcommand{\\qifq}{ \\quad \\text{if} \\quad }$\n", "$\\newcommand{\\qarrq}{ \\quad \\Longrightarrow \\quad }$\n", "$\\newcommand{\\ZZ}{\\mathbb{Z}}$\n", "$\\newcommand{\\CC}{\\mathbb{C}}$\n", "$\\newcommand{\\RR}{\\mathbb{R}}$\n", "$\\newcommand{\\EE}{\\mathbb{E}}$\n", "$\\newcommand{\\Zz}{\\mathcal{Z}}$\n", "$\\newcommand{\\Ww}{\\mathcal{W}}$\n", "$\\newcommand{\\Vv}{\\mathcal{V}}$\n", "$\\newcommand{\\Nn}{\\mathcal{N}}$\n", "$\\newcommand{\\NN}{\\mathcal{N}}$\n", "$\\newcommand{\\Hh}{\\mathcal{H}}$\n", "$\\newcommand{\\Bb}{\\mathcal{B}}$\n", "$\\newcommand{\\Ee}{\\mathcal{E}}$\n", "$\\newcommand{\\Cc}{\\mathcal{C}}$\n", "$\\newcommand{\\Gg}{\\mathcal{G}}$\n", "$\\newcommand{\\Ss}{\\mathcal{S}}$\n", "$\\newcommand{\\Pp}{\\mathcal{P}}$\n", "$\\newcommand{\\Ff}{\\mathcal{F}}$\n", "$\\newcommand{\\Xx}{\\mathcal{X}}$\n", "$\\newcommand{\\Mm}{\\mathcal{M}}$\n", "$\\newcommand{\\Ii}{\\mathcal{I}}$\n", "$\\newcommand{\\Dd}{\\mathcal{D}}$\n", "$\\newcommand{\\Ll}{\\mathcal{L}}$\n", "$\\newcommand{\\Tt}{\\mathcal{T}}$\n", "$\\newcommand{\\si}{\\sigma}$\n", "$\\newcommand{\\al}{\\alpha}$\n", "$\\newcommand{\\la}{\\lambda}$\n", "$\\newcommand{\\ga}{\\gamma}$\n", "$\\newcommand{\\Ga}{\\Gamma}$\n", "$\\newcommand{\\La}{\\Lambda}$\n", "$\\newcommand{\\si}{\\sigma}$\n", "$\\newcommand{\\Si}{\\Sigma}$\n", "$\\newcommand{\\be}{\\beta}$\n", "$\\newcommand{\\de}{\\delta}$\n", "$\\newcommand{\\De}{\\Delta}$\n", "$\\newcommand{\\phi}{\\varphi}$\n", "$\\newcommand{\\th}{\\theta}$\n", "$\\newcommand{\\om}{\\omega}$\n", "$\\newcommand{\\Om}{\\Omega}$\n"], "metadata": {}, "cell_type": "markdown"}, {"source": ["This numerical tours details the implementations\n", "of Dijkstra and Fast Marching algorithms in 2-D.\n", "\n", "\n", "The implementation are performed in Matlab, and are hence quite slow."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 2, "cell_type": "code", "language": "python", "metadata": {}, "input": ["warning off\n", "addpath('toolbox_signal')\n", "addpath('toolbox_general')\n", "addpath('toolbox_graph')\n", "addpath('solutions/fastmarching_0_implementing')\n", "warning on"]}, {"source": ["Navigating on the Grid\n", "----------------------\n", "We use a cartesian grid of size $n \\times n$, and defines operators to navigate in the grid.\n", "\n", "\n", "We use a singe index $i \\in \\{1,\\ldots,n^2\\}$ to index a position on\n", "the 2-D grid.\n", "\n", "\n", "Size of the grid."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 3, "cell_type": "code", "language": "python", "metadata": {}, "input": ["n = 40;"]}, {"source": ["The four displacement vector to go to the four neightbors."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 4, "cell_type": "code", "language": "python", "metadata": {}, "input": ["neigh = [[1;0] [-1;0] [0;1] [0;-1]];"]}, {"source": ["For simplicity of implementation, we use periodic boundary conditions."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 5, "cell_type": "code", "language": "python", "metadata": {}, "input": ["boundary = @(x)mod(x-1,n)+1;"]}, {"source": ["For a given grid index |k|, and a given neighboring index k in ${1,2,3,4}$,\n", "|Neigh(k,i)| gives the corresponding grid neighboring index."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 6, "cell_type": "code", "language": "python", "metadata": {}, "input": ["ind2sub1 = @(k)[rem(k-1, n)+1; (k - rem(k-1, n) - 1)/n + 1]; \n", "sub2ind1 = @(u)(u(2)-1)*n+u(1);\n", "Neigh = @(k,i)sub2ind1( boundary(ind2sub1(k)+neigh(:,i)) );"]}, {"source": ["Dikstra Algorithm\n", "-----------------\n", "The Dijkstra algorithm compute the geodesic distance on a graph.\n", "We use here a graph whose nodes are the pixels, and whose edges defines the\n", "usual 4-connectity relationship.\n", "\n", "\n", "In the following, we use the notation $i \\sim j$ to indicate that an\n", "index $j$ is a neighbor of $i$ on the graph defined by the discrete\n", "grid.\n", "\n", "\n", "The metric $W(x)$. We use here a constant metric."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 7, "cell_type": "code", "language": "python", "metadata": {}, "input": ["W = ones(n);"]}, {"source": ["Set $\\Ss = \\{x_0\\}$ of initial points."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 8, "cell_type": "code", "language": "python", "metadata": {}, "input": ["x0 = [n/2;n/2];"]}, {"source": ["Initialize the stack of available indexes."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 9, "cell_type": "code", "language": "python", "metadata": {}, "input": ["I = sub2ind1(x0);"]}, {"source": ["Initialize the distance to $+\\infty$, excepted for the boundary conditions."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 10, "cell_type": "code", "language": "python", "metadata": {}, "input": ["D = zeros(n)+Inf; \n", "D(I) = 0;"]}, {"source": ["Initialize the state to 0 (unexplored), excepted for the boundary point $\\Ss$ (indexed by |I|)\n", "to $1$ (front)."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 11, "cell_type": "code", "language": "python", "metadata": {}, "input": ["S = zeros(n);\n", "S(I) = 1;"]}, {"source": ["The first step of each iteration of the method is\n", "to pop the from stack the element $i$ with smallest current distance $D_i$."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 12, "cell_type": "code", "language": "python", "metadata": {}, "input": ["[tmp,j] = sort(D(I)); j = j(1);\n", "i = I(j); I(j) = [];"]}, {"source": ["We update its state $S$ to be dead (-1)."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 13, "cell_type": "code", "language": "python", "metadata": {}, "input": ["S(i) = -1;"]}, {"source": ["Retrieve the list of the four neighbors."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 14, "cell_type": "code", "language": "python", "metadata": {}, "input": ["J = [Neigh(i,1); Neigh(i,2); Neigh(i,3); Neigh(i,4)];"]}, {"source": ["Remove those that are dead (no need to consider them anymore)."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 15, "cell_type": "code", "language": "python", "metadata": {}, "input": ["J(S(J)==-1) = [];"]}, {"source": ["Add those that are not yet considered (state 0) to the front stack $I$ (state 1)."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 16, "cell_type": "code", "language": "python", "metadata": {}, "input": ["J1 = J(S(J)==0);\n", "I = [I; J1];\n", "S(J1) = 1;"]}, {"source": ["Update neighbor values.\n", "For each neightbo $j$ of $i$, perform the update,\n", "assuming the length of the edge between $j$ and $k$ is $W_j$.\n", "$$ D_j \\leftarrow \\umin{k \\sim j} D_k + W_j. $$"], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 17, "cell_type": "code", "language": "python", "metadata": {}, "input": ["for j=J'\n", " dx = min( D([Neigh(j,1) Neigh(j,2)]) );\n", " dy = min( D([Neigh(j,3) Neigh(j,4)]) );\n", " D(j) = min(dx+W(j), dy+W(j));\n", "end"]}, {"source": ["__Exercise 1__\n", "\n", "Implement the Dijkstra algorithm by iterating these step while the\n", "stack |I| is non empty.\n", "Display from time to time the front that propagates."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [{"metadata": {}, "png": "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\nlFBWYABEEmAARLKFeKNsiXA15s2aMmD+CliBARBJgAEQSYABEEkHBlyJSc/W3zX3nZASygoMgEgC\nDIBIAgyASDow4AqN9mE+8nUFrMAAiCTAAIhkCxG4ct1ZU7YNr4AVGACRBBgAkQQYAJF0YMCt0Htd\nGSswACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAi\nPbq/v7/0ewCAyazAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAA\niCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACI\nJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgk\nwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTA\nAIgkwACI9P6l30CGR4/+cOm3sLK/1G/fXvxP/f6y7+Sk7u8/uvRbCJbya//x7pf5WXOzvX76Xu/u\nq/3l6zfv3ntw/Unan8mN/OZbgQEQSYABEEmAARBJB3ZDht6rqj7s3bzuPoxr8nHze/vsnYtqe69D\nr2hfPPRdb/ovaP9xcX3YFbMCAyCSAAMgkgADIJIO7Mp1e6+qevKT3dX/9l+sD2Nrur1Xe93vvWq8\nAxs8bT/8NdaHKcMuzgoMgEgCDIBIthCv07AZ2N82bL7w5LPmZm870V4ilzVzUtSsLcTW6HaiZ+sv\nzgoMgEgCDIBIAgyASDqw69F9Yr7be1VVfdD5Cd0+zLP1XNbMSVHd696v/TH0YdtkBQZAJAEGQCQB\nBkAkHVi28UlRh3qv9n7Pvg8za4qz+1NvatS0SVHt9e43//+e/GC498P6/3nvbfTsFc7GCgyASAIM\ngEi2ECMdPynq4Lbh2Bbi/seaNcVZdLcNa/akqOY3f9g5fNW84tmT/aPx87YTDz1bP/yL/NqfxolZ\ngQEQSYABEEmAARBJBxZj5qSoA73XV7vvfNz2WmPMmmJ1f+qdlrJ8UlT7xPxQfb06cJ7K0Iet8Gx9\n7fuwttXTh52CFRgAkQQYAJEEGACRdGCbtsKkqF7vVVWf7b7wYdNrzezDzJpiojNMimrrrtEObP9T\n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\nQmCC\n", "output_type": "display_data"}], "prompt_number": 18, "cell_type": "code", "language": "python", "metadata": {}, "input": ["exo1()"]}, {"collapsed": false, "outputs": [], "prompt_number": 19, "cell_type": "code", "language": "python", "metadata": {}, "input": ["%% Insert your code here."]}, {"source": ["Display the geodesic distance map using a cosine modulation to make the\n", "level set appears more clearly."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [{"metadata": {}, "png": "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\nEEmAARBJkXnUYjHuRnl2duVx89Tplu7ZoXaWOC9fdPiYDtdg26GuaCtXO9RYW7n6oW44pvpoH+El\nNzAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIpMo86XJ69YuXx4yXONdhx3m1tDx3T4Rrs\n4pguaCtXX1geayvXYqgbjqn9BrzmBgZAJAEGQCQBBkAkAQZAJAEGQCQBBkAkAQZAJD2wUWe7RxvL\nFWt0Y+QFFbHziz1PHtPZFlH11agbyl7V972u2Lc5Vfaq5VA84gYGQCQBBkAkAQZAJAEGQCQBBkAk\nAQZAJAEGQCQBBkAkReZRiwLjTnl2Y7liXbIxcqjjPLbYs7aO6XgNtuv23tBWrrv3bU62ld8+vr7+\nefsEr7mBARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSZF5VFdgrK2y5MZ24DrecT5fBz7a\ncZ7aTF1bxzS3ifiCtnLdsTC6KyyPtZWr/z/49t5+Gi+5gQEQSYABEEmAARBJgAEQSYABEEmAARBJ\ngAEQSYABEEmRedSqRPx8b+/OduDlizY6zrMrjx93nPdqsGeHmmsrVz/UBW3lGlwYvbFeeaytXLUY\nqp2Il9zAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIgkwACIpMg8q29lbnScN3fInu04X7DyePXU\nxhLnOjzUYqKxTcQ3tJXr9MLojbZyLRZnz7WVV0PxiBsYAJEEGACRBBgAkQQYAJEEGACRBBgAkQQY\nAJH0wGYt+h8bFbHnOzDrdEVsrwczVhHb2IFZxytip1+0sZ3yirJX7ezbPFv2qn6oybJXX8vrP41X\n3MAAiCTAAIgkwACIJMAAiCTAAIgkwACIJMAAiCTAAIikyDxqsVdwo/65sQOzjnecN3Zg1lzHeWcH\n5vJFG8c01lauvrB8RVu52qHG2srVF5YH28p9r/xDkfkZNzAAIgkwACIJMAAiCTAAIgkwACIJMAAi\nCTAAIgkwACIpMo9aLMbdKc9uLHFevmijNLqxxLkGO84bS5zXT509psM12MUxXdBWrr6wPNZWrsXf\n3g3H1H4DXnMDAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMg0i+fn5/f+zsAwGNuYABEEmAA\nRBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABE\nEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQS\nYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJg\nAEQSYABE+i+NYJscBp+HNQAAAABJRU5ErkJggg==\n", "output_type": "display_data"}], "prompt_number": 20, "cell_type": "code", "language": "python", "metadata": {}, "input": ["displ = @(D)cos(2*pi*5*D/max(D(:)));\n", "clf;\n", "imageplot(displ(D));\n", "colormap jet(256);"]}, {"source": ["Fast Marching\n", "-------------\n", "The Dijstra algorithm suffers from a strong metrization problem, and it\n", "actually computes the $\\ell^1$ distance on the grid.\n", "\n", "\n", "The Fast Marching algorithm replace the graph update by a local\n", "resolution of the Eikonal equation. This reduces significantly the grid\n", "bias, and can be shown to converge to the underlying geodesic distance\n", "when the grid step size tends to zero.\n", "\n", "\n", "Over a continuous domain, the distance map $D(x)$ to a set of seed\n", "points $ \\Ss $ is the unique solution in the viscosity sense\n", "$$ \\forall x \\notin \\Ss, \\quad \\norm{\\nabla D(x)} = W(x)\n", " \\qandq\n", " \\forall y \\in \\Ss, \\quad D(y) = 0. $$\n", "\n", "\n", "The equation is then discretized on a grid of $n \\times n$ pixel, and a\n", "solution $ (D_{k,\\ell})_{k,\\ell=1}^n \\in \\RR^{n \\times n} $ is found by using\n", "an upwind finite difference approximation, that is faithful to the\n", "viscosity solution\n", "$$ \\forall (k,\\ell) \\notin \\tilde \\Ss, \\quad\n", " \\norm{ (\\nabla D)_{k,\\ell} } = W_{k,\\ell}$\n", " \\qandq\n", " \\forall (k,\\ell) \\notin \\tilde \\Ss, \\quad D_{k,\\ell}=0,\n", "$$\n", "where $\\tilde \\Ss$ is the set of discrete starting points (defined here\n", "by |x0|).\n", "\n", "\n", "To be consisten with the viscosity solution, one needs to use a\n", "non-linear upwind gradient derivative. This corresponds to computing\n", "the norm of the gradient as\n", "$$ \\norm{ (\\nabla D)_{k,\\ell} }^2 =\n", " \\max( D_{k+1,\\ell}-D_{k,\\ell}, D_{k-1,\\ell}-D_{k,\\ell}, 0 )^2 +\n", " \\max( D_{k,\\ell+1}-D_{k,\\ell}, D_{k,\\ell-1}-D_{k,\\ell}, 0 )^2.\n", "$$\n", "\n", "\n", "A each step of the FM propagation, one update $ D_{k,\\ell} \\leftarrow d $\n", "by solving the eikonal equation with respect to $D_{k,\\ell}$ alone.\n", "This is equivalent to solving the quadratic equation\n", "$$ (d-d_x)^2 + (d-d_y)^2 = w^2 \\qwhereq w=W_{k,\\ell}. $$\n", "and where\n", "$$ d_x = \\min(D_{k+1,\\ell},D_{k-1,\\ell}) \\qandq\n", " d_y = \\min(D_{k,\\ell+1},D_{k,\\ell-1}). $$\n", "\n", "\n", "The update is thus defined as\n", "$$\n", " d = \\choice{\n", " \\frac{d_x+d_y+ \\sqrt{\\De}}{2} \\quad\\text{when}\\quad \\De \\geq 0, \\\\\n", " \\min(d_x,d_y)+w \\quad \\text{otherwise.}$\n", " }$\n", " \\qwhereq\n", " \\De = 2 w^2 - (d_x-d_y)^2.\n", "$$\n", "\n", "\n", "Note that in the case where $\\De<0$, one has to use the Dijkstra\n", "update.\n", "\n", "\n", "Once the Dijstra algorithm is implemented, the implementation of the Fast\n", "Marching is trivial. It just corresponds to replacing the graph udpate"], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 21, "cell_type": "code", "language": "python", "metadata": {}, "input": ["D(j) = min(dx+W(j), dy+W(j));"]}, {"source": ["by the eikonal update."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 22, "cell_type": "code", "language": "python", "metadata": {}, "input": ["Delta = 2*W(j) - (dx-dy)^2;\n", "if Delta>=0\n", " D(j) = (dx+dy+sqrt(Delta))/2;\n", "else\n", " D(j) = min(dx+W(j), dy+W(j));\n", "end"]}, {"source": ["__Exercise 2__\n", "\n", "Implement the Fast Marching algorithm.\n", "Display from time to time the front that propagates."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [{"metadata": {}, "png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAIAAADOgk3lAAAACXBIWXMAAAsSAAALEgHS3X78AAAA\nIXRFWHRTb2Z0d2FyZQBBcnRpZmV4IEdob3N0c2NyaXB0IDguNTRTRzzSAAAgAElEQVR4nO3dP4hk\n15XH8TvrgnmgAr2gQBUU6AUVNLiDDga2AxkmcKDACxt4QweCTRwomEDBgMQgJFDgQIECJQsKFHqN\nMdpAgQMvdiCDBLMwgjFuQTW0oQfa0IJuqIYeeoOpe+7vTZ07NX+6p+tMfz+JTr+prnpVfUuHd867\n9147OztLAABE8y+XfQIAADwPEhgAICQSGAAgJBIYACAkEhgAICQSGAAgJBIYACAkEhgAICQSGAAg\nJBIYACAkEhgAICQSGAAgJBIYACAkEhgAICQSGAAgJBIYACAkEhgAICQSGAAgJBIYACAkEhgAICQS\nGAAgJBIYACAkEhgAICQSGAAgJBIYACAkEhgAICQSGAAgJBIYACAkEhgAICQSGAAgJBIYACCkwWWf\nQAzXrn182aeA53F29v5ln0JgDPu4rsjI5woMABASCQwAEBIJDAAQEgkMABASCQwAEBIJDAAQEgkM\nABASCQwAEBIJDAAQEgkMABASCQwAEBIJDAAQEgkMABASCQwAEBIJDAAQEgkMABASCQwAEBIJDAAQ\nEgkMABASCQwAEBIJDAAQEgkMABDS4LJPAADOx530gcUjOd7mYCgHjyQ+zMGBHPwwfXSO54aLwBUY\nACAkEhgAICRKiADi+USqhV0OJvKAscRWTqyVEK1yuC8HN+QlZnL8NqXFtcEVGAAgJBIYACAkEhgA\nICR6YABi+FKaUhtyvMvB6DU56jbB2nKsPZQ4N8Gm0gQ7OC7xTJ5skk/jVzTDLhtXYACAkEhgAICQ\nSGAAgJDogV1Rn+Y6/i3q+Fg/H0m7a2spSClNtN01XQpSf1LY008E25Nf2vHjce6NfSUneVee7AO+\nUy8LV2AAgJBIYACAkCghvpo+z8UN927jJDWVf6+sl3M/B7+mHoKXQleH2pbjVjls35SjmxLbKK+V\nEO2WermNPslt9GUJKSkh9r4w8myTe4tguFsOam3S3giLTl00rsAAACGRwAAAIZHAAAAh0QN7dfzZ\nu/N4qG0D7RDkJthQ9qDt5F7hG7m+vylP+zNq+jhvdse89r00bn6aI72PXmPrh+kI70q4P3jjUXAo\n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\nAABJRU5ErkJggg==\n", "output_type": "display_data"}], "prompt_number": 23, "cell_type": "code", "language": "python", "metadata": {}, "input": ["exo2()"]}, {"collapsed": false, "outputs": [], "prompt_number": 24, "cell_type": "code", "language": "python", "metadata": {}, "input": ["%% Insert your code here."]}, {"source": ["Display the geodesic distance map using a cosine modulation to make the\n", "level set appears more clearly."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [{"metadata": {}, "png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAIAAADOgk3lAAAACXBIWXMAAAsSAAALEgHS3X78AAAA\nIXRFWHRTb2Z0d2FyZQBBcnRpZmV4IEdob3N0c2NyaXB0IDguNTRTRzzSAAAgAElEQVR4nO3d8Wve\n9b338ff3trKOphix0kgjixx/cFAwYsXKcri9MdKIPdBiy3qwYmSVu9IcVrGyjkWaYsZ6MLKO02IO\nq5hhZR2tNHA6TDFye1hHO6wYoTB/cJhhiimrGDFlDjs+9z/weX65K7sz3uz5+PHz4vP9fq7r+l55\nc/3wzrsppYQkSdn8j7/3ASRJ+josYJKklCxgkqSULGCSpJQsYJKklCxgkqSULGCSpJQsYJKklCxg\nkqSULGCSpJQsYJKklCxgkqSULGCSpJQsYJKklCxgkqSULGCSpJQsYJKklCxgkqSULGCSpJQsYJKk\nlCxgkqSULGCSpJQsYJKklCxgkqSULGCSpJQsYJKklCxgkqSULGCSpJQsYJKklCxgkqSULGCSpJSW\n/b0P8I/lUAxR9G+9h3Db+6MQbMctX/VQUk41FE1vxuudg/Vh3BHxBSbN8oJZD1/w4gRnc7C+Hnf8\nUz9GezFZsWORom1xDE5Ab16c4+Mdi20UXTnSQVEcgPU/TOMWPl5ENyZrBjGaxaR8Cc/eStxCj360\nfbTRfxKjZiM8e9fP8vWOYnInfgP+Ywa/7EMdh+vBIn8vVOMvMElSShYwSVJKFjBJUkoWMElSShYw\nSVJKFjBJUkoWMElSShYwSVJKTSm2zi2dppcz7FaOiN3V1bvLB7Th/NA9FB2CHsqI4P7YGPw+rB98\nhbb8YuMgXu7X3BmKLckRwRd8qau6/OhOvNHRxcfwanv4CBOYnP9Lfb3l9XCfcKz7BmeDHI3Vl7d3\nvEo7Xhvndvin5vlOExzxy3q4fq/HT+HVJnY/gdHP8D7YbR4xtKu+vu7QO7Tl3eYOvt5BTLjH+Zcz\n9S516oUX8ReYJCklC5gkKSULmCQpJQuYJCklC5gkKSULmCQpJQuYJCklC5gkKSUbmZdU01xzt3JE\nbChnqutTAw/RlgOn8TZ9fIK+9zBqOuE5uW2Wr9fSrbwJk1fXUvLz7Tso2jHycnV9bj/e5wQmscBR\nvV86IiJuv8b1iPjwa0Ut3cWdsL6Ft3Tvw+jIyPcoevLoEdz22AW+2ySsczP1Rz2UlAWcLX7mLrxe\n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\nklKygEmSUrKASZJSsoBJklKykXlpNdjb2DoQ9n5IeDTv8SFKyjI8w/hmvF4PrA98jFua6ZYe55Y5\nztxP+ig23T5/tN5POjz0Y9oyfRjvcwaTtg7ZPlhfW2+cjYi4gD3lbWdo6TenM/Tvwi2jh35E0XPb\nuYH3tZYecWyij1fqPd2lH5/JqVvxYrN8gp0nMWquwmO59RBfD6djP17epqhlKvoBWN/rX+Nr5C8w\nSVJKFjBJUkoWMElSShYwSVJKFjBJUkoWMElSShYwSVJKFjBJUko2Mi+pUW5kHv4+7mp2w2d0W0s7\ncAcmf8KuzDKOxzv4XH39Dj7BAAxxjoimk5+6b8/wJblxm+YXv4mdx8f7t1C0ZQwGG0fEs5jQ4WZx\nB7aHR0vrbES8gMmJPfVh0lunT+CeB1sao1tmavMBf99LSVmoP2BTPFv5Az7B7ucxanbyA3YzfVCL\nuOUjnKldDuJXZvRneL1h6m1f8K/xtfEXmCQpJQuYJCklC5gkKSULmCQpJQuYJCklC5gkKSULmCQp\npWV/7wP8Y1nP0QR3jZTBeq9J81PuGnmap/PdfJ6SZeUriq7G9dX1cegPi4gJbu4p+7B7ZqC8QdHp\ndfWplRER78J8xQexuWdr8EjGfdg1tabMUTQc9fGPW2KStkzGJoq6A1/sxZFuiqK5DMEYbmlpGbwb\nz7Dh/BRFUyP44U7sr69/iSdoa/ZaNoyPazT4kGNj3k95Biy0r0Xr17blyz678K3qeg9vUZW/wCRJ\nKVnAJEkpWcAkSSlZwCRJKVnAJEkpWcAkSSlZwCRJKVnAJEkpOdByaU1iR+ShzbiJ5gP2lhW0ZeUQ\nT+c73NLTej8mf1pXXS5n8BVN8Stq6TLFWX8RCwuY3Ti/UA9wtmLEpQnOsFs5AidkRtTfooi1vOUC\nRy1vUssISuhxXj2IO3iA6GddnRR1dn5O0Sgm+AYNnMQtTV/LaMqWt+htTHbtqS5/cQgbumeaKxjx\nCYZaXtRi/UWV7Xw51fgLTJKUkgVMkpSSBUySlJIFTJKUkgVMkpSSBUySlJIFTJKUkgVMkpSSE5mX\nVLMRuzLLLuwIPnC4vt7F/ZUflR6KbqOJtBFxuGWOc715tjmOr+izgm2wA83XaYO9nXeVB+rv3vz8\natrSy02ol/Zwt/JBTOKvZyA4xnt6MLluB0a7MVk9Vv+YZrj/uqv/EkXH3sIbfYgJT5KOWCj1VvTm\nBPShR8TNp/h6s5hAt3JEfHSop7o+z98m+lwjYu8ujFq+7HE9zLPePsC3UoW/wCRJKVnAJEkpWcAk\nSSlZwCRJKVnAJEkpWcAkSSlZwCRJKVnAJEkp2ci8tK6fpWRdeYei8x/eU10fPY332db8kaIvCk6e\nXXk7z3F+Grpxt2Lv840PYHfq42WCoomxJyg69ywlMQIttz0NdunOr7gFLzeKyeWrN1E0Hjur69PR\nT1v6AxpaI3bGJopWHfyUooDPdgKbdFuagaOlq3bbCxgN7nmFol/0D9aDt7iDPlZh8tMhSr7YjQ85\nNSy3dJsPb8Bo3SH82kYzy5f8ANZtZL42/gKTJKVkAZMkpWQBkySlZAGTJKVkAZMkpWQBkySlZAGT\nJKVkAZMkpdSUwmND9bfWNNwiy3N2N5T6SNipgYdoywHuce7jE/S9h1HTCc/JbbN8vaMcYZduvLqW\nkp9vxyHFO0Zerq7P7cf7nMAkeDwwDzaOuP0a16N1rnFLVB+6HBERNAN7C2/p3ofRkZHvUfTk0SO4\n7bELfLdJWN+OOz7qoaQs4BDzM3fh9Wi88l7uVh6YeoOi003L94mndz9cH1tdWqZPq8ZfYJKklCxg\nkqSULGCSpJQsYJKklCxgkqSULGCSpJQsYJKklOwDW1JNL2fvX3OL2N2FxuLF+aH6DMyIOHQYb4ND\nACMGvw/rB3l64cZBvNyvW1rE5lpOgclL9QatR3fijY4uPoZX28NHmMDk/F/q6y2vp5ujdd/gbJCj\nsfry9o5Xacdr49yD9VRLy9kER/yyHq7f6/FTeLWJ3TjgdOJneB8ezBpDu+rrLaMp323u4Otxs9ed\n9WaviPjlzLbq+ra2sZqq8BeYJCklC5gkKSULmCQpJQuYJCklC5gkKSULmCQpJQuYJCklC5gkKSUb\nmZfUoRii6N96D+E27HHmFtSveigpp3AM4PRmvN45WMdezYj4ApNmOT91PXzBixOcUbvwetzxT/0Y\n7cVkxQ7skaUu1PX45sU5Pt6xqPe6RsSVI9xxfgDW/zCNW/h4bS3JawYxmsWkfAnP3krc0tLezx9t\n9J/EqNkIz971s3w97rvnbuX/mMEv+1AH/DeBRf8aXxt/gUmSUrKASZJSsoBJklKygEmSUrKASZJS\nsoBJklKygEmSUrKASZJSspF5aXVgE/Gxxe9S9K8bYU7rr3kabPAM2VcHKPloew9FPZ1/rK4f+Bzv\nU5+RHBERg/diNH9uNUXdPNz4rwPL6sHp83yKMxy1TPTt5KgH1lsGL7eMa57laIEj6nHuwx0b1lFy\n3dRViub4RXWtv0TRxO/q6y2Dn/fegNHswrcouu3oLG57bLLh/rcAAAE3SURBVAoCnG8eD9dHokfE\nL09hv/m2jl9RNHIF1v1rfI38BSZJSskCJklKyQImSUrJAiZJSskCJklKyQImSUrJAiZJSskCJklK\nyUZmSVJK/gKTJKVkAZMkpWQBkySlZAGTJKVkAZMkpWQBkySlZAGTJKVkAZMkpWQBkySlZAGTJKVk\nAZMkpWQBkySlZAGTJKVkAZMkpWQBkySlZAGTJKVkAZMkpWQBkySlZAGTJKVkAZMkpWQBkySlZAGT\nJKVkAZMkpWQBkySlZAGTJKVkAZMkpWQBkySlZAGTJKVkAZMkpWQBkySlZAGTJKVkAZMkpWQBkySl\nZAGTJKVkAZMkpWQBkySlZAGTJKVkAZMkpWQBkySlZAGTJKVkAZMkpWQBkySlZAGTJKVkAZMkpWQB\nkySlZAGTJKX0fwEapR7xKnMniwAAAABJRU5ErkJggg==\n", "output_type": "display_data"}], "prompt_number": 25, "cell_type": "code", "language": "python", "metadata": {}, "input": ["clf;\n", "imageplot(displ(D));\n", "colormap jet(256);"]}, {"source": ["Computation of Geodesic Paths\n", "-----------------------------\n", "We use a more complicated, non-constant metric, with a bump in the\n", "middle."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 26, "cell_type": "code", "language": "python", "metadata": {}, "input": ["n = 100;\n", "x = linspace(-1,1,n);\n", "[Y,X] = meshgrid(x,x);\n", "sigma = .2;\n", "W = 1 + 8 * exp(-(X.^2+Y.^2)/(2*sigma^2));"]}, {"source": ["Display it."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [{"metadata": {}, "png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAIAAADOgk3lAAAACXBIWXMAAAsSAAALEgHS3X78AAAA\nIXRFWHRTb2Z0d2FyZQBBcnRpZmV4IEdob3N0c2NyaXB0IDguNTRTRzzSAAATOElEQVR4nO3d23Ib\nNxYFUCqxndv/f2oytnPRPEwVChUdAiCaTWqP1nrqgptki5rJrj4HOv3y+vp6AYA0Pzz7AgBghwAD\nIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMg\nkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCS\nAAMg0qdnX8DH8vLy8uxLAN6p19fXZ19CGHdgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABE\nEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQS\nYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJg\nAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABEEmAA\nRBJgAEQSYABEEmAARBJgAEQSYABEEmAARBJgAEQSYABE+vTsC4BgLy8vT/z019fXJ346PJ07MAAi\nCTAAIgkwACLpgcG/PbeztW79OnXL+L/kDgyASAIMgEhKiHw4J1UIH1Z43KgHTq9NjZFE7sAAiCTA\nAIgkwACIpAfG/7ODfalHdsvWu1Bn7J4/eEnwFO7AAIgkwACI9KJK8EgpIx4S7X236696WDXy4P8l\n11++90H+i3Ee3+2t3IEBEEmAARBJgAEQyTZ6st2riTV9n+d2y+7YHWlvde06x5/Vv0rPhudyBwZA\nJAEGQCQlRGKcWi3cKyGeUVcs63IPqyve9Fnmd/Bc7sAAiCTAAIgkwACIpAfGu3awyXTG4l3eYVHZ\nTyr3wY8Xj396e9vpe66fCQe5AwMgkgADIJIAAyCSHhjv0b3GPk37UuMT1s+86fI2jJth1xbb8V43\nq3zbvb8S0w/jDO7AAIgkwACIpITIe3HHYU4bNcDyzGsvXy9RjhdLd6wWjhevXd7GM52nL7e3njO4\n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\nL7g99+8iFAb54NyBARBJgAEQSYABEEkPDPbpQsETuQMDIJIAAyCSAAMgkgADIJIAAyCSAAMgkgAD\nIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMg\nkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCS\nAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIA\nAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyCSAAMgkgADIJIAAyDSy+vr67OvAQBu5g4MgEgCDIBI\nAgyASAIMgEgCDIBIAgyASAIMgEgCDIBIAgyASAIMgEgCDIBIAgyASAIMgEgCDIBIAgyASAIMgEgC\nDIBIAgyASAIMgEgCDIBIAgyASAIMgEgCDIBIAgyASAIMgEgCDIBIAgyASAIMgEgCDIBIAgyASAIM\ngEgCDIBIAgyASAIMgEgCDIBIAgyASAIMgEgCDIBIAgyASAIMgEgCDIBIAgyASAIMgEgCDIBIAgyA\nSAIMgEj/BfjMoJRe8D4cAAAAAElFTkSuQmCC\n", "output_type": "display_data"}], "prompt_number": 27, "cell_type": "code", "language": "python", "metadata": {}, "input": ["clf;\n", "imageplot(W);"]}, {"source": ["Starting points."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 28, "cell_type": "code", "language": "python", "metadata": {}, "input": ["x0 = round([.1;.1]*n); % [.8;.8]]*n);"]}, {"source": ["__Exercise 3__\n", "\n", "Compute the distance map to these starting point using the FM algorithm."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [{"metadata": {}, "png": "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\n", "output_type": "display_data"}], "prompt_number": 29, "cell_type": "code", "language": "python", "metadata": {}, "input": ["exo3()"]}, {"collapsed": false, "outputs": [], "prompt_number": 30, "cell_type": "code", "language": "python", "metadata": {}, "input": ["%% Insert your code here."]}, {"source": ["Once the geodesic distance map to $\\Ss$\n", "has been computed, the geodesic curve between any point $x_1$ and $\\Ss$\n", "extracted through gradient descent\n", "$$ \\ga'(t) = - \\eta_t \\nabla D(\\ga(t)) \\qandq \\ga(0)=x_1 $$\n", "where $\\eta_t>0$ controls the parameterization speed of the resulting\n", "curve.\n", "\n", "\n", "To obtain unit speed parameterization, one can use $\\eta_t =\n", "\\norm{\\nabla D(\\ga(t))}^{-1}$ (one need to be careful when\n", "$\\ga$ approaches $\\Ss$ since $D$ is not smooth on $\\Ss$).\n", "\n", "\n", "Compute the gradient $G_0(x) = \\nabla D(x) \\in \\RR^2$ of the distance map.\n", "Use centered differences."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 31, "cell_type": "code", "language": "python", "metadata": {}, "input": ["options.order = 2;\n", "G0 = grad(D, options);"]}, {"source": ["Normalize the gradient to obtained $G(x) = G_0(x)/\\norm{G_0(x)}$, in order to have unit speed geodesic curve (parameterized\n", "by arc length)."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 32, "cell_type": "code", "language": "python", "metadata": {}, "input": ["G = G0 ./ repmat( sqrt( sum(G0.^2, 3) ), [1 1 2]);"]}, {"source": ["The geodesic is then numerically computed using a discretized gradient\n", "descent, which defines a discret curve $ (\\ga_k)_k $ using\n", "$$ \\ga_{k+1} = \\ga_k - \\tau G(\\ga_k) $$\n", "where $\\ga_k \\in \\RR^2$ is an approximation of $\\ga(t)$ at time\n", "$t=k\\tau$, and the step size $\\tau>0$ should be small enough.\n", "\n", "\n", "Step size $\\tau$ for the gradient descent."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 33, "cell_type": "code", "language": "python", "metadata": {}, "input": ["tau = .8;"]}, {"source": ["Initialize the path with the ending point."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 34, "cell_type": "code", "language": "python", "metadata": {}, "input": ["x1 = round([.9;.88]*n);\n", "gamma = x1;"]}, {"source": ["Define a shortcut to interpolate $G$ at a 2-D points.\n", "_Warning:_ the |interp2| switches the role of the axis ..."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 35, "cell_type": "code", "language": "python", "metadata": {}, "input": ["Geval = @(G,x)[interp2(1:n,1:n,G(:,:,1),x(2),x(1)); ...\n", " interp2(1:n,1:n,G(:,:,2),x(2),x(1)) ];"]}, {"source": ["Compute the gradient at the last point in the path, using interpolation."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 36, "cell_type": "code", "language": "python", "metadata": {}, "input": ["g = Geval(G, gamma(:,end));"]}, {"source": ["Perform the descent and add the new point to the path."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 37, "cell_type": "code", "language": "python", "metadata": {}, "input": ["gamma(:,end+1) = gamma(:,end) - tau*g;"]}, {"source": ["__Exercise 4__\n", "\n", "Perform the full geodesic path extraction by iterating the gradient\n", "descent. You must be very careful when the path become close to\n", "$x_0$, because the distance function is not differentiable at this\n", "point. You must stop the iteration when the path is close to $x_0$."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [], "prompt_number": 38, "cell_type": "code", "language": "python", "metadata": {}, "input": ["exo4()"]}, {"collapsed": false, "outputs": [], "prompt_number": 39, "cell_type": "code", "language": "python", "metadata": {}, "input": ["%% Insert your code here."]}, {"source": ["Display the geodesic curve."], "metadata": {}, "cell_type": "markdown"}, {"collapsed": false, "outputs": [{"metadata": {}, "png": "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\nksmANJ/UUwAAAABJRU5ErkJggg==\n", "output_type": "display_data"}], "prompt_number": 40, "cell_type": "code", "language": "python", "metadata": {}, "input": ["clf; hold on;\n", "imageplot(W); colormap gray(256);\n", "h = plot(gamma(2,:),gamma(1,:), '.b'); set(h, 'LineWidth', 2);\n", "h = plot(x0(2),x0(1), '.r'); set(h, 'MarkerSize', 25);\n", "h = plot(x1(2),x1(1), '.b'); set(h, 'MarkerSize', 25);\n", "axis ij;"]}], "metadata": {}}], "nbformat": 3, "metadata": {"kernelspec": {"name": "matlab_kernel", "language": "matlab", "display_name": "Matlab"}, "language_info": {"mimetype": "text/x-matlab", "name": "matlab", "file_extension": ".m", "help_links": [{"url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md", "text": "MetaKernel Magics"}]}}}