{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Interior Point Methods" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "This tour explores the use of [interior point methods](https://en.wikipedia.org/wiki/Interior-point_method) for constraint minimization under positivity constraints.\n", "\n", "The definite reference for this Numerical Tour is the book [\"Convex Optimization\"](https://web.stanford.edu/~boyd/cvxbook/) of Boyd and Vandenberghe, which is a must read.\n", "\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", "$\\DeclareMathOperator{\\eqdef}{\\overset{\\tiny def}{=}}$" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "import math as m\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Useful helpers." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "def dotp(x,y):\n", " return np.sum( x.flatten()*y.flatten() )\n", "np.random.seed(123) # to ensure reproductibitily " ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Problem formulation\n", "\n", "The goal is to solve problem of the form:\n", "$$\n", " (\\mathcal{S}_\\infty) \\qquad \\umin{x\\in \\RR^d, A x \\leq b} f(x)\n", "$$\n", "for $A \\in \\RR^{m \\times d}$.\n", "\n", "This can be generalized for instance by replacing $A x$ by a matrix and $\\leq$ by PSD matrix inequalities." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Lasso Primal Problem\n", "\n", "The [Lasso problem](https://en.wikipedia.org/wiki/Lasso_(statistics)) (applied to the regression problem $Bw \\approx y$ for the design matrix $B \\in \\RR^{n \\times p}$)\n", "$$\n", "\t\t(\\mathcal{P}_\\la) \\qquad \n", " \\umin{w \\in \\RR^p} \\frac{1}{2}\\norm{Bw-y}^2 + \\la \\norm{w}_1\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Set the parameters $(n,p)$ of the Lasso problem and generate a random Gaussian matrix (so that the problem is a [compressed sensing](https://en.wikipedia.org/wiki/Compressed_sensing) problem, with $n0] = np.log(w[v>0])\n", " return np.sum(w)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The gradient and hessian of $f_t$ read\n", "$$\n", "\t\\nabla f_t(x) = \\nabla f(x) + \\frac{1}{t} A^\\top \\frac{1}{y-Ax}\n", "\t\\qandq\n", "\t\\partial^2 f_t(x) = \\partial^2 f(x) + \\frac{1}{t} A^\\top \\text{diag}\\pa{\\frac{1}{(y-Ax)^2}} A.\n", "$$" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "def ft(x,t):\n", " if t<0:\n", " return f(x)\n", " else:\n", " return f(x) - 1/t * Log(b - A@x)\n", "def nablaft(x,t):\n", " return nablaf(x) + 1/t * A.T @ (1/(b - A@x))\n", "def hessianft(x,t):\n", " return hessianf(x) + 1/t * A.T @ np.diag( 1/(b-(A@x))[:,0]**2 ) @ A" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Should be 0: 6.905096885932568e-07\n", "Should be 0: 2.9706266473930562e-09\n" ] } ], "source": [ "t = 10\n", "x = .5 + np.random.rand(d,1)\n", "u = .5*np.random.randn(d,1)\n", "m2 = (ft(x+tau*u,t)-ft(x,t))/tau\n", "m1 = dotp( u, nablaft(x,t) );\n", "print('Should be 0: ' + str(abs(m1-m2)/abs(m1)) )\n", "m2 = (nablaft(x+tau*u,t)-nablaft(x,t))/tau\n", "m1 = hessianft(x,t)@u;\n", "print('Should be 0: ' + str(np.linalg.norm(m1-m2)/np.linalg.norm(m1)) )" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Initialize the algorithm using a feasible point, i.e. here $x>0$." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "x = .01*np.ones((d,1))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "For a fixed $t$, one can solve $(\\mathcal{S}_t)$ using [Newton method](https://en.wikipedia.org/wiki/Newton%27s_method) with some [line search](https://en.wikipedia.org/wiki/Line_search) procedure to select the step size $0<\\tau_\\ell\\leq 1$\n", "$$\n", "\t(N) \\qquad x_{k+1} \\eqdef x_k + \\tau_\\ell d_k \n", " \\quad\\text{where}\\quad\n", " d_k \\eqdef -[ \\partial^2 f_t(x_k)]^{-1} \\nabla f_t(x_k)\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "dk = - np.linalg.solve(hessianft(x,t),nablaft(x,t))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The use of a backtracking is extremely important in our case to ensure that the iterate stays within the constraints." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The simplest linesearch rule is [Armijo](https://en.wikipedia.org/wiki/Backtracking_line_search), which imposes that, for some $0 < \\al < 1/2$ one has\n", "$$\n", " \\text{(AC)}\\qquad\n", " \\phi_k(\\tau_k) \\eqdef f(x_k + \\tau_k d_k )\n", " <\n", " \\psi_k(\\tau_k) \\eqdef f(x_k) + \\alpha \\tau \\dotp{d_k}{\\nabla f(x_k)}. \n", "$$" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "alpha = .3\n", "def phik(tau):\n", " return ft(x+tau*dk,t)\n", "def psik(tau):\n", " return ft(x,t) + tau*alpha*dotp(dk,nablaft(x,t))\n", "phik = np.vectorize(phik)\n", "psik = np.vectorize(psik)\n", "tau = np.linspace(0,1,1000)\n", "plt.plot(tau, phik(tau), 'b', label='$\\phi_k$')\n", "plt.plot(tau, psik(tau), 'r', label='$\\psi_k$')\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "A backtracking method then selects the step size by initializing $\\tau_k=1$, and following a geometric decay by a factor $0<\\be<1$ until Armijo conditon (AC) is satisfies. " ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "beta = 0.7\n", "tauk = 1\n", "while ft(x+tauk*dk,t)>ft(x,t)+alpha*tauk*dotp(nablaft(x,t),dk):\n", " tauk = beta*tauk" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Once the step size is selected, perform the descent step $x_{k+1} \\eqdef x_k+\\tau_k d_k$." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "x = x + tauk*dk" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Now we implement the full Newton method by putting all these steps together. We also record the number of backtracking steps at each iterations." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "def newton(ft,nablaft,hessianft,x,t,epsilon):\n", " ftlist = np.array([])\n", " flist = np.array([])\n", " backtrack = np.array([])\n", " while True:\n", " ftlist = np.append(ftlist, ft(x,t))\n", " flist = np.append(flist, ft(x,-1))\n", " dk = -np.linalg.solve(hessianft(x,t),nablaft(x,t))\n", " deltak = -dotp(nablaft(x,t),dk)\n", " if deltakft(x,t) - alpha*tauk*deltak:\n", " it = it+1\n", " tauk = beta*tauk\n", " backtrack = np.append(backtrack, it)\n", " x = x+tauk*dk\n", " return x, ftlist, backtrack, flist" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Display in log scale the decay of the error and the numbr of backtracking step. When the number of such steps reaches 0, Newton's algortihm enter a quadratically convergence rate regime." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "epsilon = 1e-6\n", "t = 100\n", "x = np.ones((d,1))\n", "x, ftlist, backtrack, flist = newton(ft,nablaft,hessianft,x,t,epsilon)\n", "plt.subplot(2, 1, 1)\n", "plt.plot(ftlist, 'b', label='$f_t(x_k)$')\n", "plt.legend()\n", "plt.subplot(2, 1, 2)\n", "plt.plot(backtrack, 'r', label='#backtrack');\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Display the solution $(x_+,x_-)$ computed, supperposed over the groud trust to recover $w_0$." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.stem( w0, linefmt='--k', markerfmt='ko', label='$w_0$' )\n", "plt.stem( x[0:p], linefmt='-r', markerfmt='ro', label='$x_+$' )\n", "plt.stem( -x[p:], linefmt='-b', markerfmt='bo', label='$-x_-$' )\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Display the evolution with $t$ of the solution computed." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tlist = np.array([1, 10, 100, 1000])\n", "for it in range(0,4):\n", " x, ftlist, backtrack, flist = newton(ft,nablaft,hessianft,x,tlist[it],epsilon)\n", " plt.subplot(2,2,it+1)\n", " plt.stem( w0, linefmt='--k', markerfmt='ko' )\n", " plt.stem( x[0:p], linefmt='-r', markerfmt='ro' )\n", " plt.stem( -x[p:], linefmt='-b', markerfmt='bo' )" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Note that on this example, the primal solution $w^\\star$ is supported on the same locations as the ground trust $w_0$ to recover. This indicates that $\\ell^1$ regularization has succeeded in almost exactly (up to the impact of the noise) recover the unknown ground trust vector $w_0$, with the exact correct non zero locations. This is guaranteed by the theory of compressed sensing, which ensure exact recovery if $n = O(s \\log(p/s))$ where $s$ is the number of non zero entries in $w_0$ (here $s=4$)." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The interior point method\n", "======\n", "\n", "The [interior point method](https://en.wikipedia.org/wiki/Interior-point_method) proceeds by $f_t$ using (N) (defining an approximated \"central\" path $t \\mapsto x(t)$) for a series of increasing step sizes $t \\eqdef t_\\ell=\\mu^\\ell t_0$ for some $\\mu > 1$. The crucial point here is to use a \"warm restart\" strategy: in order to solve for $x(t_{\\ell})$, one should initialize the Newton steps (N) using $x(t_{\\ell-1})$. This is what makes interior point methods efficient. Thanks to the use of a logarithmic barrier, one can show the upper bound $f(x(t_\\ell))-f(x^\\star) \\leq m/t_\\ell$ ($m$ being the number of scalar constraints), so that in order to a final error of $\\epsilon$, one needs to use $\\ell=0, \\ldots, L$ such that \n", "$$\n", "\t\\frac{m}{t_{L}} = \\frac{m}{t_0 \\mu^{L}} \\leq \\epsilon.\n", "$$\n", "This shows that only $O(|\\log(\\epsilon)|)$ steps are necessary to reach $\\epsilon$ precision." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Implement the method, and store the values of $f(x_{k,\\ell})$ during all the Newton steps $k$ for $t=t_\\ell$. " ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "mu = 50\n", "t = 1 \n", "x = np.ones((d,1))\n", "Flist = np.array([])\n", "while m/t >= epsilon:\n", " x, ftlist, backtrack, flist = newton(ft,nablaft,hessianft,x,t,epsilon)\n", " Flist = np.append(Flist, flist)\n", " t = mu*t" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Display the evolution of $f(x_{k,\\ell})-f(x^\\star)$ in logarithmic scale. This highlights the different steps of the algorithm (and migh even be non-decreasing), where the energy starts decaying and then stagnates, until $t=t_k$ is changed to $t=t_{k+1}$" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot( np.log10(Flist[0:-1]-np.min(Flist)), label='$f(x_{k,\\ell})-f(x^\\star)$' )\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "To bound the running time of the IP method, the important question to bound the complexity of the method is thus to bound the number of Newton steps (N). This requires additional hypotheses on $f$. If the function $f$ has a so-called self-concordance property, namely that for any $(x,y)$, $\\phi(s) \\eqdef f(s x + (1-s)y)$ satisfies\n", "$$\n", "\t|\\phi'''(s)| \\leq 2 \\phi''(s)^{3/2}, \n", "$$\n", "one can then that only a constant number of Newton steps are required per iterations (note that $-\\log$ being self-concordant, and quadratic function are self concordant, $f_t$ is itself self-concordant) when using the warm-restart initialization to computes the succession of $x(t_\\ell)$. \n", "This result might look surprising, but is possible because of the combination of the warm restart strategy with the self-concordance property of $f_t$: although problems become more and more difficult ($f_t$ is becoming less regular) as $t$ increases, the number of iterations of Newton stays constant.\n", "This fundamental result supports the claim that interior point methods solve linear programs (and more general types of problems including SDP problems) in polynomial time (where polynomial refers to polynomial in $\\log(\\epsilon)$)." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "We want to display the influence of $\\mu$ on the decay of the energy. For this we first compute an accurate appoximation of $f(x^\\star)$ using a small $\\epsilon$." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "mu = 200\n", "t = 1 \n", "x = np.ones((d,1))\n", "Flist = np.array([])\n", "while m/t >= epsilon/100:\n", " x, ftlist, backtrack, flist = newton(ft,nablaft,hessianft,x,t,epsilon/100)\n", " t = mu*t\n", "fmin = np.min(flist)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Display the influence of $\\mu$. One can see that unless one used very small or very large $\\mu$, all the runs are in the same ballpark, and one observe approximately a linear rate of convergence, with a constant number of inner Newton steps (index $k$) per interior point step (index $\\ell$)." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "mulist = np.array([4, 10, 50, 100, 500, 1000, 5000])\n", "for it in range(0,len(mulist)):\n", " mu = mulist[it]\n", " t = 1 \n", " x = np.ones((d,1))\n", " Flist = np.array([])\n", " while m/t >= epsilon:\n", " x, ftlist, backtrack, flist = newton(ft,nablaft,hessianft,x,t,epsilon)\n", " Flist = np.append(Flist, flist)\n", " t = mu*t\n", " s = it/(len(mulist)-1)\n", " plt.plot( np.log10(Flist[0:-1]-fmin), color=(s,0,1-s), label='$\\mu=' + str(mu) +'$' )\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Interior Point Method for the Dual of the Lasso\n", "=====\n", "\n", "The dual of the Lasso $(\\mathcal{P}_\\la)$ (written for simplicity as a convex minimization instead of a concave maximization) reads\n", "$$\n", "\t\t(\\mathcal{D}_\\la) \\qquad\n", " \\umin{\\norm{B^\\top q}_\\infty \\leq 1} f(q) = \\frac{\\la}{2}\\norm{q}^2 - \\dotp{q}{y}.\n", "$$\n", "It has the form $(\\mathcal{S}_\\infty)$ when setting $A=\\begin{pmatrix} B^\\top \\\\-B^\\top \\end{pmatrix}$ and $b = 1_{2p}$ (so that $d=n$ and $m=2p$)." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "m1 = 2*p\n", "d1 = n\n", "A = np.concatenate((B.T,-B.T), axis=0)\n", "b = np.ones((m1,1))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Implement $f$ and its derivative." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "def f1(q):\n", " return lamda/2*np.linalg.norm(q)**2 - dotp(q,y)\n", "def nablaf1(q):\n", " return lamda*q - y\n", "def hessianf1(q):\n", " return lamda*np.eye(n)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Re-define the function $f_t$ and its derivatives." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "def f1t(q,t):\n", " if t<0:\n", " return f1(q)\n", " else:\n", " return f1(q) - 1/t * Log(b - A@q) \n", "def nablaf1t(q,t):\n", " return nablaf1(q) + 1/t * A.T @ (1/(b - A@q))\n", "def hessianf1t(q,t):\n", " return hessianf1(q) + 1/t * A.T @ np.diag( 1/(b-(A@q))[:,0]**2 ) @ A" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Run Newton with the logarithmic barrier on the dual problem $(\\mathcal{D}_\\la)$.\n", "A feasible initialization is simply $q=0$." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD8CAYAAABjAo9vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl8VOXZ//HPRQgEENlCEQkYRFYRgo0ggiwqbvAA4r5U6lIeVFBKFcWt4lNbtUptrWIRcYWKIlRtFQQlIJYtYJQtbog/oiiLsghEINy/P+4JIRJIyMzkzEy+79drXsls51wT5ZuT+9znus05h4iIJI4qQRcgIiKRpWAXEUkwCnYRkQSjYBcRSTAKdhGRBKNgFxFJMAp2EZEEo2AXEUkwCnYRkQRTNYidpqamuvT09CB2LSISt5YuXbrJOdewtNdFJNjN7Fzgr0ASMME59+DhXp+enk52dnYkdi0iUmmY2VdleV3YQzFmlgQ8AZwHtAMuN7N24W5XRETKJxJj7J2Bz51za5xzu4GXgQER2G6JduyI1pZFRBJDJIK9CbDugPt5occi7s47oXt32LkzGlsXEUkMkRhjtxIeO6gXsJkNAYYANGvWrFw76t4dHnwQhg6F558HK2nPIpJQ9uzZQ15eHvn5+UGXUmFSUlJIS0sjOTm5XO+PRLDnAU0PuJ8GfPPzFznnxgPjATIzM8vVBP788+G+++D3v4cuXeCmm8qzFRGJJ3l5edSuXZv09HSsEhzNOefYvHkzeXl5NG/evFzbiMRQzBKgpZk1N7NqwGXAGxHYbonuvhv69YMRI+C//43WXkQkVuTn59OgQYNKEeoAZkaDBg3C+gsl7GB3zu0FhgEzgdXAK865leFu91CqVIEXX4TjjoOLLoJvv43WnkQkVlSWUC8U7ueNyJWnzrm3nHOtnHMtnHMPRGKbh1O3LkyfDlu3wsUXw5490d6jiEj8iNuWAiedBBMmwPz5cOutQVcjIhI74jbYAS6/3I+1/+1vMGlS0NWISKL73e9+R7t27Rg+fPj+x3bt2kXPnj0pKCgo83Z2795Njx492Lt3bzTKjO9gB3j4YejRA37zG/joo6CrEZFEtWbNGj744ANWrVrF448/vv/xiRMnMmjQIJKSksq8rWrVqnHmmWcyZcqUaJQa/8GenAyvvAL16sGgQfDDD0FXJCKJ5pNPPqFnz5589dVXdOrUiR0HXAI/adIkBgwouti+d+/ezJo1C4C7776bm2++ucRtDhw4kElRGmoIpLtjpDVqBFOnQs+ecOWV8O9/+9kzIiKR0Lp1awYPHkx6ejrXX389P/zwA7Vq1WL37t2sWbOGA7vVjhkzhnvvvZcNGzbw4Ycf8sYbJc/+bt++PUuWLIlKvQkR7ABdu/qx9htugDFj/E1EEsuIEZCTE9ltZmTAY4+V/rrly5fvPzL/7W9/y3PPPcemTZuoW7dusdf16NED5xxjx44lKytr/xDNtddey8SJE/e/LikpiWrVqrF9+3Zq164duQ9EAgzFHOh//xd+/Wu4/35/1C4iEikrV67kxBNPZMaMGeTm5vLII49Qo0aNgy4kWr58OevXr6d69er7A3vnzp3UqVOHOXPmcPvtt+9/z08//URKSkrEa02YI3bwvWOefBI+/hiuugqys+GEE4KuSkQipSxH1tGwfft2kpOTqVmzJqmpqVx11VUMGzYMgIKCAvLz80lJSWH9+vVceeWVvP7669x8883MnDmTc845h2XLlpGTk0Pr1q156KGHANi8eTMNGzYsdz+Yw0moI3aAGjXgtdcgKQkuuEBtfkUkfCtWrKB9+/YAfPzxx3Ts2HH/c2effTbz589n586dDBo0iEcffZS2bdtyzz33cN999wGwZMkSunTpQq1atfa/b86cOZx//vlRqTfhgh0gPR1efhlWrYLrrwdXrpZjIiJe165defXVVwFITU1lwoQJrF69GoBhw4bx/PPPU7NmTRYsWECfPn0AP9a+YMECAFatWsUf//hHcnNzef/99wGYPHkyQ4YMiUq9CTUUc6A+feAPf/A93Lt08SddRETC1b9/f/r377//fqdOnejduzcFBQWHnMv+9NNPA/DAA77jyu7duxk4cCCtW7eOSo0JecRe6I47/HDMrbfC3LlBVyMiieraa6894guUrr766qjVk9DBbgbPPedPoF5yCXz9ddAViYhEX0IHO8DRR8O0aX45vYsugp9+CroiEZHoSvhgB2jXDp59FhYuhN/+NuhqRESiq1IEO/ij9VGjYNw4H/IiEj9cJZvaFu7nrTTBDvDAA3DGGb7twNKlQVcjImWRkpLC5s2bK024F655Gs4VqQk73bEkVav6+e2//CVceKG/MjU1NeiqRORw0tLS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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "t = 100\n", "q, ftlist, backtrack, flist = newton(f1t,nablaf1t,hessianf1t,np.zeros((d1,1)),t,epsilon)\n", "plt.subplot(2, 1, 1)\n", "plt.plot(flist, 'b', label='$f_t(x_k)$')\n", "plt.legend()\n", "plt.subplot(2, 1, 2)\n", "plt.plot(backtrack, 'r', label='#backtrack');\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Display how much the dual solution is strictly inside the constraints." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "eta = B.T @ q\n", "plt.stem( eta, linefmt='-r', markerfmt='ro', label='$B^T x$' ) \n", "plt.plot( eta*0+1, 'k--' ) \n", "plt.plot( eta*0-1, 'k--' ) \n", "plt.stem( w0, linefmt='--k', markerfmt='ko', label='$w_0$' ) \n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The primal-dual relation between optimal primal/dual solutions $(w^\\star,x^\\star)$ (note that $q^\\star$ is unique because the dual problem is srongly convex) reads\n", "$$\n", " q^\\star = \\frac{y-B w^\\star}{\\la}\n", " \\qandq\n", " \\{ i : w^\\star_i \\neq 0 \\} \\subset \n", " \\{ i : |(B^\\top q^\\star)_i| = 1\\}\n", "$$\n", "which explains why in the above plot the points where $B^\\top q$ approximatively saturates the constraints match the locations of the diracs in $w_0$ (since in this case, the primal solution $w^\\star$ is supported on the same locations as the ground trust $w_0$ to recover). " ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "It is now possible to also implement the interior point method using Newton on the dual functional. The conclusion are the same as on the primal problem regarding the impact of $\\mu$." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD8CAYAAABjAo9vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsnXd0lEUXh593d9N7pSSQQOgtQAJIB+lFem8iIIgg4ocKglSRIqggIoqCBURAiihSpErvhA4JPaGkQhppuzvfH68EYxJIyKYyzzlzNpn2zizk7uzMnftThBBIJBKJpOigye8BSCQSicS0SMMukUgkRQxp2CUSiaSIIQ27RCKRFDGkYZdIJJIihjTsEolEUsSQhl0ikUiKGNKwSyQSSRFDGnaJRCIpYujy46Gurq7C29s7Px4tkUgkhZaTJ09GCCHcnlUvXwy7t7c3J06cyI9HSyQSSaFFUZRbWaknt2IkEomkiCENu0QikRQxpGGXSCSSIka+7LFLJJKiS0pKCiEhISQmJub3UAotlpaWeHp6YmZm9lztpWGXSCQmJSQkBDs7O7y9vVEUJb+HU+gQQhAZGUlISAhlypR5rj7kVoxEIjEpiYmJuLi4SKP+nCiKgouLS46+8UjDLpFITI406jkjp+9foTLs2z1e45SuLjf3XMvvoUgkEkmBpVAZ9kp3d1PbcByPlytyTluTKxvP5feQJBKJpMBRqAy7l7jFVp/RxGFHdeMZfLrV4pK2CmeXHcnvoUkkEkmBodB5xbS7ughYxNZaH1An4FsqGy9hGNaQW8M8ScICLUY0GFH+edVgzLAfgcK5usNof3Rq3k5AIpEUOgwGA/7+/nh4eLB58+b8Hs4zKXSG/THtTs8GZrO1+Rxq7/2cUgSnlgmUfxJAxocQWgy4H5vF/ZNDKO5XKi+GLJFICikLFy6kcuXKxMTE5PdQskSh2orJiHZ7JlBMhKIRxtSkFQZ0Qo+Z0GMmUjJM2xx6YUEy0fXaIITI72lIJBIT06xZM65cuQJAZGQk1apVe65+QkJC+PPPPxk2bJgph5erFNoVe06pvX8h92rspYLhEnu7fE7zTf/L7yFJJEWOsWMhIMC0fdasCQsWPLve1atXKV++PABnz56levXqacobN25MbGxsunbz58+nZcuWqb+PHTuWTz75JMO6BZUX1rAXr16Mn+y60S92KX6/T+Xuyd6U9PPI72FJJBITcOvWLTw8PNBo1E2Js2fPUqNGjTR19u/f/8x+Nm/ejLu7O35+fuzduzc3hporvLCGHaDS7MGcH32QmpwlsGEviscfQKOVFyskElORlZV1bhAQEJDGkJ88eZLevXunqZOVFfvBgwf5/fff2bJlC4mJicTExDBgwABWrlyZuxPIKUKIPE9+fn6ioPC9dqiIwkGkoBXbXlmU38ORSAo9Fy9ezO8hiOnTp4sBAwYIIYQIDAwU9vb24tatWznqc8+ePaJDhw6mGF6WyOh9BE6ILNhYk6zYFUVpCywEtMB3Qog5pug3L3Ds2oxj627Tip3U/mM613Z3xOdl72e2i4+HW7fUdPcuPHoECQmQmJg2GY0ghJrgyWtmtGwJ/1lYSCSSbBIQEICVlRW+vr7UqFGDypUr8+OPPzJ58uT8HlqeoIgceoQoiqIFAoFWQAhwHOgrhLiYWRt/f39RUKTxUuIT+dV2CNU5R3XOs9+iJfUebMPcSpta5/ZtWL8eDhx4YswjIjLv08wMLC3BwgK0/3SjKGp6/HNGJCRAdDQcOwZ+fiaaoESSx1y6dInKlSvn6xjKlSvH6dOnsbOzy9dx5ISM3kdFUU4KIfyf1dYUK/a6wFUhxPV/Hrwa6AxkatgLEmY2lugrVSfwchKlCKZu0j62df2aqotHsX69atCPHVPrliunJn9/8PJ6kjw9wdb2iTHXPee7+vAhVKkCr7+uPvN5+5FIXmRiY2PRaDSF2qjnFFOYDg/41+0gddVezwT95hmtf+rHvrqn2WPelq7Ja6iz/SNalGvGJari7w+zZ0P37vCP51Su4egIixZBjx7w+efw3nu5+zyJpChiZ2dHYGBgfg8jXzHFBaWMNhbS7e8oijJcUZQTiqKcCA8PN8FjTUfxOl48cihJQrKG48XaU4JQtus6cv1IGMePw4QJuW/UH9OtG3TuDFOnwvXrefNMiURStDCFYQ8B/n0n3xO4+99KQoilQgh/IYS/m5ubCR5rWqpO7IQZeo7Zt+ayS0NK6W/i2Kkxxti4PB2HosDixeo2zIgRzz5slUgkkv9iCsN+HCivKEoZRVHMgT7A7yboN0/xf7cZSVprrIMCCP98JUeoh1NYII+q1kUkJeXpWDw8YM4c2LkTCrq7rEQiKXjk2LALIfTAaGA7cAlYK4S4kNN+8xpFo8G+Q0NsiefKr2f5ucxkzjo2wTb4EonV/PPcuL/xBjRoAO+8AwVs50oikRRwTBIETAixRQhRQQjhI4T42BR95getv+uNEYXEzTup2sGLmQ9HE1a7DVZXz5NSs47qrJ5HaDSwdCnExMD/ZBgbiUSSDaRD3b+wdLPHwr8G7ifOsHHJJXSWWtZWnUZ/xYDjyZ3oa9dBt3O76t+YB1Stqh7cfvQRDBgAbdqkLU9JETwI1xMdZSD2oZGYBwaiHxiIfaj+npRoRJ8C+hSRJhn/FaI+K3v4rsV1jJ3tjlaGW5BICgXSsP+H5mvfYHPZMbRjK6sSe3HglxD6X11HWOuOuF05hKhaFWX5ctX/0cSkpAhiHxp4EGHgYYSeBxEGKhc3UMnVwFs99bRoqif5kZ6I+wYiQ/U8jDQ8tT+dGZiZKWh1Cjqzx4l0BvppurkpyYLQO3rqNLOmSfsX1y9YIilMSMP+HxzKuKBr9BLmB/bzcrGLnAgtxadvBDHtwCZu1ehAiaiLWPboAUOHqhGObG2JjzUQFW7gYYSBh5GqwX0YYSA6ykBCvJGkREFigiApQf05KcHIozgj8bFGHsWqr/GxRpKTMl4+awEFDXu2aPGpqKN8ZXP8m1rjWlyHs7sWB2ct9k7/JEct9k4abB206HQ5X2GnJAte9ghk4/KH0rBLJIUEadgzoNaENuzpeJ4yYUe44+TKhW3BfDHfgzc2fcONxoNw8xC4LF9O5K+7mekwn53BlTLsR1HA0lrB0kqDueWTVwtLBWtbDR7eZljbabG112BjpyZbBy1OblqcXLU4uepwdNXi6KIlNExD166wNQBe6guTJqn78LmNmbnCKwMdWPVlFFHhepzd5H8ZyYvFkCFDUsP3nj9/Pk3Ztm3bePvttzEYDAwbNowJEybk0yjTkuNYMc9DQYoVkxFGvZGFpT/F4+EFzBytWXuvMbfwwrteCUpf2sqgmMWcoiYtNXtwE+GcbDWee33H4eCqw9FFNcqOLjrsHDVoNKbbl05IUH3bV6xQLzH99BPY25us+0wJOp9I1+rXGf95MQaOdcn9B0oKNQUhVowp2bdvH7a2tgwaNCiNYTcYDFSoUIEdO3bg6elJnTp1+OWXX6hSpYpJnpuTWDGFXhovN9DoNPgO8eN2ojv6exHUc7xCFc8Y4mONKJ07E9W0C7UJwOqbBWh7dqPuXx/T+dxMmnWwpWZ9a7zKW+DgrDWpUQewsoIff4SFC2HzZqhXDy5fzriuEKDXQ3KyGmUyPh5iY9V4NJklvT7jvspXs6RaHUs2LH8oZQQlhQZTSeM1adIEZ2fndPnHjh2jXLlylC1bFnNzc/r06cOmTZtyNGZTIb9XZ0KtIbXY//F+rOpVx+PYeQIfujP/SB3K13NBJE/lZvOb3H37EywO/4xlsWLw2Wfg5AQffpir41IUGDMGfH2hZ0/11cEBUlJUw/z41fD0c9UMqVIFzpzJOPhY1yGOfDTyPhdPJVLVzyrnE5G8EMwZe5/LAYkm7bNSTUsmLCj+zHqmksbLjDt37lCq1JNL956enhw9evSZ7fICadgzwamsE97Nvbl+PZKypV2pG3yCrZ/VoPyaRijm5niuW8ANv54Ed3ubskd/QRsdDZMnq1b2rbdyfXxNm8LJk+rnSVKSaozNzNK+arVq0mjU9PjnjLxggoPVvn75BQYOTF/ero8Dn7wTysblD6VhlxR4TCWN9zQy+vaqPM3FLA+Rhv0p1B5Wmw39N1Dq064kjFvK3bVbuTS6IpUbu2FWwg3PdZ9zs9lg7gz8gFK/fYsSE6Mupx0dM7aOJqZUKTUKpCkQAnbtgpkzoV+/J3HkH2PvqKVld3u2rIrm3fnFsLSSu3iSZ5OVlXVuYCppvKfh6elJcPCTwLYhISGULFkyB6M2HfKv8ylU6loJS0dLrp2MwWtYS8pxlW97bCcmQg0vYN2gFsUXTCBu634e/rhJXe62aAGvvQYFZK8tqyiK+oUjMBDWrs24TrchjsQ8NLL7t8Kj1i55MTlz5gyJieoWUFBQEJs2bUq3FbN//34CAgLSpawYdYA6deoQFBTEjRs3SE5OZvXq1XTq1Mnkc3kepGF/CmZWZlTvX52L6y9S4f3OaK3M8YwIYPGrxzAa1a9hTiP7YN3Yj7APFmB4lAi//aYqcfTqBbt35/MMskfXrupt15kzSXM79TF1mlnj4W3GhuUP835wEkk2CAgIwGg04uvry4wZM1Kl8Z6Hvn37Ur9+fa5cuYKnpyfLli0DQKfT8eWXX9KmTRsqV65Mr169qFq1qimn8fxkRRjV1KkgiVk/i7un7oppTBNHFx0VZz/4WaxVeomhfCs2fXI5tU7CmcvigqaauPvmDDUjMlKIatWEsLERIiAgn0b+fKxerSq0/vprxuWLp4WJasoFEXIjKW8HJik0FAQxax8fHxETE5Pfw8gRORGzliv2Z1CiVglK1C7B6WWnqTDuFXS2ljT2uMEvE88ReDgSAMsaFXEe1ZcHX68l4fQlcHaGv/4Ca2t49918nkH26NEDKlVS49NktGrvMtgBgE0/RufxyCSSrCGl8eRWTJaoNbQW9wPuE3UrjvJj22N9J4jS7oks6HOEuKhkANxmjEbr4sj90TPV0/ISJWDiRDWoeiHaktFqVY/Ns2fh9wyi6pf0MqdeCxt++/5h6naURFKQkNJ40rBnier9qqOz1HHqu1NUeKcDZg7WtCh/iwf3EvhqyHGEEGgd7XGf8w4JhwKIXvmH2vCNN9RIkJMmFSoppN69VSnAGTMyHna3IY7cvZXC8b15F8ZYIpFkHWnYs4CloyVVelTh7MqzxD9MocL/OhL99xn6veXCiU132frFVQAcB3fBsm51Qt+bjyEmDiwtVfHSI0fgjz/yeRZZR6dTP4tOn4Y//0xf/nIXO+wdNfIQVSIpoEjDnkWaTmuKolFY12sdZd5ojZmTDU6BR/HvVJIV751h/cyLpCQLSnw5CUNYFOEzlqgNBw9Wl7+TJmW8aV1A6dcPypbNeNVuaaWhfT8Hdq6PIebhc1xxlUgkuYo07FnE2ceZLj904e6Ju+yevp+K777Cvc2n6D/GGf9OJVkz+QLvVv+LS+GuOA7rTtTClSRdvKoufz/6CM6fh9Wr83saWcbMTD0iOH4ctm9PX97jdSeSkwQTB90hJaXwbDNJJC8C0rBng0pdKlF/XH1OfHWCpGKlMXex4/r8jYxb14AP/2qCRqswp8MB1tyuj2Jjzf0xs9WD1MdBXaZMUYO5FBIGDgQvL5g+PX3smUo1LZm0uDh7/4hj0qt3MBikcZdICgrSsGeTFrNbUKphKba8/Reeg1twf1sAEYeuUKNVMeafbU3/udU5deARW+MbE7/rCOenrOXSwUjuDpoA167xYPZXhN2IJ+L2owxTckLB2dowN1c/i44cgVat4P79tOV9RjozdrY7W36JYeab92TkR4mkgJCjeOyKovQEpgGVgbpCiCwFWS/o8difRcydGL6p9Q02LpZ4RJzBsaYXTXdMTi2PDHnEynGnqbZ2CjbE8yWjScacGUzBjXDG8AUpmGfYd+nqDnxyuhWaAqQv+v33MGqUGvv9l1+gefO05Z9/EMqyOZG89p4L/5vrXmACIUnyh6IWjz2/yEk89pwGATsPdAO+yWE/hQp7D3u6r+rOitYrKFbLh7CdpwnddY5iLdRYFC6e1ry9piG3u80krs8wJvS4SvLgERhPfYTLlF5M732R262Hpes39FocG2ddZt+KWzQb7J3Hs8qc116DOnXUy0stW6pbMxMnPlFwGjvLnfgYI9/Pi8TWQcOISW75O2CJ5EUnK9dTn5WAvYB/VusXppACT2Pv9L1iOlPEBpdhYnv1ccKoN6Src+f1KeKCtrpIOHtFzWjTRggXFyGio9PVNRqNYkKdHWJk6c0iKUGf28PPNrGxQvTrp4YcaNNGiLCwJ2UGg1GMHxAiqnJBLP4oUty6JTJM+oI3LYmJKQghBUyJl5eXqFatmvD19RX/tV1bt24VFSpUED4+PmL27NkmfW5OQgrkmWEHhgMngBOlS5c26RuQXxgNRrGizQrxuW6cWEtPcfXrv9LVSYl4IC67NBDXG/YXRoNBiBMn1Ld90qQM+zy7877oyVqx+fMruT3858JoFOLrr4WwsBDC3V2I2rWF8PFRP6u0GqMoxW1RlQvCkSihOkqmTe3bq31Iii5F0bCHh4eny9fr9aJs2bLi2rVrIikpSdSoUUNcuHDBZM/N1VgxiqLsVBTlfAapcza/GSwVQvgLIfzd3IrGV3VFo9BtZTe03qVJ0Npy7oNfSIlOextT5+KI+yfjSDh4muifNoGfn+puMneuegPoP1RvUYzqLd3Z8PElEmILngeNoqi6q4cPq9szxYurEn29e8P4CQojZ3pQuooNHtzj7UEPWLaM1DRqFGzZAtu25fcsJC8CppLGy4xCLY0nhMhacOIXFGtXawbuGMRPdR5iGXGe0+/9TN2lr6ep4zi4Cw+XrSf0vU+x69Qc7cKFagyZV19VHcUtLNLU7zurOhPr7mLzZ4H0nFpAwoD+h1q1VN3V9Gj437hSjO0ews6f7lGvrqDvKFUvcsAA2LoVPvgA2rR5skcvKbr8MDaAmwGmvaHsXdORwQtqPrOeqaTxFEWhdevWKIrCiBEjGD58OFCwpfHkn5YJcPR2pPeuEcSauXDz252EH72eplzRaCixZAqGBzGETVyoaqN++y2cO6de7fwP5eo4U6+7B5s/DSQmPCmvpmEyLCw1LNzgSfNOtnw8+j4/fa5GwTQ3V+9qnTkDa9bk8yAlRZqsSuNlRWjj4MGDnDp1iq1bt7J48WL27dsHFGxpvJzurXcFQoAkIBTYnpV2ReXw9L8EbjwrVtNb/Oz4pkiKSx+v/N47c8QFpaqIP3JGzXjtNSE0GiGOHUtXN/hitOilWSt+eOd0bg8710hOMoqx3dU992Vz1T1Kg0GIGjWEKFtWiCQZ0r1IUhD22H/77TcxbNiw1N8HDhwoNm/enKZOo0aNhK+vb7q0Y8eOTPudOnWqmDdvnhBCiEOHDonWrVunls2aNUvMmjXLZHPIyR57jvzYn5fC7sf+NPYNWkroip2k+Nen96ExaM2eiIcaYuK4VvkVdMVcKHN8DSI6BqpVx2BhzdWP1xAdlkRCVAL6RD36RD1nt98j9GostdsVQ5fJppmVsxUt57bExs0mj2aYPVJSBB8MvMO2NTG8NdONEZPc+PNPQeeOBiaOS8avejK3gpKJuK/HoBfo9aivKQKDXqS78foYK2sNb89yp3S5jO8DSPKPguDHPmPGDIKCglixYgVBQUH4+/tz7tw5Spcuna1+4uPjMRqN2NnZER8fT6tWrZgyZQpt27ZFr9dToUIFdu3ahYeHB3Xq1GHVqlUmU1HKTz92yX9ouHQwv285TuKJU/z26kbqjKpLTEhMalJKNaHU0XVsch7K2fiylDE0ZyAredB/NDtoDQroLHXoLHVozLRYGZO5efAOrqVtIINveUFbgjCmGOm6omveTzYLmJkpzFnpgc5MYdGH4WxZFcP94BQqYWTDp7ABNQa8SzEdZuYKWp2CVgc6nfqzRkOG875xOYnIMD3f7/EqOF9/JQWGgIAArKys8PX1pUaNGqnSeJMnT352438RGhpK167q35Zer6dfv360bdsWSCuNZzAYGDJkSIGRxpMr9lwgZN0RDvf8jHuU4AHOqflmNmY4eNrj+2A3zmFXiGnRBV3PrpT/bT7229eSvGUX5m2apTFUP/4vgC0Lg/j0fBs8K9une9buybvZP3M/r+59Fe+m3nkxvefCYBAsmhzGpVOJeJU3x6Az55MF5ox6x5yP5ppjZpY947z2mwfMeOMen/ziQfs+Drk0asnzUBBW7OXKleP06dOFWkUpJyt2k/ixZzcV1T32xxiNRrG7yRSxwWGwuPTrWRF6LlQkPEgQxn8cuI3JySK49zhxgSoidOqXwhgdLYSXlxDlywsRH5+mr+iwRDHQdoOY1/Vgavt/kxyfLBZ4LxCLqywW+uTCdfunUych7O2FiIjIflu93ih61r4mmpe8IuJj018Mk+Qf+b3HHhMTI8qXL5+vYzAFUvO0gKEoCjUXDEYf+4iwpZtwKeeIpaNl6kpcMTPD4+e5OAzuQsT0rwj7aCli+XIICoJx49IEQLd3s6Dz+Ioc23iHb984hT4lbUx3M2sz2n7RlvCL4RxZcCRP55lTPv4YYmNVl/7sotUqTPyyOGF39XwzM9z0g5MUWqQ0nnR3zDWcapWhzrKRhO44y+Gen2FM1qcpV7RaSi77CKdRfYmc/z331x1A/O9/8PXX8P77aYx714mV6TKhEjuXXufjNvuIjUzrAlnxlYpUeKUCf0//m5iQmDyZnymoVk29q7VoEYSEZL99zfrWdBnswI+fRXLjSuFzC5VIcgtp2HMR78HNqP3VMO5tPsWRfgsx6tO6eCgaDcUXTcLl/SE8WLKGu+FmiJEjYf58GDs21bhrNAr9Zldn9E91uXIwkon1dnHncloD3nZhW4RBsP2dDFQxCjDTp6vCUlOnPl/7sXOKYWWtYfaY+xn6FUskLyLSsOcyPiNb4/vZIO6sP8rxwYsRhrRbKYqi4D7nf7hNH0X0ij+4G+8A77wDX3yh3sH/l5xek4FeTN3TlMRYPZNe2s2Zv54ESHcq40TjDxtzcd1Frm6/mmfzyyne3vDWW7B8uWrcs2ubXYvpGDXDjUN/xbN7U/pbhBLJi4g07HlAhXc6Uu3jPtz++QAnRyxFGNMbd7cpb+I6cTjRP/1OXJtuMH48LFkCw4enkS+q2MCVWcda4Framlnt9rN1UVBqWYN3G+BSwYWto7eiT0y79VOQmTMHhgxRL+GOHp19adg+bzpTvpoFc8eGkphQeHRlJZLcQhr2PKLyxG5U/rAbN5bt5vSY7zPcNnCdMhLzcqW5P2Y2xmnTVfmiZcvUgOj/Mu5uXjZ8dLA5fh1L8v2YAA6tCQZAZ6Gj3ZftiLoaxcF5B/NsbjlFp4PvvoP33oOvvoL+/SE5OTvt1YPUu7dSWDY3IvcGKpEUEqRhz0OqzuhNhXEdubZ4O5dnb0xXrrEwp/iiiSQH3iRqwU/qBvRHH8GKFdCvn+pC8g9Wdma8u6EBZf2c+PGdAB7FqJEgfVr5UKVnFQ7MOsD9M/fTPaOgoijwySeqh8zq1dCpE8THZ719naY2tO9rz7I5kQRfz8angkRSBJGGPQ9RFIUa8wbi0b0eFz9az6Pg9KtL27aNsevSgvCPviHl9l348EOYNw9+/RWqV4cdO1LrarQKw76qzcP7iaydeiE1v81nbdBZ6fim1jes67OO0LOheTI/U/D+++rqfccOVa0pKipteXKyqr166RJcuJA2vTKsGIoGFk4My5/BSyQFBGnY8xhFUfCdPxAEnJ+0OsM6xT4fD0Yj98fNUzPefRcOHgQrK2jdGl5/HaKjAShX15kWw8uybdFVbp5Rw6Pae9oz+vJoGo5vSNCWIL72/ZrVXVZz5/idPJljThk6FNatg1OnoGZNqF0bvLzAzk6NcFyiBFSporpL/js1aWFGSIIz29bEcO2idH+UvLhIw54P2Hi7U35se26t2MeDk9fTlZt7e+A6aTix6/4ibudhNbN+fVWYY/x41YWkalX4808A+s2qjo2TGcvePIXRqO7d27jb0HJ2S8beGkvTaU25te8W39X9jpVtV3Lv9L08m+vz0rUrbN8OFSuChwc0awbDhqk7U4sXw6pVsHZt+tSmnwsGNMx8W15akpiGIUOG4O7unqFQx7Zt26hYsSLlypVjzpw5z8zPM7JyPdXUqaiHFMgKyQ/jxW+uQ8SeplMzDBVgSEgUgT5tRFDFDsL43/i2x44JUa2aqjU3cKAQ8fFi9/Lroidrxe7l1zN8XmJ0otg/Z7/4xO0T8ZHFR+LMijO5Ma18Jy5OCB/b+6IqF0TgucT8Hs4LSX6HFDA1f//9tzh58qSoWrVqmvzMpPFMJZknQwoUQswcrKk2ozfhf1/k7qbj6co1lhYU/2IiyVduELlgRdrCOnXgxAmYPBlWroTBg2k6yIuKDV1Y+f5Z4qLSHx5a2FvQaHwjRl0chedLnmwcuJEd7+/AaCha7oE2NjB+ngsGFD4YJlftLzKmksZr0qQJzs7O6fIzk8YrCJJ5MmxvPlLm9RYELdrK2fd/pkT72mjM0/5z2LVvgm2n5oTPWIJDvw6YeRZ/UmhhoTp+29rC+PFoqlVj2FdjGF97J6smnmP4134ZPlOV8hvItrHbODTvEOEXwum2qhuWDpa5OdU8ZdgIHUs+cubS0UjOHk+iRh2LZzeS5Arbxm7jfoBpvbOK1yxO2wVtn1nPVNJ4mZGZNF5BkMyTK/Z8RKPT4jtvIHFB97j29V8Z1im+YAIYjIQ+Pkj9L++9pwZcmToVr6BdtBtTjl1Lr3P1WFTG9QGtmZYOizvQYUkHrv11jWUvLSMyMNIUUyoQKArM/8EFIwrjXpWr9hcRU0rjZYbIRBovs/y8RK7Y85ni7Wvh3rI6F6evw2tgE8ydbNOUm5fxxGX8UCKmf0XixNex9K2UtgNFgaVL1ciQgwbRa/teDq225NuRJ5l9rCUabeb/ofzf8Me1sitru6/lu3rf0fPXnpRtWTY3ppnnvNxKh2d1Z+6ei2TPtiSat5Wr9vwgKyvr3CAgICCNIT958iS9e/dOUyenK3ZPT0+Cg4NTfw8JCaFkyZKN/5ztAAAgAElEQVSZ5ucpWdmIN3WSh6dpeRBwQ6xVeomA//2YYbk+6qG4aOMnQgZNyLyTe/eE8PQUolQpcezrk6Ina8XeH29k6flR16PEl5W/FPOKzcvwILewculciqjMRVG3ZHB+D+WFoiAcnk6fPl0MGDBACCFEYGCgsLe3F7du3Xru/m7cuJHu8DQlJUWUKVNGXL9+PfWQ9Pz585nmZ5ecHJ7maMWuKMo84BUgGbgGvCaEeGiCz5sXCkdfb8oMaU7Qoq34vNkaW5/iacq1Tg44DetO1OLVOE96g8Q4AzGX7hB7+Q5x10LRxyViTEzByrUttc/8QLl3OvKKpjV3R/3FlmnpV6plh7ek0oQuqb87lXHipbEvsXnEZh5ce4BzufQHRYWRStV0VG/mzPm9kfz0bRKDXper9hcFU0njAfTt25e9e/cSERGBp6cn06dPZ+jQoU+VxstvybwcSeMpitIa2C2E0CuKMhdACDH+We2KujTe85Bw7wFby4/BwsUO69KuKDotGjNt6quIisLpwB9E4kIo/xh+jYKNlxs6eyu0VuZorcwp9vAKlU//QpB1DbYp7ajXzTPNc6IvBBNzIYT21xdhVfKJAQ87H8aS6kvo8lMXfAf65uXUc5X7IXpalA5C2NlzJsIDM7P8HlHRR0rjmYZ8E7MWQvz7xO8I0CMn/b3IWJVwou4Po7j+7S6E3oAxxYA+KQVjigGhN6CYadGXLotr2F3KfDsS+1rlsC1XHK1FBpZqWgXKT5/OFppRfu5QnEpYpRbFXQ9lW4W3uTznN2p9MSQ1362KGxb2FgQfCi5Shr24p46mXZ35e0MkMye7Mn2OXLUXdWJjY9FoNIXaqOcUUx6eDgHWZFaoKMpwYDhA6dKlTfjYooNnj5fw7PFSpuUJx89xo24frCOCcajaPPOOpkxBv/BLqj88x5VDkbzU/cmq3bZsMbxebcr1pbuoNL4LVh7qql3RKHjU8yDk8HNIGRVwPlriQrNNUfw4L4w2nTxp0CBvPRQkeYuUxsuCu6OiKDsVRTmfQer8rzqTAD3wc2b9CCGWCiH8hRD+bm5uphn9C4ZVnepYN/YjasEKhP4p8dY1GjR1/PBRbhB4KL0bY+VJ3RAGI5fn/JYmv1SDUoSdCyMptmjFWXFx1/H6RDdsjbH0bxXOjRv5PSKJJHd5pmEXQrQUQlTLIG0CUBTlVaAj0F/kZMNekiVc3h1Myq27xKzf8dR6mjr+eBLMtf3pA3/Zli2G96tNub50Jwl3nvi7e9b3RBgFd44VjmBh2eGt6S607OmIzaMIOtSP4qE84pcUYXJ0QUlRlLbAeKCTEOKRaYYkeRq2HZthXsGbyPkZi3Wk4ueHVhgwnDpDcoIhXXHlSd0QRpFm1e5ZzxMUCD4UnK5+YUdRFOavKkG1BrYooffp2CSGlJT8HpVEkjvk9Obpl4AdsENRlABFUb42wZgkT0HRaHD536sknrjAo/0nM6/op4YU8DZc49qJ9LdQbcq44z1YXbU/ClG3aywdLXGr4lYk99lBVVr6focnJX2siDp3h4Hd4rOtsSqRFAZy6hVTzlQDkWQdh0GdCPvwCyLnf49Nk0w8n0qXxujsQtmo61w5FEmlBs4YoqIxhEdhTFSDhJXtXI3732/lyrhvqDS+C2aexSjVoBQX111EGAWKpugdMlpZa/j1aCnaVrjJmc3BTH7fm5nz0sfJMRoFoSF6khKNpCQL9CkCfQqpP2dGjZessLSSkTok+YsMKVAI0VhZ4jSqLxHTvyLpyg0sKpZJLTPGPyJu2wFiN/+NMxbUVY4TNGUwlybGZ6gSXRZg7VVurP0ZXQk3PCfP5tS3iURcicCtctE85HZ00fHr8dJ0rHqTX+ffxsmlDE6OgjNHE7l2PoGwWwk8ikqE54h8WauhFT/u80ZTBD8UJYUHadgLKc5v9iFy7jIiP/uRYvPeJW7zXmLW7yBu6wFEQiJaF0dsrJ2xj7pHoFKe5hPronN3RuvmhMb6yQo1MTSak298S4nG5eDvXTgHHgEg5HBIkTXsAKXKmvPjntIMaHiT5R8E8dgMCwBLS2xLOODqaYmZhQZFq6AoqkuoolU4c0bBYICffgKLfy32zxxOYMEHYaxZ8oC+o4rG7V1J4UQa9kKKzt0Fh0GdeLh8I9E//IZITkFXwg3HIV2x794K68Z+KL//Dt27E5BUhcYDB+NeIf2FDTvA7UQ4V3/YS+1WDUlYvhp7xw4EHwqm1pBaeT+xPKTmS5Z8+1dpflgYTblqFjR42Qr/RhZYWD59K+Xvv1VFp52HYdq0J/n+Taw5ujuezyeE0ayTHSVKyWuukvxBbgYWYlwnDMPqpRo4jeqL98GVlA/ZTYkvP8SmeT0UnS71ALUs17lyML1w9mMqTeyKEIL7KS4YY+OpaX+VkCLoGZMR9VtY883vJXhvljMNW1o906gDNG0KffrA3Llw8+aTfEVRmPpNCYRRMPPNe0/3WpIUGry9valevTo1a9bE3z/tmZaUxpPRHfMeo1EYXVzE3+YtxZJhx59a9ewHP4u19BQHqS/OUVX8Sjexvfb74uigReLy/N/FgzM3i1Tkx5xy+7YQ1tZCdO+evuyHTyNEVS6IP395mPcDKwAUhOiOpsTLy0uEh4eny5fSeJL8QVFQ/PyoaHEzwxuo/6b6rH50CvuOsqtnoWgUnHiIwaghdOc5zr67gh2+7/FnqZGceP1r7mw8RkrMi31toVQpmDgR1q+HXbvSlg1425lqdSyZM+Y+DyOfckNYkquYShovM6Q0niT/8PPDbeduQi9GEBeVjK2zeaZVLdzsKd67GYa9vRBfryGqQU2aLO5Nwp0o7m8L4N6WUwSvOcyN73aj6LS4Na2C39evY1uueKZ9FmXGjYPly2HMGAgIIDVypFarMP27kvT2u868caF8/INH/g40HwkY+wMPA26atE/Hmt7UXDD4mfVMJY2nKAqtW7dGURRGjBjB8OHDgYItjScNe1HHzw+NUU9pbhN4JJLa7Us8s0mxaSOJWroezfpfYXFvrDycKTP0ZcoMfRljip7IQ4Hc23KK69/uYn/72bx8eCYWLi9eJD1LS/j8c+jcGb76Ct5++0lZxRqWDBnvytKPI2jfz4GGrW0z70hicrIqjZcVDh48SMmSJQkLC6NVq1ZUqlSJJk2aSGk8ST7yz2FPOeU6gYeyZth1xVyJqdUE55O7eHT8PNZ1nnyF1ZjpcGtaBbemVSjZyZ+/X57Boa7zabLjw4xDCBdxXnkF2rSBqVOhb19wd39SNuJDV3asi2HGiHtsPO+Dtc2Lt/OZlZV1bmBKabzHsnbu7u507dqVY8eO0aRJEymN998kD0/zEKNRCBcXccy1rZjWbE+Wm5355rA4RU0R2HDwU+vdWrVfrKWnODLgixf2cPXyZSF0OiGGDk1fdmJfnKjKBfHJ/+7l/cDyiYJweGoqaby4uDgRExOT+nP9+vXF1q1bhRAFWxrvxVtCvGgoCvj5UZYbXD0WhT4la7cpS7WsyGUqkXLwGPF/H8+0Xum+jag2sw+3V+7n4ox1php1oaJiRRg7Vt1vP/6ft8qvsQ1dhzjyy+IHRIXLg9S8IiAgAKPRiK+vLzNmzEiVxssuoaGhNGrUCF9fX+rWrUuHDh1o21YV6P63NF7lypXp1asXVatWzTQ/L8mRNN7zIqXx8piJEzF+Mo+Bhh+YcbwdPv7PvhUphODzYnNpEb8Ju8qlKPbZ+1jVrozG1oaYiCRun4vmzqUYosOSiItIQrPlD2xuXOB66WbcFKUxZBJPpVH/0gyaX3QUmh4TE6MaeEdHOHoU7O2flF27lETnKtcY87EbwycW3du8j5HSeKYh36TxJIUEPz80BvUA9cqhyCwZdkVR8GhYhksH/Kl+ag+3mr6KQCFS606woQR38OAuJYnAFTMnWxxc/Khh/4AywftwbtMLUdorXZ/BF6LZsiCItqPL4e5tkxszzTfs7WH1amjRAgYOhI0b4Z9zO3wqW9CgtQ1rvnrAa++5YmYm48jkJlIaTxr2F4N/bqBWdwoh8FAk7ceUz7RqcqKBS/vCOb31PpcOxGMd4coOxuJpHkEll3A8tXep8eA6teIDUtvoLFwxK14aXZ0SBO9IwHn/D/jvmotjvbSrjYjgR7xVdgubPwtkyBdFL1xB06awYAG89RbMmJE23ED/Mc6M6hjMro0xtO3lkG9jfBGQ0njSsL8YeHmBszM1HINZnEFoAX2KkaPrQziw6jbnd4WR9MiAmYWGyjXdMEQEM/QrP14aXhONVl1pCiFIuXWXxJMXSA68RfLV2yRfvU3C38dxjAjDEbjToBdxvdrgNKIX1k3roCgKrqWsadS/NLu/u0GPKVWwdy16wtKjRsGpUzB9OtSsCV26qPmN29lSyseMlQujpGGX5DrSsL8I/HOAWvriVSLvJBAR/AjXUtYkxKaw67sbbFkQRMTtR7h5WdPsNW9qtS9B1WZuaBTBHPsAHt2OTDXqancK5t4emHunv3hjjH/EqV5zSNp5AO22A8Ss3op5xTI4De+Bw6td6PReRf7+8RbbF1+l59S8PVDKCxRF9Wm/cEHdkjl6FKpUAY1God9bzswdG8r5EwlU87fK76FKijDSK+ZFwd8fu/tBmJHMkV9DWDn+LCNL/clP/zuDm7c17//ekEXX2zP0y9rUbl8CC2sdZlZmFK9VPFuKShoba0q+0Ym7ya44/PAFJX/4GK2zA6Hj5hFUshlWf66jdscSbFt0lcT4ouklYmkJGzaAjY16eemxvmqXwY5Y22pYtSi9opVEYkrkiv1Fwc8PxaDHx+IOP40zR9HASz08eWVcRcrVzfwwtVSDUpxcehJDigGtmTZLjyrWqgY6Oyvu/HEK/+/ewPHVLiSeCyT0/U8Jm/QFnX9ewdTN99j7/U3aji6aIlweHmocmebNoV8/+OMPsHPQ0r6/A78tf4h79WJcu6Xj2jWIj1fTo0dPUkICGcr2mZnBl19C//55PydJ4UEa9heFfw5Qu7dPIMC7PO3eKo97mWd7png38+bowqPc+vsWZVuWzdKjtJbmlOzkx52Nx6i9ZBgaMx2W1StQ8rsZXC3XDvs/f6Fig1b88ekVWr1RFq2uaH5xbNhQNcIjRkCDBhARASHXnSnPA2a994BEOzfKl1c9aooVA2trdZVvba2u+jUZvC27dqmHs23bgotL3s9JUjjIkWFXFOUjoDNgBMKAwUKIu6YYmMTE/HOA6usSgu9nNbPWRgh8KihUsbxGxCfLKBtfN225nZ2qOJGBBfLs8RK3fz5A+N6LFGulXu028yiG8+h+RH76A12+eIW5b0VyeG0IjfqVzuHkCi7Dh0NIiLo14+8Pr71mwamNNjiHPGDnbVfMLbLn+nj+vHooO3myupcvkWRIVq6nZpYA+3/9PAb4OivtZEiBfKJVKyFq1cq83GAQ4swZIb78UojevYUoWVIIdUcg8/Thhxl2pX+UJDbYDhQnhn+TJj8lPEpcsqsjbnUdI8ZW3ire9d3+woUi2LclRo3Xvur54rWPGSOERiPE6dMmHpiJKAghBYoC+RZSQAgR869fbfhHMlJSQPHzU5d8SUlp84OCYNgw9bu9ry+MHg0HDkCTJrB4MTfnruYbRhD81SbVl+9x6t8fZs1S6/4HrZU5JTrW5s7GYxj1htR8nasTLuMGE7dxJ916KNw6E82Zv0Jze+YFioZtbPGuYM7Khc93iDptGjg7q+GC8+HiuKQQkOPNTUVRPlYUJRjoD0zJ+ZAkuYafH6SkwLlz6u9nz6oab5Uqwc8/q07XP/4I169DcDD88gu8+SaeY7oTZevF6VNArVpP0pIl4O0NAwZAdHS6x3n2eImk8Bgi9l1Kk+/8ziC0Lo6UOvQrTiUt2TT3cu7PvQDx2PXx7NEEzh7NvmCJkxN8/DHs3w9r1+bCACVpGDJkCO7u7hkKdWRXGi/PJPOetaQHdgLnM0id/1PvA2D6U/oZDpwATpQuXTq3vr1Insb16+r2yahRQnTsqP5sZyfE+PFC3L//1Kbr+60Xc13mCn2yPm3BoUNCaLVC/BNJ79+kxCeK9dYDxMmR36Yri/j0e3GBKuKvEb+KnqwVQcciczS1wkZcjF7Utbsk3u8f8lzt9Xp1V83TU4i4OBMPLocUta2Yv//+W5w8eVJUrVo1TX52pfGyK5mXq1sxQoiWQohqGaT/aj2tAro/pZ+lQgh/IYS/m1vRD4RUIPH2Vr/DL14Mhw6p995v3YI5c1S3jKdQpVcVEiITuLnnZtqC+vXVk7yVK9UV/r/QWVtQon0tQjYcRRjSRpV0GtkHnUcxyp5ej7W97oVbtdvYaek6xJHta6I5tic+2+21Wli0SD2YzQ+t5MKAqaTxmjRpgrNzepfg7Erj5aVkXk69YsoLIYL++bUT8GL9dRY2FAUWLoTISBg6FGyzrupTrk05zO3MubD2Aj6tfdIWTpoE27fDyJGqX5/XkwBgnj1fImTdESIOXMataZXUfI2VJW5T3uDeiOl069qaVb8ZiHuQjK1T5tJ9RY2RU9w4vCOe0Z2CWb7HK9u3URs2VI855s2DIUOgTJlcGmgOuD92NokBV0zap2XNihRf8MEz65lKGi8zsiuNl5eSeTndY5+jKMp5RVHOAq2Bt5/VQJLPDBigarhlw6gD6Cx1VOxUkcsbL2NIMfynUKeu2I1GGDQIDE/KS7SvjcbSjJB1R9L16fhaV8x8SlHu3EaEwUDA1vvPNaXCioOzlqV/lcbJVcsbbW9z7VLSsxv9h7lz1bd/3LhcGGAhJqvSeAEBAelSVow6kG1pvMzyc4McrdiFEJluvUiKHlV7VeXcz+e4sfsG5dr858Zo2bLq3sDgwfDJJ/CBuqLS2VpSol0tQtYfpebCwSj/8nlXzMxwnzGaO/3H428fyInfvYq0T3tGFPMw49sdXgxsdIPhrW+x8mAZSpTOusRgyZKC998VzJyu5+fvBQ0aZPwMa9v8uQSWlZV1bmBKabzMyK40Xl5K5smbp5Is49PaJ3U7Jp1hB3W1vmULTJmietp07gwaDZ49XuLOxmNEHg7EpUFF4u7FEXoulLDzYYSdTcbD0oUmsX/y5xqYvzet66S9hz19/+iLXcmiG1u7dDlzvtnuxWtNb/J6q1v8uN8bF/e0f5p6veDorni2/xrD3ZspPIjQ8zDCwIMIA8lJggrA7CEZ91/MU8eGMz44OGctJERR4MyZMyQmJgIQFBTEpk2bmDlzZpo6WRWzzow6deoQFBTEjRs38PDwYPXq1axatYqKFStmKz83kIZdkmV0ljoqda7E5Y2X6fh1x/SxYxQFvv4aAgKgWzeoXBneeYdiHbqgmOnYPegnbj50JCEqIbWJbQlbzCo0oszZTTjwELc6lXD2UPeahRAEfB/Anql76PRtp7ycap5TydeSxZtLM7z1LUa2u83yPV7Y2Gm4eCqRzSuj2fJLNJGhBuwdNZStYkFJLzOq+Fnh6KLFyVVLkkHLp59piI+H995TP1cBYqMNzBp9n0/fD2XGd3ksqJyPBAQEYGVlha+vLzVq1EiVxps8eXK2++rbty979+4lIiICT09Ppk+fztChQ9NI4BkMBoYMGZIqgZfdfJOTFdcZUyd587TwcnnTZTGNaSJoa1DmlZKShFixQuir1RACRLzGRpyiptigdBO/Df1NHPniiLix54aIj4gXQghhTE4Wl4s3Fb8rncT3b6e9Trn17a1iuma6CLsYlpvTKjDs2xIjfHUXRI9a10THSkGiKhdETfOL4u1ut8WODdEiKdGQadvgYCEqVRLC0lKILVue5H/6/n1RlQvi6J688YssCO6OPj4+qSLUhRUpZi3JM3xa+2Bhb8GFtRcyrXNtbzC/rNXy8YVu/MBgIl0qUpMzdBK/0e7KQupF78A78TLWQr2co5iZ4TyyFz7iKkHrz6Q5ZGo8qTFmNmbsnrg71+dWEGjczo5ZP3kQdD4RZzcd05aWYO/9CixYX4qWXe0xt8j8T9bTE/btU78ode4Mv/6q5o+c6oZnWTNmjLhHUmLWxMwLM1IaT8Zjl2QTnaWOip0rcvm3yxiS03rHJDxIYMOADaxss5K7x+/S8INGdL72GaXCTqI/GcANjQ/GC5dUv/d27cDNTfXR69kT57hbOCrRNA/5ibBfdsGNG/DoETZuNjR8vyGXf7vM7YO382nWeUv7vg4cj6/Mj/u86fG6Ew5OWd8bd3ODPXugXj31UvGyZWBlrWHK1yW4GZjM0o/TK2gVNaQ0ntxjlzwHVXpW4eyKs1zfdZ3y7VQ/4Wt/XWPTkE3Eh8bTdFpTGn/QGK35E4NkVrsGEb3e5MyGY7TYPwHHlEg4cUJNx4+jXbeOkkBJ7kD/f63ObW1pXKIE3uZGUrpsRbzaCMXDQw143ry5asmKIDkRvHZwUK8VdO+uhgAKCIBy5WypXN+Bb2dHYOthT4XqltjYqMci/8XWFnx80udLCg/SsEuyzePtmItrL+LVxIsd7+3gxJITuFVxo8+mPpT0y/iQrtYXQwjfe5Ejw7+n5Yk56Jo3f1KYlETC1j3c6/om14rVp9XslhAaCvfvo9y7h5MIJOVqIGJRAEryP/7eWi20bKkuTbt0AUfHPJh94cDaGjZtgtdeU2PCA2gpRjni+GjkPW7gDWT+4fH996rnqqRwovx7PzOv8Pf3FydOnMjz50pMx2+v/sblTZexdrXmwfUH1P9ffV6e+TI6y6evFUJ3nGVf65mUHdESv6+HpykTQnDKsxOxd2OpeX8rjsWe3MQ06o18VfUrFA2M3N8Pzc3rapDz1avVbRtzc3V7p08f1SPH/MW5wfoskpMhNlZNW355yFcT79JtVHFqtchYOWvOHDXSRFCQGnI/u1y6dInKlSvncNSSjN5HRVFOCiH8n9k4Kyespk7SK6bwc2XzFTGNaWKB9wJx8++b2Wp75r0VYi09RfD6I+nKAqetFBeoIva/tzFd2cX1F8U0pomT3518kmk0CnHkiBBjxwpRooQa2Gzw4GzP50XBaDSKYa1uirp2l8S94OQM6xw+/NRQ+8+kIHjFFAVy4hUjDbvkuTAajSLwz0CRGJOY7baGpBSxw3+C2Og0WMQHR6Qp0z9KECc0/mJXiX4ZPvO7l74Tn3p8KpLjMzBKer2qQqEoQpw9m+1xvSjcvpYk/Kwuirc63860Tp8+QlhZqS6U2UUadtMg3R0leY6iKJRvXx4LO4tst9WY66i3agzGZD3HBixKE/lRa2VJpO/LuN87Q/yV4DTtFEWh5dyWxN6J5eiiDIInabUwdaoqIjppUrbH9aJQqqw5b05zY/emWI7uzjiy5OzZaugf+TYWTqRhl+QLduVLUPvLoYT/fZHLc35LU+Y+th8A1yb/kK6dVxMvKnSswIHZB4gPy8AoOTvD+PHwxx9w8GBuDL1I0H+MM+4ldXw1LTzD4FTe3mqsuJ9+UsWyJIULadgl+YbXq00p1acBF6auJfLwE7/jKr2qEaSthPhjM8aExHTtWsxugT5Bzze1v+H6zuvpOx4zRo0v/8EHUjsuEywsNQz7wJWT+x9lumqfOBFcXdXIkfJtLFxIwy7JNxRFwe/r4ViVcuHYoC9Tt2TMLbU8aNAes8Q4oldvTdfOvZo7Qw4NwcLOghWtVrBt7DZSElKeVLCxUQOR7d8P27bl1XQKHd2HOVLMI/NVu4ODqq+6d6/6BehFxdvbm+rVq1OzZk38/dM6pBRaabzcSPLwVPJvgtcdFmvpKe78fjw1b8/y62IPTcXFSl2E0WjMsF1yfLL4c/SfYhrTxOIqi8W90/eeFCYlCVG2rBC+vkIYMo+v8qKz6stIUZUL4vDO2AzLk5OFqFhRiAoV1J+zQlE7PPXy8hLh4eHp8gu1NJ5EktuU7OSPZQknri3ZkZpXu2NJjlIPcTmQO33fwxCdPm62mbUZ7Re1p/+2/iQ8SODbut9yYO4BjAaj6sf+0Udw5oxUfH4K3Yaqq/bFUzNetZuZwfz5EBgI33yTDwPMAaaSxsuMIiuNJ5GYAo2ZjrLDW3Bxxnrib4RhU8YdezcL4uq34uRNgd+6bSQcPYvHqk+wrl8zXftybcox8txI/nzjT3ZN2MXDmw/puKSjellp7lz48EP1fr1Z1gUsXhQsLDW8PtGVmaPuc2RXPPVbplfW6tABXn5Z3ZYZMCCbF3zHjlVjGpiSmjVhwYJnVjOVNJ6iKLRu3RpFURgxYgTDh6sX64qyNJ5EYhLKvt4SRaNw7Zsnq3a/zp78ca8O9mvUpeLNxoMI//gbhMGQrr21izU91vag3th6nPz6JDf/vgkaDcyaBdeuqdGwJBnyeNWe2V67osCnn0JUFLz+OqSkZNBJAcOU0ngHDx7k1KlTbN26lcWLF7Nv3z6gCEvjSSSmwsrDmZKd/LmxbDdVp/dCa2FG4/6lWTP5PNt2W/BawHrujZhO+IdfEL/rCB4r5mDmUSxNH4qi0OLjFlzZdIXNwzfzxpk30LVvD40awYwZqsKTtXU+zbDgYm7xZNV+eGc8DVqlX7XXrKluyYwbB3q9GsnBIitXGLKwss4NTCmN91i+zt3dna5du3Ls2DGaNGlSoKXxTHIYCrwLCMA1K/Xl4akkI+7/dUaspae4uXJfat6SocdFP4t14sG9BGE0GsWD5RvERWs/cdmlgUgIuJRhP1f/uiqmMU3s+nCXmrF/v3rJeubMvJhGoSQp0SBe9rwi+je4nulhtRBCfPml+la2ayfEo0cZ1ykIh6fTp08XAwYMEEIIERgYKOzt7cWtW7ey3U9cXFyqYEdcXJyoX7++2Lp1qxBCiJSUFFGmTBlx/fr11MPQ8+fPZzs/M/L18FRRlFJAK+DFCJYtyTXcW1TDtlxxri35KzWv0/sV0Scb+XNBIIqi4PhaV8qe+hU0Gu6/NSvDr7c+rXyoMbAGB+ccJPRcqLpi79ZN3WufNUs6ZWfA41V7wKEEDu3I2K8dYPSx5EAAABv0SURBVNQo+O471Yu0Y0eIz7xqvhIQEIDRaMTX15cZM2akSuNll9DQUBo1aoSvry9169alQ4cOtG3bFiCNNF7lypXp1asXVatWzXZ+rpAV6/+0BKwDfIGbyBW7JIdcnv+7WEtP8fDsk9XVZ70OiUF2G0Tcg6TUvMglq8UFqojoDTsy7Cc+PF584vqJ+Lbet8KgNwiRkCBE//7qcrNv38yXmy8wSYkG0aLUFdGv/tNX7UIIsWKFEBqNEI0aCREdnbasIKzYpTReDlAUpRNwRwhxJqcfMBIJgPfgZmgszdKs2rtMqERCrJ7tX11LzXMa1h2LKj6Evf8pIjk5XT/Wrta0+bwNd47e4fhXx8HSElasUIOgrF4NTZvC3bt5MqfCwuNV+5nDCaxcGPXUugMGwJo1cOQItGqlhvm9e1d9TUmBhAR49Ehd0WeUEtNfKDYZUhovC14xiqLsVBTlfAapMzAJmJKVBymKMlxRlBOKopwIDw/P6bglRRQLFztK9W7ArRX7SIlNAKBMLSdqti3OlgVBJD3SA6DodLjPe5fkq7eJWrImw76q96+OTxsfdk/cTXRwtOreMWECbNwIFy9CnTqqgpMklW5DnHi5sx1z3wll7jv3MRgy37bq0UMNiR8QoMaW8fBQX+/ehQsX1Lf40qWM0/nzanz43EBK42XBsAshWgohqv03AdeBMsAZRVFuAp7AKUVRimfSz1IhhL8Qwt+tiMqZSUyDz8jW6OMSub1yf2pe14mViAlPYveyG6l5tu0aY9OyPhEzlmB4EJ2uH0VR6LCkA8Io2PLmlif78Z07w6FDoNNBkybwww+qGoUEM3OFz9d7MnCsMysWRPFO9xAexWcugP3KK3D4MCxapF5gWr4cXFygbFlVXq9cuYyTmRncuSOPO3KNrOzXZCUh99glJsJoNIq/ar0vtlcfl2av98OGu/7f3p3HR1VkCxz/nc6+kQ0IhABhSQQEBGQJiw9EQCS4wjAKqOACA6K4jI6OIjiib4THMII4Dj4Vn4CKKwhuoOgoyCagAUXWsJNAIJCQPan3x43KkqQD3Umnb87387mfpLtvbp+K7UlRt+qUGddkqSks+L1EQO7mn81WudQcfmhauddbPWO1mcIUk/JWytkvpKUZ07OnNe4eFmbMH/9ozMKFxmRmur1N3mjB7AzTzrHV/OHyXSb9UCXrCZjKjbGnpRmzfr3+qiuiJQWUrYgILcb152TKPjJW//Lb8zc+1ppj+3L4duHvE7ACL2tFxOgbOTF7AQW795d1Obrd143YzrEsHr2Y7cvO+Cd6/fqwciUsXWqtUl25EoYPtzbIHjDA6ob+5z+Qnl4ru5bDJ0Qxa3Fj9mzLZ3hSKju2VH5g3Dj5fdWta82DP3CgVv5qnXL2+3NG9zxVNVLR6Tw+ih1L7ODL6bbgPsD6sD/SYTlFBSXM2Ho1Doe1aq/wUDo7EwYRlvxfxC36R5nXy07LZmHyQo5sPsK1L19Lx9Edzz+puBjWrrV2gf7wQ6tAyq8iIqBVq9+PPn2sMXqH/ftGP23M5Z7B+8k9XcI1t4RTJ8JBaLgPYeHW19BwBwGBwq+LKP3rHKF+TB3Cw6MICHLg71/27ygjw9qutnlzq4y+shhjyMjIICsri2bNmp31WmX3PNXErmqsTfe9yu5/ryB534sExlgFSla9tY/nb1nLQ+91p9tNcb+dmz5lDseeepH4VfMJ7lFG0gbys/JZNGQRu5fvpu+zfen1aK+Kl3Tv3Wvd6fvlF+vYts36+utsmpgYq5DKtddaU0NCQtzW9prm8P5CHr/9IDu35pOVWUJhQfl5IyzSMGZKMY1bgsMH6sf64uN7/u/ZGDh82PoaGwtVtLreKwUGBhIXF4ffOfWNNLErr5e14zCftrqfxAcHc9n0WwEoLirh/lafEhrpz7PrrvotMZeczmFnwiD8msYSv3pBuQm7uKCYxaMXk7IwhS4TujDwnwNx+FxgrzsjAz77zCpS/skncPKkNa7Qt69VuqCz803kvV1+XglZJ0vIPllMVmYJBfnn32DNPlXCxBv3c8OoCKbMLXvp/JIl1r3suXOtOjSqYprYlS2svXU2B99fx6A9LxBYPxyAFS/vZu6Y72nfP4ZLekaT0C2all2jKPxwKYfvnESjN6cTfvOg365RmF9M5pE88rKtqZKmxLB+xjdseX0j8VcnMHjudUQ3Ob8+SqUUFlobenz0Ecyfb3U9N2/W7mepv99/hIWzj/PBlha0aH1+cRljoGdP2LcPduyAoCAPBOlFNLErWzi17SCftXmQSx6+lvbPjQSgqKCEhY+l8MPnRziw9dRvN99iWwZzc8YLBOSf4vOkyRw9CicO5ZKVUfZUxmgyaEAaOT6hTEqfQGjUhW/MfZa5c2HsWGsqZffurl3LJo4fLeKaFjvpdlUIsz5oXOY5X30FV175e5ExVT5N7Mo21gx/nkNLNpCcOoeAunXOei03q5BdG06wc+1xtq/JIHvVZv547F9si/kvdnUbQWRsIJGxQUTFBhEY5nteR3r7uymkLlpP89t6cOvr/V0LNDvb6rHfeCNcRF0Su/r31KPMnnSUN1bF07FH2dU1BwywNs3evRvq1CnzFEXlE7vb5rFfyKHz2NWFOPnTfrNIhpkfH11QqfMPjXvKbHW0NTkbnc+nLikuMU8GTTdP+v+3KcwvdDVUY8aPNyYgwJhjx1y/lk2czi42vRv8Ym7tVX4NmvXrreUEkydXb2zeBp3HruyiTus4Gg/rzs4XPiU/w/k69PrP3o9P3UgOj51S5qYcZxKH0PaurjgK8vn08W9dD3bsWMjP1x77GYJDHIyfUo+N3+by9dLsMs/p3Nna5GrGDEhLq+YAbUgTu/IKrScNoeh0PjtmLnN6rk9EHRrMfIS89Vs4Mfcdp+cPfqY7uT7BbJyzhsIcF7cHat8eevSAl16CkvKX4tc2N94RQXyiPzMfTS+3/szUqVZlh169rFoz6uJpYldeIfzSxsQN7caOWZ9QcLzsXt+Z6tySTMhVSaQ/9k+KjlRcdC4ozI/G13bA5ObzzbTvXA923DhrisfKla5fyyb8/ISJz9Zn10/5LH49s8xzWrWCFSus4mDdusE7zv8mq3JoYldeo82koRRl5bL9n8577SJCgxcnYXLzOPLgNKfnJ0/pQhahrJ62irxMF2vKDh1qLaV86SXXrmMz/W4Ko13XQOY8eZS83LL/NXPFFfD999CuHQwbBn/5i7UgWF0YTezKa4S3a0Kjm7qy4/mPKTjhvNcekBhP9GN3c+rNj8levrrCc+MviyCwXUuKcwtYNX2Va4EGBsLo0VZZgsOHXbuWjYgID06LIe1gEQtnl1/vvVEjawrkn/4E06bBwIHWmjBVeTrdUXmVzB9SWd7hEdpMHsqlU4Y5Pb8kL5/d7W4AoHnKhzgCy5+r/tW8VJaM/oCowBzuT51IaMxFLloCaygmMRGeftrakk/9ZvzgfWxelcPS7S2Jqudb4bmvvALjx0PDhjBmTNmlebp3t/ZNqQ10HruyrVU3Tufoyq0k730Rv/Cy50WfKXv5avYNuJu6k8dTf8o95Z6Xn1PEPTHv0fj0L3Sd0IVrZl3jWqD9+1u1ZfbsAR8f165lI7t+ymdIh11cdWMdZrwd5/T8deusYZm9e8t+PSICUlMhPNy9cdZElU3sOhSjvE6bJ4dSeDKHfQsrNz0xtH8P6twyiNxVmzAVzFQJCPalx+hEMiWCDS9tIDO17Jt8lTZuHOzfDx9/7Np1bKZFmwDueao+ny06xaeLzt8g5Vxdu1oLl3Jzzz/WrIHMTHjxxWoI3Itoj115pYw124nqllBxdcYzlJzOQYICESdldvdvPclf2i6jle9u2o9oyw3zbrj4IAsLoWlT6NgRljm/4VubFBUZbu25h/27CvlwawvqxlQ8JFORQYNg/Xqr127jApuA9tiVzUUnJVY6qQM4QoKdJnWAxpeG07JXQ3JC6/HjGz+Ssd2Fu3Z+fnDXXVYFyD17nJ9fi/j6ClPnNSInu4S/jT3s0sYSTzwBx47Byy+7MUAvp4ldqXP0G9ucvZl1QISN/7vRtYvdfbdV6XHOHN0q6BwtWgdw79R6fLk4i6ULnA/JlKdHD2vfk+nTIc/Fmap2oYldqXMkDY0jKCoYn5i6/PD6DxQXujCRunHj39fKd+0Kb7xhlRxQANz2QDQdewbx3/ceIe3gxa/6feIJa/+TefPcF5s308Su1Dn8A33ofXtT9hwJ5HT6abYv3e78hyoyb551dy87G267DZo0gcmTdY474OMjTH0tloJ8w5QxFz8k07cvJCXBc89ZtzZqO03sSpXhmvsSMBGRFPv4sfYFF2/0BwdbM2R++gk+/9zquT/9tHVjdcQIa7PsWqxpQgD3/70+33yczQevXdxMJBF4/HHrBurChe6Nzxu5lNhFZIqIHBSRzaXHIOc/pVTNVz8+hMeX9ybLN5LUL3ezb4Mbkq+INbf9o4+sjbLvuceapF0bJmA7MXxCFJ17B/Pc/Wkc2lv2xijOJCfDZZfBs89qGQJ39NhnGmM6lB46YVfZRvNOkdy64GoEmDPwIzKPuPHOXMuWMHOmtYApwMWdm2zA4bCGZAAeGnagzD1UnRGxxtq3b4d333V3hN5Fh2KUqkCnIc2p37ERvsfTefqqrzh11M03PisxBbO2iGvmz9TXYklZl8dzD1xcUfabbrKqRD7zTO2umuyOT9UEEflRRF4VkcjyThKRMSKyQUQ2HD1acRlVpWqSng92xd8UcHJHGlMH/Ifs4xc3VKCc6z+kDqP+HM3b/zrBkjcufLzd4YC//hVSUmDp0ioI0Es4XXkqIiuABmW89DiwBjgGGOBpoKEx5g5nb6orT5U3KcwtZEbDGdTr1JgvVgXStH04k1b0Jjjcz9Oh2VJRkeGufnvZsi6XBWuacUn7wAv8eav+WmSkta+4nUa63Lby1BjTzxjTtoxjsTEmzRhTbIwpAV4GurojeKVqEr8gP9qNaMeR71K5d14nUjdnMmvkWkpKdMFRVfD1Ff7nrTjCInx4YMgBTmVe2J1QX1/rBurGjVbJ35MXv/bJa7k6K6bhGQ9vBLa4Fo5SNVOnOztRlFeE74lj3D6zAxuXHub9qT97OizbqtvAlxnvxHEotYAnRh264D+iN98M8+fDqlXW5h0HD1ZRoDWUq2Ps00QkRUR+BK4EHnBDTErVOA07NaRBhwZsemUTV9/TgitGNuGdKVvZ9IkuMqoqnXoG89D0GL5cnMWr0y68Zs+IEVZhzdRUq2Z7bdpHVas7KlVJ615Yxyf3fsLYTWOJTKzLEz2+5NjeHP7+fT9imruwKYcqlzGGh285yOfvnGLYnyIJCDy/8FuXK0PoMzis3Gts3gzXXGPVkVmyxOrBeyvdaEMpN8s9kcuMhjPodHcnBs0exJFd2TzWeQV1mwYzecUVHP/lKLnHc8v82Xpt6hHVIqqaI7aHnOwSxifv46eN568jKMgvITzKh68OV1ztMzXVGm9PTbUqPFx11fnn+PhYW9XWZJVN7BdfBFmpWiYoMog2Q9qQMj+FzmM7k7bpMH16FvLzsk3MqL+mwuqN4U3Dmbhn4gWVGlaW4FAH876OL/O1D17LZNIdh9ixJZ/EduXPnomPt8bbr7sObrml/PeaPRsmTHAp3BpBE7tSF6DjnR1JWZjCv9r9CwD/MH/qNosgdU8JPcdeSu+7E8/7mZ2f7GTlpJWkp6QT0z6mukO2taR+1s4aa1acrjCxA0RHw4oV8PbbcPr0+a//3/9ZJXxGj/b+DTs0sSt1AeL7xDPgHwMICAsgLimOuq3rggjTrlvFkleO0PHWtrTqWfesn6nTqA4rJ61k+7LtmtjdrGFjP5pd4s93K05z2wPRTs8PCoJRo8p+rUMH6NXLKsT58MPujbO66XpmpS6AOITuD3Sn012dqN+2Pg4fBw6HMOGNrtRtGszMYd9xMv3sseDQBqHEdo5lx9IdHora3pL6hbDh69MUFrh2v7BnT7j6aqv0b1aWm4LzEE3sSrlBaKQ/D73bg+yMAmYNX0tJ8dlJJiE5gQNrDpBzLMdDEdpXUr8Qck8bfljj+u/2qacgIwNeeMENgXmQJnal3CS+QwR3zulEyhfpvPPU2ZOmEwcnYkoMOz/d6aHo7KtLnxAcDmuc3VXdulnlf6dPh1On3BCch2hiV8qNrrwjnj6j4nl/6s9s/vTIb8837NSQkJgQdizT4Rh3qxPhQ7uuQXznhsQOVq/9xAl4/nm3XM4jNLEr5UYiwp1zOtK4bTizR67l2D5reEAcQsKgBHZ+upOSolpcT7aKJPULYcu6XLJOur7DxuWXw/XXW9vUZl7chk4ep4ldKTcLCPblwXe7U1RQwsxh31FUYCXyxMGJ5GXmsX/1fg9HaD9J/UIoLob1X7nnHsaUKVbxsJkz3XK5aqeJXakqEJsYxrhXu7Bj7XHeePgHAJr3b47Dz+H65tjqPB26BxMULKxZke2e63WAIUOsxH78uFsuWa00sStVRZKGxjHo/gQ+mbWT1Yv2ExAWQHzveB1nrwJ+/kLn3iF8t9w94+xg9dqzs60hGW+jiV2pKjTyufYkdo9mwSM/UlRQQkJyAkd/OsqJPSc8HZrtJPULYc8vBRzeX+iW67VtC8OGWTdRjx1zyyWrjSZ2paqQr7+DBxYlMeXrPvj6O0hITgDQXnsV6N7fqgOw9gv39donT4acHGjfHi655PzjDqf7xXmGJnalqlh0XDD1mlpJJzohmujEaB1nrwIJbQOIqu/jtmmPAK1bWz323r2hU6ezj9hYeO01+PJLt72d22itGKWqWUJyAuvnrKcguwD/UH9Ph2MbIkL3fiGsWZGNMcZtlTTvvdc6zpWXBwkJ8Pjj1t6qNalwp/bYlapmiYMTKS4oZvcXuz0diu0k9QslI62YHVvyq/y9AgPhySdhzRprp6aaRBO7UtWsSa8m+If56zh7FTizjG91GDUKmjeHSZOgpAatO9PErlQ18/H3oeXVLdmxbAee2MHMzn4r4+vGaY8V8fOzpkVu2gTvv18tb1kpLid2EblXRH4Rka0iMs0dQSlldwnJCWQdyuLI5iPOT1YXxF1lfCtr+HDrJuuTT0Kx6xUN3MKlxC4iVwLXA+2NMZcC/+OWqJSyuZbXtAR02mNV6N4/lNwc95TxrQwfH/jb3+Dnn+HNN6vlLZ1ytcc+Dvi7MSYfwBiT7npIStlfaEwojbo20mmPVaBLn2C3lfGtrJtussoQTJ4Mhe5ZH+USVxN7InCFiKwVka9FpEt5J4rIGBHZICIbjh496uLbKuX9Eq9L5OC6g2xbvM3TodhKWHhpGd9qGmcHcDis/VJ374Z586rtbcvlNLGLyAoR2VLGcT3WPPhIIAl4GFgk5UweNcbMNcZ0NsZ0rlevnlsboZQ3SpqYRKMujXjv5vfY+81eT4djK90HhJCyLpcjB6qv+5ycDElJ1rBMXp7z86uS08RujOlnjGlbxrEYOAC8byzrgBKgbsVXVEoB+If6M3zZcMKbhvPWdW+RlpLm6ZBs44ZREQAseqn6avKIwNSpcOAAzJ1bbW9bJleHYj4E+gKISCLgD3hZuRylPCe4bjAjPxuJX7AfCwYuIHOvl+7sUMPENfOnz3VhvPPvE+TnVd8E8759oU8feOwxq4hYWce331Z9HK4m9leB5iKyBXgLuN3oxFylLkhE0whGfDqCwpxC5l89Xze8dpOR90Vx4lgxH79ZfZuXisCsWTB4MLRqVfYRElINcXgiD3fu3Nls2LCh2t9XqZps7zd7mT9gPjHtY7jti9u0joyLjDHc1H43Pr7COxubua12jCeJyPfGmM7OztOVp0rVEE2vaMqQt4ZwaMMhFg1dRHFhDVnt4qVEhBH3RbFtcx4bv61d/wrSxK5UDdLq+lYM/vdgdn22SxcvuUHyiHDqRDpYMMsL97dzgZbtVaqG6XRXJ2I7x9KgQwNPh+L1goIdDL07ktdnZHB4XyENm/h5OqRqoT12pWogTeruc/P4SIyBt16sPb12TexKKVuLbepP3xvCePflTHJzalBt3SqkiV0pZXsjJ0Zx8ngxyxae9HQo1UITu1LK9i6/IphLLgtgwazjtaIGviZ2pZTt/Tr1cUdKPuu/tv/UR03sSqlaYdAt4URE+9SKqY+a2JVStUJgkIOhYyJYuTiLg6kFng6nSuk8dqVUrfHHcVFs25RH7ml7z47RxK6UqjUaNvbjpU+aejqMKqdDMUopZTOa2JVSymY0sSullM1oYldKKZvRxK6UUjajiV0ppWxGE7tSStmMJnallLIZj2xmLSJHgb0X+eN1gWNuDMdbaLtrn9radm13+ZoaY+o5u5BHErsrRGRDZXbpthttd+1TW9uu7XadDsUopZTNaGJXSimb8cbEPtfTAXiItrv2qa1t13a7yOvG2JVSSlXMG3vsSimlKuBViV1EBorILyKyU0Qe9XQ8VUVEXhWRdBHZcsZzUSKyXER2lH6N9GSMVUFEGovIShH5WUS2isjE0udt3XYRCRSRdSLyQ2m7nyp9vpmIrC1t99si4u/pWKuCiPiIyCYRWVr62PbtFpFUEUkRkc0isqH0Obd9zr0msYuIDzAHuAZoA9wiIm08G1WVmQcMPOe5R4EvjDEJwBelj+2mCHjIGNMaSALuKf1vbPe25wN9jTGXAR2AgSKSBDwHzCxt9wngTg/GWJUmAj+f8bi2tPtKY0yHM6Y4uu1z7jWJHegK7DTG7DbGFABvAdd7OKYqYYz5D3DujrvXA6+Xfv86cEO1BlUNjDGHjTEbS7/PwvqfvRE2b7uxZJc+9Cs9DNAXeLf0edu1G0BE4oBk4H9LHwu1oN3lcNvn3JsSeyNg/xmPD5Q+V1vEGGMOg5UAgfoejqdKiUg80BFYSy1oe+lwxGYgHVgO7AIyjTFFpafY9fP+T+AR4NdNSKOpHe02wOci8r2IjCl9zm2fc2/a81TKeE6n9NiQiIQC7wH3G2NOWZ04ezPGFAMdRCQC+ABoXdZp1RtV1RKRwUC6MeZ7Eenz69NlnGqrdpfqaYw5JCL1geUiss2dF/emHvsBoPEZj+OAQx6KxRPSRKQhQOnXdA/HUyVExA8rqS8wxrxf+nStaDuAMSYT+ArrHkOEiPza+bLj570ncJ2IpGINrfbF6sHbvd0YYw6Vfk3H+kPeFTd+zr0psa8HEkrvmPsDNwNLPBxTdVoC3F76/e3AYg/GUiVKx1dfAX42xvzjjJds3XYRqVfaU0dEgoB+WPcXVgJDS0+zXbuNMY8ZY+KMMfFY/z9/aYwZgc3bLSIhIhL26/fAAGALbvyce9UCJREZhPUX3Qd41RjzjIdDqhIi8ibQB6vaWxowGfgQWAQ0AfYBfzDGnHuD1auJSC/gGyCF38dc/4o1zm7btotIe6ybZT5Yna1Fxpi/iUhzrJ5sFLAJGGmMyfdcpFWndCjmz8aYwXZvd2n7Pih96AssNMY8IyLRuOlz7lWJXSmllHPeNBSjlFKqEjSxK6WUzWhiV0opm9HErpRSNqOJXSmlbEYTu1JK2YwmdqWUshlN7EopZTP/Dy5Zak4zdJ3SAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "mu = 200\n", "t = 1 \n", "q = np.zeros((d1,1))\n", "while m1/t >= epsilon/100:\n", " q, ftlist, backtrack, flist = newton(f1t,nablaf1t,hessianf1t,q,t,epsilon/100)\n", " t = mu*t\n", "fmin = np.min(flist)\n", "mulist = np.array([4, 10, 50, 100, 500, 1000, 5000])\n", "for it in range(0,len(mulist)):\n", " mu = mulist[it]\n", " t = 1 \n", " q = np.zeros((d1,1))\n", " Flist = np.array([])\n", " while m/t >= epsilon:\n", " q, ftlist, backtrack, flist = newton(f1t,nablaf1t,hessianf1t,q,t,epsilon)\n", " Flist = np.append(Flist, flist)\n", " t = mu*t\n", " s = it/(len(mulist)-1)\n", " plt.plot( np.log10(Flist[0:-1]-fmin), color=(s,0,1-s), label='$\\mu=' + str(mu) +'$' )\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "" ] } ], "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.4.5" } }, "nbformat": 4, "nbformat_minor": 2 }