{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "using LinearAlgebra" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Complexity of Matrix Operations\n", "\n", "With a little effort, we can figure out that the **number of arithmetic operations** for an $n\\times n$ matrix **scales proportional to** (for large $n$):\n", "\n", "* $n^2$ for: matrix `*` vector $Ax$, or solving a *triangular* system like $Ux=c$ or $Lc=b$ (back/forward substitution)\n", "* $n^3$ for: matrix `*` matrix $AB$, LU factorization $PA=LU$, or solving a triangular system with $n$ right-hand sides like computing $A^{-1}$ from the LU factorization.\n", "\n", "(In computer science, we would say that these have “complexity” $\\Theta(n^2)$ and $\\Theta(n^3)$, respectively.\n", "\n", "Let's see how these predictions match up to reality:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "using BenchmarkTools # a useful Julia package for performance benchmarking" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Measure the time for LU factorization of 10×10, 100×100, 500×500, 1000×1000, and 2000×2000 random real (double precision) matrices:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5-element Vector{Float64}:\n", " 6.25e-7\n", " 4.5459e-5\n", " 0.002457875\n", " 0.016544833\n", " 0.122767084" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = [10,100,500,1000,2000]\n", "LinearAlgebra.BLAS.set_num_threads(1) # benchmarking on multiple cores is weird\n", "t = [@belapsed(lu($(rand(n,n))), evals=1) for n in n]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's plot it on a log–log scale to see if it is the expected $n^3$ power law:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHJCAYAAABtzYa7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB1rUlEQVR4nO3deZyN9fvH8dcxZjG2sQ5i0GJnMPaMtawpayJr+JLJkiRLspQk30QZJGWskwj1jdKUNWRfU7aGQcNYZxjMcub+/XH/nAxGY7Z7lvfz8TgP7s+5z31f53DM5bNcH5thGAYiIiIiWUg2qwMQERERSWtKgERERCTLUQIkIiIiWY4SIBEREclylACJiIhIlqMESERERLIcJUAiIiKS5SgBEhERkSxHCZCIiIhkOUqARNLItm3bGD9+PNeuXbvvuUaNGtGoUaM0j+lhfvnlF2rUqEHOnDmx2WysXr061e516tQpbDYb//3vfxM8p1SpUjz33HMPfG737t3YbDYCAgL+9V6p/b5u3rzJ+PHj2bhxY4pe946AgABsNhunTp1KleuvXbuW8ePHP/C5UqVK0atXr1S5r0hay251ACJZxbZt25gwYQK9evXCw8Mj3nOzZs2yJqgEGIbBiy++SJkyZfjuu+/ImTMnZcuWtTqsZEuL93Xz5k0mTJgAkCpJbevWrdm+fTtFixZN8WuDmQD5+/s/MAlatWoVefLkSZX7iqQ1JUAi6UCFChWsDiGev//+mytXrtCuXTuaNm2aIte8desWbm5u2Gy2FLleUqTG+0ordz6/QoUKUahQIUtiqFatmiX3FUkNGgITSQPjx4/nzTffBKB06dLYbDZsNptjmOTeIbA7Q0JTp05lypQplCpVihw5ctCoUSOOHTtGTEwMI0eOpFixYuTNm5d27doRFhZ2332XLVtG3bp1yZkzJ7ly5aJ58+bs27fvX2MtXrw4AG+99RY2m41SpUo5nv/1119p2rQpuXPnxt3dnXr16rFmzZp417gzTPPTTz/xyiuvUKhQIdzd3YmKikrCp5cyHva+Tpw4Qe/evXnqqadwd3fnscceo02bNhw6dOi+61y7do033niDxx9/HFdXVwoXLkyrVq34888/OXXqlCM5mTBhguPP+e5ho+R+fvcOgW3cuNFxn3sfd/+5LVu2jGbNmlG0aFFy5MhB+fLlGTlyJJGRkY5zevXqhb+/P0C869y514OGwEJCQujWrRuFCxfG1dWV8uXL89FHHxEXF+c45+4hzmnTplG6dGly5cpF3bp1+e233xL9ZyiSktQDJJIG+vbty5UrV/j0009ZuXKlY/ji33p+/P39qVKlCv7+/o4fvG3atKF27do4Ozvz5Zdfcvr0aYYPH07fvn357rvvHK99//33efvtt+nduzdvv/020dHRTJ06FV9fX3bu3Jngvfv27Yu3tzft27dn0KBBdO3aFVdXVwA2bdrEs88+S5UqVfjiiy9wdXVl1qxZtGnThsDAQDp37hzvWq+88gqtW7dm0aJFREZG4uzsnJyPMVke9r7+/vtvChQowAcffEChQoW4cuUKCxYsoHbt2uzbt88xTHb9+nXq16/PqVOneOutt6hduzY3btxg8+bNhIaGUq9ePX788UdatGhBnz596Nu3L4AjKUqNz6969eps3749Xtvx48fp06cPFStWjNfWqlUrhg4dSs6cOfnzzz+ZMmUKO3fuZP369QCMHTuWyMhIVqxYEe+aCQ23Xbx4kXr16hEdHc27775LqVKl+P777xk+fDgnT568b2jX39+fcuXKMX36dMf9WrVqRXBwMHnz5n34H6BISjNEJE1MnTrVAIzg4OD7nmvYsKHRsGFDx3FwcLABGN7e3obdbne0T58+3QCM559/Pt7rhw4dagBGeHi4YRiGERISYmTPnt0YNGhQvPOuX79uFClSxHjxxRcfGuud+0+dOjVee506dYzChQsb169fd7TFxsYalSpVMooXL27ExcUZhmEY8+fPNwCjR48eD73Pv93vbiVLljRat279wOd27dplAMb8+fOTfR/DMN9TdHS08dRTTxmvv/66o33ixIkGYAQFBSX42osXLxqAMW7cuPueS4nP785zD/p7ZBiGceHCBePxxx83KlasaFy9evWB58TFxRkxMTHGpk2bDMA4cOCA4zk/Pz8joR8NJUuWNHr27Ok4HjlypAEYO3bsiHfeq6++athsNuPo0aOGYfzzuVeuXNmIjY11nLdz504DMAIDAx94P5HUpCEwkXSsVatWZMv2z9e0fPnygDkR9m532kNCQgBYt24dsbGx9OjRg9jYWMfDzc2Nhg0bJmmFUmRkJDt27KBjx47kypXL0e7k5ET37t05e/YsR48ejfeaDh06PPJ9rBAbG8v7779PhQoVcHFx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Z6dmzZoYhpHmE52PHDG3qVi8GKKizLZSpWDoUHjlFbN6s4iISHqgBCgDi42N5b333uPdd98lLi6OJ554gsDAQGqm4aZYhgHr15vze3744Z/22rXN+T3t2pnDXiIiIumJfjTdI6PUAfr777958cUX2bp1KwA9evRg5syZ5E6jbpboaFi2zOzx2b/fbLPZoG1bM/GpV888FhERSY9UBygB6b0O0JUrV/D29iY8PJw5c+bQtWvXNLnv1aswd65ZuPDvv802d3fo3dsc6nryyTQJQ0RE5IFUBygTun37Nq6urthsNvLnz88333xDwYIFefzxx1P93sHBMH06fPEFREaabUWKmJOaBwyA/PlTPQQREZEUo+orGcSBAweoVq0aAQEBjrZatWqlevLz22/QqZPZs/PJJ2byU7kyzJ8Pp07B6NFKfkREJONRApTOGYbBjBkzqFWrFn/++SeTJ08mNjY2Ve9pt8PKlfD001C3LqxYYRYzbNYM1q2DAwegVy+wqK6iiIhIsmkILB27ePEivXv3Zs2aNQC0adOGL7/8kuyptKwqMtLs2Zk+HU6eNNucneHll83ChZUrp8ptRURE0pwSoHQqKCiIHj16cP78eVxdXfnoo48YOHBgqtT2+ftvmDkT5swxJzkD5Mtnbkr62mtQtGiK31JERMRSSoDSoeDgYFq2bIndbqdChQoEBgZSpUqVFL/PwYPmMvalSyEmxmx74gl4/XVziCtnzhS/pYiISLqgBCgdKl26NCNHjuTy5ct89NFHuLu7p9i1DQN++sksXBgU9E/700+b9Xuefx4s2jpMREQkzWTaOkDXr1+nSZMmxMTEYLfbGTx4MP369Uv069O6DtDixYupXbs2Tz31FECKb2URFQVLlpg9Pr//brZlywYdOpiJT+3aKXYrERERy2T5OkDu7u5s2rQJd3d3bt68SaVKlWjfvj0FChSwOrR4IiIiGDhwIEuWLMHHx4dt27bh4uKSYsnP5cswe7Y5x+fCBbMtVy7o0weGDIHSpVPkNiIiIhlKpk2AnJycHENHt2/fxm63k946u3bs2EHXrl3566+/cHJyom3btim2e/vx4/DxxxAQALdumW2PPQaDB8N//gMeHilyGxERkQwp3dYB2rx5M23atKFYsWLYbDZWr1593zmzZs2idOnSuLm54ePjw5YtW+I9f+3aNby9vSlevDgjRoygYMGCaRT9w9ntdiZPnkz9+vX566+/KFmyJJs3b+btt99OVgJkGLBli7kfV9myZs/PrVtQtSosWgR//QUjRij5ERERSbcJUGRkJN7e3sycOfOBzy9btoyhQ4cyZswY9u3bh6+vLy1btiQkJMRxjoeHBwcOHCA4OJilS5dy4c4YkIWuXLlCs2bNGD16NLGxsXTu3Jn9+/dTr169JF8zNtbcmLR2bWjQAL791kyGWrWCX36BvXuhWzdwcUnBNyIiIpKBZYhJ0DabjVWrVtG2bVtHW+3atalevTqzZ892tJUvX562bdsyefLk+67x6quv0qRJEzp16vTAe0RFRREVFeU4joiIoESJEik+CTomJob69etz+PBhZs6cSa9evZI83+f6dXNvrunT4fRps83VFXr0MJeyly+fYmGLiIhkCJl6EnR0dDR79uxh5MiR8dqbNWvGtm3bALhw4QI5cuQgT548REREsHnzZl599dUErzl58mQmTJiQqnEDODs7ExgYSExMDGXLlk3SNc6eNfflmjsXwsPNtoIFwc8PBg6EwoVTMGAREZFMKEMmQJcuXcJut+Pp6Rmv3dPTk/PnzwNw9uxZ+vTpg2EYGIbBa6+99tBigqNGjWLYsGGO4zs9QKkhqRuY7ttn1u9Ztswc9gJzrs+wYdC9O+TIkYJBioiIZGIZMgG6496ho7tr5/j4+LB///5EX8vV1RVXV1f8/f3x9/fHbrenZKhJFhcHa9eaic/Gjf+0N2pk1u9p1cqs5yMiIiKJlyEToIIFC+Lk5OTo7bkjLCzsvl6hR+Xn54efn59jDNEqt26ZK7c+/hj+/NNsc3KCzp3NHh8fH8tCExERyfAyZN+Bi4sLPj4+BN29lwPmBqLJWU0F4O/vT4UKFahZs2ayrvMgdrvZixMYaP76oE6msDAYPx5KloT+/c3kJ08eGD4cgoPNas5KfkRERJIn3fYA3bhxgxMnTjiOg4OD2b9/P/nz58fLy4thw4bRvXt3atSoQd26dZk7dy4hISEMGDAgWfdNrR6glSvNystnz/7TVrw4zJgB7dubic60abBwobltBYCXFwwdalZtToPdOERERLKMdJsA7d69m8aNGzuO70xQ7tmzJwEBAXTu3JnLly8zceJEQkNDqVSpEmvXrqVkyZJWhZyglSuhY0ezNs/dzp0z9+KqXt2s1XNHzZrm/J4OHSB7uv0TEhERybgyRB2gtHT3JOhjx44luw6Q3Q6lSsXv+UnICy+YiU/9+pCC+6CKiIhkGYmtA6QEKAEptRv8xo1wV0dWghYuNJeyi4iISNIl9ud3hpwEnZGEhibuPA11iYiIpB0lQPdI6VVgRYum7HkiIiKSfBoCS0BKDYHdmQN07tz9k6DBnOtTvLi5xD0ZG8GLiIgIGgJLN5yczKXucP/E5jvH06cr+REREUlLSoDSQPv2sGIFPPZY/Pbixc329u2tiUtERCSr0tTbe6TWXmDt25vL3LdsMSdGFy0Kvr7q+REREbGC5gAlIKXmAImIiEja0RwgERERkQQoARIREZEsRwnQPVJzN3gRERFJHzQHKAGaAyQiIpLxaA6QiIiISAKUAImIiEiWowRIREREshwlQCIiIpLlKAG6h1aBiYiIZH5aBZaA8PBwPDw8OHPmjFaBiYiIZBARERGUKFGCa9eukTdv3gTP015gCbh+/ToAJUqUsDgSEREReVTXr19/aAKkHqAExMXF8ffff5M7d25sNhs1a9Zk165d//q6fzvvTmaaVXqWEvu5pYXUjiUlr5/cayXl9Y/yGn0fkkbfB2uupe9D+pRafwcNw+D69esUK1aMbNkSnumjHqAEZMuWjeLFizuOnZycEvUXMrHn5cmTJ0v8BU/s55EWUjuWlLx+cq+VlNc/ymv0fUgafR+suZa+D+lTav4dfFjPzx2aBJ1Ifn5+KXpeVpGePo/UjiUlr5/cayXl9Y/yGn0fkiY9fR76PqTca/R9SBqrPw8NgaUxbbEh8g99H0T+oe9D2lIPUBpzdXVl3LhxuLq6Wh2KiOX0fRD5h74PaUs9QCIiIpLlqAdIREREshwlQCIiIpLlKAESERGRLEcJkIiIiGQ5SoBEREQky1EClM60a9eOfPny0bFjR6tDEbHUmTNnaNSoERUqVKBKlSosX77c6pBELHP9+nVq1qxJ1apVqVy5Mp9//rnVIWV4WgafzmzYsIEbN26wYMECVqxYYXU4IpYJDQ3lwoULVK1albCwMKpXr87Ro0fJmTOn1aGJpDm73U5UVBTu7u7cvHmTSpUqsWvXLgoUKGB1aBmWeoDSmcaNG5M7d26rwxCxXNGiRalatSoAhQsXJn/+/Fy5csXaoEQs4uTkhLu7OwC3b9/Gbrej/ovkUQKUgjZv3kybNm0oVqwYNpuN1atX33fOrFmzKF26NG5ubvj4+LBly5a0D1QkDaTk92H37t3ExcVRokSJVI5aJHWkxPfh2rVreHt7U7x4cUaMGEHBggXTKPrMSQlQCoqMjMTb25uZM2c+8Plly5YxdOhQxowZw759+/D19aVly5aEhISkcaQiqS+lvg+XL1+mR48ezJ07Ny3CFkkVKfF98PDw4MCBAwQHB7N06VIuXLiQVuFnToakCsBYtWpVvLZatWoZAwYMiNdWrlw5Y+TIkfHaNmzYYHTo0CG1QxRJM0n9Pty+fdvw9fU1Fi5cmBZhiqSJ5Px8uGPAgAHG119/nVohZgnqAUoj0dHR7Nmzh2bNmsVrb9asGdu2bbMoKhFrJOb7YBgGvXr1okmTJnTv3t2KMEXSRGK+DxcuXCAiIgIwd43fvHkzZcuWTfNYM5PsVgeQVVy6dAm73Y6np2e8dk9PT86fP+84bt68OXv37iUyMpLixYuzatUqatasmdbhiqSqxHwftm7dyrJly6hSpYpjvsSiRYuoXLlyWocrkqoS8304e/Ysffr0wTAMDMPgtddeo0qVKlaEm2koAUpjNpst3rFhGPHa1q1bl9YhiVjmYd+H+vXrExcXZ0VYIpZ42PfBx8eH/fv3WxBV5qUhsDRSsGBBnJyc4vX2AISFhd2X9Ytkdvo+iPxD3wdrKAFKIy4uLvj4+BAUFBSvPSgoiHr16lkUlYg19H0Q+Ye+D9bQEFgKunHjBidOnHAcBwcHs3//fvLnz4+XlxfDhg2je/fu1KhRg7p16zJ37lxCQkIYMGCAhVGLpA59H0T+oe9DOmTlErTMZsOGDQZw36Nnz56Oc/z9/Y2SJUsaLi4uRvXq1Y1NmzZZF7BIKtL3QeQf+j6kP9oLTERERLIczQESERGRLEcJkIiIiGQ5SoBEREQky1ECJCIiIlmOEiARERHJcpQAiYiISJajBEhERESyHCVAIiIikuUoARIREZEsRwmQiGQaAQEBeHh4pNr1GzVqxNChQ1Pt+iKSdrQVhoika7169eLatWusXr36X8+9desW169fp3DhwqkSy5UrV3B2diZ37typcn0RSTvaDV5EMoWYmBhy5MhBjhw5Uu0e+fPnT7Vri0ja0hCYiKSIRo0aMWjQIIYOHUq+fPnw9PRk7ty5REZG0rt3b3Lnzs0TTzzBDz/84HiN3W6nT58+lC5dmhw5clC2bFlmzJjheH78+PEsWLCAb7/9FpvNhs1mY+PGjZw6dQqbzcbXX39No0aNcHNzY/HixfGGwAzD4JlnnqFFixbc6ei+du0aXl5ejBkzJsH3MWvWLJ566inc3Nzw9PSkY8eO8d7jnSGwjRs3OmK6+9GrVy/H+f/73//w8fHBzc2Nxx9/nAkTJhAbG5vgvXv16kXbtm3573//S9GiRSlQoAB+fn7ExMQ8yh+FiCSCEiARSTELFiygYMGC7Ny5k0GDBvHqq6/SqVMn6tWrx969e2nevDndu3fn5s2bAMTFxVG8eHG+/vprjhw5wjvvvMPo0aP5+uuvARg+fDgvvvgiLVq0IDQ0lNDQUOrVq+e431tvvcXgwYP5448/aN68ebxYbDYbCxYsYOfOnXzyyScADBgwAE9PT8aPH//A+Hfv3s3gwYOZOHEiR48e5ccff6RBgwYPPLdevXqOmEJDQ1m/fj1ubm6O89etW0e3bt0YPHgwR44c4bPPPiMgIIBJkyY99DPcsGEDJ0+eZMOGDSxYsICAgAACAgL+9bMXkUdkiIikgIYNGxr169d3HMfGxho5c+Y0unfv7mgLDQ01AGP79u0JXmfgwIFGhw4dHMc9e/Y0XnjhhXjnBAcHG4Axffr0eO3z58838ubNG6/t66+/NlxdXY1Ro0YZ7u7uxtGjRxO89zfffGPkyZPHiIiISPA9Dhky5L72S5cuGU888YQxcOBAR5uvr6/x/vvvxztv0aJFRtGiRRO8f8+ePY2SJUsasbGxjrZOnToZnTt3TvA1IpI0mgMkIimmSpUqjt87OTlRoEABKleu7Gjz9PQEICwszNE2Z84c5s2bx+nTp7l16xbR0dFUrVo1UferUaPGv57TqVMnVq1axeTJk5k9ezZlypRJ8Nxnn32WkiVL8vjjj9OiRQtatGhBu3btcHd3T/A1MTExdOjQAS8vr3jDd3v27GHXrl3xenzsdju3b9/m5s2bCV6zYsWKODk5OY6LFi3KoUOH/vV9isij0RCYiKQYZ2fneMc2my1em81mA8yhL4Cvv/6a119/nVdeeYWffvqJ/fv307t3b6KjoxN1v5w5c/7rOTdv3mTPnj04OTlx/Pjxh56bO3du9u7dS2BgIEWLFuWdd97B29uba9euJfiaV199lZCQEJYvX0727P/8nzIuLo4JEyawf/9+x+PQoUMcP34cNze3BK/3oM/wzuclIilHPUAiYpktW7ZQr149Bg4c6Gg7efJkvHNcXFyw2+1Jvscbb7xBtmzZ+OGHH2jVqhWtW7emSZMmCZ6fPXt2nnnmGZ555hnGjRuHh4cH69evp3379vedO23aNJYtW8b27dspUKBAvOeqV6/O0aNHefLJJ5Mcu4ikHiVAImKZJ598koULF7Ju3TpKly7NokWL2LVrF6VLl3acU6pUKdatW8fRo0cpUKAAefPmTfT116xZw5dffsn27dupXr06I0eOpGfPnhw8eJB8+fLdd/7333/PX3/9RYMGDciXLx9r164lLi6OsmXL3nfuzz//zIgRI/D396dgwYKcP38egBw5cpA3b17eeecdnnvuOUqUKEGnTp3Ili0bBw8e5NChQ7z33ntJ+LREJCVpCExELDNgwADat29P586dqV27NpcvX47XGwTQr18/ypYtS40aNShUqBBbt25N1LUvXrxInz59GD9+PNWrVwdg3LhxFCtWjAEDBjzwNR4eHqxcuZImTZpQvnx55syZQ2BgIBUrVrzv3F9//RW73c6AAQMoWrSo4zFkyBAAmjdvzvfff09QUBA1a9akTp06TJs2jZIlSz7KRyQiqUSVoEVERCTLUQ+QiIiIZDlKgERERCTLUQIkIiIiWY4SIBEREclylACJiIhIlqMESERERLIcJUAiIiKS5SgBEhERkSxHCZCIiIhkOUqAREREJMtRAiQiIiJZzv8B4ZiF2ZAx1Z0AAAAASUVORK5CYII=", "text/plain": [ "Figure(PyObject
)" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "┌ Warning: `vendor()` is deprecated, use `BLAS.get_config()` and inspect the output instead\n", "│ caller = npyinitialize() at numpy.jl:67\n", "└ @ PyCall /Users/stevenj/.julia/packages/PyCall/L0fLP/src/numpy.jl:67\n" ] }, { "data": { "text/plain": [ "PyObject Text(0.5, 1.0, 'time for LU factorization')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using PyPlot\n", "loglog(n, t*1e9, \"bo-\")\n", "loglog(n, n.^3, \"k--\")\n", "xlabel(\"matrix size n\")\n", "ylabel(\"time (ns)\")\n", "legend([\"time\", L\"n^3\"])\n", "title(\"time for LU factorization\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's pretty close! For large $n$, you can see it starting to go parallel to the $n^3$ line.\n", "\n", "Let's also look at the time to *solve* $LUx=b$ when we are *given* the LU factors, which we predict should grow $\\sim n^2$:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5-element Vector{Float64}:\n", " 2.193675889328063e-7\n", " 2.463e-6\n", " 5.1167e-5\n", " 0.000196583\n", " 0.001126875" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = [@belapsed($(lu(rand(n,n))) \\ $(rand(n))) for n in n]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjoAAAHJCAYAAACMppPqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAA9hAAAPYQGoP6dpAABpcUlEQVR4nO3de3yP9f/H8cdnZxs2jLE2xyJyNkTOlUNRckzMHIskQkonklKpHH5GpMzZEFIph2/Oijmm9lVkTpnzYbZhtl2/P66vaTnN7LNr+3ye99ttN13vz7Xrem7rYy/v632wGYZhICIiIuKAXKwOICIiImIvKnRERETEYanQEREREYelQkdEREQclgodERERcVgqdERERMRhqdARERERh6VCR0RERByWCh0RERFxWCp0RBzE5s2bGTFiBOfPn7/htUaNGtGoUaNsz3Q7//nPfwgJCcHHxwebzcbSpUvtdq+DBw9is9n45JNPbnlOyZIladmy5U1f27ZtGzabjYiICDslvFFERAQ2m42DBw9m2z1FHJGb1QFEJGts3ryZd999l27duuHn55futUmTJlkT6hYMw6BDhw6ULVuWZcuW4ePjQ7ly5ayOJSIOSIWOiBOoUKGC1RHSOXbsGGfPnuWZZ57h0UcfzZJrXrp0CS8vL2w2W5ZcT0Qcgx5diTiAESNG8OqrrwJQqlQpbDYbNpuNtWvXAjc+urr2KGfMmDF89NFHlCxZkjx58tCoUSP+/PNPrl69yuuvv05gYCC+vr4888wznDx58ob7RkZGUqdOHXx8fMibNy/NmjVj586dd8waFBQEwGuvvYbNZqNkyZJpr2/cuJFHH32UfPny4e3tTd26dfn+++/TXePaY52VK1fSo0cPChcujLe3N1euXMnEdy/rJCYmMmTIEEqVKoWXlxcFCxYkJCSEefPmpTtv2bJl1KlTB29vb/Lly8fjjz/Ozz//fNtrDxw4EB8fH+Li4m54rWPHjgQEBHD16tW0tsz8bEQckQodEQfQq1cv+vfvD8DixYv5+eef+fnnn6levfptPy88PJxNmzYRHh7OtGnT2Lt3L61ataJnz56cOnWKr776io8//pjVq1fTq1evdJ/7wQcf0KlTJypUqMCCBQuYNWsWFy9epH79+kRHR9826+LFiwHo378/P//8M0uWLAFg3bp1NGnShAsXLvDll18yb9488uXLR6tWrYiMjLzhWj169MDd3Z1Zs2axaNEi3N3d7+r7ltUGDRrE5MmTefnll/nxxx+ZNWsW7du358yZM2nnzJ07l6effpr8+fMzb948vvzyS86dO0ejRo3YuHHjLa/do0cPEhMTWbBgQbr28+fP880339ClS5e0rz+zPxsRh2SIiEMYM2aMARgxMTE3vNawYUOjYcOGaccxMTEGYFSpUsVISUlJax83bpwBGE899VS6zx84cKABGBcuXDAMwzAOHz5suLm5Gf3790933sWLF42iRYsaHTp0uG3Wa/cfM2ZMuvaHH37YKFKkiHHx4sW0tuTkZKNixYpGUFCQkZqaahiGYUyfPt0AjK5du972Pne63z+VKFHCePLJJ2/6WlRUlAEY06dPv+19KlasaLRu3fqWr6ekpBiBgYFGpUqV0n3fL168aBQpUsSoW7duWtu1r/GfP8/q1aunO8cwDGPSpEkGYOzZs8cwjHv/2Yg4GvXoiDixJ554AheX638NlC9fHoAnn3wy3XnX2g8fPgzAihUrSE5OpmvXriQnJ6d9eHl50bBhw7RHZncjISGBLVu20K5dO/LmzZvW7urqSmhoKEePHuWPP/5I9zlt27a96/vYU61atfjhhx94/fXXWbt2LZcuXUr3+h9//MGxY8cIDQ1N933Pmzcvbdu25ZdffiExMfGW1+/evTubN29O932YPn06NWvWpGLFioB9fjYiuZkKHREnVrBgwXTHHh4et22/fPkyACdOnACgZs2auLu7p/uIjIzk9OnTd53l3LlzGIZBsWLFbngtMDAQIN0jIOCm52aWm5sbKSkpN30tOTkZ4I6PxiZMmMBrr73G0qVLady4MQULFqR169bs27cPuJ7/Vl9jamoq586du+X1O3fujKenZ9o09+joaKKioujevXvaOfb42YjkZpp1JSJ3zd/fH4BFixZRokSJLLlmgQIFcHFxITY29obXjh07lu6+12TlDKuAgAD+/vvvm752rT0gIOC21/Dx8eHdd9/l3Xff5cSJE2m9O61atWLv3r0UKlQI4JZfo4uLCwUKFLjl9QsUKMDTTz/NzJkzGTVqFNOnT8fLy4tOnTqlnWOPn41IbqZCR8RBeHp6AtzwuMQemjVrhpubG3/99VeWPT7y8fGhdu3aLF68mE8++YQ8efIAkJqayuzZswkKCqJs2bJZcq+beeyxx3jvvfeIjo6+YTr+ggULyJs3L7Vr187w9QICAujWrRu7d+9m3LhxJCYmUq5cOe677z7mzp3LkCFD0gq1hIQEvv7667SZWLfTvXt3FixYwPLly5k9ezbPPPNMunWT7PGzEcnNVOiIOIhKlSoBMH78eMLCwnB3d6dcuXLky5cvy+9VsmRJRo4cyZtvvsmBAwdo3rw5BQoU4MSJE2zdujWtZ+NujR49mscff5zGjRszZMgQPDw8mDRpEr/99hvz5s275x6cPXv2sGjRohvaa9asyYABA5g5cyaNGjXijTfeoFKlSpw7d47IyEgWLVrEZ599dsfvZe3atWnZsiWVK1emQIEC/Pe//2XWrFnpCpiPP/6Yzp0707JlS1544QWuXLnCmDFjOH/+PB9++OEdv4amTZsSFBTEiy++yPHjx9M9tgL7/WxEci2rR0OLSNYZNmyYERgYaLi4uBiAsWbNGsMwbj3r6t+zkNasWWMAxsKFC9O1X5sBFBUVla596dKlRuPGjY38+fMbnp6eRokSJYx27doZq1evvm3O282C2rBhg9GkSRPDx8fHyJMnj/Hwww8b3377bYby3Ol+t/q4Npvq+PHjRt++fY3ixYsbbm5uRr58+Yx69erd8P24lddff90ICQkxChQoYHh6ehqlS5c2XnnlFeP06dPpzlu6dKlRu3Ztw8vLy/Dx8TEeffRRY9OmTTf9Gm82i+6NN94wACM4ODjd7K1/3yMzPxsRR2MzDMOwoL4SERERsTvNuhIRERGHpUJHREREHJYKHREREXFYKnRERETEYanQEREREYelQkdEREQcltMvGJiamsqxY8fIly9fli4nLyIiIvZjGAYXL14kMDAw3Sa5/+b0hc6xY8cIDg62OoaIiIhkwpEjRwgKCrrl605f6Fxb0v3IkSPkz5/f4jQiIiKSEXFxcQQHB99xaxanL3SuPa7Knz+/Ch0REZFc5k7DTpx2MHJ4eDgVKlSgZs2aVkcRERERO3H6va7i4uLw9fXlwoUL6tERERHJJTL6+9vpH11lRGpqKklJSVbHyHXc3d1xdXW1OoaIiDgxFTp3kJSURExMDKmpqVZHyZX8/PwoWrSopu6LiIglVOjchmEYxMbG4urqSnBw8G3n6Ut6hmGQmJjIyZMnAShWrJjFiURExBmp0LmN5ORkEhMTCQwMxNvb2+o4uU6ePHkAOHnyJEWKFNFjLBERyXZO20WRkVlXKSkpAHh4eGRXLIdzrUC8evWqxUlERMQZOW2h069fP6Kjo4mKirrjuRpfknn63omIiJWcttARERERx6dCR0RERByWCp1skJICa9fCvHnmn/8b+pNt1q5di81m4/z589l7YxEREYup0LGzxYuhZElo3Biee878s2RJs91eGjVqxMCBA9OO69atS2xsLL6+vva7qYiISA6kQseOFi+Gdu3g6NH07X//bbbbs9j5Jw8PDy3aJyIiTslpC53MbOppGJCQkLGPuDh4+WXzc252HYABA8zzMnK9jO5I1q1bN9atW8f48eOx2WzYbDYiIiLSPbqKiIjAz8+P7777jnLlyuHt7U27du1ISEhgxowZlCxZkgIFCtC/f/+0KfZgrhI9dOhQ7rvvPnx8fKhduzZr167N8PdPREQkuzntgoH9+vWjX79+aZuCZURiIuTNmzX3NwyzpyejT5Pi48HH587njR8/nj///JOKFSsycuRIAH7//fcbzktMTGTChAnMnz+fixcv0qZNG9q0aYOfnx/Lly/nwIEDtG3blnr16tGxY0cAunfvzsGDB5k/fz6BgYEsWbKE5s2bs2fPHh544IEMf+0iIuK4vvvuOyZOnMg333yDp6en1XGct0fHUfn6+uLh4YG3tzdFixalaNGiN12R+OrVq0yePJlq1arRoEED2rVrx8aNG/nyyy+pUKECLVu2pHHjxqxZswaAv/76i3nz5rFw4ULq169PmTJlGDJkCPXq1WP69OnZ/WWKiEgOk5SUxODBg2nVqhUrVqxgwoQJVkcCnLhHJzO8vc2elYxYvx6eeOLO5y1fDg0aZOzeWcnb25syZcqkHQcEBFCyZEny/qPLKiAgIG2vqh07dmAYBmXLlk13nStXrlCoUKGsDSciIrnKwYMHefbZZ9myZQsAAwYM4OWXX7Y4lUmFzl2w2TL2+AigaVMICjIHHt9sfI3NZr7etClYsQWUu7v7v/LYbtp2bdf21NRUXF1d2b59+w09RHmz6nmeiIjkOkuXLqV79+6cP38ePz8/pk+fTuvWra2OlUaFjp24usL48ebsKpstfbFzbfLTuHH2KXI8PDzSDSLOCtWqVSMlJYWTJ09Sv379LL22iIjkThMmTGDAgAEA1K5dm/nz51OyZElrQ/2LxujYUZs2sGgR3Hdf+vagILO9TRv73LdkyZJs2bKFgwcPcvr06bRemXtRtmxZOnfuTNeuXVm8eDExMTFERUXx0UcfsXz58ixILSIiuU3Lli3x9fVlyJAhbNiwIccVOaBCx+7atIGDB2HNGpg71/wzJsZ+RQ7AkCFDcHV1pUKFChQuXJjDhw9nyXWnT59O165dGTx4MOXKleOpp55iy5YtBAcHZ8n1RUQk5/vnTN7SpUvz559/MmbMmBuGP+QUNsPI6Aotjuna9PILFy6QP3/+dK9dvnyZmJgYSpUqhZeXl0UJczd9D0VEHMPly5cZNGgQn3/+OT/++CNNmza1NM/tfn//k9P26GRmwUARERFn9Oeff/Lwww8zefJkDMNg586dVkfKMKctdPr160d0dDRRUVFWRxEREcmx5s6dS40aNdi9ezeFCxfmxx9/5LXXXrM6VoY5baEjIiIit5aYmEjv3r3p3Lkz8fHxNGzYkF27dtGsWTOro90VFToiIiJygx9++IFp06Zhs9l45513WL16NYGBgVbHumtaR0dERERu0LZtWwYPHkyLFi149NFHrY6TaerRERERERISEhg0aBCnT59Oa/vkk09ydZED6tERERFxer/99hvt27dn79697N+/n2XLllkdKcuoR0dERMRJGYbBtGnTqFmzJnv37iUwMJDBgwdbHStLqUdHRETECV28eJE+ffowd+5cAJo1a8asWbMoXLiwxcmylnp0REREnMy+ffsICQlh7ty5uLq6Mnr0aJYvX+5wRQ6o0HFaR44coVGjRlSoUIHKlSuzcOFCqyOJiEg2KVKkCFevXiUoKIh169bx+uuv4+LimCWBHl05KTc3N8aNG0fVqlU5efIk1atX54knnsDHx8fqaCIiYgcJCQl4e3tjs9nw9fXlu+++IyAggEKFClkdza4cs3yTOypWrBhVq1YFzMq+YMGCnD171tpQIiJiF9u2baNy5cp8/vnnaW0VKlRw+CIHnLjQ0aae123bto3U1FSCg4OtjiIiIlnIMAwmTJhA3bp1OXDgAOPHj+fq1atWx8pWTlvoaFNP05kzZ+jatStTp061OoqIiGShc+fO0bZtWwYMGMDVq1dp3bo1P//8M+7u7lZHy1ZOW+g4uv3792Oz2fj+++959NFH8fb2ply5cmzZsiXtnCtXrvDMM88wbNgw6tata2FaERHJSlu2bKFatWosWbIEd3d3xo8fz+LF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9OjR95xFROxn9erVVKlShZ9++gkfHx9mzpzJ22+/bXWsbPH339CsGbzyivnY6oknzN3Gn37a6mQiji9ThU6XLl1Ys2YNZcqUIV++fBQsWDDdx91ISEigSpUqTJw48aavR0ZGMnDgQN5880127txJ/fr1adGiBYcPHwbgm2++oWzZspQtWzZD97ty5QpxcXHpPkTEfpKTk3nrrbdo2rQpJ0+epFKlSmzbto3Q0FCro2WLhQuhUiVYvRry5IFJk+C776BoUauTiTiHTG0BcaeVSsPCwjIXxmZjyZIltG7dOq2tdu3aVK9encmTJ6e1lS9fntatWzN69GiGDRvG7NmzcXV1JT4+nqtXrzJ48GDeeeedm97j2tT4f9MWECL28fnnn9O3b18Ann/+ecaNG0eePHksTmV/cXHQvz/MnGke16gBc+ZAuXLW5hJxFBndAuKedi/Pav8udJKSkvD29mbhwoU888wzaecNGDCAXbt2se7a8qH/ExERwW+//XbbWVdXrlzhypUracdxcXEEBwer0BGxk+TkZJ566ilCQ0Pp1KmT1XGyxYYN5rTxgwfBxQWGDYN33gEPD6uTiTiOLN+9PC4uLu1Cd3rck1UFw+nTp0lJSSEgICBde0BAAMePH8/UNT09PfH09MyKeCJyE1evXmXy5Mn06dMHDw8P3Nzc+P77751i2nhSErz7Lnz4oTn4uGRJmDULctAEVRGnk+FCp0CBAsTGxlKkSBH8/Pxu+peWYRjYbDZSUlKyNOS/73XtPv/WrVu3LL2viNydw4cP06lTJzZv3kxMTAxjx44FbnwPO6K9e81p49fWSw0LgwkTQB3FItbKcKHz008/pQ00XrNmjd0C/ZO/vz+urq439N6cPHnyhl6euxUeHk54eHiWF2Uizurbb7+lW7dunD17lvz58/PII49YHSlbGAZMngxDhsClS1CggDllvF07q5OJCNxFodOwYcO0/y5VqhTBwcE37Wk5cuRIloXz8PCgRo0arFq1Kt0YnVWrVvH0Pc7L7NevH/369Ut7xicimZOUlMSwYcP47LPPAAgJCSEyMtIpNv49fhx69IAffjCPH38cpk+H++6zNpeIXJeplZFLlSqV9hjrn86ePUupUqXuqpckPj6e/fv3px3HxMSwa9cuChYsSPHixRk0aBChoaGEhIRQp04dpk6dyuHDh+nTp09mootI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+1rb5Mnmn/e6qN/dMgyDyZMnc+bMGWrUqEFkZCRlypSx701FRERyABU6WWTDhvSPq26lTx94993ML+qXGTabjenTpzN+/HjeeustPD09s+/mIiIiFnKxOoCj+OdMqdtp0CB7ipxly5YxcODAtGN/f3/ee+89FTkiIuJU1KOTRYoVy9rzMispKYnXXnuNcePGAdC4cWOefvpp+95UREQkh1Khk0Xq1zdnV/39983H6dhs5uv169svw4EDB+jYsSPbtm0DYPDgwbRo0cJ+NxQREcnhnPbRVXh4OBUqVKBmzZpZcj1XV3MKOdy459S143Hj7DfweNGiRVSrVo1t27ZRsGBBli1bxieffIKHPeapi4iI5BLaAiKLt4C42To6wcFmkXNtHZ2s9vbbbzNq1CgA6taty/z58wkODrbPzURERHIAbQFhkTZtzKnjGVkZOavUr18fFxcXhg4dysiRI3F3d7ffzURERHIR9ejksE09M+rvv//mvvvuSzvev38/999/v4WJREREsk9Gf3877Rid3OrSpUu88MILPPTQQxw4cCCtXUWOiIjIjfToKhfZu3cvHTp0YM+ePdhsNv7zn/9QunRpq2OJiIjkWOrRySVmzZpFSEgIe/bsISAggJUrV9K7d2+rY4mIiORoKnRyuISEBHr06EHXrl1JSEigSZMm7Nq1i8cee8zqaCIiIjmeCp0cbsKECUyfPh0XFxfeffddVq5cSdGiRa2OJSIikitojE4ON2jQIH755RdeeeUVGjVqZHUcERGRXEU9OjlMfHw8H3zwAcnJyQB4enryzTffqMgRERHJBPXo5CC7d++mQ4cO/PnnnyQmJqatdiwiIiKZox6dHMAwDKZMmULt2rX5888/CQoKonnz5lbHEhERyfXUo2OxuLg4nn/+eSIjIwF48skniYiIwN/f3+JkIiIiuZ96dCy0e/duqlevTmRkJG5ubowZM4Zly5apyBEREcki6tGxkLu7O7GxsZQoUYL58+fz8MMPWx1JRETEoajQyWbJycm4uZnf9goVKrBs2TKqV69OgQIFLE4mIiLieHL9o6sjR47QqFEjKlSoQOXKlVm4cKHVkW5p69atlC9fno0bN6a1PfrooypyRERE7CTXFzpubm6MGzeO6OhoVq9ezSuvvEJCQoLVsdIxDIOxY8dSr1499u/fz1tvvWV1JBEREaeQ6x9dFStWjGLFigFQpEgRChYsyNmzZ/Hx8bE4mens2bN0796dZcuWAdCuXTumTZtmcSoRERHnYHmPzvr162nVqhWBgYHYbDaWLl16wzmTJk2iVKlSeHl5UaNGDTZs2HDTa23bto3U1FSCg4PtnDpjNm/eTNWqVVm2bBmenp5MmjSJBQsW4Ovra3U0ERERp2B5oZOQkECVKlWYOHHiTV+PjIxk4MCBvPnmm+zcuZP69evTokULDh8+nO68M2fO0LVrV6ZOnXrb+125coW4uLh0H/awc+dOGjRowJEjR3jggQf45Zdf6Nu3LzabzS73ExERkRvZDMMwrA5xjc1mY8mSJbRu3TqtrXbt2lSvXp3JkyentZUvX57WrVszevRowCxeHn/8cXr37k1oaOht7zFixAjefffdG9ovXLhA/vz5s+YLwRyX0759ezw8PJgyZQr58uXLsmuLiIg4u7i4OHx9fe/4+9vyHp3bSUpKYvv27TRt2jRde9OmTdm8eTNgFhTdunWjSZMmdyxyAIYNG8aFCxfSPo4cOWKX7DabjTlz5jBnzhwVOSIiIhbJ0YORT58+TUpKCgEBAenaAwICOH78OACbNm0iMjKSypUrp43vmTVrFpUqVbrpNT09PfH09LRr7n/eS0RERKyTowuda/49rsUwjLS2evXqkZqaakUsERERyeFy9KMrf39/XF1d03pvrjl58uQNvTx3Kzw8nAoVKlCzZs17uo6IiIjkXDm60PHw8KBGjRqsWrUqXfuqVauoW7fuPV27X79+REdHExUVdU/XERERkZzL8kdX8fHx7N+/P+04JiaGXbt2UbBgQYoXL86gQYMIDQ0lJCSEOnXqMHXqVA4fPkyfPn0sTC0iIiK5geWFzrZt22jcuHHa8aBBgwAICwsjIiKCjh07cubMGUaOHElsbCwVK1Zk+fLllChR4p7uGx4eTnh4OCkpKfd0HREREcm5ctQ6OlbI6Dx8ERERyTkcYh0dERERkXuhQkdEREQclgodERERcVhOW+hoHR0RERHHp8HIGowsIiKS62gwsoiIiDg9FToiIiLisCxfMNBq157cxcXFWZxEREREMura7+07jcBx2kLn2srISUlJAAQHB1ucSERERO7WxYsX8fX1veXrTj8YOTU1lWPHjpEvXz5sNhs1a9bM0EafdzovLi6O4OBgjhw54hSDnDP6fcsO9s6Slde/12tl5vPv5nP0fsgcvR+suZbeDzmTvf4fNAyDixcvEhgYiIvLrUfiOG2PzjUuLi4EBQWlHbu6umbof7yMnpc/f36n+B85o9+P7GDvLFl5/Xu9VmY+/24+R++HzNH7wZpr6f2QM9nz/8Hb9eRco8HI/9KvX78sPc9Z5KTvh72zZOX17/Vamfn8u/kcvR8yJyd9P/R+yLrP0fshc6z+fjj9oyt70fo8Itfp/SBynd4P2Us9Onbi6enJ8OHD8fT0tDqKiOX0fhC5Tu+H7KUeHREREXFY6tERERERh6VCR0RERByWCh0RERFxWCp0RERExGGp0BERERGHpULHIs888wwFChSgXbt2VkcRsdSRI0do1KgRFSpUoHLlyixcuNDqSCKWuXjxIjVr1qRq1apUqlSJL774wupIuZ6ml1tkzZo1xMfHM2PGDBYtWmR1HBHLxMbGcuLECapWrcrJkyepXr06f/zxBz4+PlZHE8l2KSkpXLlyBW9vbxITE6lYsSJRUVEUKlTI6mi5lnp0LNK4cWPy5ctndQwRyxUrVoyqVasCUKRIEQoWLMjZs2etDSViEVdXV7y9vQG4fPkyKSkpqD/i3qjQyYT169fTqlUrAgMDsdlsLF269IZzJk2aRKlSpfDy8qJGjRps2LAh+4OKZIOsfD9s27aN1NRUgoOD7ZxaxD6y4v1w/vx5qlSpQlBQEEOHDsXf3z+b0jsmFTqZkJCQQJUqVZg4ceJNX4+MjGTgwIG8+eab7Ny5k/r169OiRQsOHz6czUlF7C+r3g9nzpyha9euTJ06NTtii9hFVrwf/Pz82L17NzExMcydO5cTJ05kV3zHZMg9AYwlS5aka6tVq5bRp0+fdG0PPvig8frrr6drW7NmjdG2bVt7RxTJNpl9P1y+fNmoX7++MXPmzOyIKZIt7uX3wzV9+vQxFixYYK+ITkE9OlksKSmJ7du307Rp03TtTZs2ZfPmzRalErFGRt4PhmHQrVs3mjRpQmhoqBUxRbJFRt4PJ06cIC4uDjB3OV+/fj3lypXL9qyOxM3qAI7m9OnTpKSkEBAQkK49ICCA48ePpx03a9aMHTt2kJCQQFBQEEuWLKFmzZrZHVfErjLyfti0aRORkZFUrlw5bTzDrFmzqFSpUnbHFbGrjLwfjh49Ss+ePTEMA8MweOmll6hcubIVcR2GCh07sdls6Y4Nw0jXtmLFiuyOJGKZ270f6tWrR2pqqhWxRCxxu/dDjRo12LVrlwWpHJceXWUxf39/XF1d0/XeAJw8efKGKl7E0en9IHKd3g/WUKGTxTw8PKhRowarVq1K175q1Srq1q1rUSoRa+j9IHKd3g/W0KOrTIiPj2f//v1pxzExMezatYuCBQtSvHhxBg0aRGhoKCEhIdSpU4epU6dy+PBh+vTpY2FqEfvQ+0HkOr0fciArp3zlVmvWrDGAGz7CwsLSzgkPDzdKlChheHh4GNWrVzfWrVtnXWARO9L7QeQ6vR9yHu11JSIiIg5LY3RERETEYanQEREREYelQkdEREQclgodERERcVgqdERERMRhqdARERERh6VCR0RERByWCh0RERFxWCp0RERExGGp0BGRXCciIgI/Pz+7Xb9Ro0YMHDjQbtcXkeyjLSBEJEfo1q0b58+fZ+nSpXc899KlS1y8eJEiRYrYJcvZs2dxd3cnX758drm+iGQf7V4uIrnK1atXyZMnD3ny5LHbPQoWLGi3a4tI9tKjKxG5K40aNaJ///4MHDiQAgUKEBAQwNSpU0lISKB79+7ky5ePMmXK8MMPP6R9TkpKCj179qRUqVLkyZOHcuXKMX78+LTXR4wYwYwZM/jmm2+w2WzYbDbWrl3LwYMHsdlsLFiwgEaNGuHl5cXs2bPTPboyDIPHHnuM5s2bc62D+vz58xQvXpw333zzll/HpEmTeOCBB/Dy8iIgIIB27dql+xqvPbpau3ZtWqZ/fnTr1i3t/G+//ZYaNWrg5eVF6dKleffdd0lOTr7lvbt160br1q355JNPKFasGIUKFaJfv35cvXr1bn4UIpIBKnRE5K7NmDEDf39/tm7dSv/+/enbty/t27enbt267Nixg2bNmhEaGkpiYiIAqampBAUFsWDBAqKjo3nnnXd44403WLBgAQBDhgyhQ4cONG/enNjYWGJjY6lbt27a/V577TVefvll/vvf/9KsWbN0WWw2GzNmzGDr1q1MmDABgD59+hAQEMCIESNumn/btm28/PLLjBw5kj/++IMff/yRBg0a3PTcunXrpmWKjY3lp59+wsvLK+38FStW0KVLF15++WWio6OZMmUKERERvP/++7f9Hq5Zs4a//vqLNWvWMGPGDCIiIoiIiLjj915E7pIhInIXGjZsaNSrVy/tODk52fDx8TFCQ0PT2mJjYw3A+Pnnn295nRdffNFo27Zt2nFYWJjx9NNPpzsnJibGAIxx48ala58+fbrh6+ubrm3BggWGp6enMWzYMMPb29v4448/bnnvr7/+2sifP78RFxd3y69xwIABN7SfPn3aKFOmjPHiiy+mtdWvX9/44IMP0p03a9Yso1ixYre8f1hYmFGiRAkjOTk5ra19+/ZGx44db/k5IpI5GqMjInetcuXKaf/t6upKoUKFqFSpUlpbQEAAACdPnkxr+/zzz5k2bRqHDh3i0qVLJCUlUbVq1QzdLyQk5I7ntG/fniVLljB69GgmT55M2bJlb3nu448/TokSJShdujTNmzenefPmPPPMM3h7e9/yc65evUrbtm0pXrx4usdu27dvJyoqKl0PTkpKCpcvXyYxMfGW13zooYdwdXVNOy5WrBh79uy549cpIndHj65E5K65u7unO7bZbOnabDYbYD6yAliwYAGvvPIKPXr0YOXKlezatYvu3buTlJSUofv5+Pjc8ZzExES2b9+Oq6sr+/btu+25+fLlY8eOHcybN49ixYrxzjvvUKVKFc6fP3/Lz+nbty+HDx9m4cKFuLld/zdiamoq7777Lrt27Ur72LNnD/v27cPLy+uW17vZ9/Da90tEso56dETE7jZs2EDdunV58cUX09r++uuvdOd4eHiQkpKS6XsMHjwYFxcXfvjhB5544gmefPJJmjRpcsvz3dzceOyxx3jssccYPnw4fn5+/PTTT7Rp0+aGcz/77DMiIyP5+eefKVSoULrXqlevzh9//MH999+f6ewiYj8qdETE7u6//35mzpzJihUrKFWqFLNmzSIqKopSpUqlnVOyZElWrFjBH3/8QaFChfD19c3w9b///nu++uorfv75Z6pXr87rr79OWFgYv/76KwUKFLjh/O+++44DBw7QoEEDChQowPLly0lNTaVcuXI3nLt69WqGDh1KeHg4/v7+HD9+HIA8efLg6+vLO++8Q8uWLQkODqZ9+/a4uLjw66+/smfPHkaNGpWJ75aIZCU9uhIRu+vTpw9t2rShY8eO1K5dmzNnzqTr3QHo3bs35cqVIyQkhMKFC7Np06YMXfvUqVP07NmTESNGUL16dQCGDx9OYGAgffr0uenn+Pn5sXjxYpo0aUL58uX5/PPPmTdvHg899NAN527cuJGUlBT69OlDsWLF0j4GDBgAQLNmzfjuu+9YtWoVNWvW5OGHH+azzz6jRIkSd/MtEhE70crIIiIi4rDUoyMiIiIOS4WOiIiIOCwVOiIiIuKwVOiIiIiIw1KhIyIiIg5LhY6IiIg4LBU6IiIi4rBU6IiIiIjDUqEjIiIiDkuFjoiIiDgsFToiIiLisP4f8hQTnrdg6/oAAAAASUVORK5CYII=", "text/plain": [ "Figure(PyObject
)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "PyObject Text(0.5, 1.0, 'time for LU solve')" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "loglog(n, ts*1e9, \"bo-\")\n", "loglog(n, n.^2, \"k--\")\n", "xlabel(\"matrix size n\")\n", "ylabel(\"time (ns)\")\n", "legend([\"time\", L\"n^2\"])\n", "title(\"time for LU solve\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yup, it's pretty close to the $n^2$ growth! The key point is that, unless you have many ($\\gtrsim n$) right-hand sides, most of the effort is spent in Gaussian elimination (finding L and U), *not* in the back/forward-substitution to solve $LUx=b$.\n", "\n", "If we believe this scaling, how long would it take for my laptop to solve a $10^6 \\times 10^6$ system of equations?" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.122767084, 2000)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t[end], n[end] # the last measured time and n for LU factorization" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.53458855e7" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "secs = t[end] * (1e6/n[end])^3 # this many seconds" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "25 weeks, 2 days, 14 hours, 44 minutes, 46 seconds" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# convert to a human time period\n", "using Dates\n", "Dates.canonicalize(Dates.CompoundPeriod(Dates.Second(round(Int,secs))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In fact, we **usually run out of memory before we run out of time:**" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7450.580596923828 GiB for a 10⁶×10⁶ matrix\n" ] } ], "source": [ "println((1e6)^2 * sizeof(Float64) / 2^30, \" GiB for a 10⁶×10⁶ matrix\")" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "In practice, people do *regularly* solve problems this large, and even larger, but they can do so because real matrices that big almost always have some **special structure** that allows you to solve them more quickly and store them more compactly. For example, a common special structure is [sparsity](https://en.wikipedia.org/wiki/Sparse_matrix): matrices whose entries are *mostly zero*. We will learn some basic ways to take advantage of this later in 18.06, and sparse-matrix methods are covered more extensively in 18.335." ] } ], "metadata": { "@webio": { "lastCommId": null, "lastKernelId": null }, "kernelspec": { "display_name": "Julia 1.7.1", "language": "julia", "name": "julia-1.7" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.7.1" } }, "nbformat": 4, "nbformat_minor": 2 }