diff --git a/examples/mnist-classifier-demo/demo.ipynb b/examples/mnist-classifier-demo/demo.ipynb index 3838664f1..780ac58c6 100644 --- a/examples/mnist-classifier-demo/demo.ipynb +++ b/examples/mnist-classifier-demo/demo.ipynb @@ -31,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "tags": [] }, @@ -53,7 +53,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -200,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": { "tags": [] }, @@ -218,22 +218,11 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'username': 'pluginuser', 'status': 'Login successful'}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "try:\n", " client.users.create(\n", @@ -259,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -283,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -294,7 +283,7 @@ " description=f\"training job for {experiment_id}\", \n", " queue_id=queue_id,\n", " entrypoint_id=train_ep, \n", - " values={\"epochs\":\"30\"}, \n", + " values={\"epochs\":\"1\"}, \n", " timeout=job_time_limit\n", ")" ] @@ -308,19 +297,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting fgm job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "job_time_limit = '1h'\n", "\n", @@ -344,21 +323,11 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting patch_gen job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "job_time_limit = '1h'\n", "\n", @@ -387,19 +356,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting patch_apply job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "job_time_limit = '1h'\n", "\n", @@ -428,7 +387,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -459,7 +418,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -477,7 +436,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -495,7 +454,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -506,7 +465,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -530,19 +489,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting metrics job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "predict_fgm = predict(experiment_id, queue_id, predict_ep, fgm_job, adv=\"fgm\")\n", "measure_fgm = measure(experiment_id, queue_id, metrics_ep, predict_fgm)" @@ -550,40 +499,20 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting spatial_smoothing defense job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "spatial_job_fgm = defend(experiment_id, queue_id, defense_ep, fgm_job, defense=\"spatial_smoothing\", adv=\"fgm\")" ] }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting metrics job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "predict_spatial_fgm = predict(experiment_id, queue_id, predict_ep, spatial_job_fgm, adv=\"def\")\n", "measure_spatial_fgm = measure(experiment_id, queue_id, metrics_ep, predict_spatial_fgm)" @@ -591,38 +520,18 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting jpeg_compression defense job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "jpeg_comp_job_fgm = defend(experiment_id, queue_id, defense_ep, fgm_job, defense=\"jpeg_compression\", adv=\"fgm\")" ] }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting metrics job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "predict_jpeg_comp_fgm = predict(experiment_id, queue_id, predict_ep, jpeg_comp_job_fgm, adv=\"def\")\n", "measure_jpeg_comp_fgm = measure(experiment_id, queue_id, metrics_ep, predict_jpeg_comp_fgm)" @@ -630,21 +539,11 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting gaussian_augmentation defense job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "gaussian_job_fgm = defend(experiment_id, queue_id, defense_ep, fgm_job, defense=\"gaussian_augmentation\", adv=\"fgm\", defense_kwargs={\n", " \"augmentation\": False,\n", @@ -658,19 +557,9 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting metrics job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "predict_gaussian_fgm = predict(experiment_id, queue_id, predict_ep, gaussian_job_fgm, adv=\"def\")\n", "measure_gaussian_fgm = measure(experiment_id, queue_id, metrics_ep, predict_gaussian_fgm)" @@ -685,19 +574,9 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting metrics job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "predict_patch = predict(experiment_id, queue_id, predict_ep, patch_apply_job, adv=\"patch\")\n", "measure_patch = measure(experiment_id, queue_id, metrics_ep, predict_patch)" @@ -705,40 +584,20 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting spatial_smoothing defense job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "spatial_job_patch = defend(experiment_id, queue_id, defense_ep, patch_apply_job, defense=\"spatial_smoothing\", adv=\"patch\")" ] }, { "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting metrics job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "predict_spatial_patch = predict(experiment_id, queue_id, predict_ep, spatial_job_patch, adv=\"def\")\n", "measure_spatial_patch = measure(experiment_id, queue_id, metrics_ep, predict_spatial_patch)" @@ -746,38 +605,18 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting jpeg_compression defense job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "jpeg_comp_job_patch = defend(experiment_id, queue_id, defense_ep, patch_apply_job, defense=\"jpeg_compression\", adv=\"patch\")" ] }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting metrics job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "predict_jpeg_comp_patch = predict(experiment_id, queue_id, predict_ep, jpeg_comp_job_patch, adv=\"def\")\n", "measure_jpeg_comp_patch = measure(experiment_id, queue_id, metrics_ep, predict_jpeg_comp_patch)" @@ -785,21 +624,11 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting gaussian_augmentation defense job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "gaussian_job_patch = defend(experiment_id, queue_id, defense_ep, patch_apply_job, defense=\"gaussian_augmentation\", adv=\"patch\", defense_kwargs={\n", " \"augmentation\": False,\n", @@ -813,19 +642,9 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Job finished. Starting metrics job.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "predict_gaussian_patch = predict(experiment_id, queue_id, predict_ep, gaussian_job_patch, adv=\"def\")\n", "measure_gaussian_patch = measure(experiment_id, queue_id, metrics_ep, predict_gaussian_patch)" @@ -840,30 +659,9 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'fgm': {'accuracy': 0.1341, 'roc_auc': 0.5189507464552101},\n", - " 'gaussian_fgm': {'accuracy': 0.1488, 'roc_auc': 0.527179728639676},\n", - " 'gaussian_patch': {'accuracy': 0.7861, 'roc_auc': 0.8832449257351849},\n", - " 'jpeg_fgm': {'accuracy': 0.1421, 'roc_auc': 0.5233717508753281},\n", - " 'jpeg_patch': {'accuracy': 0.7983, 'roc_auc': 0.8901298886871352},\n", - " 'patch': {'accuracy': 0.8023, 'roc_auc': 0.8924164841005447},\n", - " 'spatial_fgm': {'accuracy': 0.1436, 'roc_auc': 0.5239930585411556},\n", - " 'spatial_patch': {'accuracy': 0.7691, 'roc_auc': 0.8738922749238369},\n", - " 'trained': {'accuracy': 0.9843999743461609,\n", - " 'auc': 0.9992161393165588,\n", - " 'loss': 0.04713347926735878,\n", - " 'precision': 0.9867536425590515,\n", - " 'recall': 0.983299970626831,\n", - " 'training_time_in_minutes': 2.49030305}}\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import pprint\n", "\n", @@ -885,20 +683,9 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABgkAAAL5CAYAAACKKcRjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAADjpElEQVR4nOzdeXRNV//H8c+NkDlCDDGEyEREjCkqVdSQKGpWFVMN1aoHNRQ1hppaamzRGoJSQwlKzTVTVAklTc1aotQUEUPI/f1h5fxcGSSq1fa+X2vd9fSes88+33PvlWet8zl7b5PZbDYLAAAAAAAAAABYHZvnXQAAAAAAAAAAAHg+CAkAAAAAAAAAALBShAQAAAAAAAAAAFgpQgIAAAAAAAAAAKwUIQEAAAAAAAAAAFaKkAAAAAAAAAAAACtFSAAAAAAAAAAAgJUiJAAAAAAAAAAAwEoREgAAAAAAAAAAYKUICQD8ZyUkJKhTp07y8PCQyWRSz549n3dJAAAAAAAAwD8KIQGAf6zIyEiZTCb98MMPT3X8qFGjFBkZqXfeeUfz589XmzZtnnGF/y4mk8l42djYqGDBgqpTp462bt36vEt7JkaNGqUVK1Zk+biYmBiZTCbZ29vr+vXrz7wuAAAAAACAfzJCAgD/Wd99950qV66soUOHqnXr1qpQocLzLum5q127tubPn6+5c+fq7bff1uHDh/XKK69o7dq1z7u0P+1pQ4Ivv/xSHh4ekqSvv/76GVcFAAAAAADwz0ZIAOA/69KlS3Jzc3tm/SUnJ+vOnTvPrL/nwd/fX61bt1abNm00ZMgQbdy4UWazWRMnTvzTfd+6devPF/g3M5vNWrhwoVq1aqVXX31VCxYseN4lpevf+PkCAAAAAIB/PkICAP8q7du3l7Ozs86fP69GjRrJ2dlZefPmVZ8+ffTgwQNJ0tatW2UymXT69GmtWbPGmGLnzJkzkqS7d+9q6NCh8vX1lZ2dnTw9PfX+++/r7t27FucymUzq1q2bFixYoMDAQNnZ2WndunWSpPPnz6tDhw7Knz+/7OzsFBgYqNmzZ1scn1LHkiVLNHLkSBUuXFj29vaqWbOmTpw4kera9u7dq1dffVW5cuWSk5OTSpcurUmTJlm0+fnnn9WsWTPlzp1b9vb2Cg4O1qpVq5768wwKClKePHl0+vTpLJ0jZSqobdu2qWvXrsqXL58KFy5s7F+7dq2qVasmFxcXubq66oUXXtDChQtTXW9YWJhy5swpR0dHVatWTbt27bJoM2zYMJlMJp04cULt27eXm5ubcubMqTfffFOJiYlGO5PJpFu3bmnu3LnG992+ffsnXv+uXbt05swZtWzZUi1bttT27dv122+/pWqXnJysSZMmKSgoSPb29sqbN6/CwsJSTYX15ZdfqmLFinJ0dFSuXLn08ssva8OGDRZ1Dhs2LFX/Xl5eFvVm9PmePXtWXbt2VfHixeXg4CB3d3c1b97c+H0/6vr163rvvffk5eUlOzs7FS5cWG3bttUff/yhhIQEOTk5qUePHqmO++2335QtWzaNHj36iZ8hAAAAAAD4d7N93gUAQFY9ePBAoaGhqlSpksaNG6dNmzZp/Pjx8vHx0TvvvKOAgADNnz9f7733ngoXLqzevXtLkvLmzavk5GS99tpr2rlzp9566y0FBAToyJEjmjBhgn755ZdU09V89913WrJkibp166Y8efLIy8tLv//+uypXrmyECHnz5tXatWvVsWNHxcfHp1ogecyYMbKxsVGfPn1048YNffTRRwoPD9fevXuNNhs3blT9+vVVoEAB9ejRQx4eHoqJidHq1auNm7hHjx5VSEiIChUqpP79+8vJyUlLlixRo0aNtGzZMjVu3DjLn+W1a9d07do1+fr6PtU5unbtqrx582rIkCHGk+6RkZHq0KGDAgMDNWDAALm5uengwYNat26dWrVqZXyudevWVYUKFTR06FDZ2Nhozpw5euWVV7Rjxw5VrFjR4jwtWrRQsWLFNHr0aP3444+aOXOm8uXLp7Fjx0qS5s+fr06dOqlixYp66623JEk+Pj5PvP4FCxbIx8dHL7zwgkqVKiVHR0d99dVX6tu3r0W7jh07KjIyUnXr1lWnTp10//597dixQ99//72Cg4MlSRERERo2bJiqVKmi4cOHK0eOHNq7d6++++471alTJ6tfTbqf7/79+7V79261bNlShQsX1pkzZzRt2jRVr15dx44dk6Ojo6SHC3dXrVpVMTEx6tChg8qXL68//vhDq1at0m+//aayZcuqcePGWrx4sT755BNly5bNOO9XX30ls9ms8PDwp6obAAAAAAD8i5gB4B9qzpw5Zknm/fv3G9vatWtnlmQePny4Rdty5cqZK1SoYLGtaNGi5nr16llsmz9/vtnGxsa8Y8cOi+3Tp083SzLv2rXL2CbJbGNjYz569KhF244dO5oLFChg/uOPPyy2t2zZ0pwzZ05zYmKi2Ww2m7ds2WKWZA4ICDDfvXvXaDdp0iSzJPORI0fMZrPZfP/+fXOxYsXMRYsWNV+7ds2iz+TkZOO/a9asaQ4KCjLfuXPHYn+VKlXMfn5+5ieRZO7YsaP58uXL5kuXLpn37t1rrlmzplmSefz48Vk6R8p389JLL5nv379vbL9+/brZxcXFXKlSJfPt27fTvJbk5GSzn5+fOTQ01OL6EhMTzcWKFTPXrl3b2DZ06FCzJHOHDh0s+mrcuLHZ3d3dYpuTk5O5Xbt2T/wcUty7d8/s7u5uHjhwoLGtVatW5jJlyli0++6778ySzN27d0/VR0r9x48fN9vY2JgbN25sfvDgQZptzOaH38HQoUNT9VO0aFGL2tP7fM1ms/H7etSePXvMkszz5s0ztg0ZMsQsybx8+fJ0616/fr1Zknnt2rUW+0uXLm2uVq1aquMAAAAAAMB/D9MNAfhXevvtty3eV61aVadOnXricUuXLlVAQIBKlCihP/74w3i98sorkqQtW7ZYtK9WrZpKlixpvDebzVq2bJkaNGggs9ls0UdoaKhu3LihH3/80aKPN998Uzly5LCoVZJR78GDB3X69Gn17Nkz1RoKJpNJknT16lV99913atGihW7evGmc88qVKwoNDdXx48d1/vz5J17/rFmzlDdvXuXLl0+VKlXSrl271KtXL/Xs2fOpztG5c2eLJ9A3btyomzdvqn///rK3t0/zWg4dOqTjx4+rVatWunLlinGeW7duqWbNmtq+fbuSk5Mtjk3r+75y5Yri4+OfeM3pWbt2ra5cuaI33njD2PbGG28oOjpaR48eNbYtW7ZMJpNJQ4cOTdVHyjWtWLFCycnJGjJkiGxsbNJs8zQe/3wlycHBwfjvpKQkXblyRb6+vnJzc7P47S1btkxlypRJc4RJSk21atVSwYIFLdZi+Omnn3T48GG1bt36qesGAAAAAAD/Hkw3BOBfJ2VO+EflypVL165de+Kxx48fV0xMTKrjU1y6dMnifbFixSzeX758WdevX9fnn3+uzz//PFN9FClSJFWtkox6T548KUkqVapUunWfOHFCZrNZgwcP1uDBg9M9b6FChdLtQ5IaNmyobt26yWQyycXFRYGBgXJycnrqczz++WTmWo4fPy5JateuXbptbty4YXxOUsafoaura7r9ZOTLL79UsWLFZGdnZ6wR4ePjI0dHRy1YsECjRo2S9PCaChYsqNy5c6fb18mTJ2VjY2MRKD0Lj3++knT79m2NHj1ac+bM0fnz52U2m419N27csKipadOmGfZvY2Oj8PBwTZs2TYmJica129vbq3nz5s/uQgAAAAAAwD8WIQGAf53Hn6zOiuTkZAUFBemTTz5Jc7+np6fF+0ef2k45XpJat26d7k3u0qVLW7xPr95Hb+4+Scp5+/Tpo9DQ0DTbpKwrkJHChQurVq1az+wcj38+mZFyno8//lhly5ZNs42zs7PF+2fxGT4qPj5e33zzje7cuSM/P79U+xcuXKiRI0f+qVEAWZGy6Pbj0vp8//e//2nOnDnq2bOnXnzxReXMmVMmk0ktW7ZMNQIjM9q2bauPP/5YK1as0BtvvKGFCxeqfv36ypkzZ5b7AgAAAAAA/z6EBACsio+Pj6Kjo1WzZs2nugGcN29eubi46MGDB+nebH+amqSH07yk16e3t7ckKXv27M/svH/FOR69lvRCi5Q2rq6uz/RasvJ9Ll++XHfu3NG0adOUJ08ei32xsbEaNGiQdu3apZdeekk+Pj5av369rl69mu5oAh8fHyUnJ+vYsWPpBh/SwxEQ169ft9h27949xcXFZbr2r7/+Wu3atdP48eONbXfu3EnVr4+Pj3766acn9leqVCmVK1dOCxYsUOHChXXu3DlNmTIl0/UAAAAAAIB/N9YkAGBVWrRoofPnz+uLL75Ite/27du6detWhsdny5ZNTZs21bJly9K8AXv58uUs11S+fHkVK1ZMEydOTHWjN+VJ+Xz58ql69eqaMWNGmjeUn+a8j3sW56hTp45cXFw0evRo3blzx2JfyrVUqFBBPj4+GjdunBISEp7qPGlxcnJK9fml58svv5S3t7fefvttNWvWzOLVp08fOTs7G/P0N23aVGazWREREan6SbmmRo0aycbGRsOHD0/1NP+jox18fHy0fft2i/2ff/55uiMJ0pItW7ZUIyimTJmSqo+mTZsqOjpaUVFR6dadok2bNtqwYYMmTpwod3d31a1bN9P1AAAAAACAfzdGEgCwKm3atNGSJUv09ttva8uWLQoJCdGDBw/0888/a8mSJVq/fr2Cg4Mz7GPMmDHasmWLKlWqpM6dO6tkyZK6evWqfvzxR23atElXr17NUk02NjaaNm2aGjRooLJly+rNN99UgQIF9PPPP+vo0aNav369JOnTTz/VSy+9pKCgIHXu3Fne3t76/ffftWfPHv3222+Kjo5+6s8lxZ89h6urqyZMmKBOnTrphRdeUKtWrZQrVy5FR0crMTFRc+fOlY2NjWbOnKm6desqMDBQb775pgoVKqTz589ry5YtcnV11TfffJPl2itUqKBNmzbpk08+UcGCBVWsWDFVqlQpVbsLFy5oy5Yt6t69e5r92NnZKTQ0VEuXLtXkyZNVo0YNtWnTRpMnT9bx48cVFham5ORk7dixQzVq1FC3bt3k6+urgQMHasSIEapataqaNGkiOzs77d+/XwULFtTo0aMlSZ06ddLbb7+tpk2bqnbt2oqOjtb69etTjWbISP369TV//nzlzJlTJUuW1J49e7Rp0ya5u7tbtOvbt6++/vprNW/eXB06dFCFChV09epVrVq1StOnT1eZMmWMtq1atdL777+vqKgovfPOO8qePXum6wEAAAAAAP9uhAQArIqNjY1WrFihCRMmaN68eYqKipKjo6O8vb3Vo0cP+fv7P7GP/Pnza9++fRo+fLiWL1+uzz77TO7u7goMDNTYsWOfqq7Q0FBt2bJFERERGj9+vJKTk+Xj46POnTsbbUqWLKkffvhBERERioyM1JUrV5QvXz6VK1dOQ4YMearzPu5ZnKNjx47Kly+fxowZoxEjRih79uwqUaKE3nvvPaNN9erVtWfPHo0YMUJTp05VQkKCPDw8VKlSJXXp0uWpav/kk0/01ltvadCgQbp9+7batWuXZkiwaNEiJScnq0GDBun21aBBAy1btkxr167Va6+9pjlz5qh06dKaNWuW+vbtq5w5cyo4OFhVqlQxjhk+fLiKFSumKVOmaODAgXJ0dFTp0qXVpk0bo03nzp11+vRpzZo1S+vWrVPVqlW1ceNG1axZM9PXOWnSJGXLlk0LFizQnTt3FBISok2bNqVaR8LZ2Vk7duzQ0KFDFRUVpblz5ypfvnyqWbOmChcubNE2f/78qlOnjr799luLegEAAAAAwH+fyfy0qz4CAID/jMaNG+vIkSM6ceLE8y4FAAAAAAD8jViTAAAAKxcXF6c1a9YwigAAAAAAACvEdEMAAFip06dPa9euXZo5c6ayZ8/+1FM9AQAAAACAfy9GEgAAYKW2bdumNm3a6PTp05o7d648PDyed0kAAAAAAOBvxpoEAAAAAAAAAABYKUYSAAAAAAAAAABgpQgJAAAAAAAAAACwUixcDOAfJzk5WRcuXJCLi4tMJtPzLgcAAAAAAAD4VzGbzbp586YKFiwoG5uMxwoQEgD4x7lw4YI8PT2fdxkAAAAAAADAv9qvv/6qwoULZ9iGkADAP46Li4ukh3/EXF1dn3M1AAAAAAAAwL9LfHy8PD09jftsGSEkAPCPkzLFkKurKyEBAAAAAAAA8JQyM5U3CxcDAAAAAAAAAGClCAkAAAAAAAAAALBShAQAAAAAAAAAAFgpQgIAAAAAAAAAAKwUIQEAAAAAAAAAAFaKkAAAAAAAAAAAACtFSAAAAAAAAAAAgJUiJAAAAAAAAAAAwEoREgAAAAAAAAAAYKUICQAAAAAAAAAAsFKEBAAAAAAAAAAAWClCAgAAAAAAAAAArBQhAQAAAAAAAAAAVoqQAAAAAAAAAAAAK0VIAAAAAAAAAACAlSIkAAAAAAAAAADAShESAAAAAAAAAABgpQgJAAAAAAAAAACwUoQEAAAAAAAAAABYKUICAAAAAAAAAACsFCEBAAAAAAAAAABWipAAAAAAAAAAAAArRUgAAAAAAAAAAICVIiQAAAAAAAAAAMBKERIAAAAAAAAAAGClCAkAAAAAAAAAALBShAQAAAAAAAAAAFgpQgIAAAAAAAAAAKwUIQEAAAAAAAAAAFbK9nkXAADpKTV0vWzsHJ93GQAAAAAAAPiPODOm3vMu4R+HkQQAAAAAAAAAAFgpQgIAAAAAAAAAAKwUIQEAAAAAAAAAAFaKkAAAAAAAAAAAACtFSAAAAAAAAAAAgJUiJAAAAAAAAAAAwEoREgAAAAAAAAAAYKUICQAAAAAAAAAAsFKEBAAAAAAAAAAAWClCAgAAAAAAAAAArBQhAQAAAAAAAAAAVoqQAAAAAAAAAAAAK0VIAAAAAAAAAACAlSIkAAAAAAAAAADAShESAAAAAAAAAABgpQgJAAAAAAAAAACwUoQEAAAAAAAAAABYKUICAAAAAAAAAACsFCEBAAAAAAAAAABWipAAAAAAAAAAAAArRUgAAAAAAAAAAICVIiQAAAAAAAAAAMBKERIASMVkMmnFihWZbt++fXs1atToL6sHAAAAAAAAwF+DkABIQ/v27WUymYyXu7u7wsLCdPjw4edaV2RkpEwmkwICAlLtW7p0qUwmk7y8vP7+wgAAAAAAAAD8KxESAOkICwtTXFyc4uLitHnzZtna2qp+/frPuyw5OTnp0qVL2rNnj8X2WbNmqUiRIs+pKgAAAAAAAAD/RoQEQDrs7Ozk4eEhDw8PlS1bVv3799evv/6qy5cvG2369esnf39/OTo6ytvbW4MHD1ZSUpKxPzo6WjVq1JCLi4tcXV1VoUIF/fDDD8b+nTt3qmrVqnJwcJCnp6e6d++uW7duZViXra2tWrVqpdmzZxvbfvvtN23dulWtWrVK1X7atGny8fFRjhw5VLx4cc2fP99i//Hjx/Xyyy/L3t5eJUuW1MaNG1P18euvv6pFixZyc3NT7ty51bBhQ505c+aJnyEAAAAAAADwT3bv3j1t2bJFU6dO1ciRIzV+/HitXr1at2/fNtrExcVp0aJFGj9+vD788EONGzdOCxYs0NmzZzN9nvj4eI0dO1YRERGKiIjQiRMn0mz3yy+/GG0iIiJ0//79P32NT0JIAGRCQkKCvvzyS/n6+srd3d3Y7uLiosjISB07dkyTJk3SF198oQkTJhj7w8PDVbhwYe3fv18HDhxQ//79lT17dknSyZMnFRYWpqZNm+rw4cNavHixdu7cqW7duj2xng4dOmjJkiVKTEyU9HAaorCwMOXPn9+iXVRUlHr06KHevXvrp59+UpcuXfTmm29qy5YtkqTk5GQ1adJEOXLk0N69ezV9+nT169fPoo+kpCSFhobKxcVFO3bs0K5du+Ts7KywsDDdu3fv6T7Qx9y9e1fx8fEWLwAAAAAAAOCv9tVXX2n79u26evWq3N3dde/ePR04cEBffvmlkpOTdefOHc2bN0+xsbG6d++e8ubNq3v37unEiROaP3/+Ex/4lSSz2ayoqCjduXMnw3YJCQlatWrVs7q0TCMkANKxevVqOTs7y9nZWS4uLlq1apUWL14sG5v//2czaNAgValSRV5eXmrQoIH69OmjJUuWGPvPnTunWrVqqUSJEvLz81Pz5s1VpkwZSdLo0aMVHh6unj17ys/PT1WqVNHkyZM1b968J/7BKFeunLy9vfX111/LbDYrMjJSHTp0SNVu3Lhxat++vbp27Sp/f3/16tVLTZo00bhx4yRJmzZt0s8//6x58+apTJkyevnllzVq1CiLPhYvXqzk5GTNnDlTQUFBCggI0Jw5c3Tu3Dlt3br1aT9eC6NHj1bOnDmNl6en5zPpFwAAAAAAAEjP5cuXjdkywsLC9Pbbb+utt96SJF24cEFHjx7VpUuXjHt1DRo0UJcuXVS3bl1J0oMHDzIVEuzatUtnzpxRYGBghu1WrlypO3fuqHjx4n/iqrKOkABIR40aNXTo0CEdOnRI+/btU2hoqOrWrWsxjGjx4sUKCQmRh4eHnJ2dNWjQIJ07d87Y36tXL3Xq1Em1atXSmDFjdPLkSWNfdHS0IiMjjSDC2dlZoaGhSk5O1unTp59YX4cOHTRnzhxt27ZNt27d0quvvpqqTUxMjEJCQiy2hYSEKCYmxtjv6empggULGvtffPFFi/bR0dE6ceKEXFxcjDpz586tO3fuWFzPnzFgwADduHHDeP3666/PpF8AAAAAAAAgPWaz2fhvk8lk8b+SdOrUKeXNm1f29vaSpG+++Uaff/651q5dK1tbW7300kvKly9fhueIi4vTli1b5O/vr+Dg4HTb7d27VydOnFDNmjXl4eHxZy4rywgJgHQ4OTnJ19dXvr6+euGFFzRz5kzdunVLX3zxhSRpz549Cg8P16uvvqrVq1fr4MGDGjhwoMUUPMOGDdPRo0dVr149fffddypZsqSioqIkPRw+1KVLFyOIOHTokKKjo3X8+HH5+Pg8sb7w8HB9//33GjZsmNq0aSNbW9u/5HNISEhQhQoVLOo8dOiQfvnllzTXQHgadnZ2cnV1tXgBAAAAAAAAf6U8efIYN/nXrl2r6dOn6/PPPzf237x5Uw4ODnrzzTeVK1cu3bt3T3FxcUpKSpKTk9MTb+YnJSVp2bJlcnR0VMOGDdNtd+nSJW3atEk+Pj6qXLnys7m4LPhr7ioC/0Emk0k2NjbGoiW7d+9W0aJFNXDgQKNNWouV+Pv7y9/fX++9957eeOMNzZkzR40bN1b58uV17Ngx+fr6PlU9uXPn1muvvaYlS5Zo+vTpabYJCAjQrl271K5dO2Pbrl27VLJkSWP/r7/+qri4OBUoUECS9P3331v0Ub58eS1evFj58uXj5j0AAAAAAAD+M2xsbBQeHq5Nmzbp1KlTunbtmooWLao//vhD165dk42Nje7du6eVK1fq2rVrql27toKDg3XgwAFt2LBBX3/9tXLnzm3cV3vcpk2bdOXKFbVu3VqOjo7p1rF8+XLlyJFDjRo1shjJ8HchJADScffuXV28eFGSdO3aNU2dOlUJCQlq0KCBJMnPz0/nzp3TokWL9MILL2jNmjXGKAFJun37tvr27atmzZqpWLFi+u2337R//341bdpUktSvXz9VrlxZ3bp1U6dOneTk5KRjx45p48aNmjp1aqZqjIyM1GeffWaxmPKj+vbtqxYtWqhcuXKqVauWvvnmGy1fvlybNm2SJNWqVUv+/v5q166dPv74Y8XHx1uEHtLDEQsff/yxGjZsqOHDh6tw4cI6e/asli9frvfff1+FCxfO2gcLAAAAAAAA/EO4urqqSZMmxvv79+8b63m6u7vryJEjunDhgqSH64TmyJFDZcuW1YYNGyRJp0+fTjck+P333yU9nLJcspzeaPHixSpRooSaNm2q33//XTY2Npo8ebKkh2sdpPjoo49Uu3ZtvfDCC8/qklNhuiEgHevWrVOBAgVUoEABVapUSfv379fSpUtVvXp1SdJrr72m9957T926dVPZsmW1e/duDR482Dg+W7ZsunLlitq2bSt/f3+1aNFCdevWVUREhCSpdOnS2rZtm3755RdVrVpV5cqV05AhQyzWB3gSBweHdAMCSWrUqJEmTZqkcePGKTAwUDNmzNCcOXOMa7CxsVFUVJRu376tihUrqlOnTho5cqRFH46Ojtq+fbuKFCmiJk2aKCAgQB07dtSdO3cYWQAAAAAAAIB/tbi4ON29e1eSlJycrA0bNhjvS5UqZfy3JCMsSPlfScqePbsk6fz585o6daqmTp2q8+fPW5wjKSlJSUlJun//vrHt/v37SkpKMt4nJycb7ZKTky2OfTQ0+CuYzI/GFwDwDxAfH6+cOXPKs+cS2dilPxQLAAAAAAAAyIozY+pZvP/222918OBB5c6dWwkJCUpMTJQkVapUSWFhYfrjjz80ffp0PXjwQNmyZZO7u7uuXLmiBw8eyM7OTu+++65cXFx05swZzZ07V5LUrl07eXl5pT73I23Cw8PTnYZ869at2rZtmyRp4MCBT7UWacr9tRs3bjzxQV+mGwIAAAAAAAAAWKVChQrpzJkzunbtmsxmswoUKKDg4GCVL19e0sPFjdu3b6+dO3fqwoULunLlipycnOTp6alq1arJxcXlOV/Bn8dIAgD/OIwkAAAAAAAAwF/h8ZEE/1VZGUnAmgQAAAAAAAAAAFgpQgIAAAAAAAAAAKwUIQEAAAAAAAAAAFaKkAAAAAAAAAAAACtFSAAAAAAAAAAAgJUiJAAAAAAAAAAAwEoREgAAAAAAAAAAYKUICQAAAAAAAAAAsFKEBAAAAAAAAAAAWClCAgAAAAAAAAAArBQhAQAAAAAAAAAAVoqQAAAAAAAAAAAAK0VIAAAAAAAAAACAlSIkAAAAAAAAAADAShESAAAAAAAAAABgpQgJAAAAAAAAAACwUoQEAAAAAAAAAABYKUICAAAAAAAAAACsFCEBAAAAAAAAAABWipAAAAAAAAAAAAArZfu8CwCA9PwUESpXV9fnXQYAAAAAAADwn8VIAgAAAAAAAAAArBQhAQAAAAAAAAAAVoqQAAAAAAAAAAAAK0VIAAAAAAAAAACAlSIkAAAAAAAAAADAShESAAAAAAAAAABgpQgJAAAAAAAAAACwUoQEAAAAAAAAAABYKUICAAAAAAAAAACsFCEBAAAAAAAAAABWipAAAAAAAAAAAAArRUgAAAAAAAAAAICVIiQAAAAAAAAAAMBK2T7vAgAgPaWGrpeNnePzLgNW6syYes+7BAAAAAAAgL8cIwkAAAAAAAAAALBShAQAAAAAAAAAAFgpQgIAAAAAAAAAAKwUIQEAAAAAAAAAAFaKkAAAAAAAAAAAACtFSAAAAAAAAAAAgJUiJAAAAAAAAAAAwEoREgAAAAAAAAAAYKUICQAAAAAAAAAAsFKEBAAAAAAAAAAAWClCAgAAAAAAAAAArBQhAQAAAAAAAAAAVoqQAAAAAAAAAAAAK0VIAAAAAAAAAACAlSIkAAAAAAAAAADAShESAAAAAAAAAABgpQgJAAAAAAAAAACwUoQEAAAAAAAAAABYKUICAAAAAAAAAACsFCEBAAAAAAAAAABWipAAAAAAAAAAAAArRUgAAAAAAAAAAICVIiQAAAAAAAAAAMBKERJAkrR161aZTCZdv35dkhQZGSk3N7fnWtNf7a+6xjNnzshkMunQoUMZtouNjZWHh4du3rz5zGt4Vry8vDRx4sR097ds2VLjx4//+woCAAAAAAAA8EwREjymffv2MplMqV4nTpz4U/0+fhM+I2azWV988YVefPFFubq6ytnZWYGBgerRo8efriOzXn/9df3yyy/PtM/MfgYp7XLlyqU7d+5Y7Nu/f7/xnWTFk252Pw8DBgzQ//73P7m4uKTaV6JECdnZ2enixYsW29MLINq3b69GjRr9hdWmbdCgQRo5cqRu3Ljxt58bAAAAAAAAwJ9n+7wL+CcKCwvTnDlzLLblzZv3bzm32WxWq1attGLFCn3wwQeaMGGCChYsqAsXLigqKkoffvihIiMj0zz23r17ypEjxzOpw8HBQQ4ODs+kr6fl4uKiqKgovfHGG8a2WbNmqUiRIjp37txzrOzPO3funFavXq0pU6ak2rdz507dvn1bzZo109y5c9WvX7/nUGHmlCpVSj4+Pvryyy/17rvvPu9ygL/U2bNntXPnTl24cEGJiYmSpHr16ik4ONhos3LlSp07d84YIeTs7Cw/Pz9Vr149039T4+PjNW3aNCMkDQ8Pl6+vryTp/v37+uabb3T+/HlduXJFklSoUCF16tTpmV0nAAAAAACwLowkSIOdnZ08PDwsXtmyZdMnn3yioKAgOTk5ydPTU127dlVCQoJx3NmzZ9WgQQPlypVLTk5OCgwM1LfffqszZ86oRo0akqRcuXLJZDKpffv2aZ578eLFWrRokRYvXqzBgwercuXKKlKkiCpXrqyxY8dahBcpT4+PHDlSBQsWVPHixSVJ8+fPV3BwsFxcXOTh4aFWrVrp0qVLFuf59ttv5e/vLwcHB9WoUUNnzpyx2J/WVDwrV65U+fLlZW9vL29vb0VEROj+/fvGfpPJpJkzZ6px48ZydHSUn5+fVq1aJUlZ+gxStGvXTrNnzzbe3759W4sWLVK7du1Std25c6eqVq0qBwcHeXp6qnv37rp165YkqXr16jp79qzee++9NEchrF+/XgEBAXJ2dlZYWJji4uKMfcnJyRo+fLgKFy4sOzs7lS1bVuvWrbM4ft++fSpXrpzs7e0VHBysgwcPZnhdkrRkyRKVKVNGhQoVSrVv1qxZatWqldq0aWNx/ZJUrFgxSVK5cuVkMplUvXp1DRs2THPnztXKlSuN69u6daskqV+/fvL395ejo6O8vb01ePBgJSUlWfT5zTff6IUXXpC9vb3y5Mmjxo0bp1v3zJkz5ebmps2bNxvbGjRooEWLFj3xmoF/u7i4OJ06dSrDm/2xsbFKTk5Wnjx55OjoqGvXrmnfvn1atmxZps5hNpsVFRWVahRVivv37+vw4cO6d++e7Ozsnuo6AAAAAAAAHkVIkAU2NjaaPHmyjh49qrlz5+q7777T+++/b+x/9913dffuXW3fvl1HjhzR2LFj5ezsLE9PT+MGUWxsrOLi4jRp0qQ0z/HVV1+pePHieu2119Lc//gN7s2bNys2NlYbN27U6tWrJUlJSUkaMWKEoqOjtWLFCp05c8bihvyvv/6qJk2aqEGDBjp06JA6deqk/v37Z3jtO3bsUNu2bdWjRw8dO3ZMM2bMUGRkpEaOHGnRLiIiQi1atNDhw4f16quvKjw8XFevXs3SZ5CiTZs22rFjhzFqYNmyZfLy8lL58uUt2p08eVJhYWFq2rSpDh8+rMWLF2vnzp3q1q2bJGn58uUqXLiwhg8frri4OIsQIDExUePGjdP8+fO1fft2nTt3Tn369DH2T5o0SePHj9e4ceN0+PBhhYaG6rXXXtPx48clSQkJCapfv75KliypAwcOaNiwYRbHZ/R5Pvr0cYqbN29q6dKlat26tWrXrq0bN25ox44dxv59+/ZJkjZt2qS4uDgtX75cffr0UYsWLYyAIy4uTlWqVJH0cDRGZGSkjh07pkmTJumLL77QhAkTjP7WrFmjxo0b69VXX9XBgwe1efNmVaxYMc2aP/roI/Xv318bNmxQzZo1je0VK1bUvn37dPfu3Sded3ru3r2r+Ph4ixfwT1O6dGn1799frVu3TrdNr1691KNHD7311lvq2bOnihQpIunh393M2LVrl86cOaPAwMA09+fIkUO9evVSr1695OHhkfWLAAAAAAAAeAzTDaVh9erVcnZ2Nt7XrVtXS5cuVc+ePY1tXl5e+vDDD/X222/rs88+k/RwCpmmTZsqKChIkuTt7W20z507tyQpX758GS6W+8svvxgjAlL07NlTM2fOlCS5ubnpt99+M/Y5OTlp5syZFtMMdejQwfhvb29vTZ48WS+88IISEhLk7OysadOmycfHx1hwtnjx4kaokZ6IiAj179/feIrf29tbI0aM0Pvvv6+hQ4ca7dq3b29MDzRq1ChNnjxZ+/btU1hYWKY/gxT58uVT3bp1FRkZqSFDhmj27NkW15Zi9OjRCg8PN74fPz8/TZ48WdWqVdO0adOUO3duZcuWzRhZ8aikpCRNnz5dPj4+kqRu3bpp+PDhxv5x48apX79+atmypSRp7Nix2rJliyZOnKhPP/1UCxcuVHJysmbNmiV7e3sFBgbqt99+0zvvvJPhtZ09ezbNkGDRokXy8/MzbhC2bNlSs2bNUtWqVSX9/7RX7u7uFtfi4OCgu3fvprq+QYMGGf/t5eWlPn36aNGiRUa4NXLkSLVs2VIRERFGuzJlyqSqq1+/fpo/f762bduW6uZlwYIFde/ePV28eFFFixbN8LrTM3r0aIsagH8iR0fHJ7axtbXVd999p1OnTikhIcFYryMlLMhIXFyctmzZIn9/fwUHB+vo0aOp2tjY2KS5jgkAAAAAAMDTYiRBGmrUqKFDhw4Zr8mTJ0t6+PR2zZo1VahQIbm4uKhNmza6cuWKMTd19+7d9eGHHyokJERDhw7V4cOHn0k9AwcO1KFDhzRkyBCL6Y0kKSgoKNU6BAcOHFCDBg1UpEgRubi4qFq1apJkPJEfExOjSpUqWRzz4osvZlhDdHS0hg8fLmdnZ+PVuXNnxcXFGdcvPXzSNoWTk5NcXV1TTXWUFR06dFBkZKROnTqlPXv2KDw8PM3aIiMjLWoLDQ1VcnKyTp8+nWH/jo6ORkAgSQUKFDDqjY+P14ULFxQSEmJxTEhIiGJiYiQ9/CxLly4te3t7Y/+TPkvp4dRJjx6TYvbs2RZPKbdu3VpLly415jfPqsWLFyskJEQeHh5ydnbWoEGDLNZzOHTokMWogLSMHz9eX3zxhXbu3Jnm080pU688+jvIqgEDBujGjRvGK7NPXQP/RFevXtX58+eNgMDb21vNmjXL8JikpCQtW7ZMjo6Oatiw4d9RJgAAAAAAgCRCgjQ5OTnJ19fXeBUoUEBnzpxR/fr1Vbp0aS1btkwHDhzQp59+KunhgsGS1KlTJ506dUpt2rTRkSNHFBwcnObCtBnx8/NTbGysxba8efPK19dX+fLlS7PWR926dUuhoaFydXXVggULtH//fkVFRVnU+TQSEhIUERFhEZ4cOXJEx48ft7jZnT17dovjTCaTkpOTn/q8devW1e3bt9WxY0c1aNBA7u7uadbWpUsXi9qio6N1/PhxiwAgLWnVazabn7rezMqTJ4+uXbtmse3YsWP6/vvv9f7778vW1la2traqXLmyEhMTn2rO/5RQ5dVXX9Xq1at18OBBDRw40OJ3kJmFVKtWraoHDx5oyZIlae6/evWqpD+3uLednZ1cXV0tXsC/VbNmzTRo0CB16dJF+fLl06lTp/Ttt99meMymTZt05coVNWrUKFMjFgAAAAAAAJ4VQoJMOnDggJKTkzV+/HhVrlxZ/v7+unDhQqp2np6eevvtt7V8+XL17t1bX3zxhSQZT/s/ePAgw/O88cYbio2N1cqVK5+qzp9//llXrlzRmDFjVLVqVZUoUSLVk/wBAQHG3PYpvv/++wz7LV++vGJjYy3Ck5SXjU3mfkaZ/QweZWtrq7Zt22rr1q1pTjWUUtuxY8fSrC3lnDly5MjSeSXJ1dVVBQsW1K5duyy279q1SyVLlpT08LM8fPiwxSKjT/ospYcLDx87dsxi26xZs/Tyyy8rOjraIvDo1auXZs2aZVyHlPozTOv6du/eraJFi2rgwIEKDg6Wn5+fzp49a9GmdOnSFosQp6VixYpau3atRo0apXHjxqXa/9NPP6lw4cLKkyfPE68bsBbZsmWTh4eHsYbK4cOHdeXKlXTb//7775Iejv4ZNWqUFixYYOxbvHhxphc+BgAAAAAAyCpCgkzy9fVVUlKSpkyZolOnTmn+/PmaPn26RZuePXtq/fr1On36tH788Udt2bJFAQEBkqSiRYvKZDJp9erVunz5cqppg1K0bNlSzZo1U8uWLTV8+HDt3btXZ86c0bZt27R48WJly5YtwzqLFCmiHDlyGHWuWrVKI0aMsGjz9ttv6/jx4+rbt69iY2O1cOFCRUZGZtjvkCFDNG/ePEVEROjo0aOKiYnRokWLLOa8f5LMfgaPGzFihC5fvqzQ0NA09/fr10+7d+9Wt27ddOjQIR0/flwrV640Fi6WHs7Hv337dp0/f15//PFHpmvu27evxo4dq8WLFys2Nlb9+/fXoUOH1KNHD0lSq1atZDKZ1LlzZx07dkzffvttmjfSHxcaGqo9e/YYN/aTkpI0f/58vfHGGypVqpTFq1OnTtq7d6+OHj2qfPnyycHBQevWrdPvv/9uTGfi5eWlw4cPKzY2Vn/88YeSkpLk5+enc+fOadGiRTp58qQmT55sjCpJMXToUH311VcaOnSoYmJi0l2bokqVKvr2228VERGhiRMnWuzbsWOH6tSpk+nPFPivOn/+vM6cOWO8f/DggU6dOmW8TxnFc/78eU2dOlVTp07V+fPnLfpISkpSUlKS7t+/b2y7f/++kpKS/triAQAAAACA1SIkyKQyZcrok08+0dixY1WqVCktWLBAo0ePtmjz4MEDvfvuuwoICFBYWJj8/f2NRY0LFSpkLP6bP39+ixvYjzKZTFq8eLEmTpyob7/9VjVr1lTx4sXVoUMHeXp6aufOnRnWmTdvXkVGRmrp0qUqWbKkxowZk+qmdZEiRbRs2TKtWLFCZcqU0fTp0zVq1KgM+w0NDdXq1au1YcMGvfDCC6pcubImTJiQpYVqM/sZPC5HjhzKkyePTCZTmvtLly6tbdu26ZdfflHVqlVVrlw5DRkyRAULFjTaDB8+XGfOnJGPj0+WpsXp3r27evXqpd69eysoKEjr1q3TqlWr5OfnJ0lydnbWN998oyNHjqhcuXIaOHBghgtAp6hbt65sbW21adMmSdKqVat05coVNW7cOFXbgIAABQQEaNasWbK1tdXkyZM1Y8YMFSxY0Ji7vHPnzipevLiCg4OVN29e7dq1S6+99pree+89devWTWXLltXu3bs1ePBgi76rV6+upUuXatWqVSpbtqxeeeWVVKNMUrz00ktas2aNBg0aZEyjdefOHa1YsUKdO3fO9GcK/FvFxMRo8uTJFqHqli1bNHnyZC1fvlyXL1/W3LlzNXbsWE2fPl3jx4/XL7/8Ikny8PAwFhZPSkrSlStXdOXKFePmf/v27TV06FDjlbJIvCSFh4cbi6dL0uTJkzV58mQjYLh48aKxLT4+/q/+GAAAAAAAwH+Myfx3TMAOIJVPP/1Uq1at0vr16593KU9t2rRpioqK0oYNG55pv/Hx8cqZM6c8ey6RjR3zs+P5ODOmnsX7Q4cOpTsVXNGiRVWnTh1t2bJFFy9eVGJiomxsbOTm5iY/Pz9VrVrVWAPkzJkzmjt3riSpXbt28vLySn3uR9qEh4fL19fX2BcREZFuzT169JCbm1tWLhMAAAAAAPwHpdxfu3HjxhPX/yQkAJ6T+/fva+zYserevbtcXFyedzlPZebMmapataqKFy/+TPslJMA/weMhAQAAAAAAwL9FVkIC27+pJgCPsbW11cCBA593GX9Kp06dnncJAAAAAAAAAP4E1iQAAAAAAAAAAMBKERIAAAAAAAAAAGClCAkAAAAAAAAAALBShAQAAAAAAAAAAFgpQgIAAAAAAAAAAKwUIQEAAAAAAAAAAFaKkAAAAAAAAAAAACtFSAAAAAAAAAAAgJUiJAAAAAAAAAAAwEoREgAAAAAAAAAAYKUICQAAAAAAAAAAsFKEBAAAAAAAAAAAWClCAgAAAAAAAAAArBQhAQAAAAAAAAAAVoqQAAAAAAAAAAAAK0VIAAAAAAAAAACAlSIkAAAAAAAAAADAShESAAAAAAAAAABgpQgJAAAAAAAAAACwUoQEAAAAAAAAAABYKdvnXQAApOeniFC5uro+7zIAAAAAAACA/yxGEgAAAAAAAAAAYKUICQAAAAAAAAAAsFKEBAAAAAAAAAAAWClCAgAAAAAAAAAArBQhAQAAAAAAAAAAVoqQAAAAAAAAAAAAK0VIAAAAAAAAAACAlSIkAAAAAAAAAADAShESAAAAAAAAAABgpQgJAAAAAAAAAACwUoQEAAAAAAAAAABYKUICAAAAAAAAAACsFCEBAAAAAAAAAABWyvZ5FwAA6Sk1dL1s7ByfdxlAhs6Mqfe8SwAAAAAAAHhqjCQAAAAAAAAAAMBKERIAAAAAAAAAAGClCAkAAAAAAAAAALBShAQAAAAAAAAAAFgpQgIAAAAAAAAAAKwUIQEAAAAAAAAAAFaKkAAAAAAAAAAAACtFSAAAAAAAAAAAgJUiJAAAAAAAAAAAwEoREgAAAAAAAAAAYKUICQAAAAAAAAAAsFKEBAAAAAAAAAAAWClCAgAAAAAAAAAArBQhAQAAAAAAAAAAVoqQAAAAAAAAAAAAK0VIAAAAAAAAAACAlSIkAAAAAAAAAADAShESAAAAAAAAAABgpQgJAAAAAAAAAACwUoQEAAAAAAAAAABYKUICAAAAAAAAAACsFCEBAAAAAAAAAABWipDAyrRv316NGjV63mX858TGxsrDw0M3b978S/r/+eefVblyZdnb26ts2bJ/yTmy6tixYypcuLBu3br1vEsBAAAAAAAA8JSeeUjw6E3o9u3by2QyyWQyKUeOHPL19dXw4cN1//59SdLWrVuN/Y+/Ll68aPQZHx+vwYMHKzAwUA4ODnJ3d9cLL7ygjz76SNeuXcuwnnv37umjjz5SmTJl5OjoqDx58igkJERz5sxRUlLSs778f7xJkyYpMjLyeZfxp3l5eaX6zRQuXNiizcGDB/X666+rQIECsrOzU9GiRVW/fn198803MpvNkqQzZ87IZDIpW7ZsOn/+vMXxcXFxsrW1lclk0pkzZzKsZ8CAAfrf//4nFxcXSZa/bRsbG+XMmVPlypXT+++/r7i4uCxf79ChQ+Xk5KTY2Fht3rw5y8f/FUqWLKnKlSvrk08+ed6lAAAAAAAAAHhKf/lIgrCwMMXFxen48ePq3bu3hg0bpo8//tiiTWxsrOLi4ixe+fLlkyRdvXpVlStX1pw5c9SnTx/t3btXP/74o0aOHKmDBw9q4cKF6Z773r17Cg0N1ZgxY/TWW29p9+7d2rdvn959911NmTJFR48e/Uuv/Wncu3fvL+0/Z86ccnNz+0vP8XcZPny4xW/m4MGDxr6VK1eqcuXKSkhI0Ny5cxUTE6N169apcePGGjRokG7cuGHRV6FChTRv3jyLbXPnzlWhQoWeWMe5c+e0evVqtW/fPtW+2NhYXbhwQfv371e/fv20adMmlSpVSkeOHMnStZ48eVIvvfSSihYtKnd39ywd+1d68803NW3aNCP4AwAAAAAAAPDv8peHBHZ2dvLw8FDRokX1zjvvqFatWlq1apVFm3z58snDw8PiZWPzsLQPPvhA586d0759+/Tmm2+qdOnSKlq0qOrUqaOvvvpKXbt2TffcEydO1Pbt27V582a9++67Klu2rLy9vdWqVSvt3btXfn5+kqS7d++qe/fuypcvn+zt7fXSSy9p//79Rj8pT4WvX79e5cqVk4ODg1555RVdunRJa9euVUBAgFxdXdWqVSslJiYax1WvXl3dunVTt27dlDNnTuXJk0eDBw82nmKXHj4RP2LECLVt21aurq566623JEk7d+5U1apV5eDgIE9PT3Xv3t1iWpfPPvtMfn5+sre3V/78+dWsWTNj39dff62goCBj1EWtWrWMYx+fbiiz175582YFBwfL0dFRVapUUWxsbLqfe5UqVdSvXz+LbZcvX1b27Nm1ffv2J9afWS4uLha/mbx580qSbt26pY4dO6pevXpas2aN6tSpI29vbwUEBKhjx46Kjo5Wzpw5Lfpq166d5syZY7Ftzpw5ateu3RPrWLJkicqUKZNmoJDy2/b391fLli21a9cu5c2bV++8845Fu5kzZyogIED29vYqUaKEPvvsM2OfyWTSgQMHNHz4cJlMJg0bNkyS9Ouvv6pFixZyc3NT7ty51bBhQ4sRDynf9bhx41SgQAG5u7vr3XfftRhBk9H3kJycrNGjR6tYsWJycHBQmTJl9PXXX1vUXbt2bV29elXbtm174ucEWIuzZ89qwYIF+vjjjxUREaGIiAj98MMPaba9e/euJk+e/MR2j7Zft26dPv/8c3300UcaOXKkpkyZou+++0537961aPvtt99q+vTpGj58uCIiIjRu3Lhndo0AAAAAAOC/429f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SsrsFXLne44ePZptHMKcPteePXvqzJkzevXVV3XkyBHVrFnTGE4rMTFRbdq0yVbXyZMnzYaOyhq26u6/VOSFnZ2dXF1dzV4AAAAAAFii27dvG3NJVqlSxXh4z8fHR6+88oqKFy+utLQ03bp1S1WrVjXel/Wg6r0kJCRo7dq1unnzpjp06KBhw4apTp06unr1qpYsWWI2F2ORIkU0cuRIDRkyRM2bN1dqaqrWrVtnDH8M4N/nkYQETk5O8vf3V4kSJWRjk7fOCVZWVurYsaO++eYb/fbbb3ned5cuXbR582YdOnQo27rU1FTduHFDpUuXlq2trXbt2mW2bv/+/apQoUKe93m3uye93bt3r8qUKZPjL+caNWooIiLCLDjJetna2krK7OIVGBioyZMn6/Dhwzp79qx++uknSZk3exs0aKDRo0fr0KFDsrW11apVq7Lt53Eee9u2bZWUlKQNGzZoyZIlCg4ONlufU/25VaRIEfn7+8vLy8vsSf1du3apfv366tu3r6pXry5/f/9sT93b2toa4+1lyRrD7+75GP6KrN4LERERudp+4cKFun79utq3by8p87tw8uRJFS1aNNt34e5eAVk8PT1VrFgxnTlzJtt7ssKH3PLx8dGbb76plStXauDAgfriiy+Muo4dOyY/P79s+7gz9Dp69KieeuopFSlSJE/7BQAAAAAA2YWHh+vGjRuSMkeruFNAQIB69uxp9MgvXbq0se7OiY7vtn//fl27dk12dnaqWLGibG1tjYDh9u3b95xvwMHBQc8884zs7e2VlJSk3bt3P4rDA/AEeiwTF9/LlStXdPnyZbNX1oQq48ePV/HixVW7dm199dVXOnz4sE6fPq1Vq1Zpz549Od5sf+edd9SgQQM1b95cn376qcLDw3XmzBktX75cdevW1cmTJ+Xk5KQ+ffpo8ODB2rBhgyIiItSrVy/dvHlTPXr0+MvHFhMTo/fee09RUVFaunSpZs2apbfffjvH9wwdOlS7d+9W//79jaez16xZY0xcvG7dOs2cOVNhYWE6d+6cMdN82bJl9csvv2j8+PE6cOCAYmJitHLlSl29elXly5fPtp/HeexOTk5q166dRowYocjISGMymwfVL2WOd9+8efOH3neZMmV04MAB/fjjjzpx4oRGjBhhpOxZ/Pz8dPjwYUVFRemPP/5QamqqOnfuLC8vL7Vr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hYUpKipKgwcPvm8biYmJGj16tNl7jhw5opMnT5oFFjl9B1u1aqVz587p3Xff1W+//abmzZtr0KBBRvtPP/10trpOnDihLl26GO1du3ZN0l+bKNvOzk6urq5mLwAAAAAA/slu376t/fv3S8p8gC9ruOaUlBStWbNG169f17PPPqthw4apRYsWio+P14oVK3KcF/HOe0pNmzZV37599Z///EdS5mTFx48ff4xHBODfKl+HGypcuLCeffZZzZ49W2+99dZ9x1uTMsfgT09P19SpU42x1pYvX262jYeHhy5fvmz2lHZWl647Va9eXdWrV9ewYcNUr149LVmyRHXr1pWUOWxPQECA3n33XXXu3FkhISF68cUXs7Wxa9cude/e3ViXmJiYbULXR2HixImqVq1atuGJypcvr127dmWrKSAgwGx8/Ts5ODioTZs2atOmjfr166dy5crpyJEjql69utLS0nTlyhU1bNgw17XVr19fPj4+WrZsmdavX6+XX37Z7Ia0yWRSgwYN1KBBA3344Yfy9fXVqlWr9N577+V6H25ubvL398+2fPfu3fL19dXw4cONZVkTUGextbXN1quiSpUqunDhgk6cOJFjb4K8KF26tFxdXRUREZGrNn/66ScdOXJE7777riSpRo0aunz5smxsbPI0XE+NGjUUFRV1z/OTFx4eHurWrZu6deumhg0bavDgwZoyZYpq1KihZcuWqWjRojnetD969KgKFCigihUr/qU6AAAAAAD4NwkPDzcmIa5Xr56x/MiRI/rtt98kZd6jsrW1VbVq1bRx40ZJUnR0tLy9ve/ZpouLi/H/WcP/Fi9e3FgWFxf3SI8BgGXI9+GG5syZo9u3b6tmzZpatmyZIiMjFRUVpW+++UbHjx83bnj7+/srNTVVs2bN0pkzZ/T111/rs88+M2urSZMmunr1qiZPnqzTp0/r008/1fr164310dHRGjZsmPbs2aNz585p48aNOnnypMqXL69bt26pf//+2rp1q86dO6ddu3Zp//79ZnMW3KlMmTJauXKlwsLCFB4eri5duuS6h0BeVK5cWcHBwZo5c6bZ8oEDB2rLli0aO3asTpw4oYULF2r27NnGU+B3W7BggebPn6+jR4/qzJkz+uabb+Tg4CBfX18FBAQoODhYXbt21cqVKxUdHa19+/ZpwoQJ+v7773Osr0uXLvrss8+0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2zY1atRI8fHx8vDw0JIlS9ShQwdJ0vHjx1W+fHnt2bNHdevWzeeKAcuWmJioGjVqaM6cOfroo49UrVo1TZ8+nWsXeIK9//772rVrl3bs2HHP9RkZGSpWrJgGDhyoQYMGSZLi4+Pl6empBQsW6JVXXvk7ywVwh+eff16enp6aP3++sax9+/ZycHDQN998w/ULPKFMJpNWrVqldu3aScrdn7WRkZGqUKGC9u/fr5o1a0qSNmzYoOeee04XLlxQsWLF8utwckRPAgBPjJSUFB08eFCBgYHGMisrKwUGBmrPnj35WBmAB4mPj5ckFSpUSJJ08OBBpaamml3P5cqVU4kSJbiegSdAv3791Lp1a7NrVOLaBZ5ka9euVc2aNfXyyy+raNGiql69ur744gtjfXR0tC5fvmx2/bq5ualOnTpcv0A+q1+/vrZs2aITJ05IksLDw7Vz5061atVKEtcv8E+Rm2t1z549cnd3NwICSQoMDJSVlZV++eWXv73m3LLJ7wIAIMsff/yhtLQ0eXp6mi339PTU8ePH86kqAA+Snp6ud955Rw0aNFClSpUkSZcvX5atra3c3d3NtvX09NTly5fzoUoAWUJDQ/Xrr79q//792dZx7QJPrjNnzmju3Ll677339N///lf79+/XgAEDZGtrq27duhnX6L3+Ls31C+Sv999/XwkJCSpXrpysra2VlpamcePGKTg4WJK4foF/iNxcq5cvX1bRokXN1tvY2KhQoUJP9PVMSAAAAP6Sfv366ejRo9q5c2d+lwLgAc6fP6+3335bmzZtkr29fX6XAyAP0tPTVbNmTY0fP16SVL16dR09elSfffaZunXrls/VAcjJ8uXLtXjxYi1ZskQVK1ZUWFiY3nnnHRUrVozrF8ATgeGGADwxihQpImtra/3+++9my3///Xd5eXnlU1UActK/f3+tW7dOP//8s5566iljuZeXl1JSUhQXF2e2PdczkL8OHjyoK1euqEaNGrKxsZGNjY22bdummTNnysbGRp6enly7wBPK29tbFSpUMFtWvnx5xcTESJJxjfJ3aeDJM3jwYL3//vt65ZVXVLlyZb366qt69913NWHCBElcv8A/RW6uVS8vL125csVs/e3bt3Xt2rUn+nomJADwxLC1tdXTTz+tLVu2GMvS09O1ZcsW1atXLx8rA3C3jIwM9e/fX6tWrdJPP/2kkiVLmq1/+umnVaBAAbPrOSoqSjExMVzPQD5q3ry5jhw5orCwMONVs2ZNBQcHG//PtQs8mRo0aKCoqCizZSdOnJCvr68kqWTJkvLy8jK7fhMSEvTLL79w/QL57ObNm7KyMr8FZ21trfT0dElcv8A/RW6u1Xr16ikuLk4HDx40tvnpp5+Unp6uOnXq/O015xbDDQF4orz33nvq1q2batasqdq1a2v69Om6ceOGXnvttfwuDcAd+vXrpyVLlmjNmjVycXExxlZ0c3OTg4OD3Nzc1KNHD7333nsqVKiQXF1d9dZbb6levXqqW7duPlcPWC4XFxdj7pAsTk5OKly4sLGcaxd4Mr377ruqX7++xo8fr44dO2rfvn2aN2+e5s2bJ0kymUx655139NFHH6lMmTIqWbKkRowYoWLFiqldu3b5Wzxg4dq0aaNx48apRIkSqlixog4dOqRp06bp9ddfl8T1CzxJEhMTderUKePn6OhohYWFqVChQipRosQDr9Xy5csrKChIvXr10meffabU1FT1799fr7zyiooVK5ZPR/VgpoyMjIz8LgIA7jR79mx9/PHHunz5sqpVq6aZM2c+0WkrYIlMJtM9l4eEhKh79+6SpKSkJA0cOFBLly5VcnKyWrZsqTlz5jzRXSwBS9SkSRNVq1ZN06dPl8S1CzzJ1q1bp2HDhunkyZMqWbKk3nvvPfXq1ctYn5GRoZEjR2revHmKi4vTM888ozlz5iggICAfqwbw559/asSIEVq1apWuXLmiYsWKqXPnzvrwww9la2sriesXeFJs3bpVTZs2zba8W7duWrBgQa6u1WvXrql///767rvvZGVlpfbt22vmzJlydnb+Ow8lTwgJAAAAAAAAAACwUMxJAAAAAAAAAACAhSIkAAAAAAAAAADAQhESAAAAAAAAAABgoQgJAAAAAAAAAACwUIQEAAAAAAAAAABYKEICAAAAAAAAAAAsFCEBAAAAAAAAAAAWipAAAAAAAAAAAAALRUgAAAAAAAAAAICFIiQAAAAAAAAAAMBCERIAAAAAAAAAAGChCAkAAAAAAAAAALBQ/w9VLS4VDvvAwgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt \n", diff --git a/examples/task-plugins/dioptra_custom/fgm_mnist_demo/artifacts_restapi.py b/examples/task-plugins/dioptra_custom/fgm_mnist_demo/artifacts_restapi.py index d03aba37d..70c06fde7 100644 --- a/examples/task-plugins/dioptra_custom/fgm_mnist_demo/artifacts_restapi.py +++ b/examples/task-plugins/dioptra_custom/fgm_mnist_demo/artifacts_restapi.py @@ -14,157 +14,103 @@ # # ACCESS THE FULL CC BY 4.0 LICENSE HERE: # https://creativecommons.org/licenses/by/4.0/legalcode -import requests import structlog import os from dioptra import pyplugs from dioptra.client import connect_json_dioptra_client from structlog.stdlib import BoundLogger -from posixpath import join as urljoin -from urllib.parse import urlparse, urlunparse LOGGER: BoundLogger = structlog.stdlib.get_logger() @pyplugs.register def get_uri_for_model(model_name, model_version=-1): - session, url = get_logged_in_session() - models = get(session, url, f'models?search={model_name}&pageLength=500') + dioptra_client = get_logged_in_session() + models = dioptra_client.models.get( + search=model_name, + page_length=500 + ) + selected_model = None for model in models['data']: if (model['name'] == model_name): model_id = model['id'] if (model_version >= 0): - selected_model = get(session, url, - f'models/{model_id}/versions/{model_version}' + selected_model = dioptra_client.models.versions.get_by_id( + model_id=model_id, + version_number=model_version ) else: selected_model = model['latestVersion'] - uri = selected_model['artifact']['artifactUri'] + uri = selected_model['artifact']['artifactUri'] if selected_model is not None else None return uri def get_uris_for_job(job_id): - session, url = get_logged_in_session() - job = get(session, url, 'jobs', str(job_id)) + dioptra_client = get_logged_in_session() + job = dioptra_client.jobs.get_by_id(job_id) return [artifact['artifactUri'] for artifact in job['artifacts']] def get_uris_for_artifacts(artifact_ids): - session, url = get_logged_in_session() - return [get(session, url, 'artifacts', aid) for aid in artifact_ids] + dioptra_client = get_logged_in_session() + return [dioptra_client.artifacts.get_by_id(artifact_id=aid) for aid in artifact_ids] def get_logged_in_session(): - session = requests.Session() - url = "http://dioptra-deployment-restapi:5000/api/v1" - - login = post(session, url, { - 'username':os.environ['DIOPTRA_WORKER_USERNAME'], - 'password':os.environ['DIOPTRA_WORKER_PASSWORD']}, - 'auth', 'login') - LOGGER.info("login request sent", response=str(login)) - - return session, url + url = "http://dioptra-deployment-restapi:5000/" + dioptra_client = connect_json_dioptra_client(url) + dioptra_client.auth.login( + username=os.environ['DIOPTRA_WORKER_USERNAME'], + password=os.environ['DIOPTRA_WORKER_PASSWORD'] + ) + return dioptra_client def upload_model_to_restapi(name, source_uri, job_id): version = 0 model_id = 0 - session, url = get_logged_in_session() + dioptra_client = get_logged_in_session() + models = dioptra_client.models.get( + search=name, + page_length=500 + ) - models = get(session, url, f'models?search={name}&pageLength=500') LOGGER.info("requesting models from RESTAPI", response=models) - for model in models['data']: #check whether to create a new model if model['name'] == name: model_id = model['id'] if model['latestVersion'] != None: version = model['latestVersion']['versionNumber'] + 1 + if (version == 0 and model_id == 0): - LOGGER.info("creating new model on RESTAPI") - model = post(session, url, {"group": 1, "name": name, "description": f"{name} model"}, "models") + model = dioptra_client.models.create( + group_id=1, + name=name, + description=f"{name} model" + ) model_id = model['id'] LOGGER.info("new model created", response=model) - artifact = post(session, url, {"group": 1, "description": f"{name} model artifact", "job": str(job_id), "uri": source_uri}, 'artifacts') + artifact = dioptra_client.artifacts.create( + group_id=1, + description=f"{name} model artifact", + job_id=job_id, + uri=source_uri + ) LOGGER.info("artifact", response=artifact) - model_version = post(session, url, {"description": f"{name} model version", "artifact": artifact['id']}, 'models', str(model_id), 'versions') + + model_version = dioptra_client.models.versions.create( + model_id=model_id, + artifact_id=artifact['id'], + description=f"{name} model version" + ) LOGGER.info("model created", response=model_version) def upload_artifact_to_restapi(source_uri, job_id): - session, url = get_logged_in_session() - - artifact = post(session, url, {"group": 1, "description": f"artifact for job {job_id}", "job": str(job_id), "uri": source_uri}, 'artifacts') - LOGGER.info("artifact", response=artifact) - -def debug_request(url, method, data=None): - LOGGER.debug("Request made.", url=url, method=method, data=data) - - -def debug_response(json): - LOGGER.debug("Response received.", json=json) - - -def get(session, endpoint, *features): - debug_request(urljoin(endpoint, *features), "GET") - return make_request(session, "get", endpoint, None, *features) - - -def post(session, endpoint, data, *features): - debug_request(urljoin(endpoint, *features), "POST", data) - return make_request(session, "post", endpoint, data, *features) - - -def delete(session, endpoint, data, *features): - debug_request(urljoin(endpoint, *features), "DELETE", data) - return make_request(session, "delete", endpoint, data, *features) - - -def put(session, endpoint, data, *features): - debug_request(urljoin(endpoint, *features), "PUT", data) - return make_request(session, "put", endpoint, data, *features) - - -def make_request(session, method_name, endpoint, data, *features): - url = urljoin(endpoint, *features) - method = getattr(session, method_name) - try: - if data: - response = method(url, json=data) - else: - response = method(url) - if response.status_code != 200: - raise StatusCodeError() - json = response.json() - except (requests.ConnectionError, StatusCodeError, requests.JSONDecodeError) as e: - handle_error(session, url, method_name.upper(), data, response, e) - debug_response(json=json) - return json - - -def handle_error(session, url, method, data, response, error): - if type(error) is requests.ConnectionError: - restapi = os.environ["DIOPTRA_RESTAPI_URI"] - message = ( - f"Could not connect to the REST API. Is the server running at {restapi}?" - ) - LOGGER.error(message, url=url, method=method, data=data, response=response.text) - raise APIConnectionError(message) - if type(error) is StatusCodeError: - message = f"Error code {response.status_code} returned." - LOGGER.error(message, url=url, method=method, data=data, response=response.text) - raise StatusCodeError(message) - if type(error) is requests.JSONDecodeError: - message = "JSON response could not be decoded." - LOGGER.error(message, url=url, method=method, data=data, response=response.text) - raise JSONDecodeError(message) - -class APIConnectionError(Exception): - """Class for connection errors""" - - -class StatusCodeError(Exception): - """Class for status code errors""" - - -class JSONDecodeError(Exception): - """Class for JSON decode errors""" + dioptra_client = get_logged_in_session() + artifact = dioptra_client.artifacts.create( + group_id=1, + description=f"artifact for job {job_id}", + job_id=job_id, + uri=source_uri + ) + LOGGER.info("artifact", response=artifact) \ No newline at end of file