[bc9e98]: / UQ_on_HINT.ipynb

Download this file

913 lines (912 with data), 155.3 kB

{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "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_encode import Protocol_Embedding\n",
    "from HINT.model import HINTModel \n",
    "device = torch.device(\"cuda:0\")  # cuda:0\n",
    "if not os.path.exists(\"figure\"):\n",
    "\tos.makedirs(\"figure\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# choose the phase to be explored\n",
    "base_name  = 'phase_I' # 'phase_I', 'phase_II', 'phase_III'\n",
    "datafolder = \"data\"\n",
    "train_file = os.path.join(datafolder, base_name + '_train.csv')\n",
    "valid_file = os.path.join(datafolder, base_name + '_valid.csv')\n",
    "test_file  = os.path.join(datafolder, base_name + '_test.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "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": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_loader = csv_three_feature_2_dataloader(train_file, shuffle=True, batch_size=64) \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": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "icdcode2ancestor_dict = build_icdcode2ancestor_dict()\n",
    "gram_model = GRAM(embedding_dim = 50, icdcode2ancestor = icdcode2ancestor_dict, device = device)\n",
    "protocol_model = Protocol_Embedding(output_dim = 50, highway_num=3, device = device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "PR-AUC   mean: 0.5738 std: 0.0158\n",
      "F1       mean: 0.5923 std: 0.0184\n",
      "ROC-AUC  mean: 0.5729 std: 0.0262\n",
      "NCT01288573 1 0.3920\n",
      "NCT01558674 0 0.5373\n",
      "NCT01609816 0 0.5609\n",
      "NCT01836289 0 0.5322\n",
      "NCT01852890 1 0.2230\n",
      "NCT01889420 0 0.6710\n",
      "NCT01933594 1 0.4409\n",
      "NCT01965600 0 0.6439\n",
      "NCT01966731 1 0.3307\n",
      "NCT01981499 0 0.6297\n",
      "NCT01988493 1 0.3146\n",
      "NCT02023424 0 0.5840\n",
      "NCT02030483 0 0.6740\n",
      "NCT02034292 0 0.6772\n",
      "NCT02037230 1 0.3541\n",
      "NCT02040870 1 0.2827\n",
      "NCT02041481 1 0.4579\n",
      "NCT02043860 0 0.6732\n",
      "NCT02044796 1 0.4635\n",
      "NCT02054442 1 0.3160\n",
      "NCT02055690 0 0.5551\n",
      "NCT02055924 0 0.5995\n",
      "NCT02058407 0 0.6758\n",
      "NCT02061449 0 0.5994\n",
      "NCT02064608 1 0.3907\n",
      "NCT02071537 0 0.5654\n",
      "NCT02073123 1 0.3866\n",
      "NCT02074839 1 0.3136\n",
      "NCT02074878 0 0.5157\n",
      "NCT02078089 0 0.5596\n",
      "NCT02078648 1 0.4167\n",
      "NCT02078960 0 0.5228\n",
      "NCT02080416 0 0.5964\n",
      "NCT02083926 1 0.4553\n",
      "NCT02092363 0 0.5880\n",
      "NCT02098629 0 0.5295\n",
      "NCT02103335 1 0.4933\n",
      "NCT02106897 1 0.4673\n",
      "NCT02109224 0 0.5625\n",
      "NCT02109341 1 0.2147\n",
      "NCT02110992 0 0.5312\n",
      "NCT02116010 0 0.6355\n",
      "NCT02116959 0 0.6746\n",
      "NCT02120339 0 0.5137\n",
      "NCT02120911 1 0.3677\n",
      "NCT02123823 0 0.5576\n",
      "NCT02133742 1 0.3398\n",
      "NCT02135640 1 0.4724\n",
      "NCT02137642 0 0.5362\n",
      "NCT02138383 1 0.2183\n",
      "NCT02138526 0 0.5531\n",
      "NCT02141828 1 0.4563\n",
      "NCT02142803 1 0.4447\n",
      "NCT02146222 1 0.4911\n",
      "NCT02154646 1 0.2204\n",
      "NCT02154776 0 0.5154\n",
      "NCT02155465 1 0.2822\n",
      "NCT02160015 0 0.5374\n",
      "NCT02166229 0 0.5326\n",
      "NCT02168270 0 0.5192\n",
      "NCT02168907 0 0.5662\n",
      "NCT02174822 1 0.4412\n",
      "NCT02176486 0 0.6554\n",
      "NCT02181660 1 0.4325\n",
      "NCT02186834 0 0.6739\n",
      "NCT02187094 0 0.6374\n",
      "NCT02189109 1 0.3980\n",
      "NCT02192697 1 0.2834\n",
      "NCT02195869 1 0.4357\n",
      "NCT02195973 1 0.4339\n",
      "NCT02200848 0 0.5808\n",
      "NCT02202993 1 0.4000\n",
      "NCT02205398 0 0.5561\n",
      "NCT02205554 1 0.4739\n",
      "NCT02209506 0 0.5479\n",
      "NCT02210182 1 0.3149\n",
      "NCT02219516 1 0.4905\n",
      "NCT02219789 1 0.4702\n",
      "NCT02221765 0 0.6173\n",
      "NCT02222441 0 0.6469\n",
      "NCT02224599 0 0.5035\n",
      "NCT02227329 0 0.6376\n",
      "NCT02229981 0 0.6187\n",
      "NCT02231658 0 0.6587\n",
      "NCT02232152 1 0.4670\n",
      "NCT02240355 0 0.6446\n",
      "NCT02244502 1 0.3466\n",
      "NCT02250118 0 0.5376\n",
      "NCT02253212 1 0.3927\n",
      "NCT02253277 0 0.5207\n",
      "NCT02254161 0 0.6442\n",
      "NCT02257177 1 0.3751\n",
      "NCT02269085 0 0.5992\n",
      "NCT02275039 1 0.3876\n",
      "NCT02275416 1 0.4859\n",
      "NCT02277197 1 0.3166\n",
      "NCT02283372 1 0.2221\n",
      "NCT02288507 0 0.6084\n",
      "NCT02291133 1 0.4017\n",
      "NCT02292173 1 0.4380\n",
      "NCT02292550 1 0.2827\n",
      "NCT02296242 1 0.3964\n",
      "NCT02299505 1 0.2827\n",
      "NCT02299518 1 0.4575\n",
      "NCT02300298 1 0.4325\n",
      "NCT02300610 1 0.4452\n",
      "NCT02300727 0 0.5494\n",
      "NCT02301104 0 0.6698\n",
      "NCT02303912 1 0.4646\n",
      "NCT02306291 1 0.4357\n",
      "NCT02309580 0 0.5995\n",
      "NCT02312102 1 0.3848\n",
      "NCT02336048 0 0.5529\n",
      "NCT02337543 1 0.4264\n",
      "NCT02339168 1 0.3871\n",
      "NCT02339324 1 0.3781\n",
      "NCT02365532 1 0.4986\n",
      "NCT02372240 0 0.6728\n",
      "NCT02373072 1 0.4338\n",
      "NCT02374047 1 0.4401\n",
      "NCT02379195 1 0.3756\n",
      "NCT02379910 1 0.2426\n",
      "NCT02382666 1 0.2233\n",
      "NCT02383511 1 0.4660\n",
      "NCT02384746 0 0.5159\n",
      "NCT02392039 0 0.6005\n",
      "NCT02393755 1 0.4271\n",
      "NCT02403271 1 0.4006\n",
      "NCT02406521 1 0.3127\n",
      "NCT02407080 1 0.2624\n",
      "NCT02411565 0 0.5573\n",
      "NCT02414503 1 0.4289\n",
      "NCT02422381 1 0.4450\n",
      "NCT02439216 1 0.4676\n",
      "NCT02442960 0 0.5213\n",
      "NCT02446964 1 0.4472\n",
      "NCT02457286 0 0.5141\n",
      "NCT02472795 1 0.4670\n",
      "NCT02481180 0 0.6779\n",
      "NCT02483871 0 0.5161\n",
      "NCT02487459 0 0.6245\n",
      "NCT02493751 1 0.1558\n",
      "NCT02499770 1 0.2826\n",
      "NCT02508246 1 0.3228\n",
      "NCT02514447 1 0.2827\n",
      "NCT02515669 1 0.4214\n",
      "NCT02529072 0 0.5394\n",
      "NCT02530476 1 0.4326\n",
      "NCT02535104 1 0.4703\n",
      "NCT02538510 1 0.3262\n",
      "NCT02543931 0 0.6765\n",
      "NCT02548468 0 0.5206\n",
      "NCT02550743 0 0.5708\n",
      "NCT02555007 1 0.2839\n",
      "NCT02565628 0 0.6793\n",
      "NCT02568683 0 0.5993\n",
      "NCT02572687 1 0.3763\n",
      "NCT02582840 0 0.6469\n",
      "NCT02583373 1 0.4787\n",
      "NCT02589145 0 0.6021\n",
      "NCT02595437 1 0.4635\n",
      "NCT02596399 1 0.4573\n",
      "NCT02597400 0 0.6915\n",
      "NCT02603952 1 0.4799\n",
      "NCT02604719 1 0.4139\n",
      "NCT02608437 1 0.3792\n",
      "NCT02611908 0 0.5532\n",
      "NCT02613221 0 0.5572\n",
      "NCT02614586 0 0.5877\n",
      "NCT02620423 1 0.3524\n",
      "NCT02624089 0 0.5365\n",
      "NCT02630368 0 0.5141\n",
      "NCT02630823 1 0.4564\n",
      "NCT02636426 0 0.5552\n",
      "NCT02639117 1 0.4377\n",
      "NCT02642965 1 0.4758\n",
      "NCT02647086 1 0.2418\n",
      "NCT02647281 1 0.4823\n",
      "NCT02649686 0 0.5376\n",
      "NCT02655952 1 0.4523\n",
      "NCT02658084 0 0.5258\n",
      "NCT02678923 0 0.6776\n",
      "NCT02683148 0 0.6621\n",
      "NCT02691871 1 0.4450\n",
      "NCT02697383 0 0.6103\n",
      "NCT02697851 0 0.6370\n",
      "NCT02704702 1 0.4082\n",
      "NCT02708680 0 0.5161\n",
      "NCT02709850 1 0.4319\n",
      "NCT02711462 0 0.6443\n",
      "NCT02716012 1 0.3569\n",
      "NCT02716805 0 0.6729\n",
      "NCT02727283 1 0.4433\n",
      "NCT02727777 0 0.5986\n",
      "NCT02729194 1 0.3131\n",
      "NCT02734160 1 0.2204\n",
      "NCT02739009 1 0.4063\n",
      "NCT02740712 0 0.5567\n",
      "NCT02743546 0 0.5913\n",
      "NCT02743780 0 0.6156\n",
      "NCT02744456 1 0.4079\n",
      "NCT02757521 0 0.5546\n",
      "NCT02762474 1 0.4418\n",
      "NCT02762617 0 0.6337\n",
      "NCT02775812 1 0.3166\n",
      "NCT02780804 1 0.4885\n",
      "NCT02800889 0 0.5982\n",
      "NCT02806817 1 0.4151\n",
      "NCT02809183 1 0.4643\n",
      "NCT02815488 0 0.6420\n",
      "NCT02815540 0 0.5054\n",
      "NCT02824055 0 0.5880\n",
      "NCT02826798 1 0.4482\n",
      "NCT02830542 1 0.4992\n",
      "NCT02834247 0 0.6281\n",
      "NCT02835833 1 0.3489\n",
      "NCT02845050 0 0.5598\n",
      "NCT02856750 0 0.5486\n",
      "NCT02864264 0 0.5229\n",
      "NCT02875678 0 0.6009\n",
      "NCT02886559 1 0.4687\n",
      "NCT02888665 1 0.4136\n",
      "NCT02909452 1 0.4482\n",
      "NCT02911597 1 0.3027\n",
      "NCT02912234 1 0.4516\n",
      "NCT02914327 0 0.5563\n",
      "NCT02915523 0 0.5447\n",
      "NCT02936206 0 0.5158\n",
      "NCT02938273 1 0.3168\n",
      "NCT02957630 1 0.4479\n",
      "NCT02958982 0 0.6677\n",
      "NCT02959619 1 0.2832\n",
      "NCT02963376 1 0.4668\n",
      "NCT02964377 1 0.4683\n",
      "NCT02966730 0 0.5995\n",
      "NCT02967731 1 0.3315\n",
      "NCT02973399 0 0.5563\n",
      "NCT02975557 0 0.5362\n",
      "NCT02985554 0 0.6401\n",
      "NCT02993471 0 0.5331\n",
      "NCT02994953 0 0.6697\n",
      "NCT03004846 0 0.5334\n",
      "NCT03014219 0 0.6465\n",
      "NCT03023527 0 0.6729\n",
      "NCT03025009 0 0.6494\n",
      "NCT03031691 0 0.5565\n",
      "NCT03054207 0 0.6375\n",
      "NCT03057509 0 0.6196\n",
      "NCT03059693 1 0.2433\n",
      "NCT03092076 0 0.6439\n",
      "NCT03106610 0 0.5821\n",
      "NCT03121716 1 0.3677\n",
      "NCT03122678 0 0.5203\n",
      "NCT03132584 0 0.5958\n",
      "NCT03135028 0 0.5243\n",
      "NCT03135899 0 0.6677\n",
      "NCT03136627 1 0.3261\n",
      "NCT03139981 1 0.2433\n",
      "NCT03140072 0 0.6678\n",
      "NCT03145948 0 0.5333\n",
      "NCT03179501 0 0.6064\n",
      "NCT03192709 1 0.3677\n",
      "NCT03248713 0 0.5377\n",
      "NCT03263533 0 0.5847\n",
      "NCT03303911 0 0.5427\n",
      "NCT03349346 0 0.5973\n",
      "NCT03369964 0 0.5987\n",
      "NCT03372603 0 0.5504\n",
      "NCT03383692 0 0.5792\n",
      "NCT03411421 0 0.6443\n",
      "NCT03422874 0 0.5725\n",
      "NCT03431610 1 0.2433\n",
      "NCT03445013 0 0.5334\n",
      "NCT03464864 1 0.4729\n",
      "NCT03558750 0 0.5997\n",
      "NCT03576508 1 0.4255\n",
      "NCT03591146 1 0.4373\n",
      "NCT03601819 0 0.5904\n",
      "NCT03605212 0 0.6719\n",
      "NCT03606707 1 0.4654\n",
      "NCT03687125 0 0.6717\n",
      "NCT03888534 0 0.5974\n",
      "NCT04042051 0 0.5249\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABmJElEQVR4nO3dd3QU1dsH8O+kbArphRRCCKAQeoeEEnoXQQEpIkUgogTpIlgooqAUEQUURBAQUBSxUDU0EQIYRAi9kxASSC+k575/8GZ+u2STbDazCdn9fs7ZcyYzd+48O7sz++TOzL2SEEKAiIiIiCo9s4oOgIiIiIiUwcSOiIiIyEgwsSMiIiIyEkzsiIiIiIwEEzsiIiIiI8HEjoiIiMhIMLEjIiIiMhJM7IiIiIiMhEVFB1DZ5OfnIzo6Gvb29pAkqaLDISIiIiMnhEBqaiq8vb1hZlZ8mxwTu1KKjo5G9erVKzoMIiIiMjGRkZHw8fEptgwTu1Kyt7cH8HjnOjg4VHA0REREZOxSUlJQvXp1OQcpDhO7Uiq4/Org4MDEjoiIiMqNLreA8eEJIiIiIiPBxI6IiIjISDCxIyIiIjISTOyIiIiIjAQTOyIiIiIjwcSOiIiIyEgwsSMiIiIyEkzsiIiIiIwEEzsiIiIiI8HEjoiIiMhIMLEjIiIiMhJGNVbsvHnzMH/+fI15devWxeXLlwEAmZmZmD59OrZv346srCz07NkTq1evhoeHR0WEi/z8fOTm5iI/P79Ctk9kLMzMzGBhYQEzM/6vSkSmzagSOwBo0KAB/vzzT/lvC4v/vcWpU6di9+7d2LFjBxwdHRESEoIXX3wRf//9d7nGmJycjJSUFDx69IhJHZFCzMzMYGtrCwcHBzg6OlZ0OEREFcLoEjsLCwt4enoWmp+cnIz169dj69at6NKlCwBgw4YNqFevHsLCwhAQEGDw2IQQiI2NRWJiImxtbeHm5gZra2uYmZlBkiSDb5/IGAkhkJ+fj8zMTKSlpSE6OhoZGRnw8PDgcUVEJsfoErtr167B29sb1tbWCAwMxKJFi+Dr64vw8HDk5OSgW7ducll/f3/4+vrixIkTRSZ2WVlZyMrKkv9OSUnRO7bExEQkJibC09MTzs7OetdDRIVVqVIFrq6uSExMRExMDFQqFVxcXCo6LCKicmVUiV2bNm2wceNG1K1bF/fv38f8+fPRoUMHREREyCd6JycnjXU8PDwQExNTZJ2LFi0qdN+ePoQQSEpKgr29PZM6IgNydnZGeno6kpKS4OzszFY7oqfc2rWG30ZwsOG38bQwqsSud+/e8nTjxo3Rpk0b1KhRAz/88ANsbGz0qnP27NmYNm2a/HdKSgqqV69e6npyc3ORlZUFd3d3veIgIt05OjoiKioKubm5sLS0rOhwiIjKjVE/Qubk5IQ6derg+vXr8PT0RHZ2NpKSkjTKxMbGar0nr4CVlRUcHBw0XvrIy8sDoPkwBxEZRsFxVnDcERGZCqNO7NLS0nDjxg14eXmhRYsWsLS0RGhoqLz8ypUruHv3LgIDA8stJl4WIjI8HmdEZKqMqvloxowZ6NevH2rUqIHo6GjMnTsX5ubmGDZsGBwdHTF27FhMmzYNLi4ucHBwwKRJkxAYGFguT8QSERERGZpRJXZRUVEYNmwY4uPj4e7ujvbt2yMsLEy+r+3TTz+FmZkZBg4cqNFBMREREZExMKrEbvv27cUut7a2xqpVq7Bq1apyioiIiIio/Bj1PXZEREREpoSJHREREZGRYGJHREREZCSM6h47Y1MevXE/DUypR3AiIiJDYosdERERkZFgYkdERERkJJjYERERERkJJnZkUh49eoSVK1eia9eu8PT0hEqlgp2dHWrUqIFWrVphypQp2L17t8Y6hw8fhiRJkCQJGzduLLb+efPmyWVv375dbNkzZ85g0qRJaNKkCVxcXGBpaQkXFxe0adMG06ZNw4kTJwy6/qlTpzBhwgTUq1cPjo6OsLa2hq+vLwYPHozffvut2HUB4NKlS5g8eTKaNm0KR0dHWFpaws3NDXXq1EHPnj3xySef4MqVK1rXTUhIwIcffoj27dvDzc0NlpaWcHR0RK1atdC2bVvMnj0bR48eLTEGIiLSxIcnyGRcv34dPXr0wK1btzTm5+TkID09HXfv3sU///yDzz77DDk5OfJA8krLyMjAhAkTsGnTpkLLEhMTcerUKZw6dQqffvophBCKr5+ZmYkJEybg22+/LbQsMjISkZGR+PHHH9G3b19s3boVDg4Ohcp99dVXCAkJQW5ursb8+Ph4xMfH49q1azhw4ADOnTuHLVu2aJQ5efIk+vbti/j4eI35KSkpSElJwa1bt3DixAls3rwZUVFRhbZNRERFY2JHJmPEiBFyUjdw4EAMHjwYPj4+sLW1RUJCAi5evIhDhw5h7969BoshJycHffr0weHDhwEAnp6eeP3119GuXTu4uLggNTUV58+fx969e7F//37F18/Ly0P//v1x4MABAED79u0xatQo1KxZE87Ozrh58yY2bdqE3377Dbt378bgwYOxd+9emJn9r3E/IiICEydORF5eHlxcXBAcHIyOHTvC3d0deXl5iI6ORnh4OPbs2QNJkjS2n52djcGDByM+Ph5mZmYYPXo0nnvuOXh5eUGlUuHhw4c4f/48/vzzT1y+fFmhvU5EZDqY2JFJuHnzJk6ePAkAmDx5MlasWFGoTNeuXTFp0iQkJCQYrLVu4cKFclLWuXNn7Nq1q1CLWFBQECZOnIi7d+8qvv6SJUtw4MABmJmZ4bvvvsPQoUM1ljdv3hyDBg3C8uXLMX36dBw4cADbtm3Dyy+/LJf54YcfkJeXBwAIDQ1F06ZNC21nwIAB+OCDDwq1yh07dgyRkZEAgGXLlmHKlCmF1u3ZsydmzJhRaF0iIioZ77EjkxATEyNPd+7cudiyLi4uBokhNTVVTijd3NywY8cOrZc5C/j6+iq6fkZGBpYuXQoACA4OLpTUqZs2bRpatGgBAFj7RIeKBfvSyclJa1KnztXVVeu6QMmfw5PrEhFRyZjYkUnw8fGRpzdu3IicnJxyj+HQoUNISUkBAIwdO7bUiUtZ1z9y5IjcCjZ8+PASy3fq1AkAEBYWJrfQAf/bl0lJSdixY0epYlD/HL7++mut9wASEZH+mNiRSfD19UXPnj0BALt27ULNmjUxefJk7Nq1q9xu0A8PD5enS2qtMsT6p06dkqeDgoLkp3eLei1btgzA4/viEhIS5HVHjBgBGxsbAMBLL72E9u3b4+OPP8axY8eQnp5ebAzt2rVD/fr1AQBffPEF6tSpg7fffht79+7FgwcPSv2eiIhIExM7Mhnfffcd+vbtCwC4d+8eVq5ciRdeeAHVq1eHn58f3njjDfz7778G2/7Dhw/l6WrVqpX7+mVJnB49eiRP16pVC7/99pvc+vb333/j7bffRocOHeDk5ITAwEAsXboUSUlJheoxNzfH7t27ERAQAODxk8off/wx+vTpAw8PD/j7+2PmzJm4fv263rESEZkyJnZkMlxdXfH7778jPDwcs2fPRrt27WBlZQUAuHPnDtasWYPmzZsjJCTEKC8RqndNsmvXLpw/f17nl7e3t0ZdXbt2xfXr1/HDDz9gzJgxePbZZ+VthIWFYebMmahdu7bWJ3P9/Pxw4sQJHDlyBFOnTkWLFi3kh1WuXLmCpUuXwt/fH4sWLTLg3iAiMk58KpZMTvPmzdG8eXMAjy8znjp1Crt27cLatWuRmpqKVatWoW7dupg0aRKAx61MBfLz84utu7hLke7u7vJ0dHQ0GjZsWKq4lVzfwcGh1Os/ycrKCoMHD8bgwYMBPG5RPHjwIDZt2oQ9e/YgISEBAwcOxPXr1+Hp6Vlo/aCgIAQFBQF43CL4999/46effsKGDRuQnZ2NOXPmoGHDhujXr1+Z4iQiMiVssSOTplKp0L59eyxduhShoaHy/K1bt8rT9vb28rT6vWbaXLx4schlLVu2lKcPHTpU6ljLun7BU64ADDKqg7u7O4YMGYLdu3fjjTfeAPA40f3ll19KXNfW1hbdu3fHl19+qdGhsfrnQEREJWNiR/T/WrVqBWdnZwCa97PVrFlT7mj39OnTRa4fHR2NP//8s8jlnTt3hqOjI4DHT4SWlCQqvX7Xrl3l9deuXSs/YWsIBQ+qAJr70tDrEhGZOiZ2ZBL+/fdfjadCtQkLC0NiYiIAoHbt2vJ8R0dH+dLtL7/8gkuXLhVa99GjRxgxYgSys7OLrN/Ozg7Tpk0DAMTFxWHQoEHFJldPdjBc1vXt7e0xc+ZMAI+T0MGDB5eY3J06dQp79uzRmLdz507ExcUVu5766B3q+/Lo0aNa95869e2pr0tERCXjPXZkEv777z+MGTMGDRs2xHPPPYcWLVrAx8cHKpUKDx48wKFDh/DVV1/J5d98802N9adMmYJXXnkFWVlZ6Ny5M959910EBAQgNzcX4eHh+Oyzz3Djxg20bdsWx48fLzKOOXPm4ODBgzhy5AgOHToEf3//QkOCXbx4EXv27MGePXsK9bdX1vXffvttHD9+HHv27MGBAwdQp04djB8/Hu3bt0fVqlWRlZUlDwn266+/IiIiAu+88w769Okj17Fy5UoMHz4c3bp1Q9euXdGgQQO4ubkhKysLd+7cwbZt2/Drr78CAGrUqIHnn39eXvfgwYNYsGABWrVqhT59+qBp06bw8vKCmZkZYmJisG/fPnz99dcAAEtLS7z++uul/KSJiEwbEzsyKREREYiIiChyuUqlwrJly+RuUQqMGDECBw8exIYNGxAbGys/WKG+3tq1axEZGVlsYmdhYYE9e/Zg/Pjx2Lp1K+7fv4/3339f5/jLur65uTl+/vlnvPXWW/j8888RGxuLhQsXFrtOweVbdVlZWdi9ezd2795d5HrPPPMMfvnlF1SpUkVjvhACp06dKrYF1d7eHhs2bChxZAsiItLExI5MwvDhw1GtWjWEhobi9OnTiIqKQmxsLNLS0uDg4IBnn30WXbp0QXBwMGrWrKm1jvXr16NHjx5Yu3Ytzp49i/T0dHh5eaFLly6YMmUKGjdujHnz5pUYi62tLb777jtMnjwZ69evx9GjR3Hv3j08evQIjo6OqFOnDjp06FDkkF9lXV+lUmHFihUICQnB119/jcOHD+PGjRtISkqCSqWS+5Nr3749+vfvjwYNGmisv337duzbtw9Hjx5FREQEYmJi8PDhQwgh4O7ujiZNmmDAgAF45ZVX5O5kCsycORPNmjXD4cOHER4ejujoaDx48AAZGRlwcnJCvXr10KNHDwQHB6Nq1aol7ksiItIkCWPssMuAUlJS4OjoiOTk5GLH6XxSZmYmbt26hZo1a8La2tqAERIRjzeiyuOJ4agNIjjY8NswpNLkHnx4goiIiMhIMLEjIiIiMhJM7IiIiIiMBBM7IiIiIiPBxI6IiIjISDCxIyIiIjISTOyIiIiIjAQTOyIiIiIjwcSOiIiIyEgwsSMiIiIyEkzsiIiIiIwEEzsiIiIiI8HEjoiIiMhIMLEjIiIiMhJM7IiIiIiMBBM7IiIiIiPBxI6IiIjISDCxIyIiIjISTOyIiIiIjAQTOyIiIiIjwcSOTE5qairef/99NG3aFPb29pAkCZIkoVOnTopt4/bt23K98+bN01qmYPno0aMV2y4REZk2i4oOgIqxdm1FR1A+goPLbVNpaWlo27YtIiIiym2bRERE5YWJHZmU1atXy0ndsGHDMG7cOLi7u0OSJFSpUqWCoyMiIiobJnZkUvbt2wcAqFq1KjZt2gQLC8McAn5+fhBCGKRuIiKiovAeOzIp9+7dAwDUrl3bYEkdERFRRWFiRyYlKysLAKBSqSo4EiIiIuUxsSOjt3HjRvkJ1Dt37gAAjhw5Is8reN2+fRvA46dmt27dirFjx6Jp06ZwcnKChYUFnJyc0KRJE0yaNAmXL18udpu6PBVLRESkNF6LInpChw4d8N9//xWan5ycjHPnzuHcuXNYs2YNPvnkE0ybNq0CIiQiItKOiR0ZvQEDBqBly5YAgJ49eyI6OhotW7bEhg0bNMpVq1YNAJCbm4tGjRrhueeeQ/PmzeHj4wNLS0tERUXh1KlT+PLLL5GQkIDp06fD19cXgwYNKvf3REREpA0TOzJ6Tk5OcHJyAgBYWloCAKpUqYKGDRtqLf/TTz+hbt26hea3aNEC/fv3x4wZMxAUFISIiAjMmTMHAwcOhCRJBoufyBQZuhvPcuw+k6hc8R47oidoS+rUOTs7Y+HChQCAa9eu4dy5c+URFhERUYnYYkdUgsTERCQmJiIjI0Pum66g5Q8Azpw5gyZNmlRUeERERDImdkRa/PXXX1i9ejVCQ0Px8OHDYsvGxcWVU1RERETFY2JH9IRp06bh008/1bn8o0ePDBgNERGR7niPHZGaLVu2yEmdr68vVqxYgfDwcMTFxSErKwtCCAghcOPGDXkdDh1GRERPC7bYEalZvXo1AMDR0REnT56Ep6en1nIJCQnlGRYREZFO2GJHpOb8+fMAgC5duhSZ1AHAqVOnyiskIiIinTGxI1KTm5sLAEhPTy+2zJo1a8orJCIiIp0xsSNSU9CH3bFjx3DlypVCy/Pz8xESEoKIiIjyDo2IiKhERpvYLV68GJIkYcqUKfK8zMxMTJw4Ea6urrCzs8PAgQMRGxtbcUHSU+fVV18F8PhJ144dO2LZsmU4evQoTp06hQ0bNiAgIABfffUVgoKCKjhSIiKiwozy4YnTp0/jq6++QuPGjTXmT506Fbt378aOHTvg6OiIkJAQvPjii/j7778rKFJ62kycOBFHjx7FTz/9hNjYWMyYMaNQmb59+2Lp0qWoV69eBURIRERUNKNrsUtLS8PLL7+MdevWwdnZWZ6fnJyM9evXY/ny5ejSpQtatGiBDRs24Pjx4wgLC6vAiOlpYm5ujh07dmDjxo3o2LEjHB0dYWlpCW9vb/Tp0wfbtm3D77//Dmtr64oOlYiIqBCja7GbOHEi+vbti27dusnjeQJAeHg4cnJy0K1bN3mev78/fH19ceLECQQEBGitLysrC1lZWfLfKSkphgv+SRylWnG3b98usYwkSRg1ahRGjRpVZBk/P79i+68raTnA/u+IiEh5RpXYbd++HWfOnMHp06cLLYuJiYFKpYKTk5PGfA8PD8TExBRZ56JFizB//nylQyUiIiJSnNFcio2MjMTkyZPx3XffKXqZbPbs2UhOTpZfkZGRitVNREREpCSjSezCw8Px4MEDNG/eHBYWFrCwsMCRI0ewcuVKWFhYwMPDA9nZ2UhKStJYLzY2ttiOaK2srODg4KDxIiIiInoaVdil2JycHMTHx8PZ2RlWVlZlrq9r167yqAEFxowZA39/f8yaNQvVq1eHpaUlQkNDMXDgQADAlStXcPfuXQQGBpZ5+0REREQVTbHELi4uDvn5+QCAqlWrFlnu1KlTeOedd3D06FG5l//WrVvj3XffRd++ffXevr29PRo2bKgxr0qVKnB1dZXnjx07FtOmTYOLiwscHBwwadIkBAYGFvngBBEREVFlosil2Js3b8LDwwNeXl7o2rVrkeVCQ0PRsWNHHDx4EDk5ORBCQAiBkydP4vnnn8fHH3+sRDhF+vTTT/Hcc89h4MCBCAoKgqenJ3bu3GnQbRIRERGVF0Va7H799VcIISBJEiZMmKC1TFZWFkaPHo2srCxIklRouRACc+bMQfv27dGuXTslwsLhw4c1/ra2tsaqVauwatUqReonIiIiepoo0mJ34sQJebp///5ay2zevBn37t2DJEkwNzfH3Llz8e+//+Lo0aPo1KkTgMfJ3XvvvadESEREREQmR5EWu8uXLwN4fG+dj4+P1jJbt26Vp9966y3MnTtX/nv37t2oX78+7ty5g6NHjyImJqbYJ1WJiIiIqDBFWuwiIyMhSRJq1qypdfmjR4/k8VglSUJISIjGchsbG3nwdSGE1g6GiYiIiKh4iiR26enpAB4/marN8ePHkZOTA0mS0LJlS62tcS1atJCndRn2iYiIiIg0KZLYmZubAwAyMzO1Lv/rr7/k6YL76Z6kPtRXWlqaEmE9lTg+KJHh8TgjIlOlSGLn7OwMIQRu3bqldfmff/4pT3fs2FFrmYJWPwCwsDCqIWwBAGZmj3d1QV9/RGQ4eXl5AP533BERmQpFznoNGjQAANy7dw8XLlzQWHb79m2EhYUBeJywBQUFaa3j/v378rSrq6sSYT1VLC0tYW5urpHAEpFhPHr0CObm5rC0tKzoUIiIypUiiV2PHj3k6TfeeAMpKSkAHvddFxISIvdx17lzZ1SpUkVrHeHh4fJ07dq1lQjrqSJJEuzt7ZGSksLLREQGJIRASkoK7O3ttfaZSURkzBRJ7EaPHg1HR0cAwLFjx1C9enW0bdsWPj4+2Lt3r1zuyadh1e3fvx/A4wSoadOmSoT11HF0dEROTg6io6OZ3BEZgBAC0dHRyMnJkc9JRESmRJGb2dzc3LBmzRqMGDECQgikpqbi5MmTGmUGDBiA5557Tuv6Z86cwdWrVyFJEho0aGC0J2RbW1v4+PggKioKGRkZcHBwgK2tLczNzdmyQKQnIQTy8vLw6NEjpKSkICcnBz4+PrC1ta3o0IiIyp1iTykMHToUTk5OmDlzJi5cuCC3SNnY2GDChAlYtGhRkesuX74cwOMTdJ8+fZQK6alkb2+PGjVqIDk5GUlJSYiPj6/okIiMgrm5Oezt7eHo6MikjohMlqKPn/bq1Qu9evVCVFQUoqKiYG1tjXr16sHKyqrY9Xr37o3u3bsDADp37qxkSE8lW1tb2NrawtPTEzk5OXxSlqiMzMzMYGlpyZZvIjJ5BulXxMfHp8ihxbR5+eWXDRHGU0+SJKhUqooOg4iIiIwEO3kiIiIiMhJM7IiIiIiMhMGGePjjjz9w8OBBnDlzBnFxcUhOToYQAjdu3ChU9tq1a/LDFnXq1DFUSERERERGTfHE7rfffsOMGTNw/fp1jfkFnRRrM2nSJPzxxx8AgEOHDhU5OgURERERFU3RS7FvvfUWBgwYgOvXr0MIofEqzvTp0+UymzZtUjIkIiIiIpOhWGK3ZMkSLF26VE7k6tevj4ULF2LXrl1o1apVset269YNHh4eEEJojFRBRERERLpTJLGLjIzE3LlzATzuwuPDDz9EREQE5syZg+effx4uLi7Fri9JEnr16gUAiImJwbVr15QIi4iIiMikKJLYrVu3DpmZmZAkCW+++SZmz55d6jpatGghT1+8eFGJsIiIiIhMiiKJ3f79+wEAFhYWcstdadWsWVOejoqKUiIsIiIiIpOiSGJ3+/ZtSJKEhg0bwsnJSa86HB0d5emUlBQlwiIiIiIyKYokdsnJyQBQ4r10xcnKypKnSxpbloiIiIgKUySxK0joEhIS9K7jzp078rSbm1uZYyIiIiIyNYokdr6+vhBC4MKFC8jIyNCrjoMHD8rTDRo0UCIsIiIiIpOiSGLXo0cPAEBOTg42btxY6vUjIyPx448/AgCcnZ01npAlIiIiIt0oktgNGzYM5ubmAIA5c+bgypUrOq+bmZmJYcOGITs7G5IkYcyYMUqERERERGRyFEns6tWrhzFjxkAIgZSUFLRv3x5bt24tcSixI0eOICAgACdOnIAkSXB0dMRbb72lREhEREREJsdCqYpWrFiB//77D6dPn0ZCQgJeeeUVTJ8+HUFBQbh8+bJc7s0338SDBw8QFhaGyMhIAIAQAubm5ti2bRvc3d2VComIiIjIpCiW2Nna2mLv3r0YMWIE9u3bBwB48OCBfO+cJEkAgFWrVsnrFLTo2dvb49tvv0XPnj2VCoeIiIjI5ChyKbaAi4sL9uzZg/Xr16NevXoQQhT7Mjc3x/Dhw3HmzBkMGDBAyVCIiIiITI5iLXbqxowZgzFjxiA8PBx//fUXIiIiEB8fj/T0dDg6OsLDwwMBAQHo2rUrvLy8DBECERERkckxSGJXoEWLFuy6hIiIiKicKHoploiIiIgqDhM7IiIiIiPBxI6IiIjISOh8j93du3c1/vb19S1yWVmp101EREREutE5sfPz85P7opMkCbm5uVqXldWTdRMRERGRbkr9VGxxw4SVNIRYcSRJKtP6RERERKauVPfYGSqpU2J9IiIiIlOnc4tdfn6+XsuIiIiIqHzwqVgiIiIiI8HEjoiIiMhIMLEjIiIiMhJM7IiIiIiMRKm7OynKggULkJSUBEmS8MEHH8DW1lbndXfu3Iljx44BAEaMGIHmzZsrFRYRERGRyVAksQsPD8e8efMgSRKef/75UiV1wOMOjgcNGgRJkhAZGYkdO3YoERYRERGRSVHkUuyuXbvk6bFjx5Z6/ebNm6NZs2YQQmDPnj3IyspSIiwiIiIik6JIYldwGdXS0hI9evTQq46+ffsCADIzM3H69GklwiIiIiIyKYokdpcvX4YkSfD394dKpdKrjmbNmmnUR0RERESlo0hil5iYCABwc3PTuw53d3d5OiEhocwxEREREZkaRR6eUKlUyMnJwaNHj/SuIyMjQ4lQiIiISCFr11Z0BFRairTYubu7QwiBGzdu6F3HtWvXNOojIiIiotJRJLFr2LAhACAuLk5+kKK0du7cKU/7+/srERYRERGRSVEksevZs6c8PWvWLOTl5ZVq/T179uDgwYMAACcnJwQEBCgRFhEREZFJUSSxe/nll+Hk5AQACAsLw9ChQ5Genq7TugcPHsSwYcMAAJIkITg4GJIkKREWERERkUlRJLFzdHTE3LlzIYQA8PiyasOGDfHZZ58hMjKyUPns7GwcPnwYL7/8Mnr06IHU1FQAgKenJ95++20lQiIiIiIyOYqNFTt58mScPXsW3377LSRJwp07dzBt2jRMmzYNrq6ucHd3h5WVFZKTkxEVFYXc3FwAkJNBOzs77N69G46OjkqFRERERGRSFEvsAOCbb75BjRo1sHDhQjlhE0IgLi4O8fHxcrmCZQXq1auH77//Xn4Ig4iIiIhKT5FLsQUkScK8efNw9uxZjBgxAjY2NvIyIYT8KlC/fn2sXr0aZ86cYVJHREREVEaKttgVaNiwITZt2oRvvvkG4eHhuHTpEhISEpCVlQUnJyd4enoiICAAXl5ehtg8ERERkUkySGInV25hgTZt2qBNmzaG3AwRERERQeFLsRVtzZo1aNy4MRwcHODg4IDAwEDs3btXXp6ZmYmJEyfC1dUVdnZ2GDhwIGJjYyswYiIiIiLlGFVi5+Pjg8WLFyM8PBz//PMPunTpgv79++PChQsAgKlTp+K3337Djh07cOTIEURHR+PFF1+s4KiJiIiIlGHQS7HlrV+/fhp/f/jhh1izZg3CwsLg4+OD9evXY+vWrejSpQsAYMOGDahXrx7CwsI42gURERFVegZJ7G7fvo2///4bly9fRlJSEh49elSoi5OiSJKE9evXlzmGvLw87NixA+np6QgMDER4eDhycnLQrVs3uYy/vz98fX1x4sSJIhO7rKwsZGVlyX+npKSUOTYiIiIiQ1A0sTt9+jRmzJiBY8eOlamesiR258+fR2BgIDIzM2FnZ4eff/4Z9evXx9mzZ6FSqeShzwp4eHggJiamyPoWLVqE+fPn6x0PERERUXlR7B67rVu3om3btjh27JhGn3WlfZVV3bp1cfbsWZw8eRKvv/46Ro0ahYsXL+pd3+zZs5GcnCy/tA2RRkRERPQ0UKTF7saNG3j11VeRl5cHSZIAADVq1EC7du1QrVo12NraKrEZnahUKjzzzDMAgBYtWuD06dP47LPPMGTIEGRnZyMpKUmj1S42Nhaenp5F1mdlZQUrKytDh01ERERUZookdp9++imys7MhSRIcHBzwzTff4IUXXlCi6jLLz89HVlYWWrRoAUtLS4SGhmLgwIEAgCtXruDu3bsIDAys4CiJiIiIyk6RxC40NFSe3rZtG3r16qVEtaU2e/Zs9O7dG76+vkhNTcXWrVtx+PBh7N+/H46Ojhg7diymTZsGFxcXODg4YNKkSQgMDOQTsURERGQUFEnsoqKiIEkSfH19KyypA4AHDx5g5MiRuH//PhwdHdG4cWPs378f3bt3B/C4ZdHMzAwDBw5EVlYWevbsidWrV1dYvERERERKUiSxMzc3BwDUqlVLier0VtLTtNbW1li1ahVWrVpVThERERERlR9FnoqtUaMGhBBIS0tTojoiIiIi0oMiiV3fvn0BABEREcjMzFSiSiIiIiIqJUUSu9deew22trbIzMzEl19+qUSVRERERFRKil2KXb16NYQQmDNnDg4cOKBEtURERERUCoqNPDFy5Ehs2rQJANCnTx8EBwfj9OnTyM/PV2oTRERERFQMRZ6KVX8a1tzcHPn5+Vi/fj3Wr18PlUoFV1dXqFQqneqSJAk3btxQIiwiIiIik6JIYnf79m15KDEA8rQQAllZWbh//75O9QghNOohIiIiIt0pktgBj5MyfZYRERERkTIUSewOHTqkRDVEREZt7VrDbyM42PDbIKKnlyKJXceOHZWohoiIiIjKQLGnYomIiIioYjGxIyIiIjISTOyIiIiIjIRiT8U+6dq1azh48CDOnDmDuLg4JCcnQwiB0NDQQmWzs7PlaV37uyMiIiIiTYondmfOnMGsWbNw8OBBjfnF9VHXsWNHnDp1CpIk4dSpU2jevLnSYREREREZPUUTu1WrVmH69OnIyckpVd91M2fOxKBBgwAA3377LRM7IiI9sUsVItOm2D12mzdvxqRJk+SkztXVFePGjcOKFSvQsGHDYtft168fnJycAAC///67UiERERERmRRFErv4+HhMnjxZ/nv8+PG4e/cu1q5dizfffBPVqlUrdn1LS0v06tULQgjcvn0bd+/eVSIsIiIiIpOiSGK3bt06JCUlQZIkDB06FF999RVsbGxKVUfLli3l6YiICCXCIiIiIjIpiiR2e/bsAQBIkoQlS5boVcezzz4rT9+5c0eJsIiIiIhMiiKJ3bVr1yBJEurXrw9vb2+96ii4xw4AUlJSlAiLiIiIyKQoktglJiYCADw8PPSuIzc3V542Nzcvc0xEREREpkaRxM7R0RFA2VraoqOj5WlXV9cyx0RERERkahRJ7KpVqwYhBC5cuKDR8lYaR44ckafr1KmjRFhEREREJkWRxK5Lly4AgIyMDOzYsaPU6ycmJmL79u0AgCpVqqBNmzZKhEVERERk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EREpxqgSu06dOkEIUeRySZKwYMECLFiwoByjIiIiIiofJnOPHREREZGxM6oWOyKlrV2r/7r+5dCNCRERkTq22BEREREZCSZ2REREREaCiR0RERGRkWBiR0RERGQkmNgRERERGQkmdkRERERGgokdERERkZFgYkdERERkJJjYERERERkJJnZERERERoKJHREREZGRYGJHREREZCSY2BEREREZCSZ2REREREbCoqIDIOO1dq3htxEcbPhtGIOjRytu25crbtNERCaHLXZERERERoKJHREREZGRYGJHREREZCSY2BEREREZCSZ2REREREaCiR0RERGRkWB3J1SplUeXKlQ2/kf5IVU2/MyIKi+22BEREREZCSZ2REREREaCiR0RERGRkWBiR0RERGQkmNgRERERGQkmdkRERERGgokdERERkZFgYkdERERkJJjYERERERkJJnZERERERoKJHREREZGRYGJHREREZCSY2BEREREZCSZ2REREREbCoqIDICO1di38jypf7eWgYOUrJSIiMhJssSMiIiIyEkzsiIiIiIwEEzsiIiIiI8HEjoiIiMhIMLEjIiIiMhJM7IiIiIiMBBM7IiIiIiPBxI6IiIjISDCxIyIiIjISTOyIiIiIjAQTOyIiIiIjwcSOiIiIyEgwsSMiIiIyEkzsiIiIiIwEEzsiIiIiI8HEjoiIiMhIMLEjIiIiMhJM7IiIiIiMBBM7IiIiIiPBxI6IiIjISDCxIyIiIjISFhUdAGm3dq1h6w8ONmz9huJ/VPkdczmoku4MIiKiJ7DFjoiIiMhIMLEjIiIiMhImmditWrUKfn5+sLa2Rps2bXDq1KmKDomIiIiozEwusfv+++8xbdo0zJ07F2fOnEGTJk3Qs2dPPHjwoKJDIyIiIioTk0vsli9fjvHjx2PMmDGoX78+vvzyS9ja2uKbb76p6NCIiIiIysSkErvs7GyEh4ejW7du8jwzMzN069YNJ06cqMDIiIiIiMrOpLo7iYuLQ15eHjw8PDTme3h44PLly1rXycrKQlZWlvx3cnIyACAlJcVwgQLIyDBo9TBw+EBGBtJzDLwNhWRkGGZnpOcY+EMkIiKD0+U3wtC/qQU5hxCixLImldjpY9GiRZg/f36h+dWrV6+AaJQzZUpFR/AU+WFKRUdARERPKx1+I8rrNzU1NRWOjo7FljGpxM7NzQ3m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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "hint_model_path = \"save_model/\" + base_name + \".ckpt\"\n",
    "if not os.path.exists(hint_model_path):\n",
    "\tmodel = HINTModel(molecule_encoder = mpnn_model, \n",
    "\t\t\tdisease_encoder = gram_model, \n",
    "\t\t\tprotocol_encoder = protocol_model,\n",
    "\t\t\tdevice = device, \n",
    "\t\t\tglobal_embed_size = 50, \n",
    "\t\t\thighway_num_layer = 2,\n",
    "\t\t\tprefix_name = base_name, \n",
    "\t\t\tgnn_hidden_size = 50,  \n",
    "\t\t\tepoch = 15,\n",
    "\t\t\tlr = 5e-4, \n",
    "\t\t\tweight_decay = 1e-3, \n",
    "\t\t\t)\n",
    "\tmodel.init_pretrain(admet_model)\n",
    "\ttrain_output, valid_output = model.learn(train_loader, valid_loader, test_loader)\n",
    "\tnctid_all, predict_all = model.bootstrap_test(test_loader, valid_loader=valid_loader)\n",
    "\ttorch.save(model, hint_model_path)\n",
    "else:\n",
    "\tmodel = torch.load(hint_model_path)\n",
    "\tmodel.bootstrap_test(test_loader)\n",
    "\ttrain_loss, train_predict, train_label = model.test(train_loader, return_loss=True)\n",
    "\ttest_loss, test_predict, test_label = model.test(test_loader, return_loss=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn.metrics import roc_auc_score, f1_score, average_precision_score, precision_score, recall_score, accuracy_score\n",
    "from scipy.optimize import brentq\n",
    "from scipy.stats import binom"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5486443381180224"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n = len(test_predict)\n",
    "test_predict_label = [0] * n\n",
    "for i in range(n):\n",
    "    if test_predict[i] > 0.5:\n",
    "        test_predict_label[i] = 1\n",
    "\n",
    "accuracy_score(test_predict_label, test_label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.657088122605364"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n = len(train_predict)\n",
    "train_predict_label = [0] * n\n",
    "for i in range(n):\n",
    "    if train_predict[i] > 0.5:\n",
    "        train_predict_label[i] = 1\n",
    "\n",
    "accuracy_score(train_predict_label, train_label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1044, 2)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "smx = np.array(train_predict)\n",
    "labels = np.array(train_label)\n",
    "a = 1-smx\n",
    "smx = np.vstack((a, smx))\n",
    "smx = smx.transpose()\n",
    "smx.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.554 0.3508607036019853 True\n",
      "0.538 0.30368109842562563 True\n",
      "0.538 0.35567519384109153 True\n",
      "0.534 0.4216732884759087 True\n",
      "0.534 0.3278802471240832 True\n",
      "0.534 0.35770280796317994 True\n",
      "0.534 0.2966973400692054 True\n",
      "0.534 0.3313242713914189 True\n",
      "0.534 0.3857771181375555 True\n",
      "0.534 0.3636793928357601 True\n",
      "0.534 0.337767638543699 True\n",
      "0.534 0.37325515096924666 True\n",
      "0.534 0.3725668806539195 True\n",
      "0.534 0.4408299805577162 True\n",
      "0.534 0.44835356121599995 True\n",
      "0.534 0.3215599003528717 True\n",
      "0.534 0.3698935924827509 True\n",
      "0.534 0.3265181312939036 True\n",
      "0.534 0.3892693365694524 True\n",
      "0.534 0.3410062299280009 True\n",
      "The original accuracy is:\t\t0.5486\n",
      "The empirical selective accuracy is:\tmean: 0.6848\tstd: 0.0083\n",
      "The empirical improved accuracy is:\tmean: 0.1361\tstd: 0.0083\n",
      "The fraction of data points kept is:\tmean: 0.8151\tstd: 0.0190\n",
      "PR_AUC\t mean: 0.7606\tstd: 0.0129\n",
      "F1\t mean: 0.7252\tstd: 0.0084\n",
      "ROC_AUC  mean: 0.7149\tstd: 0.0085\n"
     ]
    }
   ],
   "source": [
    "n = 200\n",
    "alpha = 0.1\n",
    "delta = 0.1\n",
    "lambdas = np.linspace(0,1,501)\n",
    "prauc = []\n",
    "f1 = []\n",
    "rocauc = []\n",
    "selective_accuracy = []\n",
    "improved_accuracy = []\n",
    "points_kept = []\n",
    "\n",
    "for i in range(20):\n",
    "    # Split the softmax scores into calibration and validation sets (save the shuffling)\n",
    "    idx = np.array([1] * n + [0] * (smx.shape[0]-n)) > 0\n",
    "    np.random.shuffle(idx)\n",
    "    cal_smx, val_smx = smx[idx,:], smx[~idx,:]\n",
    "    cal_labels, val_labels = labels[idx], labels[~idx]\n",
    "    # Yhat, Phat\n",
    "    cal_yhats = np.argmax(cal_smx, axis=1); val_yhats = np.argmax(val_smx, axis=1)\n",
    "    cal_phats = np.max(cal_smx, axis=1); val_phats = np.max(val_smx, axis=1)\n",
    "\n",
    "\n",
    "    # Define selective risk\n",
    "    def selective_risk(lam): \n",
    "        return (cal_yhats[cal_phats >= lam] != cal_labels[cal_phats >= lam]).sum()/(cal_phats >= lam).sum()\n",
    "    def nlambda(lam): \n",
    "        return (cal_phats > lam).sum()\n",
    "    def invert_for_ub(r,lam): \n",
    "        return binom.cdf(selective_risk(lam)*nlambda(lam),nlambda(lam),r)-delta\n",
    "    # Construct upper boud\n",
    "    def selective_risk_ub(lam): \n",
    "        return brentq(invert_for_ub,0.1,0.9999,args=(lam,))\n",
    "    # Make sure there's some data in the top bin.\n",
    "    lambdas = np.array([lam for lam in lambdas if nlambda(lam) >= 150]) \n",
    "    # Scan to choose lamabda hat\n",
    "    for lhat in np.flip(lambdas):\n",
    "        # print(lhat)\n",
    "        print(lhat, selective_risk_ub(lhat-1/lambdas.shape[0]), selective_risk_ub(lhat-1/lambdas.shape[0]) > alpha)\n",
    "        if selective_risk_ub(lhat-1/lambdas.shape[0]) > alpha: break\n",
    "    # Deploy procedure on test data\n",
    "    predictions_kept = val_phats >= lhat\n",
    "\n",
    "    # Calculate empirical selective accuracy\n",
    "    test_accuracy = accuracy_score(test_predict_label, test_label)\n",
    "    empirical_selective_accuracy = (val_yhats[predictions_kept] == val_labels[predictions_kept]).mean()\n",
    "    empirical_improved_accuracy = empirical_selective_accuracy - test_accuracy\n",
    "    fraction_kept = predictions_kept.mean()\n",
    "\n",
    "    val_label_kept = val_labels[predictions_kept]\n",
    "    val_pred_kept = val_yhats[predictions_kept]\n",
    "    val_score_kept = val_smx[:,1][predictions_kept]\n",
    "\n",
    "    prauc_score = average_precision_score(val_label_kept, val_score_kept)\n",
    "    f1score = f1_score(val_label_kept, val_pred_kept)\n",
    "    auc_score = roc_auc_score(val_label_kept, val_score_kept)\n",
    "    precision = precision_score(val_label_kept, val_pred_kept)\n",
    "    recall = recall_score(val_label_kept, val_pred_kept)\n",
    "    accuracy = accuracy_score(val_label_kept, val_pred_kept)\n",
    "    predict_1_ratio = sum(val_pred_kept) / len(val_pred_kept)\n",
    "    label_1_ratio = sum(val_label_kept) / len(val_label_kept)\n",
    "\n",
    "    prauc.append(prauc_score)\n",
    "    f1.append(f1score)\n",
    "    rocauc.append(auc_score)\n",
    "    selective_accuracy.append(empirical_selective_accuracy)\n",
    "    improved_accuracy.append(empirical_improved_accuracy)\n",
    "    points_kept.append(fraction_kept)\n",
    "\n",
    "print(f\"The original accuracy is:\\t\\t{test_accuracy:.4F}\")\n",
    "print(f\"The empirical selective accuracy is:\\tmean: {np.mean(selective_accuracy):.4F}\\tstd: {np.std(selective_accuracy):.4f}\")\n",
    "print(f\"The empirical improved accuracy is:\\tmean: {np.mean(improved_accuracy):.4F}\\tstd: {np.std(improved_accuracy):.4f}\")\n",
    "print(f\"The fraction of data points kept is:\\tmean: {np.mean(points_kept):.4F}\\tstd: {np.std(points_kept):.4f}\")\n",
    "\n",
    "print(f\"PR_AUC\\t mean: {np.mean(prauc):.4F}\\tstd: {np.std(prauc):.4f}\")\n",
    "print(f\"F1\\t mean: {np.mean(f1):.4F}\\tstd: {np.std(f1):.4f}\")\n",
    "print(f\"ROC_AUC  mean: {np.mean(rocauc):.4F}\\tstd: {np.std(rocauc):.4f}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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pk2b6NatGwCdO3fmxIkTzJ07l3PnzjF79myioqLMFooWERGR7GXRAOjo6Ej37t2ZOXMm27dvJzIykmHDhuHu7k7Lli1JTU01CyIvvvgikLYWYGRkJJGRkQwfPhwnJyc6duxowSvJn8aMGYO3tzc9e/ZkwoQJvPXWW7Rs2RIAf39/tmzZYqp79epVihQpkukK7r1796Zbt26MGjWKLl268OSTT5qeEAJpC04XLFiQV199lQULFjB58mSqV68OQNmyZVm0aBE7duygbdu27Nixg5CQEC3s/QgSExN57733qFOnDv7+/oSFhWVar0ePHnh6emZ4jRkzBkibkjFt2jQaN26Mn58fgwcPNuvB/f777zPsGxgYaNr+008/0aFDB3x9fWnXrh3bt2/P2QsXEZGsM1pYSkqKcfr06cZnn33WWLNmTWO/fv2MUVFRRqPRaIyKijJWrlzZGB4ebqr/559/GgcMGGCsW7eu8dlnnzUOGTLEVP9RBAQEGAMCAv7zdYhYWnBwsLFdu3bGI0eOGLdt22b09fU1fvvttxnqXb9+3RgTE2N6ff/990Zvb2/j4cOHjUaj0Thjxgxj8+bNjXv27DGeOnXK2L9/f+PLL79sNBgMRqPRaJw/f75xwIABZseIjY01Go1G4/Hjx43e3t7GpUuXGv/66y/jF198YfT29jYeP348994IEck1+h2af9kYjUajpUOoJaXf1KBeCsnP4uPjefbZZwkNDaVevXpA2lN2fv31V5YvX37P/VJTU2nfvj0tWrRg6NChADRs2JD333+fNm3aAGlzchs1asTWrVvx8PBgxIgRlClThuHDh2c43syZM4mMjGTRokWmsj59+uDj48OwYcOy8YpFJC/Q79D8y+KPghOR/y67nuxiMBiYMWMGVatWzVD31q1bQNpNPg0aNMj0eC+99FKmj3pK31dERPIGrZ4s8hjIrie72Nra0qBBA7O1HpctW8YTTzyBp6cnRqORs2fPsmvXLlq1akXz5s2ZOXOmaSmnSpUq4eXlZdr31KlT/Prrr2ZP+5GHk11zOu82duxY5s6de89z9u/fn9GjR5uV7dq1i/bt2+Pr60uvXr04c+bMf7swEckTFABFHgPZ9WSXf0u/O/ydd97B0dGRf/75x3SuTz75hHfffZeNGzcyffr0DPteu3aNt956i1q1amVYP1IebPr06Rw5coSl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HR3N9u3bc+bCJc/STSAi+ZjRYMAmH96RmV/bLfKosrK4d8mSJXnqqafMyjw8PLh48SJnzpwhPj4eLy8v07aqVatiMBiIjo5m8+bNODs788UXXwCQkJDA77//znfffcfmzZs5evQoAwcONO2bvuzPhQsXcurSJY9SABTJx/Lj4/30aD+xRllZ3LtmzZrs27fPrOzMmTO0bdsWNzc3AP7880+8vb1N2wDKlSvHtm3bzPYbMWIENWrU4I033gDAzc2N06dPm9ZyTEpK4vz581leQ1LyPwVAkXxOj/cTyfvuXtx78uTJxMTEEBYWxpQpU4C03sDChQvj7OxM586d+eKLL5g7dy7t27dn3bp1REVF0aFDB0qVKkWjRo344IMPCA4Oxmg0Mn78eF544QWKFSuW4a5fZ2dnihYtanp8X6dOnViwYAEeHh5UqFCBhQsXUrBgQQICAnL9PRHL0hiMiEgeYfzXciD5RX5td2572MW9y5Yty6JFi9ixYwdt27Zlx44dhISEUKpUKQA++ugjPD096d+/PwMHDsTHx4eJEyc+VBv69OlDnz59mDRpEp06deLq1assWbIEJyennLloybNsjEaj0dKNsKRmzZoBWM0E2GNLg/Ndb1GBUk9Stec4Szcjz8pvn6k+z/vTkL7kJ9b2O/RxoiFgEZE8REP6IpIbNAQsIiIiYmUUAEVERESsjAKgiIiIiJVRABQRERGxMgqAIiIiIlZGAVBERETEyigAioiI5ID8vEB2fm67PBytAygiIpID8uOzukGLe1sLBUAREZEcooW9Ja/SELCIiIiIlVEAFBEREbEyCoAiIiIiVkYBUERERMTKKACK/EtiYiLvvfcederUwd/fn7CwsHvWPXHiBF26dKF69eq0a9eO3377zWz7kiVLaNSoEb6+vrz33nvcuXPnoc/zyy+/0L59e6pXr0779u3ZuXNn9l6oiIhYLQVAkX+ZPn06R44cYenSpYwfP5558+bx3XffZah369YtevfuzdNPP83GjRtp0aIFQ4YM4erVqwBs3bqVefPmERwczNKlSzl06BAzZsx4qPOcO3eOIUOG0LFjRzZv3sxLL73E4MGDOX/+fO68CSIi8lhTABS5S3x8PF999RXvv/8+3t7etGjRgr59+7JixYoMdb/55htcXFwICgqiQoUKBAYGUqFCBY4cOQLAsmXL6NmzJ889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iIiIWBkFQBERERErowAoIiIiYmUUAEVERESsjAKgiIiIiJVRABQRERGxMgqAIiIiIlZGAVBERETEyigAioiIiFgZBUARERERK6MAKCIiImJlFABFRERErIwCoIiIiIiVUQAUERERsTIKgCIiIiJWRgFQRERExMooAIqIiIhYGQVAERERESujACgiIiJiZRQARURERKyMAqCIiIiIlVEAFBEREbEyCoAiIiIiVkYBUERERMTKKACKiIiIWBkFQBERERErowAoIiIiYmUUAEVERESsjAKgiIiIiJVRABQRERGxMgqAIiIiIlZGAVBERETEyigAioiIiFgZiwdAg8HAnDlzaNSoETVr1qRfv35ERUXds/6pU6fo378/9erVo379+gQGBvLPP//kYotFRERE8jeLB8D58+ezcuVKJk6cyKpVqzAYDPTt25ekpKQMda9fv84bb7yBs7Mzy5cvJzQ0lGvXrtG3b18SExMt0HoRERGR/MeiATApKYmwsDACAwNp2rQpXl5ezJo1i+joaLZt25ah/g8//EB8fDzTp0+ncuXK+Pj4MGPGDE6fPs2BAwcscAUiIiIi+Y9FA2BkZCS3b9+mfv36prIiRYpQtWpV9u3bl6F+/fr1mT9/Ps7OzqYyW9u0S7h582bON1hERETkMWBvyZNHR0cDULp0abNyNzc307a7lStXjnLlypmVhYSE4OzsjJ+fX841VEREROQxYtEewDt37gDg6OhoVu7k5PRQc/qWL1/OF198wYgRIyhWrFiOtFFERETkcWPRHsD0odykpCSzYd3ExEQKFChwz/2MRiOzZ8/ms88+480336RHjx453lYRERGRx4VFewDTh35jYmLMymNiYihVqlSm+yQnJzNy5EgWLFjAmDFjGDp0aE43U0REROSxYtEA6OXlRaFChdizZ4+p7ObNmxw7duyec/pGjRrFd999x0cffUSvXr1yqaUiIiIijw+LDgE7OjrSvXt3Zs6cSbFixShbtiwzZszA3d2dli1bkpqayrVr1yhcuDDOzs6sXbuWLVu2MGrUKOrWrcvly5dNx0qvIyIiIiL3Z/GFoAMDA3nllVcYO3YsXbp0wc7OjsWLF+Pg4MDFixfx9/dny5YtAGzatAmA6dOn4+/vb/ZKryMiIiIi92fRHkAAOzs7Ro4cyciRIzNsK1euHCdOnDB9HRYWlptNExEREXksWbwHUERERERylwKgiIiIiJVRABQRERGxMgqAIiIiIlZGAVBERETEyigAioiIiFgZBUARERERK6MAKCIiImJlFABFRERErIwCoIiIiIiVUQAUERERsTIKgCIiIiJWRgFQRERExMooAIqIiIhYGQVAERERESujACgiIiJiZRQARURERKyMAqCIiIiIlVEAFBEREbEyCoAiIiIiVkYBUERERMTKKACKiIiIWBkFQBERERErowAoIiIiYmUUAEVERESsjAKgiIiIiJVRABQRERGxMgqAIiIiIlZGAVBERETEyigAioiIiFgZBUARERERK6MAKCIiImJlFABFRERErIwCoIiIiIiVUQAUERERsTIKgCIiIiJWxt7SDZD7S0lKIPLnRSTevgbYULTU0zz9bJdM616L+oNzhzZhSE3G1s6BJ2u8QPHy1U3bg4ODWfXlSlINRlwLODC2TXXKuLoAYDAYCNp0mNOXb2EEnipRiKB2NbC3Tfsb4WJsPJO2/MH1+CRsbeA5T3f6NHwmpy9fREREcoB6APO4E7uXkHTnJh61XqLU0/WJvXSKqCPbMtRLSojj7IF1OBcqQaV6nXEqWIy/DqwnKSEOgGO//8KKFSsIqF6JtwO8SEoxELz5sGn/j384zpkrt+hZvxLd6lbk7NU4Zv1w3LR9wqbDJKUYGNasCg0rubE9MpqfTkbn/BsgIiIi2U4BMA9LSogj4WYMZasGULx8Ncp5N6dwCQ+unPs9Q91/jm0HGxs8G/fB1b0yXk36YWNjwz/HfwRg38+bePLJJxnUph71KpZkdGsfbiYkc/xiLAAHz1+j8TOlaFm1DC9UK0eApzuHzl8D4Og/17mZkMw7Lari51GCN5t44l7EmfUHo3LvzRAREZFsowCYh8VGRwJQvEItU1lR98oYUhIxGAxmdeOun8exQBFs//+Qra2tLY4FinL72vm07TevU7t2bVP9p92KYGsDe85e5uyVWxiM0LCSm2l7w0puGIzw19U49v51FVsb8HIvatru5V6UK7cTs/+iRUREJMcpAOZhCXHXARvs7R1NZU4FiwGQePuqWd3UpATsHQualdk5FiAlKR4AgyGVJ5980my7g50tMbcSOH8jrU6F4oVM28q5FgDg3NXbXI1LxMHO/L9KiYJOpBqM/+HqRERExFIUAPMwQ0oi2JiX2dk5/v9tSWblRmMq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Z7l69SotWrQwK+/Tpw9r165V+BMRq6YeQBHJEc8//zxDhgwhOjoaJycnfv31V4YOHWpW58aNGwC88MILmR7j0qVL9z2Hi4vLPbelH7t48eIP3WYREWuhACgiOaJx48YULFiQ7777DhcXF8qVK4ePj49ZnSJFigCwdOlSChYsmOEYZcqUeeTzpx/72rVrZuXXr1/n2LFj+Pr63jdAiog8zjQELCI5wtHRkebNm7N161a+/fbbTHv56tSpA6SFsmrVqple165dY/bs2aZePFvbrP+oeuqpp3jiiScyrDu4fv16+vfvT3JyctYvSkTkMaEeQBHJMW3atGHAgAHY2toyduzYDNs9PT1p3749H3zwARcuXMDHx4ezZ88ya9YsypUrh4eHB5DWm3flyhV27tx533l/d7Ozs+Ott94iODiY4sWLExAQwNmzZ5kzZw7dunWjaNGi2XmpIiL5igKgiOSYBg0aUKRIEUqXLk2lSpUyrTNlyhQWLlzIqlWriI6Opnjx4rRp04ahQ4diZ2cHQMeOHdm5cyeDBw8mMDCQNm3aPNT5u3XrhouLC4sXL2b16tW4u7vTr18/+vXrl23XKCKSH9kY9YR1EREREauiOYAiIiIiVkYBUERERMTKKACKiIiIWBkFQBERERErowAoIiIiYmUUAEVERESsjAKgiIiIiJVRABQRERGxMgqAIiIiIlZGAVBERETEyigAioiIiFgZBUARERERK/P/AOLuUUv99KXKAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.set_theme(style='white')\n",
    "\n",
    "origin = [0.5765, 0.6003, 0.5723, accuracy_score(test_predict_label, test_label)]\n",
    "cp = [np.mean(prauc), np.mean(f1), np.mean(rocauc), np.mean(selective_accuracy)]\n",
    "\n",
    "# X axis\n",
    "X_labels = [\"PR_AUC\", \"F1\", \"ROC_AUC\", \"Accuracy\"]\n",
    "\n",
    "import pandas as pd\n",
    "\n",
    "data = {\n",
    "    'Metric': X_labels * 2,  \n",
    "    'Value': origin + cp,  \n",
    "    'Type': ['origin']*4 + ['cp']*4  \n",
    "}\n",
    "\n",
    "df = pd.DataFrame(data)\n",
    "\n",
    "plt.figure(figsize=(6, 4))\n",
    "ax = sns.barplot(x='Metric', y='Value', hue='Type', data=df)\n",
    "\n",
    "for p in ax.patches:\n",
    "    ax.annotate(f'{p.get_height():.4f}', \n",
    "                (p.get_x() + p.get_width() / 2., p.get_height()), \n",
    "                ha = 'center', \n",
    "                va = 'center', \n",
    "                xytext = (0, 9), \n",
    "                textcoords = 'offset points',\n",
    "                fontsize = 10)\n",
    "ax.legend(loc='upper left', bbox_to_anchor=(1, 1))\n",
    "plt.title('Phase I')\n",
    "plt.ylabel('Value')\n",
    "plt.xlabel('Metric')\n",
    "plt.ylim(0, 1)\n",
    "\n",
    "# 显示图形\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Split the softmax scores into calibration and validation sets (save the shuffling)\n",
    "idx = np.array([1] * n + [0] * (smx.shape[0]-n)) > 0\n",
    "np.random.shuffle(idx)\n",
    "cal_smx, val_smx = smx[idx,:], smx[~idx,:]\n",
    "cal_labels, val_labels = labels[idx], labels[~idx]\n",
    "# Yhat, Phat\n",
    "cal_yhats = np.argmax(cal_smx, axis=1); val_yhats = np.argmax(val_smx, axis=1)\n",
    "cal_phats = np.max(cal_smx, axis=1); val_phats = np.max(val_smx, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.534"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Define selective risk\n",
    "def selective_risk(lam): \n",
    "    return (cal_yhats[cal_phats >= lam] != cal_labels[cal_phats >= lam]).sum()/(cal_phats >= lam).sum()\n",
    "def nlambda(lam): \n",
    "    return (cal_phats > lam).sum()\n",
    "def invert_for_ub(r,lam): \n",
    "    return binom.cdf(selective_risk(lam)*nlambda(lam),nlambda(lam),r)-delta\n",
    "# Construct upper boud\n",
    "def selective_risk_ub(lam): \n",
    "    return brentq(invert_for_ub,0.1,0.9999,args=(lam,))\n",
    "# Make sure there's some data in the top bin.\n",
    "lambdas = np.array([lam for lam in lambdas if nlambda(lam) >= 50]) \n",
    "# Scan to choose lamabda hat\n",
    "for lhat in np.flip(lambdas):\n",
    "    # print(lhat)\n",
    "    if selective_risk_ub(lhat-1/lambdas.shape[0]) > alpha: break\n",
    "# Deploy procedure on test data\n",
    "predictions_kept = val_phats >= lhat\n",
    "lhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "nctid: NCT02565628 | Probability: 0.5692 | Prediction: 1 | Label: 0 | Abstained: False\n",
      "nctid: NCT02565628 | Probability: 0.5064 | Prediction: 1 | Label: 0 | Abstained: True\n",
      "nctid: NCT02565628 | Probability: 0.3791 | Prediction: 0 | Label: 1 | Abstained: False\n",
      "nctid: NCT02565628 | Probability: 0.6734 | Prediction: 1 | Label: 1 | Abstained: False\n",
      "nctid: NCT02565628 | Probability: 0.3983 | Prediction: 0 | Label: 0 | Abstained: False\n",
      "nctid: NCT02565628 | Probability: 0.5559 | Prediction: 1 | Label: 1 | Abstained: False\n",
      "nctid: NCT02565628 | Probability: 0.4414 | Prediction: 0 | Label: 0 | Abstained: False\n",
      "nctid: NCT02565628 | Probability: 0.6434 | Prediction: 1 | Label: 0 | Abstained: False\n",
      "nctid: NCT02565628 | Probability: 0.3745 | Prediction: 0 | Label: 0 | Abstained: False\n",
      "nctid: NCT02565628 | Probability: 0.3876 | Prediction: 0 | Label: 0 | Abstained: False\n"
     ]
    }
   ],
   "source": [
    "train_csv = pd.read_csv(test_file, delimiter=',')\n",
    "nctids = list(train_csv['nctid'])\n",
    "\n",
    "_ncts = []\n",
    "_keeps = []\n",
    "_yhats = []\n",
    "_labels = []\n",
    "_smx = []\n",
    "\n",
    "for i in range(10):\n",
    "    rand_nct = np.random.choice(nctids)\n",
    "    _ncts.append(rand_nct)\n",
    "    # print(rand_nct, nctids.index(rand_nct))\n",
    "    idx = nctids.index(rand_nct)\n",
    "    _smx.append(smx[idx][1])\n",
    "    _keeps.append(np.max(smx[idx]) >= lhat)\n",
    "    _yhats.append([np.argmax(smx[idx])])\n",
    "    _labels.append(labels[idx])\n",
    "\n",
    "for i in range(len(_ncts)):\n",
    "    print(f\"nctid: {rand_nct} | Probability: {_smx[i]:.4f} | Prediction: {_yhats[i][0]} | Label: {_labels[i]} | Abstained: {~_keeps[i]}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def selective_risk2(lam): \n",
    "    return (val_yhats[val_phats >= lam] != val_labels[val_phats >= lam]).sum()/(val_phats >= lam).sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Kn+D6/D38bx9fHyoU6dOpRxLuDe1Wk3z5s1p3rx5jR0C7EZo/IOpP/Z9AjsNspfl7voWxWJ2YVQ1h8xeUA0NGDCAlJQU+/KWLVuYNGkSjRs35vjx4yQkJPDmm28yePBgZs+ezY8//ojBYMDPz4+ePXsyefJkQkNDATh//jwzZsxg27ZtWCwWunbtyr///W/S0tIcBla+dGT6uLg4AHJycpgzZw4//fQT2dnZtG7dmhdffJHu3bsDpbMQ7N+/n169evH555+TnZ1Nhw4dmDJlCk2bNr3se3vooYeIiopi+vTpWCwWJkyYwMGDB/nss89o2LAh6enpTJ8+ne3bt6PRaOjUqROvvvqq/andV199FZPJREhICGvWrMHb25uhQ4cyYcIEvLy8HM5dt27dWLZsWZkYPOVzItyPYjWTNO9J+xOYKi9fGj47H41f5bTaiFI1YtC6gmM7yd62Epup2CXHV3v5UuuWkQS06ll+ZWDVqlU888wzRERE8Nprr9mT1tdff83MmTOJjo6mTp06zJgxg59//pnp06cTFRVFXFwckyZNYv78+bz22mtYLBYee+wxtFotsbGxhISEMH36dMaMGcP333/PvHnzeP755/n6669p0aKFw5W41Wrlsccew2w2M3PmTEJDQ/nss894/PHHWbFiBe3btwdg3759eHt7s3DhQsxmMy+//DJTpkzhs88+u+p7tFqtvPzyyxw+fJhly5bRoEEDioqKeOihh2jTpg2ff/45arWaTz/9lH/+859899131K1bFyi999uvXz9WrlxJcnIyr732GsXFxUyZMoVVq1Zx9913M2TIEBmgQFQ7Ko2OOv/3LOmrZ6JYzSimYhJnP0pgp1vxql0frzoN8WncDpVK5epQPUqNSHS5u9Zizkwpv2IlsQK5v6295kQXGhqKTqcr05TYqlUr7rzzTvtyu3btGDx4MF27dgUgKiqKXr16ER8fD8CuXbuIi4tj48aNNGnSBCjt8rF06VIKCgoIDg62H+/vVza//vorR44c4bvvvqNFixYATJkyhUOHDrF48WLmzCntL2SxWJgxY4Z9X/fffz8zZ8686vuz2WxMmjSJP//8k2XLlhEVFQXA999/T15eHjNnzrQPHPzOO++we/duvvrqK55//nmgdDSemTNn4uvrS4sWLTAYDLzzzju89NJLhIaGotFo8PPzk/vAolry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",
      "text/plain": [
       "<Figure size 500x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lambdas = np.linspace(0.3,0.7,1001)\n",
    "sns.set_theme(style='white')\n",
    "selective_accuracy_curve = [1-selective_risk2(lam) for lam in lambdas]\n",
    "fraction_kept_curve = [(val_phats >= lam).mean() for lam in lambdas]\n",
    "fig, axs = plt.subplots(1,1,figsize=(5,3))\n",
    "axs.plot(lambdas,selective_accuracy_curve,label='accuracy',linewidth=2)\n",
    "axs.plot(lambdas,fraction_kept_curve,label='fraction kept',linewidth=2)\n",
    "axs.axvline(x=lhat,linewidth=1.5,linestyle='--',label=r'$\\hat{\\lambda}$',color='gray')\n",
    "axs.axhline(y=1-alpha,linewidth=1.5,linestyle='dotted',label=r'$1-\\alpha$',color='gray')\n",
    "sns.despine(ax=axs,top=True,right=True)\n",
    "axs.legend(loc='lower left')\n",
    "axs.set_xlabel(r'$\\lambda$')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAGMCAYAAABK5xPFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABcIUlEQVR4nO3deXhM5///8edkTxCpJYKoEB9BbLEWsUUtVVS1WrVXbUVTFKVVItTeqqVokFpKUSLWVquLttpai6KopRpLBBFbZJ35/ZFf5muaWKJJRszrcV25LrnPfc55nxlJXnOfc+5jMJlMJkRERETEZthZuwARERERyV0KgCIiIiI2RgFQRERExMYoAIqIiIjYGAVAERERERujACgiIiJiYxQARURERGyMAqCIiIiIjVEAFBEREbExCoAicl/dunXDz8/P4qty5co0adKEcePGce3aNYu+3bp1s2K19/fvGnfu3Imfnx87d+68ax8RkceJg7ULEJG8oVKlSowdO9b8fXJyMocPH+bDDz/kzz//5PPPP8dgMFixQhEReVAKgCLyQPLnz0/16tUt2mrXrs2tW7eYNWsWBw4cyLBcREQeTToFLCL/SeXKlQE4f/68uc1kMrFgwQKaNGlC1apVefnllzl48KDFetu2baNz584EBARQuXJlWrVqxfLlyy36LFmyhFatWlGlShUaNmxISEgIN2/eNC83Go2EhYXRvHlzKleuTMuWLVm2bFkOHq2IyONBI4Ai8p+cPn0agFKlSpnb9u7dS1JSEu+99x4pKSlMnjyZ119/ne3bt+Pg4MAPP/zAwIED6d69O2+88QYJCQmsWLGC0NBQKleuTLVq1di0aRPTpk3j7bffxs/Pj1OnTjFlyhRu377NlClTAAgJCSEiIoJ+/foREBDA7t27mThxItevX2fgwIFWeT1ERPICBUAReSAmk4mUlBTz99euXWPXrl3MmzfPPIqXzsnJibCwMDw8PAC4fv06o0eP5sSJE1SoUIETJ07w/PPP8+6775rXCQgIoG7duuzcuZNq1aqxa9cuvL296dKlC3Z2dtSpUwc3NzfzDSenT59m9erVDB06lL59+wIQGBiIwWDgk08+oXPnzjzxxBO58MqIiOQ9CoAi8kB2796Nv7+/RZudnR3169cnNDTU4gaQcuXKmcMfgLe3NwA3btwAoHfv3gDcunWL06dP888///DHH38AkJSUBMBTTz3FqlWr6NChA08//TSNGzembdu25v389ttvmEwmgoKCLIJpUFAQ8+bNY+/evTz99NPZ/CqIiDweFABF5IH4+/szbtw4AAwGA87OzhQvXpz8+fNn6Ovm5mbxvZ1d2uXGRqMRgNjYWMaOHcu2bdswGAyULl2aWrVqAWkjjQCtW7fGaDSyYsUK5s6dy+zZsylZsiTDhg2jdevWxMXFAfDss89mWu/Fixf/+0GLiDymFABF5IHky5ePKlWqZMu2hg0bxqlTp1i8eDEBAQE4OTlx+/ZtVq9ebdGvTZs2tGnThhs3bvDzzz+zYMEChg8fTs2aNXF3dwfSbhTJly9fhn2UKFEiW2oVEXkc6S5gEcl1e/fupUWLFtStWxcnJycAfvzxR+D/RgkHDx5svpGjQIECPPPMMwwYMICUlBRiYmLMI4ZXr16lSpUq5q/Y2FhmzpxpHiEUEZGMNAIoIrmuatWqbNy4EX9/f7y8vNi3bx9hYWEYDAZu374NpF0DOHbsWKZMmUKjRo24fv06c+bMwcfHhwoVKuDo6Ei7du147733OHfuHJUrV+b06dPMmDEDb29vfHx8rHuQIiKPMAVAEcl1kydPZvz48YwfPx4AHx8fxo0bx4YNG9izZw8AnTp1Ijk5mZUrV7JixQpcXFyoV68ew4cPx9HREYBJkybxySefsHLlSqKjoylcuDCtW7dm8ODB2NvbW+34REQedQZT+hXXIiIiImITdA2giIiIiI1RABQRERGxMY9UAPzkk0/o1q3bPftcvXqVt956i9q1a1OnTh3GjRtnvmhcRERERO7vkbkJZPny5Xz00UfmqR3uJjg4mNu3b7N48WKuX7/Ou+++S3x8vPnZoCIiIiJyb1YPgBcvXmTs2LHs3LnzvtM2/P777+zatYstW7bg6+sLQGhoKL1792bo0KEUK1YsFyoWERERydusfgr48OHDODo6smHDBqpVq3bPvnv27KFo0aLm8AdQp04dDAYDe/fuzelSRURERB4LVh8BDAoKIigo6IH6Xrx4keLFi1u0OTk54eHhwYULFx5q/7Vq1SIpKYmiRYs+1PoiIiK26tKlSzg5OZnn75S8w+oBMCtu375tfmzUnZydnUlMTHyobSYmJpKamvpfSxMREbE5KSkpaDrhvClPBUAXFxeSkpIytCcmJuLm5vZQ2/T09ATg22+//U+1iYiI2JpmzZpZuwR5SFa/BjArvLy8iImJsWhLSkoiLi7OHORERERE5N7yVACsXbs20dHRnDlzxty2a9cuAGrWrGmtskRERETylEc6AKampnLp0iUSEhIAqFatGjVq1GDIkCEcPHiQ3377jTFjxtC+fXtNASMiIiLygB7pAHjhwgUCAwPZsmULAAaDgTlz5uDt7U2PHj0YPHgwjRo1IiQkxLqFioiIiOQhBpON376TfgGrbgIRERHJGv0Nzbvy1F3AIiIikjelpqaSnJxs7TIeW46Ojtjb2z9wfwVAERERyTEmk4no6Gji4uKsXcpjz8PDAy8vLwwGw337KgCKiIhIjkkPf56enri5uT1QOJGsMZlMxMfHm6fK+/dT0zKjACgiIiI5IjU11Rz+ChcubO1yHmuurq4AxMTE4Onped/TwY/0XcAiIiKSd6Vf8/ewT+uSrEl/nR/kWksFQBEREclROu2bO7LyOisAioiIiNgYBUARERHJdUajdaYhzq39RkRE4Ofn98D9Z8+eTVBQUA5WZEk3gYiIiEius7Mz8PHnOzgXcy3X9lnSsyADX2mQK/tq3bo1DRs2fOD+vXr1okuXLjlYkSUFQBEREbGKczHX+PvcVWuXkSNcXFxwcXF54P758uUjX758OViRJZ0CFhEREbmPuLg4xo0bR+PGjalatSqdOnVi586dQNrp265duzJkyBBq1KjB+PHjM5wCjo2NZciQIdSqVYu6desyffp0unfvzuzZs83bSD8FfPbsWfz8/Ni6dSsdO3akcuXKBAUFsWrVqmw7HgVAERERkXtITU2lV69e7Nmzh2nTphEREUH58uV57bXXOHjwIAC7d++mSJEirF+/nm7dulmsbzQa6devH2fOnGHhwoWEh4ezf/9+du3adc/9Tpo0if79+/Pll1/SpEkTQkJCiIqKypZjUgAUERERuYeff/6Zw4cP88EHH1CnTh3KlSvHuHHj+N///seiRYvM/YKDgylVqhQ+Pj4W6+/atYuDBw8yffp0qlevjr+/Px999BFOTk733G/Pnj1p1qwZpUqVYsiQIRiNRg4cOJAtx6QAKCIiInIPx48fp0CBApQvX97cZjAYqFWrFsePHwegcOHCFChQINP1jxw5QsGCBSlbtqy5rUiRIpQpU+ae+/X19TX/O33bDzLJ84NQABQRERG5B5Mp86ljTCYTDg5p99Pe64YPe3t7jEZjlveb2Qjh3WrJKgVAERERkXvw8/Pjxo0b5tE+SAtie/fupVy5cvddv0KFCty4cYOTJ0+a265evcqZM2dypN4HoQAoIiIicg+BgYFUrFiRt956i127dnHy5ElCQ0M5fvw4PXr0uO/6devWpVq1aowYMYL9+/dz9OhRhg0bxu3bt632mDzNAygiIiJWUdKzYJ7Yn729PeHh4UyZMoVBgwaRlJRE5cqVWbx4MdWrV+enn3667zZmz55NaGgoPXv2xNnZmc6dO3Pq1CkcHR0fqqb/ymDKrpPJeVSzZs0A+Pbbb61ciYiISN5yv7+hCQkJnD59mjJlymS4Rs5oNGFnl/ujX9bYb2xsLAcOHCAwMNAc+JKSkqhbty5jx46lffv22bKfe73e/6YRQBEREcl11gh/1tqvg4MDQ4YMoVOnTrzyyiskJyezaNEinJycaNSoUa7XA7oGUERERCRHubu7M3/+fPbv30/79u15+eWXuXz5MkuXLqVQoUJWqUkjgCIiIiI57KmnnmLlypXWLsNMI4AiIiIiNkYBUERERMTGKACKiIiI2BgFQBEREREbowAoIiIiYmMUAEVERERsjAKgiIiIiI1RABQREZFcZzIabWq/jxpNBC0iIiK5zmBnx+lNC7h95UKu7dO1cHHKtOmTa/t7lCkAioiIiFXcvnKB2xf/sXYZNkmngEVERETu49atW4wfP57AwEACAgLo2rUrhw4dIiIigkaNGrF69WrzsoEDB3Lx4kVrl3xPCoAiIiIi9zF48GB+/PFHJk2aRGRkJKVKlaJXr15cv36d2NhYlixZwkcffcSSJUu4cOECvXv3JiUlxdpl35VOAYuIiIjcw6lTp/jxxx9ZtGgRgYGBAISEhODu7o6bmxvJyclMmTKFypUrAzBt2jRat27Nr7/+SsOGDa1Z+l1pBFBERETkHo4fPw5A9erVzW3Ozs6MGjUKBwcH8uXLZw5/AL6+vhQsWNC83qNIAVBERETkHhwc7n3C1NHRMUNbamoq9vb2OVXSf6YAKCIiInIPvr6+APzxxx/mtpSUFIKCgrh69SpxcXFERUWZl/3111/cvHmTSpUq5XqtD0rXAIqIiIhVuBYunif2V6ZMGVq0aMG4ceMICQmhWLFihIWFkZiYaO4zfPhwRo8eTUpKCuPGjSMgIIDatWtnV+nZTgFQREREcp3JaLTKpMwmoxGDXdZPgE6cOJGpU6fy5ptvkpSURLVq1Vi0aBFHjhwBoG3btvTt25ekpCSCgoJ49913MRgM2V1+tlEAFBERkVz3MCHMmvstUKAA48ePZ/z48Rbt6QGwS5cudOnS5T/Xl1t0DaCIiIiIjVEAFBEREbExCoAiIiIiD6lDhw4cO3bM2mVkmQKgiIiIiI1RABQRERGxMQqANiwxMZF33nmHWrVqERgYSHh4eKb9unXrhp+fX4avUaNGmfssX76cJk2aUKNGDYKDg4mLizMvW7x4cYZ1p0yZYl7++eef06xZM2rUqMFrr71mMZmmiIjkfSaTydol2ISsvM6aBsaGTZ06lUOHDrFkyRLOnz/P22+/TYkSJWjVqpVFv9mzZ5OcnGz+/sCBAwwePJjOnTsDsGXLFqZOncrUqVMpU6YM7777LqGhoXz44YcAnDhxgs6dOzNgwADzNlxdXQH46aefmDZtGh988AE+Pj58+OGHDBw4kA0bNuT04YuISA5Lf0RafHy8+fe+5Jz4+Hgg80fT/ZsCoI2Kj4/niy++YMGCBfj7++Pv789ff/3F8uXLMwRADw8P879TU1OZMWMGvXv3pkqVKgAsWLCAPn360LJlSwBGjBjBuHHjzM9BPHnyJO3bt6do0aIZ6ti+fTuBgYE0bdoUgEGDBtGuXTtiY2MpVKhQDh29iIjkBnt7ezw8PIiJiQHAzc3tkZ4cOa8ymUzEx8cTExODh4fHAz2D2OoB0Gg0MmfOHL744gtu3LhB7dq1GTNmDKVKlcq0/5UrV5g4cSI7duzAZDJRv359Ro4cSbFixXK58rzt6NGjpKSkEBAQYG6rWbMm8+fPx2g0YneXiTIjIiK4du0affqkzd5+8+ZNjhw5wuTJk819ateuzaZNm8zfnzp1Ch8fn0y35+HhwebNmzl58iSlS5cmMjKSkiVLUrBgwWw4ShERsTYvLy8AcwiUnOPh4WF+ve/H6gFw7ty5rFixgsmTJ+Pl5cW0adPo3bs3GzduxMnJKUP/wYMHk5KSwqefforJZGLcuHEMHDiQNWvWWKH6vOvSpUs88cQTFq9xkSJFSExMJC4uLtPRN5PJxMKFC+nevTv58uUDMF+vFxsbS6dOnTh79iwNGjTg3Xffxd3dncuXLxMXF8e6desYNWoUzs7OvPjii/Tq1QuDwUC3bt349ddfad26Nfb29ri6urJ8+fIH+vQiIiKPPoPBQPHixfH09LS4nEiyl6OjY5b+dlo1ACYlJREeHs6wYcNo0qQJADNmzKBhw4Z8/fXXtGnTxqL/9evX2bVrF/PmzaNixYoA9O3blwEDBhAXF2dxqlLu7fbt2xkCdvr3SUlJma6zc+dOoqOjeemll8xtt27dAiA0NJRhw4bh4eHB+++/z4gRI5g/fz6nTp0CoHDhwsybN48///yTCRMmYG9vT8+ePYmJiSExMZHp06dTunRp5s6dy/Dhw1mzZg3Ozs45cegiImIF9vb2+nD/CLFqADx69Ci3bt2iXr165jZ3d3cqVarE7t27MwRAFxcX8uXLR2RkJHXq1AFg/fr1lClTBnd391ytPa9zdnbOEPTSv3dxccl0na1bt9KoUSOLoO3gkPZfqG/fvjRr1gyA999/n/bt23Px4kXq1KnDb7/9xhNPPAGAn58fsbGxfP755/Ts2ZOxY8fSokUL2rZtC8AHH3xAkyZN+Pbbb2ndunW2HrOIiIikseo0MNHR0QAUL17cot3T09O87E5OTk5MnjyZXbt2UatWLWrXrs2BAwdYsGDBXa9Zk8wVK1aMq1evkpKSYm67dOkSLi4udw3TP/30kznkpUu/saNs2bLmtjJlygD/9/6mh790vr6+XLx4EYDDhw9ToUIF87J8+fJRunRpzp0797CHJiIiIvdh1dR0+/ZtgAynIp2dnUlMTMzQ32Qy8eeffxIQEMDy5ctZsmQJJUqUYMCAAdy8eTNXan5cVKxYEQcHB/bv329u27t3L1WqVMk0TMfGxhIVFUXNmjUt2kuUKIGnpydHjx41t508eRKDwUCJEiX44osvaNmypcXcRH/++ac5MHp6enLy5EnzsqSkJM6ePYu3t3d2HaqIiIj8i1UDYPqpxn+fikxMTMx0vqAvv/ySzz77jGnTplGzZk3q1KnD/PnzOXfunG4CySJXV1fat29PSEgIBw8eZNu2bYSHh9O9e3cgbTQwISHB3P+vv/7C2dk5QzAzGAz07NmTWbNmsWPHDo4ePUpISAhPP/00RYsWpX79+ly6dIkpU6Zw5swZNm/ezIIFC+jduzcAHTt2ZP78+Xz//fecOnWK9957j3z58hEUFJR7L4aIiIiNseo1gOmnfmNiYnjyySfN7TExMfj5+WXov2fPHsqUKUP+/PnNbQULFqRMmTKcOXMm5wt+zIwaNYqQkBB69OhB/vz5eeONN2jRogUAgYGBTJo0iQ4dOgBp0++4u7tnOn9Tr169SExMZMSIEcTHxxMUFERISAgAJUuWJCwsjGnTpvH5559TuHBhhg0bZr6+77XXXgNgwoQJxMXFERAQwOLFi3UDiIiISE4yWVFiYqKpRo0aptWrV5vbrl27Zqpatapp06ZNGfp/8sknpjp16pgSEhLMbbdu3TLVqVPHtHjx4oeqISgoyBQUFPRQ64o8ShISEkyjRo0y1axZ09SgQQPTokWLMu3XtWtXU/ny5TN8jRw50mQypf1Mvfvuu6Y6deqYatWqZRo9erTp5s2bD7yf8ePHZ9j2smXLcu7AH1PZ9X4mJiaaJk+ebGrYsKGpVq1apgEDBpguXLhgXv/8+fOmvn37mgICAkxNmzY1ffrpp5nuJyoqylS9enXTb7/9lu3HKnmX/obmXVYdAXRycqJr165Mnz6dQoUKUbJkSaZNm4aXlxctWrQgNTWV2NhYChQogIuLC+3bt2fRokUMHjyYN998E4CPPvoIZ2dn80iViK3Krkf7TZw4kUOHDrFo0SIMBgPvvPMOkydPZvz48Q+0n5MnT/LWW2/x/PPPm/dx56i9PJjsej9nzZrFtm3bzL9np02bxqBBg/jiiy8wGAwMHjyYEiVKEBERwYkTJxg2bBglS5akefPmFvsJCQkxP2ZKRB4D1k6gKSkppqlTp5qeeuopU/Xq1U19+vQxRUVFmUymtE+c5cuXN61du9bc/8SJE6Z+/fqZ6tSpY3rqqadMgwYNMvd/GPr0Io+DW7dumapUqWIxOvPxxx+bunbtes/1UlJSTK1btzbNmDHD3BYSEmLas2eP+fslS5aYnnnmmQfeT8OGDU0//fTTfz0km5ad72f9+vVNmzdvNn9/8eJFU/ny5U2nT582xcXFmcqXL286duyYefmgQYNM48aNs9ju+vXrTZ06dTKVL19eI4BiQX9D8y6rPwnE3t6e4cOHM3z48AzLvL29OXbsmEWbr68v8+fPz63yRPKE7Hq0H8DYsWPN/z579iybNm0yz7t5v/3Ex8dz8eLFuz76Tx5Mdr2fRqORadOmUalSpQx9b9y4QfHixXF1dSUiIoK33nqLqKgo9u3bx+DBg839rl69yrRp0wgPD88wN6uI5F2aPE/kMXC/R/tlxpTJo/3u9Pbbb9OsWTMuX77MwIEDH2g/6VMAzZ8/n0aNGtGuXTvWrVuXvQdrA7Lr/bSzs6N+/foWk7cvXbqUJ554Aj8/P5ydnRkzZgyrVq2iWrVqPPPMMzRq1IiOHTua+0+ePJnnn3+e//3vfzlyrCJiHQqAIo+B7Hq035369OnDqlWrKFmyJH369MFoNN53P6dOncJgMFC2bFnCwsLo2LEj7733Ht98881/PUSbkhPvJ2Ce7umtt94yb+/kyZM0bdqUVatWMWnSJL766is2bNgAwC+//MLevXsZMGBAdhyWiDxCrH4KWET+u+x6tN+dypUrB/zf87l379593/20b9+epk2bmrdZoUIF/v77bz7//PMMNxXI3eXE+7lt2zYGDx5M165dzSN8v/76K2vWrGH79u24uLhQpUoVLl68yLx582jRogVjxoxh7Nixd92niORdGgEUeQxk16P9kpKS2Lp1q8WTdYoUKYKHhwdXr169734MBkOGAFK2bFnzo//kwWTX+5lu8+bNvPnmm7z88su888475vZDhw5RunRpi4BXqVIlzp8/z8GDB4mKiiI4OJiAgADz9Yh9+vRhzJgx2XGYImJFCoA2xGQ0WruEh5aXa88N2fVoPzs7O0aOHMkPP/xgbjt//jxXr17F19f3vvuZOXMmPXv2tNjm0aNHLZ4VLfeXXe8npI3yjRgxgi5duvDee+9ZLPP09OTMmTMWo42nTp3C29ubqlWr8vXXXxMZGWn+grRJ29On4RKRvEungG2Iwc6O05sWcPvKBWuXkiWuhYtTpk2f+3e0YXc+2m/ixInExMQQHh7OpEmTgLTRo/T5NOHuj/ZzcHDg5Zdf5sMPP8TLywsXFxfGjx9Ps2bNzDcB3Gs/TZs2JSwsjEWLFtG8eXN+/vlnIiMjWbp0aS6+Gnlfdr2fKSkpvPPOO9SuXZs+ffpw6dIl87KCBQsSFBTEtGnTGD16NK+//jqnT59m/vz5DBkyBBcXF0qXLp2htmLFilG4cOEcPHoRyQ0KgDbm9pUL3L74j7XLkByQXY/2Gzp0qHmC4Pj4eFq0aMHo0aMfaD9Vq1Zl5syZzJo1i5kzZ1KyZEk++OADi+lM5MFkx/t56NAhzp8/z/nz5wkMDLRYtnTpUurWrcvixYt5//33efHFFylUqBCvv/46L7/8cu4cpIhYjcFkMpmsXYQ1pV8z8+2331q5ktxxZElonguArsWepFIPXXMkIvKosbW/oY8TXQMoIiKSCxITE3nnnXeoVasWgYGBhIeH37XvsWPHeOWVV6hatSpt27blt99+My9LTk5m2rRpBAYG8tRTTzFlyhSLG4bSJSUl0aZNG3bu3GnRvn//fjp16kRAQAAtW7bkiy++yL6DlDxDAVBERCQX3Pl857FjxzJnzhy++uqrDP1u3LhBr169KFeuHBs3bqR58+YMGjSIK1euAGnPd46MjOT9999n0aJF/Prrr0yePNliG4mJiQwdOpS//vrLov3SpUv06dOHOnXqsG7dOoKDgxk/frzFjV9iGxQARUREclh8fDxffPEF7777Lv7+/jRv3pzevXuzfPnyDH3XrVuHm5sbISEhlC5dmuDgYEqXLs2hQ4cwmUwsX76coUOH0rhxY/z9/Rk3bhwrV67k1q1bAJw4cYKXXnqJf/7JeLnPtm3bKFKkCEOHDsXHx4dnn32W9u3bs3Hjxhx/DeTRogAoIiKSw+72fOcDBw5g/Nc0V7t27aJZs2bY29ub29auXUvjxo2JjY3l1q1bVKtWzbzMz8+P5ORkDh06ZF6/bt26rFq1KkMdDRs2NN9Nfqc75/4U26AAKCIiksOy8nznqKgoChUqxHvvvUeDBg146aWX2Lt3L5A2fY+jo6PF5OoXLqRN7XX16lUAOnfuzDvvvIOrq2uGOry9valevbr5+ytXrrB582bq1auXXYcqeYQCoIiISA7LyvOd4+PjCQsLo2jRoixYsIDatWvz2muvceHCBRwcHGjevDkffvgh0dHR3LhxgylTpuDg4EBycnKWakpISOCNN96gSJEimvrHBikAioiI5LCsPN/Z3t6eihUrEhwcTKVKlRg+fDg+Pj6sX78egNGjR5MvXz4aN25Mo0aNqFGjBgULFiR//vwPXM+tW7fo168ff//9N5988kmmo4XyeNNE0CJ5mMloxJDJo8EedXm1bpGHdefznR0c0v703u35zkWLFs3w+EQfHx/zqd7ChQuzdOlS4uLicHZ2xmQy8cEHH1CyZMkHquXmzZv07t2bf/75hyVLluDj4/PfD1DyHAVAkTwsLz7eT4/2u7u8Gozzat256c7nO9eqVQu4+/Odq1evzu7duy3aTp06RZs2bQAYPnw4zz33nPnpLl9++SWFCxemXLly963DaDQyaNAgzp49y7Jly/D19c2Ow5M8SAFQJI/T4/0eHwr0j6+sPN+5U6dOfPbZZ8yePZt27doRGRlJVFQUzz33HAAeHh7MmDEDT09Prl69yvjx4+nbt2+GIJmZNWvWsHPnTubNm4e7u7v5+dCOjo54eHjk2PHLo0cBUETkEaJA//h60Oc7lyxZkoULF/L+++8TFhaGr68vYWFhFCtWDIDBgwczbtw4OnfujJubGz179qRnz54PVMPWrVsxGo3069fPor1OnTosW7YsW49XHm0KgCIiIrnA1dWVKVOmMGXKlAzLjh07ZvF9zZo1iYiIyHQ7+fLlY+rUqQ+0z39vd9GiRQ9YrTzudNGGiIiIiI1RABQRERGxMQqAIiIiIjZGAVBERETExigAioiIiNgYBUARERERG6MAKCIiImJjFABFRERygMlotHYJDy0v1y4PRhNBi4iI5IC8+Gg/0OP9bIUCoIiISA7Ro/3kUaVTwCIiIiI2RgFQRERExMYoAIqIiIjYGAVAERERERujACgiIiJiYxQARURERGyMAqDIvyQmJvLOO+9Qq1YtAgMDCQ8Pv2vfY8eO8corr1C1alXatm3Lb7/9ZrF88eLFNGzYkICAAN555x1u3779wPv56aefaNeuHVWrVqVdu3Zs3749ew9URERslgKgyL9MnTqVQ4cOsWTJEsaOHcucOXP46quvMvS7ceMGvXr1oly5cmzcuJHmzZszaNAgrly5AsDWrVuZM2cOoaGhLFmyhAMHDjBt2rQH2s+ZM2cYNGgQHTp0YPPmzTz//PMMHDiQs2fP5s6LICIijzUFQJE7xMfH88UXX/Duu+/i7+9P8+bN6d27N8uXL8/Qd926dbi5uRESEkLp0qUJDg6mdOnSHDp0CIClS5fSo0cPmjZtStWqVRk3bhxr167l9u3b991PdHQ0L730Ej179qRUqVK8+uqruLm5cfDgwVx9PURE5PGkJ4GI3OHo0aOkpKQQEBBgbqtZsybz58/HaDRiZ/d/n5l27dpFs2bNsLe3N7etXbsWgNTUVP744w8GDRpkXla9enWSk5M5evQoJpPpnvupW7cudevWBSA5OZnIyEiSkpKoWrVqjh27iIjYDo0Aitzh0qVLPPHEEzg5OZnbihQpQmJiInFxcRZ9o6KiKFSoEO+99x4NGjTgpZdeYu/evQBcv36dxMREPD09zf0dHBzw8PAgOjr6gfdz5swZqlWrxujRoxkwYADe3t45c+AiImJTFABF7nD79m2LUAaYv09KSrJoj4+PJywsjKJFi7JgwQJq167Na6+9xoULF0hISLBY985tJSUlPfB+ChUqxJo1axgzZgyzZ89m69at2XOgIiJi03QKWOQOzs7OGYJe+vcuLi4W7fb29lSsWJHg4GAAKlWqxI4dO1i/fj0vvfSSxbp3bsvV1ZXU1NQH2k+BAgWoVKkSlSpV4uTJk3z22We0bNkyG45URERsmUYAs0FWpg15/fXX8fPzs/j6/vvvOXv2bIb29K/du3cDcO3aNd566y0CAgJo1KgRS5cutdh2u3btMqx7/PjxHD32x02xYsW4evUqKSkp5rZLly7h4uKCu7u7Rd+iRYtStmxZizYfHx8uXLiAh4cHzs7OXL582bwsJSWFuLg4ihYtet/9/PXXX+zZs8di276+vly9ejU7D1dERGyURgCzwZ3TeZw/f563336bEiVK0KpVqwx9T548ybRp06hXr565rWDBgtjb2/Pzzz9b9J08eTJnzpyhevXqALz11lvcuHGDVatWcerUKUaMGEGZMmVo2LAhqamp/P3333z22Wf4+PiYt/HEE0/kyDE/ripWrIiDgwP79++nVq1aAOzdu5cqVapY3AACaTd1pIfzdKdOnaJNmzbY2dlRpUoV9u7da76ZY//+/Tg4OFChQgWAe+7n+++/JyIigi+//BKDwQDA4cOHMwROERGRh6ERwP8oK9OGJCUlcfbsWapUqULRokXNX05OTtjb21u0RUVFsXXrVqZMmYKjoyNHjx7ll19+Yfr06ZQvX55WrVrx4osvsm/fPgDOnj1LcnIyVatWtdiOg4Myfla4urrSvn17QkJCOHjwINu2bSM8PJzu3bsDaaN06df3derUiWPHjjF79mzOnDnDzJkziYqK4rnnngOgc+fOLFq0iG3btnHw4EFCQkJ46aWXcHV1ve9+2rVrx6VLl5g+fTp///03y5cvZ8OGDfTr1886L0wellsj9CdPnqRXr17UqFGDoKAg8x3d6TZs2EDLli2pWrUqnTp10pQ+ImJVSgf/UVamDTl16hQGg4FSpUrdd7sffPABL730Er6+vkDalCMVKlSwWHfMmDHmf584cYLixYvj7OycHYdl00aNGkVISAg9evQgf/78vPHGG7Ro0QKAwMBAJk2aRIcOHShZsiQL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kZyR5QCY2RQvBoOB/Pnz4+fnh51dtp9VFhEREZFslOUAWKdOnZyoQ0RERERyyQMFwFGjRj3wBg0GAxMnTnzogkREREQkZz1QANy5c+cDbzCz6wNFRERE5NHxQAHwu+++y+k6RERERCSXZOsdG/Hx8fz444/ZuUkRERERyWZZvgnk3LlzhISEsGvXLpKSkjLt8+eff/7nwkREREQkZ2Q5AE6aNIl9+/bRsWNH9u3bh6urK9WrV2fHjh0cP36c2bNn50SdIiIiIpJNsnwKePfu3QwZMoTRo0fToUMHnJ2dGT58OGvXrqV27dp8++23OVGniIiIiGSTLAfAW7du4efnB0DZsmU5cuQIAPb29nTu3JnffvsteysUERERkWyV5QDo6enJ5cuXAShdujTXrl3j0qVLAHh4eHDlypXsrVBEREREslWWA2Djxo356KOP+P333ylZsiReXl6Eh4dz8+ZN1q5dS7FixXKiThERERHJJg8UALt168aGDRtITEwkODgYd3d3Zs6cCcCQIUNYsmQJtWvXZuPGjbz66qs5WrCIiIiI/DcPdBdwXFwcI0aMYPz48bRp04axY8eaR/ratWtHiRIl2L9/P1WrVtWzgkVEREQecQ8UADdu3Mjhw4dZt24dW7ZsYeXKlfj5+dGxY0fatm1LrVq1qFWrVk7XKiIiIiLZ4IGvAfT392f06NH8+OOPzJkzh1KlSjF58mQaNmzIsGHDdPeviIiISB6R5YmgHRwcaNasGc2aNePatWts2rSJDRs20LNnT0qVKsULL7xA//79c6JWEREREckG/+lZwAULFqRLly6sWrWKZcuWYW9vb745REREREQeTVkeAbzTpUuX2Lx5M5s2beLw4cMUL16cAQMGZFdtIiIiIpIDshwAb926xddff83GjRvZuXMn9vb2PP300wwZMoT69etjMBhyok4RERERySYPFABTUlLYvn07Gzdu5IcffiAhIYGKFSsyatQo2rZtS8GCBXO6ThERERHJJg8UABs0aMD169dxd3fnhRde4IUXXqBSpUo5XZuIiIiI5IAHCoD+/v688MILNG/eHCcnp5yuSURERERy0AMFwPDw8JyuQ0RERERyyX+aBkZERERE8h4FQBEREREbowAoIiIiYmOsHgCNRiOzZs2iYcOGVK9enT59+hAVFfVA627YsAE/Pz/Onj2bw1WKiIiIPD6sHgDnzp3LihUrGD9+PCtXrsRoNNK7d2+SkpLuud65c+cIDQ3NpSpFREREHh9WDYBJSUmEh4cTHBxMkyZNqFChAjNmzCA6Opqvv/76rusZjUaGDx+Ov79/LlYrIiIi8niwagA8evQot27dol69euY2d3d3KlWqxO7du++63vz580lOTqZfv365UaaIiIjIYyXLzwLOTtHR0QAUL17cot3T09O87N8OHjxIeHg4a9as4eLFizleo4iIiMjjxqojgLdv3wbI8HQRZ2dnEhMTM/SPj49n2LBhDBs2DB8fn9woUUREROSxY9UA6OLiApDhho/ExERcXV0z9J8wYQJlypShU6dOuVKfiIiIyOPIqqeA00/9xsTE8OSTT5rbY2Ji8PPzy9B/7dq1ODk5ERAQAEBqaioAbdq0oX///vTv3z8XqhYRERHJ26waACtUqED+/PnZuXOnOQBev36dI0eO0LVr1wz9/31n8IEDBxg+fDhhYWGUL18+V2oWERERyeusGgCdnJzo2rUr06dPp1ChQpQsWZJp06bh5eVFixYtSE1NJTY2lgIFCuDi4kLp0qUt1k+/UaREiRJ4eHhY4QhERERE8h6rTwQdHBzMiy++yOjRo3nllVewt7dn0aJFODo6cuHCBQIDA9myZYu1yxQRERF5bFh1BBDA3t6e4cOHM3z48AzLvL29OXbs2F3XrVu37j2Xi4iIiEhGVh8BFBEREZHcpQAoIiIiYmMUAEVERERsjAKgiIiIiI1RABQRERGxMQqAIiIiIjZGAVBERETExigAioiIiNgYBUARERERG6MAKCIiImJjFABFREREbIwCoIiIiIiNUQAUERERsTEKgCIiIiI2RgFQRERExMYoAIqIiIjYGAVAERERERujACgiIiJiYxQARURERGyMAqCIiIiIjVEAFBEREbExCoAiIiIiNkYBUERERMTGKACKiIiI2BgFQBEREREbowAoIiIiYmMUAEVERERsjAKgiIiIiI1RABQRERGxMQqAIiIiIjZGAVBERETExigAioiIiNgYBUARERERG6MAKCIiImJjFABFREREbIwCoIiIiIiNUQAUERERsTEKgCIiIiI2RgFQRERExMYoAIqIiIjYGAVAERERERujACgiIiJiYxQARURERGyMAqCIiIiIjVEAFBEREbExCoAiIiIiNkYBUERERMTGKACKiIiI2BgFQBEREREbY/UAaDQamTVrFg0bNqR69er06dOHqKiou/b/66+/6Nu3L3Xr1qVevXoEBwdz/vz5XKxYREREJG+zegCcO3cuK1asYPz48axcuRKj0Ujv3r1JSkrK0Pfq1au8+uqruLi4sGzZMhYsWEBsbCy9e/cmMTHRCtWLiIiI5D1WDYBJSUmEh4cTHBxMkyZNqFChAjNmzCA6Opqvv/46Q/9t27YRHx/P1KlTKV++PJUrV2batGmcPHmSffv2WeEIRERERPIeqwbAo0ePcuvWLerVq2duc3d3p1KlSuzevTtD/3r16jF37lxcXFzMbXZ2aYdw/fr1nC9YRERE5DHgYM2dR0dHA1C8eHGLdk9PT/OyO3l7e+Pt7W3RFhYWhouLC7Vr1865QkVEREQeI1YdAbx9+zYATk5OFu3Ozs4PdE3fsmXL+Oyzzxg2bBiFChXKkRpFREREHjdWHQFMP5WblJRkcVo3MTERV1fXu65nMpmYOXMm8+bN4/XXX6dbt245XquIiIjI48KqI4Dpp35jYmIs2mNiYihWrFim6yQnJzN8+HDmz5/PqFGjGDx4cE6XKSIiIvJYsWoArFChAvnz52fnzp3mtuvXr3PkyJG7XtM3YsQIvvrqKz744AN69uyZS5WKiIiIPD6segrYycmJrl27Mn36dAoVKkTJkiWZNm0aXl5etGjRgtTUVGJjYylQoAAuLi5ERESwZcsWRowYQZ06dbh06ZJ5W+l9REREROTerD4RdHBwMC+++CKjR4/mlVdewd7enkWLFuHo6MiFCxcIDAxky5YtAGzatAmAqVOnEhgYaPGV3kdERERE7s2qI4AA9vb2DB8+nOHDh2dY5u3tzbFjx8zfh4eH52ZpIiIiIo8lq48AioiIiEjuUgAUERERsTEKgCIiIiI2RgFQRERExMYoAIqIiIjYGAVAERERERujACgiIiJiYxQARURERGyMAqCIiIiIjVEAFBEREbExCoAiIiIiNkYBUERERMTGKACKiIiI2BgFQBEREREbowAoIiIiYmMUAEVERERsjAKgiIiIiI1RABQRERGxMQqAIiIiIjZGAVBERETExigAioiIiNgYBUARERERG6MAKCIiImJjFABFREREbIwCoIiIiIiNUQAUERERsTEKgCIiIiI2RgFQRERExMYoAIqIiIjYGAVAERERERujACgi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RQ0bNgRg0qRJuvtXskQBMI/7559/MtzFdyd7e3u8vb1zsSIReRCJiYlER0ffs0++fPl0J72I5AgFQBEREREbo2lgRERERGyMAqCIiIiIjVEAFJE8QVeriIhkHwVAEck23bp1w8/Pj06dOt21z5AhQ/Dz87N4csb97N27l759+9633+zZs/Hz83vg7YqI2CrNAygi2crOzo79+/cTHR2Nl5eXxbL4+Hi+//77LG/ziy++4OTJk/ft17FjR/O0GCIicncaARSRbFWpUiWcnZ356quvMiz7/vvvcXV1pVixYjmy7/RnsoqIyL0pAIpItnJzc6Nx48aZBsAtW7bQsmVLHBz+7+SD0WgkLCyM5s2bU7lyZVq2bMmyZcvMy0eOHMm6des4d+4cfn5+REREcPbsWfz8/Pj0009p1aoV1apVY+3atZmeAo6MjOT555+nWrVqNGnShA8++ICkpKScewFERPIABUARyXatW7c2nwZOd/PmTX788UfatGlj0TckJIRZs2bRrl075s+fT6tWrZg4cSIff/wxAAMGDKBx48YULVqUVatW0aRJE/O6s2fPpk+fPkydOpUGDRpkqGP58uW8/fbb+Pv7M2fOHPr27cuyZcuYMGFCzhy4iEgeoWsARSTbNWnSBFdXV7766it69uwJwDfffEPhwoWpWbOmud/p06dZvXo1Q4cONd/kERgYiMFg4JNPPqFz5848+eSTFCpUCCcnJ/Pp3fj4eACeeeYZXnjhhUxrMBqNfPzxxzz99NMWge/27dts3ryZ5ORkHB0dc+DoRUQefRoBFJFs5+LiQlBQkMVp4M2bN/PMM89gMBjMbb/99hsmk4mgoCBSUlLMX0FBQSQmJrJ379577qdixYp3XXb69GmuXLlC8+bNLdpfe+01IiIiFP5ExKZpBFBEcsQzzzzDoEGDiI6OxtnZmV9//ZXBgwdb9ImLiwPg2WefzXQbFy9evOc+3Nzc7rosfduFCxd+4JpFRGyFAqCI5IhGjRqRL18+vvrqK9zc3PD29qZy5coWfdzd3QFYsmQJ+fLly7CNEiVKPPT+07cdGxtr0X716lWOHDlCQEDAPQOkiMjjTKeARSRHODk58fTTT7N161a+/PLLTEf5atWqBaSFsipVqpi/YmNjmTlzpnkUz84u67+qypYtyxNPPJFh3sH169fTt29fkpOTs35QIiKPCY0AikiOad26Nf369cPOzo7Ro0dnWO7n50e7du147733OHfuHJUrV+b06dPMmDEDb29vfHx8gLTRvMuXL7N9+/Z7Xvd3J3t7e9544w1CQ0MpXLgwQUFBnD59mlmzZtGlSxcKFiyYnYcqIpKnKACKSI6pX78+7u7uFC9eHF9f30z7TJo0iU8++YSVK1cSHR1N4cKFad26NYMHD8be3h6ADh06sH37dgYOHEhwcDCtW7d+oP136dIFNzc3Fi1axKpVq/Dy8qJPnz706dMn245RRCQvMpj0hHURERERm6JrAEVERERsjAKgiIiIiI1RABQRERGxMQqAIiIiIjZGAVBERETExigAioiIiNgYBUARERERG6MAKCIiImJjFABFREREbIwCoIiIiIiNUQAUERERsTEKgCIiIiI25v8B5fUQOOjR/ocAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# PR-AUC   mean: 0.5765 std: 0.0174\n",
    "# F1       mean: 0.6003 std: 0.0218\n",
    "# ROC-AUC  mean: 0.5723 std: 0.0192\n",
    "\n",
    "origin = [0.5765, 0.6003, 0.5723, accuracy_score(test_predict_label, test_label)]\n",
    "cp = [prauc_score, f1score, auc_score, empirical_selective_accuracy]\n",
    "\n",
    "# X axis\n",
    "X_labels = [\"PR_AUC\", \"F1\", \"ROC_AUC\", \"Accuracy\"]\n",
    "\n",
    "data = {\n",
    "    'Metric': X_labels * 2,  \n",
    "    'Value': origin + cp,  \n",
    "    'Type': ['origin']*4 + ['cp']*4  \n",
    "}\n",
    "\n",
    "df = pd.DataFrame(data)\n",
    "\n",
    "plt.figure(figsize=(6, 4))\n",
    "ax = sns.barplot(x='Metric', y='Value', hue='Type', data=df)\n",
    "\n",
    "for p in ax.patches:\n",
    "    ax.annotate(f'{p.get_height():.4f}', \n",
    "                (p.get_x() + p.get_width() / 2., p.get_height()), \n",
    "                ha = 'center', \n",
    "                va = 'center', \n",
    "                xytext = (0, 9), \n",
    "                textcoords = 'offset points',\n",
    "                fontsize = 10)\n",
    "ax.legend(loc='upper left', bbox_to_anchor=(1, 1))\n",
    "plt.title('Phase III')\n",
    "plt.ylabel('Value')\n",
    "plt.xlabel('Metric')\n",
    "plt.ylim(0, 1)\n",
    "\n",
    "# 显示图形\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "d2l",
   "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.11.5"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}