{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Structured Kernel Interpollation (SKI/KISS-QEP)\n", "\n", "## Overview\n", "\n", "SKI (or KISS-QEP) is a great way to scale a QEP up to very large datasets (100,000+ data points).\n", "Kernel interpolation for scalable structured Gaussian processes (KISS-GP) was introduced in this paper:\n", "http://proceedings.mlr.press/v37/wilson15.pdf\n", "\n", "SKI is asymptotically very fast (nearly linear), very precise (error decays cubically), and easy to use in QPyTorch!\n", "As you will see in this tutorial, it's really easy to apply SKI to an existing model. All you have to do is wrap your kernel module with a `GridInterpolationKernel`." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import math\n", "import torch\n", "import qpytorch\n", "from matplotlib import pyplot as plt\n", "\n", "# Make plots inline\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## KISS-QEP for 1D Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set up training data\n", "\n", "We'll learn a simple sinusoid, but with lots of training data points. At 1000 points, this is where scalable methods start to become useful." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "train_x = torch.linspace(0, 1, 2000)\n", "train_y = torch.sin(train_x * (4 * math.pi) + torch.randn(train_x.size()) * 0.2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set up the model\n", "\n", "The model should be somewhat similar to the `ExactQEP` model in the [simple regression example](../01_Exact_QEPs/Simple_QEP_Regression.ipynb).\n", "\n", "The only difference: we're wrapping our kernel module in a `GridInterpolationKernel`. This signals to QPyTorch that you want to approximate this kernel matrix with SKI.\n", "\n", "SKI has only one hyperparameter that you need to worry about: the grid size. For 1D functions, a good starting place is to use as many grid points as training points. (Don't worry - the grid points are really cheap to use!). You can use the `qpytorch.utils.grid.choose_grid_size` helper to get a good starting point.\n", "\n", "If you want, you can also explicitly determine the grid bounds of the SKI approximation using the `grid_bounds` argument. However, it's easier if you don't use this argument - then QPyTorch automatically chooses the best bounds for you." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "POWER = 1.0\n", "class QEPRegressionModel(qpytorch.models.ExactQEP):\n", " def __init__(self, train_x, train_y, likelihood):\n", " super(QEPRegressionModel, self).__init__(train_x, train_y, likelihood)\n", " self.power = torch.tensor(POWER)\n", " \n", " # SKI requires a grid size hyperparameter. This util can help with that. Here we are using a grid that has the same number of points as the training data (a ratio of 1.0). Performance can be sensitive to this parameter, so you may want to adjust it for your own problem on a validation set.\n", " grid_size = qpytorch.utils.grid.choose_grid_size(train_x,1.0)\n", " \n", " self.mean_module = qpytorch.means.ConstantMean()\n", " self.covar_module = qpytorch.kernels.ScaleKernel(\n", " qpytorch.kernels.GridInterpolationKernel(\n", " qpytorch.kernels.RBFKernel(), grid_size=grid_size, num_dims=1\n", " )\n", " )\n", "\n", " def forward(self, x):\n", " mean_x = self.mean_module(x)\n", " covar_x = self.covar_module(x)\n", " return qpytorch.distributions.MultivariateQExponential(mean_x, covar_x, power=self.power)\n", "\n", " \n", "likelihood = qpytorch.likelihoods.QExponentialLikelihood(power=torch.tensor(POWER))\n", "model = QEPRegressionModel(train_x, train_y, likelihood)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Train the model hyperparameters\n", "\n", "Even with 1000 points, this model still trains fast! SKI scales (essentially) linearly with data - whereas standard QEP inference scales quadratically (in QPyTorch.)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/shiweilan/miniconda/envs/qpytorch/lib/python3.10/site-packages/linear_operator/utils/sparse.py:51: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly. To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()\n", " if nonzero_indices.storage():\n", "/Users/shiweilan/miniconda/envs/qpytorch/lib/python3.10/site-packages/linear_operator/utils/sparse.py:66: UserWarning: torch.sparse.SparseTensor(indices, values, shape, *, device=) is deprecated. Please use torch.sparse_coo_tensor(indices, values, shape, dtype=, device=). (Triggered internally at /Users/runner/work/pytorch/pytorch/pytorch/torch/csrc/utils/tensor_new.cpp:620.)\n", " res = cls(index_tensor, value_tensor, interp_size)\n" ] } ], "source": [ "# this is for running the notebook in our testing framework\n", "import os\n", "smoke_test = ('CI' in os.environ)\n", "training_iterations = 2 if smoke_test else 30\n", "\n", "\n", "# Find optimal model hyperparameters\n", "model.train()\n", "likelihood.train()\n", "\n", "# Use the adam optimizer\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.1) # Includes QExponentialLikelihood parameters\n", "\n", "# \"Loss\" for QEPs - the marginal log likelihood\n", "mll = qpytorch.mlls.ExactMarginalLogLikelihood(likelihood, model)\n", "\n", "for i in range(training_iterations):\n", " optimizer.zero_grad()\n", " output = model(train_x)\n", " loss = -mll(output, train_y)\n", " loss.backward()\n", " optimizer.step()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Make predictions\n", "\n", "SKI is especially well-suited for predictions. It can comnpute predictive means in constant time, and with LOVE enabled (see [this notebook](./Simple_QEP_Regression_With_LOVE_Fast_Variances_and_Sampling.ipynb)), predictive variances are also constant time." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWgAAAEYCAYAAABxx2wUAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWV9JREFUeJztnXd4VMX6xz+bTe+FNCChd0EggAYLqCBy+SF2VES4ougVUcFrv4qKCooFBdRrAymKgqBcQKRIEaQlgIKEEiAhdEJIIz37/v44myWBJHtOkk2WMJ/nmSfZPTNnZs7O+Z4578y8YxIRQaFQKBROh0tdF0ChUCgU5aMEWqFQKJwUJdAKhULhpCiBVigUCidFCbRCoVA4KUqgFQqFwklRAq1QKBROihJohUKhcFKUQCsUCoWTogRaoVAonBSHCvSnn35Kp06d8Pf3x9/fn9jYWH755RdHZqlQKBT1BpMjfXH873//w2w206pVK0SEb775hkmTJrF9+3Y6dOjgqGwVCoWiXuBQgS6P4OBgJk2axIgRI2ozW4VCobjkcK2tjIqLi5k3bx7nzp0jNja23Dj5+fnk5+fbPlssFtLS0ggJCcFkMtVWURUKhcJhiAhZWVk0bNgQFxc7VmZxMH/99Zf4+PiI2WyWgIAAWbJkSYVxx40bJ4AKKqigQr0PKSkpdvXT4SaOgoICDh8+TEZGBvPnz+fLL79k7dq1tG/f/qK4F/agMzIyiI6OJiUlBX9/f0cWU6FQKGqFzMxMoqKiSE9PJyAgoNK4tW6D7tOnDy1atOC///2v3biZmZkEBASQkZGhBFqhUNQLjOharc+DtlgsZXrJCoVCoSgfhw4Svvjii/Tv35/o6GiysrL49ttvWbNmDb/++qsjs1UoFIp6gUMF+tSpUzz44IMcP36cgIAAOnXqxK+//krfvn0dma1CoVDUCxwq0F999ZUjT69QVBmLxUJBQUFdF0NRD3Fzc8NsNtfIuWptHrRC4SwUFBRw6NAhLBZLXRdFUU8JDAwkIiKi2us3lEArLitEhOPHj2M2m4mKirK/UEChMICIkJOTw6lTpwCIjIys1vmUQCsuK4qKisjJyaFhw4Z4e3vXdXEU9RAvLy9AG4MLCwurlrlDdR8UlxXFxcUAuLu713FJFPWZkod/YWFhtc6jBFpxWaJ8uygcSU21LyXQCoVC4aQogVYo6hlNmzZl8uTJdV2MGqO+1ccISqAVikuElJQUHnroIRo2bIi7uztNmjThqaee4syZM3VdtDrltddew2QyYTKZcHV1pUGDBlx//fVMnjzZsFuJNWvWYDKZSE9Pd0xhDaIEWqGoInFxcdx4443ExcU5PK+DBw/SrVs39u/fz3fffUdiYiKfffYZq1atIjY2lrS0NIeXoSKKi4vrfE55hw4dOH78OIcPH2b16tXcfffdTJgwgZ49e5KVlVWnZasOSqAViioyc+ZMVq9ezaxZsxye16hRo3B3d2f58uX06tWL6Oho+vfvz8qVKzl69Cgvv/xymfhZWVncd999+Pj40KhRI6ZNm2Y7JiK89tprREdH4+HhQcOGDXnyySdtx/Pz8/n3v/9No0aN8PHx4aqrrmLNmjW24zNmzCAwMJBFixbRvn17PDw8+PLLL/H09Lyo5/nUU09x44032j6vX7+e6667Di8vL6KionjyySc5d+6c7fipU6cYOHAgXl5eNGvWjDlz5ui6Pq6urkRERNCwYUM6duzI6NGjWbt2Lbt27eKdd96xxZs1axbdunXDz8+PiIgI7r//ftuc5aSkJG644QYAgoKCMJlMDB8+HIBly5Zx7bXXEhgYSEhICP/3f//HgQMHdJWtWtSIV34HkZGRIYBkZGTUdVEU9YTc3FzZvXu35ObmVil9UlKSxMXFSXx8vISFhQkgYWFhEh8fL3FxcZKUlFTDJRY5c+aMmEwmefvtt8s9/sgjj0hQUJBYLBYREWnSpIn4+fnJhAkTZO/evfLxxx+L2WyW5cuXi4jIvHnzxN/fX5YuXSrJycmyefNm+fzzz23ne/jhh6Vnz56ybt06SUxMlEmTJomHh4fs27dPRESmT58ubm5u0rNnT9mwYYPs2bNHsrOzJTw8XL788kvbeYqKisp8l5iYKD4+PvLhhx/Kvn37ZMOGDdKlSxcZPny4LU3//v3lyiuvlI0bN0pcXJz07NlTvLy85MMPP6zw+owbN06uvPLKco8NGjRI2rVrZ/v81VdfydKlS+XAgQOyceNGiY2Nlf79+9vK++OPPwoge/fulePHj0t6erqIiMyfP19+/PFH2b9/v2zfvl0GDhwoHTt2lOLi4nLzraydGdE1JdCKy4rqCjSldsQwmUxl/paEmmbTpk0CyMKFC8s9/sEHHwggJ0+eFBFNoG+55ZYycQYPHmwTovfff19at24tBQUFF50rOTlZzGazHD16tMz3N910k7z44osiogk0IDt27CgT56mnnpIbb7zR9vnXX38VDw8POXv2rIiIjBgxQkaOHFkmze+//y4uLi6Sm5sre/fuFUC2bNliO56QkCBAlQX6+eefFy8vrwrTbt26VQDJysoSEZHVq1cLYCtzRZw+fVoA2blzZ7nHa0qglYlDoTDA7NmzcXXVFuCKda+Lkr+urq7Mnj3bYXmLgb01Ltz3MzY2loSEBADuvvtucnNzad68OY888ggLFy6kqKgIgJ07d1JcXEzr1q3x9fW1hbVr15Z5pXd3d6dTp05l8hgyZAhr1qzh2LFjAMyZM4cBAwYQGBgIwJ9//smMGTPKnLdfv35YLBYOHTpEQkICrq6uxMTE2M7Ztm1bW/qqICJl5iTHx8czcOBAoqOj8fPzo1evXgAcPny40vPs37+f++67j+bNm+Pv70/Tpk11pasuaqm3QmGAIUOG0K5duzIiUsLmzZvp2rVrjefZsmVLTCYTCQkJ3H777RcdT0hIICgoiNDQUF3ni4qKYu/evaxcuZIVK1bw+OOPM2nSJNauXUt2djZms5n4+PiLlij7+vra/vfy8rpoMUb37t1p0aIFc+fO5V//+hcLFy5kxowZtuPZ2dk8+uijZezdJURHR7Nv3z5d5TdCQkICzZo1A+DcuXP069ePfv36MWfOHEJDQzl8+DD9+vWz69lw4MCBNGnShC+++IKGDRtisVi44oorHO4RUQm0QlFFXFxcsFgstr+OIiQkhL59+/LJJ58wZswYm68HgBMnTjBnzhwefPDBMoK5adOmMufYtGkT7dq1s3328vJi4MCBDBw4kFGjRtG2bVt27txJly5dKC4u5tSpU1x33XWGyzpkyBDmzJlD48aNcXFxYcCAAbZjXbt2Zffu3bRs2bLctG3btqWoqIj4+Hi6d+8OwN69e6s85W3Pnj0sW7aMF1980fb5zJkzTJw4kaioKICLZuCUuAAocQkAcObMGfbu3csXX3xhuybr16+vUpmMokwcCoVBwsLCiIiIICYmhs8++4yYmBgiIiIICwtzWJ5Tp04lPz+ffv36sW7dOlJSUli2bBl9+/alUaNGvPXWW2Xib9iwgXfffZd9+/Yxbdo05s2bx1NPPQVoszC++uordu3axcGDB5k9ezZeXl40adKE1q1bM2TIEB588EEWLFjAoUOH2LJlCxMmTGDJkiV2yzlkyBC2bdvGW2+9xV133YWHh4ft2PPPP88ff/zBE088wY4dO9i/fz8///wzTzzxBABt2rThlltu4dFHH2Xz5s3Ex8fz8MMPl3kgVURRUREnTpzg2LFj7Ny5kylTptCrVy86d+7Ms88+C2i9dHd3d6ZMmcLBgwdZtGgR48ePL3OeJk2aYDKZWLx4MadPnyY7O5ugoCBCQkL4/PPPSUxM5LfffmPs2LF2y1Qj2LVS1yFqkFBR01R3kLCEvLw826wJi8UieXl5NVG8SklKSpJhw4ZJeHi4uLm5SVRUlIwePVpSU1PLxGvSpIm8/vrrcvfdd4u3t7dERETIRx99ZDu+cOFCueqqq8Tf3198fHzk6quvlpUrV9qOFxQUyKuvvipNmzYVNzc3iYyMlNtvv13++usvEdEGCQMCAiosZ48ePQSQ33777aJjW7Zskb59+4qvr6/4+PhIp06d5K233rIdP378uAwYMEA8PDwkOjpaZs6cKU2aNLE7SIh1gNZsNktwcLBce+218uGHH170u3z77bfStGlT8fDwkNjYWFm0aJEAsn37dlucN954QyIiIsRkMsmwYcNERGTFihXSrl078fDwkE6dOsmaNWsqHbitqUHCWt/V2whqV29FTZOXl8ehQ4do1qwZnp6edV0cRT2lsnbm1Lt6KxQKhUIfSqAVCoXCSVECrVAoFE6KEmiFQqFwUpRAKxQKhZOiBFqhUCicFCXQCoVC4aQogVYoFAonRQm0QqFQOClKoBUKhcJJcahAT5gwge7du+Pn50dYWBi33XYbe/fudWSWCkW9ZPjw4ZhMJh577LGLjo0aNarM9kyK+oNDBXrt2rWMGjWKTZs2sWLFCgoLC7n55pvL7EGmUCj0ERUVxdy5c8nNzbV9l5eXx7fffkt0dHQdlkzhKBwq0MuWLWP48OF06NCBK6+8khkzZnD48GHi4+Mdma1CUS/p2rUrUVFRLFiwwPbdggULiI6OpkuXLrbvLBYLEyZMoFmzZnh5eXHllVcyf/582/Hi4mJGjBhhO96mTRs++uijMnkNHz6c2267jffee4/IyEhCQkIYNWoUhYWFjq+owkatOuzPyMgAIDg4uNzj+fn55Ofn2z5nZmbWSrkUly8ikJNTN3l7e8MFm5LY5aGHHmL69OkMGTIEgK+//pp//vOfZXbdnjBhArNnz+azzz6jVatWrFu3jgceeIDQ0FB69eqFxWKhcePGzJs3j5CQEP744w9GjhxJZGQk99xzj+08q1evJjIyktWrV5OYmMjgwYPp3LkzjzzySE1UX6EHuw5Ja4ji4mIZMGCAXHPNNRXGKe3XtXRQ/qAVNcWFfnqzs0U0ma79kJ2tv9zDhg2TQYMGyalTp8TDw0OSkpIkKSlJPD095fTp0zJo0CAZNmyY5OXlibe3t/zxxx9l0o8YMULuu+++Cs8/atQoufPOO8vk16RJEykqKrJ9d/fdd8vgwYP1F/oypqb8QddaD3rUqFHs2rWr0q1iXnzxxTI7FWRmZtq2plEoFBAaGsqAAQOYMWMGIsKAAQNo0KCB7XhiYiI5OTn07du3TLqCgoIyZpBp06bx9ddfc/jwYXJzcykoKKBz585l0nTo0KHMvoSRkZHs3LnTMRVTlEutCPQTTzzB4sWLWbduHY0bN64wnoeHR5ktchQKR+PtDdnZdZd3VXjooYds20RNmzatzLFsa2WWLFlCo0aNyhwrubfmzp3Lv//9b95//31iY2Px8/Nj0qRJbN68uUx8Nze3Mp9NJpND915UXIxDBVpEGD16NAsXLmTNmjW23XUVCmfBZAIfn7ouhTFuueUWCgoKMJlM9OvXr8yx9u3b4+HhweHDh+nVq1e56Tds2EDPnj15/PHHbd8dOHDAoWVWVA2HCvSoUaP49ttv+fnnn/Hz8+PEiRMABAQE6NoIUqFQXIzZbCYhIcH2f2n8/Pz497//zZgxY7BYLFx77bVkZGSwYcMG/P39GTZsGK1atWLmzJn8+uuvNGvWjFmzZrF161bVgXJCHCrQn376KQC9e/cu8/306dPVpHqFohpUtpfd+PHjCQ0NZcKECRw8eJDAwEC6du3KSy+9BMCjjz7K9u3bGTx4MCaTifvuu4/HH3+cX375pbaKr9CJ2jRWcVmhNo1V1AZq01iFQqGo5yiBVigUCidFCbRCoVA4KUqgFQqFwklRAq1QKBROihJohUKhcFKUQCsUCoWTogRaoVAonBQl0AqFQuGkKIFWKBRlEBFGjhxJcHAwJpOJHTt20Lt3b55++ulK0zVt2pTJkyfXShkvF2p1RxWFwln5cMW+Ws1vTN/WVUp34sQJ3nrrLZYsWcLRo0cJCwujc+fOPP3009x00001UrZly5YxY8YM1qxZQ/PmzWnQoAELFiy4yP2owvEogVYoLhGSkpK45pprCAwMZNKkSXTs2JHCwkJ+/fVXRo0axZ49e2oknwMHDhAZGUnPnj1t31W0TZ3CsSgTh0JxifD4449jMpnYsmULd955J61bt6ZDhw6MHTuWTZs2AXD48GEGDRqEr68v/v7+3HPPPZw8edJ2jtdee43OnTsza9YsmjZtSkBAAPfeey9ZWVmAtlns6NGjOXz4MCaTiaZNmwJcZOI4deoUAwcOxMvLi2bNmjFnzpyLypuens7DDz9MaGgo/v7+3Hjjjfz555+6ywLaBrjvvvsuLVu2xMPDg+joaN566y3b8ZSUFO655x4CAwMJDg5m0KBBJCUl1cTldgqUQCsUlwBpaWksW7aMUaNG4VPODgOBgYFYLBYGDRpEWloaa9euZcWKFRw8eJDBgweXiXvgwAF++uknFi9ezOLFi1m7di0TJ04E4KOPPuKNN96gcePGHD9+nK1bt5ZbnuHDh5OSksLq1auZP38+n3zyCadOnSoT5+677+bUqVP88ssvxMfH07VrV2666SbS0tJ0lQW0bfAmTpzIK6+8wu7du/n2228JDw8HoLCwkH79+uHn58fvv//Ohg0b8PX1tW1oUB9QJg6F4hIgMTEREaFt27YVxlm1ahU7d+7k0KFDtr08Z86cSYcOHdi6dSvdu3cHtF7pjBkz8PPzA2Do0KGsWrWKt956i4CAAPz8/DCbzURERJSbz759+/jll1/YsmWL7ZxfffUV7dq1s8VZv349W7Zs4dSpU7attt577z1++ukn5s+fz8iRI+2WJSsri48++oipU6cybNgwAFq0aMG1114LwPfff4/FYuHLL7/EZN0effr06QQGBrJmzRpuvvnmKlxp50IJtIPIzi/i8JkcsvOLCPJ2I9DbnSBvN1zN6qVFcTEiQn6RhfwiC8UWwWwCFxcTLiYtFBQW2T1HQkICUVFRZTZabt++PYGBgSQkJNjEtGnTpjZBBG0z2At7v/bycXV1JSYmxvZd27ZtCQwMtH3+888/yc7OJiQkpEza3NzcMttrVVaWhIQE8vPzKxz8/PPPP0lMTCyTHjRfzPVlCy8l0DVEQZGFI2dzOJyWQ0paDqnZF79imUzg5+lGiI87XaIDaRJyiW2Gp6hRLCIUFFnILywmv8hC6Z0zCi+I26BRU0wmE7v+3s3tt99erXxrYzPY7OxsIiMjWbNmzUXHSgt5ZWWxty1ednY2MTEx5dq/Q0NDjRfaCVECXQPsPZHFb3tOkVdYXGk8EcjMLSQzt5BDqedo2sCba1uGEuqndjK/3MgrLCYzrxC9+xkFBQfT+6a+fPrpJwwf+Tjhwf64u57fjzA9PZ127dqRkpJCSkqKrRe9e/du0tPTad++fY2VvW3bthQVFREfH2/rle/du5f09HRbnK5du3LixAlcXV1tA41GadWqFV5eXqxatYqHH374ouNdu3bl+++/JywsrN7uuKTet6tBbkExS/46ztKdx+2Kc3kkpeYwZ3Myy/8+QXa+/VdYRX1AyC8qJiNXvziXMPG9yRQXW+jT6xpmffcDcX/9zc5df/Pxxx8TGxtLnz596NixI0OGDGHbtm1s2bKFBx98kF69etGtW7caq0GbNm245ZZbePTRR9m8eTPx8fE8/PDDZXq8ffr0ITY2lttuu43ly5eTlJTEH3/8wcsvv0xcXJyufDw9PXn++ed57rnnmDlzJgcOHGDTpk189dVXAAwZMoQGDRowaNAgfv/9dw4dOsSaNWt48sknOXLkSI3Vty5RAl1FDp7OZtamJPadzLIfuRJE4O9jmczYcIj45LM1VDqFM2IRIbegmKLiqm0D2qRZM1as+4Nrrrue1/7zAtd070q/fjezYuVKPv30U0wmEz///DNBQUFcf/319OnTh+bNm/P999/XcE20wbiGDRvSq1cv7rjjDkaOHElYWJjtuMlkYunSpVx//fX885//pHXr1tx7770kJyfbZmHo4ZVXXuGZZ57h1VdfpV27dgwePNhmo/b29mbdunVER0dzxx130K5dO0aMGEFeXl696VGrTWMNUlBkYc3eU/x9LNMh5+8SHUiv1qG2UWlFzVJXm8bmFBSRnVeEI242ExDg5YaHm9luXEXtUFObxiobtAEKiy38vOMoR87mOiyP7YfTyS0o5uYOEZhdlEjXBzLzCsktMG4C04sA6bmFBACeSqTrFcrEoZNii7Dkr+MOFecS9pzIYtGfRykoqtmRdUXtk51X5FBxLk1GbiE5BWosoz6hBFoHFovwy67jHEo9V2t5JqXm8OO2I7V2cytqnpz8Is7VsmBm5RWpAed6hBJoO4gIy3efZP/J7FrP+0RGHj/EpXBO3XCXHLkFxWTV0e92Lr+IXNWTrhcogbbD6r2nSDjumAFBPaSdK+B/fx6jqFiZO2oSR46N51vnONclmXlFFCoTWZ1RU+1LCXQlrN+fyp8pGXVdDI5n5LEyQf9SXEXFmM3aIJqjnOkUFFnIyK1bcS4hPbcQi8VpJ2nVa3JycoCLV0oaxaGzONatW8ekSZOIj4/n+PHjLFy4kNtuu82RWdYYe09ksTUprdxjKft28r8vJjHwkWcBmPfROAry8nD39OK62x5g1dzPST12GEvx+ddMs6sbxUXajevi6oalqBAXs5kGjZpw0+CRbF2+kIGPPMuJ5ER++vRtbvvXS3Tve35Jb8LxTEL93IlpovzyVgdXV1e8vb05ffo0bm5uuLjUXB+lyGKpdAFKYX4eWWmp+AU3wM1Dm3qVkXqS3GztDc1kMuHm7klB/sUD0SaTCRdX7WYXsSDFxfiHhOLlG1BpmU4X5uPv5aambdYSIkJOTg6nTp0iMDDQ1iGoKg6dB/3LL7+wYcMGYmJiuOOOOwwLdF3Ngz57roBvtxyucBbFzLeeZsfaX/Dy9aeosIDC/Lxq5WdycUEsFtw8PCksyAcRTCYT9/57QhmRNplgUOdGNGugfHhUh4KCAg4dOlSj/idEtLnOxRahqKiQ3OwMvHwDcHU934PKycogP/ccru4eFBcW4OHtS965qi90cjGbcTGb8fD0Jj8vx/b3wnzdXV3U9LtaJjAwkIiIiHIfjE4zD7p///7079/fkVnUOEXFFpbsPH6ROKedPMq5jLOYTCb+Wr8SwNbzqS5iFYrSQi8i/DD5VdJOHKVV11iad4hBBJbuPM693aMI8VX+O6qKu7s7rVq1qlEzx7bks/x1Jh2Anz57nz1b19KuRy8im7Zm/aI59LjlDrb/tphzmek1lmcJJhczYinGxz+Ic5ln8fTx5d6xbxPRtJUtTu82YTRVD/Zawc3Nrdo95xJqbSWhyWSy24POz88nPz/f9jkzM5OoqKha7UGvSjjJX0fO251LzBmJf26ulfwrIrRxMx54YRJRrTsS6O3GfT2iVa/ISUhJy+GLXzaTna49wKeMuU97E6oSHoAPUL55TS/tr76Bfg88gU9AEMHhjXB3dVEPdifBSA/aqQT6tdde4/XXX7/o+9oS6L0nsli687jtc8q+nXzx8kiyM4zeLJ2APtYQCiQCey8IxudU+wWF8vD4T4lq3ZEmId7c3qWRsi3WMbkFxczelMzIXi2qcRZfYABwJ/APNIEuAE4Ax63hKPATsNLw2f8z6zeCwxvRwM+D+3tEqxWqdYwh063UEoAsXLiw0jh5eXmSkZFhCykpKQJIRkaGw8uXlp0vU3/bL2Omzpcm7TrL/c+9I626XCNoK2ntBE+BoQKzBU6IZpG0F34V6Kzz/OdD65hr5dZHX5Qm7TrLrP+tcvh1UVTOT9uPyAfL9xr+HbU2M0RgoUCuzjYjAr8JXG04v/uenSgtr7xKvlq4oq4v2WVPRkaGbl1zKl8cHh4etu1xapPSdufff55DcsIOkhN26EzdA/gGKL0V0TlgLbACOAS0AtqUCmHAzWg97FnAfwB97hH3xa9nX/x6AKZOnUb/3teo19Y6Ytvhsxw8fY60k0fpdec/WfvjdJ0pOwLfAR1KfbcPmG8Nf6O1kchS4UrgIeAGYCOwCK3d7NSV44pvPyX1aDJTP/qQgTddp3yQXyrUwgNDRPT1oC/EyJOmOny7Kk7GTP1Rxk5bYKBX4iYwXqDI2rM5av18vYC7nbTNBOaU6hXlCLwt4G+4Z/TmjMWyectWSUpKcug1UpTlZGaufLxyXxV6z4+X6jEfF3hN4AqdaaMEvijV5ooFZgkE6s/fZJIhT70iW1SbqTOM6JpDbdDZ2dkkJiYC0KVLFz744ANuuOEGgoODiY6Otpu+NqbZLV61noF9rjOY6gpgJtDF+vlb4AngrMHzdAMmAb2tn08D91MVOyPg0NVxivMUW4RvtxwmNUsbCIxftYhv333OzvUPAb4CBlk/LwGGA6lVKEFr4A2gZLfuv4B+aDZrY6g2U/sY0TWHriSMi4ujS5cudOmiCdnYsWPp0qULr776qiOz1U1+UTEffvqlwVT/BuLRxDkVuBsYgnFxBohDe2W9FUhAG1BcAtxr6CwuZjNTP/+6CvkrqsK2w2dt4px28ihhUc1p1LJDJSl6A3+iiXM+8BTwf1RNnEEzh9yLZl47hjYovR5oZvhMycnJVSyDolZwbGe+ejjKxJGUlCRxcXHyybzl4hsYbOD19O1SZolFAuGGTRIVBzeB70qdf7TutEOenyRPTvxCeve+QbZu3Vqj10pxnq1bt8p11/eSZz/5UT5Yvlf+M+s3Hb/P3aVMEgkCV9ZgmykxlyVaz3/UgLnkfFDULkZ0zal/HUcJdNVuhBdLiedTNXyTlQSTwEel8nnT8DmefPLJGr1WivOMHq09NK+7bahO2/PNAvnW33KWgLex39PkojNuhMBf1nzSRPcsD5NJxk/+b11f1ssOJdB2uKlPX4PCN7qUaI6tkviO/nCujP5wrs74L5XK73MBs900JhctTkiDUImPj5e4uDg1CFQDlLxtxcfHS3BIqADi4e0n4dEtJCCksjeoqwSyrb/hdwJ6xRYJi2ohvoEhMur9OeLtF6AzXaDABmt+2QL227iXX4A89+lCWb1+o2ortYjTDBJWl5ocJExOTiY1NRWTycSNffuRkabX/vdPoMS++xpw8UKa8jC5uNDvgSfYtXEVGaknGTP1R7LTz/DBqDswmUw6BmceBj4DzMAC4B7AuPN+J/55nZ64uDi6d+9ehZQdgHVAMLAMbYxBv4e7MVN/JLJpa1zd3Uk9dpi3h/fVmdIbra30A3KBWDTbtz5UW6kdnMYXhzPRtGnTKqS6BygZRHwfXeJsMoEIT7z/Lc06dKHvkMcpLizE1d0dAL+gBgSGRlJYUMCJpL2VnOhLtEGk74A70GZ7jNVdcldXV2bMmKE7vuJiZs6cCYCLi4sBx0pNgeVo4vwH2upAfeIcHt2SnKx0/IIa2NpLg4bR3DryBRZ9PlHHGXKAgWhzpG9BE+tu6BnAfuq5l3WVUVG7XDb+oGfPno2rq5Hn0T+A2WiX6L9oszfKx2Qy4WI2c8uwp4hqdQV+QQ0ICou0HSu52SyWYv45bip3PfkamWkndZThJ7QZIgBj0Hrz+igqKuLaa6/VHV+hkZycTHx8PNu2beP7778HwE/321sY2uKkhmgLSP4PTTT1cf9z7/DKrNUEhkaU+b73Xf/kycnf6zxLIdpUzYNAc7Q2bH9p94rV6/jp50VqVoeTcdmYOAA++v5Xnr73Fh0xW6JNpfNHa+DDgIp7UMNe/Zj23Xvj5uGBiJTpMZdm7M1tqlZwXkXrvRcANwIbdKd04p/XKSnt20SfKaoEd7TfpRuaOF6L5kOjYrx8/Rnw0DNsXjaf9NPHGTP1x4vEuYQj+/82YB4DbeXhRsALre28prMekJSURJMmTXTHVxjDaeZBOxO7j2Wya1+SjpgewA9o4rwWrdda+evtN288iZt1iXrpHvOFDHl+Ei5VckM4HpiHJgILAPuLfEoTFxfHjTfeSFxcXBXyvrwo/aZl7OE2EU2cU9GW8Vcuzh7evvz7s0X0/L97eXrKvHJ7zqUpKizE2y+QsKgWeHjpcRv6JzDS+v84tN68PqpmDlQ4gstCoDNyC/lx7Xa+fPUxHbE/QFuEcgq4D7C3+aaJIc9P0lWOmJtu5emP5+mKWxZBW3W2He01ehGax7OKcXExM+yl98jKK2TmzJmsXr2aWbNmVSHvy4shQ4awebNR17L/QDNBgfY7HbCb4vZ/vVyuGawiPn56MDlZ6Zw8nEh+rl5PiLOBqdb/ZwH6PO6NHat/rEPhWOq9QIsIv/59glfv760j9j3A42g95gew1wsCGDvtR2JuutVwuYy7Cc1BW4l2Eu31dSaV2Ravv/1BCossvPvFdzZb6ty5c9m2bRvx8fHK1lhjRAAzrP9/hLYStHxadY3FzcMLk8lERJOWhnKp7O3LVOm2XWPRTC+BwEK0mR6V88EHH6g3Lieh3tugtyalsX5/KvGrFjHn3eeocMO4MnbnN4FXdJ1/7LQFNG5V2TLfsqSfPsGHT9xJYGgkV91yF/M/Hqc7rUYssBrNFPMqmvnDDtaZJRfaL534p69Tjhw5QlRUlI6YJrQZG33Q3m6uRhsnqJj3liVQkJuDp4+v8XJZ7dAXMnbaAo4d3MvcD16qoH1HAtvQHiZfoU3hrJiSHVoGDhzIlClTlD26hlE2aCunsvLYeOAMAM2uiKlEnC+0O7+m6/weXj74BoZUGsf1AufogaERvDJrNU9PmUfP/7uX+5+fhIuLEbv0RuBR6/+vovljsIO13iWC7OrqyuzZsw3keXkR2bARI16aZKdnCvAsmjifQzOHVSzOLmaz1gt2calUnBv4utM81Idwf0/8PF1xKedNq+Ttq/RbWI9+dzB26o8VnPU4mmMlCzACqHxetVi0+fb/+9//aNq0qXrjqkPq7TzoomILy3adIGnPX8x55zlOpRysJPaFdmd9C0LGTLt41N3Xw5WoYG+ahHgTHeyNt7uZzLwizp4r4GyOFs5kF3A0PRcR6HbTrZiAOe88a6B236DdZEPQbItdKG86V5N2ncv1a71582a6du1qIL/Li+2Hz9Kh963I25X9Jj3Q3rQARqPtklMxT388r8I3rTB/D1qG+tIq3I9gn7K2aBEht7CYzNwiVpiybfPor7rlLtvsD3udBI11aPboJ4Ev0DwyZutIB926dbOVRVG71FuB3nwojTPZBWxd8bMdcb4Do3bnEiY+dAsfLN+Lm9lEt6bBtAzzpUE5zvMDvNwI8HKjaamBvVOZefy+P5XDaTl4+wXqzvM8TwC90FxPTgJGXRSjok0HEhISEBEaNGigXl8vIDu/iM2HtC3O+g97il+++aicWP5oC4jcgLnAdMP5uLqY6N4smHYR/gR4u1UYz2Qy4e3uire7K0P7dOXG/QeIS8ni4OlzxA4YXGZKp29gCD4BQZzLqGhhyotoszmaA+9QXpupqAxqgLluqJcCnZyczNzZ84mPj2Pjksom+IeiLacGbZrUCt15uLiYue/ZiUQEeNKvQ8RFPR97hPl7cmdMYw6lnsMlpwN+QSH4BARz9tRxLMXFmExQkJdbyRnS0WYMrER7wCwCftWV9wMPPGD7X/WKyvL7vtNsX7+SJV9/SNtu11QQ6300kTsE2J8Z5OnjV6aXG+LrTv8rIqu0q0mjEH8ahfhzIiOPDYnaA76EwNAIxs1Zx+8/z+J/X04qx6SXAzwCrEJrMz+gmfQqJzAwkHbt2hEfH68e6rVMvRwk1D9DYj7aUtw/ge4Y8Zfw708XctfN19G9aTAu1dyE02IRdiSdZmtKJskHD5J7LgtLcTH/fekh8nPsTamajOZf+BjaVkr6Nrgt6RUNGTLEfuTLhCNnc5gXd8TOgqJewBrr/9eh+WGumNJ+NQA6NgqgV5tQ3Mw1M/yTcDyTFbtPUmw5fxvbXxD1Gdo4xgE0X9L6VzuCeqhXl8vaF0dycjLPPPMM77//vp2Y93LeT8IwjIgzQL8O4VzVXI/tzz4uLia6Ng+jdaNg/Hq3Mpj6BbSFEe2ATzm/y0blqF5RWQ4dSmL22l2k51TWDjzQlv2DJnKVizOcn+Ps6WamT7swWoX71UBpz9Mu0h9PNzNL/jpGYbFe4XwObe52C7RZQM/oSqVMHXVAzTnRq3mq4m4U3f5zz1hdM/5HV5rGrTrI7Y+/Ii3bd5Lw8AhJSUlxSJ2/njFTzGZX3a4ptRAjUGCtz/0G02pBRHNIf8MNl6fTf33X6XXrNT4mYN8NqKePn7w6Z63M3pQkGbkFDi3/kbM5Mm31fvlg+V4Z8vwkMdn1Jd3fWpdi0es/OigoSLmyrQEua3/Qs2fP1tHYfrY2zjiBysXQ5OIi9z4zQd7/dY/8vOOoFBUVS15engNrLbJ5y9YqiOx/rHU6K9DYUNo33nhDbrjhBhk8eLDA5ef0/1x+oQx76T0xuVQmau3kvPP9O3Vd13cX75QZGw5JTn5RrdTjZGau/Hdtok2k7ZdxhrU+uwU8DLe5y4ma7LwY0bV6NQ86OTmZgIAA7rrrrkpiDUXzz5uPZtqofCn3Q69/Qo9+d9AkxId/XBGB2eyCh4djt6x3rZJ9cgKwCW3F2NTKo5bigQceYMuWLaxevZpFixYBl9+Kw/X7U4lq1xWp0KWoCfgczRfKIqCi+cbn6T/sKYL8vbm9ayO83Kvif8U4YX6e3NMtigAvN7z9AnSkGIM2a6kdmtlDH5fjPPry3CUcSj1HZp4x06hhqv04cCBGe9DYfeo3tPYwReB53T2F77ccloKiYgfX9jwpKSkSEREh3bt3l6GPPW2gV9O+VC/v9ir0wi+/ntLx9FwZ8candq7BSOs1zdT1duLl6y8TfvhdzmTn10mdsvIK5Z3563X+voOtdcsRbX9D+2lmzZp1WZjCSu+mExYWJoCEhYVJfHy8LFuzQd74do2knzNuurpsTRz2G9cSa2PcJHq2kQJk6JjXJLegdl5RS5OXlycWi0Xi4+MNCup4ax2PCPhXS5hdXV1l9uzZtV732sJiscjkhRvsXIcIOf9Q17eR7zNT5smJjNw6rdvx9Fy5/9mJ4mLW085XWuu3SFf9LhdTWOk6m0ymMn9LwnXX9zb8oLpsBXr27NniUqEdcYS1EeYKtNXVEAeNeLLW7IcVkZKSIuHhEdKkVTvx8PYVF1d3Mbu5i29gSAXl9hTYZ63rlGoJdHx8fJ3W3ZEkJSXJ3CVrdFyH763XcrPo2VfQw9tHNv+1r66rJyIif6Wky9hpC3TUsa2cf/P6v0rjuriYxc9fe/CX9CZnzpwpsbGx9a5HPXv2bHF1rXiMKjA0skoPqstSoEteR8q/mNECGdYGqH/T13V/bK6FWtonLy9PcvIL5fPfEnSW/UZrXYsFehgW5pJeQn0WaH3Xop/1OhYKXGk3/ujJc2XX4dS6rloZps1brrOuE6x1PSjgZaidlIT62KOeNWtWxdfAWv+goCBZvHix7tktl6VAV9yQTHL+Fe530bu7clBQsMOm0lWVM9n5Muyl93S+tn5jrfMOsTdT5cLQvn17iYhw3FRCZ+DFd6fZuY7uAnut1/A9XUL1xcKVdV2tiziUlCwBIaES2ayteHj7itnVvYJ6eAskW+v7uqH2UhJKetT1YRpeyayNvn3t745+YbDHZSnQFb+O/Mva6M4JtLR7ccOjW0pQSKgkJibWQg2Nc+h0tjzzyUIdDaWBwGlr3Z811MAOHz7s8KmEdcnJzFz5cMVeO6//z1mv3TEBvwrjNW59hUQ2ayMBIaGSlHy4rqtWLqfSs+ST1fvl3cU75T+zVldS5zusdc7Tda9U9KDSK1TOSlJSks3O7unpaavbhfW7MOgds7ksBVpE5Ouvv77gojUXyLY2uid0NbK3Zy6WnJy6HeCpjK1bt0q7jl3KvSEuDsNKPZya6qr/q6++WtdVdChbtmyR9jGxMuKNT2XQYy9VcB0aCmRZr90Duq7b8t/WOXWvMTn1nLw6e7WMmfqjRLXpVEldfrHW+xfDAm1UqJyNys2k9oNek+BlK9BlL5hJYK21sf1m/Vz5BfYNDJaE/QcdXKvqMXq0NpPAw9NLolp3lBvuflhMLpW9qq8ydMONHj26rqvoUAYPH6njOsyxXjO9U9Wcv9eYlJSksw4tRetBV32q5qxZs+q6ulWiqsJsdMzG6QR66tSp0qRJE/Hw8JAePXrI5s36Bt+MCvTQoUNLXbinrY0sU+z3Hk3yf488K3uOnKlONR1GefMxG4SGyriv9EyLaiXazBURuMtufLPZLB9++GG9sCOWsGjRIunWrZv898sZlcx+KQnXW69VsUBn3Teps/cajYnOG9ZrkCyabdqYYN177711Xd0qYW/WRmXByJiNUwn03Llzxd3dXb7++mv5+++/5ZFHHpHAwEA5efKk3bRGBXr9+pIeT2vRJt6LaIsMLu3eT3lPa/vmjdJhnPVaHBHwNdTw6gP662sW+NN6rT4xdJ2cfcaLMfHxEjhkvQ5v6krj6ekpZuug66Xss8PougMXFxeZNWuWoTEbpxLoHj16yKhRo2yfi4uLpWHDhjJhwgS7aatm4nAR2GhtXMt0X+iZM533tayym8vs6ir9hz1lp36eAvut16TyGQmlw9VXX33J3WAllH7r8PfXu2DnCes1ShUIrlcCLWJUfAZZr0W+aG9h+q/FheFS4uJxrMrDnXfdYzgPpxHo/Px8MZvNsnDhwjLfP/jgg3LrrbfaTW9UoP/1r3+JZmt+WuC46HUaNPrpMVWpXq1S0c21dWucvPXNYh31vMV6wxUKdDTUCC/FnlDp8ut72wgVSLNeI/1vXZfSlETjq1JLVt5WbcDQ2c0+5WG0jv4BAYbfFpxGoI8ePSqA/PHHH2W+f/bZZ6VHjx4Xxc/Ly5OMjAxbSElJMSTQIqW92XnqvsiXUu+nZKVkyd/4+HjZufeA+AU1kKjWHaVbn9sqqes86w23XvQMml4YLiVuvvlmg/X7wnpt4kTvXPmSh9elMiWxxMdLTEyMPDlWz9TLFnJ+wLCydnXp3lcXcued+jwVVuceuWS92U2YMIGAgABbiIqKMnyO1NRU6395uuK7u7sTFhZmOJ/aJiwsjIiICGJiYvjss8+IiYkhIiKCsLAwrmjdnJVbdvH0lHm0vPKqSs4yBm2j0GvQPPnp41LxXpacnEx8fDzbtm1jx44dBlJ2Bx6y/j8abX9K+wQEBBAeHu5w74Y1RePGjUlKSmLr1q0MG3KvjhQHgHet/08GvAzld/y4/v09nQWzb3CV0jnsHqnuE6cyjJo4qtODrs4cxkuFEgdKIpqjnwt7bgu2peio7zPWHtEpgaB61ROqym+vvUlssV6T6YbSXio95/JISUmRBg1CxWx2Ff+QMPELalCBP+zSA4bj6+W9VaIdU//7lZgNzeLwEoi0fb4kl3r36NFDnnjiCdvn4uJiadSoUY0PElbt5rx0GpEe/t6bKAP/OcZOfV0FdlpvOHtuNrXw2tvvVtrwnGUnlqpNkypxopUuEK473fjx4+u0rjVBXl6eHDpxVkd9b7NeI/0rDM1m8yVjf66abrgJLBXNd0lzQ3riVAI9d+5c8fDwkBkzZsju3btl5MiREhgYKCdOnLCb1uhSb7MuHxXng4uLyyXTiPSgv+7XWm84Y86UKqJk8YwzOMsxNhAWJOeXw9ubCXM+hISEXBKDgnrRV++l1uu0VFf8bxb9VtfV0kVSUpI89thjBsXZRc57OTwn0NN2bPLkyXbzdCqBFhGZMmWKREdHi7u7u/To0UM2bdqkK13N+4MuG+qTOIsYfUhNtzaw7aLHN/aDo58rk1dlzszrctaHMYGeYr0GO8WIQ6mNGzfWSd0cxchH9QhU6RWGt9mN/8ALk+Sa63rV+VuVPYxqhmYS+9J6HfIFLh6MtofTCXRVMSrQ48cbs5HNmDHDwTWoffTXv4Fo831FNLt05fG79B4gc5eusQlv6WMVLZ6pCw4mJYuXT8XOjc6HKwWKrPXvXWlcL18/cXNzE6h/vWcRzUTVKKqJjmtWshlEilTmQAqQHjffIYA8/oRzug4o6WC8+ppRz30fWK9BkWjOpcoevyR70FXFqECnpKRISIi9pbzGnnaXGsYeUv+0NrZsAT03qBYWLVpUqb23Lue/Ltt1XN5dvFPGTP3RTj1+t9b9O111PnjwoKSnp1/SA4MVUWKish9KL3j6qMJ4bp6e4uUbIID4BQTJ1q1xTjeX3pgol4SSFbki8GCVNeWyFWgRkY0bN+q62JfSIIYRjD+kVlsb3BLDD7aKzAl1Metj69at0qPndTJm6nwZ8canEhbVopLyP2Ctc5ZAI0N1ri+UZ6LSF6q3GYSzMHnyZINjVk+XEufyPWOaTCblbtQeKSkpEhqqTR8KCmsovoENnEZEaouSh5TJpGfBRWs5b1u8R1dj9fLxlU2bt9oWBZW3eKa2eeSxxwWQzr3+Yaf8fqKtMhXRfD7br++luCLOHhcKizGhLRm/+FP02u7NTnYNjdX3/lLiXJGLWmTp0qW68r6sBVpEmz40b/MBef/XPbZXXWcQkdqi9K7gD415yY47UgRetTa+4wKBBhsv0r17d/nss8+ke/futbrsuaQXuGHTFvHxD7SKaUU7hpSEj6x13SParin261cf20p1PLdBiJyf/fK8rjTPfLJQDp3Orutqi4g2HVV/XVvLed/gk2qknVz2Ai0i8vOOo/LB8r3yxtx1EhYeXmciUleULGrJLSiSN+asFG//QKHCHrW7QIK1EX6mu/GaTCaZPn26WCwW21zoDRs21FodjQvL1aK9movATbrTzZ4926nspzWFcd8cpUOJmShHtCXhlce//o7hMm31fknNqlsbfmFRsYE6ugtss9bzN6nMBYCRwWMl0HJeoOOSzthdgVff2XM8U95dvFOGv1LZLt8lfpBFSs/rrCy4mM0y8eP/SlxcnAwfPlygdudCT/9mppjNenuBbnJ+gY6xFYMlob5xoX8X42G59Xqu0BX/g+V75ev1ByUnv6jO6rz0r2My5PlJOvf1nGyt3ykpvWKwvLB3717dZbhkfXHUNBEBnnSJCsLDwwOTyQSAyWS6ZHwn1BSe+WmY0g8zY/zoSmKtA76y/v854Gb3vJbiYl548lG6devGjBkzAJg7dy7btm0jPj6e5OTkapa8YgqLLXi3781TH/+gM8XzwBXAKeAZQ3ldKr5IjHKhf5fu3bsTHGzEF8VjQC7QBxhqN/bahd+wctF8Js74iZyCoiqWuupsOZTGnhNZxNx0K09/PM9O7P8DnrL+Pxyo3K9ImzZtql/AcnB1yFmdALPJRN/24bi4mOq6KHVO06ZNdcZ8FhgIdADGAf8xnNfp06eJiYmxfRYRw+ewR1Gxhf/9eYyjZ3M5cThRR4q2nK/Lk0Caofw2b95M165dDZbS+SlxnuTu7o7JZGLkyJFs3ryZ2NhYXFxcsFjsOY06CLwGvAN8APyK9gAsn58/fdv2f7MOB7m9a2MCvOx3BGqCxFPZ/HEg1X5EABoB063/fwgsrTS2i4sLM2fOrEbpKjm3Q87qBHRvGkQD38urp1wRs2fPxtVVz7P4LPC49f8XgFjDeZUIsqN6ncUWYcnO4ySfyQFg//ZNAJhMFTVlE/AF4AEsBr63m4eLi0uZv/WZC98uGzdubOtVj3/zLUwuZjtn+ADYATQAvtaVZ8//u4+zOYX8sDWF1Oz8apReH6ez8vn17xOU9BXSTh4lM60isXYBZqPVZxvafVA5FouFIUOG1ExhL6De9qDD/D3rughOw5AhQ2jXrl2Znm3F/AjMBB4EZgFXAucM5+mIXmdGTiG/7j7Bzj2JnMs4i8lkImHLGgBEKurtPQpcC2Rx/uFTASYT/v7+tGndmhEjRvDVV1+RkpJySbijrSku7FVfddMABvXtRW52RgUpioAHgDhgAPAv4NNK87hx8CMAZOcXMS/uCIM6N6RhoDFXpnpJSj3H0l3HKSg63z7eHHpjJSleBnqjtZfBQIHdPMaPH1+9QlaCSRzxDlpDZGZmEhAQQEZGBv7+/nVdnEuabdu2WQXahDauURn+wE4gGvgvmq3RDiYTiGAymRAR1v2xmetie1Sz1Of560g6v+9PpaDIwtib9dr7GgG70eozGphqN0VeXp5NnESEgoKCy27M4kLGfzGfic88gpevP2dOHIFyH4ZPAh+h2aS7AnsqPecHy/fa/nczmxjQqSHNGvjUYKkhLimNDYlnsJSSuLSTR4lb+TPLZ03FYim+IEVPtLEYM5pN3f4boK+fH9/PnUuHDh1o0qSJrnIZ0bX6/w6nAKCgoICQkBDat2+nI3Ym2sAIaD3Qf9hN4RcYTO+7RxAW1Ryzqxuzf/uT3/efJq/wwpvAGJl5hSzYdoQZP69i8pgHSNm3kyHPT9KZehqaOG8EPrEb+403xl/2A8rl8erIu8nJSufM8cMViDPAFDQbtBcwh8oGmRs0bELKvp22z4XFwqIdx/gjMbVMT7eqFBVbWLbrOL/vTy0jzqD1npd981E54uyHJshmtDdHfea57KwsBgwYYGCcxxhKoC8TYmNjOXPmDLt379aZYjWafRG02R0hlcbOOnuGNfO+olWXWIqLCkmI+524pLN8veEQWw6lUVhs7MYTEXYdzWD2pmSSz+SwdcXPJP65mbiVPxNz0630H/aUnTM8AgxCe0V9GHu7pHj7+NC3bx9DZbxcmDx5ciU2/hIE7aGeitaDfqPCmKnHkolb+XOZ7ywibD6Uxjd/JLH7WGaVB5ez8gqZF3+EhONZFx1L2beT4PBGFaScAjQDDgGjDOVpMpkcNstHCfRlgv6BwtK8BPwNRKCZOiqn03X9iF+1CIC4lYs4sv9vEv/+i/9t+JMZG5LYkZJOanZ+hWJ9Lr+I3ccy+WXncT5fd5DvV28j8e+/OLL/b3asXQJA/G//I37VItJOHqukJB3RXrdBsynafyjlnDtHbKzxQdH6SlxcHDfeeCNxcXE8/fTTldj4S3MC7WEI8BzQq+Lzr1zE35tXk7JvF2knj9q+z84v4te/TzB3awrH0nN1l/dcfhF/pqTz3ZbDnMgof7u7rSt+LpPXee5G2wKuGM20cbG4V0ZgYCDt2rVzyNRSZYO+jDhvhzZCZ2Az4M75gUPjlLY5Avh4mAnwciPAyx0PNxeOnM3lTHY+pVujfltzmTOjDVi1BZagTRvU18THjx9P//79adCggW57Yn3lySefZMqUKTz55JP06NGDoUOHGujVfo72BnMYbZA53W6KC9tHCa3CfWkU6EWwjzuB3u74e7raTFDZ+UUknspm/8ksjqbnUl7x0k4e5fihveSdy2bBtPHkZmdeEKMR2nhLEPAm8IrOOlaMvetkRNeUQF9GVE2gAV4E3kbbcLYnWoPWh8nFhVtHvkCvO4YZzjV+1SK+e+8FLMVG7Ngz0XpBR9AeLmcM5wuOmb/t7CQnJ5OamorJZKJ///6cOnWKsLAwfvnlF9avX89TT9kzK5XgA2wHWgHz0XqoFePlG8BjE78iqnVHu2d2M5sI8HbHzcXEicy8ckW5NJU/5E3ACuAmYAvaZspVX0Dj6urKjBkz7E65UwKtKJcjR45Uaad0beDkF6AvkAT0AE4bOkNFPaTySNm3k/99MYmBjzyLyeTCB6Pu0Jnyn2hzcYvQpkptMFRG0H+T1UdKeqYl/0upWTnG6Q6sR3vzeg14vdLYXXoPoPddD+ETEFSJndg48asW8e27z1VQh2eA99CmkXYB9lcvr/h4XVNL1SwORbk0btyY6dOnV8EWXQzcA+wDmqLNlXbXnfqWB580lFvpAcESSotH+bTn/DS6V6iKOIM2f/tyFGcoO05RImglf81mM35+fgbOtpXz0zNfQ5tTXDHb1yzhwyfu5M2hN7Jr42+k7NvJJ88+WGa2R1VodkUM9z33bjlHrkR7KwR4Gj3ibDK5EBQajtlstn7W2qQjFzQpgb7MGD58OJs3b65CynTgVuvf67C3GKE0J5LtL8dOO3mUlH27ygwIbl+zlKyzqXj6+hMSGc1N9z6Ki7m8lW3ewDzr31/Rlh7rozZuskuFIUOGVNg2tmzZwunTp/n6668NPOCnAyVTImegvXnZ5+tx/yr3IV0V3hx6I9++8+wF3wairSh1B34CvtR1rm/WJXDs6BH27NlDeHg43bp147PPPiMmJoaIiAiHLGhSJo7LkAtt0cZeY29G801gBsYAk+2mcHP3ZPSH3yIi+AQEcS4jzWbCKLE7Vm1AELQ+xrdoPbRjaHZnfeaX4OBgWrRoUWbV4NatW2ncuHEVy3LpU9I2SnxxlPwt/fpubCzDBU0EB6LN8uiONj5QMW6eXri6upObnYG3fyCPTfja1nb0mD9KTGTdb76d377/glMph0rNQjGjDR73QxvEjEGbGmifvMIiPFy1DkJ+fn6VFzQpG7SiUo4cOUKbNm3IycnhhhtuIDs7m527dpGXq3daU8mqsWI0r1/LDOV/7aChrP95FtfdNpTbH9ecGFU2IFjxA8SE1vt5CChEs5Gv1V2OjRs3ctVVV6lVg6U4cuQI3bt3JyoqqsIHl/HBZl80k1MnNL8d11IV9wFgfywjZd9Ovn5tFBmpJ3H39KIgL5cOV9/A35tWW2N8iGbSOIc2KPinrnxfGfc6gwYOqJEZPkqgFeVSepT+lltu4fTp04SFhbF06VK6detm8GwlU6ky0G64XbpT+gYGk52ehm9gCCPf+sLWO8rJTC93QDB2wL1sXPo9Fw/ZT0VbVFCM1oP+0W7eHp5etGndilOnTl32veWKsNc7LBFxT08vkpKTyvldyiMabaZEOLAQuBO90x8BXMxm7vv3RGJuurXc42knj3Iu4yy/zprK7s2ry42jzdH+wvr/HdZyGKe6kqkEWlEuNTtK7wasBK5H84I3kKoOzJUwdtoCPhh1h84yTQL+jbZC8EG05cX2WbR8Nf/Xp5fqLVeTEhH/eeV6br/5ep2prgbWoHkW/AZNMPVNaxs7bQGNW3Uo91jayaN2HCCB1k5XorXb/wBv6cq3NDU1w0fN4lCUS2Wj9K6urowZM8bA2QqB29BEOQit8d9WpXK5mM0MeX4SvoEheHr7gslESGRl0wFfRxNngJHoEWcXs5mA4BC6tGupfGzUACU+S6JDjDg42oT2MC1CW7m3AKi+10n74twU7e3KDfiOqogz1M0MHyXQlxGVjdJv3ryZBx54ANAzpa2Es2i7afyMdqPNR3OuZIynP55HWFQzvnnzKTy8fRGLhTPHUyqI/QLwqvX/0ZzfBaZivHz9eXbKXBb99DPFhha9KOwRFhaGr6+vgRQ/oJkXctHeupYDAZWmcPf0xjfwYl8wW1cs5OU7utPxmr6VpPYDFqH5d44DRhgoqxOgeyOtOqA6exIqyufCfehK73Jesht4t27dZPhzb0lks7Y696Yzi7bZbMmehm8Y2tuu75BREt32Sjvx/AW+LJXHs4byKB0UNUteXp58/NUcg7/DdQLp1t9yh0BEpfEfev1TaXnlVTJm6nz5YPleGTN1vrh5eNjJo7nALmseRwUaVqm9tG/fvkY3mlabxioqpESEK9rlvGSD3ZMZuTJ5xV55e2G83HTfYzob86ulBHS6QGCVRbRs6COQbD1vscCLVTqPq6urzJ49u45/gfpJ1XYI7yRw3Pq7JloFtfI07p7ecsuDo6VZhxg7cW8SOFNKnDvbPffdT40X0HarL/03Li6uRjeaVgKtqBS9u5xvOpAqHyzfa/Cme0SgyHpjpAk8J+BVRWH2EfiklOgnClxbZaGPj4+vzct8WZGSkiLh4eHSuEVb8fD2FbOru87fpZn1dxWBVIHHRXsjq84D/alSbXCj2NuRGxC/oAby9MfzJCA4VGK6dSu381JTOIVAv/nmmxIbGyteXl4SEBBQpXMoga5biostMndLsgx5fpLBG+QmgZ2lhPWIVbj13nieArcKHCh1jqlWwdZfjpIeUGkzjsJx5OXlSdLpbJm0ZKc8PWW+gd8qXGBrqd96p2hvTUaF2V3g61LnmS5gzwyC9L7zn/Lu4p3y0cp9knwqXVfnpToY0TWHDRIWFBRw9913869//ctRWSgcjIuLiX4dIojtd5sOB/mlWYXm62AYkIzm0vFzNN/SrwJD0DakDS+VpgMwFm2p9lm0gcfm1vQ3AU+gd3GDh6c3PgHBtGjfyeFLcRXn8fDwoEkDH3q0DMc/OBS/oAb4BYXqSHkSbQre42ir+q5A8zL3M5pHPHtEo61qjUNzmFWMthjln0Dlm9K6e3px/R3DcXV35+rmIUSHBjjVjjoOnwc9Y8YMnn76adLT0w2nVfOgnYO/jqTzzaLVBrzKlcYdzWnOf4DybtZz1nCheB5B868xDqMO1N9dvBNfTzPDr2uFl7urWiVYyxRbhG+3HObEmSy2r1nCd+/Z3xn7PIFov/kotGlxBWhblu29IFjQZoPcBVxVKn0ammOvVbpz/GD5XhoFeXF3TGMDM5iqjhFdc6pdvfPz88nPP//Ey8y80Lm2oi7o1DiQds0b4+0XSE5WusHUBcDHaI5z/om220lzoAUQheY72Adt2tVatB70r0BClcraf9hTuHt4MCimMV7uWvN2hp7Q5YTZxUT/KyL4bnMBrbrE4hsYgqu7O+mnjutInY7WG/4MeB9tp/BeVLY7iybW69Ae6D+g17cGwO3/ehkPNxduuSKiVsTZKE4l0BMmTOD11yv3G6uoG+67oQunPl/AxMfvwTewAWdOHKawoAAp1uvgPAtNqEvjBjRB2+/wT6D8rYr04uHlQ/eb7+CaliE0DPSq1rkU1aOBrwfXtmrAGovw6uw1ZKWf4b3HBpGbnaHzDHvR/Lx0RPPh0aZUaIW2GnEN2tz7hWhmEmM8Ofl7mrbvzI1tw/D3rHiT27rEkEC/8MILvPNO5a4cExISaNu2bZUK8+KLLzJ27Fjb58zMzCo6mFfUND4eroz4Ryxe365BXFwpLizk2KG9TB59VzXOWggkWkP1GfL8JLq0a0FMk6AaOZ+ienSJDuJUVj67j2USFBbJmKnzmTLmPgJCwmnZ5SrWzPtax1l2cvEOPiY001nl9uUKMZlABFc3N9pG+NE2wnnNp4YE+plnnmH48OGVxmnevHmVC+Ph4aFeRZ2YcH9P/tE5mqU7j+Pq7o5/cCg+AUHkZmfi4xdEVrr+V8uqY8LL1x8XswvB4Y246pa72bxsHumnj9Pmik706+Ccr6qXK33ahZORU8jR9FwaNIzmlVmrMbu5kZF6ko2LfyA/N7sKZxWMirOXrz8hkVH0uPkOtq74ifTTx4mICOeGts49cKwGCRWG+SMxlc2H0gAoKihARHB1d+dk8gE+ee5BvP38SD99koI8/bsy62XUe3No0rYTAGY3N5tjJSkqYnBsMxoHedd4norqkVNQxHdbUsjMLSzzfeqxw3z01GACQyMJbhjFznXG3Nba45pbh3Do721knjnFk5PnEhIZdd4RV3ERg2Ob06gOTGFOMUh4+PBh0tLSOHz4MMXFxezYsQOAli1bGly7r3A2YluEcOZcAYmnsnF1P7/1VUTTlrw6ew1mNzeKCwuxWCzk556jID+PnOwsLBYLeeeyKSwswFJcaPWmByZcEAQPTx98AgIpyMvDUlyEb0AggQ0iKC4qpLioEHcPTzx9Lm47JpOJ69pHKnF2UrzdXRnUuSHfb02hoMhi+75Bw2jGzVlre9CePXUcL98AEAsFhQWkHj2Mp68vhflaJyD91DEsYsHVzR1XN08KC3KR4iK8fAPw9tNCcWE+nt6+uLl74OXrh4hQXFhYpp2aTCb6dGxcJ+JsFIf1oIcPH84333xz0ferV6+md+/eus6hetDOS0GRhR/iUjidVUU7YA3SJTqQ3m2c+1VVAQdPZ7Poz2P63Ec7kM5RgXVq2lD+oBW1QmZeIXO3HOZcft15iOvYKIA+7cPtR1Q4BfHJZ1m3z9iO8DVJkxBvbuvcCBeXuhunUP6gFbWCv6cbt3VphK9H3czWbBfpz03tVM/5UiKmSRCdowLrJO8gbzf+0TGyTsXZKEqgFdUizM+Te7pHEeRdu/NIW4f7cXP7cDVj4xLkhrZhXNUsuFbz9HBz4dbOjfB0K29XeOdFCbSi2gR4uTG4ezSRAdXfHUMPzUN9uOWKiEuqJ6QoS8+WDejVJpTaeL66mEwM6BhJsI+7/chOhhJoRY3g5W7mzpjGNA81sgWScVqG+TKgYyRmJc6XPF2jg+jXIQIXB6q02cVE3/bhNDG0NZfzoARaUWO4mV0Y2KkhHRrW/ICuh5sLN3cIZ+CVDXE1q2ZbX2gX6c+tnRviZq55kfbxMHNXTGPaO6A91haqpStqFBcXEzd3iKBv+3D8PGtm8LBpA2+GXt2EDg0DauR8CueiWQMf7ujauEYHm8P9PbmvR/Ql75NFTbNTOIyiYgt/Hslga1IauQXGp+K5u7pwfatQOjZWwnw5UFBkYWtSGtuSz1JkqbostYv0o0+7cKd901LzoBVORX5RMfFJZ9mekl5mJVl5mEyaJ7SmIT50bBxAgJdzehlTOI6M3ELW709l30ljfsBdTCauaRlCt6a1O0PEKEqgFU5JbkExJzLzyMgtLBPyC4tpHORFdLAPTUK88amjedUK5+LI2Rx+35/Kycy8Clcfml1MRAV70SrMjxahvni5O/80OqfwxaFQXIiXu5lmDS7N0XRF7dM4yJv7ekRTUGQhPbeAs+cKOZtTwNlzBRRZhOahPrQI9b3k5jYbQQm0QqFwatxdXQjz8yTMr3bm2TsTzmlFVygUCoUSaIVCoXBWlEArFAqFk6IEWqFQKJwUJdAKhULhpCiBVigUCidFCbRCoVA4KUqgFQqFwklRAq1QKBROihJohUKhcFKUQCsUCoWTogRaoVAonBQl0AqFQuGkKIFWKBQKJ0UJtEKhUDgpSqAVCoXCSVECrVAoFE6KwwQ6KSmJESNG0KxZM7y8vGjRogXjxo2joKDAUVkqFApFvcJhW17t2bMHi8XCf//7X1q2bMmuXbt45JFHOHfuHO+9956jslUoFIp6Q63u6j1p0iQ+/fRTDh48qCu+2tVboVDUN5x2V++MjAyCg4MrPJ6fn09+fr7tc2ZmZm0US6FQKJySWhskTExMZMqUKTz66KMVxpkwYQIBAQG2EBUVVVvFUygUCqfDsEC/8MILmEymSsOePXvKpDl69Ci33HILd999N4888kiF537xxRfJyMiwhZSUFOM1UigUinqCYRv06dOnOXPmTKVxmjdvjru7OwDHjh2jd+/eXH311cyYMQMXF/3PBGWDVigU9Q2H2qBDQ0MJDQ3VFffo0aPccMMNxMTEMH36dEPirFAoFJc7DhskPHr0KL1796ZJkya89957nD592nYsIiLCUdkqFApFvcFhAr1ixQoSExNJTEykcePGZY7V4sw+hUKhuGRxmM1h+PDhiEi5QaFQKBT2UUZhhUKhcFKUQCsUCoWTogRaoVAonBQl0AqFQuGkKIFWKBQKJ0UJtEKhUDgpSqAVCoXCSVECrVAoFE6KEmiFQqFwUpRAKxQKhZOiBFqhUCicFCXQCoVC4aQogVYoFAonRQm0QqFQOClKoBUKhcJJUQKtUCgUTooSaIVCoXBSlEArFAqFk6IEWqFQKJwUJdAKhULhpCiBVigUCidFCbRCoVA4KUqgFQqFwklRAq1QKBROihJohUKhcFKUQCsUCoWTogRaoVAonBSHCvStt95KdHQ0np6eREZGMnToUI4dO+bILBUKhaLe4FCBvuGGG/jhhx/Yu3cvP/74IwcOHOCuu+5yZJYKhUJRbzCJiNRWZosWLeK2224jPz8fNzc3u/EzMzMJCAggIyMDf3//WiihQqFQOBYjuuZaS2UiLS2NOXPm0LNnzwrFOT8/n/z8fNvnjIwMQKuQQqFQ1AdK9ExX31gczHPPPSfe3t4CyNVXXy2pqakVxh03bpwAKqigggr1PqSkpNjVT8MmjhdeeIF33nmn0jgJCQm0bdsWgNTUVNLS0khOTub1118nICCAxYsXYzKZLkp3YQ/aYrGQlpZGSEhIufErIjMzk6ioKFJSUuqtaaS+11HV79KnvtexqvUTEbKysmjYsCEuLpUPAxoW6NOnT3PmzJlK4zRv3hx3d/eLvj9y5AhRUVH88ccfxMbGGsnWEJeD7bq+11HV79KnvtexNupn2AYdGhpKaGholTKzWCwAZXrJCoVCoSgfhw0Sbt68ma1bt3LttdcSFBTEgQMHeOWVV2jRooVDe88KhUJRX3DYPGhvb28WLFjATTfdRJs2bRgxYgSdOnVi7dq1eHh4OCpbADw8PBg3bpzD86lL6nsdVf0ufep7HWujfrU6D1qhUCgU+lG+OBQKhcJJUQKtUCgUTooSaIVCoXBSlEArFAqFk3LJCvS0adNo2rQpnp6eXHXVVWzZsqXS+PPmzaNt27Z4enrSsWNHli5dWkslrTpG6vjFF19w3XXXERQURFBQEH369LF7Teoao79hCXPnzsVkMnHbbbc5toDVxGj90tPTGTVqFJGRkXh4eNC6dWunb6dG6zh58mTatGmDl5cXUVFRjBkzhry8vFoqrTHWrVvHwIEDadiwISaTiZ9++slumjVr1tC1a1c8PDxo2bIlM2bMqF4hasThRi0zd+5ccXd3l6+//lr+/vtveeSRRyQwMFBOnjxZbvwNGzaI2WyWd999V3bv3i3/+c9/xM3NTXbu3FnLJdeP0Tref//9Mm3aNNm+fbskJCTI8OHDJSAgQI4cOVLLJdeH0fqVcOjQIWnUqJFcd911MmjQoNopbBUwWr/8/Hzp1q2b/OMf/5D169fLoUOHZM2aNbJjx45aLrl+jNZxzpw54uHhIXPmzJFDhw7Jr7/+KpGRkTJmzJhaLrk+li5dKi+//LIsWLBAAFm4cGGl8Q8ePCje3t4yduxY2b17t0yZMkXMZrMsW7asymW4JAW6R48eMmrUKNvn4uJiadiwoUyYMKHc+Pfcc48MGDCgzHdXXXWVPProow4tZ3UwWscLKSoqEj8/P/nmm28cVcRqUZX6FRUVSc+ePeXLL7+UYcOGObVAG63fp59+Ks2bN5eCgoLaKmK1MVrHUaNGyY033ljmu7Fjx8o111zj0HLWBHoE+rnnnpMOHTqU+W7w4MHSr1+/Kud7yZk4CgoKiI+Pp0+fPrbvXFxc6NOnDxs3biw3zcaNG8vEB+jXr1+F8euaqtTxQnJycigsLCQ4ONhRxawyVa3fG2+8QVhYGCNGjKiNYlaZqtRv0aJFxMbGMmrUKMLDw7niiit4++23KS4urq1iG6IqdezZsyfx8fE2M8jBgwdZunQp//jHP2qlzI7GETpTa/6ga4rU1FSKi4sJDw8v8314eDh79uwpN82JEyfKjX/ixAmHlbM6VKWOF/L888/TsGHDixqMM1CV+q1fv56vvvqKHTt21EIJq0dV6nfw4EF+++03hgwZwtKlS0lMTOTxxx+nsLCQcePG1UaxDVGVOt5///2kpqZy7bXXIiIUFRXx2GOP8dJLL9VGkR1ORTqTmZlJbm4uXl5ehs95yfWgFfaZOHEic+fOZeHChXh6etZ1capNVlYWQ4cO5YsvvqBBgwZ1XRyHYLFYCAsL4/PPPycmJobBgwfz8ssv89lnn9V10WqMNWvW8Pbbb/PJJ5+wbds2FixYwJIlSxg/fnxdF81pueR60A0aNMBsNnPy5Mky3588eZKIiIhy00RERBiKX9dUpY4lvPfee0ycOJGVK1fSqVMnRxazyhit34EDB0hKSmLgwIG270o8I7q6urJ3715atGjh2EIboCq/X2RkJG5ubpjNZtt37dq148SJExQUFJTrvrcuqUodX3nlFYYOHcrDDz8MQMeOHTl37hwjR47k5Zdftusb2dmpSGf8/f2r1HuGS7AH7e7uTkxMDKtWrbJ9Z7FYWLVqVYVe8mJjY8vEB1ixYoXTetWrSh0B3n33XcaPH8+yZcvo1q1bbRS1ShitX9u2bdm5cyc7duywhVtvvZUbbriBHTt2EBUVVZvFt0tVfr9rrrmGxMRE24MHYN++fURGRjqdOEPV6piTk3ORCJc8kKQeuARyiM5UeXixDpk7d654eHjIjBkzZPfu3TJy5EgJDAyUEydOiIjI0KFD5YUXXrDF37Bhg7i6usp7770nCQkJMm7cuEtimp2ROk6cOFHc3d1l/vz5cvz4cVvIysqqqypUitH6XYizz+IwWr/Dhw+Ln5+fPPHEE7J3715ZvHixhIWFyZtvvllXVbCL0TqOGzdO/Pz85LvvvpODBw/K8uXLpUWLFnLPPffUVRUqJSsrS7Zv3y7bt28XQD744APZvn27JCcni4jICy+8IEOHDrXFL5lm9+yzz0pCQoJMmzbt8pxmJyIyZcoUiY6OFnd3d+nRo4ds2rTJdqxXr14ybNiwMvF/+OEHad26tbi7u0uHDh1kyZIltVxi4xipY5MmTcrd92zcuHG1X3CdGP0NS+PsAi1ivH5//PGHXHXVVeLh4SHNmzeXt956S4qKimq51MYwUsfCwkJ57bXXpEWLFuLp6SlRUVHy+OOPy9mzZ2u/4DpYvXp1ufdUSZ2GDRsmvXr1uihN586dxd3dXZo3by7Tp0+vVhmUu1GFQqFwUi45G7RCoVBcLiiBVigUCidFCbRCoVA4KUqgFQqFwklRAq1QKBROihJohUKhcFKUQCsUCoWTogRaoVAonBQl0AqFQuGkKIFWKBQKJ0UJtEKhUDgpSqAVCoXCSfl/odRdsh3adz0AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Put model & likelihood into eval mode\n", "model.eval()\n", "likelihood.eval()\n", "\n", "# Initalize plot\n", "f, ax = plt.subplots(1, 1, figsize=(4, 3))\n", "\n", "# The qpytorch.settings.fast_pred_var flag activates LOVE (for fast variances)\n", "# See https://arxiv.org/abs/1803.06058\n", "with torch.no_grad(), qpytorch.settings.fast_pred_var():\n", " test_x = torch.linspace(0, 1, 51)\n", " prediction = likelihood(model(test_x))\n", " mean = prediction.mean\n", " # Get lower and upper predictive bounds\n", " lower, upper = prediction.confidence_region()\n", "\n", "# Plot the training data as black stars\n", "def ax_plot():\n", " if smoke_test: return # this is for running the notebook in our testing framework\n", " \n", " ax.plot(train_x.detach().numpy(), train_y.detach().numpy(), 'k*')\n", " # Plot predictive means as blue line\n", " ax.plot(test_x.detach().numpy(), mean.detach().numpy(), 'b')\n", " # Plot confidence bounds as lightly shaded region\n", " ax.fill_between(test_x.detach().numpy(), lower.detach().numpy(), upper.detach().numpy(), alpha=0.5)\n", " ax.set_ylim([-3, 3])\n", " ax.legend(['Observed Data', 'Mean', 'Confidence'])\n", "\n", "ax_plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## KISS-QEP for 2D-4D Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For 2-4D functions, SKI (or KISS-QEP) can work very well out-of-the-box on larger datasets (100,000+ data points).\n", "Kernel interpolation for scalable structured Gaussian processes (KISS-GP) was introduced in this paper:\n", "http://proceedings.mlr.press/v37/wilson15.pdf\n", "\n", "One thing to watch out for with multidimensional SKI - you can't use as fine-grain of a grid. If you have a high dimensional problem, you may want to try one of the other scalable regression methods." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set up train data\n", "\n", "Here we're learning a simple sin function - but in 2 dimensions" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# We make an nxn grid of training points spaced every 1/(n-1) on [0,1]x[0,1]\n", "n = 40\n", "train_x = torch.zeros(pow(n, 2), 2)\n", "for i in range(n):\n", " for j in range(n):\n", " train_x[i * n + j][0] = float(i) / (n-1)\n", " train_x[i * n + j][1] = float(j) / (n-1)\n", "# True function is sin( 2*pi*(x0+x1))\n", "train_y = torch.sin((train_x[:, 0] + train_x[:, 1]) * (2 * math.pi)) + torch.randn_like(train_x[:, 0]).mul(0.01)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The model\n", "\n", "As with the 1D case, applying SKI to a multidimensional kernel is as simple as wrapping that kernel with a `GridInterpolationKernel`. You'll want to be sure to set `num_dims` though!\n", "\n", "SKI has only one hyperparameter that you need to worry about: the grid size. For 1D functions, a good starting place is to use as many grid points as training points. (Don't worry - the grid points are really cheap to use!). You can use the `qpytorch.utils.grid.choose_grid_size` helper to get a good starting point.\n", "\n", "If you want, you can also explicitly determine the grid bounds of the SKI approximation using the `grid_bounds` argument. However, it's easier if you don't use this argument - then QPyTorch automatically chooses the best bounds for you." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "class QEPRegressionModel(qpytorch.models.ExactQEP):\n", " def __init__(self, train_x, train_y, likelihood):\n", " super(QEPRegressionModel, self).__init__(train_x, train_y, likelihood)\n", " self.power = torch.tensor(POWER)\n", " \n", " # SKI requires a grid size hyperparameter. This util can help with that\n", " grid_size = qpytorch.utils.grid.choose_grid_size(train_x)\n", " \n", " self.mean_module = qpytorch.means.ConstantMean()\n", " self.covar_module = qpytorch.kernels.ScaleKernel(\n", " qpytorch.kernels.GridInterpolationKernel(\n", " qpytorch.kernels.RBFKernel(), grid_size=grid_size, num_dims=2\n", " )\n", " )\n", "\n", " def forward(self, x):\n", " mean_x = self.mean_module(x)\n", " covar_x = self.covar_module(x)\n", " return qpytorch.distributions.MultivariateQExponential(mean_x, covar_x, power=self.power)\n", "\n", " \n", "likelihood = qpytorch.likelihoods.QExponentialLikelihood(power=torch.tensor(POWER))\n", "model = QEPRegressionModel(train_x, train_y, likelihood)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Train the model hyperparameters" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 12 s, sys: 410 ms, total: 12.4 s\n", "Wall time: 2.09 s\n" ] } ], "source": [ "# Find optimal model hyperparameters\n", "model.train()\n", "likelihood.train()\n", "\n", "# Use the adam optimizer\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.1) # Includes QExponentialLikelihood parameters\n", "\n", "# \"Loss\" for QEPs - the marginal log likelihood\n", "mll = qpytorch.mlls.ExactMarginalLogLikelihood(likelihood, model)\n", "\n", "def train():\n", " for i in range(training_iterations):\n", " optimizer.zero_grad()\n", " output = model(train_x)\n", " loss = -mll(output, train_y)\n", " loss.backward()\n", " optimizer.step()\n", "\n", "%time train()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Make predictions with the model" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVkAAAEpCAYAAAA50FEaAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAANnZJREFUeJzt3XtYVNX+P/D3DDIziICIAaIIaCZeSFQUUUtNjniijJP3Y0keH/N0wBsd85KKlwrNNC1Usl/aDb6YJ+N4TO0gXqoj3kArupB1UEgd0G8GhnGbWb8//DI17kH2xr1D4P16nv2Ua9Z89ocBPqxZs9faOiGEABERaULf2AkQETVnLLJERBpikSUi0hCLLBGRhlhkiYg0xCJLRKQhFlkiIg2xyBIRaYhFlohIQy26yJ47dw46nQ4vvfTS73reJ554AoGBgb/rOUkdNTU1eOaZZ+Dv7w+9Xo+YmJjGTonucM26yG7evBk6nQ7h4eGNnYpq9u7di+XLl6sed/ny5dDpdHUeZrNZ9XOqwWq14u2330Z4eDjatWsHNzc33HPPPZg6dSqOHTum+vm2bduGtWvXYty4cXjrrbcwb9481c9BzUurxk5AS6mpqQgMDMSJEyfw3Xff4e67727slG7b3r17sWnTJk0KLQBs2bIFbdq0kbS3bdtWk/PdrtmzZ2PTpk145JFHMGXKFLRq1Qr5+fnYt28funTpgkGDBql6voMHD6Jjx454+eWXVY1LzVezLbIFBQU4evQodu3ahZkzZyI1NRWJiYmNndYdb9y4cWjfvr2i51RUVMBgMECvl74xKi8vh6ura4PzsVqtqKqqgslkkjxWXFyMzZs3Y8aMGdi6davdYxs2bMDly5cbfN7fEkKgoqICLi4uKCkpuWP/4NCdqdlOF6SmpsLT0xPR0dEYN24cUlNTb9n/5ZdfRkBAAFxcXDBs2DDk5eXZPW42mzFt2jR06tQJRqMRHTp0wCOPPIJz587Z9du8eTN69eoFo9EIPz8/xMXF4aeffrrluQ8fPgydTofDhw/btdfOGb/55psAbszlbtq0CQDs3srXslqt2LBhA3r16gWTyQQfHx/MnDkTV69eveX5lajNNT09HUuWLEHHjh3RunVrlJWV4YknnkCbNm3w/fff48EHH4SbmxumTJkC4Eaxffrpp+Hv7w+j0Yju3bvjpZdews2bwOl0OsTHxyM1NdX2Ou7fv99hLgUFBRBCYMiQIZLHdDodvL29bf+unQ652ZtvvgmdTmf3fQwMDMRDDz2Ejz76CGFhYXBxccFrr70GnU6HQ4cO4csvv7S99rXfs5deegmDBw+Gl5cXXFxc0L9/f/zjH/9wmPe7776LgQMHonXr1vD09MT999+Pf//733Z99u3bh/vuuw+urq5wc3NDdHQ0vvzyS4fx6M7WbEeyqampePTRR2EwGDB58mRs2bIFJ0+exIABAyR93377bVy7dg1xcXGoqKjAxo0b8cADD+CLL76Aj48PAGDs2LH48ssvMWvWLAQGBqKkpASZmZkoLCy0fYi1fPlyrFixApGRkXjqqaeQn59vO+9//vMfODs739bXNHPmTFy8eBGZmZl45513HD7+5ptvYtq0aZg9ezYKCgqQnJyM06dPyz7/jz/+KGlr1aqVZPS2atUqGAwG/P3vf0dlZSUMBgOAGx8MRUVFYejQoXjppZfQunVrCCEwZswYHDp0CNOnT0doaCg++ugjzJ8/HxcuXJC89T548CDee+89xMfHo3379nV+SBgQEAAA2LlzJ8aPH4/WrVvX+/XJlZ+fj8mTJ2PmzJmYMWMGOnXqhHfeeQfPP/88fv75ZyQlJQEAevToAQDYuHEjxowZgylTpqCqqgrp6ekYP3489uzZg+joaFvcFStWYPny5Rg8eDBWrlwJg8GA48eP4+DBgxg1ahQA4J133kFsbCyioqKwZs0aXL9+HVu2bMHQoUNx+vRpfmja1Ihm6NSpUwKAyMzMFEIIYbVaRadOncScOXPs+hUUFAgAwsXFRfzwww+29uPHjwsAYt68eUIIIa5evSoAiLVr19Z5zpKSEmEwGMSoUaOExWKxtScnJwsAYtu2bba22NhYERAQYPv3oUOHBABx6NAhh/lt377d1hYXFyccfds++eQTAUCkpqbate/fv99h+80SExMFAIdH9+7dJbl26dJFXL9+3S5GbGysACAWLlxo156RkSEAiOeee86ufdy4cUKn04nvvvvO1gZA6PV68eWXX94y31pTp04VAISnp6f405/+JF566SXx9ddf1/n13Wz79u0CgCgoKLC1BQQECABi//79kv7Dhg0TvXr1krTf/FpUVVWJ3r17iwceeMDWdvbsWaHX68Wf/vQnu58RIW78jAohxLVr10Tbtm3FjBkz7B43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ueOL7HvvvYfU1FSkpaWhV69eOHPmDObOnQs/P787PndS5o4ssu3bt4eTkxOKi4vt2ouLi+Hr69tIWckXHx+PPXv24OOPP1a8rWNjyMnJQUlJCfr162drs1gs+Pjjj5GcnIzKyko4OTk1YoaOdejQAT179rRr69GjB95///1Gyki++fPnY+HChZg0aRIAICQkBOfPn0dSUhKLbDNzR87JGgwG9O/fH1lZWbY2q9WKrKwsRERENGJmtyaEQHx8PD744AMcPHgQQUFBjZ2SLCNHjsQXX3yBM2fO2I6wsDBMmTIFZ86cuSMLLAAMGTJEconct99+i4CAgEbKSL7r169LNsZ2cnKC1SrjTq/UtDT2J291SU9PF0ajUbz55pviq6++Ek8++aRo27atMJvNjZ1anZ566inh4eEhDh8+LC5dumQ7rl+/3tipKdYUri44ceKEaNWqlXj++efF2bNnRWpqqmjdurV49913Gzu1esXGxoqOHTuKPXv2iIKCArFr1y7Rvn178cwzzzR2aqSyO7bICiHEq6++Kjp37iwMBoMYOHCgOHbsWGOndEsAHB7bt29v7NQUawpFVggh/vWvf4nevXsLo9EogoODxdatWxs7JVnKysrEnDlzROfOnYXJZBJdunQRzz77rKisrGzs1Ehl3OqQiEhDd+ScLBFRc8EiS0SkIRZZIiINscgSEWmIRZaISEMsskREGmKRJSLSEIssEZGGWGSJiDTEIktEpCEWWSIiDbHIEhFp6P8D2khE3qUNj2YAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Set model and likelihood into evaluation mode\n", "model.eval()\n", "likelihood.eval()\n", "\n", "# Generate nxn grid of test points spaced on a grid of size 1/(n-1) in [0,1]x[0,1]\n", "n = 10\n", "test_x = torch.zeros(int(pow(n, 2)), 2)\n", "for i in range(n):\n", " for j in range(n):\n", " test_x[i * n + j][0] = float(i) / (n-1)\n", " test_x[i * n + j][1] = float(j) / (n-1)\n", "\n", "with torch.no_grad(), qpytorch.settings.fast_pred_var():\n", " observed_pred = likelihood(model(test_x))\n", " pred_labels = observed_pred.mean.view(n, n)\n", "\n", "# Calc abosolute error\n", "test_y_actual = torch.sin(((test_x[:, 0] + test_x[:, 1]) * (2 * math.pi))).view(n, n)\n", "delta_y = torch.abs(pred_labels - test_y_actual).detach().numpy()\n", "\n", "# Define a plotting function\n", "def ax_plot(f, ax, y_labels, title):\n", " if smoke_test: return # this is for running the notebook in our testing framework\n", " im = ax.imshow(y_labels)\n", " ax.set_title(title)\n", " f.colorbar(im)\n", "\n", "# Plot our predictive means\n", "f, observed_ax = plt.subplots(1, 1, figsize=(4, 3))\n", "ax_plot(f, observed_ax, pred_labels, 'Predicted Values (Likelihood)')\n", "\n", "# Plot the true values\n", "f, observed_ax2 = plt.subplots(1, 1, figsize=(4, 3))\n", "ax_plot(f, observed_ax2, test_y_actual, 'Actual Values (Likelihood)')\n", "\n", "# Plot the absolute errors\n", "f, observed_ax3 = plt.subplots(1, 1, figsize=(4, 3))\n", "ax_plot(f, observed_ax3, delta_y, 'Absolute Error Surface')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Scaling to more dimensions\n", "\n", "If your data is high dimensional, try one of the following methods:\n", "\n", "1. SKIP - or [Scalable Kernel Interpolation for Products](./Scalable_Kernel_Interpolation_for_Products_CUDA.ipynb)\n", "2. KISS-QEP with [Deep Kernel Learning](../06_PyTorch_NN_Integration_DKL/KISSQEP_Deep_Kernel_Regression_CUDA.ipynb)" ] } ], "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.12.12" } }, "nbformat": 4, "nbformat_minor": 4 }