{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Lecture 10: Symmetric eigenvalue problem(algorithms) and SVD(applications)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Syllabus\n", "**Week 1:** Matrices, vectors, matrix/vector norms, scalar products & unitary matrices \n", "**Week 2:** TAs-week (Strassen, FFT, a bit of SVD) \n", "**Week 3:** Matrix ranks, singular value decomposition, linear systems, eigenvalues \n", "**Week 4:** Matrix decompositions: QR, LU, SVD + test + structured matrices start" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Recap of the previous lecture\n", "- LU decomposition and Gaussian elimination, Cholesky factorization\n", "- QR decomposition and Gram-Schmidt algorithm\n", "- Schur decomposition and QR-algorithm (basic)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Today lecture\n", "\n", "Today we will talk about:\n", "\n", "- Algorithms for the symmetric eigenvalue problems (QR-algorithm, Divide-and-Conquer, bisection)\n", "- SVD and its applicationss\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Symmetric eigenvalue problem\n", "\n", "If $A = A^*$, then $A$ is a **normal matrix**, thus\n", "\n", "$$A = U \\Lambda U^*.$$\n", "\n", "By Householder transformations we can reduce the matrix $A$ to the **triadiagonal form** (in the general case, **upper Hessenberg form**)\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## QR-algorithm: iterations\n", "\n", "The iterations of the QR-algorithm have the following form:\n", "\n", "$$A_k = Q_k R_k, \\quad A_{k+1} = R_k Q_k.$$\n", "\n", "If $A_0 = A$ is tridiagonal symmetric matrix , this form is preserved by the QR-algorithm.\n", "\n", "Let us see.." ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/plain": [ "array([ -8.40446626e-01, 2.43868297e-01, 4.66623693e-01,\n", " -1.17431594e-01, 3.68022785e-02, -3.14867052e-02,\n", " 1.65306821e-02, 3.27003099e-03, 4.11804912e-03,\n", " 1.13682966e-03, -1.19526350e-03, -1.78829558e-04,\n", " 6.19949148e-04, -1.67145664e-05, -5.63227762e-06,\n", " 2.27561748e-07, -2.06766328e-06, 1.63583258e-06,\n", " 1.76760086e-07, -4.69013862e-07])" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAD9CAYAAACcAsr/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztfX2MLGlV/tPTX1XVnzNz5856YVncXXERUUTQiPCHEhOE\nbIgLgQSDhhVdSYy7f23cEGADgpirGIwxLCSaGCAxkIAQiIQYoxGDQCTRXUC8u9F1w3I/5qO/qquq\nZ6Z/f+zvvHPq9FtVPTNd3T0950kqXV1d01Xd0897znvOc85bGI/HYygUiguFtUXfgEKhmD+U+ArF\nBYQSX6G4gFDiKxQXEKVF38AqYjwe4/DwEEEQYDQaYTQa4ejoCAcHBwCAQqGAYrGISqUCx3HgOA7W\n1nQMPg2Ojo4QRREODg5weHhoNvq+eey6UCgAAIrFItbW1lAul1EsFlEqlVCtVlEsFhf1MeaO3Il/\n8+ZNVCoVVKtVVCqVpf6Bj8dj7O/vo9frYTAY4MaNG+h2u+h0OgiCAMPhEIPBwDx2Oh34vo9ut4tu\nt4vhcIgwDBGGIU6aLCkWi6hWq2g2m3BdF57nwXVdtFoteJ6HdruNWq0Gx3Fir9frdWxubqJer2Nj\nYwP1eh2l0vKP51EUod/vw/d93Lp1C71eD51OB8PhELu7u/B9H77vo9/vYzgcmi0IAnQ6HfO3vu/P\n7J7od1qv1+E4DtrtNlzXRbPZxMbGBjzPw8bGBtrtNjY3N9FsNrG1tYV6vY5Wq7V0v23iXqvVmnit\ncJp03v7+Pv7u7/4OpVIJv/ZrvwbP8xLPve+++/D6178e//Vf/4UvfOEL8DwPtVoNly9fRrPZRLvd\nhuM4qFar2NzcxPr6Omq1GlzXRa1WM/+MUqmESqWCUqmEYrE4MTofHR2ZUf7g4ABBEMD3fYRhiCiK\n0Ov1DEl930en08Hu7i5u3ryJwWCAfr+PTqeDKIrMe9KX1mq1UK1Wzb1Xq1XUajW02214nodms2kI\nS5+lVCrBcRyUy2VjWeieySMYjUYIgsB4BsPh0Nwn3X+n08FgMEC320W/30cYhvB9H8PhEL7vo9fr\nIQzD2HextbWF9fV1NJtNNBoNrK+vw/M8VCoVNJtNVKtVOI6Der2OSqWCSqWCcrmMarVq7pUfl9/z\n4eGh+Y7DMDT3QqTs9XrY3983x3q9Hvb29jAcDtHpdLC3t2e8H0KpVDKDnPwNeJ4Hz/OMd0SfiwY+\nx3GM5V5bWzPfdbFYRKFQQKFQMAPxeDw2n2E0GpnPEkURfN+PDUj8t7K3twff97Gzs4NOp4OdnZ3Y\n914sFtFoNGKDA91nvV6H53loNBpotVrmc9RqNfN7JsNI90wYj8fmPum7Jg8nDEN0u11jbLrdLvb2\n9nDvvffila98peHeO9/5zglentg0HB0d4YEHHsBb3vIW7O/v46GHHsLHP/7xxPPr9Tr6/T4eeugh\n3HfffRgMBvB9H9evXzfWNAxD7O3t4cknn8T+/r45ZzAYYDQanfQWDdbW1swXSsSkx3a7jdtvvx0v\nf/nLUa/Xzai9vb2NZrMJz/PQarVi/4RlxHg8NpZxd3cX3W4X169fx97envFE9vb2cP36dQRBgH6/\nbwabwWCAKIoQRZGZkpwG5XLZELPVaqFWq5nBplarYXt72zxvNBrY2NiA67qGKJcuXYLjOEv/XUuE\nYYgbN25gMBhgZ2cHvV7P/B86nY7ZfvCDH5hButvtmu8/CIJTXbdYLJqBul6vw3Vds7+xsWG+R+Ke\nDScm/uOPP45ms4k3velNAIAvfelLePbZZ/EjP/Ij1vObzaZxnXu9HorFIjY3N7G9vW2sS6FQMB+E\nrDpta2trODw8NFaS9o+OjswoTh90bW3NjJqu66JSqZy7H9NJUSgUUKvVDMHOArJ+o9HIDAY0T+bf\nMc2Pq9Wq8W4uIqrVKm6//fZT/z1932S9oygyv28AxlvhcQjXdaeORRD3bDjxf+zpp5/GHXfcYZ4/\n//nPx//+7/8mEn9jYwM7OzsoFouxm+CBGBmYkcfItSYLQo+2femaKqYHucfVanXRt3IhwL/vWq02\n8/cn7tlwqmgEJ1epVEoNZK2vr2N3dxeVSuU0l1IoFKcEcc+GE1v8y5cv45/+6Z/M852dHVy6dCnx\n/GaziX6/b1x2AgXjuMvOsba2hvF4bNxM2ufBGErL0OuHh4col8vGRaLXkp6v+jRAcbFB3LPhxMR/\n2ctehg984AP44Q9/iMFggFu3buHOO+9MPL9arSIMw0TiE6FlvpWICsA8UtR+NBrFop/8eLlcNpFd\nHuGVx2gQUChWFcQ9G05M/Eqlgve///149NFHUSgU8JGPfCQ12FCtVjEcDlEqlSaIz4N0MqDBc6Kc\n4JSGIStPpI+iCGEYolwux4KDtFGAhAJRSnrFqoO4Z8OpwrE/8zM/g4997GNTnUvuRrFYjBHfRnoC\njyDzQYBIbiM9EZ7y5uVy2eSh6ZGmDTSNUChWGTN19U8K7upL0QYnPZ/PA4jN66XFB45TIdKVJ6JT\nqqlarZppBQBznkKx6pipq39SlEoljEajiTl+Gjj5OSiAd3R0NBGko61cLsNxHJOD5sFDIn1WJkKh\nWAUQ96yv5X3xSqWCw8NDFAqFCeLbCJ60L4OAcp8ey+WykTRKkQ+RPimToFCsEoh7h4eHE15u7sR3\nXRcAjN6YwEkv02vyGA8EkrvP04H8eblcTrT0NA1Q4isuAoh7w+EQ9Xo99tpc5viAnfg8cGcjPU+5\n8SIcLnXk2+HhYcyi03uQpa9UKhODgkKxqiDuhWE4f+LzijQe3CPNN+3LwB69ziPwPJ1HWnL5yOfv\nkvQ07+d6aIViVUHck0F1YA7EJ3kvj8gDiBGPl03Sc0l+/h6Us7dtpVLJaul5EYRafMVFAHHPFlTP\nnfhkxcfjcUyvz4kt3Xqaz9M+d+Xl/J4H/WTgz/Y8SS2Ydu8KxXkE55PE3Oopx+NxagUSJ6kcoUiO\nK910mZ4rFAqmfJFEOzzPz5sykPeQllGQZb8KxXnEQokPINaph0fps/Z5ma4tcEeFOVQnzrvHUE2/\nzaMgPQBwTHRJciW9YhWRO/H5aMMtvq3unhPSVqNPg4DMzQPxlB21kCLik8WnWAF3+2U2gYMPFDoA\nKM4b0jzW3IlPbnuhUIhZfHLf19bWMBqNYuW3RHRqB0Vkl3Nz6b6TVp9be058/gVwi28jvK07q0Jx\nnkDcs0nUcyc+Na+sVCoxix9FUayWnrdDlhV3tjkKJyz/YOTmJ83xgUlXX25asqtYBXDuSeROfCoS\nkMTn9fTk8sv6ek58Gf2XJJW94HjvPhvxuasvy4DV2itWAcQ9Wyu1ubn6pVIp5upLS89r7HnTRyI+\nb5ks5/V8o8o82xzfFtXnAwKPAfB7VPIrziM49yRyJz6phkqlUszikwb/4ODARN5tdfZBEJg0HY/m\nA/F0HpFcuvpJc3yuFVhbW4vt89Sikl9xXsG5J5E78QeDARzHmSA+LRRA7jy5/rY5PicfkZ2sNy++\n4S2f+eIbaek8Au/xx4mupFecVxD3FhLcC4LALJbAXX0uveUWn17jrj6fhxeLxUQtPl+qK8nVB+zE\nJ/AGIEp6xXkGcc+GuRGfFrsg8BZZnKQ8IMeXQaJ9ep2317KRXhJeioHomGzAScfkPF+hOG9YKPE7\nnQ6azebEcd4Yg1x0x3ESm2hwF972KGW6PENAQQ4eOIyiKNaEUz7KLj22fL/8PArFMiGJe8AciN/r\n9dBoNCaOSzediG8jfaFQiAXs0vZ5dR4Qb9dFUXwSDlH6jwcHy+VyrJCHTzPSJL2q61csG5K4B8yB\n+L7vW1fTJTJxi89JLwN53L2X3XT5MZtCT7rqPH1Hg8bBwcFEdx6uD0gSEWkcQLGsSOIeMAfi9/t9\na1Ued/V5bzBb5xx+blq/fDpXluDaevgfHR0Z608ehxwkiPR8zs/vX9N9imVGEveAJXD1y+VyrAhH\nvkYBQdlGO2kDjguAgGNX31bsUygUJqr+5P0Vi8XExh028usgoFgWLNTV73a7uHLlysRx6eqTfJaO\n8bk/cGx9szYuvuHNOHlNP+0DiHkaBE56W1deWauvZFcsI5K4B8yB+Pv7+2i1WhPHufsuLT0NBqPR\nCI7jTATZ0gpruEUHji0+VfpFUWQ2el1q9jnpeccfTm5JfnovHQAUy4Ik7gFzIP7u7i42NjYmjhPx\nk8Q4vHtuUsTc9pwChCRX5BafJMDUn483/JDEl1OQJFcf0Ii+YjmRxD1gTlF92doXOJbIyuCd7JXP\n3XBbHz25T+SX6TwuAR4OhxgOh8bTkMFE8jaS5v8SSnjFMiKJe0DOxD86OkoMMBDZedQ8abNF59Mi\n9vS+QNzVJ4s/HA4xGAysLj5v5jEN8ZX0imVEGveAnInf6XRweHiIzc3NideylHAcvKtu0go6fJOt\ntoDjuTxfjIPP/eVmW7DDFmNIiz8kQQcLRd5I4x6QM/Fpid607rrTwBbMk80zCDxTwIVB0nLTlMB1\nXTiOE5P6jsdjMzXgGn7Z9MO2yQGA33/avkIxS2RxL1fi37x5EwBw+fLlmb5v2iDABT3cXedxAOC5\nAeLg4ACO4xidPxGflwXzgUAW9HDPwnYsKfMgya9QzBpZ3MuV+N1u1xTQzAI2aym75lAqzibDlW75\n4eFhTPZrs/g8OCjFQlJMROXFvF6AewG2FmIKRR7I4l6uxN/Z2UmcY5wUNnUcdc7hj1IAlCbDpeWD\npfKPL9VFcQDqG8A9ClnRR92E6H2l5JcHH7XmX5EnsriXK/HTBASngc09lmo9HpnnzTZs4hwK2MmN\nLD7Jemmz1QrIPgK0Yi8fTMjS08DCr6NQ5IEs7uVK/N3d3ZlZfA6bheRNNPiyWnS+JD2tnitThkn7\nAKwVgmTl6TgNNlyTQPdF95IWnFQoZoEs7uVK/LSywJPCptKT+X6CbKIhSU+EpcU6yLpzpSA/Rgo+\n3tKL5/pJ5SfTirZmHrwmQS2+Ii9kcS93i7++vn7m97Hp4pNeJzUgHbeRnhftRFFkHnnTDv46dQWS\nHXzpGE8VJq3gS/fDSa/EV+SFLO7lHtV/wQteMLP3SyI9YF8RNEl7z5foCoIAQRAY0tMgQsE9ej2K\noonefrLUl08LpIyYR/mzJMAKxVmRxb1ciT8cDmfu6vMoeNIxTniu95fuuFzEg57Lvv6+7yMIgpgY\nSJI+yYJL0vP6fiW/Ii9kcS/3qH5Ss7/TIs3qA8eDgOyTb3PBKbhHgwAF4KTF930fvu/HpL42Db9N\nqEOEpxQfH3g0nafIC1ncy5X4QRDMzOKfFUkDBrfENCXgwbtqtYrRaISjo6NYN1/Zu5+n8Gyr9vBa\nAdIQUBUhj+5Lb4a/jw4QimmRxb3ctfpJZYF54STksAX/ZM/+0Whk+vFNS3qp1QcmyU/nUcdfqSWg\n+5um6EehkMjiXq7ED8PQukTvIpCU++cWnwtxiPQ8xcej+tOSn8DLibkwiO7DpuW35fp1AFBMgyzu\n5UZ8miMv2tWXUX/pOktXX1p8SXy+Tt80Fp/rDWRJsY34cp+kyEp4xbSYhnu5EZ/W5l6kxc/K/9tI\nL4nPO/balv06icXnrj4/LvX83MrzIKWSXzENpuFebsRPW6J3HuDFPBwy9Zdk8WWeHpiU7NrW+ptm\nji+P8co92cOfewwKxTSYhnunYuVnP/tZPPHEE+bN3/3ud0+cQ2ShFNkikTQIJCn7bDJcABPFObZ1\n95K6/0jS03HqGMT1/LYUoUIxLabh3qmI/+lPfxoPPvggKpVKYqEJ9a0vl8unucSZIImeRHqysryU\nl8t6ZWvtpAU2ZY2+reGG1BPwufu08l519xXTYBrunZj4pF1//vOfjyiKcM8991jPI+u2LBYfmBwA\npMW3lfRywqWt4CMtPr8uXZv35ucFOzZXnu6NBgiFYlpMw70TE/+pp57C9evX8clPfhLPPvssKpUK\nPvrRj05YInI3FvWjtWn4k1x9ns6Tsl5CUost2Y1HuvnyHmxzdVuzELq+FvQoToppuHdi4r/whS/E\nF7/4Rdx2220Yj8d461vfiieeeAI/+ZM/aT1/0a5p2vVtgT0pqZXnJm2c9LI5CD3ajvFHKfnVgh7F\nWZD22z8x8Z955hns7OzgtttuQ6FQwMbGhkkfcJyXH6utiCZpvTwptLEJbwDE5uS2TdYNkFRYTi/4\ntQncfUuT8y56wFUsDtNw78TEX1tbw/ve9z58+MMfxg9+8APcuHEDP/VTP5V4/nn4ASaRXwbVbBv/\new6baEcuBGLr1pNVz2+rRLTtKxQztfh33nknrl69ii9/+ctYX1/HX//1X6dGD5fd8k9TMsuls0lW\nNk2sk/UoYwuS9JzQaYOQHIB0ALjYSOPeqdJ5L33pS/HSl7409RxbcG3ZIDXxUkHHzyPiy8+T9Jxb\ndVsNPz/GpxYy1y/vkVKQtngA/xvFxcU03MtNVkeqIS5PXVZI4vPj9BpflEMG6pKOkUXn/fx4TT/t\n8zp9GfDj9yG1B3wgABAbnJT8FxfTcC834tOPcNmJz8kt8570GtXP27rvSkstLT4nPlX7yUfpZdii\n/FwYxAcambLRnL9iGu7lRnwi0XkgvrSc/Dil1GT3HK7oI9Jz8vNzuKWn5p60RVFk1VTbSM/deqnp\np79RlZ9iGu7lTnw5Z102cILx51JAw623LKuVkXY6ZrP4vHMvbUR8W1xBagXIA7Gdb8sEKC4epuFe\n7sSnSqFlBI+SkzXlfe+la08EJNLLeb9Nl0/kJ4vPyR+GIcIwRLlcnojMS8IXi0Wz8k/S/F8G+RQX\nE9Nw78IH92ypMpvajhM4KXXHQcdtFp8IH4YhgiCY+AfZSE+bTagjo/5q8S82FhrcoyYAQRDkdYmZ\ngEfLbSIcvi9JDyDmCSRZfG7tyb0n0gdBYFbXtaUW5Vp/Mg6RRHol/8XFNNzLNarveR76/X5el5gp\nbIEwadmTNPpEftqXJbppVX3yXD6AcMgUIR2j59QeXL6nlBTLwcIm/FGcb0zDvVzb43ieh+FwmOcl\n5oak+bctwk6xgjQ1Hj+3WCzCcZyJJp7cvefehAwwJm3TDDr8HMXqIIt7uRK/Xq+j1+vleYm5I0np\nJ3F4eGgKb9K09/Qe1MNftvayTSN42tAWj+DBRrm6r+wVWC6XNSC4gsjiXq7Eb7Va6Ha7eV5iruCB\nQD6vtqn90iy9tMxEfNm9V7rsFIuYtgagUCjE1vrjC4LQvdmES4rzjyzu5Up8x3GWPrh3UqRFzzmZ\nbSo/G/nJotussSQ+cOzqc+Uf3/gxAHBdF9VqFa7rmtfIY6BBZxHt0RT5Iot7uRLfdd2VJD4nPz9O\nVpYPDEmDgxTlkNvN+/6Rq2+b49uEQHIDnpvrZZF+2UVWipMji3u5E9/3/TwvMVfYXHR5bBoX3ybD\nTWviabP4XA9AacEgCGLPx+Mx6vU66vW6KQyiuT+Rno4pVgtZ3FPinxA2i8+P2Vpl2WID0uLz6Lrc\nTyJ+FEUYDocYDofwfX/icTweI4oiQ3rguVQPeRS07Lda/NXDQolfr9fxzDPP5HmJuYLIx115Crid\n1L3nwhx6T1mII4/RtWiOT9bd930MBgP0+30MBgOzT+IhGcjjC4JSMFCxWsjinubxTwgudEmS9yZF\n8JOITwNImriGrssFO1EUGeL3+330ej30ej10u130er3YtIO79zzYp67+amKheXzP8zAYDPK8xFwh\nSU+wEcfm3ks3vlQqmcUPkq4jj8k5/nA4NBa+2+2i0+mYzTanr1arcBwHYRhOBPwUq4Ms7uVK/I2N\nDezt7eV5iYXAVigjQXPppL/nbrxN5GPbAMQKfLI2WjWVNioSkp2A5BoCSZ9JZb3nB1nc0+BeTkgK\n6HGlHz3K5bp4bz7ZB2A4HKLf78P3fQRBYIJ3RFwacEikQ6IgrgKka8tpA59SJO3zz6ZYXiw0uNdq\ntdDpdC5sNxgZ7U9S+nGRjyzhla26wjA0AbzhcGglPrn04/E4RnyefuTEp/dOiy/w44rlRxb3ciV+\no9HAwcEBgiCA67p5XmopIUmTFAvgFXfcAodhGCvjpcfhcBjL2ydZfAATxJcWnyv+uGdi2+fpS8Vy\nI4t7uRL/0qVLAIBbt27h9ttvz/NSSwebq287h+vqORltJCeiy0HBlqevVqsAjolvEwJJV9+2DBil\nAflnUSw/sriXe1QfwIWe59tIL1V+vKUWj9gHQWDEOLSRhZdTALL4UhuQZfG5q8/7CthKjbW7z/lB\nFvdyF/AAWLnS3GkhXX3bcT53lhaf5+hJnBNF0cSKvlyEQxafCEylvmlzfIonUBMRIjiPRSRNVRTL\niSzu5Ur8SqWCUqm0ciKeaUDkksE9svT8OBGSB/eI+DxP3+v1Mhco5e48zfVlbT/9jc3iJ/UM4MFJ\nxfIji3u5Eh8A1tfXsbu7m/dllhJ8PmyT+cp6eCKjVOUNBgN0u110u12TdrO1AZMbEV9afAInPrX5\n5vdI962kP59I417uxG+1Whfa1afHtG453NWXFp/LcTudjiGobeOEJ9Lz4B4P8PFpxWg0iomN+DTk\n8PBwQmSkOB9I417uxL+oIh7u6vPnHPScW2LbHH8wGMSIT4SmrjrA8bJJ3NJTtx1Z20/Xlq4+v3fu\nVSjpzyfSuDcXV38VZbvTYBppL4CJuTcnpa3pBk0PeAkw6fE56TnxeUSfB/Vk1Z9cvJPeO6vHoKb5\nlg9p3Mud+I1G49y02F4UeLksFdF4nodGoxErpCkUChiNRhMWnz9PsvTAsTgIgIklkFaArm3b+EDA\nYxJJMl7u5SgWhzTu5U58x3EupKt/EthKZmu12kT13NraGkaj0UR/PttGUV3uTfD6/NFoNBEMdF0X\njuPAcZxY2S4v7eXNQ5J0/fKzKRaDNO7lTnzP8y6sqz8tOPErlYqx+LJevlgsmkAc38jFtx3nQUSa\nOiTdQxiGsevya9M90n3atPxayLNcSONe7sRvt9t4/PHH877MuYbN1ecyXCIddc1JWhBDNvmgqLxN\n7GMT/8gafd6Yk7fs4gt5yIIem0pRsRikcW8uc/xVasaRB6TFd13X2i6LeuTZCmjkI+XduThHtuWW\nkl+u+5fuPZG+UqmYNfzoGvy6lPOnz6VYHNK4N5c8fqfTyfsy5xqFwnF7bR5Mk40xXdeNLdyZFVAj\ni00uOw/oyYo/3piDu/dJffpsBTzAsVBJSb94pHFvLsG9VeutP2twcknNPZ/312o1HBwcWMVAtmM8\nkAfES36pOy9tVAOQRHqK8NMAwTX9pOtP6hykg8BikMa9uQT3NKqfDu7qy+dEet6Yg8/RyZLbNjpf\nRvUphUedfAaDgenDz68vSU/3wVfr5Z+BHlXssxxI495clHv0A0zqQXfRQUTj+xREI/ebHvlmO8Y3\nitTLPH4YhjFFYK/XM8Uc3NJzMZDjOKZvny0zwEuN1cIvB9K4lzsTSVIahqESPwF8nkyKPJtF5/X6\ntrXy5LHxeGxy+VybT7X+VPXX6XQwGAwmCE/ehuu6sYg/rctHkCk9OfVQLAZp3JvLHJ8uXqvV8r7c\nuQR3rbPA5+nk/st9att9dHQU0+jb6gB4H35e3EPuved5pqknj/pL8Q5P5ynxlwNp3Mud+DTS2PrH\nK04HWZbLvQS+8i1306UakFJ29F7VahXr6+tot9toNpuo1+vwPA+O4xgVoCwfLhQKxrPgXopcQ8Am\n8skSACnOjjTu5U58+rHoog2zASeOJL6tbTelAckr4KQHjguEqtUq2u022u02Go1GjPjVajXmORDR\n6VqU1iOPwtYbwKYzkM/551OcHWncy534PKKsmA2ka02pP3nO0dFRLDAnSc+nGI7joNlsmk1afKrw\n48TnlYQ26y2Jzb0A/kiYZqqjmB5p3NNo2zmEJD13wfk5RPxpZLie55kltWmTrj7/Idmi+EmCIroO\nXzqM8v6lUikWFFSLPx/Mjfga6JkdeBBNWkkZZKtWqxN19pyMFL0PggCe58HzPNRqNXieB9d14bqu\nadjJLX5SUxHbc1lEREFHeb+KfGDj3tyIryP5bCCDY7IXniQSt/SytJYTPwzDWEku7VNtv5zjA5Oq\nwaSNvArZ5CPpMyhmCxv3piJ+EAR44IEH8Jd/+Zeo1Wo4OjrC1atX8R//8R9oNpv44Ac/iI2NDevf\nUkRRc/izg81KctebAm1UncelszYpMOXpeRMP+UgWH4h3CbJpDeSxUqk0sTgn/wxc7quYHdK4l8nG\na9eu4X3vex+eeOIJ84/5yle+gps3b+KTn/wkPv/5z+MjH/kI/vAP/9D691EUAUAszaQ4GyTx+XNO\nOnpO53AZLpGaVtaNosh07KFmHrTP6/t5cE8u9Jm0T9aeD0B0v7wSUDFbpHEvk/hPPPEE3v3ud+Ph\nhx82x/71X/8Vr3vd61AoFPCrv/qr+PM///PMi9NaborZwFYNR2k1nmLjpb1SoEPae0r1yXp+Wesv\n03m8LyCXEVNaTx7j987vydbnT3F2pHEvk/hvfOMbJ47t7u5ifX0dQHb1Hem61eLPBrIYBphs102P\nkrxEelL5ybr8aUU2nPS8loCX9koZMX8/fk9q8fNDGvdONfFuNBpmNMkqytA5/uxhS58ROIGI/OTe\ny4If+ThtsE5a/KTmHvQoO/bQIEQegRI/H5xpjm/Dj/7oj+Kpp57CL/zCL+Dpp5/GHXfckXhuGIax\nwJAiX8jBICn1J7UAsiWXdL+lLJeLgWTffakxoHvitQK2Vt9UTJLWWYg/aqYoHWncOxXx77vvPvzW\nb/0WyuUyvvjFL+Id73hH4rnUFVaxOGQV0thy8JxUPGDHH7m1tqXo6AfHswG8nz8fCORSX3yzHZPL\ngSkmkca9qYn/6KOPmmqfra0tfOITn8A3vvEN/MEf/AFe8pKXJP4d/VMVi0FS3p/nzintB0yS3ubW\n2yL48hryORGdrkONQiSxbVkF+Rw4lqMqkpHGvamJ/4pXvCL2fHt7G/fee++ZLq6YD2ykl68Bx+v4\nyQIcnr7jUXqp2af348Tn++PxOFbWKzv0FgqFieW/5CPXIijSMRPinxb9fl/r8BcM6ebbXgPi5bby\nGI/Uj0bo9cObAAAa/0lEQVQja0ZBXsum8OMDRZLKj1SDvM04vRcX/CjSkca93IkfBIGZIijmD178\nYlP7yYIbssIEm6tPNfi2ObYt6GaLDSS1DSuVSqZmwFZCTHl/JX420riXO/FJA66YP2TFGxf9cNLT\nOZRX54ODzc3ni23aNroWbTwmQH/PN95BqFQqmTZfslkIX9BDy7yzkca93Inf7XZRr9fzvowiAdz6\nymg+kZ7r+KWrLuf4RFxbIw05peANNmh6QFH9IAiMXJjvU9swm3tPHX/5a4pkpHEvd+JHUaQWfwnA\nBwBOagAxi5/l6hP5eSMNPp/nqTzeHYjO4Tl76unv+77ZJ6/DVlREvQWU+NMhjXu5E9/3fSX+gmEj\nPQ/e0XFpuel1SXreq5//rXwfStORHJiIT6v3UIvvfr+PwWCAwWBgAnec9FQ6TCsJKfGnQxr3cif+\n3t4ebr/99rwvo0hAGuk5pAUH7Ok8cvV5E02pCZD1AXQun+MHQWAW9eCdfulceg9bX38N7k2HNO7l\nTvxer4dms5n3ZRRTIk3tJufmtiIfXqIrBwku0OHPqexXNvu0DRZSpWeLHyimQxr35hLcU+KfDxCx\nOMll5xyZJeCBQB6F5xu59bQ4J51TLBZjwToiO+/yS92AuKRXxiEUdqRxby6uPpXwKpYb3OLzMl6b\nMs8mxJHH6DlfoZdrAPj7r62tGWJTl99arWZ6/vG+f0r86ZDGvVyJf3BwgJs3b2J7ezvPyyhmBOly\nS1kuP0eKcKSWXzbn4GW6ZPFLpVKM9ERusvhEfGnxk7oKK46Rxb1cid/v9wFAXf1zApvF5006+esk\n4gFgzrGJc7gQh288fcinE5VKxZDe5uonWfykoOVFRRb3ciX+7u4uACQ24lQsF/gcP6lHHg0IYRgC\nOK6xl3X1XJRjm/eTxZdBu0qlglqtFiM+d/XT5vhK/mNkcW8uFl+Ve8sPadF59Rv3AkhgAxyTXubo\nKVVHwhwA1gU1bI+VSsUQnjT701h8Ap+SXGRkcS9X4u/s7JgVVxXLD27Vbcdku6yDg4NY511u8bk4\nZ21tzYhwKpWKGVi4OIc2vsgnr9KTFl+Rjizu5W7xG43GhR99zwts1Xtcditbb0VRFAu00Ryf5Lgk\nzqG1+Xggj6YUpMiTi3jwOnze23/adN5Fd/uzuJcr8YfDoVr7cwTu7pMVT0vRBUEwYfHJ1SeL3+12\nY9H7UqmEarVq5vi0mi8F9BzHMX3/qfMO3+dtt9StT0YW93Ilvu/7cF03z0soZghu8XkBD4Ef440c\nSY4rC3D6/T663W7Mva9Wq6bun1x913VRq9XQbDbhuu6EQpA/t1n8i27dbcjinlp8RQyydj8JkoxE\nSJvEVsYJuCXnc3raplnMgxfqyHoEeszyCFZ5sFioxQ+CANVqNc9LKBYEXiNPa/B5nmfUeby0tlwu\no9lsotFoZIpzZHUgb7hBngI1C7GlCPnf2o7RccDuKazKYJDFvVyJPxgMNJW3oqA5OinuiPi2Hnnl\nchn1eh2NRgO1Ws3o8ClVxyP2vOqP3oOLfiSxbb32k/rw09+sMuEJWdzLlfj7+/uq2ltRyK44ruvG\nmmQQ4WgawEU5UpUniS/jCrY2W/watm5AfOOdhfmgYiP/qsQLsriXe3DvypUreV5CsSDYXH1Jenq9\nVCoZQQ6fy3NxTqVSMa5+VldeXjvAYwA8NsC78SZ1AebHVi1DkMW9XInf6XTw4he/OM9LKBYEysPb\n+uDxIJ7jOCaPT9adC3O4xadgnlzCiz/nun8AsSAg/3siPRcjpQl/VoXwhCzuaVRfcSrIXnhJPfIo\nSs8XxbAtlMGDezZX31b5R8TmaT/bWn4ctmyDfH0VsPA8vvbbW02QxadcPD/GA360QCZfCotvXJxD\n9QFyNR/bsttU108yYiI9iYX4fdoCgoRVc/EJWdxTi684Ffgcns/pK5VKrPaeWnFLMU7SPll4nrOX\n/f5oI6JTWS+PAxBsxKf7B+KipFUK7i3U4ne7XTQajTwvoVgQyLoD8UGAd+SlTUbbbQE52oj0BFuj\nzyiKEEURDg8Pra3B6P5sLj33JmhaQYRfFdID2dzLlfhhGKpkd0XB02dkqZO0/WmiGvkaF+cAycQP\ngmAiCJhk6Sngx+9dZgpWhfCELO7lRnz6ZyWtz60430gKjmXBFnCTwTw+GPABRAb5qBdAmmhnbW3N\nnGdL7/HPsyoDwTTcy434QRAAgAb3FJngeXR6zuMGvBcAn9Pz2AHX8lNAkIt1KMVnqwPgqb+0YN95\nUftNwz0lvmIpwANrtpgA1wbwHn+cwFzfb+vvz3P9lAVIE/nw5/Je6b2XkfwLJX4URQCgrr4iBmnd\n5Wv0yC0+WXaetiPScW2/jAvwfV4dKFN/0srbsgBJ97qMmIZ7uRGfRlyunFIosiAj8bwDECcq6e+l\ndeYBRiI/ncMzAPK9+PV5ZsEWgFz23P803MuN+Mv+5SgWhzSrT69LN99moQ8ODszf8PfjEXx5nC/f\nlRRXsA0o8v6WGdNwL/eVdBQKG7hbLo/bLL4tGs9X9Ml65JmBNKFPUjORpOzFsg8CSciN+CS/JLdD\nobDBZv1tbr6NqLyfP3D8W+OWnev6p7H0POfPCU9xAv53y4ppuJcb8elLUuIrsiCj5DYy8nP56+Tu\nSyvPl++SK/SmEZ+i//y+pLx32aW903AvN+JTRHE0GuV1CcWKgROK1HWyMUca6WVUn9cMUFGPfB85\nwNAAAdjlvfT+y0p6YDruKfEVSwdOSCK/jahcnEOCHWnxqesvDRI2pR9fIYjX+gOT8l5J+GUcBBZK\nfBIPkJhAoZgGkvSyZRZZYV7UQ/p+Ai/lpUq+KIoSrbxtlaCkezsPGv9puJcb8WmU5ikXheIk4ESV\nG5fZSlUfj94T1tbiy3hR/T8vDeaeBEGKgaTHIDd537bneWMa7uVG/EKhgGq1alZVVShOAkkomU4j\nb0Dq+JOCeDbi8wafXCVI1+RzeltunAf/5GBgKxaSf58XpuFernn8arWqrr7ixOBBPmk5eYRduuq2\nPD0noo30WRY/SQzEB4WkXgMyQDnPaUEW93Ilvuu6ZplkheIkkOQHEJvfE6Eo/cY1/ElZAE56afGl\ntQeQ2uFXDi6y4Sdt/B7miSzu5Ur8ZrOJbreb5yUUKwxu6Qkyys678kpJL53PpwREdm7xOVF50BA4\nnuOnbbK1mIwv8GDlvAaALO5NTfxOp4NWqzXTiysUNkiBjK1jjiR+mqUni2xb72/a4B5vJSafk+dh\nq/YrFAoTA8E8MBPif//738e73vUu/MM//AOA51bpeO1rX4vLly8DAN7whjfg937v9yb+zvM8+L5/\nmvtWXFBw0qcVm3CxDp9v89elIo9bd26hbYtz8tRdkhKQ9nm/QUl8PmjNE1ncyyT+5z//efzN3/xN\nLEL4ve99D69//evxgQ98IPVvW60W9vf3T3C7CsUxkggvXXnZOceWp5eNOOSWVJVn6/IrH6V7z++B\nrjtv8mdxL7Nh2qVLl/CpT30qVtT/3e9+F71eD4888ggee+yxxLRBrVbDYDA4xW0rLjpsOXIeLbcJ\ncGjuTkE8vngHrdhjy+PLASDJ4pOFJ0FQGIYIwxBBEJjOv1EUmUGBKwHnbfGzuJdJ/Fe/+tUT3TrH\n4zF+/Md/HL/zO7+DGzdu4IMf/KD1b13X1Ty+4sSQuXJbjpyTXs7fJenllhbVp40gic/bexPpaQAg\n0tPioTwmMG/iZ3HvVFH9+++/3+w/+OCDeOMb32g9Ty2+4rRIm9cTuGvN+/dTLz1ucamIx1Znb3tO\n7y/X7bNZfCqD5dr/g4ODiRTjPMmfxb1TEf8973kP3vzmN+Onf/qn8fTTT+N5z3ue9TzXdTW4p5gL\nkqYGNhEQgctx+WuFQsFYbr5kl7TgPKhIgwMNDLIBKJ1TKpWsUt4k6e9pkcW9UxH/3nvvxXvf+168\n8pWvxL//+7/j/e9/v/U8x3HU1VfkiiTCE2QDDZsM16bI40t1JZFeEpV7BqPRaIL05AXYYhW2GMZZ\nkMW9qYn/uc99zuz/3M/9HD796U/jhz/8IR5++GGzaKJEq9VCp9M5we0qFKdDmryXq/3ouU0TwI9z\n4hP5k/QCwGQswHaMrwiclF2QmYHTIot7UxO/3W7HntdqNdx1112pf9NsNtHpdJa2fFFxviFz/kny\nXiDeoYc/T9rkyrxJbj7PAMh+/vwYpf2kaIg/H4/H1qXCT4Ms7uUq2b18+TKiKEKn05kYOBSKWUIS\nnvZtrj09z1LkcaEOP8cWFwCOe/1x0stFPyjrQJtM9/EA4VmQxb1ciV+r1QA8t1a3El+RB2zWjJNf\nuuLcOtsUeZzkcjCQ1X/cw+CBQu41yPLcUqlkUo0y1cdJf1aLn8W9XIlPy/R2u11cuXIlz0spFADi\nlp8Iyrv52JbWsiny0qYBSXN84LjBpdQi0COl+mykT6o7OA2yuJcr8dvtNiqVCq5fv4577rknz0sp\nLjCS4kdcfcctdJIijwtwZAAwrR+/LWgIIHY+HZN9A+g9eAVhUuuvkyCLe7kSv1AoaGRfMTdIK8sD\nfzLIZcu9c1WeTPXZHm2afk5qm7cg1/6z9f2bhdIvi3u5r6RTr9fR7/fzvozigkKW8MrXAEwQP2mO\nzxV5tvexPU+q4pMbvSZTdrJ92CzlvWncy534tVpNia/IFUnE5ARLCsYlafDp76bdbFMH20bKPU54\nivTb5v5nQRr3cif+1tYWbt68mfdlFIoJ2AYEKee19cuTK/fI95LuvrTuvIpP7h8dHZkiIqkKtGUO\nsj5TGtK4lzvxNzY2sLe3l/dlFIpMcNJz95o30aDzbEE62gcQOz/JusvGHVRIZJsGZGUP+H3JY0lI\n417uxG+1Wvjv//7vvC+jUGTCFkyzRdgLhUJioI7P5+l5mmsvXX8AiYIh2zXSMhZA+ko+adzLnfie\n52mnXcVSQFp8mT7jr0urTLAFBkmSm0b+JIufpRewETstoMmRxr3cia8NNxXLAjmn580x+fyfRDa0\nyWDhtIE82wAwraufNseX9QlJg0Aa99TiKy4UbFp4PiAQ6UejkQkASrd7GuLbUno0iEjCS/JzryIp\nTbn0Fr/RaKjFVywc0s2X6jsZ9JOkJ4Ly2vss4tuO2aYRafEEwD6Pn2aOn8a93IlfqVQQRVHel1Eo\nMkHkHo/jS2/LlXdtxTzS5bfp/JPab9ssPr9W2gCQVZef9loa93InPi3eN41rolDkCU50ADHC8wIZ\nW5Ud5fiBZFffRnxZ1ptl8fk9nDWPn8a9uczxj46OEEURqtVq3pdTKBLBhTtk0dNW6eERe/IQAMRe\n5111bUSXxzjxp4noy/s/SR4/jXu5E99xHADAcDhU4isWCq7Csynx+D5Zet4nL0ueK8lu27dZ/LRB\nwNYvkH+WNE86jXu5E59aD/NcqEKxKNgkuDbIxTZsi2/QlqWt59fKWrnHJhDigUbeuZf/rfw8lK4E\n7NybG/FHo1Hel1IoZgYZ5Sd9PVlw7orLBTRsaTzaL5fLqNVq8DzPrO5TLpdjUwnuTcjpSdpzjmq1\nmsq93InPO50qFOcFScQnt5yfR8RPK8ul14vFIjzPg+u6cBwntpyXTCES8W1ktx3nqFarqdybG/Fn\nVWOsUMwDNuLzkllOPNmMM02LXywWJ9by48t0AzCBw2mIzzeJNO7lTnyCEl9xniCJL0U1Uukn8/K2\nAYCCdbSmHz2Sqy+Jb5vPn4T4hIUSX6E4T5DE53N60vPz0l6bBNd2rFAoxNpr88U7uWtOKsE04svj\nJ8HciK/iHcV5giS+PM4758h0XNpzGjRkxoArCeUcn66bRPbTqPtyJz6lEs66QIBCMU/YdP38GOX3\necBvmg1A4lp50tWXkt20NB4nN+2ncW9uxD/rIoAKxbzBq/hs7r3Nuqcp8XiMII2wRHzba1mPfD+N\ne7kTn7qOcHdJoVh2cE0/7cuW2Sd5buvik7TZBEFpBJf7NFilcS93NlJ1UNKKugrFMkLmymX/PdmU\nI+uR76el/aRyj9+PvL+k53RvadxTi69QWDCttBfAhKXmVl0e42o+2YtPnk+u+klIDyyJxace5Vqg\no1h1UETeVkDDl+3mQbus1FxaIM/2GgCUy2UA6dybi6tfLpc1nae4ELCRnkBThmkFOFl5/KS/JQuf\nxr3ciT8YDMySvQrFRUGSoTuNAo/iDPI8eYxAFj+Ne7kTfzgcwvO8vC+jUCwc03i1shx3GvfeRnbb\nI4GIn8Y9tfgKxQxA83v+3Pa6zdXn5yTl7rngxyb+WTqLv7e3h3a7nfdlFIqFgZM+bY4PYMJSJw0A\nfF9uvJGHVP0Bx+m7NO7lTvydnR1sbGzkfRmFYuGQUX3b8bTgXlqAz2bl+QDAZbkU3Evj3lzSea7r\n5n0ZhWIpkER+/nqStU9Kz8m5vFzZl5f0AscS3TTu5S6gD4JAc/iKlUdWcC7JxZfn8/eyBfakxZc9\nAanSD0jnXu7E39/fR6vVyvsyCsXCkRSsS0q/JUXvk95XWnxbI1BO/DTu5e7qd7tdNJvNvC+jUCwN\n0tJ6087t5XtlWXw+x6f9NO7lbvFv3LiB7e3tvC+jUCj+P2iwSONe7sQfDAYq4FEoFoA07uVK/KOj\nI/i+rwIeheIMmEYRKM/P4l6uc3xam7ter+d5maUDlV8GQWDWVqMeasBxN5dKpQLHceA4jnYoOiVo\nbTi5Jj193zY1HaW/qLttqVRCtVqdW3u4pIBf0rnA8co4to3m+Px9Dw8P8bGPfQw/8RM/YX3fXIkf\nBAGA59bwGgwGcF13qX/g4/EY+/v76PV6GAwGuHHjBrrdLjqdDoIgwHA4xGAwMI+dTge+76Pb7aLb\n7WI4HCIMQ7NC6UlA/dabzSZc1zWLLrRaLXieh3a7jVqtBsdxYq/X63Vsbm6iXq9jY2MD9Xr9XPQ+\niKII/X4fvu/j1q1b6PV66HQ6GA6H2N3dhe/78H0f/X4fw+HQbEEQoNPpmL/1fX9m90Ttruv1OhzH\nQbvdhuu6aDab2NjYgOd52NjYQLvdxubmJprNJra2tlCv19Fqtab6bRNJ805xl0ol/NIv/VLiQja5\n/kLon1Iul/Hyl78cwHMreNZqNVy+fBnNZhPtdtssLrC5uYn19XXUajW4rotarWb+GdTYkI9wHHxJ\n44ODAwRBAN/3EYYhoihCr9czJPV9H51OB7u7u7h58yYGgwH6/T46nU5sPfFKpYJWq4VWq4VqtWru\nvVqtolar4e6774bneWg2m4aw9FlKpRIcxzHtk/k985VWgyAwnsFwODT3Sfff6XQwGAzw7LPPot/v\nIwxD+L6P4XAI3/fR6/VM3TVha2sL6+vraDabaDQaWF9fh+d5qFQqaDabZkGHer2OSqViVnPhPd75\ncfk9UyOJIAgQhqG5FyJlr9fD/v6+Odbr9bC3t4fhcIhOp4O9vT3j/RBKpZIZ5ORvoNls4rbbbjPe\nEX0uGvgcxzGWW0a7yQLKjjn0/dNniaIIvu/HBiT+W7l16xZ838fOzg46nQ52dnZi33uxWESj0YgN\nDnSf9Xodnueh0Wig1WqZz1Gr1czvmfrs86W06H7pPum7Jg8nDEN0u11jbLrdLvb29rC7u4tut4t+\nv4/HHnsMW1tbE9wsjHNc6WI0GuH69evY2trC97//ffT7fQwGA/i+j+vXrxtrSh9od3cX+/v75pzB\nYHCmNffW1tbMF0rEpMd2u4319XUzYtOovb29jWazCc/z0Gq1Tjy/mjfG47GxjPQPv379Ovb29own\nsre3ZwaYfr9v9geDAaIoQhRFZkpyGpTLZbMWXKvVQq1WM4ON53mo1+vmeaPRwMbGBlzXNUS5dOkS\nHMdZ+u9aIgxD3LhxA4PBADs7O+j1eub/0Ol0zCBIv+der4dut2u+f/KIT4pisWgG6nq9Dtd1zf7G\nxgY2NzfNgPOWt7zFmtLLlfizwHg8RhiGZlTmq5bwwgiaL5HFcl0XlUrl3P2YFgmyfqPRyAwGNE/m\nc036nqvVamxxRsXJwFtwkWdq+13zOITrujOJRSw98RUKxeyxvJE2hUKRG5T4CsUFxNwnZ77v45//\n+Z/RaDTwqle9auXm4N/61rdMkKzdbuPFL37xgu9odvja176GX/zFXzTPn332WXzzm9/EPffcgxe9\n6EULvLOz4+joCF//+tfxqle9CgDQ7/fxn//5n+b1O++8c6Wk53O1+AcHB7j//vvxf//3f/jCF76A\nP/mTP5nn5XNHFEV46KGH8NWvfhVf/epX8e1vf3vRtzQzfPnLX8YDDzxgnv/P//wPfvd3fxe+7+M9\n73kPvva1ry3w7s6Gg4MDfOhDH8LHP/5xc+zrX/86/vRP/9T8L5955pkF3uHsMVeL/2//9m+4cuUK\nfvu3fxsHBwf4lV/5Ffz+7//+ytTrX7t2Da94xSvw3ve+d9G3MlP8xV/8BZ588slYWuhv//Zv8Ru/\n8Rt405vehJe85CX46Ec/GvMGzhMeeOABPO95z4sd++53v4vf/M3fxL333rugu8oXc7X4165dw913\n3w3gOcHG9vb2So2k3/nOd3Dt2jX8+q//Ot761rfi8ccfX/QtzQRve9vb8Gd/9mexAfratWv4sR/7\nMQDAXXfdhSeffHJRt3dmXL16Fffff3/s2He+8x185jOfwZvf/GY8+OCD6PV6C7q7fDBX4h8eHsJx\nHPPccZwJBdd5xgtf+EI88sgj+NSnPoVHHnkEDz/88KJvaSaw9W07PDw0A0G1Wj2T0GrRsH2+X/7l\nX8aHP/xhfOYzn8ELXvACPPbYYwu4s/wwV+JfunQJ+/v75vne3t5KNeK866678LM/+7MAgJe97GXY\n2dkx65+tGra2ttDpdAA81+llfX19wXc0O4zHY7zmNa/BlStXUCgU8JrXvAZPPfXUom9rppgr8X/+\n538e//Iv/4IwDPHUU09hPB5bdcTnFZ/4xCfwV3/1VwCAb37zm7j77rvnVvE1b7z61a/GV77yFQDA\n3//935to+CqgUCjgHe94B773ve9hPB7jH//xH82AviqYa3Bve3sbb3vb2/DOd74TAPBHf/RH87x8\n7njXu96FRx99FPfffz88z8PVq1cXfUszBc3pAeB1r3sdvv3tb+Ptb3872u02PvShDy3wzs6OSqWC\nO+64wzy/evUq/viP/xiFQgEvetGL8Pa3v32Bdzd7qGRXobiAUOWeQnEBocRXKC4glPgKxQWEEl+h\nuIBQ4isUFxBKfIXiAkKJr1BcQCjxFYoLiP8HEjE6siw/aJsAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "sns.set_style('white')\n", "#Generate a random tridiagonal matrix\n", "\n", "n = 20\n", "d = np.random.randn(n)\n", "sub_diag = np.random.randn(n-1)\n", "\n", "mat = np.diag(d) + np.diag(sub_diag, -1) + np.diag(sub_diag, 1)\n", "mat1 = np.abs(mat)\n", "mat1 = mat1/np.max(mat1.flatten())\n", "plt.spy(mat)\n", "q, r = np.linalg.qr(mat)\n", "plt.figure()\n", "b = r.dot(q)\n", "plt.imshow(np.abs(b))\n", "#plt.figure()\n", "#plt.imshow(np.abs(r.dot(q)))\n", "q[0, :]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Tridiagonal form\n", "In the tridiagonal form, you do not have to compute the **Q** matrix: you only have to compute the **triadiagonal part**\n", "\n", "In the \"eigenvalues only\" mode the computation takes $\\mathcal{O}(n)$ for one step.\n", "\n", "This is called **implicit QR-step**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Theorem on implicit-QR iteration\n", "\n", "\n", "All the implicit QR-algorithms are based on the following theorem: \n", "\n", "Let $$Q^* A Q = H$$ be a irreducible upper Hessenberg matrix.\n", "\n", "Then, the first column of the matrix $Q$ defines all of its other columns. \n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Convergence of the QR-algorithm\n", "\n", "The convergence of the QR-algorithm is a very **delicate issue** (see Tyrtyshnikov, Brief introduction to numerical analysis for details). \n", "\n", "Summary, if \n", "\n", "$$A = X \\Lambda X^{-1},$$\n", "\n", "and $$\\Lambda = \\begin{bmatrix} \\Lambda_1 & 0 \\\\ \n", "0 & \\Lambda_2 \\end{bmatrix},$$\n", "\n", "and there is a **gap** between the eigenvalues of $\\Lambda_1$ and $\\Lambda_2$, then the $21$ block in the QR-iteration goes to zero with $q = \\frac{\\lambda_m}{\\lambda_{m+1}}$.\n", "}\n", "So we need to increase the gap! The answer is given by the **shifted QR-algorithm**." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## QR-algorithm with shifts\n", "\n", "$$A_{k} - s_k I = Q_k R_k, \\quad A_{k+1} = R_k Q_k + s_k I$$\n", "\n", "There are several ways to select the shifts.\n", "\n", "We have **converged part** and not **converged part**: select $s_k = a_k$ (last non-converged diagonal element).\n", "\n", "The **Wilkinson shift** is to select the eigenvalue of a $2 \\times 2$ matrix. It is more robust, but there are examples of failure." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Why we select such a shift?\n", "\n", "To answer this question, we have to go back to the power method. \n", "\n", "Remember the power method for the computation of the eigenvalues.\n", "\n", "$$x_{k+1} := A x_k.$$\n", "\n", "It converges to the largest eigenvalue in modulus. \n", "\n", "The convergence can be arbitrary slow.\n", "\n", "However, if we shift the matrix as \n", "\n", "$$ A := A - \\lambda I,$$\n", "\n", "the corresponding eigenvalue becomes small (but we need large)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Inverse iteration and Rayleigh quotient iteration\n", "\n", "To make a small eigenvalue large, we need to **invert the matrix**, and that gives us **inverse iteration**\n", "\n", "$$x_{k+1} = (A - \\lambda I)^{-1} x_k,$$\n", "\n", "And the **Rayleigh quotient iteration** is given by the selection of the **adaptive shift**:\n", "\n", "$$\\lambda = \\frac{(Ax_k, x_k)}{(x_k, x_k)}$$\n", "\n", "In the symmetric case $A = A^*$ the convergence is **cubic**." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Singular values and eigenvalues (1)\n", "\n", "Now let us talk about singular values and eigenvalues. \n", "\n", "SVD: $$A = U \\Lambda V^*$$\n", "\n", "exists for any matrix.\n", "\n", "It can be also viewed as a reduction of a given matrix to the diagonal form by means of \n", "\n", "two-sided unitary transformations:\n", "\n", "$$\\Lambda = U^* A V.$$\n", "\n", "By Householder we can reduce to the **bidiagonal form**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Singular values and eigenvalues (2)\n", "\n", "Implicit QR-algorithm (with shifts) gives the way of computing the eigenvalues (and Schur form).\n", "\n", "The problem of the computation of the SVD can be reduced to the **symmetric eigenvalue problem** in two ways:\n", "\n", "0. Reduce to the bidiagonal form\n", "1. Work with the tridiagonal matrix $$T = B^* B$$ \n", "2. Work with the extended matrix $$T = \\begin{bmatrix} 0 & B \\\\ B^{\\top} & 0 \\end{bmatrix}$$\n", "\n", "\n", "The case 1. is ok if you **do not form T directly**!\n", "\n", "Thus, the problem of computing singular values can be reduced to the problem of the computation of the eigenvalues of symmetric tridiagonal matrix." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Algorithms for the SEV \n", "\n", "1. QR-algorithm: the \"gold standard\" of the eigenvalue computations\n", "2. RQI-iteration: Rayleigh quotient iteration is implicitly performed at each step of the QR-algorithm\n", "3. Divide-and-conquer: the fastest (?) nowdays\n", "4. Bisection method\n", "5. Jacobi method" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Divide-and-conquer\n", "\n", "Suppose we have a tridiagonal matrix, and we split it into two blocks:\n", "\n", "\n", "$$T = \\begin{bmatrix} T'_1 & B \\\\ B^{\\top} & T'_2 \\end{bmatrix}$$\n", "\n", "We can write the matrix $T$ as\n", "\n", "$$T = \\begin{bmatrix} T_1 & 0 \\\\ 0 & T_2 \\end{bmatrix} + b_m v v^{\\top}$$\n", "\n", "Suppose we have decomposed $T_1$ and $T_2$ already:\n", "\n", "$$T_1 = Q_1 \\Lambda_1 Q^*_1, \\quad T_2 = Q_2 \\Lambda_2 Q^*_2$$\n", "\n", "Then,\n", "\n", "$$\\begin{bmatrix} Q^*_1 & 0 \\\\ 0 & Q^*_2 \\end{bmatrix} T\\begin{bmatrix} Q^*_1 & 0 \\\\ 0 & Q^*_2 \\end{bmatrix} = D + \\rho u u^{*},$$\n", "\n", "I.e. we have reduced the problem to the problem of the computation of the eigenvalues of \n", "\n", "\n", " Diagonal plus low-rank matrix \n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Diagonal-plus-low-rank matrix\n", "\n", "Is it easy to compute the eigenvalues of the matrix\n", "\n", "$$D + \\rho u u^* $$\n", "\n", "The characteristic polynomial has the form\n", "\n", "$$\\det(D + \\rho uu^* - \\lambda I) = \\det(D - \\lambda I)\\det(I + \\rho (D - \\lambda I)^{-1} uu^*) = 0.$$\n", "\n", "Then (prove!!) \n", "\n", "$$\\det(I + v u^*) = ?$$\n", "\n", "\n", "$$\\det(I + \\rho (D - \\lambda I)^{-1} uu^*) = 1 + \\rho \\sum_{i=1}^n \\frac{|u_i|^2}{d_i - \\lambda} = 0$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Characteristic equation\n", "\n", "$$1 + \\rho \\sum_{i=1}^n \\frac{|u_i|^2}{d_i - \\lambda} = 0$$\n", "\n", "How to find the roots?" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEhCAYAAAAqDTTQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXecFPX9/1+7t3e7t3t7lTuqSBMQQWkiRSMoUgwgaETU\nJPZGTFTUWL5R4y9qLGhijMaHYNSoiA3FhiKKlS4gIL1egeu3ffe2ze+Pe7znZtvVmbv5fO7zfDx8\nJNzO7c3szH5en3c3SJIkQSAQCAQCnWHs7BMQCAQCgSAZQqAEAoFAoEuEQAkEAoFAlwiBEggEAoEu\nEQIlEAgEAl0iBEqgS9544w0sXLhQ/m/RokV47bXXEAwGAQBPP/00du3a1ez77Nixo9V/e926dZg/\nfz7+9Kc/pXw/n8+HhQsXtvq94/n3v/+NOXPm4K233mr3eykJBoPYu3cvAGDTpk34+9//rur7CwQd\ngamzT0AgSMaePXtgMBgwZ84cSJIEr9eLl19+GUePHsVDDz2ELVu2YOzYsU2+xy+//IJ77rkHq1at\natXffu6553D++edj9uzZCed0991344svvkAkEsFXX33V6utSUltbixdeeAHLli3DySef3K73imfJ\nkiXweDwYOnQo7HY7hg4dqur7CwQdgRAogW4ZMGAApk+fLv+7oKAA999/Px566KGY46LRKH744QcU\nFxdjyJAhOPPMMwE0WEIejwfffPMNJk+enPD+hw4dwsaNG5Gbm4spU6YgMzMTmzdvRkVFBcLhMOrr\n62OOX79+PbxeL9auXSuLY3V1NdauXYv09HRMnz4dmZmZABosrG+++QZutxsTJ07ESSedFPNeoVAI\nn3/+OcxmMyoqKtCvXz988cUX8vUGg0F88803mDZtGsrKyuB0OpGWlob169dj0KBBmDRpEgwGAwDg\n8OHDWLduHex2O6ZNmwav14v9+/ejvr4eu3btQn5+Pvr27Sv/7SNHjmDDhg2w2+2YMmUKbDYbotEo\n1q5di3HjxuHTTz9Feno6ZsyYAZvN1pZbJxCognDxCZihrKwM3bp1i/mZJEm4+eabsWTJEvh8Pvz9\n73/Ho48+CgAoKSlBMBjEoUOHEt7r/fffx7XXXgun04nvvvsOF198MVwuF0pLS1FfX4/S0lLU1tbG\n/E5xcTFCoVDM+912222oqKjAu+++i9tuuw0A4HQ6cckll2DDhg2oqanBVVddhfXr1yec95EjRxCJ\nRLB//364XC7cfvvt8uterxd33HEHAGDz5s249dZb8cwzz8DtduPee+/F22+/DQBYs2YNfv/738Pp\ndGLDhg1YsGABnE4namtr4XA4UFFRgS1btuCll14CAHzyySf4/e9/j9raWmzYsAFz585FbW0tIpEI\n7rjjDtx4442oqqrCypUrcfPNN7fpPgkEqiEJBDrk/vvvl2bPni393//9n3T//fdLN9xwgzR8+HBp\n9erVkiRJ0oIFC6RvvvlG+umnn6QpU6ZIwWBQkiRJcrlc0tixY6VDhw5JP//8szRjxoyE945EItLk\nyZOlzZs3yz+7/fbbpX//+9+SJEnSRRddJG3atCnh93bu3ClNmzZN/juDBw+WDh48KEmSJJWVlUnD\nhg2TotGo9Oyzz0r33nuv/Htr166VfvOb3yS8X0lJiTRu3DhJkiTJ4XBIQ4cOlV+rra2Vhg0bJkmS\nJH3wwQfS1KlTpXA4LEmSJL366qvSH//4R0mSJGnWrFnyZxKNRqWnn35aKisrk/71r39Jjz/+uCRJ\nkrRy5UrpxhtvlKLRqDRt2jTp+++/l//OvffeKy1evFgKBoPS4MGDpe3bt0uSJEnV1dXS4MGD5c9V\nIOgMhItPoFsKCwtx2mmnAQBycnLw2GOPJVhQO3bswOmnn4709HQAgN1uxymnnIIDBw6gZ8+eSd+3\nqqoK5eXlGDlypPyzMWPGYPPmza0+x/79+wMAcnNzEQ6HEY1GsW/fPuzYsQNz584F0OCuKysrgyRJ\nsluutQwYMABpaWkAgOzsbIRCIUiShEOHDuH0008HABgMBixatCjle7jdbhw9ehSjR4+WfzZmzBh8\n+eWX8r8HDhwIoOFzBIBwOCx/tgJBRyMESqBbhg0bhssvv7zJY3Jzc+H1emN+5na7YbFYUv5OTk4O\nJElCIBBAVlYWAMDj8TT5O6kwGhO95JmZmbjiiivw29/+FkDDIh8Oh5sVp2g0img0CqPRiEAgEPMa\niRMA+X0MBgPsdnvM9W/ZsiUh3kXYbDakp6fD6/XCarUCaLhus9ksH2MymWL+hkDQmYgYlIBpzjrr\nLGzfvh2//PILAOD777/H8ePHMWrUKJhMJni9Xjk1nbBYLJgwYQKWLl0KSZJQW1uLFStW4Nxzz23y\nb9H7xSdPxDN58mR89NFHCIVCyMrKwptvvhkTX0qG1WqF2WzGjh07IEkSPvzwwxZcPfCrX/0Ky5cv\nhyRJqK6uxu233w6Px4O0tDQ4nU5EIhH52LS0NJxzzjl4+eWXIUkSHA4H3nvvvWavWyDoLIRACXSJ\n3W5vMoMsNzcXGRkZ6NmzJ5588kncddddOO+88/DEE0/ghRdeQHZ2Nvr164f8/HxMmjQpZqEGgMce\neww7d+7E+eefj7lz5+Kiiy7CzJkzAQD5+flJ3Vonn3wyCgsLMWnSJESjURQWFsqvGQwG+d+//vWv\nMWvWLFxyySU4//zzsW7dOjz++OMJ75eWlia7LNPT03H33XfjxhtvxPnnnw8A6NOnDwDAbDYjJydH\n/j3lv++77z6UlJRg6tSpmD9/Pm677TYMHDgQEyZMwNq1a3HXXXfBYrHIxz/88MM4evSonEZ//vnn\nY968eQAQcz30b2FJCToTgyS1fNxGOBzG0qVLsXnzZgwcOBB33nlnjHtAIOhMIpFIjCuspb9jNBo1\nW4hbe07RaBSSJGl+HVpft0CgBq2yoJYuXQq/348lS5bAZDLh9ddf1+q8BIJW09pFnX5Hy0W6tedk\nNBo75Dq0vm6BQA1aZUEtWLAAL774IoqLi9GnTx/k5OS06cskEAgEAkFztEqgJk2ahNNOOw29e/fG\n+vXr8cwzz2DYsGFanh9TSJKESCSCQCCAUCiEUCiEaDSKcDgMoCFOkZaWhoyMDFgsFlgslqRZYILm\niUajCAaDCIfDiEQi8n/0eSsfa7IU0tLSYDQakZ6ejrS0NJhMJpjNZrHJSoEkSQiHwwgEAggGg/Lz\nLElSzOdrMplgMBjkzzY9PR0mkwnp6eni+W4D0WhUXj/q6+vl8gVJkhCNRuXjaD0xGAwwmUzIyMhA\nZmamnInJA60SqLFjx+Ktt97CKaecgq+++gqrVq3C4sWLY44Jh8M4ceIEevToAZfLBYvFgszMTF0/\nqJTR5Ha74fV6UVlZCZfLBafTiUAgAL/fD6/XK/+v0+mEz+eDy+WCy+WC3+9HfX096uvr0YqPE0DD\nomk2m5GdnY3MzExYrVZkZmYiJycHVqsVubm5sNls8udIr2dlZaGgoABZWVnIz89HVlYWEw9mMBiE\nx+OBz+dDdXU13G43nE4n/H4/amtr4fP54PP54PF44Pf75f8CgQCcTqf8uz6fT7VzysjIgNlsRlZW\nFiwWC3Jzc5GZmYns7Gzk5+fDarUiPz8fubm5KCgoQHZ2NgoLC5GVlYWcnBxdP9t+vx91dXWoq6uD\n1+uF1+tFRUUFqqur4fF44PV64XK54PF44HA44HA45M+faq3ag8FggNlshsVigd1uR15envw522w2\n5OXlwWazyc91Xl4ecnJy5M+Xnn/W3JFUxuBwOFBbW4vq6mo4nU7U1dWhpqZG/vyrqqrgdrtRX18P\nn88n///2QGuFzWaTk43y8vJgt9thNpuRmZkJu92OwsJCZGdnIzs7G3l5eejevbsqz7NSA9pbQ9eq\nFe2kk05CdnY2gIZMJ7/fn3BMZWUlpk6dijVr1mDGjBmy9WC1WmGz2VBUVITs7Gzk5ubCYrHAbDaj\noKBAflDpg6VFg3YGJpMJaWlpCbtdqh2hWpNAIACfz4f6+noEg0G43W5ZTHw+n9wGpqqqCl6vFx6P\nB06nMyYVOSMjAzk5OcjJyYHZbJbP3Ww2w2azYdCgQbBarfLNzczMlK/FZDLBYrHIO0nlOZOFFQqF\nEAgEZEvL7/fL50nn73Q64fV6ceLECXg8HvkB9vv9KR/kwsJC5OXlITs7W14MrFYrMjIykJ2dLS8U\nWVlZyMjIQEZGBtLT02E2m+VzVf48/nOORCLyZ1xfXy+fC4mH2+2WF7hAIAC32426ujr4/X75y0nP\ng/wAmkyyGMc/A9nZ2ejRo4dsbdJ1kUBbLBbZEqLYDf1nMBhgMBjkBZZ2n/T507UEg0H4fL4Y4VQ+\nK9XV1fD5fKipqYHT6URNTU3M556Wlga73R4jYnSeWVlZsFqtsNvtyMnJka/DZrPJz7PZbEZGRkZC\nTEiSJPk86bMmi7G+vh4ul0veFLlcLtTV1aGqqgqVlZXyc+31ehOE3GKxoLCwUF6crFYrcnJyZJc9\n3QP6DtL3kJ4Jo9EoL2D0+ZL1SuccCoVky5b+TeJYW1sLj8eDQCAAr9eLkpIS+TxpQXc4HDHPicFg\niBEwesbpM6fvJ4lgVlYWMjMzE55vek6U5678XirXErIY6Vmn9YS+e7TG0KaVnh23243y8nLU1dXF\niHt6ejpyc3PlTU63bt2Qn5+PwYMHIzs7GxaLRX5WyAoymUzIzMyULX9KaqFzVz7T0Wg0Zo2gz9vj\n8cDj8aC2tlb+/Gm9qayshNvthtvtls/VaDTCbrfDbrcjOztb3iTk5OQgMzMTubm5sNvt8nqXlZUl\n/zs9PR1Dhw6N0YD2ilSrLKgPP/wQX331FX7729/iP//5D6688kpccMEFMceUl5fj3HPPxeeff45I\nJAK/3x/zZamoqJCtE7rB1DeMjvF6vQiFQm2+KKPRKH+pSEDof3Nzc5GXlyfv0GgX3L1795gvrN53\nbJIkyTvd2tpauFwuVFRUoK6uTrbs6urqZCGkRYEWhmAwKH8J2/pZp6enw2q1ymnMtFOzWq2wWq3I\nysqS/22325Gfny/v3qxWK7p16waLxaLJZ/3BBx/g4osvxqxZs9CtWze8/vrrWLp0Ka6++up2v3d9\nfb0sBDU1NXC73fJ9cDqdsljT8+x2u+FyueTPP74It6WkpaXJCy4twvT/8/Pz0a1bNxQVFcnPtc1m\nkzd/tJDr3Z1ZWloqL85+vx8OhyNm/XA4HKirq5M/X7K6qT6NrEG/399u6w+AvEE2m83yBi87O1ve\nsNKGgxZpu92OHj16oKCgQF5LyNOh1zUlGo3C6XSivLwcDodDfn7pP4fDAZfLBa/XK6/TynVFuQna\nuXMnamtrZQ1IT0+XyyXaQqssqLlz56JHjx746aefcNNNN2HChAkJx5BahkIhDB48uM0nJkmS7H+l\nnSPtFujBo92EMq5AOye9PgxqYTAY5J1u9+7d2/Qe+/fvh8lkQp8+fWTrxmw2y9aFsjUP7eBogSRr\nUa+cOHECANCzZ08Eg8GY56a9mM3mlN0aWgJ9vmQNxZ8fPdfKOBntpIGGVk1bt24F0DCyIzMzU26r\nxDr33HMPli1bhgcffBBPP/00Ro4ciR9++KHV70Pxs1AoJG/GyNKIj08qYzlkgdPz3RXaPBmNRtky\nbQtkiITD4ZjPLBQKtet7ArSh1dH48eMxfvz4lK9nZGQAQEL1fmsxGAxtaj0jaDlnnXUWHA4Hampq\ncMUVV+Drr7/G6tWrE6xiFikrKwMA9O7dG0eOHOnks4lFuQi2ZZzFK6+8gnvuuQdnnHEGfv75Z5x3\n3nncCBRZ89S1o6Kiok3vYzAYZDc7tXUSaENaWprcMgyI1YD2bmJVj+6SqLQ30CfQHuViQLvz+I4L\nrEKjMpTNZdWyoDqburo6AJB3vDx5CyhLTc+JJ4KmUVMDVH8KKOW0vRaUQHtIoCgYDrTf8tULlZWV\nABoSR2ixU6bosgwJVH5+PgB+rguAnBxBzyMvG6auhJoaoLpAkWnNy0LHK5RxBUCOKwH8WL4Ug+rV\nqxd31qHT6QTQ0I8Q4EugyMql51GsI+yhpgZoYkdnZWUljEAQ6Auq2aIUZxpV3tYMM71BsYvu3btz\nZ0E5HA4Aje5LXoQXaBQochMJgWITtTRAE4GyWq1CoHQO1bCRMFF9G+3OWYdiUPn5+XKgNr4Gi1Xc\nbjeAxhgUL9elhASKlw1TV0MtDdBEoHJzc2U/uUCfkEDRQkATVGnxYxlJkuByuQA0CC9v8TW6R2RB\n8eKWBRqfR9pUeL1ebpJbuhJqaYBmAsXLTpxXaFGjBYGnGJTH40E0GoXVakV6ejp3u3Fy8dFI+2Qd\nXViFamgkSYLJZJJ7LgrYQi0N0CwGxcNOnGeURaEAX+UB5Fqg2gxyY/KykHs8HgCNFhQvwgs0Zu/V\n19fLNWIiXMAeammAJgKVnZ0tBErnxCcOkIuPducsQ61XqECT/pc3gSoqKgLAl0BRLNTtdnPldu5q\nqKUBmgiUzWZTtdu0QH3iLSgKuFPshmVSCRQPO3Fq3ZOWliaPaOfJnU4uvmAwyF1maVdCLQ3QzMXH\nw0LHM/G1QTzFaega6Jp4ujYSWerDaDQa5T5oPKC07HNycgBAJFwxiFoaoIlAdevWDVVVVVq8tUAl\n4jPbyJ3Cw8aC4miU+MFTAgi5Tag7NlkZvHgslDEosup5shC7CmppgCYC1b17dyFQOod23JTOS+4i\nHu4biS4tdjylmSstKIAv8QViXc+U5EIxNwE7qKUBmsWgAoEAVxXuvBEfg6KRHeXl5Z12TmoRL1C0\n0PFgHVKiB8XVeMq+VGIwGESSBMOopQGaCRTAj9uBR5IJlNFoREVFBfOLHX0pyDqkbDcerMN4gaI4\nDQ/Zl0CsRUgbCyFQ7KGWBmgiUOQ7pnYzAv1jMplQUFAAgP37RgJFAXeeYhnxCSDkmqXu7ayjHHZH\nKec8WL5dDbU0QFOBEtk3+iVZA1XajbO+Y42/NrI2eLDoybol9yWN3ODFghIxKD5QSwM0EajMzExY\nrVbU1NRo8fYCFYh38QH89OOjGBS5i2gsRW1tLfMdzePja+RK4W0RNxgMMUW7ArZQSwM0G1tps9m4\nKIzklWQWFO16qqurO+Wc1CLeyrBYLMjNzUU4HGbeqlfO8AL4sg6Bxg1TNBqVWzm1dey7oHNRQwM0\nE6isrCzudnU8kSz1mjL5WE8miF/EgUZXGOtWfbwFxVuShLKTBDXDpeGTArZQQwM0taCEQOkX2nFT\noSfQ2HyUdQsqGeTmYz3gHi9QlKHIi5VBlr0kSdzcs66KGhqgmUAVFRVxk1nEI8liUGRlsO4GSzbi\nnZeUZbomukaekyREFh/bqKEBmglUYWEhlztxXqDYEy10AD/xjGQuPkqhZ/2ZjI8d8txQlSx61l3O\nXRU1NEAzgcrLy2O+noZnksWgaDfO+iIeX6gL8GNpxPcZ5CXzkqB7FgqFYLfbYbFY4PP5RMIVg6ih\nAZoJVHZ2tohB6Rjqxae0oHgJSpOVoXTx8dIZO9465KnJL9AoUJFIBAaDQb5vPBRZdzXU0ADNBMps\nNjPfModnSKCSZbqxvojTIqccQdGjRw8A7ItvfJNf3opZKSZKsSjerq8roYYGaCpQvEww5ZH4bDCg\ncTfO42JALYFYdzun6iTBevo8Ed+dnWKHIuGKPdTQAOHi66LwnOmWLEORl7lJ5OIjgVK6ZVnvkgE0\njnwnlx4vG4uuiHDxCdoNLeYAuEnrVTYcJXhxFZEIUZwtMzMT2dnZCIVCXMRpqPaJroWXzNKuiK5d\nfCaTKWaBEOiLZC4+Ze8zlnfjyqmsBC18rMfX6L4orUNKJGB9YwEk9hbkbSBjV0INDdBMoDIyMhCJ\nRMTQQp2irNgnTCYTsrKyEI1GmXbz0a5b6f/mpVM7uSp5FF+gUZBoA0VjRXis8+IdNTRAM4GiL5JI\nlNAn8XOFCB7qapK5+Hh5Hkl8lXVBFKfhpd2REp4Td3hHje9cmwTqvffew7vvvtvkMcI01zfkDqIF\ngODB558sSYKXGFSy8RqUycdDDCpVGj3LG6auihoa0GqBOnToEBYvXozy8vImj6MsMWUtikA/kEBR\n3IngwaVC4kpiC8RO+GQ5vpYskYWnRTw+Nio2uuyihga0SqCCwSAeffRRXH311c0eS24WEYPSJ6lc\nfMmKXFkjvh0Q0LDg2Ww2RCIRptvmxMdoAL5qoei5pOuk51MIFHuooQGtEqjnnnsOl112mezzbor4\ninCBvkiWxaf8t3IBZBWliw/gI40+WZPf+NRsluG9lVNXQg0NaLFAbdmyBXv27MGpp56KmpoaOJ3O\nFn0hhEDpk1QWVLIEA1aJf/Z4SACJr4MC+HKDxQswD/esq9MeDTA1f0gDNTU1sFqtWLx4MUpLSxEI\nBDB+/HhMnTq1zX9c0Hkki9MAyTtMsAZ9IZSLOMBHAgjdH+UGgqdNRbyLj5fsS0HbaLFATZ8+HdOn\nTwcAvP/++zh+/HiT4pQsk0qgH1IlSfBwv5IVswKN1iLLi10ya4knCyq+/okSQFiOG3ZV1NCAFguU\nktGjR+PUU09t8pj4yZ8CfUG9zSi7jSdSWYc8xNeSfdl5yLwkyAqkdYOHTUVXRQ0NaJNA9e/fv9lj\nUgXhBfqAygS6d+8e83MeLF/abccLFA8uvmTTgnly8ZEQkWuPJ/HtaqihAZp1kkiW6ivQD9R1gOYk\nETwktVARK7mHCCpyZVmgkiVJ8GAZEiREJFA8XVtXQw0N0Eygko3dFugHmq8TXzIQX8nPIjSyvlu3\nbjE/52GxSyZQPNSuEfEWFA9JO10VNTRAM4HiYaHjmbKyMgBA7969Y37Og2s2lUAlGwXPGsm+Vzwt\n4vECxZP4djXU0ADNBMrr9cJisYgkCR3i8XjgcDhgNpsTFnEeBIo6KtA0VoKHhZzujzIGxcN1EfFu\noWRd9wVsoIYGaCZQgUAgoQhUoA+OHDkCADj55JMTkiF4sHypqJPHFHqKr1E8DeDLykiV4CJgDzU0\nQAhUF2Tfvn0AgCFDhiS8xoMFRQIVnyTBA2QdKi1fsjJYboJLUPkD9RdMVdMm0D+6Fiin05mwgxXo\ng7179wIAhg4dmvBaqhZILEGD++JrvHhwE1F7Meq/B/DlBqP4IblneSh76KqooQGaCZTb7U6YNSTQ\nB3v27AGQ3ILioTzA4XAAiF3EgeQZcKyRao4XL5BAUXapKPhnFzU0QLNvqs/nE35knbJ7924ASNoN\nhHUXXyAQgMPhgMlkShAoHhY7EigaYQ/w5Qaj+ryioiIAfGwquipqaIBmd93j8cQEcgX6IBAIYPfu\n3TAYDBg+fHjC6yRQrFpQlD7fs2fPBCHiSaCUO1MeEluAhvsTX0AuBIpd1NAA4eLrYmzbtg3BYBDD\nhg1L8A9LksS8i6+0tBQAcNJJJyW8xoNAkftSGV/jRaBqamoQiUSQl5cnW/C8XFtXRNcuPpfLFeOG\nEOiDDRs2AAAmTJiQ8BoVSZrNZmZ3rKkKkAH23ZdAY5KEcnPBg/ACjfeuV69e8s9Y3zB1ZdTQAM1W\nIYfDIQRKh2zcuBEAcNZZZyW8Rrtzlu9bSUkJgOQWVLJGq6xRVVUFIDbNnJdF/Pjx4wBiNxc8bCq6\nKmpogGYCVVtbK9cyCPSBJEn4/vvvASS3oKg/X3x3CZZoyoJi3V0UjUble6TsQk/FrazHfIUFxRdq\naICmWXw8FkqyzN69e3H8+HF0794dw4YNS3idikApg4pF9u/fDwAYNGhQwmusW1CVlZWIRCIoKCiI\nsSh4WcQPHDgAABg4cKD8s1SzvQT6Rw0N0ESgotGoSJLQIV9++SUA4Pzzz0+akpxqTAVLNNUlg3WB\nogSQPn36xPyc9esiDh48CAAYPHiw/DMhUGyilgZoIlBOp1Pe6Qn0w+rVqwEAF1xwQdLXWXcVBQIB\nHDt2DGlpaRgwYEDC67TYsXp9qeJrPGwsgEaBEhYU+6ilAZoIVLKGloLOpb6+Ht988w0AYNq0aUmP\niW8zwxqHDh2CJEno169fUmuC+rzFF/CywrFjxwAAffv2jfk51Uax3FosGo3i0KFDAGLds/HjNwRs\noJYGaCJQlGnEciyDN1atWgWv14uRI0fGBKGVUA87VgVq165dAJJ3yAAaU7Tje/SxAlkY8dYhWb4s\nW1DHjx+H3+9Ht27dYjK/kqXVC/SPWhqgiUC5XC6YzWbmg7Y88eabbwIArrjiipTHsN4F/KeffgIA\njB49OuG1UCgEl8sFg8HAbGw0VZNfHiyoHTt2AEBCdxPKWhSbXbZQSwM0Eaiamhpmd+E84nK58Mkn\nn8BgMGDBggUpj2M9BkUCNWbMmITX6urqIEkS8vLymE0zT5UAQhsLVoUXaMy+jBffZN3bBfpHLQ3Q\nRKBEka6+WL58OQKBAM4555ykBawELQYs3jtJkpoVKIBd957L5UJpaSnMZjP69+8f8xoPbrBt27YB\nAE4//fSYn/OSANLVUEsDNBGo2tpaYUHphGg0imeeeQYAcNNNNzV5LCVJsFio+8svv8DpdKJ3795J\ni3RTjYFnBWV8Lb6lUbIO56xBLbjOPPPMmJ/zcG1dEbU0QBOBEqM29MOXX36Jffv24aSTTsL8+fOb\nPJY6SdMsHpZYu3YtAGDKlClJX4+f1MoaW7duBQCMHDky4TXWXbNVVVXYv38/rFYrzjjjjJjXhAXF\nJmppgGYWFKuuFJ6QJAmPPfYYAOCWW25pNvZCiziLFtRXX30FgF+B2rx5M4BECwNgv1boxx9/BACM\nGzcuoTyA9WvrqqilAZpl8QmTvPP55JNP8N1336GgoAALFy5s9niK07AWkA6FQvj6668BAFOnTk16\nDLmKWLs2ggRq7NixCa/RfWP1O0fuvUmTJiW8Rm5nseFlC7U0QBOB8vv9YsfTydTX1+Puu+8GADzw\nwAPNPizhcBherxdGo5G5YPvGjRvhdrsxZMiQhCJWguVF3OFwYO/evcjIyEhwgfl8Png8HpjNZiav\nDWgUqHHjxsX8XJKkpM1xBfpHLQ3QLIuPtUWONx599FHs27cPQ4YMwS233NLs8coaKNZGh69YsQIA\nMHPmzJRqO4BTAAAgAElEQVTHsFw8/t1330GSJJx55pkJdSXkuiwoKGDuvgEN1i+NgJk4cWLMaz6f\nD5FIBJmZmaKmkjHU0gBNBCoQCAgLqhP58ccf8dhjj8FgMGDJkiUtmqXDaqBdkiS8//77AIDf/OY3\nKY+jLD4WY1DkvkwWXyPLkNUN4datWxEIBDB48OCE2KdomcYuammAZr34RNZN51BWVoZLLrkEkUgE\nixYtwjnnnNOi36MYDWvFnhs3bkRxcTF69eqVdMYVQRYiawu5JEn47LPPAADTp09PeJ312NqaNWsA\nJBdfVp9JgXoaoIlA1dfXiwmYnYDX68Wll16KiooKTJkyBY8//niLf5fVOqGXX34ZAHDZZZc1Oaae\nduOsLXb79+/HgQMHkJ+fj/Hjxye8TjEa1u4bQR32kzUwJrcsi2UPXR21NEB1gYpEIggGg8LF18HU\n19dj3rx5WL9+Pfr06YPly5e3qqUPuYpYcoFVV1fjjTfeANB8ETKrXTI++ugjAMCMGTOS3k+6bywu\n4j6fDxs3boTBYMDkyZMTXme9eXFXRU0NaFVTsoqKCjz99NOorKzEoEGDcOeddya0wafpnsKC6jhc\nLhcuvfRSfPnllygqKsKaNWtanQzAYkHkf/7zHwQCAcycOTPpgEIlrPare/fddwEAl1xySdLXHQ4H\nAPZcl0BD8kd9fT3Gjh2bdGPEaly0q6OmBrTKgvrb3/6GCy64AK+88gqysrJk94qScDgMAMw25GSN\nsrIynHvuuVi9ejUKCwuxevXqZhfrZNBCx4qF4fV68a9//QsAcNdddzV7PIsdv/ft24fNmzcjKysr\nZYYiCS8r903JF198ASD1AE0WN00CdTWgVQJ15ZVXYsqUKTAYDBg8eDDKy8sTjolEIgCQ0C9MoD5r\n1qzBqFGjsH37dpxyyilYv359Qp1MS2Et2P7888+juroaZ511VsruEUpYtKBee+01AMD8+fNTDuyj\n2CEr942QJAkffPABAGDWrFlJj2HxngnU1YBWCdSECRNgMplQW1uLF154IWlvt1AoBABJJ5oK1MHj\n8WDRokWYNm0aqqqqcP7552PdunUxo7JbC0stZSoqKvDoo48CAB5++OFm638kSWJuMmsgEMDSpUsB\nANdcc03K40igWKvv2rFjB44dO4aioqKkyR+AEChWUVMDWp0kUVJSgmuvvRZ33HFHQmt8oKF7NiAs\nKC2QJAkrVqzA8OHD8Y9//AMGgwF//etf8cUXX7S7fx4JFAsL+F133QWXy4WZM2cmTb2Ox+PxQJIk\nWK1WZp7LZcuWoaqqCqNGjUraAohgNfnjnXfeAQDMmzcvZfYla25nQQNqakCrnIQHDx7Ebbfdhkce\neQSjRo1KegyZd02l/ApaRyQSwcqVK/HYY4/JM49GjRqFpUuXJp0e2xbIwtC7BfXZZ5/hjTfegMVi\nkWNQzcFaj8FIJIInn3wSAHDHHXc0aSGyGKdpaXE19eETWXxsoaYGtFigJEnCokWLMHDgQGzYsAEb\nNmzAgAEDUu5gWWy7ojfKy8vx5ptv4oUXXsDhw4cBAD169MBf/vIX3HTTTaomorAw7r22thY33HAD\ngIaEnUGDBrX49wB2Fro333wT+/btQ79+/ZqcgAw0WlAsucF2796Nffv2IT8/H+eee27K48iCYqn0\nQdCIGhrQ4hUuHA7j2muvjflZsh2pJEntPqmuTE1NDVauXInly5fjq6++ks3lAQMG4Pbbb8d1112n\niZWj9xiNJEm4+eabcfz4cYwfPx633357i3+XpYJPn8+HBx54AEBDfK05Pz6LA/3efPNNAA3uvaau\nj8XMS4G6GtBigUpPT8fcuXNb/MbCgmoZoVAImzZtwqeffopVq1Zh+/bt8mvp6emYNWsWrrnmGsye\nPVvT+AnVLui1Keezzz6Ld999F1lZWXj99ddbZT2y1IfvwQcfRHFxMc444wxceeWVzR7PUnIL0LDR\nffXVVwEAV199dZPHijootulQC6q1CEsqOT6fD+vXr8e3336L77//Hps2bZIXGaBBIM455xzMnz8f\nl1xySYctqnquX3vttdewaNEiAA2tjVrq2iPo89X7Qrdx40Y888wzSEtLw5IlS1q0IWFNoD7++GOc\nOHECQ4YMaTL5A2i06i0WS0ecmkBl1NAA1VcjUk0hUA0cO3YMP/zwA9avX49169Zhx44dchCRGDJk\nCKZPn45f//rX+NWvftUpX0i9CtSnn36K6667DpIk4Yknnmh2bH0yAoEAAH0vdD6fD1dffTUkScJd\nd92VdHJuMvTumlUiSZKc/LFw4cJmd9hkQek5LipIRE0NUH01ogUufhHuClRWVuKnn37Cli1bsG3b\nNmzatAllZWUxxxiNRowaNQqTJ0/Gr371K0ycOFEXNSx6FKivv/5a7sx+//33489//nOb3kfv7kug\nIVtv7969OPXUU/HQQw+16HdCoRBCoRDS0tJ0fW3Ed999hw0bNiA/Px/XXXdds8ezmkLf1VFTA1Rf\njSi1kHeBKi8vx/bt27Fr1y5s27YNP/74I44dO5ZwXG5uLs4++2xMnDgREyZMwNixY3W5I6Tdjl7K\nA5YvX46rrroKwWAQN998Mx555JE2v5fe3WCvv/46XnrpJWRkZOCtt95qsTWknJek95ivJEmy8P7p\nT39qkbtV7/dNkBw1NUB1gSK/OS8C5fF4cPjwYezevRs///wzdu7ciZ9//hmlpaUJx9psNowePRpj\nx47F6NGjMWbMGAwZMkQ3iz4LSJKERx99VM5kW7hwIZ577rl2LcB6rhX64YcfZGvi2WefbVWrKpbc\ne59//jm+/fZb5OfntygDMxqNihgUo6ipAZoJFKVHs0I0GsWBAwewa9cu7N27F5s2bcKuXbvk+qN4\n7HY7Ro4cidNPPx0jRozAhAkTcNpppzHTqSAVnRk7DAQC+MMf/oD//ve/MBgMeOaZZ3Dbbbe12zrQ\nq4tv7969mDNnDkKhEG699VbcfPPNrfp9VrLcwuGw7J699957W+SyU3bEZv071dVQUwM0EyiKaeiN\naDSKY8eOYdeuXdixYweOHj2KPXv24JdffpELA5Wkp6dj4MCBGDx4ME4//XScccYZGDFiBE455RSu\nLKPOTm45cuQI5s+fjy1btsBiseCtt95qVVlDU+gxvlZSUoILL7wQdXV1mDNnDv7xj3+0+j1YcYH9\n4x//wK5du9C/f3/88Y9/bNHvBINBAGJsD4uoqQHcJUlIkoS6ujocO3YMxcXFKCkpwf79+3H06FHs\n378fx44dk7O64unZsydGjRqFoUOHYvTo0Rg5ciQGDx7cJRrfkth2huX75ptv4qabboLX60W/fv3w\n3nvvYcyYMaq9v9467B8/fhznnXcejhw5grFjx2LZsmVtEk8WFvHDhw/LsacXXnihxe46Fq5NkBxd\nJ0nQAxUIBLBt2zbZ/w807NLtdjtMJhMyMjIQCoUQjUaRmZkpu19ogQwGgwgGg/B6vfD5fPB4PHC7\n3XC73XA4HHA4HKirq0NtbS1qa2tRUVGBqqoqVFdXy910U9GjRw8MGzYMI0eOlK2jYcOGoWfPnroP\nNmtFZwiU3+/HbbfdhiVLlgAALr30Urz44ouq137pSaCOHz+OqVOn4uDBgxg1ahRWr17dZhed3hfx\nSCSCa6+9Fn6/H5dffjlmzJjR4t8VUxHYRakB7UWTLD6r1QqPx4M//vGP2LJli9p/olmys7PRt29f\n9O3bF3369MEpp5yC/v37y//LUt+yjqKjk1u2b9+OK664Anv27IHZbMazzz6LG2+8UZMNAoluZ7tk\nt2/fjtmzZ6O0tBTDhw/H6tWrkZeX1+b306PrUskjjzyCb7/9Ft27d8c///nPVv2unjYVgtah1ID2\nosmTbbVa4ff7MW7cuJjAtCRJcLlcCIfDCIVCMJlMSEtLg9/vl4OitIiYzWakp6fDZrPBarUiKysL\nWVlZsNvtyMnJQV5eHvLy8pCfn4/8/HwUFRWhsLAQhYWFIuunDdBOtTnrs71IkoQXX3wRd9xxB+rr\n6zFkyBAsX74cI0eO1Oxv6mGx+/DDD3HllVfC5/Ph7LPPxgcffNDuESl6uK5UfPzxx/KsrjfeeKPV\ntX56vjZB85AGtBdNBCorKwtutxvPP/+8Fm8v0ICOECifz4cbb7xRbhZ6ww034Nlnn9U8TZoSPzpj\nsYtEInjooYfkAYu/+93v8NJLL6myidJb7RqxdetWLFiwAJIk4W9/+xumTp3a6vcQAsU2pAHtRROB\nysnJkTsRC9iA3ERaZV8eOXIEl1xyCbZt2wabzYalS5c2O0pCbTo6Q7G6uhoLFizAV199BaPRiMce\newx//vOfVXdj6iluevDgQcyaNQs+nw+///3v8X//93/tej89XZug5ailAZoIlMViUSVAJug4tLSg\nVq5ciauvvhoOhwMDBgzAypUrMXz4cNX/TnN0pEDt3LkTF110EY4cOYKioiK89dZbOO+88zT5W3qp\nOTx8+DCmTJmCEydOYPLkyViyZEm7BUb09GQTtTRAE99AZmamECjGIDebGn5jQpIkPPjgg5g7dy4c\nDgdmz56NLVu2dLg4dXSN13vvvYfx48fLaeRbt27VRJy0tnpbw4EDBzBlyhSUlpbi7LPPxscff9yu\n7MLOrssTtA+1NEAzgVKOkBDoH7UFKhQK4frrr8ff/vY3pKWlYfHixVi5cmW7stbaSkdlKEqShIcf\nfhiXXnopfD4ffvvb3+K7775D7969Nfl7emkrtnbtWpx11lkoLi7GhAkT8Nlnn7W7rVRn1uUJ2o9a\nGqCJi08IFHtQNwI17lswGMSll16Kjz76CJmZmXj77bcxe/bsdr9vW+mIBBC/349rrrkGb7/9NoxG\nI5588kksWrRI0xgKZchSPVRn8Oqrr+KGG25AOBzGnDlz8Oabb6rS81Av4itoG2ppgCYWVFZWltwn\nTMAGaglUOBzG5Zdfjo8++gh5eXlYu3Ztp4oToL1AlZeXY/LkyXj77bdht9vx0Ucf4c4779Q8wE9W\nb2dsBiVJwiOPPIJrrrkG4XAYd955J1asWKFaQ14hUGyjlgZoWgclYAc1BEqSJFx//fVYsWIFcnJy\nsGbNGowePVqtU2wzWloae/fuxYwZM3Ds2DH069cPn3zyCU477TTV/04y6LqohrCjCIfDWLhwoZwE\n8dxzz+EPf/iDqn9DCBTb6LoOymq1CguKMajdTnsE6sknn8Rrr70Gm82GVatW6UKcgMZrU/uZ/Pnn\nn3HBBRegqqoK48aNw0cffYTu3bur+jeagmqpOjIhKRAIYMGCBVi5ciUsFguWLVuGefPmqf53Oqpw\nXKANammAJgKVn5+Puro6Ld5aoBHttaA+//xz3HfffQAamr9OmDBBtXNrL9nZ2QCgam3eli1bMG3a\nNNTV1WHGjBl4//33O7yrOLnT1Ggp0xJqa2sxb948fPfdd8jLy8Nnn32G8ePHa/K3KAOwM+Nrgraj\nlgaIJAkBgMZFPNnIkeY4ceIErrjiCjmL7aKLLlL79NqF2gv5tm3bMHXqVDidTsyZMwfvvPNOp8ya\nUsPqbSllZWWYNm0adu/ejV69euGLL77QtFyA4muBQACSJImCXcbQdRZfTk4OnE6neLAYgjqIt1ag\nJEnCTTfdJFsSf/nLX7Q4vXahZjLBwYMHMWPGDDidTlx88cVYvnx5p3XcTk9Ph8FgQDgcRiQS0awt\n0P79+zF9+nQcPXoUw4cPx2effYaTTjpJk79FpKWlITMzE36/Hz6fT/dDGbsCkUgElZWVKC4uRnFx\nMcrLy1FeXo4TJ06gtLQUx48fR0ZGBrZu3aqaBmgiUHa7HeFwGIFAgIlx1ILG3XhrrYx33nkHH3/8\nMbKzs7FkyRLd9YUDGt2X7Q3aVlVVYcaMGaisrMTUqVOxbNmyTh0HYTAY5J5nHo+nRZNqW8u2bdsw\nbdo0VFdXY9y4cVi1apXq41BSkZubC7/fj7q6OiFQGhIOh1FZWYnKykqUl5ejsrIS1dXVqKiowIkT\nJ2RROnToULMuV5oUoZYGaCJQ1KW5urpa852WQB3asogHAgF5lPdTTz2FPn36aHJu7UWtDMWrrroK\nhw4dwujRo7FixQpdjJAngXK73aoL1KZNmzBjxgzZOn7vvfc6VCi0Sm5hHUmS5OQRn8+HQCCAQCAA\nj8eD+vp6uN1ueL1eeDweeWaey+WCy+WC0+mE0+mUf15TU4Pq6uoWd+woLCxEnz590LdvX/Tq1Qs9\nevRAz5490bt3b/Tu3Rvdu3eHJEmqaYBmWXxA59RnCNpGW+I0L7zwAoqLizF8+HBcd911Wp1auyEh\naU+229NPPy1bDytXrtTNTDG1rMN4Nm3ahKlTp8LtduOiiy7CO++80+GDESku6nQ6O/TvakU0GpUH\nrLpcLtTV1aGyshJ1dXXweDzw+XyoqamBw+GAz+eT3ZsejwcejwcOhwMej0eOy6mFwWBAYWEhioqK\n0LNnT3l0kfLfvXv3xsCBA1v83KulAZqN2wCgSrt1QcdAu++WZt643W55hMTjjz+u67EI7U2S2L59\nO+6//34AwCuvvKIrS5EWAjWtjK1bt2LatGlwu9247LLL8Prrr3eKK7OgoABAQ/YgK7jdbuzbtw87\nd+7EoUOHUFpaipKSEhw7dgzFxcWqpc1TH0ar1QqLxQKLxYKsrCyYzWbY7XZ5hh7NzMvJyYHdbkd2\ndjZyc3PlnxcUFKBbt26qD71USwM0EaiMjAyYTCZRrMsQtDPyer2IRqPNxpJeeeUV1NbWYtKkSbjw\nwgs74hTbDIlvW9LMQ6EQrrnmGoRCISxcuBBz5sxR+/TaBV1bW7Ivk7F3715Mnz4dTqcT8+bN6zRx\nAhoFqqamplP+fnPU1NRg3bp1WL9+PX7++Wfs2LEDpaWlTf5Obm4uCgoKkJOTg5ycHHTv3h15eXmw\n2+3IzMxEQUEBcnNzYbPZYLFYYLPZYLPZkJWVhdzcXNjtdpjNZt1OUSbU0gDNrjIvL4+pnU9Xx2g0\nwmazyb5rcq8kIxqN4l//+hcAdEhLn/aSm5sLoG078cWLF2P79u3o378/nnzySbVPrd2oaWWUl5dj\n+vTpqK6uxsyZMzs1QxFozCzVi0DV1NTgiy++wDfffIMffvgBe/bsSTjGbDbjlFNOwWmnnYYhQ4bg\npJNOkv/r169fh9fKdSZqaIBmApWTkyNcfIxRVFSEI0eO4MSJE00K1Ndff41Dhw6hb9++urMoklFQ\nUACj0Yi6ujqEQqEWL7rV1dWyG/Oll17SZSaZWkXIgUAAc+fORXFxMcaPH4/33nuvw2NO8VDn+84s\n+t+7dy8++OADfPLJJ9iwYUNMd3WLxYIzzzwTkyZNwpgxY3DGGWdgwIABunZ3dyRqaIBmAiWKddmj\nd+/eOHLkCI4fP44hQ4akPO71118HAFxzzTVMfBmNRiOKiorkmo2+ffu26Peef/55eL1ezJgxo01j\nyzsCtYLRt956KzZu3IiTTz4ZH374oS52+iRQHT2du6qqCm+99Rb+97//4aeffpJ/np6ejvPOOw/T\npk3D2WefjTFjxnS6iOsZNTRAUxefaHfEFuQKa2pB8Pv9WLFiBQDgyiuv7JDzUoOePXvKNR4tESi3\n2y27Me+55x6tT6/N0CLeHlfKihUr8PLLL8NisWDlypUd2k+wKeh57CgX365du7B48WIsW7ZMTmbI\nzs7GxRdfjNmzZ+OCCy7QTfYmC6ihAa0SqGAwiCeffBJ79uzB8OHDcffdd6cM1tnt9g7rESZQh5ak\n9a5ZswYejwdjxozBKaec0lGn1m5osWtpyvKrr76K2tpaTJw4Eeeee66Wp9YuKAbV1oWgtrZW7kT+\n1FNP4YwzzlDt3NoL1dJoLVAbN27Eww8/jFWrVgFosLgvvPBCXHXVVZg9e7ZoNtBG1NCAVpX9/+9/\n/4PFYsEbb7yBcDiMt99+O+WxFotFuPgYo7CwEEBD7CUVn3/+OQB0+oyn1kILeVVVVbPHSpKEF154\nAQBwxx136DoJhHb0bfX133333SgvL8fZZ5+NhQsXqnlq7YY2TFrFssvKynDllVdi/PjxWLVqFTIz\nM3HrrbfiwIED+PTTTzF//nwhTu1ADQ1olUB9++23uOiii2AwGDBv3jx88803KY+1Wq1CoBijqKgI\nAFBZWZnymNWrVwMApk+f3iHnpBat6TW4YcMG7N27F0VFRbprfBtPe5Ik1q1bh//+97/IyMjA0qVL\nddemqr3imwpJkvDiiy9iyJAhWLZsGcxmM+677z6UlJTgueeew4ABA1T9e10VNTSgVS6+mpoaeSea\nn5/fpOmdm5uLXbt2tevkBB2Lsj1JMkpLS3Hw4EHY7XaMHTu2I0+t3bSmYezSpUsBAFdffXWnplm3\nhLYKlCRJuPPOOwE0WFFNJcV0FmrXeAENLs2rrroKn3zyCQBg7ty5eOaZZ9C/f3/V/oagATU0oFUC\nZbPZEA6HAaDZdF273S56aDEGxWlSxTN+/PFHAMCkSZN0XygYT0tbAkWjUXnx+t3vfqf5ebWXtloZ\na9aswYYNG1BYWIh7771Xi1NrN2rXQf3yyy+YM2cODh8+jLy8PLz44ouYP3++Ku8tSEQNDWiVTd+3\nb18UFxcDgDziOhXUbl3ADs1ZUBs3bgQAXQ0jbCktLdbdvXs3Kisr0atXrw4b3d4e2mpBLV68GEBD\njI3a0uiNvLw8mEwmOJ3Odk8N/v777zFx4kQcPnwYo0ePxrZt24Q4aYwaGtAqgbr88svxz3/+E19+\n+SWef/55XHbZZSmPtVgsHTqKWtB+KL04VQzq559/BgCMGTOmw85JLejaysvLmzzuyy+/BACcd955\nuk6OINrSJWPbtm1YvXo1rFYrbrrpJq1Ord0YjUY5jb49C92mTZtw4YUXwuVy4Te/+Q2+//57nHzy\nyWqdpiAFamhAqwRq7NixuPfee3HixAk88MADGD16dMpjRZIEe9BikMrnv2/fPgDQZbyiOVpa9PnZ\nZ58BAGbMmKH5OalBW/oMPv/88wCAG264ocNmO7UVih22tafb3r17MXPmTHg8HlxxxRVYvny5LoqQ\nuwIdniQBAMOHD2/RqOfMzEyEQiGEw2Hm4hVdFeVuPH4SZnV1NcrKymCz2ZjMcqJYTVM7cb/fj+++\n+w4Gg4GZLEXlaPSW4Ha78dZbbwEAbrnlFs3OSy3y8vJQXFyMqqqqJkMKyaipqcGsWbNQW1uLWbNm\n4dVXX2Wi8wkvqKEBmuWV0gye+vp6rf6EQGWodX8wGEzY+ezcuRMAcPrpp+suHbklkKXRVDLB5s2b\nEQwGMWLECDkep3fMZjPS09MRDAZbZGWsXLkSPp8PZ599NhOWMJU+tLZThiRJuOKKK+QBk53d+LYr\nooYGaLbSWCwWAEKgWCNVb7f9+/cDYNO9B7TMgqIsxXPOOadDzkkNDAaDvIhXVFQ0ezy1qVqwYIGm\n56UWbe01+NJLL2H16tXo1q0bVq5cqctGv7yjhgZoJlBk0qk1oEvQMdBDFe8yKisrAwBdDetrDRRr\naaol0NatWwEAZ555Zoeck1q0tAg5FArhq6++AsBOJxDaWLQmxlZSUoK77roLAPDvf/+b2WeWddTQ\nAM0Einy9yvb0Av1DO834+oUjR44AALMFjbTQNdUbbNu2bQCAUaNGdcg5qUVLrYxvv/0WLpcLp556\naos7unc2bWl39Ne//hUejwfz5s0TqeSdiBoaoJlAUZxCCBRbpFrsaFLoSSed1OHnpAbp6ekwm80I\nh8NJiwd9Ph8OHTqE9PR0nHrqqZ1whm2npUXI5MKcOXOm5uekFq0tRN69e7ecDPHEE08wUSrAK2po\nAHvRboGmUCA53iw/duwYADCz847HYDA0WVPzyy+/AAAGDRrEXDC9JfE1AHLvzEmTJml9SqrRWoH6\ny1/+gmg0ihtvvJGpbvuC5GguUJIkaf0nBCpCZnkkEon5OQXge/bs2eHnpBZkaSSzoKhn2MiRIzv0\nnNSgJcWsXq8XP/74I4xGIyZPntxBZ9Z+KCbakgzFffv24cMPP4TZbMYDDzyg9akJWkh7NEBzgRIm\nNlsks6A8Hg98Ph8sFgvTA9uacoUdPnwYADBw4MAOPSc1IIFqqmfdxo0bEQqFMHLkSN0X5ypJlbST\njJdeegmSJOF3v/sd0xsp3miPBmgmULTAiSJdtkhmQVHro6KiIqY3HE0lExw4cAAAmHQLtSSLj0aX\njx8/vkPOSS1SJe3EE41G8c477wAArr32Ws3PS9A8amiAZgIVDAYBgDl/fleHAptKs5xSs2mnzipN\njdxguY1TSxbx7du3A2AvQ7GlrY5++uknlJaWok+fPjjrrLM64tQEzaCGBmguUBkZGVr9CYEGJLOQ\nKLZB3RhYJZW7SJIkOY2exTZO1I28qUQCsqBYEyhaP2g9SQUVIM+ZM4fJTic8ooYGaHYnyUUkLCi2\nSBbQVLr4WCZV65Wamho4nU7Y7XZmWhwpaS7TzeFwYN++fTCbzRgxYkRHnlq7aWmN1wcffAAAuPTS\nSzU/J0HLUEMDRAxKEAM9VMpdKAkUjaxglVS7cWrjNHjwYCZjbM31PNu8eTOABuuJNY8GWYdNFVgX\nFxdj3759yM7OZiqFnnd0HYOqr69Henq66B7MGFRUpxQoXmJQ9EWhqdAEZfCx6N4DUteuEZRCz5p7\nD2hZFt+3334LAPjVr34lPDY6Qg0N0NSCEg8Le9Dirdz1UCdp1gUqVY3XiRMnAAC9e/fu8HNSg1TX\nRezevRsAmOuQAbQsBrV27VoADQIl0A9qaICmSRKsuRMETQsUi/EZJakW8uLiYgDsdslIZRkSlKHI\nq0CtW7cOQMMUZIF+UEMDhEAJYkgmUBR8Z7lIF2jMUIxPBDl69CgAMDsGvKmmnJIkyW2cWBSo5vq5\nKRNATj/99I48NUEz6FqgPB6PmMHCIBTHUJrmlEFFNSmskioBoqSkBAC7FlRTnDhxArW1tcjNzUWv\nXoU15KkAACAASURBVL06+3RaTXMCRR3ozzjjDBFS0BlqaIBmAhUIBOQAp4AdKBitvHc0i4dGH7BK\nKguKZl2xGoNqqtfZjh07AAAjRoxgMkORzjnVuVN8bfjw4R12ToKWoYYGaJrFJwSKPZKJEVlQVJPC\nE4FAANXV1UhLS2O2zitZ5iVBCzhr9U9Ec6MaKEPxtNNO64jTEbQCNTRAM4FyuVxyDYOADSRJkrtG\n5Obmyj+nGhTW72eyGi/K4OvZsyezJRG0iCc7/4MHDwJgs8cg0LT4AsDevXsBCIHSI2pogKZJEsKC\nYov6+no5sKm8d9QHjfUYFAmUciGnQYwsjwWnxJZkAkVFyLwKFMtd6HlHDQ3QTKBoPIOAHVLFmniJ\nQSXLUORBoJrqecZyE1wg+aaCCIfDKCsrg8FgYHbSM8+ooQGaCVRdXR3zhZ1dDeoYoWwKGwqF4PP5\nYDQauXHxKRc7yuBjeYFLJVAejwelpaXIyMhAv379OuHM2k+ypB3i8OHDiEQi6NOnj9zuSaAf1NAA\nzQTK7XYzv+PualD8SflQ0Yyh3NxcJrPAlCRbyKlIl9UaKCD1Ik4JEoMHD2a2J2ZT7mWKr7FqHfKO\nGhqgaZKEECi2qKqqAoCYiavk3mN91AaQfCEnC4plF1+qRZyGMLJYoEtQBmmyehoakcKqdcg7amiA\ncPEJZGhkuLKlEVlQPAhUUxYUy0W6yYqrAT6uLZnbmaDNBcvWL8/o1sUXDodRVVXF/HiGrgZNZFXG\nmnhpFAs0Xp9yN05JEizHoFKVARw6dAgAu13agUYLXln2QPAQP+QVtTRAE4GiL4xw8bFFsgW8uroa\nAPuNYoFEAaYiXZPJxGyRLtD4fYvvlcj6GBGg6SLxY8eOAWDbQuQVtTRAE4GiXbcyliHQP8mawpKL\njwcLir40JMAUw+jbty/TY8JTxaAoxXzw4MEdfk5q0VQWnxAo/aKWBmhqQbGeltzVqKioAAAUFhbK\nP+NlWCHQaA0WFBQA4GeBixde+tnx48dhNpuZjtGQ1RtvQdXX16OsrAxGo5H5+8cjammAJgJVU1MD\ns9nMZe82nqEsPqXfmBdrOBwOw+fzwWAwyBaictQ7yyRzg1EKdr9+/Zht4QQkdzsDDSNSJEnCySef\nLLqY6xC1NKBVxRElJSV46qmn4HQ6MWDAAPz5z39OWp/g8Xhgt9uZr5vpaiTL2CPRIquDVZSuInou\nKYlg0KBBnXZeapAsFZtqoFjvUVdfXw8g0cVH1i/L1iHPqKUBrbKg/vrXv+Lyyy/Hq6++iuzsbLz6\n6qtJj/P7/cJ6YhBy5ymtpWSp5yxCcRrlc0mLXP/+/TvlnNSC7pHSDUsp5qzXCFHxeHwCiBAofaOW\nBrRKoG655RaMHz8eBoMBffv2lX368fh8PuYbi3ZFqLN3jx495J9RXIrlLDeg0TpUZhUlc2myyPHj\nxwE0dGQneBnCmOr546HGi2fU0oBWCdTYsWNhMBhQXl6OJUuWYMGCBUmPExYUe0SjUXkxSCZQyp+x\nSLI2TsmSQliE4oRKK5eXBTzV83f06FEA7FuIvNIhFtS3336Lm2++GTfffLM8mfPAgQO4/vrr8dBD\nD6Vs4R8IBETzRsZwuVyQJAlZWVly37ZoNJrUqmKReDdYOBzmptAzWcYUDy2cgEaBirdyhUDpG7U0\noMkkiREjRsgPRp8+fbBz507cd999WLx4MYYOHZry97xer0gxZ4xkFkZlZSXC4TDy8/OZd9nGx9dK\nSkoQDAbRu3fvpH3eWCEcDiMUCsFoNMoLgiRJch8+lhNAwuEwKisrYTAYElx8VIQsBEqfqKUBTQpU\nfn6+/IWORqNYtGgRTj31VHz++ef4/PPPMWTIEMycOTPh9xwOh+giwRgkUMoMPrKeevXq1SnnpCbx\nVgYPLY6AxtiaMmOqoqICPp8PeXl5TNevVVdXQ5IkFBYWxqSS+3w+HD9+HOnp6SJJQqeopQEtTjMP\nh8NYtGhRzM9SLVw+n4+LRa0rQT3PlNlSPAkUuYooTlNWVgaA/WujjYUy85KXKbOp+kDSvevTpw/T\nNV48o5YGtFigMjIyklpLyXA6nUy3+O+KNGVBsR5/AhpdfJQQQZlvvXv37rRzUoNk3b55ic+k6jFI\nCSCs3zueUUsDNOkkIbL42CNZx4jy8nIAfAhUfEcCXiyoZE05yYJivb4rWXd9oLFLBsvxNd7plDqo\nlqLGLHpBx5IsE4zqhFivgQISr48axbK+iCdrFMvLnCRyO8fHMqhFlRAo/aKWBggLSgCgsZO5UqB4\nKdIFEtPMeekikSx2SBsL1i3fyspKAIlttqhLe1OZxILORdcWlMvlSvAbC/QNxaCUg+EoTsN6LQ3Q\nuGhTDIoEivVrSzYOhZf+iZRpGX+PyMWXqg5T0PmopQGaCFR9fT3zdTNdjWQdsXmyoJR1XjU1Naip\nqYHNZotpD8QilCSh3FhQkgTrSQT0/Cnvkc/nw4EDB5CWlsZ8F3qeUUsDVBeoaDSKSCQiWuAzBnWN\npmLPaDQqZ0uxXisExMagyHoaOHAg8x33ycVHWXyBQAClpaUwmUxMT9IFGt3OyhjUL7/8gmg0iqFD\nh4o4t05RUwNUF6imJmAK9Et8sL20tBR+vx9FRUVcFF0rBYrS51lvEgskZifStfXs2ZP5GqFks6Ao\n/jRs2LBOOSdB86ipAUKgBAASZwqRm4j1Yk+gYUennDpLMQweri1+EeexNEDpduZljAjP6FqggsEg\nAAgXH2PEW1CUQcVD/Mnn80GSJFitVphMJnkXPmTIkE4+s/YTnz6fbPQGqzSVQs+D25lX1NQA1QUq\nEokAAPPuha5GKBQCALmTOS+FrEDiTpyXFHMAMZYhwE+PQSC5QPHUfotX1NQA1QVKkiQAYD743NWI\nf6h4aZcDNLocaKFTxmlYJ96Coi4SPAhUssxScvGxXh7AM2pqgCZp5gL2oIeKBIqXdjlA4thwsg5Z\nT8MGEhuqUnyNB/dlfCwjGo3K7llRA9U1UF2gyEVEO3IBG5BAETz1O6MuEt26dUM4HEZVVRUMBgMX\nWXx0bVSUy1NxNcUyqPShvLwcPp8P3bp1i+kZKdAXamqA6gJlNDa8pRAotuGlnxvQuIjn5+ejqqoK\nkiShoKBA/iKxDNVBUaFuqgm0LEK1eRkZGQD4El+eUVMDVBcoytygoLuADchfHI1G4fP54Ha7kZGR\nwfTAO0K5iPMyZgNosHqVCSCRSISr7Mv44nGy6nmIi/KMmhogBEoAoDH2FL/I8ZDsQsH2zMxMrhZw\nv98PSZJgNpthMplQUVGBSCSCwsJCeVFnFUmSkhaPA3xY9Tyja4GigCYFOAVsQG6UYDAoB95ZbzZK\n0EJntVq5coFRo1hy75H48lCkGwqFEIlEkJaWluDiEynm+kZNDVBdoNLS0mAwGBAOh9V+a4GGKB8q\nWsSp8zfrKGuFqLkqD67L+C4SqeYnsQitH8o44aFDhwCA+R6DvKOmBqguUAaDAWazWfYfC9iABKq+\nvl52pfAQpwFiYxk8CVR8jIbS6XkQKLo2ZbscnmrzeEZNDdCkDspsNgsXH2PQTjUUCsmFrLxkS1G6\nckZGRkJaNsvECxS5ZnlIwY6/NkmShAXFEGppgCYClZmZKfv9BWxAbiKfz8fVIg7ELnY8jbGPX8ST\nDS9kFXIPUfJOVVUVvF4v8vLyuBBg3lFLAzQRqOzsbNkfLmADCrTX1dVxtRMHYuMZ8YkFLENZUpQ1\nFT81mGXiW2/RpomHjUVXQC0NEAIlANDYBsjj8XAVbAdiFzuK09CAP5aJRqMAYq0MgA+Biu/nRsML\n1RgjLtAeXQuU1WqVa08EbKDM4ovv78YLRqOR64WOt/IAoFGgaM6VsKDYQC0N0ESgcnJyZFeKgA1o\nwXa5XLKVwYMbTAl1yQBip7SySnxLGZ7Fl6cO9F0BtTRAE4Gy2WxyjYaADWjXXV1dzZUbDIjtkhGf\nWMAylHlJMTae0szjxZen8oCugFoaoFkWn6iDYgsSqJqaGnknzsNCBzQudtFoNCblnHWUwgskFu6y\nTPy1VVdXA2joSC/QP2ppgLCgBACSCxQNwWMdpaURP8KBZZTF1UBsSyfWie/nxmN8jWd0b0GJJAm2\noOBzSUkJwuEwTCYTF4s40Nhs1O/3ywJFCyDLUKyJNhTxk4NZhp49El9e46K8opYGaCJQFotFuPgY\nIy8vD0ajUb5vPCxyhHKxS9bjjVXIBUuLNwkUDxsL5aYCaCxC5iUuyjtqaYBmWXz0pRGwgcFgiHEN\nKXugsY7SxRdfO8QydL9op8pTfI0s3Egkgmg0yl1tHu+opQGaFeo6nc6EMeICfaMMrvOwCyd4nVGW\nmZkJo9GIQCCAUCjElXVIDUeBBsuQ4hm8xEV5Ry0NaJNArVmzBk8++WTK14uKihAMBoUVxRjK3SkP\nu3AimUDxsHkyGo2yy8vlcsnXx4NAAbGuWZ4yFLsCamlAqwWqoqICTzzxhDwcLRnKxqMCdlBmSPGy\nyAGxwxgJSj1nHXLF+v1+uesCD1OQgdjuJrSW8JCh2BVQSwNa9S2NRqP4f//v/+HGG29s8jhlVwIB\nOyjnP/EQoyEo4E67cF4WcCA2k49qhngRX2WiBCWA8BQb5Rm1NKBVT/Lrr7+OiRMnon///k0el5ub\ni4yMDHkyq4ANlCm8PAkU7bppsi4vCzjQaPVWVVXJAsWL9UsuZ5fLJQSKMdTSgCa/qZ988gmuv/56\nXH/99VizZg1WrlyJESNG4PDhw3A4HPLk1XgMBoPI5GMQZQovT4u40lXEGzQShcZRGAwGbixESojw\neDwJ4zcE+kYtDWhyqzVx4kQMGTIEQEMvrNNOOw3vvvsuqqqqcOzYMWzZsiXl1NWsrCx5xypgg+7d\nu8v/n6eFgNwN5OKjVHMeICuD6oR4sZ6ARhdfIBCQk1p42jjxjhoa0OTTnJ+fHzO0bty4cQCALVu2\nYPny5Zg7d27K37XZbEKgGEOZJMFDlhtB85Gon5skSZAkiQtLg76f5Erh4ZoIcs1SpwyerMOugBoa\n0KbtyIABA3DVVVc1eUxhYaE8QE3ABspBd+RS4QHqgO10OmXLkGqGWIfuGXX75mljQQJFgXYe2lN1\nJdTQgDYJVH5+PkaMGNHsMfSlEbBBjx495P/PU1ErJX/U1tbKbiNeSiDoeqitDE8bC3JfUqNYntyX\nXQE1NEAzh64YWsgeShcfTwtdbm4u0tLS4Ha75YQJXkogyMoIBoMwmUwxI0VYR5mhCPBlHXYF1NAA\nzQTKarXKjR4FbKCs0ufFBQY0xC7o2ui6eFnElZluVJDMS6NmEiha5HhKbukKqKEBmglUdnY2N7vU\nroKy1RFvKdkUh6KgLS8CpUwzjx+/wTp0bXQ9wWBQWFEMoYYGCAtKIKNsI8PLIkfQvCuyoHjZPNEi\nXltbK98/Xr53dG0ulwsmkwmSJHFl2fOOri0ou93OzSLQFeFtInL8oDte4qM0Ar26ujqhaJd1lDEo\nSpDgxfLtCqihAZoJVEZGhniYGISywnhzpZD7i+BFgGkRr62tjfn/PNCrVy8AwIkTJ+QYoqitZAc1\nNEAzgTKbzaivr+duoeMdXkdqx09i5cUNRvfL4XDEdDbnAXLLVlVVyckgvGwsugJqaICmMSieUl67\nCspECZ42F5QkQfBSB5Weng6bzYZoNCrHZ3hJcLHb7UhLS4PX65WLdHkR366AGhqgmUDxtpvrKigT\nJXiKIcaPCuepEDnefcmLG0xZHkAtjni5tq6AGhqgmUBRUJOngs+ugLKdDE+dQJQ9JQG+6rzIfUlW\nIS8WFNC4saD7xVt2Kc+ooQGaCxRPO9WugFKgeFroKJ5B8LRxohZVlL3H03eO7hsV6fKSodgVUEMD\nNBMoaosvqr/ZQjnOgJeOBECii48nC4qsQ3J/8SRQNAKGrk0kSbCDGhqguUDxFGjvCijnQPGSSAA0\ntgQieEreoUw+Eiae7hulzpMw8bRp4h01NEDz6V9CoNhCaUHxFIOKTzPnSaDo2igYzdO1kUCRMIkp\n3eyha4ESsIVSoHhyp8QLFE9usPgkCZ6ujcoDKDbKSxGyoGVoLlBiAiZbKHc7PLlT4lOxeUqSIPcl\nJbXwFF+jzia0cRJZfOzRHg3QTKBoAVDGNAT6RxnQ5CmLLz4GxVPyjtlsBtC4ueBxY0EZYcKCYgc1\nNEBzgVK6jAT6R2lZ8FRknZGREfNF4angk6wMgicLimJQ9Czy9EzyjhoaoJl60JdEjGlmC+XixpMF\nBTRaGgBfXTKoYp/g6b5RhiItdjzF13hHDQ3QTKAok4imfArYQOke4ilJAogVKJ5SsZXXBfBlQSmn\nPANCoFhCDQ0QFpQgBqUo8bSIA7GuMJ7SleMFiicLKn5x423TxDO6tqBoJx7/5RHoG6UoVVZWduKZ\nqI/yWeRlYCGQuIjzlCQRf20ii48d1NAATV186enpIs2cMZTJA7xlTCm/KDwF2+N3qDy5wXgWX95R\nQwM0Eyiv15vgPxboH+UOladMNyA2nsGTq4iypEiAeUoAIfGlRY6n+BrvqKEBmgmU3++PmS0k0D/B\nYDBm981TqyMgthaKp0WcFm9qiMvTtZH4klAJC4od1NAAYUEJZOJdery5+JQCxZOLjwp0yYLiqRcf\nCRS5+nhKAOEdXVtQdXV1cg2DgA1o5033jbeAtPLLEgwGuWl31BUEinrx8XRtvKOGBmgmUDU1NQlT\nTAX6huIyhYWFAPiyMoDYYYwAP7txatvE4xRrcl9SFxCero131NAATdPM41uwCPQNWUzUQZq3gHR8\nTzBest1o0SY3GE99Bsk6FALFHmpogGYCFQgERA0UY1DMqaioCEajEeFwmCuRihcoXhZycnvRYsDT\nIk73iMQ3HA6LGXOMoIYGaCZQDocjYQaPQN9Qd4W8vDzZHcaLlQEktv3nZaGjexTf1ZwHlO5Lk8kE\nSZK4eiZ5Rg0N0EygXC6XnPYqYANKK8/JyZHjGTwtBjwt3EriBYonC0rZLke4+dhCDQ1oVZMkp9OJ\nv//976ioqEDv3r3x4IMPpmwEWFlZie7du7fr5AQdCwlUQUEBMjIy4PV6uRKoeJceL11O4l18PLll\nlQ1HKaOPF9cs76ihAa2yoB599FFMnjwZr7zyCmw2G9asWZPyWK/XKwp1GaOmpgZAg4uPx91qvAXF\ni0DRJoK+bzwJFPWGtNls8v3i1RLmDTU0oMUCFY1GsWfPHowePRpr1qzBddddhwsvvDDlsT6fTxTq\nMkZZWRkAoFevXvIiwMsiDgAvv/wyvF4vnE4nampquImRkpVB3zeerF4qdRAZwWyhlga02MVHX+oH\nH3wQw4cPx1NPPYXnn38egwYNSjiWHqr4Mdu8I0kSIpEIAoEAQqEQQqEQotGovKM1GAxIS0tDRkYG\nLBYLLBaLriYOBwIBZGZmonv37qqMa9aSaDSKYDCIcDiMSCQi/0eft3KXraylMRqNSE9Ph8lkkrOM\n9HqNLWXo0P/f3rnHNlX+f/y99X47vazdKhaRIfCL0YRowmUSkQDhDy8YIwnhfhEkMokKxiARF9kQ\nlKgxJosR/lPkDyNRNIxMIJOhQ5iOoWyDDoEtsLZrT9tzaU9vz++P5Xm+LQO+Qfa1hZ1Xsqw9a3c+\n59PP87k8z+nn+T80NDRg7ty5WLBgwYit/RJCkMlkkEwmWRusXC4HQkiBfrVaLcrKyphuqX51Ot0d\n2/f06dPR3d2NsrIyDAwMIBAIDNug8V4jl8sx/6EoCjKZDNN7/vQm9SdlZWXQarXQ6/UwmUwlscVR\nIpGARqO54xhQRm5RL3/33Xc4cOAAAGDz5s1YtGgR2traYLVa8e2336KnpwdbtmwZ9r5wOIyamhr8\n8MMPGDNmDEwmU0k54ushhCAajUIQBEiShGAwiHg8jlgshmQyiUQiAUmS2O9YLAZZlhGPxxGPx5FI\nJKAoChRFue3pB41GA4PBAI7jYDKZYDabYTKZYLfbYTab4XA4YLFYYDQaC/5utVpRUVEBq9UKl8sF\nq9VaEob530ilUhBFEbIsY3BwEIIgIBaLIZFIIBKJQJZlyLIMURSRSCTYTzKZRCwWY+8dyb2q9Ho9\nDAYDrFYrjEYjHA4HTCYTOI6Dy+WC2WyGy+WCw+FARUUFOI6Dx+OB1WqF3W4vadtOJBLgeR48z0OS\nJEiShEAggMHBQYiiCEmSEI/HIYoiotEootEo0386nb7j6bSysjIYDAYYjUbYbDY4nU6mZ4vFAqfT\nCYvFwuza6XTCbrcz/VL7v9sqeUIIkskkotEoIpEIBgcHEYvFwPM8wuEw038oFIIgCFAUBbIss8d3\nAvUVFosFNpuN6dlms8FgMMBkMsFms8Hj8YDjOHAcB6fTiaqqqpKz51t6tCeffBKPPvoogKFpH6/X\nW9B65GbGS52HTqfDY489BmBoftxisaCyshIcx8HhcMBoNMJgMKCiooIZKlUsdRo0M6B38dzouyw0\na6bZnizLUBQFqVQKgiCwYCLLMmKxGCKRCEKhECRJgiiKiMViBS1U9Ho97HY77HY7DAYDk91gMMBi\nseChhx6C2WxmH67JZGLXotVqYTQaWSaZLzOtsNLpNJLJJKu0EokEk5PKH4vFIEkSrl27BlEUmQEn\nEombGrLH44HT6QTHccwZmM1m6PV6cBzHHIXVaoVer4der4dOp4PBYGCy5h+/Xs/ZbJbpWFEUJgsN\nHoIgMAeXTCYhCAJ4nkcikWCD8/r1Ea1Wy4Lx9TbAcRy8Xi+rNul10QBtNBqh0Wig1WpRXl7OdE2z\nyrKyMmajNPuk+qfXkkqlIMtyQeDMt5XBwUHIsoxwOMxmEfL1rtFoYLPZCoIYldNqtcJsNsNms8Fu\nt7PrsFgszJ4NBgP0ej2TmUJvp85ms0zXtGJUFAXxeJwlRfF4HDzPIxQKIRgMMruWJGlYIDcajfB4\nPMw5mc1m2O12+Hw+2O129hnQMUjHIbWJ8vJy5gOofmn1SmVOp9OssqXPaXCMRCIQRRHJZBKSJKGv\nr4/JSR16NBotsJOysrKCAEZtnOqcjk8aBK1WK0wm0zD7pnaSL3v+uMz3JbRipLZO/Qkde9TH0KSV\n2o4gCBgYGADP8wX+UafTweFwsCTH7XbD5XJh0qRJ4DgORqOR2QqtgrRaLUwmE6v8y8vLC+w636Zz\nuVyBj6D6FkURoigiEokw/VN/EwwGIQgCBEFgspaXl8Nms8Fms4HjOJYk2O12mEwmOBwO2Gw25u+s\nVit7rtPp2M0sVM4xY8YM8yW3wy0rqOvZv38/Tpw4gXnz5mHPnj348MMPMXny5GGvS6fTCAQC8Hg8\nOH/+fMFgCQQCrDqhH3AkEkE0GmWvudO7x8rLy9mgogGE/nY4HHA6nSxDo1lwVVVVwYAt9YyNEMIy\n3Ugkgng8jkAgAJ7nWWXH8zwLhNQpUMeQSqXYIPynutbpdDCbzTAajbDb7SxTM5vNMJvNsFqt7LnN\nZoPL5WLZm9lshtvthtFoLHldX4+iKCwQhMNhCILAPodYLMaCNbVnQRAQj8eZ/v9piyWNRsMcLnXC\n9LHL5YLb7UZlZSWza4vFwpI/6sjvhulMOqNBq7p8/xGNRsHzPNMvrbolSWLBmlbfI3EzBU2QDQYD\nS/A4jmMJK004qJO22Wzwer2oqKhgvoTOdJSqnedyOcRiMQwMDCAajTL7pT/RaBTxeBySJDE/ne9X\nbjWbceTIEfh8vn8s220FKAA4e/Ysenp6MG3aNIwdO/Yfn/i/QQhh8680c6TZQv4Cfv7ct0ajYZlT\nqRpDKUKriXQ6zYIWXceheqQZHHWQtFpUuX2ovmk1RBvXXm/XtDqk0zJ3Q3ApFej6GbVpqmO6lkPJ\n1zX9TStbuo6mcmuy2SwSiQTz1flrlG63+478xG0HKBUVFRUVlX+D0lkNU1FRUVFRyUMNUCoqKioq\nJYmmrq6ubqT/qSiK+OmnnxAOh3H//fer60F5pNNptLa2oqurC5WVlew7HaFQCEePHkU6nUZlZSWA\noXn09vZ2/PHHH/B6vaO+O/y5c+eQyWRgs9kAAFeuXEFLSwt0Oh3bIiSXy+H48ePo7u6Gz+cbtetk\n1HY6OjpQVVXFbOfatWs4duwYgKH1AfratrY2nD17FmPGjLlp+7J7nVQqhWPHjuHy5cvw+Xxsza+v\nrw8tLS3QarVsf6NcLocTJ07g3Llzo9bOQqEQ+vv7mR1ls1kcP34cFy5cwNixY5n+BgYGcPToURBC\nCmzu5MmT6OzsxH333XdTmxvxCiqVSmHFihUIBALYv38/GhsbR/oUdy2EEKxbtw6///47gsEgFi9e\nDJ7nEQgEsHr1agiCgF27duHQoUMAhjoffPnllwgGg1i+fPk9t4Hg7RAKhbB69Wr89ddfAIaC1Wuv\nvQZZlrF582acOXMGAFBXV4eff/4Z58+fx/r160dtW5yGhgYcPHgQwWAQS5YsgaIouHTpEtavXw9Z\nlrFt2za0trYCAD7++GN8//336O/vx6pVq+6pVkm3w5o1a9Dd3Y2Ojg68+uqrAIDu7m5s3LgRsizj\nzTffRHt7OwCgvr4eR44cgd/vx9q1a0ddf8BIJIINGzYwGwKAt99+G21tbfjzzz9RW1sLQgj6+vqw\nbt06SJKEuro6tLS0AAA+/fRTHDhwAP39/Vi5cuXNd0omI8zhw4fJ1q1bCSGEJJNJ8tRTT5FsNjvS\np7krCYfD5N1332XPt23bRpqamkhjYyPZu3cvIYSQK1eukBdffJHkcjkye/ZsIooiIYSQ7du3k4MH\nDxZD7KKTy+VIbW0tWbVqFWlubiaEELJlyxb2+Pjx4+SNN94gPM+TefPmkVwuRwgh5KWXXiJnzpwp\nmtzFIhqNkoULFzI9NDc3k3A4THbu3Em++eYbQgghnZ2dZPXq1URRFDJr1iySSqUIIYRs2rSJtLS0\nFE32YiGKIpkzZw57PnPmTJJOp8k777xDDh06RAgh5NdffyUbN24kgiCQOXPmML/28ssvk/b2fjoe\nwQAABT1JREFU9qLIXQz6+/vJggULSG1tLdmzZw8hhJBgMEiefvppZnNLly4lPT09ZPfu3WT//v2E\nEEK6urrIihUrSDqdJrNmzSKKohBCCHnrrbfI0aNHb3iuEa+g/H4/a39kMBhgs9kQCoVG+jR3JS6X\nC3RGVZIk/Pbbb5g4cWKBznw+H65cuQKe56HX61kvq+rqavj9/mKJXlT27duHqVOnorq6mh3r7e3F\nxIkTAQATJkxAb28vLl26hPHjx7MpZXp8tHHmzBn4fD68/vrrWLRoEURRhMvluqHOrl69Cq/Xy26n\nnjBhAi5evFhM8YuCxWLBjBkzsH37dmzbtg3z58+HVquF3++/oZ2NGzeOfel3tNmZ0+nE119/jalT\np7Jjvb29qK6uLhh7fr+/wLdVV1ejt7cX165dg9vtZtN6t/JtIx6gstlsQa8sg8FwTzWvHAlEUcSG\nDRuwZMkSVFdXF+iM9tW6kR5H49SL3+9Ha2srlixZUnA8k8kw/VAby2QyBet0o1VnkiThl19+waZN\nm/D5559j79696O3tRTabZfqhusk/Bgx1mrjpdMs9jCAIOH/+PMaPH4/x48eju7sbiURimM5od4/8\nsWk0GkeVj6NdPfK5md/PP67T6dh3Wa/X383G6Yiv7Hk8HrYzKzC0aZXD4Rjp09y1BAIBvPLKK1i2\nbBmef/55AIU6S6VS0Ol0cLlcEASBvS8ajbIbAUYTjY2NCAQCWLt2LS5evIjTp0+jqqoKHo8HPM+j\nqqoKPM/D5XKhsrKywPZ4nmetukYTHo8HU6ZMYV+kpw1X3W43otEogP/YU/4xYEhnDzzwQFHkLiat\nra2YPHkyli5dCgDo6elBW1sbG5s+n4/pzOPxDNMZrbJGK9f7/Wg0CpfLVXCcbmB4I5vzer03/L8j\nXkHV1NTg2LFjSKfT6OrqgsPhGHVdzW9GKpXCunXrsH79esybN4+1dJo5cyaamppACEFzczOmT58O\njUaDBx98EJ2dnchkMmhubkZNTU2xL+Ffp66uDl988QU++OADPPHEE1i+fDkmT56MmTNn4vDhwwCA\nw4cPY8aMGcyJBAIBiKKIU6dOsV6Qo4mHH34Y/f39iEQiSKVS6OjoGKazpqYmzJgxg/WBu3jxIhRF\nQUtLC6ZNm1bkK/j3GTduHC5cuMC6TvT29mLs2LHDdFZTUwOv18v6ZMqyjLa2Njz++ONFvoLiUl1d\njatXr7IG0B0dHZgyZQrzbcDQOK2pqWH9+/x+P1Kp1C1t7n/SSeKrr75CU1MTysvLsXXrVkyaNGmk\nT3FXcvr0aezYsaPgWG1tLWbPno3du3ejs7MTZrMZDQ0NcLvd+Pvvv1FfXw9ZljF//nysXLmyOIKX\nCHv27MEjjzyC6dOnI5lM4r333kNfXx8qKytRX18Pk8mE9vZ2fPLJJ8hkMli2bNlN9yy71zl16hQa\nGxuRTCbxzDPPYPHixUin03j//fdx4cIFOBwONDQ0gOM4dHV1YdeuXVAUBS+88AIWLlxYbPGLwr59\n+9gdtM899xwWLlwIRVGwfft2XL58GR6PB/X19TCbzejo6MBHH32EdDqNxYsX49lnny2y9P8+P/74\nI9LpNJsJOnnyJD777DNkMhmsWbMGc+fORSaTwc6dO9HT0wOO47Bjxw7Y7XZ0d3dj165dSCaTWLBg\nARYtWnTDc6itjlRUVFRUShK1k4SKioqKSkmiBigVFRUVlZJEDVAqKioqKiWJGqBUVFRUVEoSNUCp\nqKioqJQkaoBSUVFRUSlJ1ACloqKiolKSqAFKRUVFRaUk+X+51MUn6S2mlwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "\n", "lm = [1, 2, 3, 4]\n", "M = len(lm)\n", "D = np.array(lm)\n", "a = np.min(lm)\n", "b = np.max(lm)\n", "t = np.linspace(-1, 6, 1000)\n", "u = 0.5 * np.ones(M)\n", "rho = 1\n", "def fun(lam):\n", " return 1 + rho * np.sum(u**2/(D - lam))\n", "res = [fun(lam) for lam in t]\n", "plt.plot(res, 'k')\n", "plt.ylim([-6, 6])\n", "plt.tight_layout()\n", "plt.title('Plot of the function')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Conclusion\n", "\n", "The function has only one root at $[d_i, d_{i+1}]$\n", "\n", "We have proved, by the way, the **Cauchy interlacing theorem** (what happens to the eigenvalues under rank-$1$ perturbation)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## How to find the root\n", "\n", "A Newton method will fail (draw a picture with a tangent line).\n", "\n", "However, Newton method is just approximation of a function $f(\\lambda)$ by a linear function.\n", "\n", "Much better approximation is the **hyperbola**:\n", "\n", "$$f(\\lambda) \\approx c_0 + \\frac{c_1}{d_i - \\lambda} + \\frac{c_2}{d_{i+1} - \\lambda}.$$\n", "\n", "To fit the coefficients, we have to evaluate $f(\\lambda)$ and $f'(\\lambda)$ in the particular point.\n", "\n", "After that, the approximation can be recovered from solving **quadratic equation**\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Important issues\n", "\n", "First, stability: This method was abandoned for a long time due to instability of the computation of the eignenvectors.\n", "\n", "The exact expression for the eigenvectors is just\n", "\n", "$$(D - \\alpha_i I)^{-1}u,$$ where $\\alpha_i$ is the computed root." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Lowner theorem\n", "\n", "The solution is by using a strange Lowner theorem:\n", "\n", "If $\\alpha_i$ and $d_i$ satisfy the **interlacing theorem** \n", "\n", "\n", "$$d_n < \\alpha_n < \\ldots < d_{i+1} < \\alpha_{i+1} \\ldots$$\n", "\n", "Then there exists a vector $\\widehat{u}$ such that $\\alpha_i$ are exact eigenvalues of the matrix\n", "\n", "$$\\widehat{D} = D + \\widehat{u} \\widehat{u}^*.$$\n", "\n", "So, you first compute the eigenvalues, then compute $\\widehat{u}$ and only then the eigenvectors." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Divide and conquer and the Fast Multipole Method\n", "\n", "In the computations we have to evaluate the sums of the form\n", "\n", "$$f(\\lambda) = 1 + \\rho \\sum_{i=1}^n \\frac{|u_i|^2}{(d_i - \\lambda)},$$\n", "\n", "and have to do it at least for $n$ points. \n", "\n", "The complexity is then $\\mathcal{O}(n^2)$, as for the QR-algorithm.\n", "\n", "Can we make it $\\mathcal{O}(n \\log n)$? \n", "\n", "The answer is yes, but we have to replace the computations by the approximate ones\n", "\n", "by the help of **Fast Multipole Method**.\n", "\n", "I will do a short explanation on the whiteboard." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Few more algorithms\n", "\n", "Absolutely different approach is based on the **bisection**.\n", "\n", "Given a matrix $A$ its inertia is defined as a triple $(\\nu, \\zeta, \\pi)$, \n", "\n", "the number of negative, zero and positive eigenvalues. \n", "\n", "If $X$ is non-singular, then \n", "\n", "$$Inertia(A) = Inertia(X^* A X)$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Bisection via Gaussian elimination\n", "\n", "Given $z$ we can do the Gaussian elimination:\n", "\n", "$$A - zI = L D L^*,$$\n", "\n", "and inertia of the diagonal matrix is trivial to compute.\n", "\n", "Thus, if we want to find all the eigenvalues in the interval $a$, $b$\n", "\n", "Using inertia, we can easily count the number of eigenvalues in an interval." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Jacobi method\n", "\n", "Recall what a Jacobi (Givens rotations) are:\n", "\n", "In a plane they correspong to a $2 \\times 2$ orthogonal matrix of the form\n", "\n", "$$\\begin{pmatrix} \\cos \\phi & \\sin \\phi \\\\ -\\sin \\phi & \\cos \\phi \\end{pmatrix},$$\n", "\n", "and in the $n$-dimensional case we select two variables $i$ and $j$ and rotate." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Jacobi method (cont.)\n", "\n", "The idea of the Jacobi method is to minimize\n", "\n", "$$\\mathrm{off}( U^* A U), $$\n", "\n", "by applying succesive Jacobi rotations to \"kill\" off-diagonal elements. \n", "\n", "When the \"pivot\" is chosen, it is easy to eliminate it. \n", "\n", "The main question is then what is the order of **sweeps** we have to make (i.e. in which order to eliminate).\n", "\n", "If we always eliminate the largest off-diagonal elements the method has quadratic convergence." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Summary for this part\n", "- Many algorithms for the computation of the SEV solution (QR, Divide-and-conquer, bisection, Jacobi)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## SVD\n", "\n", "Now we go to the applications of the SVD.\n", "\n", "SVD is extremely important in computational science and engineering.\n", "\n", "It has many names: Principal component analysis, Proper Orthogonal Decomposition, Empirical Orthogonal Functions\n", "\n", "We will consider:\n", "\n", "1. Latent semantic analysis\n", "2. Collaborative filtering\n", "3. Data compression" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Application 1: Latent semantic analysis\n", "One of the most famous application is Latent semantic indexing, see, for example, \n", "[Deerwester, Scott C., et al. \"Indexing by latent semantic analysis.\" (1990)](http://www.cob.unt.edu/itds/faculty/evangelopoulos/dsci5910/LSA_Deerwester1990.pdf) \n", "\n", "The problem setup: we have a set of text documents $D_1, \\ldots, D_N.$ We want to solve the search problem: i.e., we have a query as a set of words, and we want to find the best documents. \n", "Our data is processed as follows: for each document we create a list of words contained in the document, and count the frequencies of each word. This is called the **bag of words** model (i.e., the document is unordered set of words). " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Term-document matrix\n", "This is how the term-document matrix $A$ is obtained. Its row size is **the size of the dictionary**. \n", "Its column size is **the number of documents**. An element $A_{ij}$ the the frequency of occurence of the $i$-th word in the $j$-document.\n", "\n", "To do the search, we can just multiply a term-documnt matrix by a **search vector**, i.e. a list of words." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**The problem**: The document will be returned only if there is an exact word match. However, we might search for \"Samuel Clemens\", and hope to get the results for \"Mark Twain\" as well. But there might be no exact match! \n", "How the SVD can help?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Idea of LSI\n", "Compute **low-rank approximation** $A_r$ of the term-document matrix $A$. \n", "$$A \\approx A_r,$$\n", "and **we do not care about the approximation error** (i.e., we do not require it to be small). \n", "The matrix $A_r$ can be then used to do queries. \n", "\n", "We project the documents to **low-dimensional subspace**, given a query $q$ the projection is \n", "$$q_r = \\Sigma^{-1}_r U^{\\top}_r q$$\n", "Now we can compute the similarity between $d_r$ and other projected documents \n", "$$\\widehat{d}_i = \\Sigma^{-1}_r U^{\\top}_r d_i,$$\n", "and compute the **cosine** of the angles between the query and the projected document." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Demo\n", "Now we can test a demo database" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012345678
human100100000
interface101000000
computer110000000
user011010000
system011100000
response010010000
time010010000
EPS001100000
survey010000001
trees000001110
graph000000111
minors000000011
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 8\n", "human 1 0 0 1 0 0 0 0 0\n", "interface 1 0 1 0 0 0 0 0 0\n", "computer 1 1 0 0 0 0 0 0 0\n", "user 0 1 1 0 1 0 0 0 0\n", "system 0 1 1 1 0 0 0 0 0\n", "response 0 1 0 0 1 0 0 0 0\n", "time 0 1 0 0 1 0 0 0 0\n", "EPS 0 0 1 1 0 0 0 0 0\n", "survey 0 1 0 0 0 0 0 0 1\n", "trees 0 0 0 0 0 1 1 1 0\n", "graph 0 0 0 0 0 0 1 1 1\n", "minors 0 0 0 0 0 0 0 1 1" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "import re #Regular expressions\n", "rows = ['human', 'interface', 'computer', 'user', 'system', 'response', 'time', 'EPS', 'survey', 'trees', 'graph', 'minors']\n", "nterms = len(rows)\n", "docs = []\n", "docs += ['Human machine interface for Lab ABC computer applications']\n", "docs += ['A survey of user opinions of computer system response time']\n", "docs += ['The EPS user interfaces management system']\n", "docs += ['System and human system engineering testing of EPS']\n", "docs += ['Relation of user-perceived response time on user management']\n", "docs += ['The generation of random, binary, unordered trees']\n", "docs += ['The intersection graph of paths in trees']\n", "docs += ['Graph minors IV: Width of trees and well-quasi-ordering']\n", "docs += ['Graph minors: A survey']\n", "ndocs = len(docs)\n", "term_doc = np.zeros((nterms, ndocs))\n", "for i in xrange(nterms):\n", " for j in xrange(ndocs):\n", " if re.search(rows[i], docs[j], re.IGNORECASE):\n", " term_doc[i, j] = 1\n", "#Use pandas to plot \n", "pd.DataFrame(data=term_doc,index=rows)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Now we can compare the results between ordinary matvec and low-rank matvec." ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There query is: Human computer interaction ,the scores are:\n" ] }, { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No SVDSVD
Human machine interface for Lab ABC computer applications20.316794
A survey of user opinions of computer system response time11.011276
The EPS user interfaces management system00.663677
System and human system engineering testing of EPS10.405542
Relation of user-perceived response time on user management00.554066
The generation of random, binary, unordered trees0-0.035325
The intersection graph of paths in trees0-0.065210
Graph minors IV: Width of trees and well-quasi-ordering0-0.082587
Graph minors: A survey00.055939
\n", "
" ], "text/plain": [ " No SVD SVD\n", "Human machine interface for Lab ABC computer ap... 2 0.316794\n", "A survey of user opinions of computer system re... 1 1.011276\n", "The EPS user interfaces management system 0 0.663677\n", "System and human system engineering testing of EPS 1 0.405542\n", "Relation of user-perceived response time on use... 0 0.554066\n", "The generation of random, binary, unordered trees 0 -0.035325\n", "The intersection graph of paths in trees 0 -0.065210\n", "Graph minors IV: Width of trees and well-quasi-... 0 -0.082587\n", "Graph minors: A survey 0 0.055939" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "query = 'Human computer interaction'\n", "qv = np.zeros((nterms))\n", "for i in xrange(nterms):\n", " if re.search(rows[i], query, re.IGNORECASE):\n", " qv[i] = 1\n", "res1 = qv.dot(term_doc) #Non-compressed search result\n", "\n", "u, s, v = np.linalg.svd(term_doc)\n", "r = 2\n", "u = u[:, :r]\n", "s = s[:r]\n", "v = v[:r, :] #Numpy transposes\n", "appr1 = u.dot(np.diag(s)).dot(v)\n", "res2 = qv.dot(appr1)\n", "res_all = np.vstack((res1, res2)).T #To make two columns\n", "print 'There query is:', query, ',the scores are:'\n", "pd.DataFrame(res_all, index=docs, columns=['No SVD', 'SVD'])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Application 2: Collaborative filtering\n", "\n", "Another important (and similar) application comes from **recommender systems**. \n", "\n", "Suppose you have a **user-product matrix**: each user puts a rating for a particular product.\n", "\n", "The matrix is then **the number of users times the number of products**. The goal is to recommend additional products to be bought for a particular user. \n", "\n", "The scheme is the same: we compute the SVD, and the recommendation for each user is just a column of the approximated matrix." ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": true, "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "#Read the data\n", "data_read = np.loadtxt('task2_transact_eval.txt',dtype=np.int32, skiprows=1,delimiter='|')" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "collapsed": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "columns = ['SessionNo', 'ItemNo', 'TransType']\n", "ds = pd.DataFrame(data=data_read,columns=columns)" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Unique sessions: 101217 Unique products 15182\n" ] } ], "source": [ "from itertools import product\n", "ds_buy = ds[ds.TransType==2][['SessionNo', 'ItemNo']]\n", "users, inv_users = np.unique(data_read[:, 0], return_inverse=True)\n", "products, inv_products = np.unique(data_read[:, 1], return_inverse=True)\n", "print 'Unique sessions:', len(users), 'Unique products', len(products)\n", "#Scipy spars" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nrFmzoNFoUFZWhn/84x9gjOGpp57CunXr0LNnT9x///3Yu3cv7HY7xo8fD4fDAaPRiIkTJ8Lv92PJ\nkiX48MMPcdZZZ6G4uBgrV66Uxc7zzz8fFRUV+M9//oPdu3dj1KhRKCwslMRh9erVeO6559ChQwd8\n++23WLx4MQDgvvvuw759+8Ku8YEDBzB79mzodDocO3YMc+fOlUU08vPz0bVrV8yfPx8+nw/Tpk0D\nIDhecWO3UCiEO++8EyUlJWF1dNWqVViwYAE6duyIb775Bm+++SYA4N57761nf2vp3r07TCYTHn/8\nccmmOXPmYMaMGbjgggsACA3BOXPmIDs7G4cPH8Zjjz0GxhjmzZuHLVu24JxzzsE999wj7XszadIk\neL1eqNVqTJ06tWnRYElMZWUlu+KKK6Tn3333HXvooYcSYseHH37I7HY7GzJkCGOMsddff50tXLhQ\n+syECRPYrl272GWXXcaqq6sZY4yVlJSwm266iX377bdhdj/22GPsq6++kt3OadOmsR07drBQKMRu\nu+02tnfvXma329mll17KQqEQY4yxzZs3s+nTp7PFixeH2T9x4kS2Y8cONmzYMMn+3377jd1www2y\n23n8+HH2+9//nv3vf/+TXluzZg2bOXOm9Pzpp59my5YtY2PGjGF79+5ljDHm8/nYgAED2KFDh9jI\nkSOlz37wwQdswYIFstq4e/du1qNHD/bLL78wxhgbM2YMmz59Otu5cye76667pM+98sorbPHixWz6\n9OnS7wkGg6x///6stLSUDR8+XPrsN998wx599FHZbNy3bx/r0aMH+/TTT9m8efPY559/zhhjLBQK\nsREjRrCjR4+yIUOGsEAgwBhjbNu2bezuu+9mS5YsYS+++KJ0nilTprDt27ezK664glVWVjLGGCst\nLWXXXnutLHaGQiF2xRVXsL///e9s+/btbNu2bWzdunXsvvvuY4wxNnbsWLZnzx7GWPg1vvXWW6Vz\nfPjhh+z5559njzzyCPvvf/8rnffKK6+U6mtreemll1iPHj1YTU0NGzhwIGNMuPcHDx7MGBPq6KxZ\ns6TPP/nkk1Id3bdvn2T/wIED2S+//MJuu+026bPvvfceKy4ulsXORx99lP3+979nXq+XLV26lF1w\nwQXM6XRK7z/00ENsxYoVjDGhjIYNG8ZKSkrYX//6V8kPbNiwgc2cOZMtWrSIvfbaa9L/3nnnndL9\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import scipy.sparse\n", "import scipy.sparse.linalg\n", "plt.xkcd()\n", "nnz = len(inv_users)\n", "spmat = scipy.sparse.coo_matrix((np.ones(nnz), (inv_users, inv_products)))\n", "r = 2#Approximation rank\n", "u, s, v = scipy.sparse.linalg.svds(spmat, r)\n", "n = spmat.shape[0]\n", "m = spmat.shape[1]\n", "q = np.zeros(n)\n", "user_id = 1\n", "q[user_id] = 1.0\n", "\n", "qrec = q.T.dot(u).dot(np.diag(s)).dot(v)\n", "qrec = qrec / np.max(abs(qrec))\n", "plt.plot(qrec)\n", "qb = spmat.T.dot(q)\n", "plt.plot(qb)\n", "plt.xlabel('Product ID')\n", "plt.ylabel('Recommendation')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Application 3: Dense matrix compression\n", "\n", "Dense matrices typically require $N^2$ elements to be stored. For $N \\sim 10^4 - 10^5$ the memory requirements. A low rank approximation can reduces this number of $\\mathcal{O}(Nr)$" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "collapsed": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n3H///Thw4ADWrVuH1NRUZGVl4ejRo9i/fz9uv/12REdHY9KkSejRowe6du2KJ554AnPnzsXu3btx\n+PDhKnWVmJiITz75BBs2bMDTTz+Nc+fO4emnn8bo0aNr/R4aE0oQddBqtZg3bx4GDx6MVatWCRuY\n0WhE27ZtkZubiwkTJqB169Z45513wBjDiRMn0KZNGyQlJaGiogJnz56FxWLBRx99hLfffhvp6ek4\nduwYDhw4gFGjRlU55jx69GisX78e586dw+HDh2sMOgcOHECXLl2g1Wqxa9cuKJVK5OfnY+DAgTh0\n6BD27NmDqVOnIiMjA926dYPJZMLEiRNrXM9HHnkEe/bswR9//AGn04lDhw4hJSUFf/zxB6xWKzp3\n7oyjR4+iqKgIly5dAgAcPnwYMpms2mPiBw4cwP333y/8LxaLMWrUKCxatAh2ux16vR779u3DnDlz\nMGfOHOzcuVOYNzo6Gm+//TZ++uknPPHEEygqKqr1O+ratesNz02bNg379++Hw+GA2WzGd999h+nT\np+OVV17B4cOHhfm+/vprPP7442jbtu0Ny/j999/RpUsX2Gw2fPfdd1CpVMK6T548GVevXsVnn32G\nlStX4tlnn62xfCdPngQATJkyBcnJyZg1a5bw2vLly/HGG29AJpMJz6WlpSEhIQH//e9/MWLECKxb\ntw47d+7EuHHjkJycjL59+6JXr14YNmxYjZ/pWfatW7dCrVZXSYzXy83NBQB8+OGHWL58OX766Sch\ngBuNRgBAmzZtcPjwYahUqmp3WsRiMQDgiy++QJ8+fbB//35Mnz4d8fHx0Ov1cDqd+OCDDzBlyhQs\nXLgQhYWFALjEmZKSgm+++QavvvoqBgwYgOTkZHz11VeYPn16lWP8YrEYGo3Gq/Mp3bp1w+DBgxEX\nF4d58+YhMjISbdq0EXZ6unTpgitXriA7OxtWq7VKcPf8LE933303vvzyS6xZswajRo1CcnIypkyZ\ngpEjRyI9PR1GoxEKhQJRUVF44YUX0KJFC7z22mv4448/MH/+fMyePVuop1Bw49mwRiorK0v4OzMz\n86Z85ssvv4xvvvkGer0e8+fPx4cffoiTJ0/ijTfeEFoJ+/btw1133YUnnngCjzzyCCwWC06dOoW7\n7roLGo0GL730EmbPno1vv/0Wn332GQDgb3/7G/bv34/c3FwMGjSoymdKpVKEh4dDqVSiqKgId955\n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\n+le88MILWLFihdfr0OAa5ty47/huZYmJiTfl85xOJ9u1axebM2cOe+CBB9jy5ctZcXExY4yxJUuW\nsG7dujGbzcamTZtWYw+Z6xUXFzOLxSL8f+7cOZaSksLmzJnDZsyYwe644w6Wm5srvG40GtnGjRvZ\nDz/8wC5fvszcbjdzOp3s8uXLbODAgVWWbbVa2cKFCxljjO3bt0/ojut2u9lbb71VpXdUbU6cOMH+\n9Kc/sRMnTjDGuB5SK1asqDLPjz/+yPbt28dcLhfbtm0b27x5M8vPz2d2u13ojrpnzx6Wnp7OXnjh\nBTZp0iQ2bNgwduXKFcYY1+3zxx9/ZAUFBaywsLBKnTDGdYEdPnw4+/Of/8xef/11oSw1OXv2LHvm\nmWeY2+1mv//+O5szZw7bvXs3Y4zrXfPzzz+zwsJCVlhYWG3XVLPZzD777DP2/PPPs5deeon973//\nY4xxvXo8e/643W725ptvVnlvcnIy27lzJ2OMsaeeeqrGMq5atara3l5Hjhxhr776Kvvyyy/ZmTNn\nqu3Ou3btWnb+/HnGGGN6vZ49+uijbOzYsbXWSY8ePZhOp6u17J7sdnuVHkyeRo4cKfRos1qtbNOm\nTWz79u2ssLBQ2CYZY2z37t1s9erV7M0332TffvstO3z4sLCMM2fOsOzsbFZYWMiuXr16w2eUlZVV\n2c5++OEHlpGRwXbs2FFlvhUrVrBPP/201nXn6XS6KnXudruZVqtle/fuZY8//niVeQsLC9nq1auF\n/x0OBxs9erTwm/e0ZMkSoRfXhQsX2LBhw9jrr7/OGOPqne9ZlZ2dXeX7zMrKYhMmTPCq7MESaNwU\nMRYa94NISkoS/vbs8dIQcnNzYTab0bNnT6xZswYpKSno2bOnX8s6dOgQtmzZAqVSiUmTJlW5SKs2\npaWliIuL8+lzUlNTq1y45A2r1QqHw1HjyfLa/PTTT9i+fTs6dOiAxx577IYTfsHy97//HVu2bMGt\nt94KqVSK5557zu/vw1NpaSliY2NrPZzz3nvv4a9//StUKhXuu+8+bN26NeDPrQtjDPv376/1vIc3\nZffW999/j+7du99wCKq+8YdT6zov4CvGGMrKyoTfz7Fjx5Camur38qxWK44fP44ePXpg8+bNuOuu\nuxAVFRWs4gYk0LgZMgkiNTUVjDEolcoqx/lI6Ni5c2etPW/8VVRUBMbYTQ9gnhwOB0wmU6MJDPVh\n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\n6HqUfM8AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.xkcd()\n", "n = 256\n", "a = [[1.0/(i + j + 0.5) for i in xrange(n)] for j in xrange(n)]\n", "a = np.array(a)\n", "u, s, v = np.linalg.svd(a)\n", "plt.semilogy(s/s[0])\n", "plt.title('Singular values decay for a Hilbert matrix')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## A more realistic example\n", "We can try to test on a more realistic matrix, since solving linear systems with Hilbert matrix has little practical sense. Instead, we solve a linear system with a matrix\n", "$$A_{ij} = \\frac{1}{i - j + \\frac{1}{2}},$$\n", "which corresponds to an integral equation\n", "$$\n", " \\int \\frac{q(y)dy}{x - y } = f(x).\n", "$$\n", "In real life, the equation \n", "$$\n", " \\int_{\\Omega} \\frac{q(y)dy}{\\Vert x - y\\Vert } = f(x),\n", "$$\n", "is solved, where $\\Omega$ is a surface in 3D. This is used, for example, in modelling integral circuits.\n", "Let us see what happens with the singular values." ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "4.8849813083506888e-15" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n2fLlyxljjH355ZesY8eObP/+/We9tqCggF1++eXM5XKxX3/9lV1yySWsuLiYbd26lV1++eVs69at\n4mesWLGC3XDDDWz27Nnn/K7z5s1jI0aMEP//8ccf2U033cQYY2z69Ols2rRpjDHGnn/+efboo48y\nxhg7evQo69ixI1u6dOlZ73fy5Ek2cuRI5vP5xP979OjB8vPzGWOMvfjii2zy5MnnLM/777/PevXq\nxex2+zmfwy1YsIBdc8017NixY4wxxrZv386uvfZa9r///Y8xxtg//vEPtnjx4mpfG4lE2N13380G\nDx7MTp48yRhjzOv1MsYYCwaDrGPHjuy3335jNpuNXXrppWzz5s2MMcZmzpzJnnvuOfF9Ro4cybZv\n337OMvbr148tXLiw2sceeughds8997BTp06xUCjEnnjiCXb77bezcDjM3njjDTZ06FB2/Phxxhhj\nNpuNLVy4kHXv3p19//335/y8UCjEOnfuzA4dOsTsdjvr3r0727hx4zmfzxgT1+WJEyeySCTCduzY\nwUpLS8XHZ8yYwaZMmcIYE9b/0aNHM8YYczgcbMSIEayiokL8v1evXmzdunWMMcZKSkpY79692ejR\no1kgEGCRSIT5/X7GGGPDhw9ngUAgphxTpkxh+/fvZxs2bGDXXnstC4VCjDHG3nvvPfbqq6+es/w9\nevRg4XBY/H/27Nns448/ZkVFRaxjx45sx44dbN68eaxjx47iesm5XC7Wu3dvdvToUfH3dzqdrG/f\nvuydd94Rtzde7qoOHjzIunbtKn7fcDjMVq1axYYOHcqeffZZ5vP52KxZs9jEiRPZ8OHDWdeuXdlD\nDz3ERo0aVe22wz300EOsY8eOLD8/n91www3sgw8+YD169GCMMTZnzhw2YcIExhhj//znP8Vtd9eu\nXWzMmDHslVdeYT169GA33HADGzVqFMvNzWVHjx5lffv2ZXPnzhXr/Oeff2a5ubls0KBBzOfzse3b\nt7OOHTuyY8eOscGDB4vb+o4dO1iPHj1Yx44dxe1KCmS9D+g///kPDAYDxo0bh5KSErAqJ33gQzmR\nSAQA8O2332Ljxo3ifV27dgVjDIFAAEOHDgUAvPvuu5g7d67Yujh06BA2b94Mj8cDANDr9Xj88cfx\n+uuv48SJE3A4HDAYDOjUqdNZZdu2bRtatWoFk8mESy65BFdffTW+//57dO7cGQqFAu3atQMAFBUV\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import numpy as np\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.xkcd()\n", "n = 256\n", "a = [[1.0/(i - j + 0.5) for i in xrange(n)] for j in xrange(n)]\n", "a = np.array(a)\n", "u, s, v = np.linalg.svd(a)\n", "plt.plot(s)\n", "plt.title('Singular values decay for a Cauchy-Hilbert matrix')\n", "plt.tight_layout()\n", "s[5] - np.pi" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "What to do? \n", "\n", "The idea is to break the matrix intro blocks \n", "\n", "$$\n", " A = \\begin{bmatrix}\n", " A_{11} & A_{12} \\\\\n", " A_{21} & A_{22}\n", " \\end{bmatrix}\n", "$$\n", "\n", "and the blocks $A_{12}$ and $A_{21}$ will be of low-rank! Let us try that.." ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nUPLcK6+8ojzwwAP66zvuuEN59913c1iirkWjUeWpp55S4vG4csoppyibNm1SFi5cqFx33XX638yY\nMZMiZA0AAAXASURBVEN58cUXc1jKnaurq1Nmz56tKIqi3Hnnncorr7yixONx5aSTTlLq6+sVRVGU\n+vp65ZRTTsllMXfK7/crRxxxhPLcc8/py77//nvl3HPP1V+/+OKLyowZM3JRvF3atGmTMmTIEOXD\nDz9UFEVRfvOb3yjnnHOO8vPPPyu/+tWv9L+bN2+e8j//8z+5KmanNm3apAwdOlR56qmnlD//+c/K\nX/7yF/13//3f/60sXbpUOeaYYxSfz6coiqKsW7dOmTJlSq6K26kpU6YoZ5xxhrJs2TJl/vz5ypIl\nS5RLL71UURRFuf7665WPPvpIURRFicViylFHHaVEIpFcFncbzzzzjDJ48GDlp59+Uo466ihFURTF\n5/MpRxxxhKIoivLFF18otbW1+t8/8cQTyt///vedri/vew4fffQRxxxzDKBmvrVr1zJkyJAcl2rX\nTCYTl1xyCc888wxHHHEEVVVVfPjhhxx77LH636xZs4b9998/h6XcuW+//VafnKa6uhqfz8ePP/5I\nWVkZFRUVQH6X/+eff6ahoYHRo0frw2Mff/yxvh+BWv4DDjggV0XcqZKSEkaPHs19993HmWeeyezZ\ns5k6dSoLFy7c5jb5q1evzrv6r6qqoqqqilWrVm3zvW1vb6ehoYFYLMaAAQP0yXny8TMMHz6cVatW\nMXToUMaPH89dd93FzTffDMDixYsZN24coE7gtffee3frLIKpGjZsGACfffaZPrridrsxm820t7ez\nYMGClL4DeZ8cDAYDfr+fWCzGjBkzGDNmTEFMuNHY2MicOXM499xzAfVz+Hw+FEVh1qxZlJWV5WVw\nAnWa03Xr1vHiiy/y1ltv8dBDD7F+/Xr8fj/xeJy1a9fy29/+Vu+65pt3330Xu93Otddey/jx43nk\nkUe2qf/XXnuN9evX52ROkq7YbDYmTZpEfX09I0eOpG/fvsybN0//HgC89957LF68mMmTJ+e4tDvS\nZvnTyhuJRLjnnns455xzKCoq0uf2XrVqFU888QRXXHFFjku8rcTpTF9++WUGDRqkT4Uci8UIhUL4\n/X5uueUWrr322m6Z/jRdWlksFgtOp5P58+czc+ZMNm3axBVXXLHNd+DZZ5/FZrMxcuTIna4v75PD\nlClTeOCBBzjxxBPp3bt3wdzn5A9/+APRaJR3332XDz/8kDPPPJOnnnqK4447jng8rs/FnY9OPvlk\nXnjhBebPn4+iKPzXf/0X48aNY8iQIUycOJH77ruPJ554Iu2pR7vbkiVLOPDAA3n11Ve55557mDNn\nDscddxzvvfcexx13HN9++y0zZszIqy92oiVLltCnTx9uvfVWDjroIHw+HxMmTODLL7/k2GOPZeHC\nhTz++ON5ffv8iy66iCuvvJJTTjmFo48+mjPPPJOBAwdSXl7OxIkT+d3vfsef//xnSktLc13UTjU1\nNTFjxgysVivPPvssGzZs4IILLuDEE0/kggsu4MYbb2T06NG5LmanXC4XI0aMYMaMGWzatAmz2cxt\nt93G6aefzt/+9jeOO+44gsEg99xzzy7XUxD3VtImD8/XHakzM2fOJBgMUlRUhMlk4sorr9TnY9aG\nZgrBn/70J0KhENdeey2gnu1QVVWVt4EV1CGk6667jkmTJvHhhx9yww03cPLJJxOPx6mvr8/bpKbZ\nsmULN998M+vXr2fo0KE88sgj2O12FEVhy5YteV3+2bNns99++zFq1Ch8Ph9GoxGXy7XN3+TzPvTl\nl1+yYcMGDj/8cB588EFqamr4+eefOfHEExk9ejRbtmyhrKws7fm0u1NDQwOvvvoqp5566jaxcsKE\nCcyaNYs+ffroc2ZXVlZ2ub6CSA4id+rr67FarRQXF+e6KCn54IMPWL58OZMnT2afffbJdXGEyJk1\na9boQ2OpkOQghBBiB/k7aCmEECJnJDkIIYTYgSQHIYQQO5DkIIQQYgeSHIQQQuxAkoMQQogd/H/I\nn0DpQrH46AAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import numpy as np\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.xkcd()\n", "n = 256\n", "a = [[1.0/(i - j + 0.5) for i in xrange(n)] for j in xrange(n)]\n", "a = np.array(a)\n", "\n", "a12 = a[:n/2,n/2:]\n", "a21 = a[n/2:,:n/2]\n", "s12 = np.linalg.svd(a12)[1]\n", "s21 = np.linalg.svd(a21)[1]\n", "plt.semilogy(s12)\n", "plt.semilogy(s21)#Actually, they are the same" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Block-low rank matrices\n", "\n", "Surprisingly many matrices in PDEs can be well approximated by block-low-rank (other names: hierarchical, mosaic-skeleton) matrices.\n", "\n", "They have linear storage, but algorithms are not very **simple**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Summary of todays lecture\n", "\n", "- Algorithms for symmetric eigenvalue problems\n", "- Three applications of the SVD\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Next lecture\n", "- Yes, test\n", "- We start **sparse and/or structured** NLA." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Questions?" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open(\"./styles/custom.css\", \"r\").read()\n", " return HTML(styles)\n", "css_styling()" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }