{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Recall Benchmark \n", "\n", "This notebooks measures the recall of k-MSTs computed with NN-Descent compared\n", "to the ground-truth k-MSTs. Several parameters are varied to investigate how the\n", "algorithm behaves. In particular, we vary the dataset, number of neighbors, and\n", "number of desent neighbors. The latter variable indicates how many neighbors are\n", "used in the NN Descent stage. When it is higher than the number of neighbors\n", "required for a $k$-NN network to be a single connected componenent, then normal\n", "NN Descent should find all MST edges, and the performance of the MST-descent\n", "stage is not measured well. Throughout the parameter sweep, we measure the\n", "number of neighbors required in a dataset for a $k$-NN to be a single connected\n", "component. In addition, we measure the recall and distance fraction for the\n", "global output, each boruvka iteration, and each descent iteration. The global\n", "distance fraction is computed over all edges. The Boruvka and Descent distance\n", "fraction only looks at the ground-truth edges of each boruvka iteration.\n", "\n", "The main questions we want to answer are:\n", "\n", "- How accurate is our NN-Descent for constructing $k$-MSTs?\n", "- How accurate is our NN-Descent in finding shortest edges between connected components?\n", "- How do the parameters influence NN-Descent convergence?\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "metadata": {} }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from tqdm import tqdm\n", "from scipy.sparse.csgraph import connected_components\n", "from sklearn.datasets import load_diabetes, load_iris, load_digits, load_wine, fetch_openml\n", "from sklearn.preprocessing import RobustScaler\n", "\n", "from umap import UMAP\n", "from multi_mst import KMST, KMSTDescentLogRecall\n", "from lib.drawing import draw_umap" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Datasets\n", "\n", "The cells in this section load and pre-process the datasets (where neccesary)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "metadata": {} }, "outputs": [], "source": [ "data = {}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SKLearn Diabetes" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "metadata": {} }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\jelme\\Documents\\Development\\work\\multi_mst\\multi_mst\\notebooks\\lib\\drawing.py:8: UserWarning: No data for colormapping provided via 'c'. Parameters 'cmap' will be ignored\n", " s = plt.scatter(xs, ys, c=color, s=size, edgecolors=\"none\", linewidth=0, cmap='viridis', alpha=alpha)\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X, y = load_diabetes(return_X_y=True)\n", "p = UMAP(n_neighbors=5).fit(X)\n", "draw_umap(p)\n", "data['diabetes'] = X" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SKLearn Iris" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "metadata": {} }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\jelme\\Documents\\Development\\work\\multi_mst\\multi_mst\\notebooks\\lib\\drawing.py:8: UserWarning: No data for colormapping provided via 'c'. Parameters 'cmap' will be ignored\n", " s = plt.scatter(xs, ys, c=color, s=size, edgecolors=\"none\", linewidth=0, cmap='viridis', alpha=alpha)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMIAAACYCAYAAAC29DagAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAS7ElEQVR4nO3de1xUdf7H8RfDIAioiAhyCQVEQblpKgpeQEPX9KHLblu7Wqs/N7e2rDarVTNb81G5lpW2a+uutPuo1czWMkkR5OINYVERRNRoAiSVvAxXYRiG4czvD5OHrm6FDh5kPs+/YA6c8zkM7/lezs3OYrFYEMLGadQuQIjOQIIgBBIEIQAJghCABEEIQIIgBCBBEAKQIAgBSBCEACQIQgASBCEACYIQgARBCECCIAQgQWi3tUkbMba0ql2GsDI7uR7hx2tpVQiOGk15UR52dnZqlyOsSFqEdlDMLXg6ayQEXZAEoR2amprQ2sufrCuSd7UddDodzs7OapchOoAEoR1ycnLw8/NTuwzRASQI7XCk4BjePhKErkirdgF3C7PZjF5/idrqKrVLER1AWoQfoaWlhWmJD6J1dOHL8jOYzWa1SxJWJscRfoQHHniAZnMrwyLC+ebMGapr60ne9qnaZQkrkq7RD3j++efp378/kydPJj4+nt3p6TzxzHMYjUacnJzULk9YiXSNvsfq1avp27cvbn36Eh8fT7du3Zg+bRpeXl58si1Z7fKEFUkQ/oeFi5fyWeoeEhISKD55im7dugFgNBoZHHAP1RcqVa5QWJME4X/IzTuMv0cPkpKSiBoagslkAmDz5s2MGzeO5uZmlSsU1iRBuAmTycSMyfFERERSVFLOoEGDKCoqAqCsrIzQ0FCVKxTWJkG4iZMnTxIUFMTAgUEMGzKQ8+fPU1VVxRtvr+HQsRM0NTVxoaaeusuNapcqrERmjW7i0qVLGAwGRowYQVxcHJPun8GI8FDKy8sZNCScnj17Mi1hIj1cuqtdqrASaRFuQlEUzpw5Q1hYGJ6enkyIiaaxsZEhQ4bw7ttvkpKSgqIoaDTy5+sq5J28ieLiYsLCwtq+HxYZgUmxY/fBIyxbtgwPDw+Sd+xUsUJhbRKE/9JgMFLx7SXq6upQFAUAB0cntI5OJH/8ISEhIRQWFpJ++BSKIgfluwo5xeK/5ObmEhoaSnJyMt7e3gD8Y+MW1r75Op6enhgMBtLS0hgTO5Z+nn1VrlZYiwyW/0tDQwNubm74+voyadIkDh8+zKvLX8LT05PS0lJKSkqYOXOmjA+6GHk3v0dtbS319fUEBQwgOzubmpoa7r//fglBFyTv6DXOnz9Pnz592r7ft28fY8aMYfv27QQGBjJixAgVqxMdSYJwjRMnThAREQFcOajWr18/MjIymDp1Kj4+PipXJzqSBOEa2YcK0Gg06PV6dDodiqIwY8aMthPuRNclg+VrHMjazZYBfuzK3MvkuLGMGTNG7ZLEHSItwndqa2upMSps2/45f3r1lbapU2EbJAjfyc07hHvv3mzetAmffl5qlyPuMAnCd3Z+kcwH69dib2+vdilCBRKE7xgMBpkZsmESBECv18vMkI2TIAAff/wxEydOVLsMoSIJAlcOnt13331qlyFUZPNBKC0txdHREXd3d7VLESqy+SAcOnSI4OBgtcsQKrPpICiKwunTpwkKClK7FKEymw5Cfn4+/v7+ODo6ql2KUJlNB6GyshKj0UhISIjapQiV2WwQjEYjX5eW4eXlRb9+/a5bdvVaZWE7bDYIWVlZFH9VhoODww3LTCbTTV8XXZdNBkFRFD769Aue+M2vKS0tvWG5yWSScYON6ZAgnL9wgRVvrMHQZOyI1d+2f236CF8vD4YNG0ZDQ8MNy41Go7QINsZqF+Zs/vc2jh7KISf/GN9e1NO3lwsH92YQN2E8i//wQqd5SPe2bdsoLDjK2LHjKSkpwdvb+4a71kmLYHuscl+jE1+VMv+xJ4gKDaK7iyu+Pj4MHRKKXq9nV3oWdoqZwIAB+Pv7k5iYqNpR3OTkZM6dO8eAAQPo1q0biqIwdOhQKisrr7swv7S0FEVR5ECbDbFKizB0UBD33OPLzJkz+demzTy3cCE+3ldmYmbPno2iKKSnp9Pc3MwHH3yA0Wjk0LFTuDjaExk2hJaWFmpqaqiovEifXi70dnNjwKAhzHv4l2i11mm0tm/fzp49e7hUZ+CSvoqI8DBcXFzw8fHh+PHj1/2syWTCxcXFKtsVdwerjRFe/+NScnJyiYoIbwuB2WymoaGB6upqBg4ciNFopPLCRfTVNQQPuIddael8vmMXAwcOJCQkhOUvLeHNN95g1qxZNBsu88i8+ax4beVtTWeazWYWLV7CM4uXYTAYaG1ppujEKd7883qOntQBoNForttGc3OznJZtY6x6y8cFi/9ID60F9149gCv/YA4ODjg4ONC9e3d69+6Na89eaDQazKZm6uvrmfPE75kYM4rP/r3lhk9/RVF4//33yc7O5p133ml3lyozM5O3/voPLlddZFR0NOe+PU/YoECef27hdQ8CvHjxIhUVFYwcORKAw4cPExwcjJub2+39QcTdw6Ky8xcvWR586JeWUaNGWdLS0m76M8XFxZYpMx6w7N69+wfXV1NTY/nnhxsti1/6o+Xzzz+3NBmb25a1tLRYFi1aZGltbb3h91JTU9u+PnDggKWxsfEW9kbcrTrNTYB37NjBqlWrGD58ONOnTyc2NhZnZ+e25clf7GT37lT6eXmxePHittajtraWwsJCWlpaAKioqGDgwIFMmDDhpjNVJSUl7Ny5k4ULF173enp6OvHx8Wi1WrKyshg/frzVxiei8+s0QYArd5pbvXo1zj1707ePOzg44WxvwQLkFpxkZPggjhw+RFV9I88seJKers707NmTyMhINBoNqampREVF4e/v/73b2bBhAxEREURHR7e9ptfrKS0tJTo6mszMTCZNmtTBeys6k071kTd06FBee+01/vyXdXh7efLIIw+3tQql5acpOXWSifFxfHv+AnW11fw8cSYAZ8+eJT8/n6lTp/6oQe78+fN58cUXGTZsWNvPe3h4kJ+f32H7Jjq3TneKhY+PD0tfXMKZM9+wfv36tse6BgUM4P777ycoKAgnx26UlpbyySefkJeXx+nTp5k5c2a7ZnoWLFjA22+/fd1rGo0Gs9ls1f0Rd4dO1TW6ltlsZuXKK1OnS5cuvaG/Xl9fz6y581m08GnGjY29pW1s2rQJLy+vtuuVq6urKSkpwWAwSNfIxnS6FuEqrVbLsmXLcHNzY8mSJTccS+jZsydPzp/LnqzMW97G7Nmz2bdvX9v5Ru7u7tTX199W3eLu1GmDcNUzzzxDWFgYCxYsuCEMqVn7cXV15Ztvvrmt9V/bRdJqtdI9skGdPggAc+bMISEhgXnz5mGxWDCbzaxZswZLi5GsrCx++/jvuHTp0i2t28PDg8jISLZt2wbAvffey5dffmnN8sVdoFPNGn2fxMREnJxd+e1TC6mrqSI8dDCjRtxLTZWeAt0Ztn76GQP6++Pl5UVUVFS7Hu80c+ZMXn31VWJjY/H09KSpqakD90R0RndFi3DV1CkJvPLSEnr16kXqngN8+umnWCwWhgT68YsHfk5LSwsWi4W0tDTS09Nveq3B/7JgwQLWrVuHoijY29u3zVYJ29BpZ41+rMrKSlJ2Z+Lj2YdRo0ah0+kwGAzExsZy6NAhGhsbCQwMZPDgwT+4royMDC5cuICrqyt9+vRh7Nixd2APRGdw1wfhKkVRyM3Npa6ujrCwMAoLCwkPDycgIACdTkdZWRmOjo7ExMR87/GG1atX4+npiZeXF1OmTLmDeyDU1GWCcJWiKGRnZ9PY2Iirq2vbMQGtVktDQwO5ubmYzWbCw8Px8/O74fcNBgNzn3qBx2b9jHHjxsnp2DaiywXhKrPZzP79+7l8+TJms5mwsLC27pGiKBQWFnLhwgXc3d0ZOXLkdYPrOfPms/btNykuLpbukY3oskG4ymQysW/fPsrLy+nbty/Tpk277lNer9e3nWMUHR2Nm5sbb731FqGhodjb20v3yEZ0+SBcZTQaycjI4Pjx40yZMoXhw4dft/zqGKO+vp6cQ0fZvS+blS+9QExMzHUX8YiuyWaCcFVDQwObN29Gr9fz1FNP4erqet3ynJwcVq9eTWjoEPbt38fvnljA7F89pFK14k6xuSBcpdfr+ct763Hu0Yt7I4YAoNPp+PuHm3n04YcIDg7m9JlzbPjwYw7tTVW5WtHR7qoDatbk4eHB8pdfYvaDP6OpqQk7jT3p6enkZKUxbdo0FEXB39ebXg6tZO7Zq3a5ooPdNadYdBRfX198fX2ZNfdRHvn1HLRaLf3796d///4AXG40suy11UyKj1O1TtGxbLZFuFZDQwNRQwYxOeE+UlJS2u6HWllZybffnsPJSY4ldHU2O0a4VlJSEvHx8W1Pzjl69Ch7DxzkcN5/mPqTKQQMCmHc6FEqVyk6ks13jQDOnz9PQEAAe/bsYdeuXVy8eJEebu5s2LABVxfnH16BuOvZfIuw4vVV7M7aR1RIIJ6ensyYMYOoqCi1yxJ3mE23CI8//Syfbd/J39e+yahRI/Hx8VG7JKESmw2CxWKh3tjK6VOF191ITNgmm+8aCQEyfSoEIEEQApAgCAFIEIQAJAhCABIEIQAJghCABEEIQIIgBCBBEAKQIAgBSBCEACQIQgASBCEACYIQgARBCECCIAQgQRACkCAIAUgQhAAkCEIAEgQhAAmCEIAEQQhAgiBuwZdfn+bhx55RuwyrkiCIdvtg00ds/Xgj7657T+1SrEZu+SjaraGhgVWr3uAv73+IrugIHh4eapd022z2JsDi1rm6uhITMwbFzp4JcXEczc/H0dFR7bJui3SNxC2LGxfDQ7+azcNzf6N2KbdNgiBumdls5re/+T+8+rixZs0atcu5LRIE0W61tbX06NEDNzc3qqqqePTRRykrK2Pr1q1ql3bLJAii3fLy8hg9ejTR0dEUFBSg1WpZvnw5eXl57NixA0VR1C6x3SQIol0URUFRFLRaLRqNBjs7O8xmM+7u7kyfPp28/EKSk7/AbG7t0BoKi4rZn5NntXXKrJFol6NHjxIZGdn2/YgRI8jNzaVHjx4cP36cs2fPcvHCebIOHOQPzz6Nn5+f1bb9yec76e1y5ZnX/v378/tFS5n9yweZP2f2ba9bWgTRLqe+Lm976GJtbS3//uxzUjOyOHz4MDExMfxzw3qm/WQyrYqFFxYtZuvWrRiNxtvbZomOx558mnLdKRISEhgzZgzFx4/TTWtPNyv9B0uLINolOzePlW+t5acJ4zl37hwBAYEorWa0Wi3Dhw8HIDw8nK+++oqRkUM5fvw4p06dYty4ccTFxbVrW42GJp5ftIStO3YzOmoIAwfcQ2ZmJk5OThQUFBAREsRDv/i5VfZLjiyLdluw8A8UF59Ea9fK4OAgqi830dvFkffeu3LKRXJyMqNHj6aoqIiKigp69eqFyWSitLSUWbNmERQU9L3rr66uJi8vj12pqbi5e+Bgr+Hc2TM4OjqycuVKtmzZgoODAyaTiXnz5lllnyQI4pYpikJ6ejrHjh1j86fbCQsZxNMLnsDb2xs/Pz+Kioqoq6ujurqalpYWJk6cyMaNG2lububJJ5+84bG+Op2Or7/+Gjc3N9zd3fniiy+or69nxYoV5OXlsfyVVwgIDGRAQBAevXsRGxvL4MGDrbIvEgRhFQaDgUWLF/OfgmI2Jv217R80MzMTrVZL79690el0TJo0CZPJxPr16/Hz82P2w4+Qk5uL0dBIYGAggwcPxmg0kpSURGVlJY8//jj+/v4ArH5nLX/b8D6REeEMCgrg9ddetVr9MlgWVuHs7Myf332XfWk7+NOqVTz13CJMJhPx8fFUV1dz9uxZJk2aRHZ2NiaTiZdffpmIiAiipySSk/sfpk6d2haetLQ0NBoN3t7ebSEwGo0MDRnEKy8tRqfTUdvUYtX6pUUQHeLAwRz+9tf38PLyIj4+HkVRaGlpITExkb179+Lr64tOp0Or1ZKamkpoaCiPPfYYubm5NDc3s2XLFtatW4dGc+WzOiUlhcmTJ/Piiy9y5GgBaampOGjtrVavBEF0qCNHjpCSkkJdXR1VVVXExcUxd+5c8vLyWLbidTb+cwOenp48++yz9O3bl/Hjx5OSkkJ8fDwJCQkAlJeXU1NTw8GDB9m0ZSurVq1iQuxoq9YpQRAdzmg0kpGRgV6vJz8/Hzs7O1xcXKiqqeNYQT4xMTF4eHiwLSWDyJBA7OzsSEpKAq4MyDdt2kRZWRl5eXnMnz+fxMREq9coQRB3TElJCf/a+BEGk4kzFRVoLK0YDAbKTlfgf48/FsXMiRMncHBy5qEHH6SHS3cy9ufQ1FCPd79+zJv7a6ZPn94htUkQxB1laDJytLCQ+tpa6mpr0Ov1FBWfYHfWARobL6OgIWJwIJcvX8auW3dCggMJHhhMo6mVlcuXYm9vvXHBtSQIotOoOFuJp0cfujtdudqtpVXBwf7OTGxKEIRAjiMIAUgQhAAkCEIAEgQhAAmCEIAEQQhAgiAEIEEQApAgCAFIEIQAJAhCABIEIQAJghCABEEIAP4f3XbgyRRprXIAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X, y = load_iris(return_X_y=True)\n", "p = UMAP(n_neighbors=5).fit(X)\n", "draw_umap(p)\n", "data['iris'] = X" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SKLearn Digits" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "metadata": {} }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\jelme\\Documents\\Development\\work\\multi_mst\\multi_mst\\notebooks\\lib\\drawing.py:8: UserWarning: No data for colormapping provided via 'c'. Parameters 'cmap' will be ignored\n", " s = plt.scatter(xs, ys, c=color, s=size, edgecolors=\"none\", linewidth=0, cmap='viridis', alpha=alpha)\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X, y = load_digits(return_X_y=True)\n", "p = UMAP(n_neighbors=5).fit(X)\n", "draw_umap(p)\n", "data['digits'] = X" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SKLearn Wine" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "metadata": {} }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\jelme\\Documents\\Development\\work\\multi_mst\\multi_mst\\notebooks\\lib\\drawing.py:8: UserWarning: No data for colormapping provided via 'c'. Parameters 'cmap' will be ignored\n", " s = plt.scatter(xs, ys, c=color, s=size, edgecolors=\"none\", linewidth=0, cmap='viridis', alpha=alpha)\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X, y = load_wine(return_X_y=True)\n", "X = RobustScaler().fit_transform(X)\n", "p = UMAP(n_neighbors=5).fit(X)\n", "draw_umap(p)\n", "data['wine'] = X" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Horse" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "metadata": {} }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\jelme\\Documents\\Development\\work\\multi_mst\\multi_mst\\notebooks\\lib\\drawing.py:8: UserWarning: No data for colormapping provided via 'c'. Parameters 'cmap' will be ignored\n", " s = plt.scatter(xs, ys, c=color, s=size, edgecolors=\"none\", linewidth=0, cmap='viridis', alpha=alpha)\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X = pd.read_csv('data/horse/horse.csv').to_numpy()\n", "p = UMAP(n_neighbors=20).fit(X)\n", "draw_umap(p)\n", "data['horse'] = X" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "MNIST" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "metadata": {} }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\jelme\\Documents\\Development\\work\\multi_mst\\multi_mst\\notebooks\\lib\\drawing.py:8: UserWarning: No data for colormapping provided via 'c'. Parameters 'cmap' will be ignored\n", " s = plt.scatter(xs, ys, c=color, s=size, edgecolors=\"none\", linewidth=0, cmap='viridis', alpha=alpha)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMIAAACwCAYAAABdC7H7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABCoklEQVR4nO29eXSdd3nv+3nfd8+ztDXLsmzLthzPsR1ngCROIMAJTUIYumhygFAaSrkMh17WBe4t99wDt3RdKKs9BDpBCwUOpe1pe6ANhClkAjI5jsfYlkfJkmXNW9rz8L73j+8r2c7oxFtbirO/a3nZlqW9f+/27/n9nuH7fB/DcRyHOup4jcNc6AXUUcdiQN0Q6qiDuiHUUQdQN4Q66gDqhlBHHUDdEOqoA6gbQh11AHVDqKMOoG4IddQB1A2hjjqAuiHUUQdQN4Q66gDqhlBHHUDdEOqoA3iVGkKpYgNg23UGeR3VgWehF/BSKJUrLLt8B3RdDrlpCMagpQemJ6ChE8pFOPYrOPkbwAGPH/wxPvr+O3j/B95Pa7IB27Y5euw4xVKZdZf1LvAT1bEYYSzmxpw//crf8GcPDkDraihmoVzSHeYJQX4GHCDcCOlx6H8UygWINIJhQqkEhSzE2yAzAZkxqBShmKe7JcSf/39fYPv27Qv9iHUsEixaQ+jceANccQcYDlgeGD8FTcuhMAYVE+wyBKLgmFBIQWYcZk5r8zcug0gDlCsQjEKpDOUMWEEwgOwEjB0D0wOn9xK0M/z+Rz7BRz70e/h8PizTWOjHr6PGWLyGsOMOWHcz5GZkCMUcmKY2fDAhN8lwN6xdhqnT4AuBNwCpU+AJQjihW8MbgXAcChkwvbpBPB5IdMLwAcALhg2xNjANbm0a5i//+58t3MPXUXMs3hjhyK8g0Q5WGLwhqNgQiYPlBxywK+CUwROAwjT4vDrtbQe6r9LX8xMyoGIBvD4o5GRIdgl8YZg4AU09ijs8fhlNucgP/9dfM3Kqn3/5l39Z2M+gjpph8WaNDCA1Cvlp8PkhFgcrpE07NQheP0Q75AI1LlWs4A1BYxcU0pAd08bGBBzIpSE7qVuleTkEk9C0EnxBfS2XhtwUDO2DcpFHH32UDRs2cODAgQX9GOqoDRalIYyNjcndwYFwE5QKYPjALkA2BaFmiDSDZYAZgHwObFMxQ34G/EGYHNDPZ0ch2AhlG+Lter1C1n0nE0wfOBYYJTCNsz8HTExMcPPNN3P//ffz4IMPMj09vUCfSB3zjUVpCN/+9rf1h8KMXCFvQP69LwAzw+CUwLTkLg09A8W0/P7MiHz/seNyi3ITUEZuk+nolimmwTIVX5TS7uvZUCjB0z+EyeNgeefWUiqVeM973sPKlSt55plnuP/++9m3bx+2bS/IZ1PH/GBRGsKf/ZkbqJoBbf5wowLh1DDEWiE7Jd+/XAKfB0KNEGmCWIduilirbo1gA4RiCoT9UQhE9G++iH7eMvWzM6dhuh+m+iE1BJUSACtWrJhb0/bt2zlz5gwtLS0kk0keeughHnjgAVKp1AJ8QnVUG4sya9TZ2ak/eMOwbBt0bYdYEiaGwLYh2QEVB9KjigVi7VDMK4A2LXAcxRDFtFtLaFUWyTEgFIbUOGArgB7co58ZPgAjfeetw7Is1q1bx549e+a+9u1vfxvDMPD5fGzZsoX9+/czMzNDc3Mz69atwzQX5dlSx0tgcRsCQHwJLLsSom0KdttWKxiuFLXhSyW5Q8U0hJqUFYq3Qy4Dpg34INYIYycUaBdL4PVCpazXOPormDymW6BceM5aEokE3d3d7N69e+5rn/vc57jzzjt54oknKJVKrF+/Htu2OXDgAKZpsmnTJhoaGub/g6qjalh0hmDbNl1dXWe/YFrQ0A2b3y7fPTupIprXrw2dyYJZ1vcV8hBNABaU8uAxwROGkSMQiCmIzs1ApBV8PpgZgZHDMLBLKVi7cvZ9/REZHLBkyRKCwSB9fWdvjHe84x185StfwbZt9u7dy/j4OC0tLaxdu5Zdu3aRSqVoaGhg06ZN9VviVYBFZwj33XcfH/jAB87/omnBpneBJwJWRf7+wD5YtgWKMyqu+cIwvB/at0DQD7ahDFF+SrfE9DAs2QTjJyGfBb8HpscUSB9/QjdCYeZ51+TxeOjs7CSbzTI6Ojr39c2bN3PvvffO/X1wcJBDhw7h8/nYvn07U1NTc+nXjRs30tjYWPXPq47qYFEZwmOPPcbnP/95du3adf4/GCas2CGS3Syx7tQeMCuqLSSWQCihOgKO/mxX9HPlPKTPgOEW3MZOwtRJSKegeZn75wnwh2UwgZgC6PQYLN0CA09BIU0sFqOnp4exsTFOnz5NuVwGoKWl5TnrzWaz7Ny5c85tampq4umnn2ZqaopEIsHmzZvrt8Qiw6IxhAMHDnD//ffzJ3/yJ8/9R8PUJl9xjYpgqRGYOKpMksejanKsVYFxKQudm5QxMi0Y7YNgRDdCegyO/UZFNG9AbtPEMb1O0a0tBOOQXAGGBygrlhg7BsUMjY2NrFixglQqxcDAAPl8HgCfz8cPfvAD1q9ff94GP9dtamtrY+3atYyNjc2lXzdu3EhTU1MNPt06XgqLwhAGBgZ45JFH+MY3vsHBgwdf+BtDSei5VhXg3JhIda294gyNHoNIEjJTkGiBQJOC5dy03J6ZMZjshyE36G1bC6lB94VNCMVh+owM7vLbIdYJE4OQT8Gef1GtAWhoaKCpqQmPx8Px48fnjAGU9m1paaGzs5NVq1adt/Rnu00ej2fulojH41x++eX1W2IBseCGMDk5yYMPPsg//MM/8Mgjj7zEdxsQaYHGJTrxp4ZkHKuug/6drmvkk8vj80CoAY4/CWf2q28BB6bdOkGoUbdCrBOiLTB6WLFDz9XQ1ivGqumT4ez+n3OGAJBMJrEsC4/Hw+joKKVSae7fvvGNb7B27VqOHz8OQFdXFz09PXP//my3qaWlhYmJCfbs2YNt23Nfq6O2WFBDKBaL/OhHP+Iv/uIv2L9//4X/YKLLzRJldZKvfYvigtEBaF8FmDrJp0ZgZgiy43KRTA+Ek3qNjnUQ7wDLB6YfKMHkKWhbp5vAY0JyGQwfdm8E4yyFG4hEIsTjccrlMiMjI5z7MX70ox/l05/+NADHjh2jv78fgKVLl84V6WzbZvfu3UxOTs65Ted+LRqNsnXr1votUSMsmCHYts1XvvIVvvSlL738H/b4INoK3qBO9871SrGWSiqy5VLqURg/AU0r1IcwflRB9dgRWP9bonKXMxBfqtfLzaiBx66o58EfVw2j7xE49oDeq6kHhs4W1wzDwLIsWlpaGBkZmQugAW688Ua+853vnLfso0ePMjAwAMDy5cvp7u4GzrpNgUCAbdu24fP5mJycZPfu3di2zdq1a2lra3v5n1MdF4wFMYS+vj5uuOEGXvFbe/wQSACOimLLrtLJ7gvDyCHmMkvlLEyPywXCgU1vl4tUSGnD+2OQHoG29VDK6ZflldtVnFEmKTUMj/zF2fdu7oFlV8MT3z1vSaFQiFwud94zLVmyhC9+8Ys0NjY+p+p86NAhTp8+DUBPTw9dXV1ks1meeOIJKpXKXCBt2zb79+9ndHSUcDjM1q1b8XgWL3v+1YqaGsKBAwe46aabqvRqhoLk7BR0bgGPF/KTMDkkTtHMsDZ6rBWWX6VehMQSuUeVikh4ZVsuVNz1yUsZ/UxhBs4cEQfp5OMuE/YcbLsDnvzec1bk9XqpVCrnEfIikQjf+ta3yOfzmKaJZVls3LiRWCwG6GY8fPgww8PDAPT29tLa2jrnInV0dLBmzRoAUqkUu3btwrZtLrvsMtrb26v0WdZRE0P46le/+vxp0YuFYcol6r0JKgU48RsINkE5DckeNeekTqseEG1WTOHxa2OnRiC5BLLTEEmI5XrqaQXOp/fBySfUC1EpVmWpv/3bv81VV11FR0cHhmFQqaiK3d3dzbJlywAZxcGDBxkZGQFgzZo1lEol+vr6znObZukcIyMjhEIhtm3bVr8lLhLzZgj5fJ4dO3bM+cTzhngnJFcqNbp8u073XNqlbqeh7EAkKlqFP6RWg9wMVPKiUZQc8FmqMtu2SHxHHxQLtcpYv379XOq0ubmZnp4eQqHQ3A0SCoXYtGnT3Gbfv38/4+PjgGKKEydOnOc2AUxPT7Nr1y4qlQq9vb3n87TquGBU1RA+/4Uv81ff/Z+A7VZzLdEcsuPyv6uNVTdC8wo4cJ9uAAOXat2pTV4u6Nbwh6BYhFiT+hry0yLsORY0tsm9Mg2YmYZD98HkyfPSpdVGY2Mjb33rWzEMg0gkQiQSIZlM0traimVZWJYFwLp16+bihL179zI5OTkXgziOc57bBHI9h4eHCYVCbNmyBZ/PN2/PcKmhaobQuf71cP2HdKqmBuSGDO1VWnPkGEwcr8bbnIU/Aqt3gOPVZo81qoutlFXAG2mVi+TxinGaT0GyGzLT7m0QULGtbEgpI5CAow/D0FNVc4cuFBs3buTKK68EVKMAuUyhUAiv1zv39bVr1wKwe/duUqkUY2Nj+Hw+mpqa5m4agHQ6zc6dO6lUKvT09Mxlp+p4YVTFEF5/y+9wvP2NUohwHBW37AKc2AltGyAQggP/8dyg82LgC8Fl/0nKE+FmpUW9fsBUOtQxoZJTEw6Ia5SfhFiLAmcqgKFOtbHj6lc49FN1tS0wduzYwfLly2lra8NxHMLhMK2trfh8Pnw+H16vl40bNxIIBNizZw9nzpzhyJEjLF++nGuuueY8ct/BgwcZGho6L8ao47moiiF0brwWtr9Pp2wxD07F7Qv2KIi1LAWiQ7td/3yW9/8K3tow9av7KukXRZvEIypmoW0NDD4jtQtPwC2WmRBIglPU202eFEWjabn+beQITJ8WRaNQ+57keDz+kl1ut956K6tXr8ayLAzDoLW1lXA4TCQSwXEcli9fTmdnJ7t27eLpp58mn89z9dVXs23btrnXOLeivWLFirkAvQ6hKobwn257J3v8m8T0jHdKWSLn+uHZaaCsjTp6DCYH1Vtsl15Z3GCYEGmDdW+EQkHp0FJWjftTA6oSt67Wa5fzUsXz+tSoQ0XN/WNHAdOtMwyppjBLulsABINBwuEwuVyOfD4/l1F6PpimyV133UUikcDr9eLz+WhsbCSZTOLxeIhEIvT29vLAAw9w5MgRAoEA7373u0kkEnOv0dfXx8DAAD6fj23bthEIBGrwlIsbVTGE73z3e3z6u48oNdmyShXecBQmTom20NyjjWmjgHZ6GEaPiN/jVOSeXOgyvEFYfaMC4ulBUbMLefU2lyowflyG4PGoJ9kbgmwWLEdGc+TXkB/TQgINMPAkr+hmqjL8fv9cBsm2bQqFArZtn1etfj4EAgHuvPNOYrHY3Gskk0kaGhowTZOOjg5+/vOfk8vl6O3t5frrrycUCgHn3xLLli07r0f7tYaqGMLAwABX3fm/Q8NyCDcAHgWz6TMissXbIDcuoa2W1eCxpCBx8EE105imMjyl/Au/iccvo2leDU2rIRBXNsrjkf/vC4p9ahdliKE45PP6vVxQzJLPKgYYPSqtpHQKxg5d7ONXDaZpsnTpUvL5PMFgkFwux+TkJJVKBdM0cRznPILf8yEWi3HrrbfS3t6OZVlEIhG6u7sxDIORkRFGR0dJJBKsWLGCzZs3zxnF0aNHOXnyJF6vlyuuuOI1d0tUxRByhSIrt98kHr8vCkvWS2GimFYGx/RDeUYpTG9AzE+PV3IsqUE1zh97+MVTloGoy/9ph57r4MwBxQgzI+oZiCZ1wju2DCsY0y0zdUZ/t7y6QcZPSEJy+BkZT+r0xT5+1eHxeGhpaeGyyy4jk8kwPT3NzMwMo6OjlMvluQp1uVx+ScNobGzklltumQu8ly5dSrlcZmhoCK/Xy+rVq4lEImzevJlAIEA+n+fJJ5+kWCzS1dX1HDr5pYrqpU/f/AdKWVqWOD+GrVN8ZhjCLfLNI83yyx0LMqParOUyHH8MBp98cffItGRAhQxsfDtgQ0MHmEHITerfAhHRI0o5VwpyRpIw4ThMnIQzB/U9fQ/p3wxLt8wiRjwep6enh9bWVvx+P+Pj44yPjzMyMsLk5CSmac4V4PL5/Evyt5LJJO94xzuIRCJzBlUsFmltbaWrq4tAIDBXgzh27BgnTpzA6/WydevWudvjUkT1DOG3/ou0hCoZqUlYHm3G9KSyRF6fDKVSVJZmahialinVaVfgkb9UlufcvuHZrE84qUqv40DXVmhYJp5RqaBM1cgRda/N3gaVipilhZIa9ks5uUynD+j1Tz5RjUeed3g8HmzbxnEc/H4/PT09JJNJDFf8uLe3l2KxyC9+8QuGh4dxHGcuxZrJZF7ytgC1mr773e/m1KlTNDc309nZiWmadHV1EY1GufzyywF48sknyefzdHZ20tt76c2YqIohlCo2y668WSJbiW7pDpXKCk6dotsTHIRiGRpbFdye2isXyhcHpwAP/oUa7T0BxQrxDhnJ2NFzVmtA12bo3A7FDMSaXR0j5B55vWqmoawyQSErHaORYzB1SgY5sPNiH7emaGpqYmpqinK5jGEYeL1e2tra6OnpwbZtxsfHSSaT3HnnnUQiEb7whS9w7NgxSqUSpmnOFeSy2ewFqfN1dHRw+eWXEw6Huf766xkaGmLp0qW0trZy+eWXc+rUKY4dO4ZlWWzdupVIJDLfH0FNUBVDcByHJW/7lHxuyycDCMZVUwhEoZxTlsgxlfcPuEpzThminWJ97v13VX+dioZ6mF63qwy9LijWaF4O7WshdUYEOV9MnWh2Tt9vBd3CXlHp08w4jB/TDZQ+MyfR8mrCW9/6VsLhMPfeey+ZTAbQbRGPx1mzZg2NjY309/dTLpdZuXIlt99+O8uWLeNzn/scu3fvJpdTmtqyLBzHoVwuUywWL8gw2tvbufbaa9m0aROZTIZ4PE5vby/r1q2bq1k8m+rxakT1XKMbPyBVuplxncKmR91dySVSrJsZ041RKcpYclPy0X0BmBgGv6l+42d+oiyP5XNdHUs3QyGrmOKq31WfQKUEZ/q06VtWuErXQfUphxvVz5ybhHwGHv+mgvRilsWQKn0liEajNDc3s2HDBg4fPkxfX9/cLeHxeFixYgVr1qyZk5wJBoMkk0ne9ra30dnZyfe+9z0efvhh0uk0+Xwer9dLsVjEMAxKpRKFwnPFzZ4Pq1ev5uqrr6alpWVO7a+9vZ2jR49imiZbtmyZo5i/mlA9Q1izFa64U/5/4yooTktL1BOAhiXK2tgobekgI7GARAccfRQ6NmrjPvNjbfK8GyvMSjiahqQdN71DjTNOWYW0YINO/clhaOhSncHr1S2UOQP7fqJC2yUAj8dDIBCYuw3S6TTZbJZyuUylUsFxHDweD1deeSV+v594PM7k5CTlcplwOMxb3/pWGhoaePjhh3niiSeYnJxkenoawzDmMlC2bVOpVCgWL4xvtXz5cnbs2EFLSwurV68mFouRz+fnxM5eLa2m1TOErW+Fnu0KjsMJndQN7Zpx4AtqQ2PLGAozyvWPH1JGqZiGzrUw3g8nHpf/nx47m9VJLtfrNS2H5jWak5aZkEFFkuoi84WUpTIcd9aaA/vuVZr0EoNlWdi2PScg4DjO3Inu9/vn/mwYBh0dHaxfv57169ezd+9ecrkc0WiUbdu2sWTJEp5++um5xqBMJkO5XCaXy1EsFimVSnO1ixerdp+L7u5ubrvtNhobG+nu7p67NRb7LVE9Q7jhLmi7DE49pUk3jSu0IbEV/EZawe+Xy1LJy63x+tUF5glBx3rNJjjxuHz5Uh5w5CZFW8QObVsPHa4vmplQldpy+40DcWl7Wx6p3J16SlXj3HyrVVvKVNluhublVMnnGYZhnJdO9fl8dHd3EwwGyWQy+P1+Ojo66OnpYdOmTRw8eJBTp07NaTZZlsX4+DjpdJpKpTJ3Y8z+fiG47LLLuOaaa9i2bRvLly9ftELJ1TOEFWvgug9CyVZPsM/NOTse8PugUFbsgAOn+9Rwbxfg5C59r1OC9nXw9L+p+mu7bZQev2KFtsugZS0kl8LMqGKQaIu+Z3ocWrogMyPahmXCMz91s0nzSKlOLBf1/OivlKI1LCUDxo4rrjG9uh0HnpZ4gD2/NQvTNAmFQhfs889SMmZpHNFolEgkwsaNG7Ftm7GxMdLpNH6/n0gkwujoKMPDw+RyufOoIC9FAzkXvb29vPe97+W2225bVELJVTOEv//7v+f//ObPoOcG5ezLebkpkRZlaqaGlN0p5twRsIYCYLsspepYi3z7gV2SZUyfkVvkdd2qntcrK9SwAgJhnbqRJOTTSp3iqEpczkHf/bohpk5V49FeGKFGuP6/KPCPtir7VcjCyEHdVo2roDilG7BQlGJeolXu4vC+c1i4849gMEgkEiGdTs9lkZ6N2VTrLKXDMIw54zAMA9M0SSQStLa2cvr0ac6cOUM2m50LuA3DIJvNvixRhh07dnDPPfcsuC5s1Qxh6PRprrj2TXD9h9Uq6ffD8FFoWyV3BUNGUMi4KhQRnfrFaZHwJoZgw5vhsX9QY49d0SnrC8n9ab1MPKVoEob7JOgbiIjUN3xY1ItKHp76R90WSzZD/5PVeLQXhi8M134Moo3iMZVyMt6hfSIa+oJy/yb6RQfJTYuZ6w1JduaJ71SF4uHxeF7WqQznu02madLe3s7U1NRc/SEUClEsFslkMjiOM5edms02gQyntbWVUqlEsVikUCjg8XjmCIOzv78c3H333Xz605+uOdepaoZQsR2Wrr9ShLjOddIO9YWV7SlNQyaj2oIFeGPatI6hU9SpqBDm8cGjf+cGwq4bkVzhTr0MiH5dSCk9GkwqGC9kpDU08LSC7FlJFtOU4c0nIi3QthUuu07cqfGTCvwbl0mPdWoQonFVuE1k8OEmJQsauuVC7f2BpGMuEvF4HI/HM9fjDCqOzczotX0+H6lU6oIMpqmpiWKxiMfjmeuvnp6eZnx8nEqlMlfYq1Qq5PN5bNvG4/Hg8/nmMlizBjDbCFQsFp97U3j8utkTrtqgY6jJKnNGt38wAqPHuetdt/HH/+3/uujP6MVQ1Z7lnTt3cuvb36WmmeQKaOyWIeRTcnealklYKzupPuFAVOoRhYy+x0TcpIM/l79tWvqASiUxWC0vdG2RmxVulhp2qaCpN2NH5V7lptWTXCusv1XPiiMl7XJOVJNSXpmrYl7P5w9JYKBpmQ4JbwBOPim17cmTVVtOPB4nn88/J0bw+Xw4jkMgEKBUKs1pts5udtM0yWZfvCfDsqy53urp6Wmy2SyVSgWPx0M+nz+veu3z+eYC7OeFPyGN2UCDXGUcac8aHrnUxbziO19IbvaJJ/l/Pn4Xd7/nty/2I3peVF3FonP5arktnVt12jcsV4sknB3lOnZK8YBtu1keW2S8fEpDAY//2h0mbrrCvuO6MZp7pE2ay+i0TQ3oFJ7taQjEzjbm1wrJlbD1XRplBYptoi3npHWDimFO7lSM1LxShERfSLHC9ACcOSz3qZSpypK8Xu951IrnwyxR79wbIhwOEwqFCIVCczWGC3mv2Z+Zlc4fHx/n2LFjFAoFHMfBNE1mZmbOukmGCW/4Q5EwMeUGnzmktltfGGZcGf9EkwTbws2aiXFqH/f/+f9G7+rqM2KrbgjvvuM/8/CBfth4C2Tz7oTKsujZgaB6EspFFdZyKRg/Jb3S3IyC6okhOP6AuEZ2WYU1x9ZNEGtXPJAZ1tefZ9TTgmDljbDq9YCpYD/WAS1LFSCX8+qbwNF/5sykUsCWVzWX7DSMHVRfxNiJBX6QsziX6l11xZ/WNbDhbRr0WCm7FBpTB9rk0NnYqlxSDHXoZ7D5HcoCPva37N35GI2JeFWXVHVDsG2brt6tUpiId6pxxutT70EhLYMozLjTLpE7NDmswLfiyMd/8rvaQJZXzfeegApu0+PqXXAqZ4UAfCE3SF3A3L03DNe8H7wRGD6oOKFlpbJK5eLZxIDjKMMUjElRr5RW4B+MwNgADD0hguKlDH8ENtymLsKM+6zhprNzLuySYirL1Gw70x0KGUoq5jNs2P1DBo/uq+qyql7ZME2TTatcKUJ/WIEtljazXZER5FJqqJmZgIqhq3JqXG5TyeUDOY7y8N6ANvvoMRh8WinHc9UwigtsBCCX5qG/hH0/1HqdEgzt12b3xbRmxwZsuXCmRzFEpSIFvmBS9ZGXmfl5VcLwKKayy6LFG5arMj4l1ziX1ugv0xFJM5t26zGNCqp9YVj7FjpXrK3qsualxPfeu35XPv+Jx0SkM70KFC2vqyEU1iYJRNRjbBjgMeT2YLp8oaA2S+q0jGein+cnzC2OKi5ORT0TxZQm8YQadbplx1TrKBUkN5+Z1PPOSs9Ek+4NEYTOy93Y6BLG8qt0KGQmJO8/PeTqTqWVRMmlZBzBBMSWwpI1So1j6cD0RdQO3PM6jvdXr040L5KPjuOwZPVm+c2Nq3VCVsrg9ajSbJmAoeDx2CPKHo2f1EmZm1SaMeOyVWdGqr28+YU3pFqK4dXc5lJGN2GsQwfAbIHQRrekx5JrNz0iwuKRh+QKXIoIJmHDLUp7Vwyl0KcGdZZFm3QgTAxB3B0W7/HKZUwPgzcqJoI3KA0qnw92/hNHnnqQYMB/0UublxvBMAwG+3bD4QeUDg01QLRBbkC0QS6BL6xN3roOCMDSy6H9MmVQ0iM6NV5tRgBy7fbcq//EkNsrMXFKufFKSc/t80sB0DKVZSoXVUNpXQPLti/0E8wfWlYrYTA1pJqPYUirtpQGPMqyJVoAQ6yAEzthvE+K5pEYJJaqFbjgUnA2/Bbv/f0PV2Vp88p+Gjyy35VQLGjzO5zNGJUKap4xbY15KqOgs1LQ1fhqxsgz8PQ/w9Ffi3LRfYWIhXjkLpUd9z80oyRCpSJD8IWgc6ObabsEkU/JrWlYqrgAdHMWMjrtE0tUO0iPi5QZbz9rPJWiDpZYO1gBfcYzw/z6V49WZWnzTgPcfd/34JG/UVpx6rQad0wTKCtLUCqrJ8Eonb0BPJeALOHpZ2DssH6d+I0Ceo+l09Bxhxz6AtJlCsbkCtgViQ0su2qhVz8/aLtMG9o23eEtbmPWkk36eyUHoyd0W3Ssk/uTH1cgXSwqhsCWmHPDMjhzTLFEFTDvovpNySSDh5+mc9kqGNwHq16nhvvMtG6GMwcg0i7atNcnshz2/Khn1xymgvyGbhlCelynf3pcN0OkRf/BTlHFwJlxKEwp02Ra885WrTn6n1RSIdapfvN8ys11mIAj5cK2HqXJbUe3qb9BqieRZjDKqi1UHLmeiQ5IV2cL14wYPniijxZ/Hvb8Ozz+XeWI+91pNKbtTrs5pQ1SS4rEfMIuK707dgT6n1AGLRRR4qB1lZs7LyqDVi4BZREMgzFtlksNmRGIt0peJzul5Eg+63oAjja6YanTMDuhulNiifaH1yNDSY1ofwQS0L3lrIt1kajpmJVdu3axdOlSnHQW++BpaFwOy7ph9/+SAO9C1wPmA74gJFeBZUicOJ9W8FfK6VTzNLhCxUGddBVX1r6ayuGLBYal27HsQMij+CgYUDYtN6PbMJOD5gbVEUxLBhFsUirdsCCeVHV++BkxkmeLcheJmrcKvec97zlbsp84Dk/9k3tFXoJGAAoEU/0qCM6cUXyQndB/4NSgYgbLdGUqI6qt+KPqv7AugVjpXKy/WYyBkquUPjvwceS4NronLKbyxAhE25QqzU0qqzQ+BFQgm5IIQ6IDSjMYVVIwr7khNDc38/GPf/ycr1yiBnAuHEfGfuh+OPBjZUSKJdEHwo2Qy2rTez3Kl4N79V8lSkK17v+FhGEp/39qvzoQZ9XK0ynVDSoFeQWzOrV2WTeHNy4XafyEUvHlihIMvgiMHOfU4T1VWV7NDcHn873GBGYdd0i5a/CFtIpnXq8CwIIrb+OUIZdDcYJXDNZwwu2puAQOC6ciQYb29VImzIxCekqJglJOm95G8VPeTSv7LcUTvih0rYdQKzS2w4EfwcQxPnj98qotb0FGMc7OCHtNwvRC5wZRCSJNEEsgKrKjdGGppOYlX8BV73AlLF/tMD1qRPJG3fl1FRl/61odDlG/CIh2EQLNihvyMzCwGxqXQD4H3jycPCZqxs5/4r/+sHoyPQsiJ3ChmjmXJJwKnHhU3KszfcqaOBXFDKWySGmWT40pHp8ySpcKRg6pKBZtgNF+NeSU89r8GOpsDDaKgZDLyE3y+lQ/sIs6PBJNMLSHwcHqalUtyI1wIQ0fiwqGeY5S3kXCcVRUijdLeGzypPRcvWEREk1T3CwroAA7GHP7GV7lsMvilFVyol3Hl4pdmptSPDQ97Mr3e1R4tbyqrYQaZASD+9T9N/5rjux8sOrLWxBDGBwcXIi3fWFEmt1CTcEVDAir2DU9rDx2olOnUS6lXLhhKA2a6BBxLpxUt9nU8Qt4M0eV02OPqWBWLuhXyxq5A6EGt3/bC63LoLEDfvGn8/0J1Ab5GU0sal8HyWUy+EJWt+LMGX32oSQ0tLqynhW18voTMBaBE7/hNw/+gmAwWPWlLYghDA8PL8TbPheGeVZiJrlC6cxyUVyYhiVqq0x2a6OnxxS0BaO61ouTKuw090jFe2pQmYxSTi6N5X3hwmClJNfIHxbnamrIFTZY4hpkRixW04THvlPTj2R+YejzCjfodjVMNx2a1iFgAuUUeF0tW7siBoJhQyHLTTdcx9KlS+dlZTU1hFllhJeaIjnv8Ph1Cofi8lFbVssYuq+UCJkvolSfgZQVAPCqwmk40NIN+SYNHhk9rtOsZS2sugr2/wxSp9xMEdI7KpdEM86nXC2nkt6/mNetYvl17Z/erZuoeaXeZ/Sw2KmXCrx+KZNnp2Hdm3V4tK5260i2W103dACEmnWQnHlMB41h8a1fPjRvS6upIWQyGbxe70uqJcwrPK7KdjAhGcpSQa5RIK4P32uA49Pp5I1AIKD2yWSXDKOYkzKHPywqwNhx5fqL09D3a90my7apHzkQ1cASLA1f94dhekxV5mxK/266rNNyQXFIdhKGDmiTWItPGvGiUClL1jM1CF0bFQMd/RWsuMolYzrqUDMMBdV2CSZPcO22DXz/+9+f16XV1BDS6TShUOiCJcirCst3Viu1kFbwZpjQ2ivKQ6JdM9pKWdRI7qh449hKZRZzOtEcWwNPnJJcHH9Qol2VsgzLRK5UIKGs0P4fqpgUapTBxFp1AzSuUo48M6kAcXoEmlbAqX3KppiGNs1ixazocin34kMgz4Vd1q9gXKO8UkO6TQ8/7LbwTgKOWnKbV0D/U9x++9v46le/Op9PAtTYEEZGRkgkErVPn3pD0kWajQH8EeXoo+3gT4r3bvp1SpeLytR4A1CahJKhQo/XryDXrmhjVyrQtBRKbSoQtaxzJR9T6jQ79BB4TJ304SbxaBJd2jSrrhJ/pjAJLaiG4AnJBYgMi6Pf3KPc+2jfAqt1uLffuQNWfFFY+2bNvBg+DKWhl/eSuZQke/Iz+r+IJnSwxFYpxZqbhP6d3HHHHXzpS1+q6tO8EGpqCFNTUzQ2NtY+fepUVJBZeoUKWmN90L4BGpdqk6cmoKFZJ3Mg7CpOmOL9zEy603/SKnYV0jKW5hX689Azeh3DluLe+AnFB94AWHH9W6Wkqz7ZJVapLyr3yBPUrVQuwvAhiCRUca7YMtxDDywCyRpHzxmIyo3s3qIZFeUynHgClm6Aw6N6xpeD2fkXhbQE2kzrPKGzu+66iz/+4z+u4nO8OGpuCOdOgJ93GIaIW22XKQi1/AqMl1+p3HTYbYYJhM5O6AF3Qk9ap37Q1WPKFMFnqbnGRK7MxDGd9AePSWUv1S9jyqfUtD/bmReMQ2OPTn5v0BUrmBU4M3Qa5sYgM6SvNXVIJbBjLZzaPb+K3hcKTwx2/J5LHbdh5CicfkrP9HKN4Nkon/98H/rQh/jsZz97ca/5MlFTQ5ienuaZZ2o0uMM05cJ0XeEK8E5pWLk3LL820KBT3zT0e6mgP1teV44yDH6Pq6VjihBXqSijlBkFowLTJ2F6VK7PxDFXtGtcKne5lHz+VTeqIFbMywimh9y6xBSUbTj5OGROy0XrXKtOtYqtILp1rTr7FhSGZtb13OB2lTmuJI2lGKrK04g+9rGP8alPfaqqr3khqHn69PDhw/P/Rt4ANPUoDsCUgFYwoVM4GHZFgm23b7ig7IQD4OiG8PmV0Wherq87tugPdl757/S43CvHEDViZkyCXlMDijWciirDyVVq0geIGmKc+uPg8+p9po4qrijbkEyKeGZ6dUtYHn3PQvclxNpg3a26PQ1HSQHTrb94glWdVf2pT32Kj33sY1V5rZeLmubnKpUKk5OT8/9G5aJO1vS43JPMtDZfpegOHzG1iYsZne52USe8XVQmZHpMxpSbcYs5GZ3qdgkO/VKaqxWUD48k3UpzSie5x6vbJblUmZD0iDtRx1EQbs2S6BxJvHRuVq0h0aXNVi6qap1PoTTXAlKw/RHdBr6Qm+e3FSdVKoqZchNVM4LPfvazC2YEsACV5ZpkjBxXXrL7Kp3SngB4onJvchmpaHssqJhKjeK485nddOnsKW5Zcmksr4LYww+5dOkpZYrKeVfZriIlZ9C/Ld0MTatUh8jOgN92T1RDr1kuu03sJWWGVl8vo/V5dKNUHKB09mcWqmmpbb3cs0pe7mFqQO4dZR0m/rD0py4SX/jCF3jf+9538eu9CNTcEGbnBM872tfpVPYG5cObqKpbykAwBBguEcwt3FRcScbMhPL4paJuBKegsU+n9qk4lp+C5l65LmXOz6GbHljzJvFlYq26BbKjYEb1Z8MGrwV+L+Td/mRyWlcgJsPJZ1wRMA84EyzYjRCSmhyWX7pM/qiq46WiblPDQzUcii9/+cu8+93vvvj1XiRqbggHDx6szRvtv089rVG337VYEo3BF5VbY5fcPuGS3JFSQdkijw9K7rSe7KQaR6ZHVDmeOSM3Z+AFJvHYZXjmZ+4G8oBtKQ3qjwNl3Ub+iFKihaym5viCkjcxDTcI9UFpRpmZiQUiJ0aaofcmFQYd3BFdUzBVkZRKyeVCeS9OYe6rX/0qt99+e1WWfLGouSGMjV38VXpByI1LT2npZliyRXn8XFY+vFORARRtt2HelW9Pj6uaG23WAA+7qODY8mrzmtZLa5P6g+LTdG5Qrtwb1ntWDOmcVopy23JjqjFM9LsFvLBYmF4/5BzAXBihM19YukotK5EYsy2jjLappgK6yUaP6Nez4fFd0BDHv/qrv+KWW26p+vJfKWpqCC93ntZFI9UPe/vhmZ/Durfomo+1KtvhD0t8q2LB0G5XaS6sPPnhX+i0tjwvv6CVn4G2DXK1DFNBZWZctQTHq2DZ52ZbUqdkOPm0gnvDdivRjfKIpqO1jw9WXq9bMzsJjV1KNARjOgw8abf32AuJZXq+Z6P80jHg3/7t3/KWt7yl+mu/CNTUEGbnedUc5Szs/lf9x8U6zipE7P8PBbu2I12lZ3Nmyq8gIxJpgqXbRbVIdkGu4JLvcnKLTAvMsqtsV4J8Qa2ZxWkZaiDspmtLMirDkBtSjaagF4NhQO9boWsTTI0oTpmZQnHTpKQWvV7dZqajU9/wAC8v+fF3f/d3vPnNb56HB7g41NQQ+vv7a/l2z4Vj6xTe9Y/AbPGsOro4c0iPSb4y3Ky0qzcIVMQfsouaN21UdHKmhkVDrhSVSXI87iazXdKf27g/30YAMoRlmxVL+UKABZaj+CXarpZJolqPYbmzrl9eIP/1r399URoB1LiOcObMIuHWO85ZOkXVX9uGR/8e9v07YKiWMNYPWGAbzGm+GpZG8M6Myg0p5cF2ZS4tU+7UmUPzt85zYZjQc53o34UUhNypRuWiUqfTQ1qjgW6C9KhYuqULN9B77rmHm2++ed4e4WJRc4rFosJ8Edry02CfkGtTKcvHNjyuC1Q5G7CXci7BDzeLlVBzSnbEFQeOzs/6no3EUtULAqGzFJNwXIxY05LwVuoUJCxNsLECkB244Pjli1/8Im9/+9vn9xkuEjW9EU6fvvjh2q8aFDOw90eA7fKWHN0IXt9ZasZs0J5cpsqy5XEzVLY24/NlZaoJX1i3gekybc2Ahj0mWmWcuWn1bXstaOyEqTG33uG/YBW+z3zmM9x5553z+xxVQE0NYWpqqpZvt/CY7lfMUMxBvqLTFY+U3EIxCXhlplQ884fP9jBXXOHg+Y4Nihlo6YXl1+j0t0x16uVzihMMdHNlMxIic4qKe0yPAvuXwB/8wR/wkY98ZH6foUq4xHoBFxkcR1z7/LSUnm1bp683ILcnO61A1HT/G5yKimmeIBz9zfzHB5ZXZMREhwLzUlEz4CrOWbexkIbijMTHQg2uMReg7+EXfek77riDP/qjP5rf9VcRNTOEmtcQFgsmTsCuf1aTfzGluWrZKSm+BePgD7l8opJujkoRTj4hN2m+4QmIDlIpySiLGVXdZ4ag4K4l1i72bsFNLefG5D5tfLNrFM/FzTffXLPOsmqhZsHyoguUawZHVevUaYl6Fabk8vgj+jXZr35m0ITRiX44tYt51zv1BsTBCjVqQze0uWzdkoiFlZKCer9bXAv4IdDmqvF5YeTk8w4yueaaa/j6178+v2ufB9TMEJ566qlavdXig2PDsQdVwe7eogyN4VLBMVXtPvEbDdBzbGoi+uvY4g35A7qhCnnNb/BG1DI6PSLOkcdSCjVfhJKtbJLlgeH9z3nJzZs388///M/zv/Z5QM1co5/85Ce1eqvFi/yUpOGf/B6cOaL+Zq9f2v9DB9whejXq4KuUpSA38LSGd9glGD2pKnx2xh1mklYHXrHoag6VlAFLDUvx7xysWLGCe++9tzZrnwfU7Ea47777IN6l4kyVmjletchOwIlfwYa3q3jl9ct1quV8ZccRMzaS1HoqBdUKfD51ylVyYAYVyHu8qDiYEU9q5NB5pLrOzk4efvjFg+fFjpoZwtjYOLz9y/Dkv0H/q/tDqwpmRuGxb4p2YXpqP2TcG1Bz0ZLNoqobDpRblTGKturvdkGZpKjbz2H4NLIpPTJXTIvFYjz++OO1Xfs8oHbpU687J6v39TV7y0WNck6bv5it/fBEw5CWk88PGKpwW36ILxEp0eMVvWKiH5IdIt2V8nKbCikYVk+J1+utnRjDPKN2FIvLblLuvGCopD+1wAS8hYbjKDvzLGzYsIGGhoY5RcB9+/YxOjpa/fdODcHmd0n/tZBX8SyUVOxQdlO5/gYJE4QTqjIHvG4bqW6DI0fmufJdQ9TOEIrTUobw+GD7nXDgPjdNWMcsPB4Pzc3NZDIZJiYm6Ovrmz95zFJeVW3DUdaoXIGmqPoxTFNBcSEjLdLZeocVnGOc9vX14fEsiJj6vKAmT5IrlqFz01l+fyELy6+SqzR+6ZwqF4vW1lYGBgYYHBysjVDywfskxtu6Vht+rB8oqf8hGFQHn2mqxTQUB2w4/BA7d+4kFArN//pqiJoYwq8fe1QfZlOXfrc86u9tXycVhGJ64fV7FgHGxsZqK5BsWeBt0Hgq01SPdDAmmnjOHdrhDahwZllw7HE+/9lP0tbWVrs11giG48x/L+CyTddQuuL9CsCcsnSDgnFpCo0dVyqxjtrDH4WOTbBmB/hiEi8uZhRDhJqk8p3P6f9s97/R4s+x69fzN6NgIVGTrNGS1gY4vU/5Z48P2lZJHMoblg5ptL0Wy6jj2SjMiAvlCcLEgA6nQFSqG8Go+inSg7D3P/g/3nvzJWsEUCND+MIffUp0gkJWjeqOLUW5aLPihu7tC6PYUIeKaD/5Y2mwmqa4R4GYKCCHH4Hd/8Gn7rr1WUPiLz3UJEYYGpvRNevYOoGizSrrF9PKJrWsgpMtMPMaatxZTChmof8xxWslR036Xes5+ctvXVKZoRdDTWKE/tMjXP1//0Apu4E9EG+BxuWqXPbvlCE4wBP/w52aUsd8wjRNQqEQwWCQ3t5eVq5cyZ133snatWsXemkLhpqYe2drs1QaZsaVh86nYGZYzMfMOVXV5EoY2vXqzCD5YgoqX0ZDey3h8XgIBoNEIhG6u7t505vexN13341p1o5csJhRE0OwTEMzs3whaF0Jk8MibY2e1gqGj0DHOth0i8hep/fVYlnVQygBa96ifoKTjy30auZgmibRaJREIsG2bdu46aab2LhxI93d3Qu9tEWH2jmAhYyqk4ce0OC+tpXivBteUX7TY2Jirn6jmtbLFzigrtYwPWcHEbZtVFxTzsGBexdOtfpZiMfjtLa28sUvfpFKpUImk2HDhg20tLQs9NIWLWpnCFMDmgjT7vqhtgORNrdo49MmmhyUmsKaG2Hfj2q2tAuGaalv1xeFFa+T2vbuH8LEUbfRfgFnGaDusL/+678mEonw2GOPMTMzw9atW4nH4wu6rlcDahIsA4xOTLL5A1/SNBhfXH2wlYr4LqEo9O+GRBskV0BhGn7557URt7pQGJaa3TfcDssuVxV29IjkTmaGNTt4gXDNNdfwj//4j+Tz+TlK9Pbt2y85GsR8omY3QnNjA5zcCT3XiM9edmcUFzJyNXwR0S9G+qB5mfp5a01PflE4Gozd0K6Osuy4GJrt6/Qspax6e2uMr33ta1x//fX88pe/xO/38/rXv/41k/KsJmr7iWVdSXhv2B08HROZKzPjNoxXxHmvAB1b4dgva7q8F0WsQw0qmRS0rpLKg+UVWa1tjeKeQz+tWZxgmiY/+tGPGBkZ4ciRI9xwww31DNBFoKaf3F99+XMwuBcyw9L2PPKYOrW8lk7V8RMaQuEPSZ/fvDA1tXmHP65ZZ1MppXydso6QYKOGkvuiqoO0rtH3P59cehWxadMmvvnNb2LbNm94wxu44oor6kZwkahZjADgOA5LNr4O8EghwalA03LJHTq2XKFiCjo2qr6w+181tnUh4Q3ChlvkuuWnlQI2TVFE/AkJYA0/o5utZZUmyp8+5N5+1f9o77zzTj7wgQ/Q29tb9dd+LaOmhgDQuWY7XP1edyKNrY6oQAM0tksP1C5DekKyJ5YH7r9HagoLAX9UfH1/3B0QbrjDBhuV7QoEID2lxpbGzrMGcuRXkmzMjuumq1Iq+Pvf/z7XXnttVV6rjvNR8/v06//98xrG3bZBzToeL3Ssluqa5U6jz02KehFsgCvuqPUShWgHbPvP0H01dF4OgwdEEfFH1MQeaZLYldcHsRZ37nBAMcKyK6D7CujcIgU7b/CiltLT08PJkyfrRjCPqLkhvOWmN8H+HwMOnOlTPDB6zJ1NZklWxPJpU026U+rNcK2XCUs2QWM3TJ52R9VeqZFOTd1ShSvnRSmPNOs2My0VB8tFBdINy2DNG2HHR2HNTRo3G4i9oEziC+HDH/4wDz30UD0TNM+o+adrmgZ33bqDbz3ypDa5EYZIBGzUKO4UIN4pBqRtS11h5Q448YCaRmqBrm2afUxFs45LMxBLguHX5k+PizsVa9WaY61guMPMQwnFETbuDecVhyqU1Kgqu3LBz/HjH/+YjRs3zueT1uGi5jHCLDpf/y4pMcfbNdTbF9RcgPRpzQsY2uOKUC2B5hXw8y/VRhise7v8/I7NcOag+nn9PsBQWtc0NVKpWJIwl+kVi9ZG3+ML6OR3Kur4Mt2zJj0uCnoxBaf2vuiQktbWVh5//PH6LVBDLFzOrZRVurTvAeh/XBmZ3KR0c8aOacav5YPhAzA1DCvnUQ/JH9VJn1yuk75js1KgvTvk9oSTUDbAzmt07IndurGcijsb2asNH22S+kOlqKA6mJCB+8P6c8dGVc59kRdcytve9jaeeuqpuhHUGAtmCN/708/A9CAs3waxNoi0Si061qahFeMnVWu47I0wM6LNGW6en8WUC3JjYh3QsUFdc42dolXYhgp9fr/oIOEGxQXeiDs1xh0j6/UpCZAel1bo7C3nCbgS745ijPSUsknPg29+85t87Wtfm59nrONFsWCGcP21r9cGLJVh6ZXKrvQ/CZOnNJjbF9QEl8EDUmCOtMDVvzs/i6kUtWF9UVcFLqnJNdgqns2OVY03S+rE71dFuZCVfDq4Y2C9Mgq7opbUQlEuU7EIpl8s1WDsOWOXvF4vR48e5U1vetP8PF8dL4kFLUfe/9Mf6wbwRzSAIjMFuSkJfyWWSPeoUtCmHD6ohvJgk3441CB3oxowDBnazLCyPpZXt0E+r01rWEqXGgGpRo8f08C/zKQGbMxmlop5BcqWKV0gbA0R93rVFF8sqfrcuHTurdetW8eJEycIBALVeZY6XhEW1BB6V6+GU3tEu0gshc23q1gV75CbEYgpdpg6pVshPQNbf1v9zpbfnQdcBTiO5Ngnj4sQWCpo83pNd3CGI4MMRSDUrKzW9CmwZ9R2Gm8HDJ36tiOGLV7FCcWcXC2fIT6SL6gh4x4/n/zkJ/npT39anWeo46Kw4ASV9YkChCNyOUpFdXnhqJjWsV5FrLa1UsFIDSiw7X6d5GCmq9zsn0vB4Z/Db/4ehvvk2vh8Ou0dlCrFdt2oGHjjcPowlGcgn1UbqtejRMDsTOJQQmK7hl83z/QZyJ7hyUd/xSc+8Ynqrr+OV4wFN4Sf/Pu/wdM/BAwNso53at5wuMEVmmqA0cNnVTACYehaA5F2GU+VYVkWUVI0Hv5X6PuFBHL9YcUudglmTsHkSVEojv5avRPTZ4Ci6CKFIuBTx10goNtllprhlGHXDxnsP057e13LaTFhceToTGByQDn6tsu0wU2vpAjDSZg8oSpzbgrG+wFDvQHHH6tqkS0ej9Pe3s709DSlUokNsSwHf/YFShvepgF/jq2imWkpAwRw4lEN3Ev1i5O0/CrFGR1rFDR73czS8FEY2cPgM3VVv8WIBSuonYsPfeRj/PveUWju1aYa3Ksp8I4J40c1gC/apiDTsaTgPDOqQtsjf6NszEXCMAxisRiGYRAMBtm0aZOm/LhobGxky5Yt3HDDDZw6dYp3vvOdrFmz5rzXsG2bkZERdu7cyQc/+V+lG1opce8/fZvN6+ps0cWMRWEIAJ23fhIwoH0DlKcVYFom5LIabWTbyurkUgpOwwmYGtFQb3dwxcXA4/HQ0tJCY2Mjg4ODTE6q2ywcDtPS0sJHP/pRJicnyWQy3H333cRisYt+zzoWDxaHawSw8/uw6kZoWQEVQwLBgbg2vF1WnFAqKAsz2S+/OxCF0DoYPsTFcv8bGhpIJpPs3bt37mvd3d1s2bKF2267jT179tDa2soHP/jBehPMJYhFcyNksjlW3/6H0NglztHp/SqyhRuVey9Ow8A+VWUDEWhbrw62QBCe+QWMHHjF7x2PxzFNc+4WaGxsZM2aNdx8883EYjH6+vq4/vrrufrqq6v1uHUsMiyaGyEcCkoRItYphYtwUilSwyW8TQwrgE52q+A1dhTaegELVl2rTE7plQXOqVRq7s833HADwWCQu+66iyNHjnD06FHe85730NnZWZ0HrWNRYtHcCAA/+I97+fDf/lqszkJafQrdWzXXt1RUlXZ6RIU0p6Dc/Job5C4N7oGDP3neafAXgvb2dl73utfR2trKjh072Lt3L7Zt8/73v79e9X0NYFEZAkDnljeqCaahHUZOgFHW0IpSFob2o1TkATW9mD71Nq+8Gg4/AANPakLky8T1119PNBrl1ltvxXEcDh06xKpVq7j11lur/Xh1LFIsuqjvD993uzhFp/tUVwg2ae5vMCaKticI629VTSHUoIaZ449CQ6dYqy8DwWCQd77zncRiMT7+8Y8zMzPDwYMHefOb31w3gtcYFt2NANC5eQe0robm1TJV068gOdIiaUXLgrETYnh2bYBjTyiDNHlKatoXgHA4zJYtW+jq6uJ3fud32LdvH+Pj47zvfe+jsbFxPh+vjkWIRXcjALzjxi0yArsIx58QPdsBRk+KxmDbKrzlpuHkXlh+tb7ec6WM5SU0SFtaWkgkElxzzTXccMMNczKJH/3oR+tG8BrForwRADrf8HvQtVk1g1JRuqiGqUGEpRlovQz6n4BwEyS71Dg/PgCRJDz8tRdt64zFYtx99914vV7K5TJbt27luuuuq93D1bHosGjSp89GY+E4E6FrwbsacOQSmQEI22C0KJMUblaRrZAT/799jTJOoSRkRp73dXt7e4nFYkxOTpJIJLj99ttZsWJFbR+ujkWHRekaATz90M/hxE41vmSnYWifYoNAWMH0kvXuSNQh1RSm+uU6TZ+WPOPzYPXq1UxNTZFIJEgkEvz+7/9+3QjqABaxIVimwb5/+H9h/BDEmqBlNQw+I5fHMsU5sgwZhmPD1BlIuNklrx/Czx2KHQ6H8Xq99Pb28olPfIJI5IWb6Ot4bWHRxgizSGey9L7lbgXCXp9coZGTol83dkpS0fToRmjpVQDd1A1HfwWHfjb3Oq973evYu3cvN954I/fcc0+dL1THeVj0uyESDjH48P+A3/ydOsSKeW30YESTOZuXi4AXaQcsaOiQduqKqyXR4iKbzdLU1MTHPvaxuhHU8Ry8anbE4KGneeqeD8GBn+g28If1++QQNLRCJKEOslJBBhCMQfvlgGYJTExMcN1119VVpOt4XrxqDAGgtbmJwafv57/d1KmCWvq0lCyyUzDRr99TQ4oRSmVN6fRE8Hg8lMtlPvOZzyzsA9SxaPGqMoRZ/N4H3sfgA9/mj97QBX2/hNN7RNJrXSPx3fy0mngsL/RcQ7FY5A1veEM9OK7jBbHog+ULwZkzZ9jy+jfC2lsl0TjaB5gwfkRaQptvYeDrf1CPDep4QVwShnAuJtM5wgEfXsvEMBZ23Gsdrx5ccoZQRx2vBHVfoY46qBtCHXUAdUOoow6gbgh11AHUDaGOOoC6IdRRB1A3hDrqAOqGUEcdQN0Q6qgDqBtCHXUAdUOoow6gbgh11AHUDaGOOoC6IdRRB1A3hDrqAOD/ByuofjgChIxpAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X, target = fetch_openml(\"mnist_784\", version=1, return_X_y=True)\n", "p = UMAP().fit(X)\n", "draw_umap(p)\n", "data['mnist'] = X" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Parameter Sweep\n", "\n", "The cell below evaluates all parameters multiple times for each dataset and collects the measurements in a single dataframe." ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "metadata": {} }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 6/6 [13:47:22<00:00, 8273.83s/it] \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datasetboruvka_num_componentsboruvka_recalldescent_recalldescent_distance_fractiondescent_num_changesboruvka_distance_fractionglobal_recallglobal_precisionglobal_dist_fracconnected_knum_observationsnum_dimensionsmin_descent_neighborsnum_neighborsrepeat
0diabetes[92, 17, 3][1.0, 1.0, 1.0][[0.91847825, 0.9470109, 0.95516306, 0.9578804...[[1.0, 1.0, 1.0, 1.0, 1.0, nan, nan, nan, nan,...[[3020.0, 323.0, 36.0, 11.0, 2.0, nan, nan, na...[1.0, 1.0, 1.0]0.994220.9961390.996875344210620
1diabetes[93, 17, 3][1.0, 1.0, 1.0][[0.95694447, 0.9583333, 0.9583333, 0.9583333,...[[1.0, 1.0, 1.0, 1.0, nan, nan, nan, nan, nan,...[[4950.0, 88.0, 16.0, 2.0, nan, nan, nan, nan,...[1.0, 1.0, 1.0]1.000001.0000001.0000003442101220
2diabetes[93, 17, 3][1.0, 1.0, 1.0][[0.96056336, 0.96056336, nan, nan, nan, nan, ...[[1.0, 1.0, nan, nan, nan, nan, nan, nan, nan,...[[6806.0, 7.0, nan, nan, nan, nan, nan, nan, n...[1.0, 1.0, 1.0]1.000001.0000001.0000003442102420
3diabetes[93, 17, 3][1.0, 1.0, 1.0][[0.96153843, 0.96153843, nan, nan, nan, nan, ...[[1.0, 1.0, nan, nan, nan, nan, nan, nan, nan,...[[7889.0, 0.0, nan, nan, nan, nan, nan, nan, n...[1.0, 1.0, 1.0]1.000001.0000001.0000003442103620
4diabetes[93, 17, 3][1.0, 1.0, 1.0][[0.9046961, 0.9378453, 0.95027626, 0.9530387,...[[1.0006415, 1.0006415, 1.0, 1.0, 1.0, 1.0, 1....[[2998.0, 345.0, 40.0, 10.0, 5.0, 4.0, 0.0, na...[1.0, 1.0, 1.0]0.994220.9942201.000280344210621
\n", "
" ], "text/plain": [ " dataset boruvka_num_components boruvka_recall \\\n", "0 diabetes [92, 17, 3] [1.0, 1.0, 1.0] \n", "1 diabetes [93, 17, 3] [1.0, 1.0, 1.0] \n", "2 diabetes [93, 17, 3] [1.0, 1.0, 1.0] \n", "3 diabetes [93, 17, 3] [1.0, 1.0, 1.0] \n", "4 diabetes [93, 17, 3] [1.0, 1.0, 1.0] \n", "\n", " descent_recall \\\n", "0 [[0.91847825, 0.9470109, 0.95516306, 0.9578804... \n", "1 [[0.95694447, 0.9583333, 0.9583333, 0.9583333,... \n", "2 [[0.96056336, 0.96056336, nan, nan, nan, nan, ... \n", "3 [[0.96153843, 0.96153843, nan, nan, nan, nan, ... \n", "4 [[0.9046961, 0.9378453, 0.95027626, 0.9530387,... \n", "\n", " descent_distance_fraction \\\n", "0 [[1.0, 1.0, 1.0, 1.0, 1.0, nan, nan, nan, nan,... \n", "1 [[1.0, 1.0, 1.0, 1.0, nan, nan, nan, nan, nan,... \n", "2 [[1.0, 1.0, nan, nan, nan, nan, nan, nan, nan,... \n", "3 [[1.0, 1.0, nan, nan, nan, nan, nan, nan, nan,... \n", "4 [[1.0006415, 1.0006415, 1.0, 1.0, 1.0, 1.0, 1.... \n", "\n", " descent_num_changes \\\n", "0 [[3020.0, 323.0, 36.0, 11.0, 2.0, nan, nan, na... \n", "1 [[4950.0, 88.0, 16.0, 2.0, nan, nan, nan, nan,... \n", "2 [[6806.0, 7.0, nan, nan, nan, nan, nan, nan, n... \n", "3 [[7889.0, 0.0, nan, nan, nan, nan, nan, nan, n... \n", "4 [[2998.0, 345.0, 40.0, 10.0, 5.0, 4.0, 0.0, na... \n", "\n", " boruvka_distance_fraction global_recall global_precision \\\n", "0 [1.0, 1.0, 1.0] 0.99422 0.996139 \n", "1 [1.0, 1.0, 1.0] 1.00000 1.000000 \n", "2 [1.0, 1.0, 1.0] 1.00000 1.000000 \n", "3 [1.0, 1.0, 1.0] 1.00000 1.000000 \n", "4 [1.0, 1.0, 1.0] 0.99422 0.994220 \n", "\n", " global_dist_frac connected_k num_observations num_dimensions \\\n", "0 0.996875 3 442 10 \n", "1 1.000000 3 442 10 \n", "2 1.000000 3 442 10 \n", "3 1.000000 3 442 10 \n", "4 1.000280 3 442 10 \n", "\n", " min_descent_neighbors num_neighbors repeat \n", "0 6 2 0 \n", "1 12 2 0 \n", "2 24 2 0 \n", "3 36 2 0 \n", "4 6 2 1 " ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "repeats = 5\n", "neighbours = [2, 3, 4, 6]\n", "min_descent_neighbours = [6, 12, 24, 36]\n", "results = []\n", "for dataset_name in tqdm(data.keys()):\n", " X = data[dataset_name]\n", "\n", " connected_k = 2\n", " while True:\n", " p = UMAP(n_neighbors=connected_k, transform_mode=\"graph\").fit(X)\n", " if connected_components(p.graph_, directed=False, return_labels=False) == 1:\n", " break\n", " connected_k += 1\n", " data_size = X.shape[0]\n", " data_dims = X.shape[1]\n", "\n", " for k in neighbours:\n", " # Compute ground truth\n", " kmst = KMST(num_neighbors=k).fit(X)\n", " m1 = kmst.umap(transform_mode=\"graph\").graph_.copy()\n", " m1.data[:] = 1\n", "\n", " for repeat in range(repeats):\n", " for n in min_descent_neighbours:\n", " if n is None:\n", " n = k\n", " elif n < k:\n", " continue\n", " # Compute Descent kMST\n", " dmst = KMSTDescentLogRecall(\n", " num_neighbors=k,\n", " min_descent_neighbors=n,\n", " ).fit(X)\n", " m2 = dmst.umap(transform_mode=\"graph\").graph_.copy()\n", " m2.data[:] = 1\n", "\n", " # Extract trace measures\n", " true_positive = m1.multiply(m2).nnz\n", " if len(dmst.trace_) == 0:\n", " measures = pd.DataFrame(\n", " {\n", " \"dataset\": [dataset_name],\n", " \"boruvka_num_components\": [[]],\n", " \"descent_distance_fraction\": [[]],\n", " \"boruvka_recall\": [[]],\n", " \"boruvka_distance_fraction\": [[]],\n", " \"descent_num_changes\": [[]],\n", " \"descent_recall\": [[]],\n", " }\n", " )\n", " else:\n", " measures = pd.DataFrame(dmst.trace_)\n", " measures[\"boruvka_distance_fraction\"] = measures[\n", " \"descent_distance_fraction\"\n", " ].apply(lambda x: x[np.argmax(np.isnan(x)) - 1])\n", " # Convert to one row with lists\n", " measures[\"dataset\"] = dataset_name\n", " measures = measures.groupby(\"dataset\").agg(list).reset_index()\n", " # Add per-run measures\n", " measures[\"global_recall\"] = true_positive / m1.nnz\n", " measures[\"global_precision\"] = true_positive / m2.nnz\n", " measures[\"global_dist_frac\"] = (\n", " dmst.graph_.data.sum() / kmst.graph_.data.sum()\n", " )\n", " measures[\"connected_k\"] = connected_k\n", " measures[\"num_observations\"] = data_size\n", " measures[\"num_dimensions\"] = data_dims\n", " measures[\"min_descent_neighbors\"] = n\n", " measures[\"num_neighbors\"] = k\n", " measures[\"repeat\"] = repeat\n", " results.append(measures)\n", "\n", "results = pd.concat(results, ignore_index=True)\n", "results.head()" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "metadata": {} }, "outputs": [], "source": [ "results.to_parquet(\"./data/generated/recall_benchmark.parquet\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Results\n", "\n", "This section creates plots showing our results for each of our questions:\n", "\n", "- How accurate is our NN-Descent for constructing $k$-MSTs?\n", "- How accurate is our NN-Descent in finding shortest edges between connected components?\n", "- How do the parameters influence NN-Descent's performance?" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "from lib.plotting import *\n", "configure_matplotlib()\n", "\n", "import warnings\n", "warnings.filterwarnings(\"ignore\", category=FutureWarning)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "results = pd.read_parquet(\"./data/generated/recall_benchmark.parquet\")\n", "min_descent_neighbours = results.min_descent_neighbors.unique()" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datasetnum_observationsnum_dimensionsconnected_k
0diabetes442103
1digits1797648
2horse8431315
3iris150426
4mnist700007844
5wine178134
\n", "
" ], "text/plain": [ " dataset num_observations num_dimensions connected_k\n", "0 diabetes 442 10 3\n", "1 digits 1797 64 8\n", "2 horse 8431 3 15\n", "3 iris 150 4 26\n", "4 mnist 70000 784 4\n", "5 wine 178 13 4" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.groupby('dataset').agg({'num_observations': 'first', 'num_dimensions': 'first', 'connected_k': 'first'}).reset_index()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "results[\"num_boruvka_iters\"] = results.boruvka_recall.apply(len)\n", "results[\"boruvka_iteration\"] = results.num_boruvka_iters.apply(lambda x: list(range(x)))\n", "\n", "vars = [\n", " \"dataset\",\n", " \"repeat\",\n", " \"connected_k\",\n", " \"num_neighbors\",\n", " \"num_observations\",\n", " \"min_descent_neighbors\",\n", "]\n", "measures = [\n", " \"boruvka_iteration\",\n", " \"boruvka_num_components\",\n", " \"boruvka_recall\",\n", " \"boruvka_distance_fraction\",\n", " \"descent_num_changes\",\n", " \"descent_recall\",\n", " \"descent_distance_fraction\",\n", "]\n", "exploded = results[vars + measures].explode(measures).reset_index(drop=True)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "exploded['num_descent_iters'] = exploded.descent_recall.apply(lambda x: len(x) if hasattr(x, '__len__') else 0)\n", "exploded['descent_converged'] = exploded.num_descent_iters != exploded.descent_recall.apply(lambda x: np.argmax(np.isnan(x)))\n", "exploded['descent_iteration'] = exploded.num_descent_iters.apply(lambda x: list(range(x)))\n", "\n", "vars = ['dataset', 'repeat', 'connected_k', 'num_neighbors', 'min_descent_neighbors', 'boruvka_num_components', 'boruvka_iteration', 'descent_converged']\n", "measures = ['descent_iteration', 'descent_num_changes', 'descent_recall', 'descent_distance_fraction']\n", "twice_exploded = exploded[vars + measures].explode(measures).reset_index(drop=True)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "exploded['descent_final_recall'] = exploded.descent_recall.apply(lambda x: x[np.argmax(np.isnan(x)) - 1] if hasattr(x, '__len__') else np.nan)\n", "exploded['descent_final_dist_frac'] = exploded.descent_distance_fraction.apply(lambda x: x[np.argmax(np.isnan(x)) - 1] if hasattr(x, '__len__') else np.nan)\n", "exploded['descent_final_changes'] = exploded.descent_num_changes.apply(lambda x: x[np.argmax(np.isnan(x)) - 1] if hasattr(x, '__len__') else np.nan)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How accurate is our NN-Descent for constructing $k$-MSTs?\n", "\n", "The globall recall was high (>0.94) in all cases, which is a promising result.\n", "There are two concerns:\n", "\n", "1. Most edges in the $k$-MST are from the $k$-NN, so global recall mostly\n", " reflects how well $k$-NN are found, rather than the MST edges.\n", "2. The global recall was worse at low $k$ for a difficult dataset (with high\n", " connected_k). This is a dataset that requires the MST stage to find the\n", " appropriate edges, as they are not included in the nearest neighbors. So, a\n", " worse performance at low $k$ indicates our approach did not find the nearest\n", " neighbors. The increasing recall at higher $k$ indicates that the higher\n", " neighbours were detected." ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "dataset_order = [\"iris\", \"wine\", \"diabetes\", \"digits\", \"horse\", \"mnist\"]\n", "display_name = dict(\n", " iris=\"Iris\",\n", " wine=\"Wine\",\n", " diabetes=\"Diabetes\",\n", " digits=\"Digits\",\n", " horse=\"Horse\",\n", " mnist=\"MNIST\",\n", ")" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
num_neighbors2346
dataset
iris0.950.950.970.95
wine1.001.001.001.00
diabetes1.001.000.991.00
digits0.990.990.990.99
horse1.001.001.001.00
mnist0.990.970.970.97
\n", "
" ], "text/plain": [ "num_neighbors 2 3 4 6\n", "dataset \n", "iris 0.95 0.95 0.97 0.95\n", "wine 1.00 1.00 1.00 1.00\n", "diabetes 1.00 1.00 0.99 1.00\n", "digits 0.99 0.99 0.99 0.99\n", "horse 1.00 1.00 1.00 1.00\n", "mnist 0.99 0.97 0.97 0.97" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.groupby([\"dataset\", \"num_neighbors\"]).global_recall.mean().unstack().reindex(\n", " dataset_order\n", ").round(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another way to measure the quality of our approximate $k$-MST is by comparing\n", "the total distance over its edges to the ground-truth $k$-MST. The figure below\n", "show the approximate total distance divided by the true total distance. An\n", "optimal solution has a value of $1$. Higher values are worse, lower values\n", "happen when non-exact approximate edges connect components not yet connected by\n", "ground truth edges. Again the most difficult dataset is most different from $1$\n", "lower $k$, indicating we did not find the exact MST edges." ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
num_neighbors2346
dataset
iris0.990.991.01.0
wine1.001.001.01.0
diabetes1.001.001.01.0
digits1.001.001.01.0
horse1.001.001.01.0
mnist1.001.001.01.0
\n", "
" ], "text/plain": [ "num_neighbors 2 3 4 6\n", "dataset \n", "iris 0.99 0.99 1.0 1.0\n", "wine 1.00 1.00 1.0 1.0\n", "diabetes 1.00 1.00 1.0 1.0\n", "digits 1.00 1.00 1.0 1.0\n", "horse 1.00 1.00 1.0 1.0\n", "mnist 1.00 1.00 1.0 1.0" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.groupby([\"dataset\", \"num_neighbors\"]).global_dist_frac.mean().unstack().reindex(\n", " dataset_order\n", ").round(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How accurate is our NN-Descent?\n", "\n", "Instead of looking at the global $k$-MST, lets zoom in to the Boruvka algorithm\n", "and see how well we found the edges we are looking for. Here we see that \n", "the Iris dataset gave the lowest recall. This is also the dataset with the \n", "highest connecting $k$, meaning that the MST stage is actually required!" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sized_fig(1/2)\n", "sns.pointplot(\n", " exploded,\n", " x=\"boruvka_iteration\",\n", " y=\"boruvka_recall\",\n", " hue='dataset',\n", " hue_order=dataset_order,\n", " ci=95,\n", " units=\"repeat\",\n", " markers=['o', 's', 'd', 'x', 'v', 'p'],\n", " linewidth=0.5,\n", " linestyle=':',\n", " markersize=3,\n", " palette=\"tab10\",\n", " native_scale=True,\n", " legend=False,\n", ")\n", "plt.ylim([0, 1.05])\n", "plt.ylabel('Bor\\\\r{u}vka recall')\n", "plt.xlabel('Bor\\\\r{u}vka iteration')\n", "plt.subplots_adjust(0.2, 0.24, 0.95, 0.95)\n", "plt.savefig('images/boruvka_recall_vs_iterations.pdf')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
boruvka_iteration012345
dataset
iris0.8050890.6690390.894097NaNNaNNaN
wine0.9991931.01.01.0NaNNaN
diabetes0.9992731.01.0NaNNaNNaN
digits0.9715630.9679370.959130.986042NaNNaN
horse0.9971530.9904960.9922830.997090.9922281.0
mnist0.9828460.9892490.9957780.9873120.993333NaN
\n", "
" ], "text/plain": [ "boruvka_iteration 0 1 2 3 4 5\n", "dataset \n", "iris 0.805089 0.669039 0.894097 NaN NaN NaN\n", "wine 0.999193 1.0 1.0 1.0 NaN NaN\n", "diabetes 0.999273 1.0 1.0 NaN NaN NaN\n", "digits 0.971563 0.967937 0.95913 0.986042 NaN NaN\n", "horse 0.997153 0.990496 0.992283 0.99709 0.992228 1.0\n", "mnist 0.982846 0.989249 0.995778 0.987312 0.993333 NaN" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "exploded.groupby(['dataset', 'boruvka_iteration']).boruvka_recall.mean().unstack().reindex(dataset_order)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The recall in the descent stage tells a different story, indicating that finding\n", "connecting edges for points that are not part of the shortest edge between\n", "components is more difficult." ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sized_fig(1/2)\n", "display = exploded.copy()\n", "display['dataset'].replace(display_name, inplace=True)\n", "sns.pointplot(\n", " display,\n", " x=\"boruvka_iteration\",\n", " y=\"descent_final_recall\",\n", " hue='dataset',\n", " hue_order=[display_name[l] for l in dataset_order],\n", " ci=95,\n", " units=\"repeat\",\n", " markers=['o', 's', 'd', 'x', 'v', 'p'],\n", " linewidth=0.5,\n", " linestyle=':',\n", " markersize=3,\n", " palette=\"tab10\",\n", " native_scale=True\n", ")\n", "plt.legend(title='')\n", "plt.ylim([0, 1.05])\n", "plt.ylabel('Descent recall')\n", "plt.xlabel('Bor\\\\r{u}vka iteration')\n", "plt.subplots_adjust(0.2, 0.24, 0.95, 0.95)\n", "plt.savefig('images/descent_recall_vs_iteration.pdf')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How do the parameters influence NN-Descent's performance?" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sized_fig(1/2)\n", "sns.pointplot(\n", " exploded,\n", " x=\"num_neighbors\",\n", " y=\"boruvka_recall\",\n", " hue='dataset',\n", " hue_order=dataset_order,\n", " ci=95,\n", " units=\"repeat\",\n", " markers=['o', 's', 'd', 'x', 'v', 'p'],\n", " linewidth=0.5,\n", " linestyle=':',\n", " markersize=3,\n", " palette=\"tab10\",\n", " native_scale=True,\n", " legend=False,\n", ")\n", "plt.ylim([0, 1.05])\n", "plt.ylabel('Bor\\\\r{u}vka recall')\n", "plt.xlabel('Num. neighbors ($k$)')\n", "plt.subplots_adjust(0.2, 0.24, 0.95, 0.95)\n", "plt.savefig('images/boruvka_recall_vs_neighbors.pdf')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sized_fig(1/2)\n", "sns.pointplot(\n", " exploded,\n", " x=\"min_descent_neighbors\",\n", " y=\"boruvka_distance_fraction\",\n", " hue='dataset',\n", " hue_order=dataset_order,\n", " ci=95,\n", " units=\"repeat\",\n", " markers=['o', 's', 'd', 'x', 'v', 'p'],\n", " linewidth=0.5,\n", " linestyle=':',\n", " markersize=3,\n", " palette=\"tab10\",\n", " legend=False,\n", " native_scale=True\n", ")\n", "plt.ylim([0.98, 1.1])\n", "plt.yticks([1, 1.05, 1.1])\n", "plt.xticks(min_descent_neighbours)\n", "plt.ylabel('Distance fraction')\n", "plt.xlabel('Descent neighbors ($k_{descent}$)')\n", "plt.subplots_adjust(0.2, 0.24, 0.95, 0.95)\n", "plt.savefig('images/boruvka_dist_fract_vs_descent_neighbors.pdf', pad_inches=0)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How did the descent stage converge?" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = sized_fig(1/2)\n", "for n, k_d in enumerate(twice_exploded.min_descent_neighbors.unique()):\n", " for i, it in enumerate(twice_exploded.boruvka_iteration.unique()):\n", " if np.isnan(i):\n", " continue\n", " for dataset in twice_exploded.dataset.unique():\n", " for k in twice_exploded.num_neighbors.unique():\n", " for r in twice_exploded.repeat.unique():\n", " d = twice_exploded.query(\n", " f\"dataset == '{dataset}' and num_neighbors == {k} and min_descent_neighbors == {k_d} and boruvka_iteration == {it} and repeat == {r}\"\n", " )\n", " plt.plot(\n", " d.descent_iteration,\n", " d.descent_recall,\n", " linewidth=0.2,\n", " alpha=0.3,\n", " color=\"k\",\n", " )\n", " # plt.vlines(x=exploded.descent_recall.apply(len).max(), ymin=0, ymax=1, color=\"r\", linestyle=\"--\")\n", " plt.ylim([0, 1])\n", " # plt.xlim([0, 50])\n", " # plt.xticks([0, 25, 50])\n", "plt.ylabel('Descent recall')\n", "plt.xlabel('Descent iteration') \n", "plt.subplots_adjust(0.16, 0.24, 0.95, 0.95)\n", "plt.savefig('images/descent_convergence.pdf', pad_inches=0)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "work", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.15" } }, "nbformat": 4, "nbformat_minor": 2 }