{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# PHYSBO の基本\n", "\n", "## はじめに\n", "\n", "\n", "本チュートリアルでは例として、一次元の関数の最小値を求める例題を解きます。\n", "はじめに、PHYSBOをインポートします。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:04.642474Z", "start_time": "2021-03-05T04:45:04.225565Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cythonized version of physbo is used\n" ] } ], "source": [ "import physbo" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 探索候補データの準備\n", "\n", "最初に関数を探索する空間を定義します。\n", "以下の例では、探索空間``X``を ``x_min = -2.0``から``x_max = 2.0``まで``window_num=10001``分割で刻んだグリッドで定義しています。\n", "なお、``X``は ``window_num`` x ``d`` のndarray形式にする必要があります(``d``は次元数、この場合は1次元)。そのため、reshapeを行って変形しています。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:04.654902Z", "start_time": "2021-03-05T04:45:04.645777Z" } }, "outputs": [], "source": [ "#In\n", "import numpy as np\n", "import scipy\n", "import physbo\n", "import itertools\n", "\n", "#In\n", "#Create candidate\n", "window_num=10001\n", "x_max = 2.0\n", "x_min = -2.0\n", "\n", "X = np.linspace(x_min,x_max,window_num).reshape(window_num, 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## simulatorクラスの定義\n", "\n", "目的関数を定義するためのsimulatorクラスをここで定義します。\n", "\n", "今回は$f(x) = 3 x^4 + 4 x ^3 + 1.0$ が最小となるxを探索するという問題設定にしています(答えは$x=-1.0$)。\n", "\n", "simulatorクラスでは、``__call__``関数を定義します(初期変数などがある場合は``__init__``を定義します)。\n", "actionは探索空間の中から取り出すグリッドのindex番号を示しており、複数の候補を一度に計算できるように一般的にndarrayの形式を取っています。\n", "今回は一つの候補のみを毎回計算するため、``action_idx=action[0]``として``X``から候補点を一つ選んでいます。\n", "**PHYSBOでは目的関数値が最大となる**ものを求める仕様になっているため、候補点でのf(x)の値に-1をかけたものを返しています。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:04.663622Z", "start_time": "2021-03-05T04:45:04.657375Z" } }, "outputs": [], "source": [ "# Declare the class for calling the simulator.\n", "class Simulator:\n", "\n", " def __call__(self, action):\n", " action_idx = action[0]\n", " x = X[action_idx][0]\n", " fx = 3.0*x**4 + 4.0*x**3 + 1.0\n", "\n", " return -fx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 最適化の実行" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Policy のセット\n", "\n", "まず、最適化の `Policy` をセットします。\n", "\n", "`test_X` に探索候補の行列 (`numpy.array`) を指定します。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:04.675725Z", "start_time": "2021-03-05T04:45:04.669564Z" } }, "outputs": [], "source": [ "# policy のセット \n", "policy = physbo.search.discrete.Policy(test_X=X)\n", "\n", "# シード値のセット \n", "policy.set_seed(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`policy` をセットした段階では、まだ最適化は行われません。\n", "`policy` に対して以下のメソッドを実行することで、最適化を行います。\n", "\n", "- `random_search` \n", "- `bayes_search`\n", "\n", "これらのメソッドに先ほど定義した `simulator` と探索ステップ数を指定すると、探索ステップ数だけ以下のループが回ります。\n", "\n", "i) パラメータ候補の中から次に実行するパラメータを選択\n", "\n", "ii) 選択されたパラメータで `simulator` を実行\n", "\n", "i) で返されるパラメータはデフォルトでは1つですが、1ステップで複数のパラメータを返すことも可能です。\n", "詳しくは「複数候補を一度に探索する」の項目を参照してください。 \n", "\n", "また、上記のループを PHYSBO の中で回すのではなく、i) と ii) を別個に外部から制御することも可能です。つまり、PHYSBO から次に実行するパラメータを提案し、その目的関数値をPHYSBOの外部で何らかの形で評価し(例えば、数値計算ではなく、実験による評価など)、それをPHYSBOの外部で何らかの形で提案し、評価値をPHYSBOに登録する、という手順が可能です。詳しくは、チュートリアルの「インタラクティブに実行する」の項目を参照してください。\n", "\n", "### ランダムサーチ\n", "\n", "まず初めに、ランダムサーチを行ってみましょう。\n", "\n", "ベイズ最適化の実行には、目的関数値が2つ以上求まっている必要があるため(初期に必要なデータ数は、最適化したい問題、パラメータの次元dに依存して変わります)、まずランダムサーチを実行します。 \n", "\n", "**引数** \n", "\n", "- `max_num_probes`: 探索ステップ数 \n", "- `simulator`: 目的関数のシミュレータ (simulator クラスのオブジェクト) " ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:04.705741Z", "start_time": "2021-03-05T04:45:04.677024Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0001-th step: f(x) = -51.387604 (action=9395)\n", " current best f(x) = -51.387604 (best action=9395) \n", "\n", "0002-th step: f(x) = -0.581263 (action=3583)\n", " current best f(x) = -0.581263 (best action=3583) \n", "\n", "0003-th step: f(x) = -0.827643 (action=4015)\n", " current best f(x) = -0.581263 (best action=3583) \n", "\n", "0004-th step: f(x) = -14.220707 (action=154)\n", " current best f(x) = -0.581263 (best action=3583) \n", "\n", "0005-th step: f(x) = -34.192764 (action=8908)\n", " current best f(x) = -0.581263 (best action=3583) \n", "\n", "0006-th step: f(x) = -31.595527 (action=8819)\n", " current best f(x) = -0.581263 (best action=3583) \n", "\n", "0007-th step: f(x) = -0.361729 (action=3269)\n", " current best f(x) = -0.361729 (best action=3269) \n", "\n", "0008-th step: f(x) = -0.755839 (action=3870)\n", " current best f(x) = -0.361729 (best action=3269) \n", "\n", "0009-th step: f(x) = -10.883996 (action=370)\n", " current best f(x) = -0.361729 (best action=3269) \n", "\n", "0010-th step: f(x) = -0.150313 (action=2949)\n", " current best f(x) = -0.150313 (best action=2949) \n", "\n", "0011-th step: f(x) = -3.885764 (action=6926)\n", " current best f(x) = -0.150313 (best action=2949) \n", "\n", "0012-th step: f(x) = -3.525070 (action=6851)\n", " current best f(x) = -0.150313 (best action=2949) \n", "\n", "0013-th step: f(x) = -3.252476 (action=6789)\n", " current best f(x) = -0.150313 (best action=2949) \n", "\n", "0014-th step: f(x) = -7.524212 (action=641)\n", " current best f(x) = -0.150313 (best action=2949) \n", "\n", "0015-th step: f(x) = -16.136719 (action=8125)\n", " current best f(x) = -0.150313 (best action=2949) \n", "\n", "0016-th step: f(x) = -1.439937 (action=6090)\n", " current best f(x) = -0.150313 (best action=2949) \n", "\n", "0017-th step: f(x) = -9.415991 (action=480)\n", " current best f(x) = -0.150313 (best action=2949) \n", "\n", "0018-th step: f(x) = -4.854365 (action=925)\n", " current best f(x) = -0.150313 (best action=2949) \n", "\n", "0019-th step: f(x) = -1.042368 (action=5523)\n", " current best f(x) = -0.150313 (best action=2949) \n", "\n", "0020-th step: f(x) = -19.075990 (action=8288)\n", " current best f(x) = -0.150313 (best action=2949) \n", "\n" ] } ], "source": [ "res = policy.random_search(max_num_probes=20, simulator=Simulator())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "実行すると、各ステップの目的関数値とその action ID、現在までのベスト値とその action ID に関する情報が以下のように出力されます。\n", "\n", "```\n", "0020-th step: f(x) = -19.075990 (action=8288)\n", " current best f(x) = -0.150313 (best action=2949) \n", "```\n", "\n", "\n", "### ベイズ最適化\n", "\n", "続いて、ベイズ最適化を以下のように実行します。\n", "\n", "**引数** \n", "\n", "- `max_num_probes`: 探索ステップ数 \n", "- `simulator`: 目的関数のシミュレータ (simulator クラスのオブジェクト) \n", "- `score`: 獲得関数(acquisition function) のタイプ。以下のいずれかを指定します。\n", " - TS (Thompson Sampling) \n", " - EI (Expected Improvement) \n", " - PI (Probability of Improvement) \n", "- `interval`: \n", "指定したインターバルごとに、ハイパーパラメータを学習します。 \n", "負の値を指定すると、ハイパーパラメータの学習は行われません。 \n", "0 を指定すると、ハイパーパラメータの学習は最初のステップでのみ行われます。 \n", "- `num_rand_basis`: 基底関数の数。0を指定すると、Bayesian linear modelを利用しない通常のガウス過程が使用されます。 " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:07.142492Z", "start_time": "2021-03-05T04:45:04.707345Z" }, "code_folding": [], "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Start the initial hyper parameter searching ...\n", "Done\n", "\n", "Start the hyper parameter learning ...\n", "0 -th epoch marginal likelihood 55.074208787406135\n", "50 -th epoch marginal likelihood 54.02707203875113\n", "100 -th epoch marginal likelihood 53.187697419916795\n", "150 -th epoch marginal likelihood 52.41026245373357\n", "200 -th epoch marginal likelihood 51.64554036744889\n", "250 -th epoch marginal likelihood 50.88537231963794\n", "300 -th epoch marginal likelihood 50.12972033759564\n", "350 -th epoch marginal likelihood 49.37883516837167\n", "400 -th epoch marginal likelihood 48.632896402510426\n", "450 -th epoch marginal likelihood 47.89227385595791\n", "500 -th epoch marginal likelihood 47.15741745486788\n", "Done\n", "\n", "0021-th step: f(x) = -0.129612 (action=2163)\n", " current best f(x) = -0.129612 (best action=2163) \n", "\n", "0022-th step: f(x) = -0.002719 (action=2554)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0023-th step: f(x) = -1.000342 (action=5109)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0024-th step: f(x) = -0.070645 (action=2246)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0025-th step: f(x) = -0.957339 (action=4413)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0026-th step: f(x) = -0.297858 (action=2008)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0027-th step: f(x) = -0.002921 (action=2556)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0028-th step: f(x) = -0.135520 (action=2156)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0029-th step: f(x) = -1.008844 (action=5316)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0030-th step: f(x) = -0.303300 (action=2004)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0031-th step: f(x) = -0.007081 (action=2416)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0032-th step: f(x) = -0.218576 (action=2072)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0033-th step: f(x) = -0.062810 (action=2776)\n", " current best f(x) = -0.002719 (best action=2554) \n", "\n", "0034-th step: f(x) = -0.000161 (action=2513)\n", " current best f(x) = -0.000161 (best action=2513) \n", "\n", "0035-th step: f(x) = -0.000078 (action=2491)\n", " current best f(x) = -0.000078 (best action=2491) \n", "\n", "0036-th step: f(x) = -0.040848 (action=2304)\n", " current best f(x) = -0.000078 (best action=2491) \n", "\n", "0037-th step: f(x) = -0.117955 (action=2891)\n", " current best f(x) = -0.000078 (best action=2491) \n", "\n", "0038-th step: f(x) = -0.010968 (action=2396)\n", " current best f(x) = -0.000078 (best action=2491) \n", "\n", "0039-th step: f(x) = -0.093074 (action=2211)\n", " current best f(x) = -0.000078 (best action=2491) \n", "\n", "0040-th step: f(x) = -0.049143 (action=2286)\n", " current best f(x) = -0.000078 (best action=2491) \n", "\n", "0041-th step: f(x) = -0.006779 (action=2586)\n", " current best f(x) = -0.000078 (best action=2491) \n", "\n", "0042-th step: f(x) = -0.031452 (action=2327)\n", " current best f(x) = -0.000078 (best action=2491) \n", "\n", "0043-th step: f(x) = -0.006626 (action=2585)\n", " current best f(x) = -0.000078 (best action=2491) \n", "\n", "0044-th step: f(x) = -0.000061 (action=2508)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0045-th step: f(x) = -0.063184 (action=2259)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0046-th step: f(x) = -0.004198 (action=2435)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0047-th step: f(x) = -0.007608 (action=2413)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0048-th step: f(x) = -0.019405 (action=2648)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0049-th step: f(x) = -0.091016 (action=2214)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0050-th step: f(x) = -0.009453 (action=2602)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0051-th step: f(x) = -0.001649 (action=2459)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0052-th step: f(x) = -0.146001 (action=2144)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0053-th step: f(x) = -0.008914 (action=2406)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0054-th step: f(x) = -0.123044 (action=2171)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0055-th step: f(x) = -0.006176 (action=2582)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0056-th step: f(x) = -0.035779 (action=2316)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0057-th step: f(x) = -0.021468 (action=2356)\n", " current best f(x) = -0.000061 (best action=2508) \n", "\n", "0058-th step: f(x) = -0.000024 (action=2495)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0059-th step: f(x) = -0.005317 (action=2427)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0060-th step: f(x) = -0.042619 (action=2300)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0061-th step: f(x) = -0.095860 (action=2207)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0062-th step: f(x) = -0.048180 (action=2288)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0063-th step: f(x) = -0.008721 (action=2407)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0064-th step: f(x) = -0.000244 (action=2516)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0065-th step: f(x) = -0.000137 (action=2512)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0066-th step: f(x) = -0.167353 (action=2121)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0067-th step: f(x) = -0.005170 (action=2428)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0068-th step: f(x) = -0.099800 (action=2856)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0069-th step: f(x) = -0.000062 (action=2492)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n", "0070-th step: f(x) = -0.044891 (action=2295)\n", " current best f(x) = -0.000024 (best action=2495) \n", "\n" ] } ], "source": [ "res = policy.bayes_search(max_num_probes=50, simulator=Simulator(), score='TS', \n", " interval=0, num_rand_basis=500)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 結果の確認\n", "\n", "探索結果 res は history クラスのオブジェクト (`physbo.search.discrete.results.history`) として返されます。 \n", "以下より探索結果を参照します。\n", "\n", "- `res.fx` : simulator (目的関数) の評価値の履歴。\n", "- `res.chosen_actions`: simulator を評価したときの action ID (パラメータ) の履歴。 \n", "- `fbest, best_action= res.export_all_sequence_best_fx()`: simulator を評価した全タイミングにおけるベスト値とその action ID (パラメータ)の履歴。\n", "- `res.total_num_search`: simulator のトータル評価数。\n", "\n", "各ステップでの目的関数値と、ベスト値の推移をプロットしてみましょう。 \n", "`res.fx`, `best_fx` はそれぞれ `res.total_num_search` までの範囲を指定します。" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:07.561032Z", "start_time": "2021-03-05T04:45:07.144324Z" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:07.721097Z", "start_time": "2021-03-05T04:45:07.563374Z" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAGdCAYAAAA8F1jjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABHoUlEQVR4nO3dCZTU1ZX48dv7Cg1NQ7M1q4CKIopLMEI0EkjiSeJMxjExMTIajQ6ZJMokwt8MajYcnDAxjhN1EpeJTkTHmERPNDDRGBNxF1EU3BBQaBaB7qab3ut/7ut61VVFLb9fdVX9fl31/ZxT9kovvy7r3brv3vsKAoFAQAAAAHyo0OsfAAAAIB4CFQAA4FsEKgAAwLcIVAAAgG8RqAAAAN8iUAEAAL5FoAIAAHyLQAUAAPhWsQxyvb29snPnThkyZIgUFBR4/eMAAAAHdN5sS0uLjB07VgoLC3M3UNEgpaGhwesfAwAApGDHjh0yfvz43A1UNJNif9GhQ4d6/eMAAAAHmpubTaLBruM5G6jY7R4NUghUAAAYXJKVbVBMCwAAfItABQAA+BaBCgAA8C0CFQAA4FsEKgAAwLcIVAAAgG8RqAAAAN8iUAEAAL5FoAIAAHzLF4HKLbfcIpMmTZLy8nI57bTT5LnnnvP6RwIAAD7geaCyZs0aueqqq+Taa6+Vl156SU444QRZtGiR7Nmzx+sfDQAA5Hugsnr1arn00kvlH/7hH+TYY4+VW2+9VSorK+WOO+7w+kcDAAAe8/RQws7OTnnxxRdl+fLlofcVFhbKggULZP369TH/TUdHh7mFn74IZEtHd4/sPNguO/a3yfsHDsvelg45+5hRcty4Gldfo7SoMOlBXMkc6uiWv7y1VzbtbJZRQ8qkobZSJtRWyrjhFVJWXCTp0tXTKy+8d0Be2n5Axg+vkBMbhktDbUXSn7+7p1c+OHhYDrR1SfPhLmlu15fdwZddcrirJ+6/LS0ulMqSYqkoLZSKkiKpKC02LyvLiqS2slRqq0pleFWpVJUWRfwcvb0B2dfaIY1N7X235nZpae+WYZUlMqJK/12Z+bf6ek1Fieg/7ejulbbOHmnr7JbD5mWPtHZ2S3tX3+t6s+83P3MgICVFheZn1JclxYVSWlQgxYWF0t3bK53dvdLZEzDXrcu83ivdvQH9ZxIIBKQ30Pd6b6DvZ64uL5aheqsokaHlJTK0Qt8ukcKCAmlp7zI/f0tH8GV7t/m769cokL7fW3+HgtDLAiksLJCiggIpKpSw1wvM16ypLJHhlaXmegyr6Htbf+6DbZ2yv7VTPmzte6m3A62d5nfQn7Mn/OfuDZjfXe9rk+qqZHJdlbn/Rd8f9O+v/69s298q2z5sM99j1JByGTOsXMYOq5CxNRVSUdp/P9Vrc7Cty9xndgZv+w51SnFRgbk/6/cs02sdfKnfT38Wvbb2pf6cPXrd9fr36vXX9wf/Bj19v4O5RnqtzK3AvNRrrV9T72Pl5lYYfFkklaVFUl1WLEPKi6W6rESqyoqkqrTYXFv9me39p7WjO3Tfaevou6/ord3et7p6zdv6s0ZfT73GAQneIWIYPbRcptcPkWn11ea66feOpve79z5slbd2H5J39x4ynzNySFnfrbrM/I1GVJeZ+4Let/c0d8julva+l83tsqelw/w++jfR38+8LCuSipJi81L/zuOHV0reBSr79u2Tnp4eqa+vj3i/vr158+aY/2blypVy/fXXZ+knzA/v7D0kT2zeIxedPsk88CLSY6/tkl/8Zavs2H/Y/I+tDy7h/vNPb8vPLzpZ5k0bmfRr/WnLHvmnX70sU0dWy+1fmWMeuN14b1+rPL55j7k9u/VD84AcTR94xwwtN4HLWUePksvmTYn5wJaILlRPvrlH/vjGHnnyzb1mgQw3vLJETmgYJieMHyazG4aZhe/dva3mvtR308WpNebPl04a8A0LLr66gOsDri5YTugDdl/gIHlN7y/R92m3dDGfOKJKJo2olNbOHvO3/+DA4aR/C/3bjampkM7gE4BEwavf6O+swYHT+1u6VJUWyVGjqmVa/RAZUV0qW/e2ytt7D5lgsCfJz6IPAxqM6d/IrX9eOF2+/vFp4oWCgP6f6pGdO3fKuHHj5Omnn5a5c+eG3v+d73xHnnzySXn22WcdZVQaGhqkqalJhg4dKvlCH5D1GaFG/AN16X+/IOte3y3f/9xMuXDupLT8fLlk0b//Wbbsbgm9rf+ja2ZBA4EDbZ3y8vaD5tnYf33lZJk/PX6w8vArO+XKNRtCD2z6Ne6++FQTtCSiz8Zu/dM78siru0wwEE4XhlMn15qshWZ5tu9vM8/qwn36+NGy+u9nJ72v6DO7Xz2/XX790gfy8vYDEQu4ZiFOm1wrO5va5Y2dzeYZqhN6Xeqqy4LZgsisgV7HWEkZfUTSBaAt9Gw0+Oy0s0daOrpDz/71mWws+jX12aM+Cx1dUy5DykvMM/X9rR2hrEF04KX0mbouApXBZ5O6EJksTvB99tm1Ptjr79/ZHTAvbdZEsw8aOIVnW0qD2ZaiwkLz7zRg7Mt+9D2r12usz8Rtlqm5vVuaDneZm14HvWb6TF5/h76Xfc/q9d/qnycQ9kzcZmxMVqFX+p+5B7MNmp3R+4l+bb2GB4Pfw9LHk76sUzBjVVlqMgt9P2tB/89fIOZv8d6HbbJ13yETkMRbH/X3bxheYYIY/Zr6rH3XwcOyq6ndBJax6P1lXDDroq/r76D3B/17a0CjLzu6es3vrdkgDTjtrbiwL6Okfwd9XbNdJfpS3y4qjLxumtEIZnL0emmmU+9n+rVNJiSYEdHsiP6smik51N4dNzDRa6WZF72vmPtO8P5jsjTB1/Vz9Ge211N/ZntfiJeg7OkV2XGgTd7a3SJb9yUO/oeUFcvUUdXmMUW/nmZ89Zrryw9bNWMS+f9m/dBy8/+KvtTMS0lRgQli9O+r90v9/W2m6JIzJst5JzdIOun6XVNTk3T99jSjUldXJ0VFRbJ79+6I9+vbo0ePjvlvysrKzC2fbdrZJJ+5+S9SVVYs584eJ184tUFmjnW+9RBNFzj157f2EajEoA/s6ifnz5YzptWZB3Ob5tYHtyX3viT/98YeE/DFC1bufXabfPc3r5kHik/OHC2bG5vNA/3nf/a0/OKik2XOxNqY3/vpd/bJ1Q9uNNkcpQ++Gph8/OhR5jYlKsjRB11diDVgeWnbAfnXxzbL719tlN3Nz5qfTReLWHSbZOkDG+Svb38Yet8xY4bK2fp9jhllMif6oGp/5827WmTDjoPyyo6DsuH9g+bBbEpdtUwdVWUeJM1tVLXJ7LjN5jilD6b72/q2KDRg1P8fxtSUmzS3LkqJ6O+gwYv+ZHZBSfZvco0GMBqwaZClGbJUf38NIvT+ptm+bfvbpLqsSCbUVsnEEZUmWIz399fgbNfBdtnZdNgsmuOGVZjAMp3blulmt3o0cNEApqykMBTI2v8/Mqmrp9dkq97cfUje3N1iAm/dkjEZllFDpH7okVtw4Vtx+v+L/s3Nk4fy4gFvP+dFRkVpO/Kpp54qN998s3m7t7dXJkyYIF//+tdl2bJlaYvI0umOv2yVF7btl5MmDJePTBlhHtCzcSe1Htm4U77+Py9HvG/W+Br5wikT5LOzx5qo3o2Tf7DO7AVrNP7yik/k3QN2Msdd+wfzwPTEP59pHhSihQcr+gzy52HBiv7v9bMn35FVj20xb3/ptAnyvc8dZ57RXnz3C2ah1wfpm75wonzyuP7gXL/fyt+/Ifc+u928rQ/i3/nkDLOVoxkJp9a/86F87ZcvmGfq+rPf9Q+nmGe34X7/6i5Z/utXTUCmz/iuXDBdPnPCWPOMFgAyxen67Xmgou3JF110kdx2220mYPnJT34i999/v6lRia5d8UOgopdr2jWPRqT/NB176qRaOW1KrQlcjh9Xk9FI9cEX35elD7wi00ZVmwKrta83htKBGt3/7Unj5LvnHOtoW0j3NKdd8/tQ6vbBK06XOROHZ+xnH4zPOqde83uTCXn+mgUmPRrvWeU/mmBldyhYmTetTm54dLPc9ud3zecsOWuq/PPCGaH7hm7p/NP/vCx/3LzHpGmv/+xM+crcSfLnN/eawEGLCtWXPzJBrv7k0Sb9nwpNGS++83nz9TSjovU0GmRrMHTd7zbJ/774vvk8vd/+5Auzk25FAUDebP2o888/X/bu3SsrVqyQxsZGmT17tjz22GOOghQv6MJug5SPHjVCNu5oMqk0XWz0pnRRueLMqRn7Gdq7+2oQ9BnyLV86ST481CEPvvS+3Pf8DlPDcM8z2+XM6aNkwbHJr6HuW4Zvuf7lrX0EKmG0TsKG8okyVRqc/OeXTgoFK1/97xdk3lF1ofvE//v00XLZ/Mj7hKaLb7twjvzLbzfJr57bLit+u0l+t2GnvLDtgPm4dtb86+dnyelT6wb0O2jR3UNLTpeL73peXvugWb54+zNy1Semm2yNpuw1SLriY1PlWwumm98DAPzEF49Kus2zbds2UySrBbS6HeRX4ZmU2y48WTZcu1Ae/voZ8t1zjjHdD0rT+ZmkxV6qLJgx0ZYzXQT/eNXH5KwZfVsOu5r6no0no0VW4f769j7JZRoQXPPQq0mr4y2tvVC6tafbIonYYOUTx9abDIsGKboj+K+fP/6IIMXSbbYf/c1xsvQT083bGqRo4LD49Enyh2/NH3CQYml30ZrL5pq6Ft1jX/noZhOk6JaSvv87nzyaIAWAL/HIlEIxk6WFjbqAHT++Rr46b4qpilZa2JdJtttBaxvC6ZaC7XPXSm83gYq2CSqdlRGvGn+w0yr+6x/eZDIJb+xyNn/HdodEz+uIRxf7Wy44ST57wlhTrKavn3/KhIT/Rr/uP509TW76wmxZcEy9CRyu++xMk3FJJy02vf3COXLhRyaaYOjc2WPl0W/NM8W5AOBXnm/9DDY6NMiKnjmi7XxKuwkySYs3YwUqSlvNlA7xcROozBo/zLQaanfJc1s/lI8f7Z+tN+0OcFNAGo8GYe3BbJS2grrJqLipD9Fg5adfPNFkbdwUWX9u9jhzyyTN4Hz/3OPk/336mIhhWwDgV2RUXNJph0qfkUYvQjYrka2MSqxiWe2HVzqYzIm9h/oCFW3pPOOovm2Gp97yz/aPdqTMum6t/HL9ewP+Wk+Htd7qPA4nbHZJJzO6lc1OMLcIUgAMFgQqKWZUSgqPvHQ60tsGKplsptItjHgZlZFD3WVU9rX0BVV1Q0rljKNG+q5ORQePqWfe3T/gr/XXd/p/Lx3c5CZQcdvyDQBIDwKVFAMVPX8img5NUtoqnMqIYvc1KkXxt36c1qiEZVROnzrCZIp0mNCeZmcZmWwNW3v/QN9QulTpVM6N7zeF3nZah2MDGq3vAABkH4FKils/WkgbTadb2s4JnZaZ+a6fWDUq5aG2Y51EmMze4BaRzgfRjNBxwQm3f/FJVqU/UHHWxRTPs+/uj+j0cRqo6NhsOysHAJB9BCopdv3EOrxPuzf0ZNdMF9QmKqbV8e59h62JmTbrtJjWDjL7aLBOxS+Bir2OOhZeB6SlY9tHxTrrJXHXD4EKAHiBQCWNWz/ZKqhNVExrjvautts/7Y4DFbtlpNNU7eA3j4cWR2RUBppVsYW0Os3XbgW56fqpJqMCAJ4gUEkxo6InYMZiW5QzGagkKqZVoxwW1OrX0TNg1Mjqvi0jnUqrX1drXN7ec0j8FaikVqeiAZs9/ViHsbmqUaGYFgA8RaCS4mRaPQ47luFVJVnY+olfTOumoFa3U5QeiT60ojiUpbEDwPzQppyOjIoezKeOHTNUJtT2DcSj6wcABgcClVQzKnFOGB6WhYxKvMm01ig7SyVJ547d9qmrLo2YumrrVLxuU9Yx9G1h3VOpBir299CzmezgNsdzVOj6AQBP8eibao1KnGFetkU5oxkVu/UT5+wZpxmV6EJayw5+e+bdD01gFqtwONvZlFS3frTO5q/B+pTTj6qTwmBA5jSjQtcPAHiLjIpL3cH25HiLt61R2Z/B9mTNNCTe+imPaD12G6joFkltVamZBbMhwwcsugtU3GdU9OC9Dw4eNoHlqZNqQ1s4LR1d7jIqdP0AgCcIVFzSYW6Ju36yV0xbnqGMinYO6fC3VOpUdHbLax80pWVgXNPhzgEHKjabcuKEYWb7xmZGXNeokFEBAE/w6JvGEfpZ2/pJklGpd1qjcqjv43XBduZw2qb8yMZdpr7jqk9MT/h1duxvkz+/tVeeenOfPP3OPtNJNG5Yhfz5O2cN6Lwbm1GZNKJS3vuwzWSptF3YTb2InZ9y+tS+7SybUdEARLeFkp2ITDEtAHiLR98Ut368zKgkL6btCzx04FuiE3ztOT/RGZXwglrd+tGZI+GnB+vX1PqVx15rlKfe2muCiGi63fLm7hY5ZsxQSZUN9hpqK02QogGQft3p9UMc/fve3kCo4+eM4HwYmxnRzJhex1izaMK1dvRlrwhUAMAbPPqmvPUTO0jQ2o6sTaaNs/Wj02k1UaABhS7wsQKR6HN+oo0fXimT66pk675WcyCgzh/Z3NgsD730gfx2w05pDMvWaP3HSROGm2BAMzH/tnaL2XJ54b39AwpUbEalpqLEBCubdjabglqngcrmxhbz+1eWFskJ44eZ91WH1ZpotiRRoKKBTv/pyfyvAgBe4NHXJXt+TkmSrh9d4LTo1Z79ky4afNhgKd7WjwZRup2jNSi6/RM3UIlTo2JpO68GKv/5p7flx2u3mIXfGlpeLOfMGiMfP7pePjKlNiLjcuqkESZQef69A3Lh3ElpCVTGD68IBirO61R0G8r8PJNrQ38Hrb/R7Ij+fXQ8fqxtL6stWAuk6PoBAG/w6OtSV3DgW7ytn6HlJaIxjH7awcOdoQ6cdGdTEhXT2oJaDURsMBJN6zOSBSpnHDVS7nlmu7y8/WBoMNzHjx4l5544Ts46emTcQOmUScPNS82oDITNSmmgYjMfbgIVe17RR4P1KZYNVJIV1NqP69ZZvG02AEBmEaikmFGJt/Wjz9h1YT3Q1mUW2rQHKsGTk23gkChQ2ZTgvB9tPT4czBjEyyp8bPpIM1Ols6dXzp09Tj59/OhQDU4isycMM4v7zqZ2U1OihbWpaA5mVPT8JNsO7nSWimazntvaFyidflRfB5Nl6lSak7cohxfSJiu6BQBkBoFKyl0/8RcunaWigcqBDMxSsYW0WhcSL1hSNkCKd96PzaZo/Ua8+ouK0iK556unuf4ZK0uL5bixQ+WV95tMVmXc7HGSioNhWz+1VX3B1I79zjIqr7x/0Ey11ZqhY0ZH1smEOn+SZVTo+AEAz5HPdqkr1PUT/9Jl8gTlUCFtkq2I+mDnz+44GZV9hxJv+wzUyZP6zgt64b0DaahRKTU1Km4yKnZs/twpI0yWK1xolkqSMfqhk5MJVADAMwQqqWZU4tSoRJ6g3JW51uQkbbUjhzrLqMTq+EkHW6fy/ADqVA4GAz3NqIwLBip6TZ2cfPx0aGx+5LaPm0BFi21VVVniaw0AyBwClVRrVOIMfMv0LJXQVNokGZVk02mTFdIO1JyJfRmVLbtbjhiF71TT4e5QoKJFyvpSfZCkoLats1te3nEgZiGtCo3Rb3eYUQnraAIAZBeBSpq7fjI9ndZpRsUGKns9ClT06+oclkBA5KXt7rd/tCspvJhWOd3+0SJabeHWIt6JIyqP+Hh1WfAEZcc1KmRUAMArBCopZlQSddwMDw59y0gxbbDrJ3mNSnDrp6XdLPrZ3vpRJ09MvU1ZO5K020jZTEp/oJI4o2K3m+ZOHRGzW8dOpz3kousHAOANApU0H0qY+RoVZ8W0tuVYf95YP4edSluXoYyKOjlUp+I+o2K3i7QWSDuT7LRcJxkVO/dlTjBQiqbD6tx0/TCVFgC8Q6CS6lk/CWpU+rd+MteeHG/YmqWTWO04/1izVEJdP5nMqAQ7f17ZcTBiUJ3bYW82K+Iko6KTe/X72ROTYwk/mNBJjcoQAhUA8AyBSga6fjJZTJvsnJ+YBbUxOn8yXaOiptRVmWBJg6vXPmhOKaMyNLjtoxpCGZX4gcpbe1rMMLuq0iKZNir2mUB260cPOUzEZlzIqACAdwhU0nwooRpelbli2vZQjUryAs9RwToVPe8n+rC9TM9RUZoJSbVOxV67YWGByvja5MW0dtvnhIa+6bixuB74xjk/AOAZApWUt36c1Kh0mqAgnTq6UsioRHX+aLbCBlwjqpOPxB+IU+zgt23u6lRsx48tpFV2FH+iWSovBb9PvG0fN3NUKKYFAO8RqKS89ZN8Mq3GKMlaYFOvUXEeqES3KNtCWv05nWRm0lFQqxmVWN1HybZ+ws8W0hOa7bWNN0vlZVuf0hC7kDa8PZnJtADgfwQqLnWFDiWMn1HRxd92qqS7TsVpMW1kRiVy68cGLvEOI0ynmWNrzCnPmgV5Z2+r43+nJ09HZ1TCC2p37G+LGdy8vedQ6GDEpBmVJEFkC10/AOA5AhWXuoNbOSUJun6it38yUUyri38ydpbK7qhi2mx0/IR3H81uGOa6TiVWMa0aPyx+i7Lt9plQW5kwCLM1JzqnxU76jYWMCgB4j0AlAxkVZbco0l1Q666YNnFGJZOFtLHqVNzMU4lVTJusRdkW0p6UIJuiqkr7A49E2z8240KgAgDeIVBJOVDxNqPirEal/2DC8PqQbAcqoZOUt7nPqNS4CVSC5/ucOCF+fYrSbiBtX060/aNF0NrmrOj6AQDvEKikWkyboOsnYox+mjMqoRH6DrZ+bCCidS3NwQP+vAhUNMOhl2vbh22yJ6pVOp7oc36s0HTag5FbPxqI2YxKoo6fI8foxw5UWjv7309GBQC8Q6CS8qGEyTIqmZlO66aYtrykKJSRCN/+CY3Pz0KNiu3WOXr0UFdtygfjZVRqY2dUtu5rNVkYzTTZ75XsZ1LxurJaO3pCbehOslcAgMzgETjFQwmT16j0ZVT2t3q39RNvlkq2MyqR5/7sH+DWT2WohqWlvT9bZbMpx4+rMQW8ySQbo28PLNSOn1gHGwIAsoNAJeWtH6cZlcwU02q2xIlYBbXZ7Po5ok7FQUGt1oeEApWorR8NMOy1/eDg4Rj1Kcm3fcJblMODnXCHghkVtn0AwFsEKi519TrLqPihmFbVD4lsUdaM0IfBLE82MyqnBDMqr+9qDrX9JppfYmt/ozMqEXUq+8MClVB9SuJCWscZFTp+AMAXCFQycChheBFo2otpXUymVSNtRiUYqOhWlAYBWtxqT1fOhjE1FWYEvp5uvCE47ySepuA1qygpilmL09/501dQ29bZLZsbW1xlVGwAEq9GhXN+AMAfCFRSrVFxOPAt7cW0oa4fh1s/tkU5uPVja1VGVJfFPbQv01mVF5MU1MarT4nXorzx/SYTAI0eWm4CIieSdf3Y9zOVFgC8RaCSctfP4Nj6iS6mzXbHT7ipI6vjjr93F6hURgQqbtqSo7t+4s1RsdtTQwhUAMBTBCopZlQSHUqohlWVhIpfE41pz3QxrR2jb+eXeNHxY40Nnn68q6nd2Tk/UYW0R2RUgrNUXt7el6E5yWF9SngAEr+Y1mZUMntoIwAgMQKVFGtUdL5GsoXQfk46sypua1SiMypedPxEByo7w7p1BpJR2bH/cN+gtx3uMypOt37sScsAAG8QqKTY9ZMso6KzN+wslQOtXd5t/QSLads6e8zi62VGRYtpbVtx+Eh/p+f8hL5OMKOiAY0W0ervpEHhceNqHP8sSYtpQ10/ZFQAwEsEKqlmVJLUqCg77yMjGRWHWz+VpcWhRVm3f7wMVOpr+kf6J+qGak6SUQmfpfLIxp3m5bFjhzreDnM0Qp+uHwDwBQIVFzQL0G2LaZN0/WSioFa/f6fLrZ/wrIrOUvEyUNFWY/t9E23/JNv6Cd/+efiVXebliQ3Ot33U0CSBis5yUXT9AIC3CFRcsEGKkzkqmZilYrMpyk32oL9OpT2s6yd7M1Ri1amET5WNu/UTp5g2vKB2e7CDyOmgN8vWnsQ/64eBbwDgBwQqKWz7ODmUMGKWSprO+7EzVFxnVIKzVDSbYjMqNnjJtrE15Y4zKkMTZlQi56W4KaSN2PpJNvCNQAUAPEWgkkIhrZOun/AW5fRlVPoKafVbO/n+lg1KNPtgMwgjq/sCBj+2KNuTk20xciwNtX1bP0on7E4Ie9sJG4B09vSGrms4AhUA8AcClRQzKsm6fjIxnba/NbnI1Ym+dpbK6zubzcvSokIZWlHs262fZMW00RkVrU9xe8JxeAASK6ti30eNCgB4i0AlhWFvmsxwMn4+3V0/odbkEnd/NltM+8auvkBFC1rdLuzpMm5Y8q0fG9g5KaZNZdtH6d+vqrQobkFtaDItXT8A4CkClZTG5zu7bKE5Kmna+glNpY1xUF8ittOmtbPH00JaZc/i2XUw9tZPV09v6OeMN0clfCaL24m0sepUogtq9dwg+zOQUQGAHA1UfvjDH8rpp58ulZWVMmxY7Ge827dvl3POOcd8zqhRo+Tb3/62dHfHLm701fh8h/Uh6d/6SS2jYrd+LC9ak6O3fna3tJugJN62T7JiWg0g5k8fKVNHVrnu+Ek29K21s/9talQAwFsZexTu7OyU8847T+bOnSu/+MUvjvh4T0+PCVJGjx4tTz/9tOzatUu+8pWvSElJifzoRz8SP+oKDXtzFijUBotp96e568dNx0+sDh8vA5URVaVSWlxo5sE0NrVHFMWGF9Lqlkuy7bX/vvjUAf0s1fZgwqitH7vtowXLbq81ACC9MvYofP3118uVV14pxx9/fMyPr127Vl5//XW55557ZPbs2fKpT31Kvv/978stt9xighw/6g6Nzy9wtfXT3N4dysakq5jWDc0KVITNXfHinB+rsLBAxgRblGN1/jgZ9pYu9mDCQx1dscfnlxd7VssDAOjj2dPF9evXmyCmvr4+9L5FixZJc3OzbNq0Ke6/6+joMJ8Tfsv+gYQOa1TCFlu7AGfznB9LF1tbUOt1RkWNDdapxCqobWrLXqBit3Wiu35CJyeXsu0DAHkbqDQ2NkYEKcq+rR+LZ+XKlVJTUxO6NTQ0SLbYmgon5/z0fV5hqGskHQW1NqPiZiqtVR8c+uaLQCVBi7IN6BJNpU0X+7ex4/KjAxU6fgBgkAUqy5YtM8/OE902b96cuZ9WRJYvXy5NTU2h244dOyTbI/SdzFDJREFte1dqGRU1MiyjUufh1o8aG2xR3tUUP1DJSkYlTtePrVGh4wcAvOfqkXjp0qWyePHihJ8zZcoUR19Li2ife+65iPft3r079LF4ysrKzM0LoYyKi6mwOktl+/70ZlTcdv1EF9T6JaOyM0aLsj3np6aiNHs1KlGBig1c6PgBAO+5eiQeOXKkuaWDdgNpC/OePXtMa7Jat26dDB06VI499ljJha6fyFkqnWns+nG/9WPP+/FHRiVBjYoHGZV4XT8EKgDgvYw9EuuMlP3795uX2oq8YcMG8/6jjjpKqqurZeHChSYgufDCC2XVqlWmLuW73/2uLFmyxLOMieM5Kg5rVMKn06Zj6yfVYlpVH9z60WmsXm9p2Om0sWpUDh5OPpU2XeKdoMw5PwDgHxl7JF6xYoXcfffdobdPPPFE8/KJJ56QM888U4qKiuSRRx6RK664wmRXqqqq5KKLLpLvfe974lehjIqLrZ90Tqftb092H6iMDrYE1wdfeslOp9UAoaW9S4YE55mED3zLZjHtEe3JHUylBQC/yNgj8V133WVuiUycOFF+//vfy2Bh56gUp1BMe6A1fcW0qXT9nDqpVi6dN1k+MmWEeE0DAM2Y6DaPzlIJD1T6a1S8K6a1gYv9OADAOzwSpzBHxc3Wj51Om5YalQFkVDS4uuYc/9T+aJ2KBiq6/TO9fsiR7clZHfgWXaPSFxBWl7kPCAEA6cV88JS6fgq92fqxxbQpZFT8ZqydThvV+WMDlUTn/KS9mDZu10/mfwYAQGIEKinNUSnwZI7KQIpp/SZe54896yebk2mjB771z1EZ/AEhAAx2g3/F86Drx11GpcQXxbSDIVDRGhw9rDB7xbR930O/pw0CFZNpAcA/Bv+K58kcFRcZlar+jEog0PfvBzyZNhe2foItyjvDptPaQlo9NTkbrcHh38PWpfS9zlk/AOAXBCopnZ7spuunJBTktHb2L4apyM2MSnvMYW/ZOLVYA6LK0r6gT9ukLbsVRNcPAHhv8K94Pp+jUlFSJKXBwGKgLcr9gUpRzgQqet5Pb7D2J5tTaY+oUwkrqGUyLQD4B4FKCu3JbuaoaGagfzptV3qKaVM468dv6oeUicZ7Gvzta+2IKDjORsdPvDH6Pb0BaQtmvghUAMB7g3/F82Trx922hO382T/Azp/+s34G/59Ng736oeUR2z/ZnKES72DC1s7+zAqTaQHAe4N/xfNk68fdZbMdLANtUW7vTn0y7WDo/PFi68d2/tiMig1YNBjNhYAQAAY7HokzfCihqg12/gy4RiWHMiqJApVstCYfWaPSFTVDpTgrBb0AgMRyY8XL8sA3N+3J6ZxOm0vFtOHTae3WTzbP+TnivJ9ggBLq+GHbBwB8gUAlwyP0VX8x7UC7fnJnMq1ftn6qo2tUCFQAwFdyY8XLctePbTd2fYLyADIqOiwulFHJga6fiEClycsalciuHxuwEKgAgD/kxoqXJV3Brh83c1Qit35Sz6h09vSKHWybO8W0UVs/XgYqwQDFBix0/ACAPxCoZHiOikrHHBWbTcmprZ+avozKvkMd5niA5lAxbV9glw32hGRbm2IDFabSAoA/5MaK5/M5Knbh3T+Arh/b8aNKXQZKfqXdPTq5VzU2tYdqeDwppo3q+qnmnB8A8IXcWPF8PkclHcW04YW0udI2q79H//bPYWkObr9kdevHFtNGd/2QUQEAXyBQSWGOitv2ZFtMq4cSdoZt4eTrgYSxCmrf3N1ixtdnfY5KVI1K+BwVAID3cmvVyzA7R8Xt1o+eXWPrb1PNqmgNRy4V0kbXqbyxqyXUUZXN3zFe14/NtAAAvEWgkoU5KkWFBaGD9mxni1u51pocnVF5o7E56+f8xDo9+VBHX0BIRgUA/CG3Vr0sdf24zahEDBYLPnNPfXx+jmVUgjUqmxtbsl6fooYEu340ENRtuUMdfYEkNSoA4A8EKi502RH6LjMqqirYRWJrIPJ9Km10RsXW7mQ7UKkq6w/8NIhsDWZUqsPeDwDwTm6tej4tpg1fEFMPVHK7mNbKZiGtnYljW6S1PiU0RyWYaQEAeCu3Vr2sbf2kkFEJbv3YZ+ypFtPm2tbPmODBhJat5cmm/oMJu8Im0+bWdQaAwYpAJaVi2tRrVFo7B5ZRKc+xYlrt8BlR1T+JdlhF9qbSxhqj39/1Q0YFAPwgt1a9bJ31M4CMyqEBb/3k3jP98O2fbNeohLcia0fW4WDmiowKAPgDgUqWun6qSgdYo2K3fnIsoxLe+aNqKoo92/rZ3dx+xPsAAN7KvVXPhyP001GjkqvFtGpMcOhbtg8kjN6W0/OGbCCai5krABiMcm/V8+GhhIqtn/jGebz1Yzt8bKBiAxcAgPcIVFLY+kmlRsUufm2pFtOGRugX5naNSpbbk8OLaRuDWz9MpQUA/8i9Vc+nXT/9GZWBbv0U5XiNioeBChkVAPAdApWUDiVMJaMy0IFvuTmZ1g9dPzYw2UWgAgC+wyOyQ4FAQHrsCP0UalQqBzpC3571k4NbPyOry+TUSbXSEwhIrRfFtMGMim1NpuMHAPyDR2SXHT+qZABdPxTTHqmwsEDWfO0j5vWCAvdB4EBFZ1CoUQEA/+AR2WXHT6oZlf5i2oGN0M/FYlqvAhRraHlJzAFwAADv5eaql+GMykAOJSSj4j/RWz1kVADAPwhUXJ6cnOrWj82odHb3hrqH3MjlYlqvRW/9UEwLAP7Bquey40c7k7WmItVi2lQLakMZlRzd+vESgQoA+BerntsZKim0JqvS4kIpDf7bVLZ/Ql0/bP1kbI6KRdcPAPgHgYrLqbQ22EiFrVNJpaC2vTu3i2m9FF2TQo0KAPgHq57Lrp9UCmnT0aJMRiVzdIBfRUn/daXrBwD8g0AlCycnR9c+pFajQjFtJoVv95BRAQD/YNVzufWTysnJVmVp6mP0aU/OrPAsCsW0AOAfBCoOdaV168d9jQpdP9nLqBCoAIB/sOq5zaikYeunrbPbdceRPWeonIxKRoQHJ3T9AIB/EKi4HPjmRTGtzaYoMiqZb1G23VkAAO+x6jnU1etdMW1H8JyfgbZHI77qspLQ9aUOCAD8g1XPZUZlIMW09pl6q8saFZtR0UU0lam4cJ5RIZsCAP5CoOK2PXkAGQ07Rj/VrR9akzPHZruoTwEAf2HlczvwbQAZjVS3ftqDWz/Up2SODVCqws5kAgB4j5XP9RyVgYzQDwYqLkfoM0Mle1s/0ef+AAC8RaDi+lDCgWRUigZUTEtGJXOmjRpiXh4VfAkA8AeePmZxhH4oo5JyjQoZlUw5dXKt/Omfz5Rxwyu8/lEAAGEy9hT9vffek0suuUQmT54sFRUVMnXqVLn22muls7Mz4vM2btwo8+bNk/LycmloaJBVq1aJn2tUBjZCn2JaP5tUVzWgrT0AwCDKqGzevFl6e3vltttuk6OOOkpee+01ufTSS6W1tVX+7d/+zXxOc3OzLFy4UBYsWCC33nqrvPrqq3LxxRfLsGHD5LLLLpNc6/oZcDEtgQoAIM9kLFD55Cc/aW7WlClTZMuWLfKzn/0sFKjce++9JsNyxx13SGlpqcycOVM2bNggq1ev9l2gEpqjUpiGOSopFtOWl7D1AwDIL1l9it7U1CS1tbWht9evXy/z5883QYq1aNEiE9AcOHAg5tfo6OgwmZjwWzZ028m0Ayqm7YsLO7t7Q8W5TnR0k1EBAOSnrK18b7/9ttx8883yta99LfS+xsZGqa+vj/g8+7Z+LJaVK1dKTU1N6KZ1Ldnt+hn4wDe32z8dXfbkZDIqAID84nrVXbZsmRQUFCS8aX1KuA8++MBsA5133nmmTmUgli9fbjIz9rZjxw7J7unJqWdUSosLQ2f1uCmopZgWAJCvXNeoLF26VBYvXpzwc7Qexdq5c6ecddZZcvrpp8vtt98e8XmjR4+W3bt3R7zPvq0fi6WsrMzcsq3LTqYdYFeI1ql0tvW6Ou+HYloAQL5yHaiMHDnS3JzQTIoGKXPmzJE777xTCqNmkMydO1euueYa6erqkpKSvtNr161bJzNmzJDhw4eLn9iMykBqVOwslQNtXdLa6T6jQjEtACDfZOwpugYpZ555pkyYMMF0+ezdu9fUnYTXnlxwwQWmkFbnrWzatEnWrFkjN910k1x11VXiN/1dPwO7ZKm0KFNMCwDIVxlrT9bMiBbQ6m38+PERHwsE+rITWgy7du1aWbJkicm61NXVyYoVK3zXmqy60tD1k+p0WibTAgDyVcYCFa1jSVbLombNmiVPPfWU+F0oozLgGhU7nbYnha4fMioAgPzCyue2RmUAXT+qqtT9wYRs/QAA8hUrn+utn/RkVNwU07YHMyoU0wIA8g2Bisutn9IB1qhQTAsAgHOsfFk8lDDivB83NSoU0wIA8hSBikPdduDbQGtUQsW0TKYFACAZVj63I/QHmlEJnvfj7qyf4NYPXT8AgDzDyuf6UELvMioU0wIA8g2BikPdtutnwJNp+4KNtk43c1QopgUA5CdWPtcD35hMCwBAthCoZL3rh2JaAACcYuVz2fVTMuDJtAOYo0IxLQAgz7DyuR2hn+U5Kj29gVA2p5ytHwBAniFQcajLzlFJ02Tazp5e6Qxu6TjJpigyKgCAfMPK53aOSmF6alRUm4PzfuzJyap0gNkcAAAGG1Y+18W0A8uo6MC40mBRrJOCWltIqxNxB7rtBADAYMPK57aYdoCBSuTBhMnrVDiQEACQz1j9HOoKZTYGfskqS4scZ1Tag1s/ZUylBQDkIQIVh7rsZNo0ZlQc1agEMyrlZFQAAHmI1c/1ZNqBXzI302lDw97IqAAA8hCBigO9vQEJJlRMUetA9U+ndVCjYrd+yKgAAPIQq5+LGSoqHZ039mBCZxkVimkBAPmL1c/FDJV0df1UBsfouyqmZSotACAPEai4DFTS0fWTSjEtU2kBAPmI1c/l1k86MipuzvvpPzmZjAoAIP8QqLjIqBQVFkhBQTqLaZ2M0CejAgDIX6x+DnQFW5PT0fETOZnWRXsyxbQAgDzE6udAd7A3OR0zVBTFtAAAOEOg4mLYWzqm0qbanlzO1g8AIA+x+rk5OTkNHT/hNSptnRTTAgCQCIGKi5OTS9OUUXFVTMvANwBAHmP1c5NRSVONiqti2tDpyfypAAD5h9XPgxqV/kMJ2foBACARAhU3XT/pqlEp7Qs6Ont6pTMYiMTTHpyjQjEtACAfsfq5maOS5oyKkzH6ZFQAAPmMQMXFZNp01ajoPJbSYHFssoJaimkBAPmM1c9F109JmibTRhbUJq5TYTItACCfsfq56vpJX6BiDyZMmlEJdf2w9QMAyD8EKm4yKmna+lFVpc5alNvtZFoyKgCAPMTq52oybTozKnY6LRkVAADiIVDxoJg2cjotNSoAAMTD6udq6yedxbTODiak6wcAkM9Y/Tw4lFBVBWtUkrcns/UDAMhfBCoejNCPHKMfP1Dp7Q2EJteSUQEA5CNWPw9G6Ie3J7d1xq9R0RH7VjkZFQBAHiJQ8WCEfmQxbXfSjh9FRgUAkI9Y/VwEKumco9I/mbY7aSGtdkWnszUaAIDBgkDFTXtyOueoOCimDT+QsKCAQAUAkH8IVFyN0E//HJVEGZX2rmBrcgl/JgBAfmIF9GiOii2mTXQooc2olBdTSAsAyE8EKl7NUbEZlQQj9EPD3sioAADyFCugR3NUHBXT2nN+6PgBAOQpVkA3c1QyMvCtx1ExLQAA+YhAxc0clTRu/VQHu350qJudPhu3mJaMCgAgT7ECumhPTmdGpTJYTJto+ydUTMtUWgBAnspooPLZz35WJkyYIOXl5TJmzBi58MILZefOnRGfs3HjRpk3b575nIaGBlm1apX4tesnne3JOjyuNJgpiVdQy8nJAIB8l9EV8KyzzpL7779ftmzZIg8++KC888478nd/93ehjzc3N8vChQtl4sSJ8uKLL8qNN94o1113ndx+++3iz66f9A5dq05Sp9J/cjKBCgAgP/WtlBly5ZVXhl7XYGTZsmVy7rnnSldXl5SUlMi9994rnZ2dcscdd0hpaanMnDlTNmzYIKtXr5bLLrtM/JZRsRmQdM5S2d8afzptf9cPWz8AgPyUtafq+/fvN4HJ6aefboIUtX79epk/f74JUqxFixaZDMyBAwckl+eoqKpgQW28GhWKaQEA+S7jK+DVV18tVVVVMmLECNm+fbv89re/DX2ssbFR6uvrIz7fvq0fi6Wjo8NsGYXfBuMcFSdj9CmmBQDkO9eBim7f6AF5iW6bN28Off63v/1tefnll2Xt2rVSVFQkX/nKVyQQ6MtQpGLlypVSU1MTumkB7mCcoxI5nTZejQoZFQBAfnNdo7J06VJZvHhxws+ZMmVK6PW6ujpzmz59uhxzzDEmsHjmmWdk7ty5Mnr0aNm9e3fEv7Vv68diWb58uVx11VWhtzWjkulgJVNbP9Wh834SZ1QIVAAA+cp1oDJy5EhzS0VvsChVt2+UBivXXHNNqLhWrVu3TmbMmCHDhw+P+TXKysrMLZsytvUTrFFJWkzL1g8AIE9l7Kn6s88+K//xH/9huni2bdsmjz/+uHzxi1+UqVOnmgBFXXDBBaaQ9pJLLpFNmzbJmjVr5KabborImPhB/9ZPurt+khTTsvUDAMhzGVsBKysr5de//rWcffbZJkOiwcisWbPkySefDGVEtMZEa1e2bt0qc+bMMdtKK1as8FVrcuQI/UzNUSGjAgBAVueoHH/88SaLkowGL0899ZQMjhH66Y3r7Bh9imkBAIiNFdDVCP0sZ1QopgUA5DlWQB8MfDuUNFBh6wcAkJ8IVFx0/WRsjkrcQCW49cNZPwCAPMUK6EBXsOsnnacnOzmU8HCwdoWtHwBAvmIFdJNRSXPXjy2mjbX1s6vpsGzd12pebxhemdbvCwDAYEGgkkRvb0CCCZWMZVTaOo8MVB588X3zfU+dXCsNtQQqAID8RKCSRFew4yezhxL2HBEc3f/C++b1vz8582cZAQDgVwQqDmeoqJJ0n/UT7Prp7OmVzmCHj3p2637Zvr/NZFw+fXzsM48AAMgHBCoOp9JmIqNia1SiO38eeGGHefmZE8ZIZTCYAQAgHxGoOJyhkokR+jrptjTY0WMLapvbu+T3r+0yr7PtAwDIdwQqTqfSFhZIQUF6A5XIgtq+OpWHX9kp7V29Mm1UtcxuGJb27wcAwGBCoOKwRiXd2z5WVVSL8v3P9237nH9KQ0YCIwAABhMCFYc1KukupLWqgjUoWqOyubFZXnm/yWRvzj1xXEa+HwAAgwmVmkl0h6bSZia7EX4w4QMv7DWvLzimXuqqyzLy/QAAGEzIqDjMqKR72Fv0LJUDbV3y0MsfmNf//pTxGfleAAAMNgQqDmtU0j0+P7pG5XevfCD7WzulfmiZzJ82MiPfCwCAwYZAxWnXT1Fma1SeeXe/efn5k8Zn7HsBADDYsCI6nKOSua6fyDIhZqcAANCPQMXh1k9phrIctphW6QGEk+qqMvJ9AAAYjAhUHB5KmI2MyvlkUwAAiECg4nTgW6bmqASLaTWz8ikOIAQAIAKBShLdduBbhjIqp00eIWXFhfK1+VM4gBAAgCisjEl09WY2ozJj9BB5/XuflAx1PwMAMKgRqDjMqGSqRkUVEaUAABATWz9OB74x2wQAgKxj9XXa9UPWAwCArCNQSYKMCgAA3mH1dXwoIRkVAACyjUAlie4Md/0AAID4WH09nqMCAADiI1Dx+FBCAAAQH4FKEt2hrh8uFQAA2cbq67jrh4wKAADZRqDieOuHSwUAQLax+jrc+ilh4BsAAFlHoJIEGRUAALzD6psEA98AAPAOgYrTOSp0/QAAkHWsvkl02cm0ZFQAAMg6AhWHGRVqVAAAyD5WX6dzVOj6AQAg6whUHG/9cKkAAMg2Vt8kOJQQAADvEKg43PrhrB8AALKP1TeJLnsoIRkVAACyjkDFYUallBoVAACyjtU3CSbTAgDgHQKVJLpt1w81KgAAZB2rbxJ0/QAA4B0ClSQ4PRkAAO+w+ibRbbt+mEwLAEDWEag4HaFPRgUAgKxj9U2Crh8AALxDoOKw66eErh8AALKO1dfpCH0yKgAA5Gag0tHRIbNnz5aCggLZsGFDxMc2btwo8+bNk/LycmloaJBVq1aJnzBCHwCAHA9UvvOd78jYsWOPeH9zc7MsXLhQJk6cKC+++KLceOONct1118ntt98uftDTG5BAX0KFrR8AADxQnOlv8Oijj8ratWvlwQcfNK+Hu/fee6Wzs1PuuOMOKS0tlZkzZ5qMy+rVq+Wyyy4TvxTSKjIqAABkX0bTBLt375ZLL71UfvnLX0plZeURH1+/fr3Mnz/fBCnWokWLZMuWLXLgwIG420iaiQm/ZbqQVtGeDABA9mVs9Q0EArJ48WK5/PLL5eSTT475OY2NjVJfXx/xPvu2fiyWlStXSk1NTeimdS2ZHp+vGPgGAMAgCFSWLVtmimIT3TZv3iw333yztLS0yPLly9P6A+vXa2pqCt127NghmR6fr4oIVAAA8H+NytKlS02mJJEpU6bI448/brZ2ysrKIj6m2ZUvfelLcvfdd8vo0aPN9lA4+7Z+LBb9etFfM9Pj8/VAQg3AAACAzwOVkSNHmlsyP/3pT+UHP/hB6O2dO3ea+pM1a9bIaaedZt43d+5cueaaa6Srq0tKSkrM+9atWyczZsyQ4cOHi29mqNDxAwBAbnX9TJgwIeLt6upq83Lq1Kkyfvx48/oFF1wg119/vVxyySVy9dVXy2uvvSY33XST/Pu//7v4AePzAQDI8fbkRLQYVluXlyxZInPmzJG6ujpZsWKFL1qTw2tU6PgBACDHA5VJkyaZTqBos2bNkqeeekr8KJRRoZAWAABPkCpwciAhGRUAADzBCuxgjgo1KgAAeINAxUGNCls/AAB4g0DF0RwVLhMAAF5gBXYyR4WtHwAAPEGg4qjrh8sEAIAXWIEddP2UsvUDAIAnWIETYDItAADeIlBxVKPCZQIAwAuswE66fmhPBgDAEwQqTuaosPUDAIAnCFQcTablMgEA4AVWYCdn/bD1AwCAJwhUHG39cJkAAPACK7CDrZ8SalQAAPAEgUoCXcGtHybTAgDgDVZgR8W0ZFQAAPACgYqTYlpqVAAA8AQrsKNDCcmoAADgBQKVBBihDwCAt1iBE2CEPgAA3iJQSYA5KgAAeIsVOAHmqAAA4C0CFUdzVAhUAADwAoFKAhxKCACAt1iBHXT9sPUDAIA3CFQSYIQ+AADeYgVOoKubEfoAAHiJQMXJHBVqVAAA8AQrsJM5KnT9AADgCQKVBMioAADgLVZgR2f9kFEBAMALBCqOTk/mMgEA4AVW4AS6g+3JpcVkVAAA8AKBipOtHzIqAAB4ghXYydYPNSoAAHiCQMXB1g9dPwAAeIMV2FExLRkVAAC8QKDi6FBCLhMAAF5gBXYw8I0aFQAAvEGgEkcgEAgboc9lAgDAC6zAcfQEC2lVCRkVAAA8QaCSpONHFVOjAgCAJ1iBk3T8KLp+AADwBoFKko4fRdcPAADeYAWOoyvY8VNQIFJERgUAAE8QqCSboULHDwAAnmEVTnYgIR0/AAB4hkAlydYPhbQAAHiHQCUOxucDAOA9VuFkBxKy9QMAgGcIVJIMfGN8PgAA3mEVjqM7mFFhfD4AAN4hUIkjdCAhNSoAAHgmo6vwpEmTpKCgIOJ2ww03RHzOxo0bZd68eVJeXi4NDQ2yatUq8YNuun4AAPBccaa/wfe+9z259NJLQ28PGTIk9Hpzc7MsXLhQFixYILfeequ8+uqrcvHFF8uwYcPksssuEz8U09L1AwBADgcqGpiMHj065sfuvfde6ezslDvuuENKS0tl5syZsmHDBlm9erUPAhUGvgEA4LWMpwt0q2fEiBFy4oknyo033ijd3d2hj61fv17mz59vghRr0aJFsmXLFjlw4EDMr9fR0WEyMeG3TGCEPgAAOZ5R+cY3viEnnXSS1NbWytNPPy3Lly+XXbt2mYyJamxslMmTJ0f8m/r6+tDHhg8ffsTXXLlypVx//fWStRoVMioAAHjGdbpg2bJlRxTIRt82b95sPveqq66SM888U2bNmiWXX365/PjHP5abb77ZZEVSpcFOU1NT6LZjxw7JBLp+AAAYhBmVpUuXyuLFixN+zpQpU2K+/7TTTjNbP++9957MmDHD1K7s3r074nPs2/HqWsrKyswtW3NUSsmoAAAweAKVkSNHmlsqtFC2sLBQRo0aZd6eO3euXHPNNdLV1SUlJSXmfevWrTNBTKxtn2zqYjItAACey9gqrIWyP/nJT+SVV16Rd99913T4XHnllfLlL385FIRccMEFppD2kksukU2bNsmaNWvkpptuMltGXrMZFWpUAADIwWJa3Z6577775LrrrjM1KVo0q4FKeBBSU1Mja9eulSVLlsicOXOkrq5OVqxY4XlrsuL0ZAAAcjhQ0W6fZ555JunnaaHtU089JX7TxWRaAAA8R7ogSUaFrh8AALzDKhwHpycDAOA9ApU46PoBACAPzvoZrOZOGSFanjJnordt0gAA5DMClTjmTx9pbgAAwDvsawAAAN8iUAEAAL5FoAIAAHyLQAUAAPgWgQoAAPAtAhUAAOBbBCoAAMC3CFQAAIBvEagAAADfIlABAAC+RaACAAB8i0AFAAD4FoEKAADwrUF/enIgEDAvm5ubvf5RAACAQ3bdtut4zgYqLS0t5mVDQ4PXPwoAAEhhHa+pqYn78YJAslDG53p7e2Xnzp0yZMgQKSgoSHu0pwHQjh07ZOjQoZKPuAZcA4vrwDVQXIM+XAcZ8DXQ8EODlLFjx0phYWHuZlT0lxs/fnxGv4f+AfL1jmhxDbgGFteBa6C4Bn24DjKga5Aok2JRTAsAAHyLQAUAAPgWgUoCZWVlcu2115qX+YprwDWwuA5cA8U16MN1kKxdg0FfTAsAAHIXGRUAAOBbBCoAAMC3CFQAAIBvEagAAADfIlCJ45ZbbpFJkyZJeXm5nHbaafLcc89JLvvzn/8sn/nMZ8yEQJ3w+5vf/Cbi41pzvWLFChkzZoxUVFTIggUL5K233pJcsXLlSjnllFPMhONRo0bJueeeK1u2bIn4nPb2dlmyZImMGDFCqqur5fOf/7zs3r1bcsnPfvYzmTVrVmiA09y5c+XRRx/Nq2sQ7YYbbjD/T3zrW9/Kq+tw3XXXmd87/Hb00Ufn1TVQH3zwgXz5y182v6c+9h1//PHywgsv5M1j46RJk464H+hN//bZuh8QqMSwZs0aueqqq0zb1UsvvSQnnHCCLFq0SPbs2SO5qrW11fyeGqDFsmrVKvnpT38qt956qzz77LNSVVVlroneSXPBk08+af5ne+aZZ2TdunXS1dUlCxcuNNfFuvLKK+Xhhx+WBx54wHy+Ht3wt3/7t5JLdMqzLswvvviieTD++Mc/Lp/73Odk06ZNeXMNwj3//PNy2223meAtXL5ch5kzZ8quXbtCt7/85S95dQ0OHDggH/3oR6WkpMQE7K+//rr8+Mc/luHDh+fNY+Pzzz8fcR/Qx0d13nnnZe9+oO3JiHTqqacGlixZEnq7p6cnMHbs2MDKlSsD+UDvFg899FDo7d7e3sDo0aMDN954Y+h9Bw8eDJSVlQV+9atfBXLRnj17zHV48sknQ79vSUlJ4IEHHgh9zhtvvGE+Z/369YFcNnz48MDPf/7zvLsGLS0tgWnTpgXWrVsX+NjHPhb45je/ad6fL9fh2muvDZxwwgkxP5Yv1+Dqq68OnHHGGXE/no+Pjd/85jcDU6dONb97tu4HZFSidHZ2mmeTmr4LP09I316/fr3ko61bt0pjY2PENdHzGXRLLFevSVNTk3lZW1trXup9QrMs4ddA0+ATJkzI2WvQ09Mj9913n8kq6RZQvl0DzbCdc845Eb+vyqfroFsYuh08ZcoU+dKXviTbt2/Pq2vwu9/9Tk4++WSTPdAt4RNPPFH+67/+K28fGzs7O+Wee+6Riy++2Gz/ZOt+QKASZd++feYBur6+PuL9+rbeIfOR/b3z5Zroidxaj6Ap3+OOO868T3/P0tJSGTZsWM5fg1dffdXsNeu0ycsvv1weeughOfbYY/PqGmiAptu+WrsULV+ugy62d911lzz22GOmdkkX5Xnz5pnTbvPlGrz77rvmd582bZr84Q9/kCuuuEK+8Y1vyN13352Xj42/+c1v5ODBg7J48WLzdrbuB4P+9GQgE8+kX3vttYj9+HwyY8YM2bBhg8kq/e///q9cdNFFZu85X+iR9d/85jfNXrwW0+erT33qU6HXtUZHA5eJEyfK/fffb4pG84E+adGMyo9+9CPztmZU9LFB61H0/4t884tf/MLcLzTLlk1kVKLU1dVJUVHREVXL+vbo0aMlH9nfOx+uyde//nV55JFH5IknnjCFpZb+npr21GcTuX4N9BnSUUcdJXPmzDEZBS2yvummm/LmGmg6WwvnTzrpJCkuLjY3DdS0YFJf12eL+XAdoumz5unTp8vbb7+dN/cF7eTRbGK4Y445JrQFlk+Pjdu2bZP/+7//k69+9auh92XrfkCgEuNBWh+g//jHP0ZE1fq27tPno8mTJ5s7Xfg1aW5uNhXuuXJNtIZYgxTd5nj88cfN7xxO7xNa+R9+DbR9WR+wcuUaxKP3/46Ojry5BmeffbbZ/tKskr3ps2qt0bCv58N1iHbo0CF55513zOKdL/cF3f6NHlPw5ptvmsxSvjw2Wnfeeaep09G6LStr94O0leXmkPvuu89Ubd91112B119/PXDZZZcFhg0bFmhsbAzkKu1wePnll81N7xarV682r2/bts18/IYbbjDX4Le//W1g48aNgc997nOByZMnBw4fPhzIBVdccUWgpqYm8Kc//Smwa9eu0K2trS30OZdffnlgwoQJgccffzzwwgsvBObOnWtuuWTZsmWm02nr1q3m76xvFxQUBNauXZs31yCW8K6ffLkOS5cuNf8/6H3hr3/9a2DBggWBuro60xGXL9fgueeeCxQXFwd++MMfBt56663AvffeG6isrAzcc889oc/J9cdG2/mqf2vtgoqWjfsBgUocN998s7n4paWlpl35mWeeCeSyJ554wgQo0beLLrrIfFxb0f7lX/4lUF9fb4K4s88+O7Bly5ZAroj1u+vtzjvvDH2OPvD84z/+o2nX1Qerv/mbvzHBTC65+OKLAxMnTjT3+5EjR5q/sw1S8uUaOAlU8uE6nH/++YExY8aY+8K4cePM22+//XZeXQP18MMPB4477jjzuHf00UcHbr/99oiP5/pjo/rDH/5gHg9j/V7ZuB8U6H/Sl58BAABIH2pUAACAbxGoAAAA3yJQAQAAvkWgAgAAfItABQAA+BaBCgAA8C0CFQAA4FsEKgAAwLcIVAAAgG8RqAAAAN8iUAEAAL5FoAIAAMSv/j9UsNzDNztHZAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(res.fx[0:res.total_num_search])" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:07.875556Z", "start_time": "2021-03-05T04:45:07.722679Z" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "best_fx, best_action = res.export_all_sequence_best_fx()\n", "plt.plot(best_fx)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 結果のシリアライズ\n", "\n", "探索結果は `save` メソッドにより外部ファイルに保存できます。" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:07.887135Z", "start_time": "2021-03-05T04:45:07.878666Z" } }, "outputs": [], "source": [ "res.save('search_result.npz')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:07.890553Z", "start_time": "2021-03-05T04:45:07.888487Z" } }, "outputs": [], "source": [ "del res" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "保存した結果ファイルは以下のようにロードすることができます。" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:07.920747Z", "start_time": "2021-03-05T04:45:07.900980Z" } }, "outputs": [], "source": [ "res = physbo.search.discrete.History()\n", "res.load('search_result.npz')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "最後に、一番よいスコアを持つ候補は以下のようにして表示することができます。正しい解 x=-1に行き着いていることがわかります。" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:07.929301Z", "start_time": "2021-03-05T04:45:07.922695Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1.002]\n" ] } ], "source": [ "print(X[int(best_action[-1])])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 回帰\n", "\n", "`get_post_fmean`, `get_post_fcov` メソッドでガウス過程(事後分布)の期待値と分散を計算可能です。" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:08.490337Z", "start_time": "2021-03-05T04:45:07.930904Z" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mean = policy.get_post_fmean(X)\n", "var = policy.get_post_fcov(X)\n", "std = np.sqrt(var)\n", "\n", "x = X[:,0]\n", "fig, ax = plt.subplots()\n", "ax.plot(x, mean)\n", "ax.fill_between(x, (mean-std), (mean+std), color='b', alpha=.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 獲得関数\n", "\n", "`get_score` メソッドで獲得関数を計算可能です。" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:08.992517Z", "start_time": "2021-03-05T04:45:08.491722Z" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "score = policy.get_score(mode=\"EI\", xs=X)\n", "plt.plot(score)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 並列化\n", "\n", "PHYSBO は全候補点に対する獲得関数の計算をMPI を用いて並列化出来ます。\n", "MPI 並列には `mpi4py` を用います。\n", "\n", "並列化を有効化するには、 `policy` のコンストラクタのキーワード引数 `comm` に MPI コミュニケータ、たとえば `MPI.COMM_WORLD` を渡してください。" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2021-03-05T04:45:08.996775Z", "start_time": "2021-03-05T04:45:08.993794Z" } }, "outputs": [], "source": [ "# from mpi4py import MPI\n", "# policy = physbo.search.discrete.Policy(X=test_X, comm=MPI.COMM_WORLD)" ] } ], "metadata": { "anaconda-cloud": {}, "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.19" } }, "nbformat": 4, "nbformat_minor": 4 }