{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Why optimization is difficult\n", "\n", "This tutorial shows why optimization is difficult and why you need some knowledge in order to solve optimization problems efficiently. It is meant for people who have no previous experience with numerical optimization and wonder why there are so many optimization algorithms and still none that works for all problems. For each potential problem we highlight, we also give some ideas on how to solve it. \n", "\n", "\n", "If you simply want to learn the mechanics of doing optimization with estimagic, check out the [quickstart guide](../../getting_started/first_optimization_with_estimagic.ipynb)\n", "\n", "\n", "The take-home message of this notebook can be summarized as follows:\n", "\n", "- The only algorithms that are guaranteed to solve all problems are grid search or other algorithms that evaluate the criterion function almost everywhere in the parameter space.\n", "- If you have more than a hand full of parameters, these methods would take too long.\n", "- Thus, you have to know the properties of your optimization problem and have knowledge about different optimization algorithms in order to choose the right algorithm for your problem. \n", "\n", "This tutorial uses variants of the sphere function from the [quickstart guide](../../getting_started/first_optimization_with_estimagic.ipynb)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import estimagic as em\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def sphere(params):\n", " return (params[\"value\"] ** 2).sum()\n", "\n", "\n", "def sphere_gradient(params):\n", " return params * 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Why grid search is infeasible\n", "\n", "Sampling based optimizers and grid search require the parameter space to be bounded in all directions. Let's assume we know that the optimum of the sphere function lies between -0.5 and 0.5, but don't know where it is exactly. \n", "\n", "In order to get a precision of 2 digits with grid search, we require the following number of function evaluations (depending on the number of parameters):" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGsCAYAAACB/u5dAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAArrElEQVR4nO3de3RU5b3/8c9kkkzugwnkBgEiBi/cJWi5eGuVlipLTlvbWi+grUv6Q4Hya6vUXtQCEdu67E+WWDgWsYh47BH1nFYt2gLeaAOIF7BJwAgRCeEiM7mQSTKzf38kMyRAIJOZyd4z836ttZfMZM/sb5yl8+HZz/d5bIZhGAIAAAiDBLMLAAAAsYNgAQAAwoZgAQAAwoZgAQAAwoZgAQAAwoZgAQAAwoZgAQAAwoZgAQAAwoZgAQAAwoZgAQAAwsa0YLF582ZNnz5dhYWFstlsevHFF4N6fXNzs2bNmqVRo0YpMTFRM2bMOO15zzzzjMaMGaO0tDQVFBTotttu05EjR0L/BQAAwClMCxaNjY0aM2aMli1b1qvXe71epaamau7cubr66qtPe85bb72lW2+9Vd///ve1c+dOPf/88yovL9cPfvCDUEoHAADdMC1YTJs2TYsWLdI3vvGN0/68paVFP/3pTzVw4EClp6fr0ksv1caNGwM/T09P1/Lly3XHHXcoPz//tO+xZcsWDR06VHPnzlVxcbGmTJmiO++8U1u3bo3ErwQAQNyz7ByL2267TW+//bbWrVunDz74QDfccIO+9rWvqaqqqsfvMWnSJH322Wf661//KsMwdPDgQf35z3/WtddeG8HKAQCIX5YMFnv27NGzzz6r559/XpdddpmGDRumH//4x5oyZYpWrVrV4/eZNGmSnnnmGX3nO99RcnKy8vPz1a9fPz322GMRrB4AgPhlyWCxfft2GYah4cOHKyMjI3Bs2rRJe/bs6fH77Nq1S3PnztUvf/lLbdu2Ta+++qqqq6s1e/bsCFYPAED8SjS7gNPx+Xyy2+3atm2b7HZ7l59lZGT0+H3Kyso0efJk/eQnP5EkjR49Wunp6brsssu0aNEiFRQUhLVuAADinSWDxbhx4+T1elVXV6fLLrus1+/T1NSkxMSuv6I/qBiGEVKNAADgVKYFi4aGBu3evTvwuLq6Wjt27FB2draGDx+um266Sbfeeqt+97vfady4cTp8+LD+/ve/a9SoUfr6178uqf1WR0tLi44ePar6+nrt2LFDkjR27FhJ0vTp03XHHXdo+fLl+upXv6oDBw5o/vz5uuSSS1RYWNjXvzIAADHPZpj0V/eNGzfqqquuOuX5mTNn6qmnnlJra6sWLVqkp59+Wvv371dOTo4mTpyoBx54QKNGjZIkDR06VHv37j3lPTr/So899pieeOIJVVdXq1+/fvryl7+spUuXauDAgZH75QAAiFOmBQsAABB7LNkVAgAAohPBAgAAhE2fT970+Xz6/PPPlZmZKZvN1teXBwAAvWAYhurr61VYWKiEhO7HJfo8WHz++ecqKirq68sCAIAwqKmp0aBBg7r9eZ8Hi8zMTEnthWVlZfX15QEAQC+43W4VFRUFvse7E1SwaGtr0/33369nnnlGtbW1Kigo0KxZs/Tzn//8jMMinflvf2RlZREsAACIMmebxhBUsFi6dKmeeOIJrV69WiNGjNDWrVt12223yel0at68eSEVCgAAol9QweLdd9/V9ddfH9h2fOjQoXr22We1devWiBQHAACiS1DtplOmTNEbb7yhyspKSdL777+vt956K7DE9ul4PB653e4uBwAAiE1BjVjcc889crlcuuCCC2S32+X1erV48WLdeOON3b6mrKxMDzzwQMiFAgAA6wtqxOK5557TmjVrtHbtWm3fvl2rV6/Wb3/7W61evbrb1yxcuFAulytw1NTUhFw0AACwpqD2CikqKtK9996rOXPmBJ5btGiR1qxZo3//+989eg+32y2n0ymXy0VXCAAAUaKn399BjVg0NTWd0lZqt9vl8/l6VyUAAIgpQc2xmD59uhYvXqzBgwdrxIgReu+99/TII4/o9ttvj1R9AAAgigR1K6S+vl6/+MUvtH79etXV1amwsFA33nijfvnLXyo5OblH78GtEAAAok9Pv7+DChbhQLAAACD6RGSOBQAAwJkQLAAAQNj0+e6mAAAgMn710kdypibplolDNSDTYUoNBAsAAGJAc6tXa/65T16foZu+NMS0OrgVAgBADPjkUKO8PkPO1CTlmjRaIREsAACICZUH6yVJw/MyZLPZTKuDYAEAQAyoCASLTFPrIFgAABADKmvbg8X5+QQLAAAQoso6RiwAAEAYNHraVHP0uCSCBQAACFFVXYMkqX+GQ9npPdu7K1IIFgAARLkT8ysyTK6EYAEA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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dimensions = np.arange(10) + 1\n", "n_evals = 100**dimensions\n", "sns.lineplot(x=dimensions, y=n_evals);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you have 10 dimensions and evaluating your criterion function takes one second, you need about 3 billion years on a 1000 core cluster. Many of the real world criterion functions have hundreds of parameters and take minutes to evaluate once. This is called the curse of dimensionality." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sampling based algorithms typically fix the number of criterion evaluations and apply them a bit smarter than algorithms that rummage the search space randomly. However, these smart tricks only work under additional assumptions. Thus, either you need to make assumptions on your problem or you will get the curse of dimensionality through the backdoor again. For easier analysis, assume we fix the number of function evaluations in a grid search instead of a sampling based algorithm and want to know which precision we can get, depending on the dimension:\n", "\n", "For 1 million function evaluations, we can expect the following precision:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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Zo127dqlF198UQ0bNjQ7Wp01Y8YMvf7665o9e7Z2796tF154Qf/4xz/06quvmh2tTsjPz1ePHj00e/bs837/hRde0EsvvaTZs2dr27ZtCg4O1sCBA8s+z686cVlzHXP8+HE1a9ZM69at07XXXmt2nDorLy9PvXv31pw5c/Tss8+qZ8+emjlzptmx6pzHHntMX375pTZs2GB2FJxz++23KygoSAsXLiwbu/vuu+Xr66ulS5eamKzusVgsWrlypYYMGSKpdHWlRYsWiouL06OPPipJKiwsVFBQkGbMmKEHHnigWvOwwlLH5OTkSJICAwNNTlK3TZw4Ubfddptuuukms6PUaatWrVJERIR+//vfq1mzZurVq5fmz59vdqw67ZprrtHnn3+uvXv3SpJ27NihjRs36tZbbzU5GQ4ePKisrCzFxMSUjdlsNl133XXatGlTtf/8WvPhh/h1hmFo8uTJuuaaa9StWzez49RZb7/9tr766itt27bN7Ch13oEDBzR37lxNnjxZjz/+uLZu3aqHH35YNptNo0aNMjtenfToo48qJydHnTp1koeHhxwOh5577jndc889Zker87KysiRJQUFB5caDgoL0ww8/VPvPp7DUIQ8++KC+/vprbdy40ewodVZGRoYmTZqkzz77TD4+PmbHqfOcTqciIiL0/PPPS5J69eqlnTt3au7cuRQWkyQmJmrZsmVasWKFunbtqrS0NMXFxalFixYaPXq02fGg0reK/pdhGBXGqgOFpY546KGHtGrVKq1fv14tW7Y0O06dlZKSomPHjik8PLxszOFwaP369Zo9e7YKCwvl4eFhYsK6pXnz5urSpUu5sc6dO+u9994zKRH+8pe/6LHHHtMf/vAHSdLVV1+tH374QfHx8RQWkwUHB0sqXWlp3rx52fixY8cqrLpUB85hqeUMw9CDDz6o999/X//5z38UFhZmdqQ67cYbb9Q333yjtLS0si0iIkLDhw9XWloaZeUK69+/f4XL/Pfu3avQ0FCTEuHMmTOyWsu/NHl4eHBZsxsICwtTcHCwkpKSysaKioq0bt069evXr9p/PisstdzEiRO1YsUKffjhh/Lz8yt7DzIgIED16tUzOV3d4+fnV+H8ofr166tx48acV2SCRx55RP369dPzzz+voUOHauvWrZo3b57mzZtndrQ6a/DgwXruuefUqlUrde3aVampqXrppZc0ZswYs6PVCXl5edq/f3/Z1wcPHlRaWpoCAwPVqlUrxcXF6fnnn1f79u3Vvn17Pf/88/L19dWwYcOqP5yBWk3SebdFixaZHQ3nXHfddcakSZPMjlFnffTRR0a3bt0Mm81mdOrUyZg3b57Zkeo0u91uTJo0yWjVqpXh4+NjtGnTxpg6dapRWFhodrQ64Ysvvjjva8bo0aMNwzAMp9NpPP3000ZwcLBhs9mMa6+91vjmm2+uSDbuwwIAANwe57AAAAC3R2EBAABuj8ICAADcHoUFAAC4PQoLAABwexQWAADg9igsAADA7VFYAACA26OwAAAAt0dhAQAAbo/CAgAA3B6FBQAAuL3/B87MV3u+2z/EAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dimensions = np.arange(10) + 1\n", "precision = 1e-6 ** (1 / dimensions)\n", "sns.lineplot(x=dimensions, y=precision);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## How derivatives can solve the curse of dimensionality\n", "\n", "Derivative based methods do not try to evaluate the criterion function everywhere in the search space. Instead, they start at some point and go \"downhill\" from there. The gradient of the criterion function indicates which direction is downhill. Then there are different ways of determining how far to go in that direction. The time it takes to evaluate a derivative increases at most linearly in the number of parameters. Using the derivative information, optimizers can often find an optimum with very few function evaluations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## How derivative based methods can fail\n", "\n", "To see how derivative based methods can fail, we use simple modifications of the sphere function. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "rng = np.random.default_rng(seed=0)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def sphere_with_noise(params, rng):\n", " return sphere(params) + rng.normal(scale=0.02)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "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", "
value
x_01
x_12
x_23
x_34
x_45
\n", "
" ], "text/plain": [ " value\n", "x_0 1\n", "x_1 2\n", "x_2 3\n", "x_3 4\n", "x_4 5" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "start_params = pd.DataFrame(\n", " data=np.arange(5) + 1,\n", " columns=[\"value\"],\n", " index=[f\"x_{i}\" for i in range(5)],\n", ")\n", "start_params" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABe0klEQVR4nO3dd3xT5f4H8E9Gk3SXtnTRUsose7Syt1iG8+oVHFcQQUVUBNR7QX5u7wWvysUF6AXELVcBvV4QLMoUECgtQzYUyuighe6VJuf3R2l60pykSdvsz/v16ovkOc9JnkOa5ptnfB+ZIAgCiIiIiJxE7uwGEBERkXdjMEJEREROxWCEiIiInIrBCBERETkVgxEiIiJyKgYjRERE5FQMRoiIiMipGIwQERGRUymd3QBr6PV6XLlyBYGBgZDJZM5uDhEREVlBEASUlJQgJiYGcrn5/g+3CEauXLmCuLg4ZzeDiIiImuDixYuIjY01e9wtgpHAwEAAtRcTFBTk5NYQERGRNYqLixEXF2f4HDfHLYKRuqGZoKAgBiNERERuprEpFpzASkRERE7FYISIiIicisEIERERORWDESIiInIqBiNERETkVAxGiIiIyKkYjBAREZFTMRghIiIip2IwQkRERE7FYISIiIicisEIERERORWDESIiInIqBiNERERe6GpJFZZtO4urJVXObgqDESIiIm8044s0vLnpBG76+xYcuVTk1LYwGCEiIvJCaReuG24/8026E1vCYISIiMjrlVfrnPr8NgcjO3bswO23346YmBjIZDJ8//33jZ6zfft2JCUlQaPRoH379li+fHlT2kpERER2oBcEpz6/zcFIWVkZevfujQ8++MCq+pmZmZgwYQKGDRuG9PR0vPDCC5g1axbWrl1rc2Pt4WpJFbaeyINe79wXgoiIyFmc/QmotPWE8ePHY/z48VbXX758Odq2bYslS5YAALp27YoDBw7g7bffxj333GPr07eoFTvP4Y0NxwEAd/dtg77xrfDQwHintomIiMjRnNwxYv85I3v27EFKSopR2dixY3HgwAFotVrJc6qqqlBcXGz0Yw9HL9fPHl6Xfhkvfn/UqIyIiMg7uNkwja1ycnIQGRlpVBYZGYmamhrk5+dLnrNw4UIEBwcbfuLi4uzStoTwAJOyCwXldnkuIiIiV5VfWo1jV+zzxd8aDllNI5PJjO4LN/qDGpbXmT9/PoqKigw/Fy9etEu7/NUKk7L8UucnfyEiInK003klTntuuwcjUVFRyMnJMSrLy8uDUqlEWFiY5DlqtRpBQUFGP/Zwe+8Yk7Ksa+wZISIizydv0B8QHezrnIbAAcHIoEGDkJqaalT2888/Izk5GT4+PvZ+eosigzR468+9jMqKKqTnsRAREXkSRYNoJCZE46SWNCEYKS0tRUZGBjIyMgDULt3NyMhAVlYWgNohlsmTJxvqz5gxAxcuXMDcuXNx/PhxrFq1CitXrsRzzz3XMlfQTF2iAo3uV2idm/iFiIjIEWQwDkYig5wXjNi8tPfAgQMYNWqU4f7cuXMBAFOmTMHq1auRnZ1tCEwAICEhARs3bsScOXPw4YcfIiYmBu+9957Tl/XWaR2oNrpf6eQsdERERI6g1euN7vsonJeU3eZgZOTIkYYJqFJWr15tUjZixAgcPHjQ1qdyiDB/42CEPSNEROQNxB/lm2YPc15D0IRgxNOolMaRoLPz8xMREdnTpevl2HnaOLVGYpR9FopYy+uDEQCIDFIjt7h2SW8le0aIiMiDDX1zq9H9/zw+yEktqcddewFsemY4Xr+zOwAO0xARkefIK6nE9lNXLU6v8PUxzbnlaAxGALTyV6FffCsAQAWHaYiIyEOMX7ITU1btw4Yj2QCA5dvPmtRRKqQTkDoSg5Eb6iJD9owQEZGnKCirBgCkHssFACz66YRJHWeuoqnj/Ba4CD9V7fSZksoa3P/xXly6zkysRETkGSztyuvDnhHXIR4z23OuAEu2nHZia4iIiFqOThDw2xnpzWkbZmJ1BgYjN/irFRDv26fTO3c7ZSIiopYiCAIeXPG75DGtzvmfdwxGblAq5EaJcWNb1W4YtPtMPvacLbA4E5mIiMjViL9UN0i2ajCwfSjiQ/0c1CLzmGdERNwZ8v6vZ3BX3zZ44EYkOToxAqsevslJLSMiIrJNWXWN4XaNmd7+bx5zfo4RgD0jFs3+JsNw+9cTec5rCBERkY3Kq+pXh245nuvEljSOwYhIw8QvRy4XOaklREREzVNaVdN4JRfBYETks2n9LR7nvBEiInIXZQxG3NNN7ULx/NguZo9X1ZiZAURERORiiiq0kuW9YoMd3JLGcQJrAyoLmeiqavTQuEAOfyIiosZcL6+WLH/rz72x8/RVjOzS2sEtMo89Iw2olOb/S57+Op27+hIRkVsw1zPSys8H04e1R8eIQAe3yDwGIw3ILCSi23HqKv576IrjGkNERNRE18ukgxFflev18DMYaUDfSObVas4bISIiNyA1TBOoVsJf5XozNBiMNCDOivvl9AFY+mA/o+NaHYMRIiJyfYUSwcjvC26G3AX2omnI9cIjJxMv3x3SMdzk+PVy6W4vIiIiV3I6r9SkzM8Fe0UA9oyY0DeSS0Qq0iQiInIllVodTuSUOLsZVmMw0oBaaXliTyF7RoiIyMWdLyiDTi8g2NfH2U2ximv21zjRvcmx+D7jMm5OjJA8bm7dNhERkat4d8tpALU70Jtb4utKGIw04KdSYv3MIWaPs2eEiIhcWUW1Dj8dzTHcdgccprHCptnDDJnqCivYM0JERK4rv7TKcNtSIk9X4h6tdLLEqCC8eFs3AMDFaxV44os0nMlzn4lBRETkPa6V1X9p/vufejqxJdZjMGKlVn4qw+2fjuZg9poM5zWGiIjIjLpgpHtMEJLiW0HpgnlFGmIwYqUgjfH0mgv55W61PTMREXmHghvBSKh/7ZdoV0z/3hCDESspFXKjgKSkqgZ9XvsZJ3KKUV2jR1WNe0wSIiIiz3Uipxgrdp4DAITdCEb83CAY4WoaG/iplCiurO8N0eoE/Cv1FDIuFsJfrcSWOSNcMs0uERF5tq0n8/DeL6eRnlVoKKvLMRIT4ovc4iozZ7oG9ozYoK7LS+xkTglyi6tw7moZyqo5bENERI4lCAKmfrLfKBABgEBNbTCyeGIf9GwTjGUN9lpzJQxGbLDoHtNZyecLyg23n/jioCObQ0REXu5UbgkGLvxF8ljAjakFCeH++PHpoRjfM9qRTbMJgxEb9IoNwX8eH2T2+K4z+ShiUjQiInKQ5789ZHYIJkDtPjMxGIzYyF9dPxFILZFM5tClQge2hoiIvJmlneQDNQxGPJZcVj9BtVdssMnxs1dNt2wmIiKyB6XC/KIJ9ox4sE4RAegdG4zxPaIQEaQxOb7leC76vZ6KNfuznNA6IiLyFtfLqnHuapnZ4+6SCh5gMGIzpUKOH54aimV/SUKQxnRr5t/OFOBaWTX+tvaIE1pHRETe4ubF2y0er67RO6glzec+fTguKEBtOZFMVY0OaqXrJ5shIiL3I96Dpo6/SoFgXx9o9QIGtg9zQquahsFIM+Q0kkTm0vUKdGgd4KDWEBGRtxAEwaSsTYgvtj8/EnKZDFq93q2+DHOYphmig03njIjlFFU6qCVEROQtfjx0Bb1f/dmkvEKrg1Ihh1wuc6tABGDPSLM8MaIDKqp1+HzvBcnj2QxGiIiohT39dbpkeUW1++6Rxp6RZmjlr8Lrd/UwezynqMKBrSEiIm9WoWUwQhKulrj2xkRERESugMGIHYl3+CUiIrInXx/3micixmDEjooquE8NERHZX/twf3w+rb+zm9FkDEbsqJjBCBERNcOvJ3IxeOEv2H0232K9zXOGI7ldqINa1fIYjNgRe0aIiKg5Hll9AFeKKvH452kW6ynl5veocQcMRuyIwQgREbUEnb42yZm5/FUyGYMRr/fpI/2RGBWIrx4dgLv7tsHf/1S73Le4ksEIERE1X91eaK/97w8nt8Q+mPSsBYzo3BojOrcGAAzuEI7C8mosWH8UlVo9/nvoCm7tGQ2Fm3ehERGR8wT71gYjRy4XObkl9tGknpGlS5ciISEBGo0GSUlJ2Llzp8X6X375JXr37g0/Pz9ER0dj6tSpKCgoaFKD3YGvqn551ayv07E+/bITW0NERO5Ir6/ffybIVwmdXoC/qr4PYWjHcGc0yy5sDkbWrFmD2bNnY8GCBUhPT8ewYcMwfvx4ZGVlSdbftWsXJk+ejGnTpuGPP/7At99+i/3792P69OnNbryrUinkRj0h+zI9N/AiIiL7EA/1+6mUeOyzAziRUwIAuKldKwSoPWdww+ZgZPHixZg2bRqmT5+Orl27YsmSJYiLi8OyZcsk6+/duxft2rXDrFmzkJCQgKFDh+Lxxx/HgQMHmt14VyWTySAelIkJ8QUAVGp1OHypUHK3RSIi8m65xZV45+eTyL6xlUhheX0wsv3UVfxyIs9w/96kOOg96LPEpmCkuroaaWlpSElJMSpPSUnB7t27Jc8ZPHgwLl26hI0bN0IQBOTm5uK7777DrbfeavZ5qqqqUFxcbPTjbmpE3WtLtpzGsSvFePzzNNzxwW/44nfpXiQiIvJeM75Iw/u/nsHUT/YDAAotrMj0VyvhOaGIjcFIfn4+dDodIiMjjcojIyORk5Mjec7gwYPx5ZdfYtKkSVCpVIiKikJISAjef/99s8+zcOFCBAcHG37i4uJsaaZLmvDeTmw/dRUAsPq3TCe3hoiIXE16ViEAGIZiCsurzdb1UyvQMSLAEc1yiCZNYG24nlkQBLNrnI8dO4ZZs2bhpZdeQlpaGjZt2oTMzEzMmDHD7OPPnz8fRUVFhp+LFy82pZkuy5OiWSIisg/xME1DAWolnh7dEdOGJmDtE4Mc2Cr7sGn2S3h4OBQKhUkvSF5enklvSZ2FCxdiyJAheP755wEAvXr1gr+/P4YNG4Y33ngD0dHRJueo1Wqo1WpbmkZEROQxanR6LN12xuxxuax2UuuLt3VzYKvsx6aeEZVKhaSkJKSmphqVp6amYvDgwZLnlJeXQy43fhqFonbpq9dO5BQArU7v7FYQEZGLeif1FE7llpo9rla67w69Umweppk7dy5WrFiBVatW4fjx45gzZw6ysrIMwy7z58/H5MmTDfVvv/12rFu3DsuWLcO5c+fw22+/YdasWejfvz9iYmJa7krcyLn8MvT/+xZcLalydlOIiMgFLdt21uyxx4a3R/eYIAe2xv5sXqQ8adIkFBQU4LXXXkN2djZ69OiBjRs3Ij4+HgCQnZ1tlHPk4YcfRklJCT744AM8++yzCAkJwejRo/Hmm2+23FW4oevlWqz6LRN/G5fo7KYQEZGbGN8jCi9M6OrsZrQ4meAGYyXFxcUIDg5GUVERgoLcIxrcceoqJq/aZ7HO7b1j8P79fR3UIiIicmXt5m1otM6EnlFY+mCSA1rTMqz9/OZGeXYyvHNrPDGyg8U6VworHNQaIiJyV2/c1cNw2zilpudgMGJH4n0FpJRV1TioJURE5K48Ke27OQxG7Cg+zN/i8QqtzkEtISIid6VWev5HteeHW040MTkWVworsOV4riGjnljxjVS/lVod1Eq52cRxREREAOChozTsGbEnpUKO58Z2QZeoQMnj18u1uHitHN1e2oSnv053cOuIiMgduPwqkxbAYMQBTmSb9orUWbrtDPQC8L/D2Q5sERERuZLabVWkj3WOrP9C66EdIwxGHGHiTeY3+rt0nStqiIi8XbVOj4aJNsIDVPhq+gCjDfE8dTifwYgDTBkUj4nJsZLHdp7ON9wWBMF7U+QTEXmxSq3pFiG9Y0MwuGO4E1rjeAxGHECpkGNs96hG601dvR93fPAbdI0sCSYiIs9SJbG6UqoTxDP7RRiMOIy4m23v/JsRHawxqbPt5FUcuVyE03nm55gQEZHnkeoZEX8vDfVXAQDGdIt0VJMcikt7HSQ+zB8fPZSEVn4qRAVr4OvjWTsuEhFR0xVXai0e/3nOcBzPLsZQDx22YTDiQOKhmhoLQzF60wCZiIg82G3v7zIpE88hDA9QY1in1o5skkNxmMZJqmvMRxyVNczMSkTk7fy9IA18HQYjTqKzsGqmsprBCBGRt2j45fQff+qJThEB+Nu4RCe1yPG8J+xyMZaW8HLPGiIi71BaVYNbFm83KntgQFs8MKCtk1rkHAxGnMTS8l2pWdVERORZvvz9AhasP+rsZrgEDtM4iaVghD0jRESerby6hoGICIMRJ7GU16ySwQgRkUcrraxxdhNcCoMRJ9FbmsDKYISIyKOVmVmocHvvGAe3xDVwzoiTWJ4zwmCEiMjTCIKAL37PQmJUoGTiyxcmJOLhwQlOaJnzMRhxEks9IxVaHapr9Hjph6PYcDgb7z3QF6O6RDiwdURE1NIyLhbixe9r54mEB6iNjvmpFHhseAdnNMslcJjGSSzNGSmtrMG7v5zCN/svoqSqBlM/2e+4hhERkV1cK6s23M4vrTI61iUq0NHNcSnsGXESS8M018u1+HTPBQe2hoiI7M1c2ga1Uo5Xbu/u4Na4FvaMuKCfj+WYlH2257zjG0JERC1GajO8UV1a4/ArKegdF+L4BrkQBiNO8siQ2klKt/aKNpSplbUvh1T0/NIPfzimYURE1GIEQcDWE3koLK9GcYVpMOKnVkKt5C7uHKZxknnjE3Fz1wgkxbdCYXk1fjtTgOfHdsEbG447u2lERNRCtp26iqmr9yNQrUTX6CCT434Sq2q8EYMRJ1Ep5RjSMRwAsHLKTcgtroROL5gNRmQyR7aOiIhawoHz1wAAJVU12HfjtlhkkMbRTXJJDEZcgMZHgfgwf4v5RRSMRoiI3E6wr4/F4/0TQh3UEtfGOSMuROOjwJRB8ZLH5AxGiIjcTlmV+S+Zc2/pjGGdwh3YGtfFnhEX0ylSeq25nGEjEZFbqdHp8e4vpyWPzR7TCbNu7uTgFrkufsS5mDB/lWR5pVaPu5f+hoIGiXKIiMj1bDqag44LfpI8dvTVsZg9prODW+TaGIy4mFAzwQgAHMwqxEc7zjmwNUREZKv3fjmNGV+kSR7rHhOEADUHJRpiMOJiYkP9LB4v4bbTREQubXHqKbPHvpw+wIEtcR8MRlxMTLDlZV4qBSeyEhG5Kq1OOuV7HfaKSGMw4mJkMhkGdwgze9zC/npERORkllI0AIBSwY9dKfxfcUGrHr4Jvzw7AknxrUyOXS83TSdMRESuoarGcs8ISWN/kQvS+CjQoXUAvn18EE7mlmD8uzsNxwrLq/H+L6fho5RjxogOTmwlERHVqajWYerqfehsJj0DWcZgxIXJ5TKTVMH7z1/DztP5AICHB7eDhvsaEBE53bdpF7H33DXsPWea8p0ax2EaF9dwqa94R1+p7aiJiMjxKqotzxUhyxiMuLGC0mpnN4GIiMAtO5qLwYgbeO3O7lApTV+q8e/uxNHLRU5oERERicnl5oOR1+/sDqB2LxqSxmDEDUwe1A4nXx8HlcSSsL9vOO6EFhERkZiFWAT3Jsfh8Csp3IvGAgYjbkImkyHEz3Qram6gR0TkfJYGaTQ+CgRpTP9+Uz1+lLkRqX1rOE5JROR8Wp10SsqEcH8Ht8Q9MRhxI638TIORnafzkXGx0PGNISIiA3OZVz97pL+DW+KeGIy4EXM7+t714W8ObgkREYmZy7wqtfiATPF/yY1IzRkhIiLnM9cz4sO9aKzC/yU3Yq5nBACquR8CEZFDaXV6XCurzfdUWVMfjKR0izTc9uFO61ZhMOJGLAUjc/+TgaslVRj19jZ88OtpB7aKiMg7PfHFQfR7PRXnrpaiSpQd+6nRHQ232TNiHf4vuZH+CaFmj/3vcDY++S0TmfllePvnUw5sFRGRd9pyPBcAsGJXJipv9E6/dFs3o83ypPJDkakm/S8tXboUCQkJ0Gg0SEpKws6dOy3Wr6qqwoIFCxAfHw+1Wo0OHTpg1apVTWqwN+sWHYQxXSPNHt99tsCBrSEiIgD46vcs/HjoCgBA7SOHxkeBjJduwZFXUixmZqV6Nu/au2bNGsyePRtLly7FkCFD8NFHH2H8+PE4duwY2rZtK3nOxIkTkZubi5UrV6Jjx47Iy8tDTU1NsxvvbWQyGVZMScbPf+Tgsc/TTI6Ll/jW6PRQMiInImpxlVodDplJqRCgrv1YDZFIxUDm2RyMLF68GNOmTcP06dMBAEuWLMHmzZuxbNkyLFy40KT+pk2bsH37dpw7dw6hobXDDO3atWteq73cyC4Rjdb5aMc5PDmqY6P1iIjINm9vPokVuzIljwVqbP5YJdg4TFNdXY20tDSkpKQYlaekpGD37t2S5/z3v/9FcnIy/vnPf6JNmzbo3LkznnvuOVRUVDS91V5OpZRj6YP9LNZ5a/NJnLta6qAWERF5j/8dzjZ7LEDNFAxNYVMIl5+fD51Oh8hI43kLkZGRyMnJkTzn3Llz2LVrFzQaDdavX4/8/HzMnDkT165dMztvpKqqClVVVYb7xcXFtjTTK+QVVzZa59zVMrRvHeCA1hAReQ+FhXkgdcM0ZJsmTSqQNdgPRRAEk7I6er0eMpkMX375Jfr3748JEyZg8eLFWL16tdnekYULFyI4ONjwExcX15RmerSU7lGN1jlfUOaAlhAReY8VO8/hcmH9Z1d8mJ/RcQ7TNI1NwUh4eDgUCoVJL0heXp5Jb0md6OhotGnTBsHBwYayrl27QhAEXLp0SfKc+fPno6ioyPBz8eJFW5rpFWJCfLHtuZGG+1KbMdUtOyMioubT6vR4Y8Nxw/2dfx2F72cOMarDnpGmsSkYUalUSEpKQmpqqlF5amoqBg8eLHnOkCFDcOXKFZSW1s9fOHXqFORyOWJjYyXPUavVCAoKMvohU61ESdAeG97ecLt7TO3/195z11BUrnV4u4iIPE1xpRZPfHHQqCwu1A+t/FVIim9lKPNnMNIkNg/TzJ07FytWrMCqVatw/PhxzJkzB1lZWZgxYwaA2l6NyZMnG+o/8MADCAsLw9SpU3Hs2DHs2LEDzz//PB555BH4+vq23JV4IbVoAybxEGb71gEIvPGGyC+rangaERHZaEnqabO9zc+ldDHc5sZ4TWNzCDdp0iQUFBTgtddeQ3Z2Nnr06IGNGzciPj4eAJCdnY2srCxD/YCAAKSmpuLpp59GcnIywsLCMHHiRLzxxhstdxVeSpxmWIb6aESvF9DKX4WSqhpcL6sGWjujdUREnuOMhdWJAxJC8ae+bdAuzHS4nKzTpP6kmTNnYubMmZLHVq9ebVKWmJhoMrRDzSee0S2eP6wXBIT6q5B1rRwFNzZxIiKipmu4ROMff+ppuC2Xy/CvSX0c2h5Pw/4kDyFezdQ/IdSwqd51BiNERC2qQ2t/PDBAOuM4NQ1n2ngIGYBtz43E3nMF+HNSLP64UpubhT0jRETNJ+59judwTItjMOIhlAoZ2oX7o92NJb51a91Lq7gHEBFRc+n0guG2mpNUWxz/R93cw4PboXtMEMY2SILmr6oNRspFwcjRy0WYuyYDVwqZip+IyFo1Oj1O5ZYY7g/pGO7E1ngm9oy4uVfu6C5Z7qtSAAA+3XMBmQXleHp0R9y7fA8A4GppFT6fNsBhbSQiciff7MvCd2mX8Oqd3dE9Jhi7zuQjt7g2TUJKt0hMuolZwVsae0Y8lP+NYAQAdpy6aghEAGDn6Xwcz+Z+P0REUj7cdgYHLlzHgyt+B1DbqwwAd/SOwceTk43SKlDL4P+oh/JTWe70EgcnRETeThAEVNfoAQAXr9UOZRfeyGCdcbEQANCjDbOB2wuDEQ/lp1ZYPF5aVYNKrc5BrSEicm0Prvgdgxf9gvJq40n//9x0AluO5wEAhnViBkl7YTDiofxUloMRADiZU9JoHSIib7D7bAHyS6ux91yBUfnSbWcBAMG+PugazZ4Re2Ew4qF8fRqfm/zI6v1Gy9WIiLxR3fAMAOj00nXkDVOwUotiMOKhFFa8cwrKqs1u/ERE5C3KRCkQzA1f82ubfTEY8VA1ejPhfQN5JdzVl4i8mzg5ZGGFVrKOwGjErhiMeKh+bVshLtS30XplzNBKRF6upLL+7+AP6Zcl6wiMRuyKwYiH0vgosO25UY3WK2cwQkRe5ujlImw6mm24L+4ZOXDhOgBgxogOmD2mk6GcoYh9MRjxYFLzRp4f2wWxrep7TEqruLyXiLzLbe/vwowvDuLwpUIAQGmV8dCMUi7Dk6M6YPaYzvWFjEbsisGIh3v//r5Gu02O6xGFjhEBhvuF5dzVl4i805m8UgCmX8piQnwRqPEBAPgoav+AdmfCM7tiMOLhbu8dg9NvjEfv2GDEtvJFmxBfiPtL/nvoikmSHyIiTyWe+1HXe3y9zPhLWWSQ2nD7+yeH4N6kWCye2Mch7fNW3CjPCygVcnz3xGAoZDLI5TKj3sYavYANh7NxbzI3fiIiz1chWrqrlMvx5e8X8PJ//zCqExGkMdzuHhOMt+7t7bD2eSsGI17C0sZOH2w9g3v6xaKwQotWfj6QyZjdh4g8k3iy6pNfHZSsEyUKRsgxOEzjhcQr1AI1SlwoKMc7qSfR7/VUvPjDUec1jIjIzsqtmLTfys/HAS0hMQYjXm5E59qNnz7cWrv/whd7s5zZHCIiuyq1Ip2Bv5qDBo7GYMTLxYQ0nhiNiMhTlFc33jPCYMTxGIx4ufAAlbObQETkMNZknQ5gMOJwDEa8kHg1TXiA2mw9IiJPU1xpuvdMwwSR7BlxPAYjXo7BCBF5k+0nr5qUHVgwBu/e18dw31+lcGCLCGAw4vVC/TlMQ0TeITO/DOskNsJr5a9C68D6L2bsGXE8BiNezk/iG4DUbHOdnhszEJF7u1BQZlJ2V58YAEBrUS8x54w4HoMRL+enMn3TvfPzSaP7a/Znoecrm7H3XIGjmkVE1OIqtaYraf5xd08Axr3Eah9+NDoa/8e9kHhvBl+JnpFPfjtvdP9va4+gvFqHp75Kt3fTiIjspi4VfGJUIO7v3xb/e3qo4QtZqL8Kt3SLxMgurY16Scgx2Bfl5aSGadqE+OL79MvoFRuM9q0DREc4VENE7kmnF1B2I/tq21A/LLzRI1JHJpPh35OTndE0AoMRrye1Z83lwgrMXpMBADi/6FYHt4iIqGXp9AJufW8nTuSUAJDuESbn4jCNF5rQMxpAbQ9IY345nmu4nV9ajee+PYSqmsYzGBIRuYqCsipDIAIAvj4MRlwNe0a80KTkOMSE+KJXm2Cj8o4RATiTV2pUNu3TA0b3v0u7hC6RgXh0eHu7t5OIqCVUVuuN7msYjLgcBiNeSC6XGTbIEwvxtW6nynP5psvjiIhcVbnWOF2BXuD8N1fDYRoyCPVXITKo8VnkUumUiYhc1dHLxUb3Sysb35+GHIvBCBkkt2uFH58e2mi94goGI0Tk2gRBwI+HrmDa6v147ttDRsdKrNgsjxyLwzSETbOHYcepq3h4cAJUysbj052n8x3QKiKipvnpSDbmrTuCIjNfnKSSn5FzMRghJEYFITEqyKZzLhSUIT7M304tIiJquie+PGj2mMZHjr+OTXRga8gaDEaoSXKLqxiMEJHbOfzyWKt6gMmx+IpQk0z8aA9qdPrGKxIRuRAGIq6Jrwo1Wda1cmc3gYjIah0jAhqvRE7BYIRMfDtjEFQSaeIbyi+tdkBriIisJ1jIIbJqyk0ObAnZgsEImbipXSiW/aWf4f6iu3vi5sQIk3ozvkjD3P9koJTL5IjIia6X1X8xavj3SLwZaNswP4e1iWzDYIQkBajr5zarlHIo5DKTOtfKqrHu4GV8uPWMI5tGRGTw2Z7z6Pt6Kj7bcx4AUNCgx3bJpD64p18s1j4xyAmtI2sxGCFJgZr61PAqpVxyd986OUWVjmgSEZGJl374w/CvTi9g0sd7jI53iAjAOxN7Iyk+1BnNIysxGCFJgRpRz4hCDqWivmfkhQnGa/Rlpp0mRER2U15dgxqdHrvPGCdg3HAkG7nFVUZl1u65Rc7FPCMkSRyMyGQyKOX1cetjwzvgsz0XcOl6BQBAzmiEiBykuFKLvq+lonNkIKoaZFL96Ui2Sf1gBiNugT0jJEk8Z6SqRgdlgzkjYf4qw23xkeJKLXR67ohJRPax79w16PQCjmcXI0D0pUkpl+HI5SKjuj3bBENpxcpAcj72jJAk8Ru4ukYPH6VxMBIqCkYA4Hh2MfxVSgx/ayuGdQrH59MGOKSdRORddKKlu/4q44n2eTeGaOaNT8Td/dogzL/xXcjJNTAYoUa18lcZDdMAxl2f36Zdwrdplwz3uZEeEdmLXtTzqvGp/7tUXl0/ZPPIEOs2/STXwWCEzFr+lyQcvVyEkZ1b43x+mdExcfcoEZGjiHtGpFb5tfLzYSDihpr0ii1duhQJCQnQaDRISkrCzp07rTrvt99+g1KpRJ8+fZrytORg43pE4bmxXSCTyfDggHhMGRSPTx6uzWCoUSosnqvnvBEisgPxnLS0C9dNjjMQcU82v2pr1qzB7NmzsWDBAqSnp2PYsGEYP348srKyLJ5XVFSEyZMn4+abb25yY8l5VEo5Xr2zB0bdyMTa2KSwsuoanMotwas//oH80iqLdYmIrCUejikoM92S4tU7ujuyOdRCbA5GFi9ejGnTpmH69Ono2rUrlixZgri4OCxbtszieY8//jgeeOABDBrELHiewEdheTlv6rFcpPxrBz757TxeWHfEQa0iIk/33i+nLR4f2cV06wpyfTYFI9XV1UhLS0NKSopReUpKCnbv3m32vE8++QRnz57Fyy+/bNXzVFVVobi42OiHXEvDCa0Nzf3PIcPtP67w9SOi5rtaUoXsRjI+a3wsDyGTa7IpGMnPz4dOp0NkZKRReWRkJHJyciTPOX36NObNm4cvv/wSSqV1kx4XLlyI4OBgw09cXJwtzSQHUDbSMyImta8NEZGtTueVWDy+ckqyg1pCLa1JM31kDTJuCoJgUgYAOp0ODzzwAF599VV07tzZ6sefP38+ioqKDD8XL15sSjPJjhobphGzJXAhIjLndG6pxeMdIwIc1BJqaTatzwwPD4dCoTDpBcnLyzPpLQGAkpISHDhwAOnp6XjqqacAAHq9HoIgQKlU4ueff8bo0aNNzlOr1VCrmazGlYX4qhqvdEPD7K1ERE2RU2x5iKZhMkZyHzb1jKhUKiQlJSE1NdWoPDU1FYMHDzapHxQUhCNHjiAjI8PwM2PGDHTp0gUZGRkYMIBZOt3VnX1jrK6raGR+CRGRNYortGaPhfj5GG1jQe7F5ldu7ty5eOihh5CcnIxBgwbh448/RlZWFmbMmAGgdojl8uXL+OyzzyCXy9GjRw+j8yMiIqDRaEzKyb2olQpMH5qAFbsyAdQu/a2u0UvWNdczUqnVcbIZEVmtpLLGpOy5lM54eEgClHKZ5HQBcg82ByOTJk1CQUEBXnvtNWRnZ6NHjx7YuHEj4uPjAQDZ2dmN5hwhz6DV1QcfB1+8BTlFlRizeLtJPak5I7+fK8Ckj/fiuZTOeGp0JwiCgNKqGgRquMMmEdW7WlKFw5cKEezrg/8eumJ07MlRHfDU6E5Oahm1JJkgCC6fKrO4uBjBwcEoKipCUFCQs5tDN8xfdwRf76sNPM8vuhUAsGTLKSzZYpwHoHdsMD56KBlRwRpD2S2Lt+N0Xqnh3Mc+O4Cfj+Viy9wRnIRGRACA0qoa9Hh5s0n5CxMSofFRYGJyHHtXXZy1n98czKcmu6tP7byRbtH1v2BSPRuHLhVh4MJfcEa0LE/XIF38z8dyAQBf/n7BHk0lIjeUVVAuWd4tOhiTB7VjIOJBGIxQkw1oH4Zfnx2BdTPrJy8HWdhA79u0Syirqh3zrTGzd43r99MRkaM0/NJSx0/NIMTTMBihZmnfOsDo24mlOR8fbT+H5De2IPVYLrKuSX/jISKqm49WVm06YRUAfLhCz+NwHRS1KEs9IwBQodXh0c8OmD3uBlOYiKgFvPbjMQDAS7d3M5SVV9fg5z9ysWD9EfypXxvJbSfu7x+HHm04d9DTMBihFhXky9UwRGRZUbkWq36rTQsw6+aOCPGrTVb21Ffp+PVEHgDgi72mqzLVSjkW3t3LcQ0lh2EwQi0qUNQzolLIUa2Tzj1iDvtFiDxfjV4vul3/rq8LRBpqHajGtKEJGNQ+zO5tI+dgMEItSjxnJFCjREFZtU3n6zlMQ+TxxPNSSytrEOqngqV8ZTq9gBkjOti/YeQ0nAVELUrcM9I60Pb9hRiLEHk+cc/IyLe34S8rf7f4xaVUIvMqeRYGI9SifBT1v1JNCkZasjFE5JJqdMbv9N1nCywGHFzK6/kYjJDdxLbys/kc9owQeT6puWSlVeaDkeV/SbJnc8gFcM4ItbhPH+mPkznFuL9/W/xyPBdJ8a3w09Ecs/XX7OdeRkTepGHPCABDQsSG+rYNwUBOXPV4DEaoxY3o3BojOrcGAOyeNxoKuQwJ8zearf+3tUdE99g1QuTptBI9I9fLpeeM+Kv4MeUN+CqTXSkVto0EcpiGyPNJbQeRV1IlWTe/VLqcPAvnjJBLEQTg870XTLYKJyLPIdUzcj5feosIfzW/M3sDvsrkUnKKK7Hm+4sAgJRukdyVk8gDSQUjdRlZG5o/PtHezSEXwJ4Rcgi5hYRGYkUVWsPtC2a2Dyci97DnbAHe3nwSNQ2CD6kJrA09MKAtTr0xHsntQu3VPHIh7Bkhh5iYHIdv9l9stF7GxULD7TN5pegSFWjHVhGRPd3/770AgOgQDR4cEI/Nf+Tgu7RLOJNX2ui5//hTT3s3j1wIgxFyiJdu74bkdqG4UliBxamnrDrn0vVyXLpejnd+PoXpwxLQPSbYzq0kInvIvFoGAHj887RG647tHolbukXZu0nkYhiMkEP4qZT4c1IscosrsTj1FPq2DUF6VqHFc0oqa3D/v/fi4rUKHLtSjM1zhjumsUTUZB9uPYOcokq8dmd3Q1ljgzJqpRzThyXgtl4x6BodZN8GkktiMEIOFRmkQcZLtyBArcRPR3OQW1yJNzYcl6xbUqnFxWsVAGp7SYjI9b21+SQA4P7+bQ1lggBU15jfwXvqkAQ8P5YTVb0ZJ7CSw4X4qaBUyHF77xhMH9beaHM9sRLRXhUdIgKMjgmCgLc2n8D36Zft2lYisp54lUyFVme4XV5dg1FvbzN7nkrJjyJvx54Rcrq2oX7440qxSXmJKD20rMH+4nvPXcOHW88CAO7q28a+DSQiq4gDELF9mddwubDC7HlqBiNej78B5HQdWgdIlouX+TZcGVxQxqyMRK6msro+GBFE6ZTP5ZdZPE9lY6Zm8jz8DSCne3BAW8nyAlEaaJms9o/brydyceD8NTz37SFHNY+IrCTuGXn9f8esPo/DNMRhGnK6Ae3D8M8/98JfvztsVJ5fWr9xlgzAfw9dwTPfZJicLwiCyTAOETlWdlEFRry1zXD/0KUiq8/1ZaZlr8dwlFxCcnwrkzLxMI1eALaeyJM8V2tFNkcisq+vf89q8rkRQeoWbAm5IwYj5BLEe9DcmxQLf5XxNyWtTg+5mZzyUvtcEJFjhQU0PaCICta0YEvIHTEYIZcgDkbiQv3QMdI4DbxWp4fCzFCMpfwFROQYW47nNvnc6CDfFmwJuSMGI+QSND71v4oqpRxtQ/2MjlfX6CE3E4yIe0b0egHXy6ol6xGRfWw/dRU7T+fbdM7d/eqX5Af5cvqit+NvALkEjbK+Z8RHIUdMiHG3rVYnmB2mqRYFI09/k44Nh7Ox9onBSJKYh0JELe/A+Ws2n3N7rxj0iAlGTIiGE9CJwQi5BnGgoVLIEO5vPP5crdPDXCoC8TDNhsPZAICVu84hKT6p5RtKRCbE2ZKt8ddxXTCyS2uMSoywU4vI3TAYIZejUsrROrBBMGJxmMZ0NY3ABTZEDlNaZVsw8siQBPaGkBHOGSGX07NNCFIabCFuacXM3nMFWJt2yezxwvJqpF243mLtIyJjZaJgJLaV6WTUjbOG4dZe0Yb7Psy4Sg2wZ4RcxtbnRiK7sALdYmq3EG8dqMbVktosrFqd3uyqmZf/+wcAoFOkdFr5sUt2ILe4Cp88fBO7hYlaWGF5NS6KdtUe0bk1vhTlHHnrz73QLSYI/dq2MgyjKszM/yLvxfCUXEZCuD8Gdww33A9U18fKWp1gdhOuOlcKKw23xT3AucW1Ac3GI9kt1FIiAoAanR59XkvF0cv1G12Kez3CA1S4NzkOAMD4gyxhMEIuq2FPxw8ZVyzW/1fqKYvHdXpOJCFqruoaPR7+ZB8++PU0yqotf0GoEb3nGIuQJQxGyGW9flcPjOzS2ur6J3NLLB7XMhgharYdp65i28mrePvnU5JDp4IgIDGqNmnh+B7180TMLc0nAhiMkAuLCNRg9dT+RhPfmqOGaeOJmk0tSlBYN6dLTC8An08bgIV398T/3drVUM5QhCxhMEIub3incKP704YmNOlxuKEekW2ulVWbZDRWyus/Ns7ll0qe1zpQjfv7t4W/aN5XQrj0BHMigKtpyA1EBBpnYx3aKRx/6tsGt72/y6bHqdGzZ4TIWpVaHfq9ngoAOPuPCYYVMOJl9ueulpmcJ0A66B/SMQyv3dkdnRvsO0UEsGeE3ECgxjhm9vVRoEebYNzRO8amx+EEViLrXSmsMNyuqqmfqCqeJ5JfajpMYy7hoEwmw+RB7TCwfVjLNZI8BoMRcnl92xrvMeN7Y4dfP5VCqrqBIAgQRH8ZLSVOIyJj5dXSAYj4fVRUoTU5jyE/NQWHacjlKeQyPHtLZ7xzY+mu740gxFLiJL0emPTxXqO/jDWcM0JkNXGKd3EwIt6YsvhGMKKQyww9j9yKgZqCwQi5BfEM/rqeEUsppXOKK5FxsdCojEt7iawn7vWoMuoZqX8f5ZfWTm7tHRuMg1mFN0r5PiPbcZiG3IJaWT8kY03PSG5xpUkZl/YSWU8cjIh7Q8TDNEcuFwEwDlbYM0JNwZ4Rcjt1PSPxYX5m62QXmQYjdd3IOr2AvJJKRAebbuhFRMCin05g+fazhvvm5ozUybpWvzcNgxFqCvaMkFvQi/7CaW4EI/fd1BZ/GdgWyfGtzJ1mpO6P6Ow1GRi08FdsP3W15RtK5AHEgQhQG4zUTQaXyrpaUlk/v8Tc0l4iS9gzQm5BPN2jbnhGpZTjjbt6Qq8XkHGpEM/+5xAy803zHtSp2yfjx0O1e9x8+OsZjOhsfbp5Im/16o9/4OzVMqx5fKDRkI2U5PhQB7WKPAmDEXILgoW+X7lchn5tW2HuLZ3x9NfpZus1/EZXVl1jpiaR95J6r9VNTh23ZCf8zSyp//XZEUi7cB339Iu1Z/PIQzEYIbegt2IgekLPaKzZfxG7zuRLHi9vsMNow/tE3u6HjMvwV1n+WGi4U29sK1+8fmcPtG8dgPatmfKdmqZJc0aWLl2KhIQEaDQaJCUlYefOnWbrrlu3Drfccgtat26NoKAgDBo0CJs3b25yg8k7DWof3mgdhVyGL6YPMOwY2lCF1viPaFkVe0aI6pzJK8Uz32Rg+mcHbDpv519HYVRihJ1aRd7C5mBkzZo1mD17NhYsWID09HQMGzYM48ePR1ZWlmT9HTt24JZbbsHGjRuRlpaGUaNG4fbbb0d6uvnudKKGesYG44cnh2D/gjGN1lUrpX+tq2v0Rinh2TNC3q6wvBp3fLALK3aew/h3dzTpMWQy7sdLzScTLA3GSxgwYAD69euHZcuWGcq6du2Ku+66CwsXLrTqMbp3745JkybhpZdesqp+cXExgoODUVRUhKCgIFuaS17onZ9P4v1fz0gemzGig2GlgEwGZC681ZFNI3Ipb246gWXbzjZe0YLzi/geIvOs/fy2ac5IdXU10tLSMG/ePKPylJQU7N6926rH0Ov1KCkpQWio+RnXVVVVqKqq34CpuLjYlmaSl3tyVEcE+/rg5q6RGPX2NqNj4iWLzIdA3q60kkOV5BpsGqbJz8+HTqdDZGSkUXlkZCRycnKseox33nkHZWVlmDhxotk6CxcuRHBwsOEnLi7OlmaSl9P4KDB9WHskhPs7uylELq3hxPDEqEAMt2G5e5KVOX6IGtOkCawNxwgFQbBq3PDrr7/GK6+8gjVr1iAiwvyEp/nz56OoqMjwc/HixaY0k6hRWp0eer2Av284hg2Hs53dHCKHarhdU/+EUAzr2Phk8TFdI7H2iUH45rGBdmoZeRubhmnCw8OhUChMekHy8vJMeksaWrNmDaZNm4Zvv/0WY8ZYnoSoVquhVqttaRpRkxSWa3Hg/DX8e2cmgEzc2ovj3+Q9Gk4ZVCnkmDqkHTb/kYMDF64byu/pF4ux3SNx4MJ1/GVAPNpa2IqBqCls6hlRqVRISkpCamqqUXlqaioGDx5s9ryvv/4aDz/8ML766ivceiv/2JPruOnvW/DElwcN9yev2odtJ/Oc2CIi+1h38BLG/msHLhTUZyluOEyjUsqhVMgxb3yioezepFi8dmd3pHSPwgsTujIQIbuweZhm7ty5WLFiBVatWoXjx49jzpw5yMrKwowZMwDUDrFMnjzZUP/rr7/G5MmT8c4772DgwIHIyclBTk4OioqKWu4qiMyYNbojACDUX2VV/R2nruKDX88gr6QSQ9/8Fa/89w97No/Irtbsz8LcNRmo1Oow9z+HcDK3BM9/dxgAkFNUif8cuGRUv2537BA/H0PZQ4Pi4a9mfkyyL5uDkUmTJmHJkiV47bXX0KdPH+zYsQMbN25EfHw8ACA7O9so58hHH32EmpoaPPnkk4iOjjb8PPPMMy13FURmzLmlMw6/koKONmSGPHDhOl5YdxSXrldg9e7z9msckZ39be0RrEu/bLSK7FRuCRannsI4ibwiqhs5ekL86oN3pZz7qZL9NSncnTlzJmbOnCl5bPXq1Ub3t23b1pSnIGoRMpkMQRofjO0RhX3nr1l93pbjuYbbVTU6wzdGIne0ZMtpw+3Cci3e++W0ZL26YCTYt75npKqGyQHJ/tj3Rl5hyqB4hAeocPRy0Y3JqtbLKapEfBiXCZPnqwtGfBRy+Chk0OoE7jdDDsFghLyCUiHHnX3aWLXhXkMXCsoZjJBXUCvqh2QOvngLKrV6o14SInvhYCB5lQk9ozGkYxieGNkB1m6p8X3GZcPtY1eKsWZ/luQ260SuYOaXaZiyah/0DZOIWEEl2tcpUOOD1oFMsUCOwZ4R8ipqpQJfTq9N1PTxjnPQWRFUXLpeYbg94b3aHaqDfVUY1yPKPo0kaqJKrQ4bj9TmgTovWsJrLZWZTSaJ7I2/eeS1rN1rdF/mNZRVGe/h8fU+6V2qiZxly7Fc/G3tYcP9wgqtVef1bRtiuK1S8COBnIO/eeS1bNn5fNqn+43ubz91FeeulrZwi4iabvpnB/BDxhXD/T1nCxo958lRHfDefX0N99kzQs7C3zzyWjJR34hCbjky2XvuGqZ/esCo7PAlJu4jx1i+/SwmfrQHFdXGy2zLqmpQWF4tec5bm0+afbwRnVvjx6eGYs6YzggQJTRTNvI+ILIXBiPktcQ9I40FI4Bx7hEAqNAy/wI5xqKfTmBf5jV8l2a8aeiAf/yCPq+loqTSuiGZOv5qBXrGBkOpkMNPXZ9Dp6YJk16JWgKDEfJa4mCkXRP222j4LZXI3sTBgl4voPTGXKYTOSU2PY5ClFVVPE9Ex2CEnITBCHkt8TDNLd3qd53+v1u7WnX+l79fwNA3f0XGxUJ8vvcCLhdWNH4SUTOI53RU6/SG2+U2BsbijkCZKCoPYk4RchIu7SWvJf6DPOvmTqjU6nFzYoTh22Zjzl6tXTp514e/AQBWhvlh2/OjWryd5N1qREGHeFuCqpr68sZ66Sb0jDIs+QUAeYPZ2+/e1wfnrpahn2hlDZEjsWeEvJb4G6FaqcCLt3XD4I7hJn+orXW+oLylmkZkUC6am6TT6/HriVxU1ehQLQpGlok2wmuoTYgvRnWJMCpr+Ct+Z582mHNLZ6P3BJEjsWeEvJa5P7sDO4TBT6WAXhBQqdWbqUXkGOVV9cHI39YeAQBMG5qAqUPaGcoPXSw0e75aKYevynijR5nVWXaIHIM9I+S9zPw9DlArcfDFW/D9k0MMZRGBagzv3LrRh6xssMKmUquDVqfHxWvlRseOZxfjWpn0kkwisbJq02HDz/deMOoZscRHIUfv2BCjMq7gJVfDYIS8lqW/xxofhdEqg4cGxuPTqTc1+phvbDiG6ho9sosqUKnVIen1VHRa8BOG/XMrJt3IE/HR9rMY/+5O9P/7lha4CvJ04p6ROkq5DJv/yJWobUqllCMu1A8bZw0zlDV1KJLIXhiMkNeaP6F21cyUQfGSx5Wi5Y9KhRwymQyDO4RZfMwv9mbhoZW/Y9DCX7E+/TLKRBMLD10qwvx1h7HwpxMAmNOBrCPVM1JercObm05Ydb7Gp/b3uFtMkKFMzr/85GL4K0le6/7+bbHrb6Pwyh3dJY8rFfXfHn1u3LZms97fM68BqF3629D3onTdRA0JgoCL18oxd00Gdp3OBwCUSwQjYuEBxjvrTkyOxbqZgw33xStw6rFnhFwLJ7CSV4ttZT7ZmTg1dt1tAdb3Zhy9XGxD3SL8dDQbM0d2hL+ab0tv9cL6o4ZNGNelX8b5RbeiTGKYRizMX4X80irD/X/+ubfRcXFQXYdzRsjVsGeEyAxxivi625NuimvR53j4k32oqtHhtvd34cOtZy3uJ0Ker+Fu0Cn/2o6nv063eI7ax/KfcaXEmAznjJCr4VcwIjOU4u3Ub/zxvqtPG7QPD4C/WoExi3c0+zm2nbyK79MvG+4fuHCt2Y9Jrq+qRocjl4rQJy7E+PesgVO5je8MrbJwPlA/xAgAMcEaXCmqxPgeUdY3lsgB2DNCZIZ4mKbulkwmQ++4EHSMCMTXjw5EoKY+no8K0jTpeYor6ucESK2cIM8zf90R/Hn5Hrz365lmP5Y4RbzUrrvdousnrm6aMxz/e3ooBncMb/bzErUkBiNEZjS2k++gDmEY1L5+dc2e+aMxrJPtf+TFq2ps3WOE3NO6g7W9Ycu2NT8Y0QsC7k2KBQC8eU8vQ/l3Mwbh8eHt8ejw9oayII0PerQJbvZzErU0BiNEZhj1jJiJS+4f0BYA0LNNMGQyGbrH2P6HXqcXb3hm3b445Bm0OgGZ+WXNeowanYCX7+iOjbOG4Z4bQQkAJLcLxfwJXaHxkVpNQ+RaGIwQmdFYzwgAjOoSgR+fGoqvHh0AoGmrFN7++ZThdoWWPSPe5sXvjzbrfLlMhgC10iiPCJG7YTBCZIZ40zBLe3n0jA1GoMbnxjnNe06tjonQPMUPGZfx9NfpRr1dp3NLMGjhL0b1iiq0AGB1eveGbukW2fRGErkIBiNELaglNyArqtDi/o/3miz3JNcnCAKe+SYDPx66gv8dzjaUv77hOLKLKo3q1gWwFTbOF1oyqQ+mDmmHh0Ub5hG5Ky7tJbKCtT0eLZm+4V+pp7DnXAH2nCvA/f3bttwDU4vIuFiIuWsy8MKErhjToHci61q54bZC9EtRozPt/Th8qQiF5dWY+59DVj3vCxMSkRgVhOGdW+Ouvm2a2Hoi18KeEaIW1FKxyOKfT2L17vMt9GhkDzM+T8O5/DJM/+yAybFzokmpOtEeAuYmkw5a+Ct+PZFnVBbqr5KsO21oe6t2kCZyJwxGiKxgbZDRvnWA4fbd/Zr2rTWroNwk/8Q3+7Iw/dP9OJPXeBKsqhodzjdzhQY1rqRSa/ZYcUX9sbpU7YIgmJ0XIjVx+R9/6omk+FYY1ikc47rXJymzZmI1kbvhMA2RFXwayXJZ547eMbhQUI6bElqhX9tWhnwStsgvqzIpm7fuCADg0vUKbJo93OL593+8FwezCvHZI/35DdqOLKVULxIFI//cdBIqhRzHsoux60y+1Y8fFazB2idqN7x7TKL3hciTsGeEyIInRnZAn7gQ3Nor2qr6crkMz4zphMEdwpuc3+EDC1k5LxdWSJZ/+fsFvLD+CPR6AQezCgEAaw5cbNLzk3XkFnooisqNe002Hc2xKTB9974+6BMXYrhfWsX8M+TZ2DNCZMHfxiU6/Dkbzh0QCzCzo++C9bW5Koz2HOEqYbuyNFpS3GAIR6s3fjH++edeGNQ+DMP+udXk3AC1Enf2MR7iiw72bXpDidwAe0aIHCDQTBABAAsmdLX6cfwtPA6ARrebp5Zj7TANAKgUxnXD/FWIbSUdYEg96vwJifhT3zZY89hAm9tJ5A4YjBDZ0aK7eyJQrcQnU2+SPD60Y7jZVRNS/FX1Qz+F5dX476ErRt/CVUrRR5mFb+6VWh3mrsnABlEODLKNzIZgZP/560b3A9RKyGQyxIf5STywaVF4gBr/mtQHA0R7IRF5EgYjRHZ0X/+2OPRyCpLbheLDB/rh+bFdDMc0PnKsmJIMuQ3vQnHPyMOf7Mesr9PxzuaThjKl+MEsDNN8tuc81qVfxpNfHbT+ycmIeJjmLyt+x6Xr9blFGpvjEXBjt+f1M4fguxmDjI5xrQx5IwYjRHZWN9Hx1l7ReHJUR0N5QngAND4Ki939DclkwLmrtct7My4WAgC+TbtkOC7OaXH2aikOnL8m+Ti5xfUrdk7llmDOmgwuB7aR+HXbdSYfCzeeMNxvbPflurk/of4qJLcLNTr2bEoXqVOIPBqDESIHm3ojffffxtV+6Fjq7m/otzMFGP3Oduw+W79EVPzBJ85jcSKnBH9evgdHLhVZTDU+8aM9WJ9+GVNX7zc5JgicBWtOw3wfG45kI7e4NtV73f9312jpzevMTUQGgMmD4luohUTug8EIkYO9dFs3HHopBSO7RAAwvypDcj7BDR/vOCdZ3nCuAgDc/sEujHy7ftXGrydysXJXpuF+4Y1lqA23sv/kt0wkv7EFJ3KKzbbDE7256QTGLdnR6FCLVAw54q3a/+e6APGZmzuaVoLlici2BKdEnoLBCJGDyWQyBPv5GO6H+NZPYH14cDvEtvLF/f3j8NWj5ldOlFRKf1D+9bvDkuV1wzLFlVo8stq6BFqv/ngMBWXVeOmHP6yq7070etMen8/2nMfGI9lYtu0sTuSUYK1o+AsAjl4uwuRV+3D0chEA6WCkUqvHV79n4XpZNYDaiadS1Er+6SUSY54RIicb0jEMDw2MR+eoQDw0MB6v3NG90XNKzQQjlpRX1+Dmd7Y36TxPsuVYLmavyUBEoBrPjOmEO/u0wdmrpSZBl+5GwLLnbAF2nr6KtQcvIbe4CvsyC3Di9fHwMTPz+IX1Rwy3w8wEI+z9IDLGYITIyWQyGV6/q4fFOrGtfHHpen321ZO5JTY/z89/5OJqiWmqebHTuSWY9ukBPD26fnihRue680bO5JXARyFHfJi/1efUbWxXWlWDZ77JQMeIANz63i6TenXDZ/f/e69ReaVWjyOXigx7zgzrFI6dp6XTvIuXYhOReewrJHIDY7pGNl6pEfvNrKwRu+VfO5B1rRzPi4Z7TuTYHviIaXXSm8NZY/n2s7jp71vwQ0ZtKvXy6hr8edlufLj1DEqrajBm8Q6MeGuboRejKaQCEaA2SPzpiHQelts/2IXiG71TYRbyxPgyGCGyCoMRIhe25rGBmD8+EQ8MaNvsx8ouqmzyuX9cKbK6rngFzobD2ej+8mazH+qNWbEzE1dLqvDMNxkAgG8PXMKBC9fx1uaThnkZgPEuuS1l5a5MPPFl43lYgnx9zB7zU5l2Pot7nerMGNEBADCFK2nISzEYIXJhA9qH4fERHRCkMf+BZy1Le9405o/Lxitqzl0tlezxqNTqMHbJDkxbvR86vYAnvzqI6hq9VR/qUuqGQuqIly4/9XW64fb18trAZPY36Zj+6QHJJckrd2Viwrs7rX7urGvljVeC8STVWTd3MjrWcPlvVJBGMo/I82O74MenhuLF27pZ3T4iT8JghMgNRAZJT4QEalPK25tStLfK5j9yMPqd7XjsswO4XFiBL/ZeMOTV2HU6H6dyS/HLiTxMWbXP6DEEQcDBrOsoa8YOtOIP90M3kr4BwPVyLcqra/B9xhVsOZ6LrGvlJgHJ6/87hmPZLb9MWfza3NbI7s5KhfTEVYVchp6xwVAq+CeZvBN/84ncgHj1xaD2YbjvpjgAwNv39sYX0wegbaj5nCQtoUKrw56zBZj6yT689uMxAMDWk1fxr9RT+L/vj+KBFbWTPMUf/7vOGE/q/C7tEu5euhsPf2IcpCzbdhYv/3D0RiBTPz/l8z3nTdph7sO8sLwa18vrh2oyLhYiYf5GtJu3wTDfxF4C1PW9VlJLeacPTTDcXjKpj13bQuSuuJqGyE38361d8e6W05g/IRG9YkPw8u3dDRMkmzNJ1JKOEQE4k1eKxT+fQoFojkad727k4kjPKgQAmPti76OQYc3+iwBqN43bcDgby7efxXv398Wbm2rTqH+65wIA4PyiWwEAL0rkN2k47FGnsFyLwvL69tXNMam7fWefNhausnnKREufQyTmj8wbn4i7+rZBl6hA+LDng0gSgxEiNzF9WHs8MiTBsNeNeKWGpawVY7pGYMtx2+eLhAeokBzfCmfySiUDkYZqdHpozSwDVinkhnYDMGzQ9/TXpnNJ9HrBqK5YpVY66LpeXm3IJCtlzpoMs8eaS7z0WardSoUcPdoE2+35iTwBw3QiN2LuQ/q9+/si2NcHXSIDTY5ZSj1u8blkMpuWpuaXVpvdA0ellEumvb+QbzpJ9H9Hso16OeqUVdXg9f8dk3z8wnKtYRKrlPXp9huqua13NNqH+xv2HKpjLs0/EZlizwiRB0huF4qMl27Byl2ZeGPDcaNjKtHQgEohR7WVQzoyGeDrY30wkldSaXa3WrVSenfiEonJrLO+TsfILq1Nyvdlms+T8sHWM5KBmCMEaXzw63MjTcrNDSkRkakm9YwsXboUCQkJ0Gg0SEpKws6dlpfLbd++HUlJSdBoNGjfvj2WL1/epMYSkXkymQzKBh+AveNCoBLtgzK+Z5ThdpDG8neR0soa24KR4iqzqeMDNEqbPpy3nbxqUrb5jxyL59ialbZDa+uztppjaUKqVPBFRNJsDkbWrFmD2bNnY8GCBUhPT8ewYcMwfvx4ZGVlSdbPzMzEhAkTMGzYMKSnp+OFF17ArFmzsHbt2mY3noiM9U8IM7r/xbT+RsGIeLVHY0MwZdU61NiQ2bSwQmt2mEYplzX7w/mbGxNgW8Lwzq2xefZwJMW3Mip/eHA7o/ufTL3J7GMsntgbd/U1PzGWPSNE1rM5GFm8eDGmTZuG6dOno2vXrliyZAni4uKwbNkyyfrLly9H27ZtsWTJEnTt2hXTp0/HI488grfffrvZjSciY91igrB+5mB8N2MQTr4xDoEaH6NgJCygPnW5xopej2uiias/zxluse6eswUoMxOMnMgpQW5x0zPAtrQukQFQKuT45rGB2DJ3hKE8OliDPnEhhvujukTg1p71uUMOvZSCkV1ao1dsMIZ2ks7vUjfE9BCzqRJZzaY5I9XV1UhLS8O8efOMylNSUrB7927Jc/bs2YOUlBSjsrFjx2LlypXQarXw8TFdCldVVYWqqvrMi8XFLZ+oiMhT9W1r/G1fLZozEuJbH4w0NgTz3v198ZtoA7jOkYFICPdHZn6ZZP21By+hc2SA2cdr7h43tlLIZWb3rIltVZuXxUchR1yor6F8SMdwnMwpQYYooVr/hFBsuJHOPtjPB6un9rf4vB880A/7MgswtKPpvBcikmZTMJKfnw+dTofISONNuyIjI5GTIz2em5OTI1m/pqYG+fn5iI42zVi4cOFCvPrqq7Y0jYjMEPeMBIvyYIxOjDAKECYmx+I/B2rzhiyY0BV39I5B79hgbDuVh4cH1ybu6hMXYjYYAYBTuaUt3fwm81HIMKpLa8llzeL/B7VSgb+O6wJtjYDuMUFYcGtX+CjkmNS/NrHcAwPawtdHgYHtw0weR0qAWonRic3f2JDImzRpNY2swdivIAgmZY3VlyqvM3/+fMydO9dwv7i4GHFxcU1pKpHXEwcj4l6AWTd3Qqi/CqMSI9ChdW2PRl0wUvfWjA/zx975NxveqwnhzZ/0acmQjmH47UxBo/WS4lvh+bFd8OhnB1BSKT1p1kchx78nJyNh/kaj8l6xwUjpbhwszBxZv3ldWIAab/65l9HjTLyJf3+I7MmmYCQ8PBwKhcKkFyQvL8+k96NOVFSUZH2lUomwMOlvGmq1Gmq1+b04iMh64omjbUP9sGRSH2h8FND4KDB9WHvJc8Tbuoi/NNg7GOkcGWhVMHJTu1AMbB+G/QvGIPHFTZJ1VAq55Bee/z41tNntJKKWZdMEVpVKhaSkJKSmphqVp6amYvDgwZLnDBo0yKT+zz//jOTkZMn5IkRkP2qlAnf1bYNxPaIaryxhmJlJmw39361dm/T4AVYkaHtoYDyeubE7rlpp/k8YU68TuQ+b361z587FihUrsGrVKhw/fhxz5sxBVlYWZsyYAaB2iGXy5MmG+jNmzMCFCxcwd+5cHD9+HKtWrcLKlSvx3HPPtdxVEJFZelE3h6UPb7GesdLpy0P8VEj7vzFYMTnZqPzuBktcY1vVDwfd2shOtmLiFT5tQnxNjkcEqvHy7d0My5ItDQ/Xbar3+Ajp3h8ich02zxmZNGkSCgoK8NprryE7Oxs9evTAxo0bER9fu4wtOzvbKOdIQkICNm7ciDlz5uDDDz9ETEwM3nvvPdxzzz0tdxVEZJZ4QYm5dPJ1fnl2BM5dLbM4WTMsQI2BHeqPB6iVWDypD349mWfYH0a8k2170dCOSilHbIgvfBRyySRlwb4+2Dx7OLKLKlBYrsVs0Z4ynSICsG7mYCgb6fGYPjQBK3Zl4sXbugEA5o1LxKXrFdhwONvieUTkPE2awDpz5kzMnDlT8tjq1atNykaMGIGDB003xCIi+xOsz1uGDq0DDJNZLREvC65L7iVeRlvXKwEY93YMah+GTx/pj3UHL2Hufw6ZPG6ovwpdogLRJSoQWp0eG45kI/VYLgBgcIcwBGoaH9pdcGtXzBjZwZDgTSaTISHMvnNdiKh5OKhK5OH0tkQjVhJnF9Xe2OtGLwpGfETBiI9ChocGxkMuA55L6QIAZvN/tPJTic6rXQ0jvm8NmUxmlGkWqN2BmIhcFzfKI/Jwgh2CEbHqmhvBiOhplPL6wEEhl+O1O7vjuZQuCPar7dkwl2a+lb/5ng+VmfkuNydG4JcTprlExO7r3xZ7z12T3ICPiJyPPSNEHu62XjEAgO4xQXZ5/LrAQieIe0bq/7Qo5TLIZDJDIAIANaKdg9+5t7fhdqif+R4Mc8HIRw8l4fsnh2B0YoTJxNo6Gh8Flj+UhPv6t23kaojIGdgzQuTh2oX748D/jTHKOtoSHh/RHh9tP4cFE2qX8ZobphHPH6mj1dXXvblrhOG2OGCpExGoRl5JFW7pJp3LSKmQo09cCFY9bH5TOyJybQxGiLxAwzkULeGvYxNxT79YdIqonfAq7hlRNugZaUg8HBPip8LSB/tBrZRDrTTdL+eXZ0cgr6TKqom1ROSeGIwQUZMo5DJ0jgw03BeM5ozIRPVMh1du7xWD389dw6AbS4Qn9DSfiyRQ42PVKhoicl8MRoioxYnnjPhIDNMoFXIsuqeXSTkReSdOYCWiFnHbjUyr/RNCjeaJyC1kSSUiAtgzQkQtZOHdPTG0YzjGdo9qNNMrEZEYgxEiahGBGh/D0tny6hpDuX2znBCRJ+AwDRG1OKXEpFUiInP4F4OIWpx40qq9M8ASkftjMEJELU4mEwcjTmwIEbkFBiNERETkVAxGiMiuBE5hJaJGMBghIrviMA0RNYbBCBHZVUK4v7ObQEQujnlGiMguvn9yCC4UlKFv21bObgoRuTgGI0RkF33iQtAnLsTZzSAiN8BhGiIiInIqBiNERETkVAxGiIiIyKkYjBAREZFTMRghIiIip2IwQkRERE7FYISIiIicisEIERERORWDESIiInIqBiNERETkVAxGiIiIyKkYjBAREZFTMRghIiIip3KLXXsFQQAAFBcXO7klREREZK26z+26z3Fz3CIYKSkpAQDExcU5uSVERERkq5KSEgQHB5s9LhMaC1dcgF6vx5UrVxAYGAiZTNZij1tcXIy4uDhcvHgRQUFBLfa4rsTTr5HX5/48/Ro9/foAz79GXl/TCYKAkpISxMTEQC43PzPELXpG5HI5YmNj7fb4QUFBHvkLJubp18jrc3+efo2efn2A518jr69pLPWI1OEEViIiInIqBiNERETkVF4djKjVarz88stQq9XObordePo18vrcn6dfo6dfH+D518jrsz+3mMBKREREnsure0aIiIjI+RiMEBERkVMxGCEiIiKnYjBCRERETuXxwcjf//53DB48GH5+fggJCbHqHEEQ8MorryAmJga+vr4YOXIk/vjjD6M6VVVVePrppxEeHg5/f3/ccccduHTpkh2uwLLr16/joYceQnBwMIKDg/HQQw+hsLDQ4jkymUzy56233jLUGTlypMnx++67z85XY6op1/fwww+btH3gwIFGdVzl9QNsv0atVou//e1v6NmzJ/z9/RETE4PJkyfjypUrRvWc9RouXboUCQkJ0Gg0SEpKws6dOy3W3759O5KSkqDRaNC+fXssX77cpM7atWvRrVs3qNVqdOvWDevXr7dX861iyzWuW7cOt9xyC1q3bo2goCAMGjQImzdvNqqzevVqyfdkZWWlvS9Fki3Xt23bNsm2nzhxwqieK72Gtlyf1N8TmUyG7t27G+q40uu3Y8cO3H777YiJiYFMJsP333/f6Dku8R4UPNxLL70kLF68WJg7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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "grid = np.linspace(-1, 1, 1000)\n", "sns.lineplot(\n", " x=grid,\n", " y=(grid**2) + rng.normal(scale=0.02, size=len(grid)),\n", ");" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res = em.minimize(\n", " criterion=sphere_with_noise,\n", " params=start_params,\n", " algorithm=\"scipy_lbfgsb\",\n", " logging=False,\n", " criterion_kwargs={\"rng\": rng},\n", ")\n", "\n", "res.success" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "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", "
value
x_01.0
x_12.0
x_23.0
x_34.0
x_45.0
\n", "
" ], "text/plain": [ " value\n", "x_0 1.0\n", "x_1 2.0\n", "x_2 3.0\n", "x_3 4.0\n", "x_4 5.0" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res.params" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'ABNORMAL_TERMINATION_IN_LNSRCH'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res.message" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So the algorithm failed, but at least tells you that it did not succed. Let's look at a different kind of numerical noise that could come from rounding. " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def piecewise_constant_sphere(params):\n", " params = params.copy(deep=True)\n", " params[\"value\"] = params[\"value\"].round(2)\n", " return sphere(params)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.lineplot(x=grid, y=grid.round(2) ** 2);" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Minimize with 5 free parameters terminated successfully after 1 criterion evaluations, 1 derivative evaluations and 0 iterations.\n", "\n", "The value of criterion improved from 55.0 to 55.0.\n", "\n", "The scipy_lbfgsb algorithm reported: CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res = em.minimize(\n", " criterion=piecewise_constant_sphere,\n", " params=start_params,\n", " algorithm=\"scipy_lbfgsb\",\n", " logging=False,\n", ")\n", "\n", "res" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This time, the algorithm failed silently." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.8" } }, "nbformat": 4, "nbformat_minor": 4 }