diff --git a/examples/notebooks/API_Example.ipynb b/examples/notebooks/API_Example.ipynb index 77bb149ef..d92625140 100644 --- a/examples/notebooks/API_Example.ipynb +++ b/examples/notebooks/API_Example.ipynb @@ -91,19 +91,19 @@ "metadata": {}, "outputs": [], "source": [ - "session_config = {\n", + "session_config_fedavg = {\n", " \"helper\": \"pytorchhelper\",\n", - " \"session_id\": \"session_fedavg\",\n", + " \"session_id\": \"experiment_fedavg\",\n", " \"aggregator\": \"fedavg\"\n", " }\n", "\n", - "result = client.start_session(**session_config)" + "result_fedavg = client.start_session(**session_config_fedavg)" ] }, { "cell_type": "code", - "execution_count": 6, - "id": "acf65237", + "execution_count": 11, + "id": "11fd17ef", "metadata": { "scrolled": true }, @@ -115,7 +115,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 12, "id": "f4968b3a", "metadata": {}, "outputs": [ @@ -123,7 +123,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "OrderedDict([('9069d8eb-d009-4d27-806f-c536791d931a', [0.367333322763443, 0.36899998784065247]), ('3bc70b11-5634-492f-8fa8-e26f161a0a25', [0.4584999978542328, 0.4438333213329315]), ('235b9e7a-1fa8-4c98-ba13-b4bc2249eae4', [0.5398333072662354, 0.5538333058357239]), ('fa88366a-3f74-4bac-8ec6-870e4e947617', [0.715666651725769, 0.7070000171661377]), ('45706812-a1e1-40cc-9c39-b493c82e8ddb', [0.7738333344459534, 0.765999972820282])])\n" + "OrderedDict([('9069d8eb-d009-4d27-806f-c536791d931a', [0.367333322763443, 0.36899998784065247]), ('3bc70b11-5634-492f-8fa8-e26f161a0a25', [0.4584999978542328, 0.4438333213329315]), ('235b9e7a-1fa8-4c98-ba13-b4bc2249eae4', [0.5398333072662354, 0.5538333058357239]), ('fa88366a-3f74-4bac-8ec6-870e4e947617', [0.715666651725769, 0.7070000171661377]), ('45706812-a1e1-40cc-9c39-b493c82e8ddb', [0.7738333344459534, 0.765999972820282]), ('3045a0b5-cd08-4fc9-80ef-3f75b920bf30', [0.7975000143051147, 0.8068333268165588]), ('6c211b10-a0f6-4226-b047-2c28348b783f', [0.8188333511352539, 0.828166663646698]), ('19c96500-8cdd-4aa4-8a6a-78064a497151', [0.8333333134651184, 0.8428333401679993]), ('760fe6fb-0712-4eb6-af9f-a9be5a0575ac', [0.8560000061988831, 0.8458333611488342]), ('5b28807c-0727-4b54-bde4-848fa9224b3b', [0.8671666383743286, 0.8598333597183228])])\n" ] } ], @@ -142,7 +142,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 13, "id": "900eb0a7", "metadata": {}, "outputs": [], @@ -154,23 +154,23 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 14, "id": "d064aaf9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 9, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGdCAYAAAAxCSikAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLMklEQVR4nO3deVhU9f4H8PfMwMwICqjEsDgKioKKiIIQaqsomLfCrNAWlUq7Zl2NvKYtmkvRcjPqalHmlt1fLpW2aJRRWipJoiguoCAIqAOiwgDKDMyc3x/UGAHKIHBmeb+e5zxPc+Z7vn2+z3GctzPnfEYiCIIAIiIiIgsmFbsAIiIiouthYCEiIiKLx8BCREREFo+BhYiIiCweAwsRERFZPAYWIiIisngMLERERGTxGFiIiIjI4jmIXUBbMBqNOHv2LLp06QKJRCJ2OURERNQCgiCgsrIS3t7ekEqv/RmKTQSWs2fPQq1Wi10GERERtUJRURF69OhxzTE2EVi6dOkCoH7BLi4uIldDRERELaHVaqFWq03v49diE4Hlz6+BXFxcGFiIiIisTEsu5+BFt0RERGTxGFiIiIjI4jGwEBERkcVjYCEiIiKLx8BCREREFo+BhYiIiCweAwsRERFZPAYWIiIisngMLERERGTxGFiIiIjI4jGwEBERkcVjYCEiIiKLZxM/fkhERETt42K1Hp+lF6L8sh4vjhsgWh0MLERERNRItkaLNbsLsDXzDHR1RjjKJJh2S294uChFqYeBhYiIiAAABqOAn7JLsWZPPvbmXTDtD/JxQfxwP7g6OYpWGwMLERGRnausqcXm/cVYu7cAhRcvAwCkEiAmyBPxI/wQ1qsrJBKJqDUysBAREdmpgrJqrN1bgM8zilGlqwMAuCgdMCm8Jx6N7IUeXZ1ErvAqBhYiIiI7IggC9uZdwJo9+UjNLoUg1O/vc5Mz4kf44b6hPnCSW148sLyKiIiIqM3V1Bqw9eAZrNlTgJySStP+2wNuQvwIP9zi7w6pVNyvfa6FgYWIiMiGnau4gvVpp/FZeiEuXa4FADjJZZgwtAemjvBFn5s6i1xhyzCwEBER2aADhZewZk8Bvss6hzpj/fc+Pm6dMHW4Lx4cpoZrJ/Hu+GkNBhYiIiIboa8z4rsj57B6TwEOFZWb9of7dcNjI3wR1V8FB5l1NrlnYCEiIrJyF6p0+Cy9EOt/O40SrQ4AIJdJcU+IN6YO90WQj6vIFd44BhYiIiIr9Wc32i2ZZ6CvMwIAbuqiwCMRvfBQRE/c1EUhcoVth4GFiIjIihiMAlKPl2DNngKknbrajXaQjyseG+mLcYO8IXewzq99roWBhYiIyApU1tRi0/5irPtLN1qZVIKYgZ6IH+GLUAvoRtueWhXBVqxYAV9fXyiVSkRERCA9Pb3ZsbfffjskEkmjbdy4caYxU6dObfR8TExMa0ojIiKyKfll1Xjl66O4+bVULPn2GAovXoZrJ0c8eVtv/DL3Dqx4eCjCfLvZdFgBWvEJy8aNG5GQkIDk5GREREQgKSkJ0dHRyMnJgYeHR6PxX375JfR6venxhQsXMHjwYDzwwAMNxsXExGDNmjWmxwqF7XzvRkREZA5BELAnt74b7U85V7vR+nt0RvwIX4wfYpndaNuT2atdtmwZpk2bhvj4eABAcnIytm3bhtWrV2PevHmNxnfr1q3B4w0bNsDJyalRYFEoFPD09DS3HCIiIptxRW/A1swzWLMnHydKqkz77/izG21fd5v/JKU5ZgUWvV6PjIwMzJ8/37RPKpUiKioKaWlpLZpj1apVmDhxIpydnRvs37lzJzw8PNC1a1fceeedWLp0Kbp3797kHDqdDjqdzvRYq9WaswwiIiKLcq7iCj75oxtt+V+60d4f2gNThltPN9r2ZFZgKSsrg8FggEqlarBfpVIhOzv7usenp6fjyJEjWLVqVYP9MTExuO++++Dn54e8vDy88MILGDt2LNLS0iCTyRrNk5iYiEWLFplTOhERkUURBAEHCsuxZk8+vjuigeGPbrQ9utZ3o30gzPq60banDv0CbNWqVRg0aBDCw8Mb7J84caLpvwcNGoTg4GD06dMHO3fuxKhRoxrNM3/+fCQkJJgea7VaqNXq9iuciIiojZi60e7Ox6HiCtP+CL9uiB/hh9EDVJBZ8I8QisWswOLu7g6ZTIaSkpIG+0tKSq57/Ul1dTU2bNiAxYsXX/f/07t3b7i7uyM3N7fJwKJQKHhRLhERWZULVTr83776brSllQ270caP8MVAb+vvRtuezAoscrkcoaGhSE1NRWxsLADAaDQiNTUVTz/99DWP3bx5M3Q6HR555JHr/n+Ki4tx4cIFeHl5mVMeERGRxTl+Tos1e/KxNfNsg260j95c343WvTP/Ad4SZn8llJCQgClTpiAsLAzh4eFISkpCdXW16a6hyZMnw8fHB4mJiQ2OW7VqFWJjYxtdSFtVVYVFixZhwoQJ8PT0RF5eHubOnQt/f39ER0ffwNKIiIjEYTAK+PF4Cdbsycdvpy6a9gf3cEX8CNvtRtuezA4scXFxOH/+PBYsWACNRoOQkBCkpKSYLsQtLCyEVNrwJOTk5GD37t344YcfGs0nk8lw+PBhrFu3DuXl5fD29saYMWOwZMkSfu1DRERWRVtTi02/F2FdWgGKLl4B8Ec32iBPPDbCF0N72nY32vYkEYQ/29FYL61WC1dXV1RUVMDFxUXscoiIyM7kl1Vj3d4CbN5fhGq9AQDg2skRD0X0xKM394K3WyeRK7RM5rx/21ebPCIiojbyZzfa1Xvy8fNfutH29eiM+BF+GD/EB53kjVtzUOswsBAREZnhit6ALQfPYO3eht1o7wz0QPwIX4z0t99utO2JgYWIiKgFmupG6yyX4YEwNaYM94Wfu/N1ZqAbwcBCRETUjD+70a7ek4+Uv3SjVXfrhCmRvnhwmBouSnaj7QgMLERERH+jrzNie9Y5rNnTsBvtzb274bERfhjVn91oOxoDCxER0R+a7EbrIEVsiDemDvfDAG/eiSoWBhYiIrJ7x87Wd6P96tDVbrQef+lG253daEXHwEJERHapuW60g3u44rGRfhgb5MVutBaEgYWIiOxKc91oxwZ5In6EH4b2dONtyRaIgYWIiOxCflk11u7Jx+cZxaZutG5OjpgUzm601oCBhYiIbJYgCNidW4Y1ewrwU3apaX8/VX032tgQdqO1FgwsRERkc67oDfjyYDHW7inAydL6brQSCXBngAfiR/hhhH93fu1jZRhYiIjIZpwtr+9Gu+H3xt1opw73hS+70VotBhYiIrJq9d1oL2H17gKkHL3ajbZnNydMGe6LB8J6sButDWBgISIiq6SvM2Jb1lms2VOAw3/pRhvZuzviR/iyG62NYWAhIiKrUvaXbrTn/9KNdnyID6aO8EV/L3ajtUUMLEREZBWOnq3Amj0F+Pov3WhVLvXdaCeFsxutrWNgISIii2UwCthxrL4b7b78v3SjVbvhsRG+7EZrRxhYiIjI4lRcqcXm/UVYu7cAxZfqu9E6SCUYO8gL8SN8MbRnV5ErpI7GwEJERBbj1PkqrN1bgM8zinH5j260Xf/sRhvZC16u7EZrrxhYiIhIVIIg4NeTZVizJx8/55w37e+n6ozHRvghdogPlI7sRmvvGFiIiEgUf3ajXbOnALl/6UY7KrC+G+3wPuxGS1cxsBARUYc6U34Fn6QVYEN6ESqu1Hej7axwwP2hPdiNlprFwEJERO1OEARknL6ENXsadqPt1d0JUyLru9F2YTdaugYGFiIiald7csvwRkp2g260w/t0R/wIP9wZ6MFutNQiDCxERNRuDhWVI37t79DXGaFwkGL8kPputIGe7EZL5mFgISKidlGqrcH09fuhrzPijoCb8PaDIejmLBe7LLJSDCxERNTmamoNmL4+AyVaHfp6dMZ7k4bwGhW6IexnTEREbUoQBLzwZRYyi8rh2skRH08JY1ihG8bAQkREberjX/Px5cEzkEkleP/hoejVnbcp041jYCEiojazM6cUid8dBwC8PK4/Rvi7i1wR2YpWBZYVK1bA19cXSqUSERERSE9Pb3bs7bffDolE0mgbN26caYwgCFiwYAG8vLzQqVMnREVF4eTJk60pjYiIRJJ3vgrPfHYQRgGYOEyNKcN9xS6JbIjZgWXjxo1ISEjAwoULceDAAQwePBjR0dEoLS1tcvyXX36Jc+fOmbYjR45AJpPhgQceMI1588038d577yE5ORn79u2Ds7MzoqOjUVNT0/qVERFRh6m4Uotp6/ajsqYOw3y7YvG9QWyrT21KIgiCYM4BERERGDZsGJYvXw4AMBqNUKvVeOaZZzBv3rzrHp+UlIQFCxbg3LlzcHZ2hiAI8Pb2xnPPPYc5c+YAACoqKqBSqbB27VpMnDjxunNqtVq4urqioqICLi68t5+IqCMZjALi1/6OX06ch7erEl8/MxLunRVil0VWwJz3b7M+YdHr9cjIyEBUVNTVCaRSREVFIS0trUVzrFq1ChMnToSzc/1FWPn5+dBoNA3mdHV1RURERLNz6nQ6aLXaBhsREYnj9e+O45cT56F0lGLllDCGFWoXZgWWsrIyGAwGqFSqBvtVKhU0Gs11j09PT8eRI0fwxBNPmPb9eZw5cyYmJsLV1dW0qdVqc5ZBRERt5IuMYqz8NR8A8PYDIRjo7SpyRWSrOvQuoVWrVmHQoEEIDw+/oXnmz5+PiooK01ZUVNRGFRIRUUsdKLyE+V9mAQD+dac/xgV7iVwR2TKzAou7uztkMhlKSkoa7C8pKYGnp+c1j62ursaGDRvw+OOPN9j/53HmzKlQKODi4tJgIyKijqOpqMGT6zOgNxgxZoAKs6P6iV0S2TizAotcLkdoaChSU1NN+4xGI1JTUxEZGXnNYzdv3gydTodHHnmkwX4/Pz94eno2mFOr1WLfvn3XnZOIiDpefdv9/ThfqUOgZxe8ExcCKX9xmdqZ2b8llJCQgClTpiAsLAzh4eFISkpCdXU14uPjAQCTJ0+Gj48PEhMTGxy3atUqxMbGonv37g32SyQSzJ49G0uXLkXfvn3h5+eHl19+Gd7e3oiNjW39yoiIqM0JgoDnvziMw8UV6OrkiJWTw+Cs4M/SUfsz+09ZXFwczp8/jwULFkCj0SAkJAQpKSmmi2YLCwshlTb84CYnJwe7d+/GDz/80OScc+fORXV1NaZPn47y8nKMHDkSKSkpUCqVrVgSERG1lw9/OYWvMs/CQSrB+w+HQt3NSeySyE6Y3YfFErEPCxFR+/spuwSPr9sPQQCWxAbh0Zt7iV0SWbl268NCRET2Kbe0Ev/6LBOCADwc0ZNhhTocAwsREV1TxeVaPLFuP6p0dQj364aFdw8UuySyQwwsRETUrDqDEU9/dgAFFy7Dx60TPnh4KOQOfOugjsc/dURE1KzXtmfj15NlcJLL8PGUMHRn230SCQMLERE1adPvRVi9p77t/rIHB6O/F29qIPEwsBARUSMZpy/ixa31bfdnR/VFTBDb7pO4GFiIiKiBs+VX8OT6A6g1CBgb5Il/3dlX7JKIGFiIiOiqK/r6tvtlVTr093LB2w8OZtt9sggMLEREBKC+7f6/Pz+EI2e06O4sx8rJoXCSs+0+WQYGFiIiAgC8vzMP3x4+BwepBB88EooeXdl2nywHAwsREWHHsRL854ccAMDie4MQ7tdN5IqIGmJgISKycydKKjF7w0EIAjA5shceiugpdklEjTCwEBHZsUvVejyxbj+q9QZE9u6Ol/8xQOySiJrEwEJEZKdqDUY89b8DKLx4GepunfD+w0PhKOPbAlkm/skkIrJTS789hrRTF+Asl+HjycPQ1VkudklEzWJgISKyQ5+lF2Jd2mkAwDtxIQjw7CJyRUTXxsBCRGRn0vMvYsFXRwAAc8b0w5iBniJXRHR9DCxERHak+NJlzPg0A7UGAeOCvTDzDn+xSyJqEQYWIiI7cVlfh2mfZOBCtR4DvV3w1v3BkEjYdp+sAwMLEZEdEAQBczYfwvFzWrh3luOjyWFsu09WhYGFiMgO/PenXGzP0sBRJkHyI6HwceskdklEZmFgISKycSlHNFi24wQAYGlsEMJ82XafrA8DCxGRDcvWaJGwKRMAMHW4L+KGse0+WScGFiIiG3Xxj7b7l/UGjPR3x0vj+otdElGrMbAQEdmgWoMRMz7NQPGlK+jV3QnLHxoCB7bdJyvGP71ERDZo0TdHsS//IjorHPDx5DC4ObHtPlk3BhYiIhvz6W+n8elvhZBIgKS4EPRVse0+WT8GFiIiG/LbqQt45eujAIB/RwcgaoBK5IqI2gYDCxGRjSi6WN92v84o4J7B3phxWx+xSyJqMwwsREQ2oFpXh2mf7Mely7UY5OOKN9l2n2wMAwsRkZUzGgUkbMpEtqYS7p0V+GhyKJSOMrHLImpTrQosK1asgK+vL5RKJSIiIpCenn7N8eXl5Zg5cya8vLygUCjQr18/bN++3fT8K6+8AolE0mALDAxsTWlERHYnKfUkvj9aArlMig8fDYWXK9vuk+0x+5evNm7ciISEBCQnJyMiIgJJSUmIjo5GTk4OPDw8Go3X6/UYPXo0PDw88Pnnn8PHxwenT5+Gm5tbg3EDBw7Ejz/+eLUwB/4oFxHR9WzPOof3Uk8CAF67bxBCe3UVuSKi9mF2Kli2bBmmTZuG+Ph4AEBycjK2bduG1atXY968eY3Gr169GhcvXsTevXvh6OgIAPD19W1ciIMDPD09zS2HiMhuHT1bgec2HQIAPDHSD/eH9hC5IqL2Y9ZXQnq9HhkZGYiKiro6gVSKqKgopKWlNXnM119/jcjISMycORMqlQpBQUF47bXXYDAYGow7efIkvL290bt3bzz88MMoLCxstg6dTgetVttgIyKyJ2VVOkz/JANXag24pa875o3l1+hk28wKLGVlZTAYDFCpGt7Xr1KpoNFomjzm1KlT+Pzzz2EwGLB9+3a8/PLLePvtt7F06VLTmIiICKxduxYpKSn44IMPkJ+fj1tuuQWVlZVNzpmYmAhXV1fTplarzVkGEZFV09fVt90/U34Ffu7OWD5pKNvuk81r9wtFjEYjPDw88NFHH0EmkyE0NBRnzpzBW2+9hYULFwIAxo4daxofHByMiIgI9OrVC5s2bcLjjz/eaM758+cjISHB9Fir1TK0EJFdEAQBC78+gt8LLqGLwgErJ4fB1clR7LKI2p1ZgcXd3R0ymQwlJSUN9peUlDR7/YmXlxccHR0hk129xa5///7QaDTQ6/WQyxv/voWbmxv69euH3NzcJudUKBRQKBTmlE5EZBPW/3Yan6UXQSIB3ntoCPw9OotdElGHMOszRLlcjtDQUKSmppr2GY1GpKamIjIyssljRowYgdzcXBiNRtO+EydOwMvLq8mwAgBVVVXIy8uDl5eXOeUREdm0vbllWPTNMQDAvJhA3BHQ+M5MIltl9peeCQkJWLlyJdatW4fjx49jxowZqK6uNt01NHnyZMyfP980fsaMGbh48SJmzZqFEydOYNu2bXjttdcwc+ZM05g5c+Zg165dKCgowN69ezF+/HjIZDJMmjSpDZZIRGT9Ci9cxlP/dwAGo4DxQ3ww/dbeYpdE1KHMvoYlLi4O58+fx4IFC6DRaBASEoKUlBTThbiFhYWQSq/mILVaje+//x7PPvssgoOD4ePjg1mzZuH55583jSkuLsakSZNw4cIF3HTTTRg5ciR+++033HTTTW2wRCIi61alq8MTn/yO8su1GKx2Q+J9g9h2n+yORBAEQewibpRWq4WrqysqKirg4uIidjlERG3GaBQwfX0GfjxeAo8uCnzzzEioXJRil0XUJsx5/+Z9cEREFmzZjhP48XgJ5A5SfDQ5jGGF7BYDCxGRhfrm0Fks/7n+bsnX7xuEELWbuAURiYiBhYjIAh05U4F/f17fdv/JW3vjvqFsu0/2jYGFiMjCnK/UYdon+1FTa8TtATdhbgzb7hMxsBARWRBdnQH//DQD5ypq0PsmZ7w3aQhkUt4RRMTAQkRkIQRBwMtbjyDj9CV0UTrg48lhcFGy7T4RwMBCRGQx1u4twKb9xZBKgOUPDUXvm9h2n+hPDCxERBbg15PnseTb+rb7L9zVH7f1Y+NMor9iYCEiEll+WTWe/r+DMArAhKE98PhIP7FLIrI4DCxERCLS1tRi2if7UXGlFkN6uuHV8UFsu0/UBAYWIiKRGIwCZm/IRG5pFTxdlPjwkVAoHWVil0VkkRhYiIhE8p8fcvBTdikUDlJ8NDkUHmy7T9QsBhYiIhF8lXkGH+zMAwC8eX8wgnu4iVsQkYVjYCEi6mCHisox9/PDAIAZt/fBvSE+IldEZPkYWIiIOlCptgbT1++Hrs6IUYEemDMmQOySiKwCAwsRUQepqTVg+voMlGh18PfojKSJIWy7T9RCDCxERB1AEAS8uOUIMovK4drJER9PDkMXtt0najEGFiKiDrBqdz6+OFAMmVSCFQ8Nha+7s9glEVkVBhYiona268R5vLb9OADgpXH9MbKvu8gVEVkfBhYionZ06nwVnv6/AzAKQFyYGlOH+4pdEpFVYmAhImonFVdq8cQn+1FZU4fQXl2xOHYg2+4TtRIDCxFROzAYBfzrs4M4db4aXq5KJD8SCoUD2+4TtRYDCxFRO3gjJRu7TpyH0lGKlZPDcFMXhdglEVk1BhYiojb25YFifPTLKQDAfx4YjCAfV5ErIrJ+DCxERG3oYOElzPsyCwDwzJ3++Eewt8gVEdkGBhYiojaiqajBk+szoK8zYvQAFZ6N6id2SUQ2g4GFiKgN1NQa8OT6/Sit1KGfqjPeiQuBlG33idoMAwsR0Q0SBAHzvjiMQ8UVcHNyxMeTh6GzwkHssohsCgMLEdEN+uiXU9iaeRYyqQTvPzwUPbs7iV0Skc1hYCEiugE/Z5fi9ZRsAMDCuwdgeB+23SdqD60KLCtWrICvry+USiUiIiKQnp5+zfHl5eWYOXMmvLy8oFAo0K9fP2zfvv2G5iQiEltuaSX+9dlBCAIwKbwnHr25l9glEdksswPLxo0bkZCQgIULF+LAgQMYPHgwoqOjUVpa2uR4vV6P0aNHo6CgAJ9//jlycnKwcuVK+Pj4tHpOIiKxVVyuxRPr9qNSV4dw325YdA/b7hO1J4kgCII5B0RERGDYsGFYvnw5AMBoNEKtVuOZZ57BvHnzGo1PTk7GW2+9hezsbDg6OrbJnH+n1Wrh6uqKiooKuLi4mLMcIiKz1RmMiF/7O349WQYft074+ukR6N6ZnWyJzGXO+7dZn7Do9XpkZGQgKirq6gRSKaKiopCWltbkMV9//TUiIyMxc+ZMqFQqBAUF4bXXXoPBYGj1nEREYkr8Lhu/nixDJ0cZVk4OY1gh6gBm3XdXVlYGg8EAlUrVYL9KpUJ2dnaTx5w6dQo//fQTHn74YWzfvh25ubl46qmnUFtbi4ULF7ZqTp1OB51OZ3qs1WrNWQYRUatt2l+EVbvzAQDLHhyMAd78VJeoI7T7XUJGoxEeHh746KOPEBoairi4OLz44otITk5u9ZyJiYlwdXU1bWq1ug0rJiJqWsbpS3hpyxEAwKxRfTF2kJfIFRHZD7MCi7u7O2QyGUpKShrsLykpgaenZ5PHeHl5oV+/fpDJrv6sev/+/aHRaKDX61s15/z581FRUWHaioqKzFkGEZHZzlVcqW+7bzAiZqAnZo3qK3ZJRHbFrMAil8sRGhqK1NRU0z6j0YjU1FRERkY2ecyIESOQm5sLo9Fo2nfixAl4eXlBLpe3ak6FQgEXF5cGGxFRe7miN2D6Jxkoq9Ih0LML3n5wMNvuE3Uws78SSkhIwMqVK7Fu3TocP34cM2bMQHV1NeLj4wEAkydPxvz5803jZ8yYgYsXL2LWrFk4ceIEtm3bhtdeew0zZ85s8ZxERGIRBAFzvziMrDMV6OYsx8rJYXBm232iDmf2qy4uLg7nz5/HggULoNFoEBISgpSUFNNFs4WFhZBKr+YgtVqN77//Hs8++yyCg4Ph4+ODWbNm4fnnn2/xnEREYnl/Zx6+OXQWDn+03Vd3Y9t9IjGY3YfFErEPCxG1hx+PlWDa+v0QBODV8UF4OIKdbInaUrv1YSEishcnSioxa0N92/1Hbu7JsEIkMgYWIqK/uVStxxPr9qNab8DNvbth4d0DxS6JyO4xsBAR/UWtwYiZ/3cAhRcvo0fXTnj/4VA4yvhXJZHY+CokIvqLV7cdx968C3CSy/DxlDB0c5aLXRIRgYGFiMhkQ3oh1u4tAAAsezAEgZ68iJ/IUjCwEBEB+L3gIl7+qr7tfsLofogJarrTNhGJg4GFiOzemfIr+Of6DNQaBIwb5IVn7vQXuyQi+hsGFiKya5f1dZi2bj8uVOsxwMsFbz0QDImEbfeJLA0DCxHZLUEQ8O/Nh3HsnBbdneVYOSUMTnK23SeyRAwsRGS3lv+Ui21Z5+AokyD50VD4uHUSuyQiagYDCxHZpZQjGry94wQAYMm9QRjm203kiojoWhhYiMjuZGu0SNiUCQCYOtwXE8N7ilsQEV0XAwsR2ZWL1XpM+2Q/LusNGN6nO14c11/skoioBRhYiMhu1BqMeOp/GSi6eAU9uzlhxUND2XafyErwlUpEdmPxN8fw26mLcP6j7X5Xtt0nshoMLERkF/637zTW/3YaEgnw7sQh6KfqInZJRGQGBhYisnn7Tl3Awq+OAgDmjAlA1ACVyBURkbkYWIjIphVdvIwZ/zuAOqOAfwR74anb+4hdEhG1AgMLEdmsal0dpn2yHxer9QjyccFb9w9m230iK8XAQkQ2yWgUkLApE9maSrh3VuCjR8PQSS4TuywiaiUGFiKySe+mnsT3R0sgl0nx4aOh8GbbfSKrxsBCRDbnu6xzeDf1JABg6fgghPbqKnJFRHSjGFiIyKYcO6tFwqZDAIDHRvjhwTC1yBURUVtgYCEim1FWpcO0T/bjSq0Bt/R1xwt3BYpdEhG1EQYWIrIJ+jojnvr0AM6UX4FvdycsnzQUDmy7T2Qz+GomIqsnCAIWfn0U6QUX0VnhgI+nhMHVyVHssoioDTGwEJHV+/S30/gsvRASCfDepBD4e7DtPpGtYWAhIqu2N7cMr3xzDADwfEwg7gxk230iW8TAQkRWq/DCZTz1fwdgMAqIDfHGk7f2FrskImonDCxEZJWq/mi7X365FsE9XPH6hGC23SeyYQwsRGR1jEYBz27MRE5JJW7qUt92X+nItvtEtqxVgWXFihXw9fWFUqlEREQE0tPTmx27du1aSCSSBptSqWwwZurUqY3GxMTEtKY0IrID7/x4AjuOlUDuIMVHj4bC01V5/YOIyKo5mHvAxo0bkZCQgOTkZERERCApKQnR0dHIycmBh4dHk8e4uLggJyfH9Lipj21jYmKwZs0a02OFQmFuaURkB749fBb//SkXAJA4fhCG9GTbfSJ7YPYnLMuWLcO0adMQHx+PAQMGIDk5GU5OTli9enWzx0gkEnh6epo2larxVfwKhaLBmK5d+ZcQETV05EwF5myub7s/7RY/TAjtIXJFRNRRzAoser0eGRkZiIqKujqBVIqoqCikpaU1e1xVVRV69eoFtVqNe++9F0ePHm00ZufOnfDw8EBAQABmzJiBCxcuNDufTqeDVqttsBGRbTtfqcP0T/ajptaI2/rdhHlj+4tdEhF1ILMCS1lZGQwGQ6NPSFQqFTQaTZPHBAQEYPXq1fjqq6/w6aefwmg0Yvjw4SguLjaNiYmJwSeffILU1FS88cYb2LVrF8aOHQuDwdDknImJiXB1dTVtajV/3IzIlunqDPjnpxk4W1GD3u7OeG/SEMikvCOIyJ5IBEEQWjr47Nmz8PHxwd69exEZGWnaP3fuXOzatQv79u277hy1tbXo378/Jk2ahCVLljQ55tSpU+jTpw9+/PFHjBo1qtHzOp0OOp3O9Fir1UKtVqOiogIuLi4tXQ4RWQFBEPD8F4exaX8xuigdsHXmCPS5qbPYZRFRG9BqtXB1dW3R+7dZn7C4u7tDJpOhpKSkwf6SkhJ4enq2aA5HR0cMGTIEubm5zY7p3bs33N3dmx2jUCjg4uLSYCMi26OrM2DJt8exaX8xpBLgv5OGMKwQ2SmzAotcLkdoaChSU1NN+4xGI1JTUxt84nItBoMBWVlZ8PLyanZMcXExLly4cM0xRGTbcksrMX7FXqzekw8AeOGu/rg9oOk7EYnI9pl9W3NCQgKmTJmCsLAwhIeHIykpCdXV1YiPjwcATJ48GT4+PkhMTAQALF68GDfffDP8/f1RXl6Ot956C6dPn8YTTzwBoP6C3EWLFmHChAnw9PREXl4e5s6dC39/f0RHR7fhUonIGgiCgE9/O42l245DV2dEVydHvDEhGGMGtuxTXCKyTWYHlri4OJw/fx4LFiyARqNBSEgIUlJSTBfiFhYWQiq9+sHNpUuXMG3aNGg0GnTt2hWhoaHYu3cvBgwYAACQyWQ4fPgw1q1bh/Lycnh7e2PMmDFYsmQJe7EQ2ZmyKh3mfn4YP2WXAgBu6euO/zwwGCoXNoYjsndmXXRrqcy5aIeILNPPOaX49+ZDKKvSQy6T4vmxgYgf7gsp7wYislnmvH+b/QkLEVFbqqk1IHH7caxLOw0A6KfqjHcnDkF/L/7jg4iuYmAhItEcO6vFrA0HcbK0CgAwdbgv5o0N5A8ZElEjDCxE1OGMRgGr9+TjzZQc6A1GuHdW4D8PBPMuICJqFgMLEXWoEm0Nntt0CLtzywAAUf098MaEYHTvzIvsiah5DCxE1GFSjmgw78vDKL9cC6WjFC//YwAeCu/Z5C+4ExH9FQMLEbW7al0dlnx7DBt+LwIADPR2wbsTh8Dfg11riahlGFiIqF0dKirH7I2ZyC+rhkQCTL+1N54bHQC5g1mNtonIzjGwEFG7MBgFJO/Kwzs7TqDOKMDTRYllcYMxvI+72KURkRViYCGiNld86TISNh5CesFFAMC4QV54dXwQ3JzkIldGRNaKgYWI2tRXmWfw0tYjqKypg7NchkX3BmHCUB9eWEtEN4SBhYjahLamFgu/OootB88AAELUbnh3Ygh6dXcWuTIisgUMLER0w34vuIjZGzJxpvwKpBLg6Tv74pk7/eEo44W1RNQ2GFiIqNVqDUb8N/Uklv+cC6MA9OjaCUlxIQjz7SZ2aURkYxhYiKhVCsqqMXtjJjKLygEA9w3xwaJ7B6KL0lHcwojIJjGwEJFZBEHA5oxivPL1UVzWG9BF6YBXxw/CPYO9xS6NiGwYAwsRtVj5ZT1e2JKF7VkaAEC4Xze8ExcCH7dOIldGRLaOgYWIWmRvbhkSNh2CRlsDB6kECWP64clb+0Am5e3KRNT+GFiI6Jp0dQYs++EEPvr1FAQB8HN3xrsTQxDcw03s0ojIjjCwEFGzcksrMWtDJo6e1QIAJoWr8fI/BsBJzr86iKhj8W8dImpEEAR8uq8Qr247hppaI7o6OeL1CcGIHugpdmlEZKcYWIiogbIqHZ7//DBSs0sBALf0dcd/HhgMlYtS5MqIyJ4xsBCRyc85pfj35kMoq9JDLpPi+bGBiB/uCykvrCUikTGwEBFqag14/btsrN1bAADop+qMdycOQX8vF3ELIyL6AwMLkZ07dlaL2RsP4kRJFQBg6nBfzBsbCKWjTOTKiIiuYmAhslNGo4DVe/LxZkoO9AYj3Dsr8NYDwbgjwEPs0oiIGmFgIbJDJdoazNl8CL+eLAMARPX3wOsTguHeWSFyZURETWNgIbIzKUc0mP/lYVy6XAuloxQvjRuAhyN6QiLhhbVEZLkYWIjsRLWuDku+PYYNvxcBAAZ6u+DdiSHw9+gicmVERNfHwEJkBw4VlWP2xkzkl1VDIgGm39obz40OgNxBKnZpREQtwsBCZMMMRgHJu/Lwzo4TqDMK8HRRYtmDgzHc313s0oiIzMLAQmSjii9dRsKmQ0jPvwgAuGuQJ14bPwhuTnKRKyMiMl+rPg9esWIFfH19oVQqERERgfT09GbHrl27FhKJpMGmVDZs8S0IAhYsWAAvLy906tQJUVFROHnyZGtKIyIAXx86i7Hv/or0/Itwlsvw1v3BWPHQUIYVIrJaZgeWjRs3IiEhAQsXLsSBAwcwePBgREdHo7S0tNljXFxccO7cOdN2+vTpBs+/+eabeO+995CcnIx9+/bB2dkZ0dHRqKmpMX9FRHassqYWCRsz8a/PDqKypg4hajdsn3ULHghT8y4gIrJqZgeWZcuWYdq0aYiPj8eAAQOQnJwMJycnrF69utljJBIJPD09TZtKpTI9JwgCkpKS8NJLL+Hee+9FcHAwPvnkE5w9exZbt25t1aKI7NH+gosY++6v+PLgGUglwL9G9cXmf0aiV3dnsUsjIrphZgUWvV6PjIwMREVFXZ1AKkVUVBTS0tKaPa6qqgq9evWCWq3Gvffei6NHj5qey8/Ph0ajaTCnq6srIiIimp1Tp9NBq9U22IjsVZ3BiGU7TuDBD9NQfOkKenTthE1PRiJhdD84yngXEBHZBrP+NisrK4PBYGjwCQkAqFQqaDSaJo8JCAjA6tWr8dVXX+HTTz+F0WjE8OHDUVxcDACm48yZMzExEa6urqZNrVabswwim3H6QjXuT07De6knYRSA+4b4YPusWxDm203s0oiI2lS73yUUGRmJyMhI0+Phw4ejf//++PDDD7FkyZJWzTl//nwkJCSYHmu1WoYWsiuCIODzjGK88vVRVOsN6KJ0wNLYINwb4iN2aURE7cKswOLu7g6ZTIaSkpIG+0tKSuDp6dmiORwdHTFkyBDk5uYCgOm4kpISeHl5NZgzJCSkyTkUCgUUCv7mCdmn8st6vLjlCLZlnQMAhPt1w7IHB6NHVyeRKyMiaj9mfSUkl8sRGhqK1NRU0z6j0YjU1NQGn6Jci8FgQFZWlimc+Pn5wdPTs8GcWq0W+/bta/GcRPZib14ZYpJ+xbasc3CQSvDv6AB8Nu1mhhUisnlmfyWUkJCAKVOmICwsDOHh4UhKSkJ1dTXi4+MBAJMnT4aPjw8SExMBAIsXL8bNN98Mf39/lJeX46233sLp06fxxBNPAKi/g2j27NlYunQp+vbtCz8/P7z88svw9vZGbGxs262UyIrp64x4+4ccfPTrKQgC4OfujHcnhiC4h5vYpRERdQizA0tcXBzOnz+PBQsWQKPRICQkBCkpKaaLZgsLCyGVXv3g5tKlS5g2bRo0Gg26du2K0NBQ7N27FwMGDDCNmTt3LqqrqzF9+nSUl5dj5MiRSElJadRgjsge5ZZWYdaGgzh6tv5uuEnharw0bgCcFWxUTUT2QyIIgiB2ETdKq9XC1dUVFRUVcHFxEbscojYhCAL+t68QS7cdQ02tEV2dHJF4XzBiglp2vRgRkaUz5/2b/0QjskBlVTrM++Iwfjxe30H6lr7u+M8Dg6Fy4aeORGSfGFiILMzOnFLM2XwYZVU6yGVSzI0JwGMj/CCVsrU+EdkvBhYiC1FTa8Dr32Vj7d4CAEA/VWckxQ3BAG9+zUlExMBCZAGOn9Ni1oaDOFFSBQCYOtwX88YGQukoE7kyIiLLwMBCJCKjUcCavQV447ts6A1GuHeW4637B+OOQA+xSyMisigMLEQiKdHWYM7mQ/j1ZBkAYFSgB964PxjundnFmYjo7xhYiETw/VEN5n1xGJcu10LpKMWL4wbgkYiekEh4YS0RUVMYWIg60GV9HZZ8exyfpRcCAAZ4ueC9SSHw9+gicmVERJaNgYWogxwuLsfsDZk4VVYNiQSYfktvJIzpB4UDL6wlIroeBhaidmYwCkjelYd3dpxAnVGAp4sSyx4cjOH+7mKXRkRkNRhYiNrRmfIreHZjJtLzLwIAxgZ5IvG+QXBzkotcGRGRdWFgIWon3xw6ixe2ZKGypg5OchleuWcgHgjtwQtriYhagYGFqI1V1tRi4VdH8eXBMwCAELUbkuJC4OvuLHJlRETWi4GFqA1lnL6I2RszUXTxCqQS4Ok7/PHMqL5wlEnFLo2IyKoxsBC1gTqDEe/9lIvlP52EUQB6dO2Ed+JCMMy3m9ilERHZBAYWoht0+kI1Zm/MxMHCcgDA+CE+WHTvQLgoHcUtjIjIhjCwELWSIAj4PKMYr3x9FNV6A7ooHbA0Ngj3hviIXRoRkc1hYCFqhYrLtXhhSxa2ZZ0DAIT7dsOyuMHo0dVJ5MqIiGwTAwuRmfbmleG5TYdwrqIGDlIJnh3dD/+8rQ9kUt6uTETUXhhYiFpIX2fE2zty8NEvpyAIgJ+7M5LiQjBY7SZ2aURENo+BhagFckurMHvjQRw5owUATBymxsv/GABnBV9CREQdgX/bEl2DIAj4375CLN12DDW1Rrg5OeL1+4IRE+QpdmlERHaFgYWoGReqdHj+i8P48XgpAGCkvzvefnAwVC5KkSsjIrI/DCxETdiZU4o5mw+jrEoHuUyKuTEBeGyEH6S8sJaISBQMLER/UVNrwOvfZWPt3gIAQF+Pznh34hAM8HYRtzAiIjvHwEL0h2yNFrM+y0ROSSUAYEpkL8y/qz+UjjKRKyMiIgYWsntGo4C1ewvweko29HVGuHeW4637B+OOQA+xSyMioj8wsJBdK9XW4LnNh/DryTIAwJ2BHnjz/mC4d1aIXBkREf0VAwvZrR+OavD8F4dx6XItFA5SvPSPAXgkoickEl5YS0RkaRhYyO5c1tdhybfH8Vl6IQBggJcL3psUAn+PLiJXRkREzWFgIbuSVVyBWRsO4lRZNQBg+q298dyYflA48MJaIiJLJm3NQStWrICvry+USiUiIiKQnp7eouM2bNgAiUSC2NjYBvunTp0KiUTSYIuJiWlNaURNMhgFvL8zF+Pf34NTZdXwdFHif09E4IW7+jOsEBFZAbM/Ydm4cSMSEhKQnJyMiIgIJCUlITo6Gjk5OfDwaP6uioKCAsyZMwe33HJLk8/HxMRgzZo1pscKBS96pLZxtvwKnt2YiX35FwEAY4M88dr4QejqLBe5MiIiaimzP2FZtmwZpk2bhvj4eAwYMADJyclwcnLC6tWrmz3GYDDg4YcfxqJFi9C7d+8mxygUCnh6epq2rl27mlsaUQNGo4D/7TuNmKRfsC//IpzkMrw5IRjvPzyUYYWIyMqYFVj0ej0yMjIQFRV1dQKpFFFRUUhLS2v2uMWLF8PDwwOPP/54s2N27twJDw8PBAQEYMaMGbhw4UKzY3U6HbRabYON6K+OndViQvJevLjlCLQ1dRisdsP2f92CB4epeRcQEZEVMusrobKyMhgMBqhUqgb7VSoVsrOzmzxm9+7dWLVqFTIzM5udNyYmBvfddx/8/PyQl5eHF154AWPHjkVaWhpkssbXFyQmJmLRokXmlE52okpXh3d2nMDavQUwGAV0VjggYXQ/TI7sBQdZqy7ZIiIiC9CudwlVVlbi0UcfxcqVK+Hu7t7suIkTJ5r+e9CgQQgODkafPn2wc+dOjBo1qtH4+fPnIyEhwfRYq9VCrVa3bfFkVQRBQMoRDRZ9cwwabQ0AYNwgL7z8jwHwdOWvKxMRWTuzAou7uztkMhlKSkoa7C8pKYGnp2ej8Xl5eSgoKMDdd99t2mc0Guv/xw4OyMnJQZ8+fRod17t3b7i7uyM3N7fJwKJQKHhRLpkUXbyMBV8dwc855wEAPbs5YfG9A3F7AFvrExHZCrMCi1wuR2hoKFJTU023JhuNRqSmpuLpp59uND4wMBBZWVkN9r300kuorKzEu+++2+ynIsXFxbhw4QK8vLzMKY/sjL7OiJW/nsJ/fzqJmlojHGUS/PO2Pph5hz9/sJCIyMaY/ZVQQkICpkyZgrCwMISHhyMpKQnV1dWIj48HAEyePBk+Pj5ITEyEUqlEUFBQg+Pd3NwAwLS/qqoKixYtwoQJE+Dp6Ym8vDzMnTsX/v7+iI6OvsHlka367dQFvLT1CHJLqwAAkb27Y0lsEPw9OotcGRERtQezA0tcXBzOnz+PBQsWQKPRICQkBCkpKaYLcQsLCyGVtvziRplMhsOHD2PdunUoLy+Ht7c3xowZgyVLlvBrH2qkrEqH17Yfx5cHzgAAujvL8dI/+iM2xId3/xAR2TCJIAiC2EXcKK1WC1dXV1RUVMDFxUXscqgdGI0CNu4vwuvfZaPiSi0kEuCh8J6YGx0IVydHscsjIqJWMOf9m78lRBbv+DktXtyShQOF5QDqf6zw1fFBGNKTzQWJiOwFAwtZrGpdHZJ+PIHVe+p7qjjLZUgYE4Ap7KlCRGR3GFjI4giCgO+PlmDRN0dxrqK+p8pdgzzx8j8GwMu1k8jVERGRGBhYyKIUXbyMV74+itTsUgCAulsnLL4nCHcEsqcKEZE9Y2Ahi6CvM+Lj3afwXurVnipP3lrfU6WTnD1ViIjsHQMLiW7fHz1VTv7RUyXCrxteHR8Ef48uIldGRESWgoGFRHOhSofE77LxeUYxgPqeKi+O64/xQ9hThYiIGmJgoQ5nNArYtL8Ir6dko/xyLQDgoYiemBsdADcnucjVERGRJWJgoQ6VrdHixS1HkHH6EgAg0LMLXh0/CKG92FOFiIiax8BCHaJaV4d3U09i1e58GIwCnOQyJIzuh6nDfdlThYiIrouBhdrdD0c1eOXrozj7R0+VmIGeWHD3AHi7sacKERG1DAMLtZviS/U9VX48Xt9TpUfXTlh870DcGagSuTIiIrI2DCzU5moNRnz8az7eSz2JK7UGOMokmH5rbzx9R1/2VCEiolZhYKE2lZ5/ES9tzcKJkvqeKuF+3fBqbBD6qthThYiIWo+BhdrExWo9Ercfx+Y/eqp0c5bjhbv6Y8JQ9lQhIqIbx8BCN8RoFLA5owiJ313tqTIpXI3nYwLZU4WIiNoMAwu1Wo6mEi9uycL+Bj1VghDaq5vIlRERka1hYCGzXdb/0VPl13zU/dFT5dmofpg6wheO7KlCRETtgIGFzLLjWAle+foozpRfAQBED1Rh4d0D2VOFiIjaFQMLtUh9T5Vj+PF4CQDAx62+p8qo/uypQkRE7Y+Bha6p1mDE6t35SPqxvqeKg1SCabf2xjN3+sNJzj8+RETUMfiOQ83aX3ARL245gpySSgBAuG83LB0fhH7sqUJERB2MgYUauVStx+vfZWPj/iIA9T1V5o8NxP2hPdhThYiIRMHAQiaCIGBzRjEStx/HpT96qkwcVt9Tpasze6oQEZF4GFgIAHCipBIvbTmC9IKLAIAAVX1PlTBf9lQhIiLxMbDYucv6OryXmouPfz2FOqOATo4yPDu6L+JH+LGnChERWQwGFjv247ESLPxLT5UxA1RYeM9A+LCnChERWRgGFjt0pvwKFn19FD8cu9pT5ZV7BmL0APZUISIiy8TAYkdqDUas2VPfU+Wyvr6nyhO39Ma/RrGnChERWTa+S9mJjNP1PVWyNfU9VYb5dsXS2EEI8GRPFSIisnwMLDbuUrUeb6RkY8Pv9T1Vujo5Yv5d/XH/0B6QStlThYiIrEOrbgNZsWIFfH19oVQqERERgfT09BYdt2HDBkgkEsTGxjbYLwgCFixYAC8vL3Tq1AlRUVE4efJka0qjPwiCgM8zijFq2S5TWHkwrAdSn7sdD4apGVaIiMiqmB1YNm7ciISEBCxcuBAHDhzA4MGDER0djdLS0mseV1BQgDlz5uCWW25p9Nybb76J9957D8nJydi3bx+cnZ0RHR2Nmpoac8sjACdLKhH30W+Ys/kQLlbr0U/VGZv/GYk37x+MbmwAR0REVkgiCIJgzgEREREYNmwYli9fDgAwGo1Qq9V45plnMG/evCaPMRgMuPXWW/HYY4/h119/RXl5ObZu3Qqg/pMAb29vPPfcc5gzZw4AoKKiAiqVCmvXrsXEiROvW5NWq4WrqysqKirg4uJiznJsyhW9Af/96SQ++uVqT5XZUX3x2Ej2VCEiIstjzvu3We9ier0eGRkZiIqKujqBVIqoqCikpaU1e9zixYvh4eGBxx9/vNFz+fn50Gg0DeZ0dXVFREREs3PqdDpotdoGm737KbsEo9/Zhfd35qHOKCCqvwo7Em7Fk7f1YVghIiKrZ9ZFt2VlZTAYDFCpGvbrUKlUyM7ObvKY3bt3Y9WqVcjMzGzyeY1GY5rj73P++dzfJSYmYtGiReaUbrPOll/Bom+O4vuj9T1VvF2VeOWegRgz0FPkyoiIiNpOu94lVFlZiUcffRQrV66Eu7t7m807f/58JCQkmB5rtVqo1eo2m98a1BqMWLunAO/8eMLUU+XxkX7416i+cFbw5i8iIrItZr2zubu7QyaToaSkpMH+kpISeHo2/hd9Xl4eCgoKcPfdd5v2GY3G+v+xgwNycnJMx5WUlMDLy6vBnCEhIU3WoVAooFAozCndpmScvoQXt2SZeqqE9eqKpeODEOhpv9fvEBGRbTPr4ga5XI7Q0FCkpqaa9hmNRqSmpiIyMrLR+MDAQGRlZSEzM9O03XPPPbjjjjuQmZkJtVoNPz8/eHp6NphTq9Vi3759Tc5pz8ov6zH/yyxM+GAvsjWVcHNyxJsTgrHpyUiGFSIismlmf3eQkJCAKVOmICwsDOHh4UhKSkJ1dTXi4+MBAJMnT4aPjw8SExOhVCoRFBTU4Hg3NzcAaLB/9uzZWLp0Kfr27Qs/Pz+8/PLL8Pb2btSvxV4JgoAvD5zBa9uP40K1HgDwQGgPzL+rP29TJiIiu2B2YImLi8P58+exYMECaDQahISEICUlxXTRbGFhIaRS8+5KmTt3LqqrqzF9+nSUl5dj5MiRSElJgVKpNLc8m5NbWokXtxzBvvyLAIB+qs5YGjsI4X7dRK6MiIio45jdh8US2WIflit6A5b/XN9TpdYgQOkoxaxR/fD4SD/IHXibMhERWT9z3r95O4kF+jm7FAu+PoKii1cAAKMCPfDKPQOh7uYkcmVERETiYGCxIOcqrmDxN8fw3ZH6/jPerkosvGcgxgxQQSLhb/8QEZH9YmCxAHUGI9buLcA7O06gWm+A7I+eKrPYU4WIiAgAA4voDhRewotbjuD4ufqfFwjt1RVLY4PQ38s2rsUhIiJqCwwsIqm4XIs3vs/GZ+mFEATAtZMj5o8NxINhakil/PqHiIjorxhYOpggCNiaeQZLv73aU+X+0B6YPzYQ3Tvbb/deIiKia2Fg6UC5pVV4eesRpJ26AADo69EZS2ODENG7u8iVERERWTYGlg5QU2vA8p9y8eEveaaeKv8a1RdPjOzNnipEREQtwMDSzn7OKcXCr46i8OJlAMCdgR5YxJ4qREREZmFgaSeaihos/vYotmfV91TxclVi4d0DET2QPVWIiIjMxcDSxuoMRnySdhpv/5Bj6qny2AhfzI7qx54qRERErcR30DZ08I+eKsf+6KkytKcbXh0/iD1ViIiIbhADSxuouFKLt77Pxv/2Xe2pMm9sIOLYU4WIiKhNMLDcAEEQ8FXmWSzddgxlVfU9VSYM7YH5dwXCnT1ViIiI2gwDSyvlna/vqbI3r76nSp+bnLE0dhAi+7CnChERUVtjYDFTTa0BK37OxYe7TkFvMELhUN9TZdot7KlCRETUXhhYzLDrxHm8vPWIqafKHQE3YdE9QejZnT1ViIiI2hMDSwuUaGuw+Ntj2Hb4HADA00WJV+4ZgOiBnuypQkRE1AEYWK6hzmDE+t9O4+0fTqBKVweZVIL44b6YPbofOrOnChERUYfhu+41nCipwuJvj0EQgBC1G14dH4SB3q5il0VERGR3GFiuYYC3C566vQ+83Tph0rCe7KlCREQkEgaW6/h3dKDYJRAREdk93odLREREFo+BhYiIiCweAwsRERFZPAYWIiIisngMLERERGTxGFiIiIjI4jGwEBERkcVjYCEiIiKL16rAsmLFCvj6+kKpVCIiIgLp6enNjv3yyy8RFhYGNzc3ODs7IyQkBOvXr28wZurUqZBIJA22mJiY1pRGRERENsjsTrcbN25EQkICkpOTERERgaSkJERHRyMnJwceHh6Nxnfr1g0vvvgiAgMDIZfL8e233yI+Ph4eHh6Ijo42jYuJicGaNWtMjxUKRSuXRERERLZGIgiCYM4BERERGDZsGJYvXw4AMBqNUKvVeOaZZzBv3rwWzTF06FCMGzcOS5YsAVD/CUt5eTm2bt1qXvV/0Gq1cHV1RUVFBVxcXFo1BxEREXUsc96/zfpKSK/XIyMjA1FRUVcnkEoRFRWFtLS06x4vCAJSU1ORk5ODW2+9tcFzO3fuhIeHBwICAjBjxgxcuHDBnNKIiIjIhpn1lVBZWRkMBgNUKlWD/SqVCtnZ2c0eV1FRAR8fH+h0OshkMrz//vsYPXq06fmYmBjcd9998PPzQ15eHl544QWMHTsWaWlpkMlkjebT6XTQ6XSmx1qt1pxlEBERkZXpkF9r7tKlCzIzM1FVVYXU1FQkJCSgd+/euP322wEAEydONI0dNGgQgoOD0adPH+zcuROjRo1qNF9iYiIWLVrUaD+DCxERkfX48327RVenCGbQ6XSCTCYTtmzZ0mD/5MmThXvuuafF8zz++OPCmDFjrjnG3d1dSE5ObvK5mpoaoaKiwrQdO3ZMAMCNGzdu3Lhxs8KtqKjoutnBrE9Y5HI5QkNDkZqaitjYWAD1F92mpqbi6aefbvE8RqOxwVc6f1dcXIwLFy7Ay8uryecVCkWDu4g6d+6MoqIidOnSBRKJpMV1tIRWq4VarUZRUZFNXtBr6+sDbH+NXJ/1s/U12vr6ANtfY3utTxAEVFZWwtvb+7pjzf5KKCEhAVOmTEFYWBjCw8ORlJSE6upqxMfHAwAmT54MHx8fJCYmAqj/+iYsLAx9+vSBTqfD9u3bsX79enzwwQcAgKqqKixatAgTJkyAp6cn8vLyMHfuXPj7+ze47flapFIpevToYe5SzOLi4mKTfwj/ZOvrA2x/jVyf9bP1Ndr6+gDbX2N7rM/V1bVF48wOLHFxcTh//jwWLFgAjUaDkJAQpKSkmC7ELSwshFR69eaj6upqPPXUUyguLkanTp0QGBiITz/9FHFxcQAAmUyGw4cPY926dSgvL4e3tzfGjBmDJUuWsBcLERERAWhFHxZ7Y+s9Xmx9fYDtr5Hrs362vkZbXx9g+2u0hPXxt4SuQ6FQYOHChTb7aY+trw+w/TVyfdbP1tdo6+sDbH+NlrA+fsJCREREFo+fsBAREZHFY2AhIiIii8fAQkRERBaPgYWIiIgsHgMLgBUrVsDX1xdKpRIRERFIT0+/5vjNmzcjMDAQSqUSgwYNwvbt2zuo0tYxZ31r166FRCJpsCmVyg6s1jy//PIL7r77bnh7e0MikWDr1q3XPWbnzp0YOnQoFAoF/P39sXbt2nav80aYu8adO3c2OocSiQQajaZjCjZTYmIihg0bhi5dusDDwwOxsbHIycm57nHW8jpszfqs6XX4wQcfIDg42NRQLDIyEt999901j7GWc/cnc9doTeevKa+//jokEglmz559zXEdfR7tPrBs3LgRCQkJWLhwIQ4cOIDBgwcjOjoapaWlTY7fu3cvJk2ahMcffxwHDx5EbGwsYmNjceTIkQ6uvGXMXR9Q38nw3Llzpu306dMdWLF5qqurMXjwYKxYsaJF4/Pz8zFu3DjccccdyMzMxOzZs/HEE0/g+++/b+dKW8/cNf4pJyenwXn08PBopwpvzK5duzBz5kz89ttv2LFjB2prazFmzBhUV1c3e4w1vQ5bsz7Ael6HPXr0wOuvv46MjAzs378fd955J+69914cPXq0yfHWdO7+ZO4aAes5f3/3+++/48MPP0RwcPA1x4lyHlv8i4U2Kjw8XJg5c6bpscFgELy9vYXExMQmxz/44IPCuHHjGuyLiIgQnnzyyXats7XMXd+aNWsEV1fXDqqubQFo9MOcfzd37lxh4MCBDfbFxcUJ0dHR7VhZ22nJGn/++WcBgHDp0qUOqamtlZaWCgCEXbt2NTvG2l6Hf9WS9Vnz61AQBKFr167Cxx9/3ORz1nzu/upaa7TW81dZWSn07dtX2LFjh3DbbbcJs2bNanasGOfRrj9h0ev1yMjIQFRUlGmfVCpFVFQU0tLSmjwmLS2twXgAiI6Obna8mFqzPqD+95169eoFtVp93X9FWBtrOn83KiQkBF5eXhg9ejT27NkjdjktVlFRAQDo1q1bs2Os+Ty2ZH2Adb4ODQYDNmzYgOrqakRGRjY5xprPHdCyNQLWef5mzpyJcePGNTo/TRHjPNp1YCkrK4PBYDD9DtKfVCpVs9/3azQas8aLqTXrCwgIwOrVq/HVV1/h008/hdFoxPDhw1FcXNwRJbe75s6fVqvFlStXRKqqbXl5eSE5ORlffPEFvvjiC6jVatx+++04cOCA2KVdl9FoxOzZszFixAgEBQU1O86aXod/1dL1WdvrMCsrC507d4ZCocA///lPbNmyBQMGDGhyrLWeO3PWaG3nDwA2bNiAAwcOmH64+HrEOI9m//gh2bbIyMgG/2oYPnw4+vfvjw8//BBLliwRsTJqqYCAAAQEBJgeDx8+HHl5eXjnnXewfv16ESu7vpkzZ+LIkSPYvXu32KW0i5auz9pehwEBAcjMzERFRQU+//xzTJkyBbt27Wr2Dd0ambNGazt/RUVFmDVrFnbs2GHRFwfbdWBxd3eHTCZDSUlJg/0lJSXw9PRs8hhPT0+zxoupNev7O0dHRwwZMgS5ubntUWKHa+78ubi4oFOnTiJV1f7Cw8MtPgQ8/fTT+Pbbb/HLL7+gR48e1xxrTa/DP5mzvr+z9NehXC6Hv78/ACA0NBS///473n33XXz44YeNxlrjuQPMW+PfWfr5y8jIQGlpKYYOHWraZzAY8Msvv2D58uXQ6XSQyWQNjhHjPNr1V0JyuRyhoaFITU017TMajUhNTW32u8nIyMgG4wFgx44d1/wuUyytWd/fGQwGZGVlwcvLq73K7FDWdP7aUmZmpsWeQ0EQ8PTTT2PLli346aef4Ofnd91jrOk8tmZ9f2dtr0Oj0QidTtfkc9Z07q7lWmv8O0s/f6NGjUJWVhYyMzNNW1hYGB5++GFkZmY2CiuASOex3S7ntRIbNmwQFAqFsHbtWuHYsWPC9OnTBTc3N0Gj0QiCIAiPPvqoMG/ePNP4PXv2CA4ODsJ//vMf4fjx48LChQsFR0dHISsrS6wlXJO561u0aJHw/fffC3l5eUJGRoYwceJEQalUCkePHhVrCddUWVkpHDx4UDh48KAAQFi2bJlw8OBB4fTp04IgCMK8efOERx991DT+1KlTgpOTk/Dvf/9bOH78uLBixQpBJpMJKSkpYi3husxd4zvvvCNs3bpVOHnypJCVlSXMmjVLkEqlwo8//ijWEq5pxowZgqurq7Bz507h3Llzpu3y5cumMdb8OmzN+qzpdThv3jxh165dQn5+vnD48GFh3rx5gkQiEX744QdBEKz73P3J3DVa0/lrzt/vErKE82j3gUUQBOG///2v0LNnT0Eulwvh4eHCb7/9ZnrutttuE6ZMmdJg/KZNm4R+/foJcrlcGDhwoLBt27YOrtg85qxv9uzZprEqlUq46667hAMHDohQdcv8eQvv37c/1zRlyhThtttua3RMSEiIIJfLhd69ewtr1qzp8LrNYe4a33jjDaFPnz6CUqkUunXrJtx+++3CTz/9JE7xLdDU2gA0OC/W/Dpszfqs6XX42GOPCb169RLkcrlw0003CaNGjTK9kQuCdZ+7P5m7Rms6f835e2CxhPMoEQRBaL/Pb4iIiIhunF1fw0JERETWgYGFiIiILB4DCxEREVk8BhYiIiKyeAwsREREZPEYWIiIiMjiMbAQERGRxWNgISIiIovHwEJEREQWj4GFiIiILB4DCxEREVk8BhYiIiKyeP8PsORAemMlkuYAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -186,7 +186,7 @@ { "cell_type": "code", "execution_count": null, - "id": "597d47f1", + "id": "d33feff4", "metadata": {}, "outputs": [], "source": [] diff --git a/fedn/fedn/network/combiner/aggregators/aggregatorbase.py b/fedn/fedn/network/combiner/aggregators/aggregatorbase.py index ac49af391..27a885e18 100644 --- a/fedn/fedn/network/combiner/aggregators/aggregatorbase.py +++ b/fedn/fedn/network/combiner/aggregators/aggregatorbase.py @@ -55,7 +55,7 @@ def on_model_update(self, model_update): """Callback when a new client model update is recieved. Performs (optional) validation and pre-processing, - and then puts the update id on the aggregation queue. + and then puts the update id on the aggregation queue. Override in subclass as needed. :param model_update: A ModelUpdate message. @@ -83,7 +83,6 @@ def _validate_model_update(self, model_update): :return: True if the model update is valid, False otherwise. :rtype: bool """ - # TODO: Validate the metadata to check that it contains all variables assumed by the aggregator. data = json.loads(model_update.meta)['training_metadata'] if 'num_examples' not in data.keys(): logger.error("AGGREGATOR({}): Model validation failed, num_examples missing in metadata.".format(self.name)) diff --git a/fedn/fedn/network/combiner/aggregators/fedopt.py b/fedn/fedn/network/combiner/aggregators/fedopt.py index cc02e1ff9..f224bb1f0 100644 --- a/fedn/fedn/network/combiner/aggregators/fedopt.py +++ b/fedn/fedn/network/combiner/aggregators/fedopt.py @@ -65,8 +65,8 @@ def combine_models(self, helper=None, time_window=180, max_nr_models=100, delete logger.info( "AGGREGATOR({}): Aggregating model updates... ".format(self.name)) - v = math.pow(self.tau, 2) - m = 0.0 + # v = math.pow(self.tau, 2) + # m = 0.0 while not self.model_updates.empty(): try: @@ -102,10 +102,9 @@ def combine_models(self, helper=None, time_window=180, max_nr_models=100, delete self.model_updates.task_done() # Server-side momentum - #m = helper.add(m, pseudo_gradient, self.beta1, (1.0-self.beta1)) - #v = v + helper.power(pseudo_gradient, 2) - - #model = model_old + self.eta*m/helper.sqrt(v+self.tau) + # m = helper.add(m, pseudo_gradient, self.beta1, (1.0-self.beta1)) + # v = v + helper.power(pseudo_gradient, 2) + # model = model_old + self.eta*m/helper.sqrt(v+self.tau) model = helper.add(model_old, pseudo_gradient, 1.0, self.eta)