[7e250a]: / src / hint / notebooks / ablations.ipynb

Download this file

289 lines (288 with data), 44.9 kB

{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The autoreload extension is already loaded. To reload it, use:\n",
      "  %reload_ext autoreload\n"
     ]
    }
   ],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%cd ../"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch, os\n",
    "torch.manual_seed(0) \n",
    "import warnings;warnings.filterwarnings(\"ignore\")\n",
    "from HINT.dataloader import csv_three_feature_2_dataloader, generate_admet_dataloader_lst\n",
    "from HINT.molecule_encode import MPNN, ADMET \n",
    "from HINT.icdcode_encode import GRAM, build_icdcode2ancestor_dict\n",
    "from HINT.protocol.model import ProtocolEmbedding\n",
    "from HINT.model import HINTModel\n",
    "device = torch.device(\"cuda:0\")\n",
    "if not os.path.exists(\"figure\"):\n",
    "\tos.makedirs(\"figure\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "ablations = [\n",
    "    {\"name\": \"disease_pred\",\n",
    "      \"config\": {\n",
    "         \"disease_embedding\": True\n",
    "     }\n",
    "    },\n",
    "    {\"name\": \"molecule_pred\",\n",
    "      \"config\": {\n",
    "         \"molecule_embedding\": True\n",
    "     }\n",
    "    },\n",
    "    {\"name\": \"protocol_pred\",\n",
    "      \"config\": {\n",
    "         \"protocol_embedding\": True\n",
    "     }\n",
    "    },\n",
    "    {\"name\": \"interaction_pred\",\n",
    "      \"config\": {\n",
    "         \"interaction_embedding\": True\n",
    "     }\n",
    "    },\n",
    "    {\"name\": \"disease_risk_pred\",\n",
    "      \"config\": {\n",
    "         \"disease_risk_embedding\": True\n",
    "     }\n",
    "    },\n",
    "    {\"name\": \"augmented_interaction_pred\",\n",
    "      \"config\": {\n",
    "         \"augmented_interaction_embedding\": True\n",
    "     }\n",
    "    },\n",
    "    {\"name\": \"pharmacokinetics_pred\",\n",
    "      \"config\": {\n",
    "         \"pk_embedding\": True\n",
    "     }\n",
    "    },\n",
    "     {\"name\": \"trial_pred_nn\",\n",
    "      \"config\": {\n",
    "         \"trial_embedding\": True\n",
    "     }\n",
    "    },\n",
    "    {\"name\": \"vanilla\",\n",
    "      \"config\": {\n",
    "         \"base_model\": True\n",
    "     }\n",
    "    },\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "ablations = [\n",
    "      {\"name\": \"disease_pred\",\n",
    "      \"config\": {\n",
    "         \"disease_embedding\": True\n",
    "     }\n",
    "    },\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "phase_name = 'phase_III'\n",
    "model_name = 'icd_protocol'\n",
    "datafolder = \"data\"\n",
    "train_file = os.path.join(datafolder, phase_name + '_train.csv')\n",
    "valid_file = os.path.join(datafolder, phase_name + '_valid.csv')\n",
    "test_file = os.path.join(datafolder, phase_name + '_test.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "mpnn_model = MPNN(mpnn_hidden_size = 50, mpnn_depth=3, device = device)\n",
    "admet_model_path = \"save_model/admet_model.ckpt\"\n",
    "if not os.path.exists(admet_model_path):\n",
    "\tadmet_dataloader_lst = generate_admet_dataloader_lst(batch_size=32)\n",
    "\tadmet_trainloader_lst = [i[0] for i in admet_dataloader_lst]\n",
    "\tadmet_testloader_lst = [i[1] for i in admet_dataloader_lst]\n",
    "\tadmet_model = ADMET(molecule_encoder = mpnn_model, \n",
    "\t\t\t\t\t\thighway_num=2, \n",
    "\t\t\t\t\t\tdevice = device, \n",
    "\t\t\t\t\t\tepoch=3, \n",
    "\t\t\t\t\t\tlr=5e-4, \n",
    "\t\t\t\t\t\tweight_decay=0, \n",
    "\t\t\t\t\t\tsave_name = 'admet_')\n",
    "\tadmet_model.train(admet_trainloader_lst, admet_testloader_lst)\n",
    "\ttorch.save(admet_model, admet_model_path)\n",
    "else:\n",
    "\tadmet_model = torch.load(admet_model_path)\n",
    "\tadmet_model = admet_model.to(device)\n",
    "\tadmet_model.set_device(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_loader = csv_three_feature_2_dataloader(train_file, shuffle=True, batch_size=32) \n",
    "valid_loader = csv_three_feature_2_dataloader(valid_file, shuffle=False, batch_size=32) \n",
    "test_loader = csv_three_feature_2_dataloader(test_file, shuffle=False, batch_size=32) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "icdcode2ancestor_dict = build_icdcode2ancestor_dict()\n",
    "gram_model = GRAM(embedding_dim = 50, icdcode2ancestor = icdcode2ancestor_dict, device = device)\n",
    "protocol_model = ProtocolEmbedding(output_dim = 50, highway_num=3, device = device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Running ablation disease_pred...\n",
      "PR-AUC   mean: 0.7714 std: 0.0118\n",
      "F1       mean: 0.8320 std: 0.0081\n",
      "ROC-AUC  mean: 0.6719 std: 0.0158\n",
      "Accuracy mean: 0.7740 std: 0.0120\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHVCAYAAAB8NLYkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAABq+UlEQVR4nO3deVwU9f8H8NdwI3IKciiImopX3ooX3nllWmqSt6lUiomWZ95Z5lGZ5ZFlmpZalpnmWXhlHihmiveBCioocoPcn98ffpnfLuzCLsxyLK/n47GPxzDzmc++Z3Zn9s1nZj4fSQghQERERETlnklpB0BEREREymBiR0RERGQkmNgRERERGQkmdkRERERGgokdERERkZFgYkdERERkJJjYERERERkJJnZERERERoKJHREREZGRYGJHREREZCTMSjsAJR0/fhzLly9HaGgoHj16hN9++w0DBgwAAGRmZmLOnDnYt28f7ty5A3t7e3Tv3h2ffPIJPDw85DpiY2MxadIk7NmzByYmJhg4cCC++OILVK5cWec4cnJy8PDhQ9ja2kKSJKU3k4iIiCoQIQSSkpLg4eEBE5OC2+SMKrFLSUlBkyZN8Oabb+K1115TW5aamorz589j7ty5aNKkCeLi4jB58mS88sorOHfunFxu2LBhePToEf78809kZmZizJgxCAgIwNatW3WO4+HDh/D09FRsu4iIiIgiIiJQvXr1AstIQghRQvGUKEmS1FrsNDl79ixat26Ne/fuwcvLC1evXkWDBg1w9uxZtGzZEgBw4MAB9OnTB5GRkWotewVJSEiAg4MDIiIiYGdnp8TmEBERUQWVmJgIT09PxMfHw97evsCyRtVip6+EhARIkgQHBwcAwKlTp+Dg4CAndQDQvXt3mJiY4MyZM3j11Vc11pOeno709HT576SkJACAnZ0dEzsiIiJShC63d1XYhyfS0tIwY8YMvPHGG3LyFRUVhapVq6qVMzMzg5OTE6KiorTWtWTJEtjb28svXoYlIiKi0lAhE7vMzEy8/vrrEEJg7dq1xa5v1qxZSEhIkF8REREKRElERESknwp3KTY3qbt37x4OHz6sdqnUzc0Njx8/ViuflZWF2NhYuLm5aa3T0tISlpaWBouZiIiISBcVqsUuN6m7efMm/vrrL1SpUkVtedu2bREfH4/Q0FB53uHDh5GTk4M2bdqU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V+WRJ0pzSLHPP/8cL7/8MgYOHAg/Pz+4ublh586dpRYPERERka4USexef/111K5dGwCwf/9+TJo0Sef77bZu3YrJkyfLf8+aNUuJkHR29OhRedQJALCyssLq1asRGxuLlJQU7Ny5k/fXERERUbmgSGJnbm6O1atXw9TUFACwZs0aNGrUCGvWrMHVq1eRlZUll42Li8O1a9ewadMmdOnSBSNGjEBGRgYkScJrr72Gvn37KhESERERUYWj2FixL730EtavX4/x48cjJycH169fx6RJk9TKCCHU+qvLnQcAvr6+2Lx5s1LhEBEREVU4iiV2ADB69GjUqVMHI0eORHh4uDxfkiRIkgTg/xO5XCYmJggICMDKlSthYWGhZDhEZOQ4IgERkTpFLsWqat++PW7cuIFt27ahb9++cHBwgBBCfuWqVasW3nnnHVy+fBlr1qxhUkdERERUTIq22OUyNTXFkCFDMGTIEABAZGQknj59ipSUFNjb28PV1TXfJVkiIiIiKh5FErtFixbJ02PHjkW1atXUllevXh3Vq1dX4q2IiIyKz3HDXk++5seerokqEkUSuwULFkCSJDg6OuKDDz5QokoiIiIi0pMi99jZ2NgAAOrVqyd3eUJEREREJUuRFjt3d3fcvn0bZmYGuWWPiKjUGPpSKRGRkhRpsWvatCmEELh586YS1RERERFRESiS2A0fPhwAEB0djeDgYCWqJCIiIiI9KZLY9evXD127doUQAhMmTMCTJ0+UqJaIiIiI9KBIYidJErZu3YrmzZvj5s2baNWqFX777Tfk5OQoUT0RERER6UDRfuxeeukl3Lx5E/fv38egQYPg4uICX19f1K5dG7a2tjAx0S2PnDdvnhJhEREREVUoivZjl0uSJAgh8PjxY+zZs0fv+pjYEREREelPsf5JVMeB1WW+NqoJIhERERHpTpHEbtSoUUpUQ0RERETFoEhit3HjRiWqISIiIqJi0Pmp2Fq1aqFWrVp48803DRkPERERERWRzond3bt3ce/ePURFReWvxMQEpqam6Nu3r6LBEREREZHuFOnHLpe+D0oQERERkXJ0TuwsLCwAAJmZmQYLhoiIiIiKTufEzsnJCUII3Lp1y5DxEBEREVER6ZzYvfjiiwCA+/fvY+nSpcjOzjZYUERERESkP527Oxk4cCAOHToEAJg9ezbmzZsHNzc3mJqaymWOHTuGWrVqFSsgSZJw+/btYtVBREREVBHpnNiNGTMG33zzDc6dOwdJkpCZmYnIyEh5uRACaWlpuHfvXpGDEUJw5AkiIiKiItL5UqyZmRkOHz6MiRMnonLlygCeJ2KqT8Lm/l3UFxEREREVnV4jT1SuXBlffvklvvjiC9y4cQOxsbHIyMhA165dIUkSWrVqhaVLlxoqViIiIiIqQJGGFDMxMYGPj0+++U5OTujUqVOxgyIiIiIi/SnWQTEvpRIRERGVriK12OV15MgRAM9b7IiIiIiodCiS2PHyKxERUelZv760I6CyQtGxYomIiIio9DCxIyIiIjISilyKJaqIfI4b+NpHQIBh6yciIqPDFjsiIiIiI8HEjoiIiMhIMLEjIiIiMhJM7IiIiIiMBBM7IiIiIiPBxI6IiIjISDCxIyIiIjISTOyIiIiIjAQTOyIiIiIjwcSOiIiIyEgwsSMiIiIyEkzsiIiIiIwEEzsiIiIiI8HEjoiIiMhIMLEjIiIiMhJmpR0AEWm2fn1pR0DGwOe4Yb9I1/wCDFo/EemHLXZERERERqJCJXZLlixBq1atYGtri6pVq2LAgAG4fv26Wpm0tDRMnDgRVapUQeXKlTFw4EBER0eXUsREREREuqtQid2xY8cwceJEnD59Gn/++ScyMzPx0ksvISUlRS4zZcoU7NmzBzt27MCxY8fw8OFDvPbaa6UYNREREZFuKtQ9dgcOHFD7e9OmTahatSpCQ0Ph5+eHhIQEbNiwAVu3bkXXrl0BABs3bkT9+vVx+vRp+Pr6lkbYRERERDqpUC12eSUkJAAAnJycAAChoaHIzMxE9+7d5TI+Pj7w8vLCqVOntNaTnp6OxMREtRcRERFRSatQLXaqcnJyEBQUhPbt26NRo0YAgKioKFhYWMDBwUGtrKurK6KiorTWtWTJEixcuNCQ4VIRGPqpUh/DVm/wpxmJiMj4VNgWu4kTJyIsLAzbt28vdl2zZs1CQkKC/IqIiFAgQiIiIiL9VMgWu8DAQPzxxx84fvw4qlevLs93c3NDRkYG4uPj1VrtoqOj4ebmprU+S0tLWFpaGjJkIiIiokJVqBY7IQQCAwPx22+/4fDhw6hZs6ba8hYtWsDc3BzBwcHyvOvXr+P+/fto27ZtSYdLREREpJcK1WI3ceJEbN26Fb///jtsbW3l++bs7e1hbW0Ne3t7jB07FlOnToWTkxPs7OwwadIktG3blk/EEhERUZlXoRK7tWvXAgA6d+6sNn/jxo0YPXo0AODzzz+HiYkJBg4ciPT0dPTs2RNr1qwp4UiJiIiI9FehEjshRKFlrKyssHr1aqxevboEIiIiIiJSToW6x46IiIjImDGxIyIiIjISTOyIiIiIjAQTOyIiIiIjwcSOiIiIyEgwsSMiIiIyEhWquxMiIlKWz/H1Bn+Pa34BBn8PImPBFjsiIiIiI8HEjoiIiMhIMLEjIiIiMhJM7IiIiIiMBBM7IiIiIiPBxI6IiIjISDCxIyIiIjISTOyIiIiIjAQ7KCYiogrN0J0ss4NlKklssSMiIiIyEkzsiIiIiIwEEzsiIiIiI8F77Iio3CqJAeip9PFzJtIdW+yIiIiIjAQTOyIiIiIjwcSOiIiIyEgwsSMiIiIyEkzsiIiIiIwEn4olo8Un6YiIyof1PF0rhi12REREREaCiR0RERGRkWBiR0RERGQkmNgRERERGQkmdkRERERGgk/FEhERlXOG7gXgml+AQesn5bDFjoiIiMhIMLEjIiIiMhJM7IiIiIiMBBM7IiIiIiPBxI6IiIjISDCxIyIiIjISTOyIiIiIjAQTOyIiIiIjwcSOiIiIyEhw5AkiIiIqEEe2KD/YYkdERERkJJjYERERERkJXoolIiIyIENfxiRSxRY7IiIiIiPBxI6IiIjISPBSLJWa9Qa+OuFj2OqJiKicKJHL4QFl48lettgRERERGQkmdkRERERGgpdiyytDX8csI03KREREpDu22BEREREZCSZ2REREREaCiZ0Wq1evhre3N6ysrNCmTRuEhISUdkhEREREBeI9dhr89NNPmDp1KtatW4c2bdpg5cqV6NmzJ65fv46qVauWdngAgOPHDVt/SYzHzN7YiYiIlMUWOw0+++wzjB8/HmPGjEGDBg2wbt06VKpUCd99911ph0ZERESkFVvs8sjIyEBoaChmzZolzzMxMUH37t1x6tQpjeukp6cjPT1d/jshIQEAkJiYaLA4UzKfGaxuwLCx5zL0NhARUfnw7Jlhf3NK4vfGkL+buXULIQoty8Quj5iYGGRnZ8PV1VVtvqurK65du6ZxnSVLlmDhwoX55nt6ehokxhLxc1BpR0BERBWFMfzmlMA2JCUlwd7evsAyTOwUMGvWLEydOlX+OycnB7GxsahSpQokScpXPjExEZ6enoiIiICdnV1Jhmp0uC+Vxf2pHO5L5XBfKof7UjkluS+FEEhKSoKHh0ehZZnY5eHs7AxTU1NER0erzY+Ojoabm5vGdSwtLWFpaak2z8HBodD3srOz44GlEO5LZXF/Kof7Ujncl8rhvlROSe3LwlrqcvHhiTwsLCzQokULBAcHy/NycnIQHByMtm3blmJkRERERAVji50GU6dOxahRo9CyZUu0bt0aK1euREpKCsaMGVPaoRERERFpxcROgyFDhuDJkyeYN28eoqKi0LRpUxw4cCDfAxVFZWlpifnz5+e7fEv6475UFvencrgvlcN9qRzuS+WU1X0pCV2enSUiIiKiMo/32BEREREZCSZ2REREREaCiR0RERGRkWBiR0RERGQkmNgZyOrVq+Ht7Q0rKyu0adMGISEhWsvu3LkTLVu2hIODA2xsbNC0aVNs2bKlBKMt2/TZl6q2b98OSZIwYMAAwwZYjuizLzdt2gRJktReVlZWJRht2afvdzM+Ph4TJ06Eu7s7LC0tUbduXezbt6+Eoi3b9NmXnTt3zvfdlCQJffv2LcGIyy59v5crV65EvXr1YG1tDU9PT0yZMgVpaWklFG3Zps++zMzMxKJFi1C7dm1YWVmhSZMmOHDgQAlG+z+CFLd9+3ZhYWEhvvvuO3H58mUxfvx44eDgIKKjozWWP3LkiNi5c6e4cuWKuHXrlli5cqUwNTUVBw4cKOHIyx5992Wu8PBwUa1aNdGxY0fRv3//kgm2jNN3X27cuFHY2dmJR48eya+oqKgSjrrs0nd/pqeni5YtW4o+ffqIEydOiPDwcHH06FFx4cKFEo687NF3Xz59+lTtexkWFiZMTU3Fxo0bSzbwMkjfffnjjz8KS0tL8eOPP4rw8HBx8OBB4e7uLqZMmVLCkZc9+u7L6dOnCw8PD7F3715x+/ZtsWbNGmFlZSXOnz9fonEzsTOA1q1bi4kTJ8p/Z2dnCw8PD7FkyRKd62jWrJmYM2eOIcIrV4qyL7OyskS7du3Et99+K0aNGsXE7n/03ZcbN24U9vb2JRRd+aPv/ly7dq2oVauWyMjIKKkQy43injM///xzYWtrK5KTkw0VYrmh776cOHGi6Nq1q9q8qVOnivbt2xs0zvJA333p7u4uvvrqK7V5r732mhg2bJhB48yLl2IVlpGRgdDQUHTv3l2eZ2Jigu7du+PUqVOFri+EQHBwMK5fvw4/Pz9DhlrmFXVfLlq0CFWrVsXYsWNLIsxyoaj7Mjk5GTVq1ICnpyf69++Py5cvl0S4ZV5R9ufu3bvRtm1bTJw4Ea6urmjUqBE+/vhjZGdnl1TYZVJxz5kAsGHDBvj7+8PGxsZQYZYLRdmX7dq1Q2hoqHyJ8c6dO9i3bx/69OlTIjGXVUXZl+np6fluV7G2tsaJEycMGmteHHlCYTExMcjOzs43SoWrqyuuXbumdb2EhARUq1YN6enpMDU1xZo1a9CjRw9Dh1umFWVfnjhxAhs2bMCFCxdKIMLyoyj7sl69evjuu+/w4osvIiEhAStWrEC7du1w+fJlVK9evSTCLrOKsj/v3LmDw4cPY9iwYdi3bx9u3bqFCRMmIDMzE/Pnzy+JsMukop4zc4WEhCAsLAwbNmwwVIjlRlH25dChQxETE4MOHTpACIGsrCy8/fbbmD17dkmEXGYVZV/27NkTn332Gfz8/FC7dm0EBwdj586dJf7PG1vsyghbW1tcuHABZ8+exUcffYSpU6fi6NGjpR1WuZKUlIQRI0bgm2++gbOzc2mHU+61bdsWI0eORNOmTdGpUyfs3LkTLi4u+Prrr0s7tHIpJycHVatWxfr169GiRQsMGTIEH3zwAdatW1faoZVrGzZsQOPGjdG6devSDqVcOnr0KD7++GOsWbMG58+fx86dO7F37158+OGHpR1aufPFF1+gTp068PHxgYWFBQIDAzFmzBiYmJRsqsUWO4U5OzvD1NQU0dHRavOjo6Ph5uamdT0TExO88MILAICmTZvi6tWrWLJkCTp37mzIcMs0fffl7du3cffuXfTr10+el5OTAwAwMzPD9evXUbt2bcMGXUYV9XupytzcHM2aNcOtW7cMEWK5UpT96e7uDnNzc5iamsrz6tevj6ioKGRkZMDCwsKgMZdVxflupqSkYPv27Vi0aJEhQyw3irIv586dixEjRmDcuHEAgMaNGyMlJQUBAQH44IMPSjwpKSuKsi9dXFywa9cupKWl4enTp/Dw8MDMmTNRq1atkghZVjE/MQOysLBAixYtEBwcLM/LyclBcHAw2rZtq3M9OTk5SE9PN0SI5Ya++9LHxweXLl3ChQsX5Ncrr7yCLl264MKFC/D09CzJ8MsUJb6X2dnZuHTpEtzd3Q0VZrlRlP3Zvn173Lp1S/5nAwBu3LgBd3f3CpvUAcX7bu7YsQPp6ekYPny4ocMsF4qyL1NTU/Mlb7n/fIgKPJR8cb6XVlZWqFatGrKysvDrr7+if//+hg5XXYk+qlFBbN++XVhaWopNmzaJK1euiICAAOHg4CB3FTFixAgxc+ZMufzHH38sDh06JG7fvi2uXLkiVqxYIczMzMQ333xTWptQZui7L/PiU7H/T999uXDhQnHw4EFx+/ZtERoaKvz9/YWVlZW4fPlyaW1CmaLv/rx//76wtbUVgYGB4vr16+KPP/4QVatWFYsXLy6tTSgzinqcd+jQQQwZMqSkwy3T9N2X8+fPF7a2tmLbtm3izp074tChQ6J27dri9ddfL61NKDP03ZenT58Wv/76q7h9+7Y4fvy46Nq1q6hZs6aIi4sr0bh5KdYAhgwZgidPnmDevHmIiopC06ZNceDAAfkmzPv376v9h5SSkoIJEyYgMjIS1tbW8PHxwQ8//IAhQ4aU1iaUGfruS9JO330ZFxeH8ePHIyoqCo6OjmjRogVOnjyJBg0alNYmlCn67k9PT08cPHgQU6ZMwYsvvohq1aph8uTJmDFjRmltQplRlOP8+vXrOHHiBA4dOlQaIZdZ+u7LOXPmQJIkzJkzBw8ePICLiwv69euHjz76qLQ2oczQd1+mpaVhzpw5uHPnDipXrow+ffpgy5YtcHBwKNG4JSEqcFsrERERkRFhUwcRERGRkWBiR0RERGQkmNgRERERGQkmdkRERERGgokdERERkZFgYkdERERkJJjYERERERkJJnZERERERoKJHRkNSZLklzbe3t5ymbt375ZccOXI6NGj5X20adOm0g6HyGjcvXtXPra8vb1LOxytFixYIMe5YMECRerUddt1OUfzHFUwJnZERERERoKJHZGBHD16VP6vsnPnzqUdDhFRhbFp0yb5/Dt69OjSDqdEMbEjIiIiMhJmpR0AUUnifXVERCXP29sbQghF6tq0aRPvrSsAW+yIiIiIjAQTOyIiIiIjwcSunNPUxcfZs2cxbtw41K1bFzY2NnByckLr1q2xZMkSJCYmFlpn586d5TqPHj0KAHj06BE+/vhjtG7dGm5ubjA1NYWDg4PG9TMzM7Flyxa8/vrrqFWrFmxtbWFjY4OaNWvijTfewG+//aZXk3xCQgKWLFmCVq1awdHREZUrV0a9evUwfvx4hIaG6lwPoH93J9nZ2fj5558xcuRI1KtXD46OjjA3N0eVKlXQpk0bTJ48GcHBwWrbk9tVQJcuXeR5x44dU/usdO3y4OzZs5gyZQqaNm0KFxcXWFhYwM3NDZ06dcLSpUsRFxen1/bv2rUL/fv3R7Vq1WBpaYnq1aujR48e2LJlC7KysvSqSx8RERFYuHAh/Pz84OrqCktLS1hYWKBKlSpo0qQJhg4dirVr1yIqKkrj+pq+kwUpSncNJ06cwOTJk9GsWTNUrVoV5ubmsLOzQ+PGjTFq1Chs27YNz549K7Se6OhoLFu2DD169ICXlxesra1hbW0NLy8v9O7dG8uWLdPpu6fkcXT27FkEBgaiefPmcHR0hJmZGaytreHu7g5fX1+88847+Pnnn5GSkqK1jpiYGKxYsQLdu3eHh4cHrKysYG5uDgcHBzRs2BCDBg3CZ599hvDwcJ1iKoim4/TatWsICgpCgwYNYGdnBzs7O7z44ouYM2eO1u+NKk1dZMTHx+OLL76An58fqlWrBjMzM0iShPj4eI3b/8knn6BTp05wd3eHpaUlnJ2d0axZM0ybNg1Xrlwp8vYGBwfjjTfeQO3atWFtbQ0XFxd07NgRX331FdLT03Wq4/Hjx9i4cSNGjRqFZs2awcnJSf58fHx8MGbMGBw8eLDIMaakpGD16tXo2LEj3NzcYGVlhRo1amDYsGE4duxYoesr2dVLQd2d5C4bM2aMPO/777/XeP7Nfajtt99+k+f5+PjoHMedO3dgYmICSZJgaWmJmJiYYm2XYgSVawDklxBCzJ8/X5iYmKjNV31Vq1ZNnDx5ssA6O3XqJJc/cuSI2LVrl3B0dMxXl729fb51jxw5ImrXrq31/XNfvr6+IjIystDt+/vvv4WHh4fWekxMTMTChQs17gtNatSoIZcJDw8v8L2PHz8u6tatW+i2ABAzZsyQ15s/f75O6wAQNWrU0PjesbGxYuDAgYWu7+DgIHbs2FHofkxKShJ9+vQpsK4OHTqIR48eiVGjRsnzNm7cWGjdhfn666+FtbW1Tvujffv2GuvI+50sjOpnMH/+/ALLRkREiB49eugUX5s2bbTWk52dLRYuXCgqVapUaD0mJibi8uXLWutS6jjKzMwUAQEBOn8fP/jgA431aDsHaDvHFFfe43T9+vXC0tJS63s6OjqK33//vcA6836vT5w4ITw9PTXWFxcXp7buhg0bhL29fYHbbWpqKoKCgkRWVpbWGMLDw9WO/YyMjEI/n/r164vr168XuG1ffPGFMDU11enz6dq1q4iJiSmwvrzHz7Vr10T9+vULrHf8+PF6bbs2upyjCzpHqS4r7NWpUychxPPjxM3NTZ5/4sSJAvdPrg8++EBeZ/DgwTqtUxL48IQRWbVqFRYuXAgAeOGFF9CmTRtYWFjg0qVLOHfuHADgwYMH6NWrF44dO4amTZsWWufJkyexYMECZGZmokqVKvDz84OzszMeP36Mf//9V63sjh07MGzYMGRmZgIArK2t4evrC29vb5iYmODGjRs4deoUsrKycPr0abRt2xZnz56Fq6urxvcODQ1F7969kZycLM9r2bIlGjdujIyMDJw+fRq3b9/G/Pnz4ejoWJRdptX27dsxcuRIeVsAoG7dumjWrBns7e2RmJiIy5cv4/Lly8jJyUFaWppcrnXr1pg4cSIePHiAXbt2AQA8PDzw6quv5nufKlWq5JsXFRWFrl274urVq/K8hg0bokmTJqhcuTIeP36Mv//+G0+fPkV8fDxef/11bNmyBcOGDdO4LZmZmejbty+OHz8uz3Nzc4Ofnx9sbW1x69YtnDhxAidOnMCrr76KWrVq6b2/tNm1axfeeust+W87Ozu0bdsW1atXh5mZGRISEnDjxg2EhYUhIyNDsffV1eXLl9GjRw88evRInle1alW0a9cOLi4uSEtLw+3bt/Hvv//i2bNnap+zquzsbAwePBi//fabPM/CwgJt27aFt7c3zM3NERUVhdDQUDx69Ag5OTlat1fJ42jatGlYv369/He1atXQunVruLi4ICcnB0+fPsWVK1dw/fp1rfvo3LlzGDRokNyiqxqPpaUlEhMTcfv2bVy6dAmpqakF7O2i+f333xEUFCTH36FDB1SuXBk3btzAP//8g5ycHMTFxWHQoEHYs2cPevbsWWidt27dQlBQEBISEmBraws/Pz94eHggLi5O7TgBgBUrVmDatGny35aWlujUqRO8vLwQFxeHI0eOIDY2FtnZ2Vi5ciXu37+PX375pcCO0nPNmDFD/nxefPFFNG3aFEIIhIaGyi2AV69eRdeuXXHq1Cl4enpqrOfhw4fIzs4GANSqVQv169eHi4sLrKysEB8fj0uXLuHy5csAgMOHD6N79+44ffo0LC0tC40xISEBvXv3Rnh4OCwtLdG5c2d4enri6dOnOHLkiNy6+c033yAtLQ2bN28utE5D6t69OypXroxr164hODgYAODj44Nu3brlK1unTh0AgJmZGcaMGYMlS5YAADZs2ID27dsX+D7Z2dlqrYXjxo1TaAsUUNqZJRUPVP77sLCwEFZWVuKHH37IV+7EiROiWrVqctnGjRuLjIwMjXWqto6YmZkJSZLEhx9+mK98WlqaPB0WFia3ykiSJN5///18//UKIcTt27dFhw4d5Pp79+6tMYb09HS1/xA9PT01tjR+//33wtLSUlhYWKjtC210+W/w/PnzwsrKSi7XrFkzcfr0aY1lHz16JJYvXy6WLl2ab9mRI0fy/WdYmOzsbNGlSxd5vdatW4vz58/nK/fs2TOxYMECIUmSACBsbGzEnTt3NNa5aNEiuT5JksRHH32U7z/r69eviyZNmsjfo9zyxW2xa9q0qVxXYGCgSElJ0VguKSlJ/Pzzz2otn6oM0WKXkJAg6tSpI5dzdnYWW7duFTk5OfnKJicnix9//FGMGTNGY10zZsxQ+/4FBgZqbRU5c+aMGDlypAgLC8u3TMnjKCYmRpiZmcmtSZs2bdK4bUII8fDhQ7Fq1Srx7bff5ls2YMAA+X0GDhwoYmNjNdbx7NkzsXfvXvHWW29pXK4P1ePUwsJCmJiYiE8//VRkZ2erlbt8+bJo2LChXNbNzU1rfKotObn7ZeLEiSIpKUmtXEZGhvw+//zzj1pLWO/evUVUVJRa+bS0NDFt2jS1z//TTz/VGINqq5W5ubkAIKpUqSIOHjyYr+zu3buFnZ2dXL5nz55a99eGDRvEl19+WWDr7X///Sdatmwp1/fhhx9qLat6/OSeD3r06CEePXqkVi41NVVMmDBBbdu3bt1a6LYbssUu18aNG+Uyo0aN0vp+ue7cuaN2Pk1MTCyw/N69e9W2J+93szQxsSvnVA8oAGL79u1ay4aFhaldztiwYYPGcqo/ogDE4sWLC42ja9eucvnPPvuswLLJycmiQYMGcnlNSdP69evl5VZWVuLq1ata6/vhhx/y7QdtdDlptG/fXi7TsmXLfCd+XRUlsdu8ebO8jq+vr0hNTS2wvOoJ+O233863PD4+Xu3S4IIFC7TW9fjxY+Hu7q62H4uT2CUlJakl5tqSCl0YIrFTvYxib28vrl27VqTYrl+/rnb7w5IlS4pUjxDKHkd79uyRlw0bNqzIMVWpUkUAEJaWlkU+FvSlepwCEJ988onWso8ePRLOzs5y2blz52osl/cS3bhx4wqNw8/PTy7frl07kZ6errXsu+++K5e1s7PTmBioJjfA80vy//zzj9Y6//zzT7XywcHBhcZckPj4ePmSo7u7u9ZLp3lvJ2natKl49uyZ1nqHDx8ul/X29taY5JT1xE4IoXZLxjfffFNg2ddee00um3s7UFnBxK6cUz34OnbsWGj5qVOnqiUOmqj+iHp4eIjMzMwC67xw4YJcvlmzZjr9gG/btk1eZ9KkSfmWt27dWl4+bdq0Qutr166dIond6dOn5eWSJBV4H1RhipLYqbZwXbhwodDyz549Ew4ODnJykveEumbNGrm+6tWrF/jDJIR6Ql3cxO7BgwdqPwzFoXRil5aWJu83AGLt2rVFju3tt99WO6aKmsAqfRz9+OOP8rKgoKAixSSEkFuWHB0di1yHvlSP05o1axZ6Dlq1apXaOUvTvlNNBqysrLS27OW6cuWK2rGgqeVcVXJyslqCuW7dunxl8iZ2I0aMKLBOIdQTCH9//0LLF+add96R67t48aLGMnkTu8ISysePH6s1Ghw4cCBfmfKQ2P3888+F/j4K8Xx7c48LExMTERERoVP9JYVPxRqRkSNHFlpm1KhR8vTZs2cLfAoOAAYNGgQzs4Jvxdy3b588/cYbb+h0b0nXrl3l6RMnTqgtS0pKku8JBPTfruI4cOCAPN2tWzc0aNBAkXp18ejRI1y4cAEA0KBBAzRp0qTQdaysrNC2bVsAz++FCQsLU1t+5MgReXrIkCGwsLAosD5/f/9Cy+jK2dkZVlZWAICwsDD8888/itSrhNOnT8v3Btna2hbr+6P6nQkMDNTp+6+J0seR6v1YO3fuxOPHj4sUV249cXFx+Omnn4pUR3EMHTq00HPQ8OHDYWpqCuD5/WYF3TMIAC+99FKh9+WqHjtNmzZFs2bNCixvY2ODN954Q+P62uh7btOlzsePH2P37t1YunQpZs6ciUmTJiEwMFB+qZ5bc883BalevbraE/6auLi4oE+fPnrFWRYNGDAAVatWBfD8HKHtSefNmzfL98D27NkT1atXL7EYdcGHJ4xI7g98QRo3bozKlSsjOTkZ2dnZuHjxYoHrtWjRotA6T506JU8fOXIE9+7dK3QdodJNQ0REhNqyixcvIicnB8DzH92GDRsWWp8u266L06dPy9OFncyUprofnz17hsDAQJ3Wu337tjwdERGBF198Uf5b9QEXXfaRra0tGjVqhPPnz+v03gWxsLDAgAEDsH37dmRlZaFr164YMmQIBg0aBD8/P63d5ZQE1c/Z19cX1tbWRaonOjpareuS4nxnlD6OfH194enpiYiICNy/fx8NGzbEmDFj0K9fP/nBKl28/vrr+OSTTwA8Tzh/+uknDBkyBF26dJF/BA1Jl++to6Mj6tWrJ/8Q//vvvwV2W6HLeU312GnXrp0OkQLt27fHl19+CQCFHkOSJKFNmzaF1qm6/dHR0Xj06BHc3d3zlbty5QpmzJiB/fv3yw9SFEaX7jl8fX11+iejbdu28sNDeR+sKy/Mzc0xevRoLFu2DMDzhyg+/fTTfOU2bNggT5ephyb+h4mdEfHy8iq0jCRJqF69Oq5duwYAePLkSYHlXVxcCq3z4cOH8vT+/fsLLZ9X3r7YVGPy9PTU6aSiy7brIjo6Wp5W8ulQXajux/DwcKxevVrvOgral7ruIy8vL0USOwD4/PPPERoaips3byIjIwNbtmzBli1bYGJigoYNG6Jjx47o0aMHevfurdMTekpR6nNWrcfS0hIeHh5Frkvp48jc3BxbtmzByy+/jOTkZMTExGD58uVYvnw5rKys0LJlS/j5+aFPnz5o166d1uNszpw5OHr0KE6fPg0hBH777Tf5B7xOnTro2LEjunXrhn79+sHW1lbvuAujz/c2N7FT4rymWkeNGjV0ikG1f7bCkiZHR0ed9lfu0625T2Q/efIkX2J38OBB9O/fX+c+73IlJSUVWkaf/Z+rsP1flo0fPx7Lly+HEAJbtmzBJ598AnNzc3n5qVOn5B4LXF1d0a9fv9IKVSteijUilSpV0qmcjY2NPF3Yga1LS0ZCQoJO76tN3v8uVbs3Kco2FYfq/qhcubIideqquPsRQL5OhktzXwLPu1U5d+4c5syZo9YdR05ODi5duoQ1a9bg1Vdfhbu7Oz755BOdWxqKS6nPWcnvi9LHEQB06tQJ//33H0aOHKl2LKelpeHEiRP4+OOP0aFDB/j4+Mhd8+RlY2ODY8eOYfny5fk6lr158ya+++47DBs2DG5ubpg+fbpOnTjro7TOa6rHjq7HhD4x6LpdhdX75MkTDBkyRE7qatSogSVLluDEiRN4+PAhUlNTkZOTA/H8nnrMnz9fXjf3yogSceqz7WXZCy+8ILe8P3nyBLt371ZbrtpaN3LkSLWkr6xgYmdEdO1DSvW+OiX+w1Y9oHfu3CmfQPR5qVL9gSzKNhWH6v5QPbGXBNX9+MorrxRpP44ePVqtztLcl7ns7Ozw4Ycf4sGDBzh9+jSWL1+OAQMGwNnZWS4TFxeHWbNmYeDAgYoMFF7YD5ZSn7OS3xelj6NctWrVwvfff48nT57gwIEDmDNnDrp06aKW3Ny4cQOvvvoqPvvsM411WFhY4P3338edO3dw4cIFrFq1Cv7+/qhWrZpcJjU1FcuXL0eXLl0UTe5K67ymeuzoekzoE4M+ff4VVO8333wj/1PQpEkTXLx4ETNnzkT79u3h7u4Oa2trtdZYfZOu0tr/pWn8+PHytGoil5ycrHafaVm8DAswsTMq9+/fL7SMEAIPHjyQ/1b9cS0q1ZYYXYb2KYzqZZLIyEidfujz3l9UVKrbosTQSEV9byX2I6C+L3X5fgDK7cu8TE1N0aZNG7z//vv47bffEB0djb///huvvPKKXOb333/Hr7/+mm9d1f+KdRn6rLDWL6U+Z9V60tPT1To6Lk5dSn3+qmxsbNCzZ098+OGHOHz4MJ4+fYodO3agcePGcplZs2apnR/ykiQJTZo0waRJk7Bt2zZERkbi/PnzasM3nTlzpki3EWhTlO+tEue1ohw7qvdbFhZDXFycTv8MxMTEqHWMnbfe3E54geeXze3s7AqsT5d7N1WV1v4vTa+99pq8DQcPHkRkZCQA4Oeff5Y/s44dO6Ju3bqlFmNBmNgZEdUbwrUJCwuT/2MzNTXV6cnLwqjeAKzEk48vvvgiTEyefzUTExN1GoNR9cbz4vD19ZWnDx8+XKy69H06UnU/XrhwQZGWM9Un+XT5fiQnJ+d7stZQTExM0KFDB+zatQs9evSQ5+e99AFA7cfq6dOnhdZ96dKlAperfs6nTp0qcguTq6ur2uXJ4nxnlD6OCmNtbY1Bgwbh6NGjclKZkZGh93iizZo1w3fffafWeqHpMywqXb638fHx8n3DANC8efNiv6/qsXPy5Emd1lEtV1gMQgicOXOm0DpVz22urq757uNUvTdTNUnXJDs7W+/vli4xAupxKrH/i6uoT6cDz1uoc59GzsnJkUeYUG29Gzt2bLHiMyQmdkbkhx9+KLSM6nAvrVq1UuR+qpdfflme3rlzp9oN5UVha2uLli1byn9v2bKl0HWUGsamd+/e8nRwcLDasF76yu3qA4Da0GTa5A4FBDz/gVU9iRSV6lOaP/30U6Fx/PTTT3rfgF1ckiSp3YCs6fujmjwV1kXDw4cP83X9kZevr6/c3UVSUlKxvj+q35nVq1cX+VKy0seRrpycnNSGTyrq+6q2vCoZ+7Zt2wq99/LHH3+Uy7i7u6NevXrFfl/VrmT+/fdfXLx4scDyqamp2L59u8b1tdH33Kbpqevcf4JzYyjIrl279G4NjoiIwNGjRwssExMTo9ZdT0n3KKCJvuffvAICAuTpjRs34sqVK3Libm9vj8GDBxc/SANhYmdEjh49il9++UXr8qtXr+Krr76S/1bq/oDWrVujc+fOAJ530zFixAidx/3MyMjI9zRf3thWrVqFGzduaK1j+/bthf6Q66p169byj5wQAiNHjizyvVOq48AWdHlL1YwZM+TpOXPmFNrypErTCXvo0KHyzc8RERFYunSp1vWfPn2KefPm6fx+hUlKStL5e6B6GUdTFxqqrVnbtm0rMPmcMmVKoSdyS0tLTJgwQf57xowZhfZ9pk1QUJD843rq1KkC93FBlD6OdGnZzKVt/6enp+v8/S/sMyyq27dv4/PPP9e6PDo6GosWLZL/Hjt2bLFaa3L5+PjAz89P/jswMLDA79WcOXPkvgLt7OwwdOjQQt/jhx9+KLBF7MiRI2q3Jmg6Z6s+1V1QS+mTJ08wZcqUQmPS5P333y/wmHv//ffly8U1atRQa4EvLUU5/6qqW7cuOnXqBAC4c+cO3nzzTXnZG2+8odfDLyVO4Q6PqYRBpXdwCwsLYW1trXGsvpMnTwpPT0+5bMOGDbWOQqBvL/9CCHHp0iVRuXJleb02bdpoHV9ViOfDMC1atEi4u7uLPXv25FuelpYm6tWrJ9fn5eWlsb4ffvhBWFlZKTpWbGhoqFov6rqMFbts2bJ8y7KystSG8woJCdEal+o6qsNK2dnZiXXr1mn9rBISEsQPP/wgOnXqJAYNGqSxzIIFC9RG0/jkk0/yDSV048YN0axZM/l7lFu+OCNPHDlyRLi7u4v58+drHcEjKytLbN++XW1s3h9//DFfuZSUFGFrayuXGT58eL7h1p4+fSpGjBghAKh9fgWNFVu7dm25nLOzs9i2bZvGUQtSUlLE1q1btY4Vm3es0MDAQPH06VONZc+cOSNGjRqlcaxYJY+j+fPniyZNmog1a9bkG+MzV1JSkpg9e7b8fqampuL+/fvy8vDwcOHg4CDee+89cfbsWa1xHDp0SG3UhY8++khrWV1oGit25cqV+UZWuXLlimjcuLFc1tXVVet+12W0grzyjhXbr18/ER0drVYmPT1dzJw5U+3z12esWGdnZ/Hnn3/mK/vHH38Ie3t7uXyPHj001vn111/LZSwtLcWWLVvylQkNDZXH3raxsSn02NA0VmyvXr3yjZP77NkzMWnSJLVt1zRWed5tL4mRJx49eiSXsbKyEvfu3dP6ntpoGq4SgDh37pzedZUkJnblnOqXbeXKlfJ0nTp1xPDhw8WYMWNEq1at1MpVrly5wC9mURI7IZ6PTamayAAQtWvXFoMHDxZvvfWWGDVqlOjdu7eoVq2aWhlNiZ0QQoSEhKidhACI1q1bizfffFMMHz5cvPDCC/J81SGFipvYCfH8gM4dKDz3Va9ePeHv7y/eeust4e/vL1588UV5jNDJkydrrGfo0KHy+pUqVRKvvfaaCAoKEu+995547733NP4AxsTEyEmWaoLXs2dP8eabb4rx48eLQYMGicaNG6vFOHDgQI0xpKenq41/CzwfJ9Lf31+MGzdOdO7cWf7xatOmjVrMxU3sVN/Tzc1N9OrVS4wePVqMGzdO9OvXT3h4eKiV6dixo9bBtJctW6ZWtmrVqmLIkCFi/PjxolevXvJ3r1GjRuK9994r9MdLiOcDo1etWlWtXldXV/Hqq6+KgIAAMXLkSNG+fXthbW0tAIgmTZporCczM1P069dPrR4LCwvRqVMneXtffvlltbF4//33X411KXUcqf44S5IkXnjhBTFgwAAxbtw4MWrUKPHSSy+pJZEAxAcffKBWR94hsJycnES3bt3EyJEjRUBAgBgwYICoVauWWpm6deuK5ORkrftcF6rHqep5rXr16vL31s/PT22MXjMzM7F3716tdRYlsRNCiOXLl6ttn6WlpejVq5d8HOaOpZv7evXVV7UOB5c3uQkKCpL/btKkiRg1apQYOXKkaNiwYb7j9e7duxrrTEtLE3Xr1lUrX79+feHv7y9Gjx4tWrZsqfYe06dP1yuxmzx5svD29pYTpNxtf+2114Sjo6Pa+w4dOlTrfizpxE4I9aEmHRwchL+/v5gyZYp8/l2zZo3WdYV4vm+dnJzUtrG4wyOWBCZ25VzeZGbu3LlCkiS1+aovDw8PceLEiQLrLGpiJ8Tz8S5btGih9f3zvry9vbX+wAkhxLFjx+RBqzW9TExM5JNT3n2hia6JnRBCBAcHi5o1a+q0HXl/EHPdvXu3wPi1neBSU1PF22+/nS+51PaytrYWH3/8sdZtSUhIEL169Sqwjnbt2omHDx8W+Qcwr9OnT+scPwAxaNAgjQOn58rOzhbjxo0rsA5fX18RGRlZ6Fixqu7evas22HtBr/bt2xcY3+zZs9VaC7W9TE1NxdWrV7XWpcRxtGLFCp3Xt7Cw0DiQeWRkpE7bk/vq3Lmz1tZBfeQ9TteuXZuvVV715eDgIHbu3FlgncX5Xn/77bfCzs6u0M908uTJ+VrDVeVNbjIyMsTYsWMLrLdevXoFfleEeN5ymzfB1vTd1fXYyFvm6tWraldQNL3efPPNAsf0LY3E7uzZs2ot/XlfuozhrZp8AxBfffVVoeuUNiZ25ZzqFy7XqVOnxJgxY8QLL7wgKlWqJOzt7UWLFi3ERx99JOLj4wutsziJXa6DBw+Kd955R7z44ovC2dlZmJmZCRsbG+Ht7S169uwp5s2bJ/755x+dBjqPi4sTixcvFs2bNxf29vaiUqVK4oUXXhBvvvmmOHPmTIH7Ii99EjshhMjIyBCbN28Wr7/+uqhVq5aoXLmyMDc3F87OzsLX11dMmTJFHD9+vMA6oqOjxdy5c0WbNm2Eo6OjWrJT0AlOiOcnww8//FB06dJFVKtWTb7s7OLiItq0aSMCAgLETz/9JBISEgrdFiGE+PXXX0W/fv2Em5ubsLCwEB4eHqJbt27iu+++ExkZGUKI4v0A5hUbGyt+/vln8e6774qOHTsKDw8PYWlpKczMzISTk5No1aqVmDRpktrnWJi9e/eK/v37Czc3N2Fubi7c3NxEly5dxIYNG+Rt0Cexy/XXX3+Jt956SzRo0EA4OjoKU1NTYWdnJxo3bixGjx4tduzYofWSuKr79++LRYsWiY4dOwp3d3dhbm4urK2tRY0aNUSfPn3Ep59+KiIjI3WKqbjHUXh4uFi/fr0YPXq0aNGihahSpYowNzcXlpaWwtXVVXTu3FksWrRIa2uQEM8Ht9+9e7eYNm2a6Nq1q/Dy8hLW1tbC1NRUODg4iCZNmohx48ZpvJxYVJqO07CwMBEYGCh8fHxE5cqVReXKlUWjRo3ErFmzxMOHDwuts7jf6ydPnoiPP/5YdOzYUbi6ugpzc3Ph5OQkmjRpIt577z2ttxuo0pbcHDhwQAwePFh4e3sLS0tL4eTkJNq3by9WrVol0tLSdIovISFBfPzxx6Jly5bC1tZWWFpaiho1aoiXX35ZbN26VU44i5LYCSFEYmKiWLlypWjXrp2oWrWqsLCwEJ6ensLf318cPny4yNuel5KJXe77Tp06VTRr1kzY29urXVrXJbE7fvy4XN7a2lrExcUVuk5pk4RQoDdQKjWqNwnzoyQiY+Dt7S33txYeHp5vxAuikrJw4UIsWLAAADB8+HCdnmQubXwqloiIiCgPIYTchx2gPiJFWcbEjoiIiCiP33//XR5NpEGDBmrd35RlTOyIiIiIVMTGxmL69Ony30FBQaUXjJ7MSjsAIiIiotK2aNEixMbGIiYmBvv370dsbCwAoF69ehg9enTpBqcHJnZERERU4X333XfyQzu5KlWqhC1btsDc3LyUotIfL8USERER/Y8kSXBxccHrr7+OkJAQtGrVqrRD0gu7OyEiIiIyEmyxIyIiIjISTOyIiIiIjAQTOyIiIiIjwcSOiIiIyEgwsSMiIiIyEkzsiIiIiIwEEzsiIiIiI8HEjoiIiMhI/B+0TEt4Gi3KzAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for ablation in ablations:\n",
    "    hint_model_path = \"save_model/\" + ablation[\"name\"] + \".ckpt\"\n",
    "    print(f\"Running ablation {ablation['name']}...\")\n",
    "    \n",
    "    if not os.path.exists(hint_model_path):\n",
    "        model = HINTModel(molecule_encoder = mpnn_model, \n",
    "                 disease_encoder = gram_model, \n",
    "                 protocol_encoder = protocol_model,\n",
    "                 device = device, \n",
    "                 global_embed_size = 50, \n",
    "                 highway_num_layer = 2,\n",
    "                 prefix_name = model_name, \n",
    "                 gnn_hidden_size = 50,  \n",
    "                 epoch = 3,\n",
    "                 lr = 1e-3, \n",
    "                 weight_decay = 0,\n",
    "                 ablations=ablation\n",
    "                )\n",
    "        model.init_pretrain(admet_model)\n",
    "        model.learn(train_loader, valid_loader, test_loader)\n",
    "        model.bootstrap_test(test_loader, sample_num = 50)\n",
    "        torch.save(model, hint_model_path)\n",
    "    else:\n",
    "        model = torch.load(hint_model_path)\n",
    "        nctid_all, predict_all = model.bootstrap_test(test_loader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counter({1: 996, 0: 150})\n"
     ]
    }
   ],
   "source": [
    "from collections import Counter\n",
    "predictions = [0 if pred < 0.5 else 1 for pred in predict_all]\n",
    "prediction_counts = Counter(predictions)\n",
    "\n",
    "print(prediction_counts)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}