{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "r_L60vrWwF6K" }, "source": [ "# DeepHyper 101\n", "\n", "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/deephyper/tutorials/blob/main/tutorials/colab/DeepHyper_101.ipynb)\n", "\n", "\n", "In this tutorial, we present the basics of DeepHyper.\n", "\n", "Let us start with installing DeepHyper!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "hfYqrnVrt2dL" }, "outputs": [], "source": [ "!pip install deephyper\n", "!pip install ray==1.9.2 -I" ] }, { "cell_type": "markdown", "metadata": { "id": "6KDQk8Qswa7r" }, "source": [ "
\n", "\n", "Warning\n", " \n", "By design asyncio does not allow nested event loops. Jupyter is using Tornado which already starts an event loop. Therefore the following patch is required to run DeepHyper in a Jupyter notebook.\n", " \n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2BYSmCkHvG5v", "outputId": "80af438c-43e6-4e35-9ba5-64230038c2f6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: nest_asyncio in /usr/local/lib/python3.7/dist-packages (1.5.1)\n" ] } ], "source": [ "!pip install nest_asyncio\n", "\n", "import nest_asyncio\n", "nest_asyncio.apply()" ] }, { "cell_type": "markdown", "metadata": { "id": "7_q9aldNxBYi" }, "source": [ "## Optimization Problem\n", "\n", "In the definition of our optimization problem we have two components:\n", "\n", "1. black-box function that we want to optimize\n", "2. the search space of input variables\n", "\n", "### Black-Box Function\n", "\n", "DeepHyper is developed to optimize black-box functions. Here, we define the function $f(x) = - x ^ 2$ that we want to maximise (the maximum being $f(x=0) = 0$ on $I_x = [-10;10]$). The black-box function `f` takes as input a `config` dictionnary from which we retrieve the variables of interest." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "id": "h69qB3oPt-8Q" }, "outputs": [], "source": [ "def f(config):\n", " return - config[\"x\"]**2" ] }, { "cell_type": "markdown", "metadata": { "id": "TojZXhQbyfUM" }, "source": [ "### Search Space of Input Variables\n", "\n", "In this example, we have only one variable $x$ for the black-box functin $f$. We empirically decide to optimize this variable $x$ on the interval $I_x = [-10;10]$. To do so we use the `HpProblem` from DeepHyper and add a **real** hyperparameter by using a `tuple` of two `floats`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "l7G5OOT2uND5", "outputId": "c1b85bcc-b971-4175-86e0-80610a2fdc26" }, "outputs": [ { "data": { "text/plain": [ "Configuration space object:\n", " Hyperparameters:\n", " x, Type: UniformFloat, Range: [-10.0, 10.0], Default: 0.0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from deephyper.problem import HpProblem\n", "\n", "\n", "problem = HpProblem()\n", "\n", "# define the variable you want to optimize\n", "problem.add_hyperparameter((-10.0, 10.0), \"x\")\n", "\n", "problem" ] }, { "cell_type": "markdown", "metadata": { "id": "XSFOmHpMz3EW" }, "source": [ "## Evaluator Interface\n", "\n", "DeepHyper uses an API called `Evaluator` to distribute the computation of black-box functions and adapt to different backends (e.g., threads, processes, MPI, Ray). An `Evaluator` object wraps the black-box function `f` that we want to optimize. Then a `method` parameter is used to select the backend and `method_kwargs` defines some available options of this backend. For Jupyter notebooks we use the Ray evaluator (`method=\"ray\"`).\n", "\n", "Depending on available resources (`num_cpus`) available and the quantity of resources used by each computation of the black-box function (`num_cpus_per_task`) the number of available workers is automatically computed.\n", "\n", "It is possible to define callbacks to extend the behaviour of `Evaluator` each time a function-evaluation is launched or completed. In this example we use the `LoggerCallback` to follow the completed evaluations and the evolution of the objective." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "VRXubHiXuQOY", "outputId": "ca5fc1a4-aa21-4220-b0a9-934c9e06961b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Evaluator has 4 available workers\n" ] } ], "source": [ "from deephyper.evaluator import Evaluator\n", "from deephyper.evaluator.callback import LoggerCallback\n", "\n", "\n", "# define the evaluator to distribute the computation\n", "evaluator = Evaluator.create(\n", " f,\n", " method=\"ray\",\n", " method_kwargs={\n", " \"num_cpus\": 1,\n", " \"num_cpus_per_task\": 0.25,\n", " \"callbacks\": [LoggerCallback()]\n", " },\n", ")\n", "\n", "print(f\"Evaluator has {evaluator.num_workers} available worker{'' if evaluator.num_workers == 1 else 's'}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "7mxkmjXX1yWU" }, "source": [ "## Search Algorithm\n", "\n", "The next step is to define the search algorithm that we want to use. Here, we choose `AMBS` (Asynchronous Model-Based Search) which is a sampling based Bayesian optimization strategy. This algorithm has the advantage of being asynchronous thanks to a constant liar strategy which is crutial to keep a good utilization of the resources when the number of available workers increases." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "id": "C2T_35WTuQZ9" }, "outputs": [], "source": [ "from deephyper.search.hps import AMBS\n", "\n", "\n", "# define your search\n", "search = AMBS(problem, evaluator)" ] }, { "cell_type": "markdown", "metadata": { "id": "RYCy0p4A2lOo" }, "source": [ "Then, we can execute the search for a given number of iterations by using the `search.search(max_evals=...)`. It is also possible to use the `timeout` parameter if one needs a specific time budget (e.g., restricted computational time in machine learning competitions, allocation time in HPC)." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "x07fSC0zuepm", "outputId": "4ba089ca-6f70-4841-ee20-d7c047898ea2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[00001] -- best objective: -48.01665 -- received objective: -48.01665\n", "[00002] -- best objective: -32.48806 -- received objective: -32.48806\n", "[00003] -- best objective: -6.95366 -- received objective: -6.95366\n", "[00004] -- best objective: -0.02131 -- received objective: -0.02131\n", "[00005] -- best objective: -0.02131 -- received objective: -6.22327\n", "[00006] -- best objective: -0.02131 -- received objective: -6.66244\n", "[00007] -- best objective: -0.02131 -- received objective: -23.36765\n", "[00008] -- best objective: -0.02131 -- received objective: -18.95907\n", "[00009] -- best objective: -0.02131 -- received objective: -16.40159\n", "[00010] -- best objective: -0.02131 -- received objective: -9.62992\n", "[00011] -- best objective: -0.02131 -- received objective: -17.61847\n", "[00012] -- best objective: -0.02131 -- received objective: -24.02175\n", "[00013] -- best objective: -0.02131 -- received objective: -8.78387\n", "[00014] -- best objective: -0.02131 -- received objective: -1.66473\n", "[00015] -- best objective: -0.02131 -- received objective: -2.46526\n", "[00016] -- best objective: -0.02131 -- received objective: -1.18740\n", "[00017] -- best objective: -0.02131 -- received objective: -1.16130\n", "[00018] -- best objective: -0.02131 -- received objective: -3.40520\n", "[00019] -- best objective: -0.02131 -- received objective: -4.64195\n", "[00020] -- best objective: -0.02131 -- received objective: -1.43801\n", "[00021] -- best objective: -0.02131 -- received objective: -3.21256\n", "[00022] -- best objective: -0.02131 -- received objective: -0.44638\n", "[00023] -- best objective: -0.02131 -- received objective: -0.19772\n", "[00024] -- best objective: -0.02131 -- received objective: -0.79561\n", "[00025] -- best objective: -0.02131 -- received objective: -0.17115\n", "[00026] -- best objective: -0.02131 -- received objective: -0.08435\n", "[00027] -- best objective: -0.02131 -- received objective: -0.10716\n", "[00028] -- best objective: -0.02131 -- received objective: -0.48718\n", "[00029] -- best objective: -0.02131 -- received objective: -0.10139\n", "[00030] -- best objective: -0.02131 -- received objective: -4.23256\n", "[00031] -- best objective: -0.02131 -- received objective: -4.00711\n", "[00032] -- best objective: -0.02131 -- received objective: -5.20448\n", "[00033] -- best objective: -0.02131 -- received objective: -3.99205\n", "[00034] -- best objective: -0.02131 -- received objective: -0.05532\n", "[00035] -- best objective: -0.02131 -- received objective: -0.33852\n", "[00036] -- best objective: -0.02131 -- received objective: -0.26087\n", "[00037] -- best objective: -0.02131 -- received objective: -0.25922\n", "[00038] -- best objective: -0.01225 -- received objective: -0.01225\n", "[00039] -- best objective: -0.00311 -- received objective: -0.00311\n", "[00040] -- best objective: -0.00311 -- received objective: -0.07740\n", "[00041] -- best objective: -0.00311 -- received objective: -0.00392\n", "[00042] -- best objective: -0.00311 -- received objective: -0.02743\n", "[00043] -- best objective: -0.00311 -- received objective: -0.05363\n", "[00044] -- best objective: -0.00311 -- received objective: -0.04416\n", "[00045] -- best objective: -0.00311 -- received objective: -0.03211\n", "[00046] -- best objective: -0.00311 -- received objective: -0.01239\n", "[00047] -- best objective: -0.00311 -- received objective: -0.01307\n", "[00048] -- best objective: -0.00311 -- received objective: -0.01898\n", "[00049] -- best objective: -0.00311 -- received objective: -0.01255\n", "[00050] -- best objective: -0.00059 -- received objective: -0.00059\n", "[00051] -- best objective: -0.00059 -- received objective: -0.00727\n", "[00052] -- best objective: -0.00059 -- received objective: -0.00359\n", "[00053] -- best objective: -0.00059 -- received objective: -0.00070\n", "[00054] -- best objective: -0.00059 -- received objective: -0.00156\n", "[00055] -- best objective: -0.00059 -- received objective: -0.00462\n", "[00056] -- best objective: -0.00059 -- received objective: -0.00095\n", "[00057] -- best objective: -0.00059 -- received objective: -0.00112\n", "[00058] -- best objective: -0.00059 -- received objective: -0.00076\n", "[00059] -- best objective: -0.00059 -- received objective: -0.00159\n", "[00060] -- best objective: -0.00018 -- received objective: -0.00018\n", "[00061] -- best objective: -0.00018 -- received objective: -0.00023\n", "[00062] -- best objective: -0.00018 -- received objective: -0.00039\n", "[00063] -- best objective: -0.00018 -- received objective: -0.00168\n", "[00064] -- best objective: -0.00018 -- received objective: -0.00033\n", "[00065] -- best objective: -0.00018 -- received objective: -0.00027\n", "[00066] -- best objective: -0.00018 -- received objective: -1.65799\n", "[00067] -- best objective: -0.00018 -- received objective: -1.51467\n", "[00068] -- best objective: -0.00018 -- received objective: -0.00018\n", "[00069] -- best objective: -0.00018 -- received objective: -1.49407\n", "[00070] -- best objective: -0.00018 -- received objective: -0.04112\n", "[00071] -- best objective: -0.00018 -- received objective: -0.03010\n", "[00072] -- best objective: -0.00018 -- received objective: -0.03879\n", "[00073] -- best objective: -0.00018 -- received objective: -0.77481\n", "[00074] -- best objective: -0.00018 -- received objective: -0.95751\n", "[00075] -- best objective: -0.00018 -- received objective: -1.20611\n", "[00076] -- best objective: -0.00018 -- received objective: -0.69324\n", "[00077] -- best objective: -0.00018 -- received objective: -0.69422\n", "[00078] -- best objective: -0.00018 -- received objective: -0.00609\n", "[00079] -- best objective: -0.00018 -- received objective: -0.00586\n", "[00080] -- best objective: -0.00018 -- received objective: -0.00867\n", "[00081] -- best objective: -0.00018 -- received objective: -0.00582\n", "[00082] -- best objective: -0.00018 -- received objective: -0.00164\n", "[00083] -- best objective: -0.00018 -- received objective: -0.00098\n", "[00084] -- best objective: -0.00018 -- received objective: -0.00130\n", "[00085] -- best objective: -0.00018 -- received objective: -0.00773\n", "[00086] -- best objective: -0.00018 -- received objective: -0.00796\n", "[00087] -- best objective: -0.00018 -- received objective: -0.00952\n", "[00088] -- best objective: -0.00018 -- received objective: -0.00863\n", "[00089] -- best objective: -0.00000 -- received objective: -0.00000\n", "[00090] -- best objective: -0.00000 -- received objective: -0.00017\n", "[00091] -- best objective: -0.00000 -- received objective: -0.00004\n", "[00092] -- best objective: -0.00000 -- received objective: -0.00009\n", "[00093] -- best objective: -0.00000 -- received objective: -0.00005\n", "[00094] -- best objective: -0.00000 -- received objective: -0.00031\n", "[00095] -- best objective: -0.00000 -- received objective: -0.00005\n", "[00096] -- best objective: -0.00000 -- received objective: -0.00000\n", "[00097] -- best objective: -0.00000 -- received objective: -0.00031\n", "[00098] -- best objective: -0.00000 -- received objective: -0.00009\n", "[00099] -- best objective: -0.00000 -- received objective: -0.00002\n", "[00100] -- best objective: -0.00000 -- received objective: -0.00001\n" ] } ], "source": [ "results = search.search(max_evals=100)" ] }, { "cell_type": "markdown", "metadata": { "id": "P9A0fGwd37sm" }, "source": [ "Finally, let us visualize the results. The `search(...)` returns a DataFrame also saved locally under `results.csv` (in case of crash we don't want to loose the possibly expensive evaluations already performed). \n", "\n", "The DataFrame contains as columns:\n", "1. the optimized hyperparameters: such as `x` in our case.\n", "2. the `id` of each evaluated function (increased incrementally following the order of created evaluations).\n", "3. the `objective` maximised which directly match the results of the $f$-function in our example.\n", "4. the time of termination of each task `elapsed_sec` (in secondes, since the creation of the `Evaluator`) and the `duration` (in secondes)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 422 }, "id": "KhYxth9PvA0N", "outputId": "3c153e97-2b52-427e-bbf3-cd378edfd160" }, "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", "
xidobjectiveelapsed_secduration
06.9294041-48.01664518.6918930.015289
1-5.6998302-32.48805819.2657100.589085
2-0.1459863-0.02131219.2675660.590926
3-2.6369784-6.95365519.2669570.590303
42.4946485-6.22327120.6555891.391588
..................
93-0.00720494-0.00005276.5266121.072505
94-0.01766196-0.00031276.5264681.072291
95-0.01750497-0.00030678.0398191.515123
960.00194695-0.00000476.5287721.074623
970.00422599-0.00001879.0068090.969238
\n", "

98 rows × 5 columns

\n", "
" ], "text/plain": [ " x id objective elapsed_sec duration\n", "0 6.929404 1 -48.016645 18.691893 0.015289\n", "1 -5.699830 2 -32.488058 19.265710 0.589085\n", "2 -0.145986 3 -0.021312 19.267566 0.590926\n", "3 -2.636978 4 -6.953655 19.266957 0.590303\n", "4 2.494648 5 -6.223271 20.655589 1.391588\n", ".. ... .. ... ... ...\n", "93 -0.007204 94 -0.000052 76.526612 1.072505\n", "94 -0.017661 96 -0.000312 76.526468 1.072291\n", "95 -0.017504 97 -0.000306 78.039819 1.515123\n", "96 0.001946 95 -0.000004 76.528772 1.074623\n", "97 0.004225 99 -0.000018 79.006809 0.969238\n", "\n", "[98 rows x 5 columns]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results" ] }, { "cell_type": "markdown", "metadata": { "id": "cu9hhC4J6nBx" }, "source": [ "We can also plot the evolution of the objective to verify that we converge correctly toward $0$." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 279 }, "id": "q_ZA3J-F3_yn", "outputId": "a7da5707-83e5-4df5-dcdf-7833a4a40ba8" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEGCAYAAABy53LJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3debxcdX3/8ddnZu7Mzb035GZPyEIgBMIikBgQEKwQVLAq1Wq1VFGopPaHSxdrobbVPiytVevSan2IC2Cl4opSpSjghsgWkggBzEJYkgDJDVnvNuvn98c5M3fu3FmTe+9Mbt7PxyOP3Dlz5sx37km+n/l+P9/F3B0REZF6RZpdABERObwocIiISEMUOEREpCEKHCIi0hAFDhERaUis2QUYCzNmzPBFixY1uxgiIoeVhx9+eJe7z6x13oQMHIsWLWL16tXNLoaIyGHFzJ6p5zx1VYmISEMUOEREpCEKHCIi0hAFDhERaYgCh4iINOSwCRxmdrGZbTCzzWZ2TbPLIyJypDosAoeZRYEvAJcAJwN/bGYnN7dUIiJHpsNlHsdZwGZ33wJgZrcAlwKPj1cBfvPkLk6b301X4nD5lY2vdDbH3v40qWyOZDqLA/FohLZohO6ONtrboqP6fs/tHWBPf4qlc44iGrERz7s7jz23n3s27SKTzRGJGNGIkXMnl3NyDpPbY8ya3M6soxLEoxGSmRzJTJbBdI7BdJbBdJZMzjEgYoYZxKJGNBIhYjCYzjGQzjKYypKrsD1B/nVmQRmzuRyZXFCGbA5y7pR7pUHwOoY+m+OUvk0zNkU4ZloHf/jS+XWf/4O129m2p5/2tiiT4lHi0QjR8H6cOm8Ki2d2DTu/P5Vh445ezljQfVDlW/30bu7f8mLVc/L3I5dzsh78eygWseDeRSOGh89nc44VHS9WfI67Y+E50YiRzXnh+CELyz3iH0KRFYum8YoTas7hOySHSy04D9ha9Hgb8LLiE8xsFbAKYOHChaP65r3JDG//ygNce8lJXPWK40b12q1o/fZ93Pibpzl/yQxWnjSbrkSM5/cN8MN1z/HgU7t5xznHcMGJswrnb9xxgCtueIjtewfKXm9ye4x3n3ccV5y3iKPa2w66XAOpLLc/+jzfW7ON+7a8iDt0d7Tx8sUzOG3+FGLRoAHdcyDJHeuf5+kX+w/6vaS642d1cXodFfv67fv4i2+tq/h8Ihbh+stX8HthRbevP83lNzzIb7fu5avvXMHKk2Y3VK7vrN7KNd9/lGxpJGgRxfW+jfy+U1VprKj0+vf83mIFjnq5+/XA9QArVqwY1X81g+ksOYdteyZ+RZTO5virb69j445evvvwNuKxCCfM7uKx5/bjDlM72vj5hp1ce8lSrjr/OB5+Zg9X3vgQ7W1RPvr6k+mIx4jHIphBOuukMjl+sWEnn7lrI1+79yn+6lUn8M5zFx1U2d5/y1rufHwHC6d18IGVSzhmegf3bn6RX2/axY8ffb5wXjRinLt4Ou/5vcW8+pQ5TG6Pkc05OXciZuEf2DeQZueBJDsPJMnmciRiURKxCIlYlPa2CO1tUWJRwz34Zp8Lvzlmwmu1x6K0xyNMaotWaPWEr3PHc8GxoMVihW+tkaLWyPDXDm9dOEWtkEZrnFF0YDDN+Z/4OZ+9ayM3XHFWzfM/c+dGpkxq4+cffCWxqDGQypLK5MjmnL5Uhg9+5xGuumk1X/iT5bz0mKm8/SsPsGnnAeZ1T+LDt67nzGOn1fVlw9354i+f5BN3bOC842fwhcuW05Eo38oN7kvw+41GjKgZkTItiGzYGin+NwOE/5aC+5q/Fcbw+5l/fc6D1ks0Yk29b6PtcAkc24EFRY/nh8fGRTob/K9/ft/geL1l03z110+xcUcvX3rHS5nWGef/Hn2BR7bt5QMrl/DGZfOYOTnB33znEf7l9t/xmydf5L4nX2Re9yRuuvIsFkzrKHvNy162kPXb9/GxHz3OR257jEtOncOso9obKpe788CWF3nT8nn8+1tOL/wnfOOy+bg7B5KZQkUbj0aYFB9eaZTrKZvelWB6V4KT5jZUlHFhYRdXq5nc3sZV5x/HJ3+ygbXP7mHZwqkVz1377B7u/t1O/uY1JzKtMw4wIgh886qX8c6vPciff+Nhju6exI79g3z58hVM7Yjzxv+6l3+9/Qn+9U2nDXtNNufcv+VF7lj/AnsH0gDs7U9xz6ZdvOH0o/nUW04nHju09K2ZEYta2QoyFq19Y/Kvn6gOl8DxELDEzI4lCBhvAy4brzdPZ4Ia6YX9EztwbNvTz+fu2sSrTp7Na06ZA8CZi6aNOO/zly1j6c8m8+93buT0Bd3c8K4zCxVDJafOm8KHLj6RP/zifazdurdw/Xrt6k2xfzDDS+ZNGfHNzcwOqQtMGvPOcxfxlXu28Lm7N3FjlVbHZ+7axNSOtqotzO6OON9498u48saHWL99Pze860zOPX4GAFedfxxf+tUWXnfa0Zx93HQeeno3//fo8/z40RfY1ZukIx5lTtEXkKsvWMxfv+rEEa0HGX2HReBw94yZvRf4CRAFvubuj43X+6cOgxbHg0/t5sv3bMHdSbRFOao9xvtXLmHulEl1X+Of/jcYa/DRN5xS9Twz430rl/Da0+Yyr3tS3YnvU46eQlvUWHcQgePJnl6AEYlUGX9diRirXrGYf7vjd6x5dg/Ly7Q6Vj+9m19t7OHaS5bWHFAyub2Nb151Nr3JDN0dQ19A/vJVJ/DTx3fwgVvWAsGXh0QswsqTZvH6047mgqWzRn3QhdTnsAgcAO5+O3B7M94731W1qzdJKpM75GbwaOpPZfjEHRu46b6nmdGVYGZXgsFMli09fcyf2sHVFxxf13XufmIHdz6+g2svWcq87vqCTaOVeHtblJPmHsXaZ/c09DooChyzFDhaweXnHMOX79nCp3+6kf/842VMDVuc7s62PQN84o4NzOhKcPk5i+q6XiwaGRY0IPj38sk3n8b7vrmW5cdM5ZJT53DBibPo1MjGptMdqEM+cLjDjv2DFfvyx9vjz+3nPd94mGd39/OucxfxN685sfCf6sJP/YK1z+6t6zruzufu3sRxMzq58rxjx7LILFvQzXce3kY252UTypU8ubOPSW1R5jaYG5Gx0ZmI8f9euZh//vETLPvYnRw9pZ2F0zvYtKOXF/tSAHzsD04dkWtq1IpF07jv2pWjUWQZRQocdcgHDgjyHK0QODbvPMDbv/oAiViEb606m5cdN33Y88sWTuUXG3YWxpRXs3brXh7Zto+PXXoKbdGxbU2dsbCbm+57ho07DnDS3KPqft2TPb0sntWp/usW8qfnHcspR09h/fZ9PPbcPp5+sZ8Lls7ijAXdLF84lZOPrv/+yuFFgaMOqczQuMhWyHM882Ifl335ASJm/M9VZ3PsjM4R5yxb2M331mxj6+4BFk6vHuhuvPdpJidivGl5/ZO6DtayBUF/+LqtexsOHC89pvIIHhl/ZsY5i6dzzuLptU+WCaV1Outb2LAWx77yk9zGywv7Brnsyw+Qyua4+d0vKxs0gELCck2NfMKO/YPc/ujz/NGZC8al7/iY6R1M7WhjXZ3daBBM/Nu+d0CJcZEWocBRh+LA0ewWx3/f/zQv7B/k61eexYlzJlc874TZXXTEozUT0Tff/wxZdy4/55jRLmpZZsbpC7pZu7X+BPmWXb24a0SVSKtQ4KhDPnCYBd/4m2n/QIaj2mOcNr/6cg+xaITT53ezpso3+2Qmy80PPMvKpbM4Znr5lstYWLZgKpt29nJgMF3X+U/29AGweNb4lVFEKlPgqEMqG+Q45h7V3vQWx2A6W/fY9WULu3ni+f0MpLIjnsvlnG8/tJUX+1IHvQTIwTpjYTfu8Mi2fXWd/+TOXsxg0TgGNxGpTMnxOqQzQYtj4fQOntrV19SyDGZydQeO5Qunksk565/bV5gB/vMNO/nO6q3cv2U3u/tSLJ0zmfPCmbrj5YywtbRu615eXsd7P9nTy4KpHZrsJdIiFDjqkO+qWjitgwee2k06mxvzYauVDKazJOqcgHjGwqCCXvPMHs5cNI3NOw+w6uurmdYZ55UnzuSc46Zz0Umzx33xtSkdbRw3s7PueSZP9vSxeKZaGyKtQoGjDsWBwz1YtvvoOmdXj7ZGuqpmdCVYOK2Dtc/uxd358K3r6YjH+PH7z2dGV2KMS1rdsgVT+eXG8vNMigNzLuds6enl5RryKdIylOOoQz7HkZ/418w8x2A6y6QGumyWL+xmzbN7+P6a7Tzw1G7+9uKlTQ8aEORfdvWmuPxrD3LjvU+xfvs+bvrN01z25ftZ+g938JV7tgCwfe8AyUxOS42ItBC1OOpQ3OKA5o6sGkznmNFV/21btnAqP1j3HB+97TGWLezmbWcuqP2icfDml85n655+7nx8Bx/936GNHBfP7GTpnMl86qcbePXJc9iyK1ij6ngFDpGWocBRh0JyvNDiaN4kwEa6qmBoImB/Ost1f/CSllmyo70tyrWXnMS1l5zE07v6WPPsHk6b383xs7p4ft8Ar/r0r/j7H67nFUuC5LnmcIi0DgWOOqSzOcxgWmecSW3R5nZVZRoLHEvnTmZGV4K3rJjfsmsHLZrRyaKiGfBzp0zig68+gY/+7+Ns6ellakdbzf0+RGT8KHDUIZV12qIRzIy53e1N76pqb6s/NdUWjXDvNRcQb9IosIP1jnMWceva7fx22z5WaI0qkZZyeNUmTZLO5goV79wp7U3vqkrEGpvPkIhFD7v9jqMR41/e9BKiEWPJbHVTibQStTjqEAwPDSreOUdN4r4ndzWtLMl0/RMAD3enHD2Fb151diG3JCKtQYGjDsXzCuZOaWfHgWTDGxGNhmzOSWUb66o63J117Mg9z0WkuY6cGugQpDJeCBxzprSTzTm7epPjXo5kJlhz6khpcYhIa1LgqEM6O7TP+Nwpwdalz+0dYDCd5QO3rOXzP9s0LuUYTAfDgttbaM9zETnyqAaqw7AcRxg4nuzp44obHuKH657j15vHJ+cxmFaLQ0SaT4GjDsU5jqOnBGtU/cMP1vPAUy8yoytBf5lly7/90FbO/8TPcPcRzx0sBQ4RaQUKHHXIz+MA6O5oIxGLkMnl+MJlyznr2KllA8emnQfYunuAA8nMqJWj0FV1BCXHRaT1aFRVHdKZoXkcZsbfv+5kFs/o5NzjZ3DXEzvpLxMc8sFkT1+Ko9rbRqUcg2FyPKEWh4g0kQJHHdLZHImib/nvOHtof+7ORJT+9MgWRz5w7O5Ljdq2rIWuqgYnAIqIjCb1edSh2sZNk+LRsl1VfWErZE9/atTKkVRXlYi0ANVAdSjOcZTqjMdIZXJkwqXX8wbS+RZHetTKMaDkuIi0AAWOOhSvVVWqIx5U4qXdVfkWx+6+0ZsoqFFVItIKFDjqUDyPo9SkfOBIDg8cQzmO0Wtx5EdVNbIDoIjIaFPgqEM6UznH0RkPxhf0p4aPrOoLH+/pO7gcx+advSNW4R1qcei2iUjzqAaqQyrrtFVY5qPQ4ihJkA/kWxwHkRxft3Uvr//PX/PPP3pi2PFBrVUlIi1AgaMO1XIcQy2O0hzH0DyORmzp6eXKGx9iIJ0dMSIr31WV0FpVItJELVEDmdlbzOwxM8uZ2YqS5641s81mtsHMXtOM8tWV4yjqqsrlfGhUVQMtjp37B7n8aw9iwAmzuwoJ9rxkOksiFjnsNmUSkYmlJQIHsB54E/Cr4oNmdjLwNuAU4GLgv8xs3Ptpqs3jyI+qGihqcQwUjbBqpMXxnm88zO6+FDdccSbHz+qityRwDKYb229cRGQstETgcPcn3H1DmacuBW5x96S7PwVsBs4a57KRrjGPA6CvKHDkE+PTOuPsHUiTzdVe6DCVybHm2b28+7xjOW1+N53xWKG7K6/R/cZFRMZCq9dC84CtRY+3hcdGMLNVZrbazFb39PSMWgHS2aDSj9dIjg8UdVXlh+bOnzoJd9g3UHtIbn5jqLndweq7nYnYiK6qwYxaHCLSfOMWOMzsLjNbX+bPpaNxfXe/3t1XuPuKmTNnjsYlgaCbCqiY48h3VRW3OPKJ8gVTg72yd9fRXdVzIAgcM7sSQLAGVl8qM2xZ9sF0VutUiUjTjdsih+5+0UG8bDuwoOjx/PDYuBkKHBVaHG0jh+PmE+Xzpwath3rWq9oZBo5ZR+UDR4ycB91T+VaNuqpEpBW0ei10G/A2M0uY2bHAEuDB8SxAqkbgiESMSW3RYV1V+dbHvDBwNNTimBwEjq5EENOLE+SD6ayWVBeRpmuJwGFmbzSzbcA5wI/N7CcA7v4Y8G3gceAO4Gp3H7kU7Rgq5DgqBA7IdysVjaoqbXHUETh2HhgEYEa+qyqfdC8OHJmcchwi0nQtsR+Hu98K3FrhueuA68a3REPSmbDFEas8d2JSPDpsOG5+NNS87jDHUUdXVc+BJNM644WWTWeZFkcynaU9bJGIiDRLS7Q4WlmtHAdAR1ts2ATA/qLhuJPaonW2OJKFxDgMdVUV5040j0NEWoECRw21chwAHYloSXI8+LkzEWVaZ7yuFXJ7DiQLifH8NaGkq0rJcRFpAaqFaqgnx9FRsgtgXyqLWbDF69TOtrpGVfVUaHEUd1UNqMUhIi1AgaOGurqq4sMn6/UnM0xqixKJGFM74jVHVbl7EDiKWhz5HEdfyagqBQ4RaTYFjhoKyfEKEwAhaHEUr0/Vn87SEY6KmtYZr9ni2D+QIZXNDW9xlCxl4u4kMznatTKuiDSZaqEaCjmOKhV2aVdVfzJDZ5ijqKfFkR+KO3NycYtjeI4jGQaw9rhaHCLSXAocNdSX44jRnxw+ATA/o3xaZ5wDg5lCl1c5+cl/sya3F47FohESsUghcBR2/9OSIyLSZAocNdSX44jSn84W1pUaSGULOYqpnXGg+rIjO0tmjed1JmKF5Hh+EyflOESk2RQ4akjVleOI4T5UufelMoXFD6d1hIGjypDcnpJ1qvI6E9GRLQ4NxxWRJlMtVENd8zhKdgHsT2YLx6Z2tgHV16vaeWCQRCzC5MTwifyd8VghOa79xkWkVShw1JDvqqq0HwcUbx8bVO796UxhralpYVdVtcCRn/xXuiVsV9GeHENdVbplItJcqoVqGBqOW2WRw/jw5UH6k9nCzO98V1W19ap6eodP/itcd1jgUHJcRFqDAkcN+VFVteZxwFBXVZDjKEmOV+uq2p8ckRiHIMfRWxI4tKy6iDSbAkcN9eQ4hraPzZLNOYPpXCGYtEUjTG6PVe+q6k0OG4qbV7zvuLqqRKRVqBaqoZ7huJ1Fs7zzM8jzx6D67PFkJsve/nSFFkeMvlSmcB4oOS4izafAUUM6myMaMaKR6vtxQNBVlZ8IOKlohne12eO7eoPjs8oEjnxy3N2LhuMqcIhIcylw1JDOetX8BgwtD9KfyhaGz+aPQfUWx879I5cbGbru0L7jha4qrVUlIk2mWqiGVCZXdbkRCDZygiBw5BPkHUVdVVM74hUnAJbuNV6sKww+vcmMWhwi0jIUOGpIZ3NV53BAcXI8UxiS2xEvbnG0Veyq2llmnaq8jqJ9xwcUOESkRShw1JDO5qomxiGYHNgWNfpS2cK8i2Etjs44A+nssH3J83oOJDGD6V3xEc8V9uRIZRhM52iLVs+1iIiMBwWOGoIcR+1f06S2KAOpoeAwLMcRTgLMd0sV6+lNMq0jXvY9ugqbOWWDTZw0+U9EWoACRw2pbK5mchyC1kF/KjOUHC9qcZw2vxuA+7e8OOJ1lSb/Bdcc2pMjmclq8p+ItAQFjhrSmdpdVRDkOfqKkuPFw3FPmjuZo6e0c/fvdox4XU9v5cBRvO/4YDqnyX8i0hJUE9VQT3Icwu1jU9lCcry4xWFmXHjSLO7ZtKswOiqvZ/9gxcDRUbTv+GB6aHMoEZFmUuCood4cR0c8mKzXn8xgNnJpkJVLZ9OfyvLAU7sLx9y9eoujaEb6YDqrEVUi0hIUOGqoN8fREY8ykA4mAHa0RUcskX7O4um0t0X42RND3VXb9w6QznrZobgwPMehrioRaRWqiWqoZzguBF1T/WFXVUfJhkwQzL847/gZ3PXEzsIWs5+9axPxaIRXnTS77DWL9x0fzKjFISKtQYGjhnS29sxxCJLh/ckM/akMnfHyFfzKk2azfe8AG3f08ui2fXxvzTauePkiFk7vqHjdrnDf8cF0joSG44pICxj51ViGSWfqzXFE6U9n6UtmmRQv/2u94MRZANz1xA5+uaGHaR1xrr7w+KrXDYb5Zkmms+qqEpGWoMBRQzqbo62uUVUx+pNZBtKVWxxzprRz6ryj+NIvn2T/YIbr3ngqR7W31bhutLBWlbqqRKQV6CtsDY0kx1PZHPsHMmVzHHkXLp3N/sEMS+dM5q0rFtS8bn5p9cGMkuMi0hpUE9VQb44jv6jhrt4kHVVaBq8/bS6TEzH+8fUnE6sn6Z4PHFpyRERaREsEDjP7pJn9zsweMbNbzay76LlrzWyzmW0ws9eMd9kamccBYeBIVK7gl8yezCMffTXnLp5R1/sPJcfVVSUiraElAgdwJ3Cqu58GbASuBTCzk4G3AacAFwP/ZWbjWnvWu+RIvsWRzvqwWePllM7xqKYzEWXfQJqca79xEWkNLVETuftP3T0TPrwfmB/+fClwi7sn3f0pYDNw1niWLZXN0RarL8dR7udD1ZmIFfbyUItDRFpBSwSOElcC/xf+PA/YWvTctvDYuKk/xxEr+/Oh6owH28cCWh1XRFpCwzWcmXUCg+4+clei6q+7C5hT5qkPu/sPw3M+DGSAmw+iXKuAVQALFy5s9OVlZXNOzql7ddy8zio5jkZ1Fo3Q0n7jItIKagYOM4sQ5Bn+BDgTSAIJM9sF/Bj4krtvrnUdd7+oxvu8C3gdsNLza3LAdqB4zOr88Fi5618PXA+wYsUKL3dOo9LZHFBf4CgOFpNGsauqq+i66qoSkVZQz1fYnwOLCRLWc9x9gbvPAs4jyEf8m5m9/VAKYWYXAx8C3uDu/UVP3Qa8zcwSZnYssAR48FDeqxGpQuCoI8fRNhSDayXHGzGsxaHAISItoJ4a7iJ3T5cedPfdwPeA75lZ9enPtX0eSAB3hiOO7nf397j7Y2b2beBxgi6sqxvtIjsU6UwQOOrajyMxdsnxPI2qEpFWUDNw5IOGmX0O+IuibqQR5xwsd6+4YJO7XwdcdyjXP1jpbPBRGxmOG/w8usnxPLU4RKQVNPIV9gBwW5gcx8xeY2b3jk2xWkMjOY7iWd3VJgA2qjh3opnjItIK6v5q7O5/b2aXAb8wsxTQC1wzZiVrAY3kOCIRC1bITWVHNcfRVdRVNSmurioRab66azgzWwlcBfQBc4Er3X3DWBWsFeRbHPXM4wAKgWOschzaj0NEWkEjX2E/DPyDu78SeDPwLTO7cExK1SLSmfpzHDCU2xi75LgCh4g0XyNdVRcW/fyomV1CMKrq3LEoWCsodFXVOfEuHzA6qyyr3qjivT00qkpEWkHNmsgqrMjn7s8DK6udc7hLN5DjgGDiX8QgMYozvPP7joNaHCLSGuqp4X5mZu8zs2HreJhZHDjHzG4C3jkmpWuyRnMcnfEYHfFYQ6vf1qMrESMasbq7zERExlI9fSqbgCxwq5nNBfYC7UAU+CnwWXdfO3ZFbJ5GhuNC0OIYzfxGXmcixmB63OY9iohUVU/gONPdV5nZu4GFwExgwN33jm3Rmi/VYHJ8/tRJ7OpNjno58rsAioi0gnoCx91mdh8wG7gc+C2wfkxL1SIKXVV17McB8LcXLyWTG5X1FYfpSkTZr/yGiLSIepYc+aCZLSZY7PBY4A3AKeEkwPXu/tYxLmPTNNpVNVbJ6454jIRGVIlIi6hr3Ki7P2lmF7n7xvwxM+sCTh2zkrWARgPHWFl50iye2zvY1DKIiOQ1Mo9jY8njXoJl1SesVAOLHI6ly89Z1NT3FxEppv6PKgrLqmsYrIhIQUM1Yn6JkYm+1EheoauqzuS4iMiRoNGv0p8q+XtCa5Uch4hIKznYGvGI+Aqez3HEIkfExxURqYu+SleRzuaIRyOjvoSIiMjhTIGjinQmV/cChyIiRwoFjirS2VzdS6qLiBwpGq0Ve8O/D4x2QVpRKutKjIuIlGioVnT3VxT/PdHlcxwiIjJEtWIV6axyHCIipRQ4qggCh35FIiLF6q4VzexOMzt9LAvTalIZ5ThEREo1Uiv+LfBZM7sh3AlwwtOoKhGRkequFd19jbtfAPwIuMPMPmJmk8auaM0XJMeV4xARKdboIocGbAC+CLwP2GRm7xiLgrUC5ThEREZqJMdxL7Ad+AwwD3gX8ErgLDO7fiwK12yaxyEiMlLdGzkBq4DH3b10U+33mdkTo1imlhEsOaLAISJSrJEdAB+r8vTvj0JZWk46myOuvThERIYZla/T7r5lNK7TalLKcYiIjKBasQp1VYmIjNQStaKZfczMHjGzdWb2UzM7OjxuZvYfZrY5fH75eJZLyXERkZFapVb8pLuf5u5nEMwT+cfw+CXAkvDPKoJhwONG8zhEREZqicDh7vuLHnYC+ZFblwJf98D9QPd4zlrXPA4RkZEaGY47pszsOuByYB9wQXh4HrC16LRt4bHny7x+FUGrhIULF45KmbTkiIjISONWK5rZXWa2vsyfSwHc/cPuvgC4GXhvo9d39+vdfYW7r5g5c+Yhl9fdSSvHISIywri1ONz9ojpPvRm4HfgIwUz1BUXPzQ+Pjbl0NugtU45DRGS4lvg6bWZLih5eCvwu/Pk24PJwdNXZwD53H9FNNRbS2RyAWhwiIiVaJcfxcTM7EcgBzwDvCY/fDrwW2Az0A1eMV4EUOEREymuJwOHuf1jhuANXj3NxgGDWOKDkuIhICdWKFSjHISJSngJHBemMuqpERMpRrViBchwiIuWpVqwgpcAhIlKWasUKBtNZANrb9CsSESmmWrGCvmQQOLoSLTHwTESkZShwVNCXzADQEVfgEBEppsBRQV9KLQ4RkXIUOCrItzg6E9Eml0REpLUocFTQl8oHDrU4RESKKXBU0JfMEI0YCS05IiIyjGrFCvqSWTriUcy05IiISDEFjgr6khklxkVEylDgqKAvlaEjrjCRB0oAAArFSURBVMS4iEgpBY4K+pJZtThERMpQ4KigL5nRiCoRkTIUOCroS2U1a1xEpAwFjgqC5LhyHCIipRQ4KuhPZehQV5WIyAgKHBX0ajiuiEhZChxlZHPOYDqn4bgiImUocJSRX6dKLQ4RkZEUOMoYWhlXgUNEpJQCRxn53f/UVSUiMpICRxn5Foe6qkRERlLgKCOf49AEQBGRkRQ4ysh3VanFISIykgJHGf35FodmjouIjKDAUUavchwiIhUpcJTRH3ZVaTiuiMhIChxl5FscHW3qqhIRKaXAUUZfMtj9LxLRfuMiIqVaKnCY2V+bmZvZjPCxmdl/mNlmM3vEzJaPRzm0F4eISGUtEzjMbAHwauDZosOXAEvCP6uAL45HWbQXh4hIZS0TOIDPAB8CvOjYpcDXPXA/0G1mc8e6IP2pjFocIiIVtETgMLNLge3u/tuSp+YBW4sebwuPlbvGKjNbbWare3p6Dqk82otDRKSycasdzewuYE6Zpz4M/B1BN9VBc/frgesBVqxY4TVOr6o/lWVaZ/xQLiEiMmGNW+Bw94vKHTezlwDHAr81M4D5wBozOwvYDiwoOn1+eGxM9SYzLJjWMdZvIyJyWGp6V5W7P+rus9x9kbsvIuiOWu7uLwC3AZeHo6vOBva5+/NjXab+ZJYu5ThERMpq9drxduC1wGagH7hiPN60L5nROlUiIhW0XOAIWx35nx24epzfn76UkuMiIpU0vauq1Qymc+Rce3GIiFSiwFFiaGVcdVWJiJSjwFGiX7v/iYhUpcBRIt/i0JLqIiLlKXCU6E9p21gRkWoUOEoU9uJQjkNEpCwFjhL53f/U4hARKU+Bo0RfvsURV4tDRKQcBY4SQ8Nx1eIQESlHgaOEhuOKiFSnwFGiN5klHo0Qj+lXIyJSjmrHEv2pDJ0aUSUiUpECR4nepLaNFRGpRoGjRH8yq8S4iEgVChwl+lLai0NEpBoFjhJ9Se3FISJSjQJHib5kVpP/RESqUOAo0ZvMaGVcEZEqFDhK9GvbWBGRqhQ4SgRdVQocIiKVKHAUSWVypLI5bRsrIlKFAkcRrVMlIlKbAkeRPu3+JyJSkwJHkT7t/iciUpMCR5F84NBwXBGRyhQ4ivRp21gRkZoUOIr0attYEZGaFDiKzJwc55JT5zCjK9HsooiItCz1yRR56THTeOkx05pdDBGRlqYWh4iINESBQ0REGqLAISIiDWmJwGFmHzWz7Wa2Lvzz2qLnrjWzzWa2wcxe08xyiohIayXHP+Punyo+YGYnA28DTgGOBu4ysxPcPduMAoqISIu0OKq4FLjF3ZPu/hSwGTiryWUSETmitVLgeK+ZPWJmXzOzqeGxecDWonO2hcdGMLNVZrbazFb39PSMdVlFRI5Y4xY4zOwuM1tf5s+lwBeBxcAZwPPAvzd6fXe/3t1XuPuKmTNnjnLpRUQkb9xyHO5+UT3nmdmXgR+FD7cDC4qenh8eq+rhhx/eZWbPNFzIwAxg10G+9nCnz35kOlI/+5H6uaHyZz+mnhe3RHLczOa6+/PhwzcC68OfbwP+x8w+TZAcXwI8WOt67n7QTQ4zW+3uKw729YczfXZ99iPJkfq54dA/e0sEDuATZnYG4MDTwJ8BuPtjZvZt4HEgA1ytEVUiIs3VEoHD3d9R5bnrgOvGsTgiIlJFK42qahXXN7sATaTPfmQ6Uj/7kfq54RA/u7n7aBVERESOAGpxiIhIQxQ4RESkIQocRczs4nAxxc1mdk2zyzOWzGyBmf3czB43s8fM7APh8WlmdqeZbQr/nlrrWocjM4ua2Voz+1H4+FgzeyC8998ys3izyzgWzKzbzL5rZr8zsyfM7Jwj6J7/Zfhvfb2ZfdPM2ifqfQ9X4NhpZuuLjpW9zxb4j/B38IiZLa91fQWOkJlFgS8AlwAnA38cLrI4UWWAv3b3k4GzgavDz3sNcLe7LwHuDh9PRB8Anih6/G8EC20eD+wB/rQppRp7nwPucPelwOkEv4MJf8/NbB7wfmCFu58KRAkWUJ2o9/1G4OKSY5Xu8yUEc+SWAKsIVvKoSoFjyFnAZnff4u4p4BaCRRYnJHd/3t3XhD8fIKhA5hF85pvC024C/qA5JRw7ZjYf+H3gK+FjAy4EvhueMlE/9xTgFcBXAdw95e57OQLueSgGTDKzGNBBsLzRhLzv7v4rYHfJ4Ur3+VLg6x64H+g2s7nVrq/AMaTuBRUnGjNbBCwDHgBmF83ifwGY3aRijaXPAh8CcuHj6cBed8+EjyfqvT8W6AFuCLvpvmJmnRwB99zdtwOfAp4lCBj7gIc5Mu57XqX73HDdp8BxhDOzLuB7wF+4+/7i5zwYqz2hxmub2euAne7+cLPL0gQxYDnwRXdfBvRR0i01Ee85QNiffylB8Dwa6GRkV84R41DvswLHkINaUPFwZmZtBEHjZnf/fnh4R76ZGv69s1nlGyMvB95gZk8TdEdeSNDv3x12YcDEvffbgG3u/kD4+LsEgWSi33OAi4Cn3L3H3dPA9wn+LRwJ9z2v0n1uuO5T4BjyELAkHGURJ0ic3dbkMo2ZsF//q8AT7v7poqduA94Z/vxO4IfjXbax5O7Xuvt8d19EcI9/5u5/AvwceHN42oT73ADu/gKw1cxODA+tJFgHbkLf89CzwNlm1hH+289/9gl/34tUus+3AZeHo6vOBvYVdWmVpZnjRSzY6/yzBCMuvhaukzUhmdl5wD3Aowz19f8dQZ7j28BC4Bngj9y9NMk2IZjZK4EPuvvrzOw4ghbINGAt8HZ3TzazfGMhXEz0K0Ac2AJcQfAFcsLfczP7J+CtBCMK1wLvJujLn3D33cy+CbySYPn0HcBHgB9Q5j6HgfTzBF13/cAV7r666vUVOEREpBHqqhIRkYYocIiISEMUOEREpCEKHCIi0hAFDhERaYgCh0gZZtYb/r3IzC4b5Wv/Xcnj34zm9UXGmgKHSHWLgIYCR9FM5EqGBQ53P7fBMok0lQKHSHUfB843s3Xhfg5RM/ukmT0U7l3wZxBMJjSze8zsNoIZyZjZD8zs4XAPiFXhsY8TrNC6zsxuDo/lWzcWXnu9mT1qZm8tuvYvivbRuDmctIWZfdyCPVUeMbNPjftvR45Itb4ZiRzpriGcXQ4QBoB97n6mmSWAe83sp+G5y4FT3f2p8PGV4czcScBDZvY9d7/GzN7r7meUea83AWcQ7JMxI3zNr8LnlgGnAM8B9wIvN7MngDcCS93dzax71D+9SBlqcYg05tUE6/qsI1ieZTrBBjgADxYFDYD3m9lvgfsJFpFbQnXnAd9096y77wB+CZxZdO1t7p4D1hF0oe0DBoGvmtmbCJaLEBlzChwijTHgfe5+RvjnWHfPtzj6CicF62BdBJzj7qcTrIPUfgjvW7x+UhaIhftInEWwyu3rgDsO4foidVPgEKnuADC56PFPgD8Pl6THzE4IN0MqNQXY4+79ZraUYHvevHT+9SXuAd4a5lFmEuzW92ClgoV7qUxx99uBvyTo4hIZc8pxiFT3CJANu5xuJNi7YxGwJkxQ91B+u9E7gPeEeYgNBN1VedcDj5jZmnBJ97xbgXOA3xJssvMhd38hDDzlTAZ+aGbtBC2hvzq4jyjSGK2OKyIiDVFXlYiINESBQ0REGqLAISIiDVHgEBGRhihwiIhIQxQ4RESkIQocIiLSkP8P3Aqu1ROFn14AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "plt.plot(results.objective)\n", "\n", "plt.xlabel(\"Iterations\")\n", "plt.ylabel(\"$y = f(x)$\")\n", "\n", "plt.show()" ] } ], "metadata": { "colab": { "name": "DeepHyper-101.ipynb", "provenance": [] }, "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.9.10" } }, "nbformat": 4, "nbformat_minor": 1 }