{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Learn Hurst exponent for fractional Brownian Motion\n", "\n", "This example performs to task of predicting Hurst exponent given the synthetic data generated from fractional Brownian motion." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import equinox as eqx\n", "import fbm\n", "import jax\n", "import jax.numpy as jnp\n", "import jax.random as jrandom\n", "import matplotlib.pyplot as plt\n", "import nets\n", "import optax # https://github.com/deepmind/optax\n", "\n", "jax.config.update(\"jax_platform_name\", \"cpu\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "n_paths_train = 200\n", "n_paths_test = 50\n", "dt = 1e-2 / 3.0 # 300 time steps\n", "hurst_exponent = jnp.around(jnp.linspace(0.2, 0.8, 7), decimals=7).tolist()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def dataloader(arrays, batch_size, *, key):\n", " # this taken from equinox documentation\n", " dataset_size = arrays[0].shape[0]\n", " assert all(array.shape[0] == dataset_size for array in arrays)\n", " indices = jnp.arange(dataset_size)\n", " while True:\n", " perm = jrandom.permutation(key, indices)\n", " (key,) = jrandom.split(key, 1)\n", " start = 0\n", " end = batch_size\n", " while end < dataset_size:\n", " batch_perm = perm[start:end]\n", " yield tuple(array[batch_perm] for array in arrays)\n", " start = end\n", " end = start + batch_size" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def generate_data(key):\n", " train_key, test_key = jrandom.split(key)\n", " X_train, Y_train = [], []\n", " X_test, Y_test = [], []\n", " # generate train\n", " for hurst in hurst_exponent:\n", " train_key, _ = jrandom.split(train_key)\n", " X = fbm.generate_fbm(\n", " hurst=hurst,\n", " n_paths=n_paths_train,\n", " dt=dt,\n", " key=train_key,\n", " )\n", " Y = jnp.array([hurst] * n_paths_train)\n", " X_train.append(X)\n", " Y_train.append(Y)\n", "\n", " # generate test\n", " for hurst in hurst_exponent:\n", " test_key, _ = jrandom.split(test_key)\n", " X = fbm.generate_fbm(\n", " hurst=hurst,\n", " n_paths=n_paths_test,\n", " dt=dt,\n", " key=test_key,\n", " )\n", " Y = jnp.array([hurst] * n_paths_test)\n", " X_test.append(X)\n", " Y_test.append(Y)\n", "\n", " X_train = jnp.concatenate(X_train)\n", " Y_train = jnp.concatenate(Y_train)\n", " X_test = jnp.concatenate(X_test)\n", " Y_test = jnp.concatenate(Y_test)\n", "\n", " return (\n", " X_train[..., None],\n", " Y_train[..., None],\n", " X_test[..., None],\n", " Y_test[..., None],\n", " )" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "seed = 1234\n", "key = jrandom.PRNGKey(seed)\n", "data_key, loader_key, model_key = jrandom.split(key, 3)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "X_train, Y_train, X_test, Y_test = generate_data(key=data_key)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "model = nets.create_simple_net(\n", " dim=1,\n", " signature_depth=3,\n", " augment_layer_size=(3,),\n", " augmented_kernel_size=3,\n", " mlp_width=32,\n", " mlp_depth=5,\n", " output_size=1,\n", " final_activation=jax.nn.sigmoid,\n", " key=model_key,\n", ")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "iter_data = dataloader((X_train, Y_train), batch_size=128, key=loader_key)\n", "optim = optax.adam(learning_rate=1e-3)\n", "opt_state = optim.init(eqx.filter(model, eqx.is_array))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "@eqx.filter_value_and_grad\n", "def compute_loss(model, x, y):\n", " pred_y = jax.vmap(model)(x)\n", " assert pred_y.shape[0] == y.shape[0]\n", " return jnp.mean(jnp.square(pred_y - y))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "@eqx.filter_jit\n", "def make_step(model, x, y, opt_state):\n", " loss, grads = compute_loss(model, x, y)\n", " updates, opt_state = optim.update(grads, opt_state)\n", " model = eqx.apply_updates(model, updates)\n", " return loss, model, opt_state" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "step=0 \t loss=0.041261281818151474\n", "step=10 \t loss=0.03442611172795296\n", "step=20 \t loss=0.027970541268587112\n", "step=30 \t loss=0.02049068734049797\n", "step=40 \t loss=0.014842263422906399\n", "step=50 \t loss=0.01463926862925291\n", "step=60 \t loss=0.008735965006053448\n", "step=70 \t loss=0.0038531338796019554\n", "step=80 \t loss=0.0031830959487706423\n", "step=90 \t loss=0.0017226745840162039\n", "step=100 \t loss=0.0018800266552716494\n", "step=110 \t loss=0.0012469309149309993\n", "step=120 \t loss=0.001055217464454472\n", "step=130 \t loss=0.0011177064152434468\n", "step=140 \t loss=0.0009607287356629968\n", "step=150 \t loss=0.0007560442318208516\n", "step=160 \t loss=0.0006463633617386222\n", "step=170 \t loss=0.0007553303148597479\n", "step=180 \t loss=0.0006547534139826894\n", "step=190 \t loss=0.0005832671886309981\n", "step=200 \t loss=0.0005575551767833531\n", "step=210 \t loss=0.00035020316136069596\n", "step=220 \t loss=0.0004003815120086074\n", "step=230 \t loss=0.00045127380872145295\n", "step=240 \t loss=0.00031438778387382627\n", "step=250 \t loss=0.00036406281287781894\n", "step=260 \t loss=0.0002983828308060765\n", "step=270 \t loss=0.0002879476814996451\n", "step=280 \t loss=0.0002255685394629836\n", "step=290 \t loss=0.00022613670444115996\n", "step=300 \t loss=0.00024316016060765833\n", "step=310 \t loss=0.00021550750534515828\n", "step=320 \t loss=0.0002071917406283319\n", "step=330 \t loss=0.00019002672343049198\n", "step=340 \t loss=0.00013162200048100203\n", "step=350 \t loss=0.00012771754700224847\n", "step=360 \t loss=0.0001422253844793886\n", "step=370 \t loss=0.00019014824647456408\n", "step=380 \t loss=0.00012071082164766267\n", "step=390 \t loss=0.00010335109254810959\n", "step=400 \t loss=0.00016220123507082462\n", "step=410 \t loss=0.00010574463522061706\n", "step=420 \t loss=0.0001059367205016315\n", "step=430 \t loss=0.00015133402484934777\n", "step=440 \t loss=0.00012403847358655185\n", "step=450 \t loss=0.00010137465869775042\n", "step=460 \t loss=0.00010347012721467763\n", "step=470 \t loss=8.348895789822564e-05\n", "step=480 \t loss=9.372731437906623e-05\n", "step=490 \t loss=8.70665826369077e-05\n" ] } ], "source": [ "test_mse = []\n", "for step, (x, y) in zip(range(500), iter_data):\n", " loss, model, opt_state = make_step(model, x, y, opt_state)\n", " loss = loss.item()\n", " test_mse += [jnp.mean(jnp.square(jax.vmap(model)(X_test) - Y_test)).item()]\n", " if step % 10 == 0:\n", " print(f\"step={step} \\t loss={loss}\")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAGdCAYAAADaPpOnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABPeElEQVR4nO3de1xUdf4/8NeZGWa4Dle5g3hHBMELIpqZSXnLsntt37LLtltZW2u1a+12b7d2u7dR/bab7W5ll01ts4uG97uiKIgCKgjI/TYDAwzMzPn9MTDMcBGQy5kZXs/Hg8dj5pwzM+85mrz6XAVRFEUQEREROQiZ1AUQERER9QfDCxERETkUhhciIiJyKAwvRERE5FAYXoiIiMihMLwQERGRQ2F4ISIiIofC8EJEREQORSF1AYPNZDKhpKQEXl5eEARB6nKIiIioD0RRRH19PUJDQyGTXbhtxenCS0lJCSIiIqQug4iIiC5CUVERwsPDL3iN04UXLy8vAOYvr1arJa6GiIiI+kKr1SIiIsLye/xCnC68tHcVqdVqhhciIiIH05chHxywS0RERA7FacJLamoqYmJikJiYKHUpRERENIQEURRFqYsYTFqtFt7e3tBoNOw2IiIichD9+f3tNC0vRERENDIwvBAREZFDYXghIiIih8LwQkRERA6F4YWIiIgcCsMLERERORSGFyIiInIoDC9ERETkUBheiIiIyKEwvPSR3mDEvf86jO05FVKXQkRENKIxvPTRJ3sKsCW7HL/+9DA2HD0vdTlEREQjltOEl6HemPHuuWNwTUIoDCYRj3yZgQ93nR2SzyEiIqIL48aM/WAyiXj++2ys3VsAALh33hg8sWQyZDJhUD+HiIhopOHGjENEJhPwzPIYrFkSDQD4YFc+nlyfCZPJqfIfERGRXWN46SdBEHDf/HF47cZ4yARg3aEirPn2OAMMERHRMGF4uUjXzwjHGzcnQCYAXx0uxiubc6QuiYiIaERgeBmAaxLC8Pcb4gEA720/g88PFEpcERERkfNjeBmgG2aE45GUCQCApzdm4WhhrcQVEREROTeGl0Hw8MIJWDY1BAaTiIe+OApNU6vUJRERETkthpdBIAgCXrouDhF+biiubcKT32bCyWagExER2Q2Gl0GidnXBP26dDoVMwKbMUnxxsEjqkoiIiJwSw8sgSojwwR8Xm9eAeXFTNopqGiWuiIiIyPkwvAyyey4Zg1lRfmhsMeLJ9ew+IiIiGmwML4NMJhPw8vVxUClk2JVXhW/Si6UuiYiIyKkwvAyBsaM88fsrJgIAXvg+GxXaZokrIiIich4ML0Pk15eMQVyYN7TNBjy1MYvdR0RERIOE4WWIKOQy/O36qVDIBPx8ohw/nyiXuiQiIiKn4DThJTU1FTExMUhMTJS6FIuYUDV+O38sAHP3UVOLUeKKiIiIHJ8gOll/hlarhbe3NzQaDdRqtdTloKnFiJTXd+B8XRN+d/l4rL5yktQlERER2Z3+/P52mpYXe+WmlOPPyyYDAN7feRbnqnUSV0REROTYGF6GweLYYMybEIAWgwnP/y9b6nKIiIgcGsPLMBAEAc8snwKFTEDaqQqkneTgXSIioovF8DJMxgd64p5LxgAAnv8+G82tHLxLRER0MRhehtFDCycgSK3CuepGfLjrrNTlEBEROSSGl2HkqVLgyaXmwbvvbDuN4lpu3EhERNRfDC/D7Or4UCSN8UNzqwl/2XRS6nKIiIgcDsPLMBMEAc9dMwVymYAfs8qwK69S6pKIiIgcCsOLBKKD1bgjeTQAYM1/M1HX2CJxRURERI6D4UUij145CVH+7jhf14Q/fHOcGzcSERH1EcOLRDxVCvzj1ulwkQvYnF2Of+8/J3VJREREDoHhRUJx4d54Yol59tGL35/EiRKNxBURERHZP4YXid01NwopkwPRYjTh4XUZ3HmaiIioFwwvEhMEAX+/IR6BXiqcrmjAX37g3kdEREQXwvBiB/w8lHjtpngAwH/2F2JLNvc+IiIi6gnDi52YN2EU7p1n3vvoD98cQ2W9XuKKiIiI7BPDix15bNEkTA5Ro7axFc98lyV1OURERHaJ4cWOqBRyvHLDVChkAn7ILMMPmaVSl0RERGR3GF7sTGyYN+6/bBwA4OmNWajRcfVdIiIiawwvdujBy8djYpAnqhpa8Nz/TkhdDhERkV1heLFD5u6jeMgEYGNGCWcfERERWXGa8JKamoqYmBgkJiZKXcqgiI/wwb2XjgUAPPvdCTS3cvE6IiIiABBEJ9sRUKvVwtvbGxqNBmq1WupyBqSpxYiFr21HiaYZj105EQ9ePkHqkoiIiIZEf35/O03LizNyU8rxxyXRAIB3t59BubZZ4oqIiIikx/Bi566OD8W0SB80thjxys85UpdDREQkOYYXOycIAp6+KgYA8E16MTKLufM0ERGNbAwvDmBapC+unRYGAHj++xNwsmFKRERE/cLw4iD+sHgS3FzkOFRQi01ceZeIiEYwhhcHEeLtht/ON0+dfumHU5w6TUREIxbDiwP57aXjEOLtivN1Tfhod77U5RAREUmC4cWBuCnl+OPitqnT206jop5Tp4mIaORheHEwV8eHIj7CB7oWI177OVfqcoiIiIYdw4uDkck6pk5/lV6EEyWcOk1ERCMLw4sDmjHaF8vjQyGKwPP/y+bUaSIiGlEYXhzUHxdPgkohw4H8Gvx8grtOExHRyMHw4qDCfd3xm7Zdp1/68ST0Bk6dJiKikYHhxYHdN38cAr1UOFfdiE/3FkhdDhER0bBgeHFgHioFHl80CQDwj7TTqG7QS1wRERHR0GN4cXDXTw9HbJga9XoDXt/CqdNEROT8GF4cnEwm4Kll5qnTXxwsxKkyrcQVERERDS2GFyeQNNYfS+OCYRKBF78/yanTRETk1BhenMSaxZOhlMuw+3QVtp6qkLocIiKiIcPw4iQi/d1x9yVjAAB/2XQSrUaTxBURERENDYYXJ7JqwTgEeCpxtkqHf+87J3U5REREQ4LhxYl4ubrg0SvNU6ff/CUXtboWiSsiIiIafAwvTuammRGIDvaCttmAD3eflbocIiKiQcfw4mTkMgG/v2IiAODTvedQ18jWFyIici4ML07oislBiA72QoPegI9350tdDhER0aBieHFCMpmAhxdOAAB8sqcAmsZWiSsiIiIaPAwvTmrRlGBMCvJCvd6Aj/ew9YWIiJwHw4uTkskE/K6t9eXjPfnQNLH1hYiInAPDixNbEhuMCYGeqG824NO9BVKXQ0RENCgYXpyYTCbgobbWl49256O+ma0vRETk+BhenNyyuBCMG+UBTVMrW1+IiMgp2F14KSoqwmWXXYaYmBhMnToVX3/9tdQlOTS51diXtXsLoDcYJa6IiIhoYOwuvCgUCrz55pvIzs7G5s2b8cgjj0Cn00ldlkNbGheCYLUrqhpa8GNmmdTlEBERDYjdhZeQkBAkJCQAAIKDgxEQEICamhppi3JwLnIZbkuKBAB8uq9A2mKIiIgGqN/hZefOnVi+fDlCQ0MhCAI2bNjQ5ZrU1FRERUXB1dUVSUlJOHjw4EUVl56eDqPRiIiIiIt6PXW4ZVYkXOQCjhbWIbNYI3U5REREF63f4UWn0yE+Ph6pqandnv/yyy+xevVqPPPMMzhy5Aji4+OxaNEiVFRUWK5JSEhAbGxsl5+SkhLLNTU1Nbjjjjvwz3/+84L16PV6aLVamx/qapSXCkvjQgAA/2LrCxEROTBBFEXxol8sCFi/fj1WrFhhOZaUlITExES88847AACTyYSIiAg89NBDWLNmTZ/eV6/X44orrsC9996L22+//YLXPvvss3juuee6HNdoNFCr1X3/MiNA+rlaXP/eXigVMhx4YiF8PZRSl0RERAQA0Gq18Pb27tPv70Ed89LS0oL09HSkpKR0fIBMhpSUFOzbt69P7yGKIu68805cfvnlvQYXAHjiiSeg0WgsP0VFRRddv7ObHumD2DA1WgwmfJNeLHU5REREF2VQw0tVVRWMRiOCgoJsjgcFBaGsrG+zXPbs2YMvv/wSGzZsQEJCAhISEpCZmdnj9SqVCmq12uaHuicIAm5ONA/c/e5YSS9XExER2SeF1AV0dskll8BkMkldhtNaEhuMZzZmIfO8BgVVOkQFeEhdEhERUb8MastLQEAA5HI5ysvLbY6Xl5cjODh4MD+KLlKApwpzxgUAADZllkpcDRERUf8NanhRKpWYMWMG0tLSLMdMJhPS0tKQnJw8mB9FA3DVVPOso/+x64iIiBxQv8NLQ0MDMjIykJGRAQDIz89HRkYGCgsLAQCrV6/GBx98gE8//RQnT57E/fffD51Oh7vuumtQC+8sNTUVMTExSExMHNLPcQaLY4OhkAk4VVaP0xUNUpdDRETUL/2eKr19+3YsWLCgy/GVK1di7dq1AIB33nkHr7zyCsrKypCQkIC3334bSUlJg1Jwb/oz1Woku/OTg9ieU4lHUibgkZSJUpdDREQjXH9+fw9onRd7xPDSN9+kF+Oxr49hQqAntqyeL3U5REQ0wkm2zgs5jiunBEEplyGvogE5ZfVSl0NERNRnDC8jlNrVBZdOHAUA+P44B+4SEZHjYHgZwZbHm2cdfX+8FE7We0hERE6M4WUEWzg5CCqFDPlVOpwo4YaWRETkGJwmvHCqdP95qhS4PDoQgLn1hYiIyBE4TXhZtWoVsrOzcejQIalLcShXTQ0FYB73wq4jIiJyBE4TXujiXB4dCHelHMW1TThWrJG6HCIiol4xvIxwbko5Fk427wL+PbcLICIiB8DwQlgWZ551tCmzFCYTu46IiMi+MbwQLps0Cp4qBUo1zThSWCt1OURERBfE8EJwdZHjipi2riPOOiIiIjvnNOGFU6UH5qqpHV1HRnYdERGRHXOa8MKp0gMzb8IoqF0VqKzX41BBjdTlEBER9chpwgsNjFIhw6IpwQC41xEREdk3hheyuCrevGDdj5llMBhNEldDRETUPYYXspgzzh++7i6o1rVg/1l2HRERkX1ieCELF7kMi2Pbd5pm1xEREdknhheysbxt1tFPJ8rQyq4jIiKyQwwvZCNprD8CPFWoa2zF7tNVUpdDRETUBcML2ZDLBCyJNc862nyiTOJqiIiIunKa8MJF6gbP5dGBAICduVUQRS5YR0RE9sVpwgsXqRs8SWP9oJTLcL6uCWerdFKXQ0REZMNpwgsNHnelAoljfAEAO3MrJa6GiIjIFsMLdevSCaMAALvyOGiXiIjsC8MLdWteW3jZd6YaeoNR4mqIiIg6MLxQtyaHeGGUlwpNrUakF9RKXQ4REZEFwwt1SxAEzJsQAADYkcdxL0REZD8YXqhH8ye2jXvJ5bgXIiKyHwwv1KO5480tL9mlWlTUN0tcDRERkRnDC/UowFOF2DA1APPAXSIiInvgNOGFK+wOjTnjzK0ve08zvBARkX1wmvDCFXaHRvI4fwDA3rMc90JERPbBacILDY3EKD8oZAKKappQVNModTlEREQML3RhnioF4iN8AAD7zrLriIiIpMfwQr1KHmvuOuKgXSIisgcML9SrOe3jXs5UQRRFiashIqKRjuGFejV9tC+UChnKtXqcrdJJXQ4REY1wDC/UK1cXOWZE+gIA9rLriIiIJMbwQn3S3nW07wynTBMRkbQYXqhPksd1DNrluBciIpISwwv1ydRwH6gUMtQ2tiKf416IiEhCDC/UJ0qFDHFh3gCA9HO1EldDREQjGcML9dn00eZBu0cK66QthIiIRjSnCS/cmHHoTY/0AQAcLWTLCxERScdpwgs3Zhx609umS+eU16O+uVXiaoiIaKRymvBCQy9Q7YpwXzeIInCsSCN1OURENEIxvFC/tLe+cNAuERFJheGF+qV93Mvu05XSFkJERCMWwwv1y8LJQXCRCzhUUIttORVSl0NERCMQwwv1S4SfO+6cEwUAeGfraWmLISKiEYnhhfrt3nljoZAJSD9Xi5yyeqnLISKiEYbhhfotUO2KlMlBAID/HimWuBoiIhppGF7ooiyKNYeXwwU1EldCREQjDcMLXZRpEeYp01nntdAbjBJXQ0REIwnDC12U0f7u8PNQosVowokSrdTlEBHRCMLwQhdFEATLmi/sOiIiouHE8EIXbe74AADAL9lc74WIiIYPwwtdtEVTggEAh87VoKK+WeJqiIhopGB4oYsW6uOG+HBviCKQygXriIhomDhNeElNTUVMTAwSExOlLmVEeSRlIgDg033nsO9MtcTVEBHRSOA04WXVqlXIzs7GoUOHpC5lRFkQHYhfJUUCAN7dztYXIiIaek4TXkg6988fB7lMwK68KuRX6aQuh4iInBzDCw1YhJ87pkX4AACOFdVJWgsRETk/hhcaFFNC1QCA7FIuWEdEREOL4YUGRUxbeDlRopG4EiIicnYMLzQoYkK8AQDZJVqIoihxNURE5MwYXmhQTAz2hEImoLaxlYN2iYhoSDG80KBQKeSYPdYfALAlu1ziaoiIyJkxvNCgWTQlCADwr33noGlslbgaIiJyVgwvNGiunBIMpUKG83VNWPnJQY59ISKiIcHwQoMmSO2KD+6YCQDIKKrjtGkiIhoSDC80qOZPHIUlsebdpv93rFTiaoiIyBkxvNCgWx4fCgDYcPQ8DEaTxNUQEZGzYXihQbdwciD8PJQo0zYj7VSF1OUQEZGTYXihQadSyHHTzAgAwNMbs3CSY1+IiGgQMbzQkLh33hhMCPREuVaPBz8/Ar3BKHVJRETkJBheaEj4e6rw9X3JCPBU4UylDp/tL5S6JCIichIMLzRkfNyVWLVgHABgc3aZxNUQEZGzYHihIbVgUiAAIP1cLRr0BomrISIiZ8DwQkMqKsADkX7uaDWK2HO6SupyiIjICTC80JC7Isa859FXh4okroSIiJwBwwsNuduSIgEAW3MqcK5aJ3E1RETk6JwmvKSmpiImJgaJiYlSl0KdjB3lifkTR0EUzTtOExERDYTThJdVq1YhOzsbhw4dkroU6sadc6IAmLuOOHCXiIgGwmnCC9m3+RNHYWyAB+r1BsQ+8zPe33EGoihKXRYRETkghhcaFjKZgCeXTrY8f/nHU9icXY66xhY8+90J5JTVS1gdERE5EoYXGjYpMUGWResA4LnvTuDhdRlYu7cAd35yUMLKiIjIkTC80LB6fFE0Tj6/GGE+bijRNGNHbiUAoFTTjBaDSeLqiIjIETC80LBzU8rx3NVTuhw/Vlw3/MUQEZHDYXghSaTEBOHl6+LgrpRbju09XS1hRURE5CgYXkgyt8yKROazi/DiilgAwN4z3D6AiIh6x/BCkpLLBMwZ5w8AOFpYh6YWIwxGEzafKMP3x0skro6IiOyRQuoCiMYEeCBY7YoybTMmP/2TzblQHzdMj/SVqDIiIrJHbHkhyQmCgAXRo7o99+rPOcNcDRER2Tu2vJBdWLN4MhKj/OChUmDdwUJkFNWhtrEVe89UI79KhzEBHlKXSEREdoLhheyCt7sLrpseDgBYNCUYALDy44PYkVuJ7zJK8HDKBCnLIyIiO8JuI7JbV8eHAgC+PFSI+uZWiashIiJ7wfBCdmtJXLBlJd4Xvs+WuhwiIrITDC9kt9yVCrxxcwIA4KvDxXh3+2k06A3SFkVERJJjeCG7NmuMH25JjAAA/P2nHMz+axp2tu2HREREIxPDC9m9p66KwW8vHYswHzc06A34/ZcZqKzXS10WERFJhOGF7J6HSoEnlk5G2qPzER3shWpdC/7wzTE0txqhaeJAXiKikUYQRVGUuojBpNVq4e3tDY1GA7VaLXU5NMhOlWlx9Tt70GIwWY4tiwvBP26dBplMkLAyIiIaiP78/mbLCzmU6GA1XrlhKpSKjr+6mzJLkXaqQsKqiIhoOHGROnI41ySEYWq4D4pqGrE9pxIf78nHO1vzsDA6kK0vREQjAFteyCGNCfDApRNH4b7LxsJDKcexYg0eWncU5+uapC6NiIiGGFteyKEFernij0ui8fTGE9h0vBQ7cypx5ZRgmEQRjy2ahDAfN6lLJCKiQcbwQg7v9tmjoXZ1wQe7zuJEiRb/PVIMADhZqsW3D8yBu5J/zYmInAm7jcjhCYKAFdPCsP6BuXjrlgTcPns0AOBUWT3+/lOOxNUREdFgY3ghp6FUyHBNQhheWBGLf98zCwCwdm8BMorqpC2MiIgGFcMLOaV5E0bhuulhAIAXv89GYXUjanUtEldFRESDgeGFnNYjCydCIRNw+FwtLn1lG6a9sAVPb8ySuiwiIhoghhdyWpH+7njtpniM8lJZjq07WAQdd6YmInJoDC/k1K5JCMPBJxfi9F+WIMzHDS1GE/afrZa6LCIiGgCGF3J6giBAIZdhQfQoAMC2HG4lQETkyOwuvNTV1WHmzJlISEhAbGwsPvjgA6lLIiexMDoIAPBNejFOlWklroaIiC6W3e0qbTQaodfr4e7uDp1Oh9jYWBw+fBj+/v59ej13laaeiKKIX31wAPvauo0SInzwt+unYmKQJ0QR3BeJiEhCDr2rtFwuh7u7OwBAr9dDFEXYWb4iByUIAl69KR5zx/tDEICMojpc9+4eJDy/BZf8bSs0ja1Sl0hERH3Q7/Cyc+dOLF++HKGhoRAEARs2bOhyTWpqKqKiouDq6oqkpCQcPHiwX59RV1eH+Ph4hIeH4/HHH0dAQEB/yyTqVpiPGz779Wzsf2IhJgZ5QtdihKapFSWaZuw6XSl1eURE1Af9Di86nQ7x8fFITU3t9vyXX36J1atX45lnnsGRI0cQHx+PRYsWoaKiY5Bk+3iWzj8lJSUAAB8fHxw7dgz5+fn4/PPPUV5efpFfj6h7QWpXfHHvbCybGmI5djC/RsKKiIiorwY05kUQBKxfvx4rVqywHEtKSkJiYiLeeecdAIDJZEJERAQeeughrFmzpt+f8cADD+Dyyy/HDTfc0O15vV4PvV5vea7VahEREcExL9RnP2aW4v7PjiA62As/PjwPP2WVISZUjdH+HlKXRkQ0Ykg25qWlpQXp6elISUnp+ACZDCkpKdi3b1+f3qO8vBz19fUAAI1Gg507d2LSpEk9Xv/SSy/B29vb8hMRETGwL0EjTuIYPwDmjRzf3X4G9392BL/5V7rEVRERUU8GNbxUVVXBaDQiKCjI5nhQUBDKysr69B7nzp3DvHnzEB8fj3nz5uGhhx5CXFxcj9c/8cQT0Gg0lp+ioqIBfQcaeQI8VYgP9wYAvPKzeRfqnPJ6NLUYpSyLiIh6oJC6gM5mzZqFjIyMPl+vUqmgUql6v5DoApZNDcGxYo3NsawSDRKj/CSqiIiIejKoLS8BAQGQy+VdBtiWl5cjODh4MD+KaFAtjQuBUm77nwMH8BIR2adBDS9KpRIzZsxAWlqa5ZjJZEJaWhqSk5MH86OIBlW4rzu+ui8Z3z04F48vMo+xeuXnHPw3vVjiyoiIqLN+dxs1NDTg9OnTluf5+fnIyMiAn58fIiMjsXr1aqxcuRIzZ87ErFmz8Oabb0Kn0+Guu+4a1MKJBltChA8AwM9DifVHz+N0RQMe/foY3JVyLIkLufCLiYho2PR7qvT27duxYMGCLsdXrlyJtWvXAgDeeecdvPLKKygrK0NCQgLefvttJCUlDUrBPUlNTUVqaiqMRiNyc3M5VZoGxGQS8fR3WfjP/kLLFGpB4PYBRERDpT9Tpe1ub6OB4t5GNFg0ja1IfjkNjS1G/PP2GbhyCsdtERENFYfe24jIXni7u+D/Zo8GADz+zXEUVjdKXBEREQEML0QX9OiVExEf4QNNUyt+8+/DXPuFiMgOMLwQXYBKIcf7/zcdAZ5KnCqrx9Mbs9BiMEldFhHRiMbwQtSLEG83vHJDPADg6/RiLH5rJ8o0zRJXRUQ0cjlNeElNTUVMTAwSExOlLoWc0ILoQDx39RR4u7ngbKUOd35y0KYFpsVgQkU9Aw0R0XDgbCOifiiqacQ1qXtQo2vB3XPH4NZZERgT4IGnNmbhq8PF+PzXSUga6y91mUREDoezjYiGSISfO/60dDIA4OM9+bjijZ14cdNJfHGwCEaTiBc2ZUtcIRGR82N4Ieqn66aH4c/LJluer91bYHmcV96A+ubWC75+84kyvPlLLpys0ZOIaNgwvBD1kyAI+PW8sTjz16UI9Xa1Oac3mBD37Gbc/tGBbmcliaKI3/w7HW/+koe9Z6qHq2QiIqfC8EJ0keQyAf+XbF7ELszHDYutVuDdlVeFt9PycPlr25G6rWMvsKqGFqvH+uErlojIiTC8EA3A/fPH4ceH52HbY5dh5Zwom3PvbDuNs5U6fLjrLEwmcxfR6YoGy/laXYvN9SV1TXhtcw5nLRER9YLhhWgABEHA5BA1lAoZZkb5wkXedfPG2sZWnCzTAgBOV9Rbjpdp9diSXY6s8xoAwF2fHMI/tp7GH745PjzFExE5KKcJL1znhaTmIpdh46pL8K+7Z2FapI/NuR25lcgu0SLPquVl35kq3Puvw7jzk4MwGE3IKTcHm525lTav/flEGY4W1g55/UREjoLrvBANgWe/O2EzC6k3X9+XjBvf3wcA8HJV4M2bE3CsqA4rpoXh8td2AADyX1oKQejaskNE5Az68/tbMUw1EY0oo/3d+3X9luxyy2NRBO759LD5sdU15+uaEO7bv/clInJGTtNtRGRPbpwZgaQxfvjd5eP7dP3nBwotjxv0Bsvj3PKOMTKnSutBREQML0RDwlOlwJe/TcbqKychWG27Fszfb5ja5XrrwGItu1RreXyqTNvtNUREIw3DC9EQS71tOsYEeODd26Zj/QNzcNPMCEwO6ejP9VT13HtbVNNkeXyyjC0vREQAwwvRkJsx2hfbHrsMS+NCMC3SFwCwIiHUcv6mmRF9ep+88nq0Gk1IP1fb7eq9REQjBcMLkQSunR4GmWBemfexRRNx/2Xj8Lfr4y74mtK6Zry//Qyuf28v3vwlF4B5GvU7W/PQamSYIaKRw2mmSqempiI1NRVGoxG5ubmcKk1273xdE1xkAgKtxsRErdnU59cXvLwMsc/8jAa9AVfHh+LtW6cNRZlERMOiP1OlnablZdWqVcjOzsahQ4ekLoWoT8J83GyCS3/VN7daBvp+d6wEdY0tvbyCiMg5OE14IXImCRE+Ns993V26XJN13nb2Ubm2940e08/VoqBKN6DaiIikxvBCZEe+fWAOrp8ejv93+wzLsdH+7jazk9qlnSy3ed7bLtXn65pw/Xt7cdmr26E3GAenYCIiCTC8ENmR6ZG+eO2meASpXbFoShDGBnjg83tnd1krBgC+P15q87yy/sLhJcdqnZifssoGp2AiIglwewAiO/X/bp8JURQhCAKCvLuGlzJts81z65aXphYjXF1kNnshlWk6zn+TXoxrEsKGoGoioqHHlhciO9YePtSuHWNeXr8pHkp51/90X9+Si71nqvBLdjkmP/0TvjhYZHP+fF2j5XE+x70QkQNjeCFyALPH+gEAZkX54dppYVgcG2w5NyXUPB6mscWIX31wAL/+l3lTxyfXZ9q8R0ldR0tNrY4zk4jIcbHbiMgBTIv0Rdqj8xHu6wZBEPDCilgU1TbiRIkWV8QE4URJ9/semUwiZDJz6835uo6tBnQtRjS3GuHqIh+W+omIBhPDC5GDGDfK0/LY280F/71vDnQtBqSfq+3xNd8ePY/qBj1WzonC+domm3O1jS0I8XYbsnqJiIYKwwuRg5LJBHi5usDfQ9XjNY99fQwAcLxY02WAb42O4YWIHJPTjHlJTU1FTEwMEhMTpS6FaFhF+HUEkO6mVAPApsxSGE0iPJRyTAg0t+Ase3s3vjxUOCw1EhENJqfZ26hdf/ZGIHIWmcUaeKjk0OmNuP3jA/jtpePw3bESnCy1HQuzNC4YtbpW7DtbbTm26w8LEO7rhj9tyEJpXRP+ecdMuHQzm4mIaCj15/c3u42InEBcuLflccbTVwIAbp0Vgf1na+CulOOOjw8CAFImByHtZIXNaz/ZU4ApoWp8fsDcCpN5XoPpkb7DVDkRUf8xvBA5KR93JRbHBsNgNGF8oCfqGluwMDoIRwptB/juzKvEL1ZbDZwub0BzqxERvu6I8HO3uTbtZDnyKhrw20vH2iyAR0Q0nBheiJycQi7DhlVzYTSJ8HZzgaxT6Dhd0WDz/B/b8lBU04SJQZ7Y/Pv5Nufu+dS8hkxcmDfmjg/oVx16gxHpBbWYGeUHpYLdUkR08RheiEYAT1XHf+rW2wgkRPggo6jO5tqiGvOU6tzyBhRU6dDUasTbaXlo0Bss1+SV12NMgAc8XRU2q/9eyNo9BXjpx1OIDVPjv/fPwV83ncTJUvP7jA5wxwOXjR/ANySikYT/+0M0wlw3LRwAMHO0L1bOGW05njI5sMu1O3Ir8XZaHn7MKsOuvCrL8YMFNVjw6nZc/+5etBpNffrc48UaAEDWeS3+s78Qn+47h4MFNfjycBH+/lMOdFbhiIjoQtjyQjTCLJwciI2r5mJcoCc8VQrUNbbix6wyrFkyGb+0DeadHumDI4V12J5T0e3qvT9kmnelzqtowLdHinFzYmSvn6s3dIScDUfPdzl/okSLWWP8LvZrEdEIwvBCNMIIgoD4CB/L87vmjsFdc8cAAN66JQH6VhPiwr2x5K1d2JZT2ev7/Wd/YZ/CS42uo7sq87ymy/njxXUML0TUJwwvRGRxTUIYAEAURQR6qVBRbw4cAZ4qm7Ey1k6VadFiMPU6CLe2sfWC57sLNERE3eGYFyLqQhAEzJ84yvL8moTQHq9tNYrIq6jv8fyuvErsyK1ERaftCTrraXNJIqLOGF6IqFvXTQ+HUi7DwuhA/O7yCfjd5eMR5e+O/3f7DMs10yN9AADZbcHDZBLx6FfHcOUbO1CubUZmsQa3f3QQKz8+CF2L8YKf11u4+e5YyQU3oSSikcNpuo1SU1ORmpoKo/HC/0ASUd8kj/PHiecXWbYKWH3lJKy+chIA4MM7ZsLTVYHNJ8pxpLAOJ0q0WN5qxOtbcvHfI8UAgOe/z0byWP8+f5622YBWo8nyeSdKNDiUX4Pbk6NwslSL331xFACQ8+JiqBTywfyqRORgnCa8rFq1CqtWrbLsjUBEA9fTHkcpMUEAzGvGfLwHWLu3AGv3Fthcs+l4KZp6aW3prK6xFaO8zLtkL3t7NwAgUO1qM416d14VFk4O6tf7EpFzYbcREV20xVOCMSW0YwM1T5UCf702zjJraOupip5e2q3axhYAgLa5Y3BvQbXOZhXg74+XDqRkInICTtPyQkTDTyGX4a1bpuGNLbm4amoIrpwSDLlMQLm2GQfza/r9fjU6c3g5ZrXqr0wQkFPeMSCY416IiC0vRDQg4wM9kXrbdCyJC4FcZt43ac64vo91sVaja4GmqRVHztVZjlU36JFb1hFeSuqaYOjjqr5E5JwYXoho0CVE+iDE2xUAMDbAA+t+MxtuLnK8sCLWco3SajyN2tXcCPzWL3mIf24z3vgl13LuXHUjSjQdM5EMJhGlmgvPTCIi58ZuIyIadCqFHFsfvQzp52oRFeCOcF93ZD23CHKZgKc2ZAEA/DyUKGubHh0V4IHjxRqb7qF2x4rrAAC+7i7wdVfibJUORTWNiPBzH7bvQ0T2hS0vRDQk3JRyXDIhAOG+5pDR3qXUztdDaXkc2SmIrEgIxZ+WTgYAlGvNK/uG+rhZAktRbeOQ1U1E9o8tL0Q0rBQyAQaTiGVxwThZal7cbkyAh+X86zfF47rp4TaDdgFzeAlWm7uiCmsYXohGMoYXIhpWm39/KfacrsItsyIxLdIXrUYTMos79jVqX8PFz6plBgDCfNwQ5uMGwDwOhohGLnYbEdGwGjvKE7cnR8FFLsPc8QG4bFIgFseap1gvjQuGt5sLAMDf0za8hPq4YkKQJwAgq20TR53egJyynvdVKqppROq209A0XXhTSCJyLGx5ISLJTQjywqE/pcBT1fFPkrtSAXelHI1tq/SG+rhhWqQvBAEoqG7EztxKrPnvcZRomvHlb2YjqZutCFZ+fBBnq3Q4X9eEv14bN2zfh4iGFlteiMgu+HkooVTY/pM0PtDT8jjUxw3ebi6YFOQFALjj44OWKdSdV/LVNLbCaBJxtkoHANh8onwoSyeiYcbwQkR265nlMZbH7TOSZoz27XLd/vwanCrTIre8HpnFGkx/cQse/PyI5bxKwX/qiJwJu42IyG7NGO2HT++ehaYWIwI8zRs2Xjc9HJ8dKAQATAzyRG55A44V1WHxm7vgqVIgZXIgjCYRP2aVWd6nwWpjRyJyfPzfESKya/MnjsLi2GDL8xmjffHJnYmYM84fr9+UgLGjOqZZN+gN2JBR0uU9NE2t2JJdjm/Si2EyicNSNxENHUEURaf4Lzk1NRWpqakwGo3Izc2FRqOBWq3u/YVE5NAyizV4+MujOFupszkepFZZFriztiQ2GO/eNh2CIHQ51xdnKxtwplKHK2KCLur1RNQ9rVYLb2/vPv3+dprw0q4/X56InIMoilh/9DxWf3UMgLl15rNfJ+Fgfg3e2Xa6yw7XOx9fgEh/d4iiiNMVDRg7yrPLCsA9iXv2Z9Q3G/DJnYlYEB046N+FaKTqz+9vdhsRkcMTBAGXTQqEl6sCYT5uePPmBLi6yHHpxFG4YnLXFpL2PZS+OlyEK97Yife2n+7zZ9U3m8fPfHv0PHR6AxpbDCiqacT/fXgA23Mqenk1EQ0Ghhcicgp+Hkrs+sMC/LJ6vs2mjd117+SUmbcl+ON/MwEAr27O7XKNtbOVDXjoi6M4XdGxIN7x4jrM+/s2XPfuXrzwfTZ2n67CnZ8c6vLao4W1OFmqhckkYmduJTSNXDCPaKA424iInIaPu7LLsagAD4T7uqG4tgkpk4Pwy8lynCqrR2OL7Qykqga9ZUZTZytS90DbbMCRc7WWY+1bFNToWnCqh1V+i2sbce27ewEA/+/2Gfjtv9Nxw4xwvHpj/EV9PyIyY3ghIqf3zX1zUFjTCJ3egF9OliOnrB77z1bbXLPvTDWWx4d2ea3JJELb1lV0vq6p189qNZrgIjc3am/LqbQcb9+/iZtKEg0cu42IyOkFe7ti1hg/TA4xDwI8U9mA9Udtp1R3HtTbrn18TF+VWAWcjMI6y+MzlQ0AOsbMENHFY3ghohEj2NsVU0LVMInA/46Zw8vVba0tR4tqu33NvjPV3R7vSYHVjtfWrTvt4UXLTSKJBozhhYhGlKumdnQNKWQCHrx8PADgZGnXcTAAkNm2g3VfZZ3X4FhRHRpbDDbdTAVV5lCjbWZ4IRoohhciGlFWTAu17F49b0IAJgZ5IVjtCqNJ7DIOBug+vLjIe14T5pWfc3BN6h78c+dZm+MtRhMA8yrAXOWXaGAYXohoRAnxdsOeNZfj6/uS8eYt0wAAl0wIAACs+uwosku0WHewEBva1nFp7+6x3uE6Ptyn189585e8bo+LItDQTQsPEfUdZxsR0Yjj7eaCxCg/y/M/L5uMc9U6HCqoxYrUPZZWEh93F4iieauBpbHBeHureTG72WP9cfhc92Nk+qK+2QC1q8vAvgTRCMaWFyIa8XzclXj1xni4yAVLcAGAurYF5ZLG+OORlIn4aOVMvHxdHG6bHWm5JsCz69oyveGgXaKBYcsLERGA0f4eePuWacgorsM9l4zBydJ6PPj5EUwJVeOZ5TGQyQQsbNtqQBRFJI/1h0kUIQhAVUP306x7wunSRAPD8EJE1GZJXAiWxIUAAAK9XHHkqSssC85ZEwQBX/xmNkRR7HZLgN6w5YVoYNhtRETUg+6CizVBEHrdjTrMx63LsQtNl25uNeKLg4Wo0bX0rUiiEYjhhYhoAGTChcNLsLdrl2OrvzqGb48Ud3v9f48U44lvMzH/79sgipxSTdQdhhciogGwbpx5cmk0AOD9/5uBpDF+8HZzwby2adgA4OYitzxe/dWxbteVad+moF5vwM68qiGqmsixccwLEdEAKGQd6eXeeWNx44wI+HoocdmkUTCJIn7ILLOcb7WayQQAO3MrMXusP0wmEc9/n42xozxsuqHSTpZj/sRRQ/8liBwMW16IiAZgari35bEgCPD1ME+ddnWRw12pgKeqo7Xl6k67Vp8s1aKkrgk78iqxdm8Bnt54AmWaZsv5krpmEFFXbHkhIhqAu+aOQYvBhMsmBXZ73lPVsRjdE0snY9poXwR4KHH/Z0ewLacSc17eanO99e7WpZomvPlLLnbmVuKjlYmWYEQ00jG8EBENgFIhw0MLJ/R43qOt5cVLpcAoLxVunz0alfX6Hq83WO17dKJEixMlWgDAh7vP4v7Lxlv2ZSIaydhtREQ0hCaHqBEf7o2bEyMsxy5mVd7UbWew8LXt3JWaCE4UXlJTUxETE4PExESpSyEisnB1kWPjg5fgz1fFWI4JgoDFU4IBALdYhRpr3e1cXa7V47P9hUNTKJEDEUQnW0hAq9XC29sbGo0GarVa6nKIiLqlaWpFcW0jovw9cNmr2226klzkAlqNHf80P3DZOLy7/QwAINBLhf1PLISsm8XxNE2taDWaEOCpGvovQDTI+vP722laXoiIHIm3mwumhHrDQ6XATw/Pw9GnrrCcsw4uAPCHxdHIfXEJ3JVyVNTrkVNe3+X9RFHEte/uwby/bYOmkV1L5NwYXoiIJObvqYKvhxK3zx4NABgb4IGHLh8PAHhxRSwA88DgxCg/AMDeM10Xt6vWteBspQ5NrUbsO8vF7ci5cdg6EZGdeHp5DEb7u+PSiaMw2t8dV00NxaRgL8v5OeP8sSO3ErvyKnHPJWNsXltU02h5fLSoDotjzRtMGowmnCjRYlKwF1ytVvglcmRseSEishMuchl+PW8sJgZ5QaWQ2wQXAJg/ybza7vacSnx5yHbgblFtk+XxIau1Yj7YlY9rUvfg8le3o7i2Ec6qqcWI7BIt94MaIRheiIgcRHSwGr9rW1Pmtc25MFqtCWPd8pJ5XmPZimB7TgUAoETTjP848Uyl//voAJa+vQtbssulLoWGAcMLEZEDeXDBePi4u6CiXo/bPtyPCq15CwHrVpVWo4iSuiaYTKJlkTsA2HfGecfCpJ+rBQCsO1QkcSU0HBheiIgciFIhw7I483iW/WdrcE3qHhwqqMGpMtsZSOeqG3G2SocGvcFyLPO8Bpom556JJBO6TiEn58PwQkTkYO6bPw4TAj0BAKWaZtz4/j4cLawDYN6GAADO1TTieLH52MzRvhgb4AGTCOw/23WmkjOR87faiMA/ZiIiBxPh544tq+fj7zdMhbebC1xdzP+UJ0b54uoE887VhdU6/JBZCgCYGeWHSyeaB/tuPWkeAyOKIg4X1GD/2WrL+BgA+OfOM7jhvb04X9cER8SWl5GBU6WJiBzUTTMjcNPMCLQaTdDpDfBxV+LTvQUAgF15VchtW8zuhhnhKNU0Ye3eAvyQWYonlkbjoS+OYleeeQzMVVND8M6vpsNoEvHXH04BAG7/6AB++f38blfy7atDBTXIKKzDPZeMuej32ZlbiY925+Ol6+IQ6uPW7TXNrUbL44HUO5KIogjBgYMeW16IiByci1wGH3fzZo+Rfu4AgFNl9TCJQNIYP4wP9ETSGH94qhSo1xuQ8PwWS3ABgB+zylBZr0fWeY3l2NlKHbJLtRiIG9/fh7/8cBJbT1Vc9Hvc8fFB7MitxGNfH+vxmqHarPJctQ6ZxZreL3Qw720/g5kv/oKzlQ1Sl3LRGF6IiJzIlDA1VArzP+2TQ9R49cZ4AOaBvi+smAIvV3ODu4+7C75/6BLER/jAaBKxMeN8l5V78yq6bkNgMplnMvXGemBw0SCsL3O4oLbHc9qmjkHJTS3GHq9rl1+lw75uVinubP4r27H8nd19+r591dRixONfH8PGjPOD9p799befTqFa14K30vIkq2Gg2G1EROREAr1csePxBahrasGEQC/IrbpRrp0WjiWxISio1iHSzx3uSgVumBGOY0V1+PJQkc21AJBXbvt/5i0GE+7912HsyK3Ev+6eZRlH051TVq02Ta29B4retFiNy+nMuuWlodnQ43Xt7vn0EM5W6vDtA3MwPdK322usxwHlVTT02GXVX2v3FuDr9GJ8nV6MZXEhUEg4wlghc9z2C8etnIiIuhXs7YroYHWXMAIAri5yRAer4a40/7/r1VNDoVTIkFfRgFNl9fBxd8HDbQvhvbv9DJa+tQurPjuCbTkV+OfOM9iRWwnA3NV0IdZdTuWa5j7VXVClw7lqXY/nrRfls1ZvFVi0za0XbH2padsDCgA+u8CifVqrliNTH1ftPV5ch3Lthb/rjtyOLrTD53puTRoq1isQe6ocd7sIhhciohHM290FV8YEWZ7/aelkzBrjZ3meXarFpsxS/Hl9Fvac7uhqOVrY9RevTm/AP3eeQammCZlW42dK+xBeanUtWP6P3Zj/yna8tjnHclyp6Pg11VOwsQ4ap8rqMfdvW3scB3PSKlRtyizpcd2bOqvj2j6sjZNTVo+r39mDha/t6PGaWl0LDlpt3fBTLwFwKFh3sXmoHLfzheGFiGiE+9Oyybh99mj86+5ZuHFmBMa3rSFj7XxdE/ZZrRGTU14PTaPtL/WnNmThrz+cwpyXt2JjRonleG+tEQBwIL8G9W0L6q3dUwAA0BuMaDF0dN+cruh+gGnnoFKja+lxTIt1eGluNeG7Hsae1Fl9t1pdS6/178ozt0g16A097q9UUK2DdePRf/af6zYEDqXKho4/ix4ashwCwwsR0QgX4u2GF1bEWsawBHqpcEVMEGZF+eHUC4sxe2xHS4yLXECYjxtEEdhrtd1AYXUjvj1qDgKiaO7iGW+1kF5vrFsk6vUGaBpbu7SKlNfru32tdWtCu1pdC658Ywee2pBlczy7bbuEUG9XAOYxKNUNXd9X09QRWGo7hTSD0YRjRXUwWf32t56uXdND2Gk/HhfmjWVxITCYRLy7/Uy3116sqgY99pyu6jFAVVjdw+ZBGIskFYYXIiKyIQgCPrhjJr66LxmuLnLMm9AxMDfE2w1XTTVvT7D+aEerxZu/5Nq8h0Im4JM7EwEAlQ16ZBTVoaCq5/EshwpqbJ4X1TZ26a6p7KEFp7suonWHipBb3oB/7z+HeqvzeW2tN49cMRFqVwXOVOpw96eHu7zeuuWlrtE2jDz+zXFck7oH/zve0bp0vq6jtp7CWnVbePHzUOK++eMAAPvO2C4SOFBXvb0bt314AGknu5+eXmkVXvoyM8teMbwQEdEF3Tor0jL9eu54f1w3PRwAsPVUBSq0zdh2qgLr27pf/nZ9HFImB2LDqrkI83GDQiZAFIEVqXtw2avbuw0aza1GywDfQC8VAKC4tqlLy0tFNy0vJpPY7ZiUvPKOad7WrToV9eZgER3sha/uS4ZCJuBYUV2XNU9suo06dSG1h7bPDnQM+LXe1bush/BSaxVepoSq4evugga9ARlFdd1efzHK2gJeWg9r61iHl0a2vBARkbPy81Bi1x8W4PFFk/DQ5RMwKdgL0yN9YDCJSH55K+7912GIInDd9DDcnBiJD1cmIjbMGzKZgKgAD5v3SnzxF8v+SgajCZqmVuSW18NoEuHnoURi22DhvPJ6rN17zua17b94RVHEpuOl+OpwEaY887NNiGins2pVaB9obDKJqG4wB4gATxWig9WYPdYfALq0VFgP2K21ann51qq1yV3ZMVvnXE1Hq1Kppvt1YWqswotMJuCSthatbw4XD0rri/V79DSTiC0vREQ0YgSqXbFqwXjLeidPL58CQTCPbTGYRFyTEIq/XT+1y+tiQtQ2z/UGE275535c++4ezH4pDdNf2IJ/7zOHlOhgL0T4mlcIfm1LLv53rMTmte0tL9tyKrDq8yP4wzfH+7SGTHtY0jS1wtA2TsXf07wi8cLJgQCAtFPlNq+x7iqyboU5YTWLqrCttaXVaEJJP7uNAOBXsyIBAF8eLsKEP/2IMwNc8da6xUfewxou1q1XJ0o0fVqszx4xvBARUb8lRPjglRvicdXUEPx52WS8cVMCXLpZcC0mtCO8BKlVlsdHC+tQ1dACo0nE1+nFAIDoYDXCfbsuBtd+rL3LZ/OJ8i7X/HnZ5B5rzS2vR1FNIyrbBuaqXRVQKcwtE+2DlI8W1kFv6AhCtt1GHUEm32q6dnFNE4wmEQVVOps1aNpDRPq5Gjz+9TFLEGpvefFvCy/J4/xxR/Joy+s6r3DcX9YrGVsPOLZm3SpUqmnGrR/sR343Y5F25VXigc/SbVpq7InjTvImIiJJ3TAjHDfMCL/gNdYtL6/cEI/Kej0e/foYpoSqkRjlh7VtG0kCwOQQry7dTIB59hIAlGv1WHewEFWdZgf9edlk3HPJGGSe19hM0W5nMImY9/dtlvVsArw6QtTYAA/4eyhRrWtB1nkNZow2d1tZdxu1B5lTZVqcKOmYat1iNKFM22yzpg0AFLdtJ3D9e/ss1711y7QuLS8A8OzyKajQ6vHTiTKcr+15GwKTSURjqxGeF1ibpdjq9XWN3a9N012r0OmKBozpdN9v/+ggAMDHXYm/XhvX42dKhS0vREQ0ZKZYtbxEB3vh+hnh2PL7S7Fx1Vw8sTQaHlbjRmLDvDFztC8+vGMmdv1hgeW4j7uL5fGabzPxS6fxKdNH+0IQBLxxUwKOPHWFzbmp4d6Wx5uzzS02AZ4d4UUQBMyMMm8RcMhq/ySNVWtLg96AbTkVWPzmLsu6M+2tSOeqdZbwMm9CAADgyLlanLfaD6l9Y8oanTl0tXdZAeZdsGeMNn/++bomfLInHx/uOovO/vLDScQ9+zOOF9d1OdfOOry0txbpDR17KYmi2G14udBG3H1dHXm4MbwQEdGQ8fdU4a/XxuHFFbEIVJvXVpkQ5AWFXAaVQo6HFk5AdLAXnr9mCqKDvSAIAlJighDh545P7krE+EBPPH/NlAt+RnjbOByZTICfhxLPLo+BIAARfm6IDvbqcv0oq/ACAIlR5taWQ1azkqo7rdXy7HcnbJ7Hh/sAAD7dW2DZjXtFQhhiw9QwmEQ8/7+O6+ubDSipa0JN22BhX3elzXuFtXWLnSzV4rn/ZePFTSdtZj9pmlrxn/3nIIq44BgV6xWI21tePttfiK/Ti/HwugxU61psFv1r13nckPW6N95uLp0vtwvsNiIioiH1q6TIHs/dN3+cZc2TzhZMCsSCSYGW697f0f2CbgGdwsidc8fg8ugguCpl0OmNOF6swamyeqvrbcNDe3g5fK4WJpMIER2rAgd6qVBRr8e5atudsX+3cAK25VTgZ6vxN3Hh3liREIas81qb44B56nL7DCh/D9t62wdBW68gvC2nEmNHmRf5+9+xEujbQkdxD11LVQ16/JLd8ZntLS/WXVo97Y79/bFShPu6IyHCB0DHWjiAudXJHrHlhYiI7N6aJdH4+M6Z3Z6TddPvEenvjkAvV4wJ8MBPj1xqWVgPMLcGWZsSqoa7Ug5NUyvyKhpQ1aBHq1GEXCZgzjj/Lu/9+KJJiA3zxt2XjLEci/J3x7hRnlgcG2xzbVhbMPn3vgIA5pYMtZui22usbbNap+Wrw0WWx+c7BZDqBj1u/+gAZr74C3QtRst6PLWNrRBF0TLIGYBlvE6gl+33/+lEGVak7rGsGGy9Rk7n8UX2guGFiIgcwvRIX8vjPy6OBoBuZyd154HLxlsedw4LCrnM8t4HC2osrRvBaldMtOp2uiImCJnPXokHLjO3FP1m3li4usgs9chlAsLbpnq3+1PbLKjccnNrxuyxfhAE27AV4Km02YASAA7kV6NBb8DJUi2OF3e0nnQe1PvGL7nYldexTcOTS82f12IwoanViFOlHUHkSNsu1mNHdR0UDXQscGfd8lJpp+GF3UZEROQQfNyV+O/9cyCXCZga5o3R/u42geZCYkLV+PmRS7H1VAWWxoV0OZ8Y5Yfdp6ts9kIK83HDuFEdm1ReHR8KL9eOMSD+niqsvWsWztc22bS4/GHxJPz9pxzcPDMCc8cHQBA6ZkzNHR/Q5bMFQUC4rxvOVnaMWWk1itidV4XsEnNwmRTkhZzyehTXNkIURQiCgKoGPb46bJ5mnvqr6Zg91g9+Hkq88H02DCYRJ0vrbcbutE9JnxDohf1nbbdjAID8Kh1Cfdxspk5X1fe+KaUU2PJCREQOY8ZoXyRE+EAmE7A0LgTBbRss9sWkYC/cf9k4uCm7rj57/YywLsdCfVwxObhjtlTK5KAu18we64/rZ4TbtKb8Zt5YfHjHTDx3zRR4u7lgYXTH6+aM6xpeAOASq1DTPrtq26kKS1dPe326FqNl24R9Z6rRYjAhOtgLS+OC4e+pgiAI8GkbEHz7Rwe6fI6XSoGVc6K6raE9tFiHl6ZWI3R2OO6F4YWIiEa8cF933NhpzZpQHzdE+rvjkzsTsXHV3G5DT3cUchlSYoLg6mK+/p1fTcNfr43DGzfHW3ba7mzRlI6Wm/Y6tuVU4GTbnk8JEb6WgclFNeauo/aNLmPDvG3C06VtU7Ybu1n+//dXTOyxhvwqHZpbjV3G1ZjHAJlQXNuIxhYDanUtPQ7+HS52G14aGxsxevRoPPbYY1KXQkREI8CzV0/By9d1LMjWvmjuguhAxLfNxLkYri5y/CopEtdO63lBv1ltezoBwO2zo+CulKOiXo+StnVWokO8LNO+//rDSVRomy2r/XZeYO61m+IR2kOLlPXA5c4KqnQoqmmEKAKeKgUi/MxjgwprGpHy+g5c8rdtiHn6Z0x7YQte/vFUH7750LHb8PKXv/wFs2fPlroMIiIaITxUCtwyKxJ3zomCi1zodfXgweQil2H7Y5dh46q5iPR3txkbE+bjBrWrCx5fNAkyAdh3thoLX9+BjMI6AECUv214EQTBJgy1L9QX4KmyrLXTnbyKBnxx0DyzKSrAHWMDzC00t390sMtU8c47fg83uxywm5eXh1OnTmH58uXIysrq/QVERESD5KmrYvDk0sldZgANNeutERZGB2JL27ot7ftDxUf44K1bpuGhL46ivtmA+mbzWJTOLS8ALGvEAMDK5Ch4u7n02npUWNOIj/fkm2vx98BvLx2H3aerLPs2Pb5oEm6YEQ4PleKC2xQMh37/yezcuRPLly9HaGgoBEHAhg0bulyTmpqKqKgouLq6IikpCQcPHuzXZzz22GN46aWX+lsaERHRgMllwrAHl85WTAvDb+ePxa2zIvH4okmW48vjQ/FCpxWHowLcO7/cZjp0uK8bUmKCMMpqfZevfpvcZYyPzecnhCEu3BsvroiFSiGD2lWBG2eGI0jtKnlwAS6i5UWn0yE+Ph533303rrvuui7nv/zyS6xevRrvv/8+kpKS8Oabb2LRokXIyclBYKB5pcSEhAQYDF1HL2/evBmHDh3CxIkTMXHiROzdu/civhIREZFjc3WR44kl3e+UfXVCGN5Ky0NVQwvGBnjAXdn1V7l1a0xYN2vhzBrjh7GjPCzTp+eM87fsap3+5xTLQn63zorElTFBaDWKCPTq+8yuodbv8LJkyRIsWbKkx/Ovv/467r33Xtx1110AgPfffx+bNm3Cxx9/jDVr1gAAMjIyenz9/v37sW7dOnz99ddoaGhAa2sr1Go1nn766W6v1+v10Os7FtHRarXdXkdEROQMvN1c8Mvq+diRW2mza7e1caM8IQiASiFDcA/jXNRWa9Y8vmgS7vzkEK6fHt5lBeLOz+2BIIrtS+dcxIsFAevXr8eKFSsAAC0tLXB3d8c333xjOQYAK1euRF1dHTZu3Niv91+7di2ysrLw6quv9njNs88+i+eee67LcY1GA7W6+z9UIiIiZ1dR3wyZIHTZ+8najtxKGIwmLOxmDZvhptVq4e3t3aff34PaqVdVVQWj0YigINubEBQUhLKyssH8KIsnnngCGo3G8lNUVNT7i4iIiJxcoJfrBYMLAMyfOMougkt/ST/q5gLuvPPOXq9RqVRQqeyvSYuIiIiGxqC2vAQEBEAul6O83HYr8PLycgQHB/fwKiIiIqK+G9TwolQqMWPGDKSlpVmOmUwmpKWlITk5eTA/ioiIiEaofncbNTQ04PTp05bn+fn5yMjIgJ+fHyIjI7F69WqsXLkSM2fOxKxZs/Dmm29Cp9NZZh8RERERDUS/w8vhw4exYMECy/PVq1cDMM8oWrt2LW6++WZUVlbi6aefRllZGRISEvDTTz91GcQ72FJTU5GamgqjsetGVEREROQ8BjRV2h71Z6oVERER2QfJpkoTERERDTWGFyIiInIoDC9ERETkUBheiIiIyKEwvBAREZFDcZrwkpqaipiYGCQmJkpdChEREQ0hTpUmIiIiyfXn97ddb8x4MdqzmFarlbgSIiIi6qv239t9aVNxuvBSX18PAIiIiJC4EiIiIuqv+vp6eHt7X/Aap+s2MplMKCkpgZeXFwRBGNT31mq1iIiIQFFREbukhhDv8/DgfR4+vNfDg/d5+AzFvRZFEfX19QgNDYVMduEhuU7X8iKTyRAeHj6kn6FWq/kfxjDgfR4evM/Dh/d6ePA+D5/Bvte9tbi0c5rZRkRERDQyMLwQERGRQ2F46QeVSoVnnnkGKpVK6lKcGu/z8OB9Hj6818OD93n4SH2vnW7ALhERETk3trwQERGRQ2F4ISIiIofC8EJEREQOheGFiIiIHArDSx+lpqYiKioKrq6uSEpKwsGDB6UuyeHs3LkTy5cvR2hoKARBwIYNG2zOi6KIp59+GiEhIXBzc0NKSgry8vJsrqmpqcFtt90GtVoNHx8f3HPPPWhoaBjGb2HfXnrpJSQmJsLLywuBgYFYsWIFcnJybK5pbm7GqlWr4O/vD09PT1x//fUoLy+3uaawsBDLli2Du7s7AgMD8fjjj8NgMAznV7F77733HqZOnWpZpCs5ORk//vij5Tzv89B4+eWXIQgCHnnkEcsx3uvB8eyzz0IQBJuf6Ohoy3m7us8i9WrdunWiUqkUP/74Y/HEiRPivffeK/r4+Ijl5eVSl+ZQfvjhB/FPf/qT+O2334oAxPXr19ucf/nll0Vvb29xw4YN4rFjx8Srr75aHDNmjNjU1GS5ZvHixWJ8fLy4f/9+cdeuXeL48ePFW2+9dZi/if1atGiR+Mknn4hZWVliRkaGuHTpUjEyMlJsaGiwXHPfffeJERERYlpamnj48GFx9uzZ4pw5cyznDQaDGBsbK6akpIhHjx4Vf/jhBzEgIEB84oknpPhKduu7774TN23aJObm5oo5OTnik08+Kbq4uIhZWVmiKPI+D4WDBw+KUVFR4tSpU8WHH37Ycpz3enA888wz4pQpU8TS0lLLT2VlpeW8Pd1nhpc+mDVrlrhq1SrLc6PRKIaGhoovvfSShFU5ts7hxWQyicHBweIrr7xiOVZXVyeqVCrxiy++EEVRFLOzs0UA4qFDhyzX/Pjjj6IgCOL58+eHrXZHUlFRIQIQd+zYIYqi+Z66uLiIX3/9teWakydPigDEffv2iaJoDpkymUwsKyuzXPPee++JarVa1Ov1w/sFHIyvr6/44Ycf8j4Pgfr6enHChAnili1bxPnz51vCC+/14HnmmWfE+Pj4bs/Z231mt1EvWlpakJ6ejpSUFMsxmUyGlJQU7Nu3T8LKnEt+fj7Kysps7rO3tzeSkpIs93nfvn3w8fHBzJkzLdekpKRAJpPhwIEDw16zI9BoNAAAPz8/AEB6ejpaW1tt7nN0dDQiIyNt7nNcXByCgoIs1yxatAharRYnTpwYxuodh9FoxLp166DT6ZCcnMz7PARWrVqFZcuW2dxTgH+nB1teXh5CQ0MxduxY3HbbbSgsLARgf/fZ6TZmHGxVVVUwGo02fxgAEBQUhFOnTklUlfMpKysDgG7vc/u5srIyBAYG2pxXKBTw8/OzXEMdTCYTHnnkEcydOxexsbEAzPdQqVTCx8fH5trO97m7P4f2c9QhMzMTycnJaG5uhqenJ9avX4+YmBhkZGTwPg+idevW4ciRIzh06FCXc/w7PXiSkpKwdu1aTJo0CaWlpXjuuecwb948ZGVl2d19ZnghclKrVq1CVlYWdu/eLXUpTmvSpEnIyMiARqPBN998g5UrV2LHjh1Sl+VUioqK8PDDD2PLli1wdXWVuhyntmTJEsvjqVOnIikpCaNHj8ZXX30FNzc3CSvrit1GvQgICIBcLu8yorq8vBzBwcESVeV82u/lhe5zcHAwKioqbM4bDAbU1NTwz6KTBx98EN9//z22bduG8PBwy/Hg4GC0tLSgrq7O5vrO97m7P4f2c9RBqVRi/PjxmDFjBl566SXEx8fjrbfe4n0eROnp6aioqMD06dOhUCigUCiwY8cOvP3221AoFAgKCuK9HiI+Pj6YOHEiTp8+bXd/pxleeqFUKjFjxgykpaVZjplMJqSlpSE5OVnCypzLmDFjEBwcbHOftVotDhw4YLnPycnJqKurQ3p6uuWarVu3wmQyISkpadhrtkeiKOLBBx/E+vXrsXXrVowZM8bm/IwZM+Di4mJzn3NyclBYWGhznzMzM22C4pYtW6BWqxETEzM8X8RBmUwm6PV63udBtHDhQmRmZiIjI8PyM3PmTNx2222Wx7zXQ6OhoQFnzpxBSEiI/f2dHtThv05q3bp1okqlEteuXStmZ2eLv/nNb0QfHx+bEdXUu/r6evHo0aPi0aNHRQDi66+/Lh49elQ8d+6cKIrmqdI+Pj7ixo0bxePHj4vXXHNNt1Olp02bJh44cEDcvXu3OGHCBE6VtnL//feL3t7e4vbt222mOzY2Nlquue+++8TIyEhx69at4uHDh8Xk5GQxOTnZcr59uuOVV14pZmRkiD/99JM4atQoTivtZM2aNeKOHTvE/Px88fjx4+KaNWtEQRDEzZs3i6LI+zyUrGcbiSLv9WB59NFHxe3bt4v5+fninj17xJSUFDEgIECsqKgQRdG+7jPDSx/94x//ECMjI0WlUinOmjVL3L9/v9QlOZxt27aJALr8rFy5UhRF83Tpp556SgwKChJVKpW4cOFCMScnx+Y9qqurxVtvvVX09PQU1Wq1eNddd4n19fUSfBv71N39BSB+8sknlmuamprEBx54QPT19RXd3d3Fa6+9ViwtLbV5n4KCAnHJkiWim5ubGBAQID766KNia2vrMH8b+3b33XeLo0ePFpVKpThq1Chx4cKFluAiirzPQ6lzeOG9Hhw333yzGBISIiqVSjEsLEy8+eabxdOnT1vO29N9FkRRFAe3LYeIiIho6HDMCxERETkUhhciIiJyKAwvRERE5FAYXoiIiMihMLwQERGRQ2F4ISIiIofC8EJEREQOheGFiIiIHArDCxERETkUhhciIiJyKAwvRERE5FAYXoiIiMih/H/udGuMuqkIgQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(test_mse)\n", "plt.yscale(\"log\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3.9.7 ('base')", "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.7" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "f7d1fba74dfd24f4e28e69f7ae18d3d17d4ecc25efd86b65572743c77fabf4a5" } } }, "nbformat": 4, "nbformat_minor": 2 }