{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "a0eP_UGnAiPI" }, "source": [ "# Example: Working on Tian sc Celseq2 5cl p1\n", "\n", "**Install GraphHDBSCAN package**" ] }, { "cell_type": "markdown", "metadata": { "id": "EbV1qfMsSBg-", "outputId": "0aa4fa27-79e3-4533-8a3f-85ec45104255" }, "source": [ "Install dependency:\n", "\n", "```bash\n", "!pip install git+https://github.com/Campello-Lab/GraphHDBSCAN.git\n", "```" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nzoye5UBSRAc", "outputId": "d08aab2f-43b5-45cf-9060-1e3fde60d6fe" }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.12/dist-packages/hdbscan/robust_single_linkage_.py:175: SyntaxWarning: invalid escape sequence '\\{'\n", " $max \\{ core_k(a), core_k(b), 1/\\alpha d(a,b) \\}$.\n" ] } ], "source": [ "from coresg_graphhdbscan import GraphCoreSGHDBSCAN" ] }, { "cell_type": "markdown", "metadata": { "id": "oJRDGEiDAtYv" }, "source": [ "**Load Data**" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "M1FwLvVWSw-P", "outputId": "398532da-6824-4114-b777-ad0949a1452f" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Available columns in adata.obs: ['unaligned', 'aligned_unmapped', 'mapped_to_exon', 'mapped_to_intron', 'ambiguous_mapping', 'mapped_to_ERCC', 'mapped_to_MT', 'number_of_genes', 'total_count_per_cell', 'non_ERCC_percent', 'non_mt_percent', 'non_ribo_percent', 'batch', 'outliers', 'cell_number', 'cell_line_demuxlet', 'demuxlet_cls', 'n_genes', 'norm_factor']\n" ] } ], "source": [ "import yaml\n", "import scanpy as sc\n", "# Load the YAML configuration file\n", "with open(\"config.yaml\", \"r\") as f:\n", " config = yaml.safe_load(f)\n", "\n", "Tian_config = config[\"DATASETS\"][\"Tian\"]\n", "expected_cell_label = Tian_config[\"cell_labels\"]\n", "\n", "# Load the AnnData object\n", "adata = sc.read_h5ad(\"/content/Tian-sc_Celseq2_5cl_p1.h5ad\")\n", "# Print available columns in adata.obs\n", "available_columns = list(adata.obs.columns)\n", "print(\"Available columns in adata.obs:\", available_columns)\n", "\n", "cell_label_key = expected_cell_label\n", "\n", "# Extract the count matrix and cell labels\n", "count_matrix = adata.X # Cells as rows and genes as columns\n", "true_labels = adata.obs[cell_label_key]" ] }, { "cell_type": "markdown", "metadata": { "id": "8Xhw60EhBSl5" }, "source": [ "**Clustering**" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "1x2y_IyFTN12" }, "outputs": [], "source": [ "g = GraphCoreSGHDBSCAN(\n", " min_samples=range(2,30),\n", " sim_graph_method=\"sc_gauss\",\n", " n_neighbors=16,\n", " no_noise=True,\n", " metric=\"euclidean\",\n", ")\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "MXK_0VcyVxlS", "outputId": "8c840f1c-1f90-447b-b666-1bbb53a775e6" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[CORE-SG] (precomputed) CORE-SG graph has 5208 edges\n", "[CORE-SG] m= 2: MST+tree+labels in 0.0136s\n", "[CORE-SG] m= 3: MST+tree+labels in 0.0086s\n", "[CORE-SG] m= 4: MST+tree+labels in 0.0080s\n", "[CORE-SG] m= 5: MST+tree+labels in 0.0080s\n", "[CORE-SG] m= 6: MST+tree+labels in 0.0076s\n", "[CORE-SG] m= 7: MST+tree+labels in 0.0071s\n", "[CORE-SG] m= 8: MST+tree+labels in 0.0068s\n", "[CORE-SG] m= 9: MST+tree+labels in 0.0069s\n", "[CORE-SG] m=10: MST+tree+labels in 0.0074s\n", "[CORE-SG] m=11: MST+tree+labels in 0.0070s\n", "[CORE-SG] m=12: MST+tree+labels in 0.0070s\n", "[CORE-SG] m=13: MST+tree+labels in 0.0071s\n", "[CORE-SG] m=14: MST+tree+labels in 0.0069s\n", "[CORE-SG] m=15: MST+tree+labels in 0.0075s\n", "[CORE-SG] m=16: MST+tree+labels in 0.0073s\n", "[CORE-SG] m=17: MST+tree+labels in 0.0081s\n", "[CORE-SG] m=18: MST+tree+labels in 0.0074s\n", "[CORE-SG] m=19: MST+tree+labels in 0.0078s\n", "[CORE-SG] m=20: MST+tree+labels in 0.0070s\n", "[CORE-SG] m=21: MST+tree+labels in 0.0067s\n", "[CORE-SG] m=22: MST+tree+labels in 0.0069s\n", "[CORE-SG] m=23: MST+tree+labels in 0.0085s\n", "[CORE-SG] m=24: MST+tree+labels in 0.0069s\n", "[CORE-SG] m=25: MST+tree+labels in 0.0067s\n", "[CORE-SG] m=26: MST+tree+labels in 0.0073s\n", "[CORE-SG] m=27: MST+tree+labels in 0.0067s\n", "[CORE-SG] m=28: MST+tree+labels in 0.0102s\n", "[CORE-SG] m=29: MST+tree+labels in 0.0075s\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "GraphCoreSGHDBSCAN(min_samples_list=[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], metric='euclidean', eps=1e-12, min_cluster_size=None, X_=None, N_=None, D_=None, core_={}, kmax_=None, edges_ut_=None, idx_with_self_=None, dst_with_self_=None, idx_no_self_=None, dst_no_self_=None, A_knn_=None, msts_={}, mst_times_={}, models_={}, times_={})" ] }, "metadata": {}, "execution_count": 6 } ], "source": [ "g.fit(adata.X)" ] }, { "cell_type": "markdown", "metadata": { "id": "799a927c" }, "source": [ "## Condensed tree\n", "\n", "The static condensed tree below is guaranteed to render in the built documentation. As an example condensed tree with min_samples = 18 is plotted.\n", "\n", "The widget is also shown for live notebook use. In the rendered HTML docs, widget. You can also plot this intractable condensed tree using: g.interactive_condensed_tree()\n", "\n", "Interactivity may be limited because there is no live Python kernel behind the page.\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 547 }, "id": "98129b4e", "outputId": "7fed6052-81f6-4b3b-d667-595ad5c44a12" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 7 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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e/fu6tq1q2bNmuU53r17d7Vo0ULPPvusZ7ohAFR1JCkA5HQ6Vb9+fe3cubNc5zkcjjL1O9c35oZhlOt6kjyL1F977TXFxcWd9X61at7/WSvLt/UxMTHavn27PvroIy1btkzLli3T/PnzNWDAAL366que695www0aO3ZsqTH+8Ic/lPdWTAsNDVVQkHch3O12KyYm5pzf/J9Jrsr7+flKeReJn+vv0ey/rfz8fK/tns933XMlpuW1bt067dy5Uy+88ILX8csvv1zNmjXTp59+asl1AKAyIEkBIEm68cYbNW/ePGVmZiolJeW8fRMSEuR2u7Vv3z41a9bMczwnJ0cnT5707ABVHgkJCZ5v+X9r7969Xq8bN24s6XRi0b1793Jf51xCQkLUt29f9e3bV263W/fff79eeuklPf7442rSpIkaN26s/Pz8C14zISFBK1euVH5+vlc15ff3YbXGjRvrk08+UYcOHc6bAPji86tbt64iIiJKvcc9e/YoKCjorIqHvz333HOaPHnyBfslJCTo0KFDllwzJydHks7aWU46vfPXhaaoAUBVwpoUAJKksWPHqkaNGho6dKjnl6nfOnDggGdL3t69e0uSZ0erM858Q9ynT59yX793797auHGjPvvsM8+x48ePn1UZSE1NldPp1FNPPaXi4uKz4px5jkd5fP/9916vg4KCdOWVV0qSZzvbP/7xj8rMzNRHH3101vknT570/ILZu3dvz/MwznC5XF7Te3zhj3/8o1wul5544omz3ispKfFsgeyLzy84OFg9evTQkiVLvH6hz8nJ0YIFC9SxY0dT08h8yR9rUs5U2958802v41u3btXevXt11VVXWXYtAAh0VFIASDr9DfuCBQt0++23q1mzZl5PnN+wYYMWLlyoQYMGSZJat26tgQMHat68eTp58qS6dOmizz77TK+++qr69eun6667rtzXHzt2rF577TX17NlTI0eO9GxBnJCQoC+++MLTz+l0as6cObrnnnvUtm1b3XHHHapbt66ysrL0wQcfqEOHDvrHP/5RrmsPHTpUJ06c0PXXX68GDRro66+/1qxZs9SmTRtPpeiRRx7R//3f/+nGG2/0bJ9cUFCgHTt26J133tGhQ4dUp04d9e3bVx06dNC4ceN06NAhNW/eXO+9955yc3PL/ZmUR5cuXXTvvfcqPT1d27dvV48ePVS9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dJKyevVqLViwQO+++67cbrf69++vpUuX6vrrrzcbEgAAAECAWb16teUxTSUpl156qU6cOKGePXtq3rx56tu3r9dTKwG7csvt7yHARkwtygMA4AzDcbpZHTNA7d+/XwcOHFDnzp0VHh4uwzAqtpIyadIk3XbbbapVq5apiwIAAACoHL7//nv98Y9/1OrVq+VwOLRv3z41atRIQ4YMUe3atfX888+XO6apLxKHDRtGggIAAICqjS2IJUmjR49W9erVlZWVpYiICM/x22+/XcuXLzcV86IXzgMAAACouj7++GN99NFHatCggdfxyy+/XF9//bWpmCQpAAAAgAns7nVaQUGBVwXljBMnTphet866UQAAAACmderUSf/61788rx0Oh9xut6ZOnarrrrvOVEwqKQAAAIAZPMxRkjR16lR169ZNmzdvVlFRkcaOHatdu3bpxIkT+vTTT03FpJICAAAAmGH8OuXLqhaISUrLli315ZdfqmPHjrr55ptVUFCg/v37a9u2bWrcuLGpmBddSXG5XNqzZ4927tzpaYsWLbrYsIDlguK+VPHRRv4eBmyEUjIAANaIiorS3/72N8viletn9FdffaUdO3Z4JST79u1TcXGxQkJC1KxZM7Vq1cqywQEAAAC2xXQvjx9++EEvv/yydu/eLUlq3ry5Bg8erOjoaFPxypyk3H333XrjjTfkcDgUERGhgoIC9enTRxMmTFCrVq10+eWXKzg42NQggIpSIpe/hwCbqFHP3JaIAADA27p169S3b19FRUWpXbt2kqSZM2dqypQpev/999W5c+dyxyzzmpR33nlHM2fOVH5+vo4cOaIRI0bo448/1ueff66EhATTCcqZm6pfv74cDocWL1583v5r1qyRw+E4q2VnZ5u6PqqWGvW+VrHhptH8/U8RAFAZ8DBHSVJaWppuv/12HTx4UO+9957ee+89ffXVV7rjjjuUlpZmKmaZKymjR4/WgAEDFBYWJkmaMWOGBgwYoPvuu0/vvPOOXnzxRfXs2bPcAygoKFDr1q315z//Wf379y/zeXv37pXT6fS8jomJKfe1K8qpU6e0Z88efw8Dv/jxeJG/h+BXP/9sKOtwiS6LD1ZYWNXcOyOy7jIpe6u/hwEfatq0aal79gMArLd//3698847XkWL4OBgjRkzxmtr4vIoc5KSnp5+1rGkpCR99tlnmjlzpm6//Xb16dNHM2bMUN26dcs8gF69eqlXr15l7n9GTEyMatWqVe7z/GHPnj1KSkry9zAAePD/x8puy5Ytatu2rb+HAaCS42GOp7Vt21a7d+/WFVdc4XV89+7dat26tamYF725jcPh0MiRI3XrrbfqwQcfVNOmTfX9999fbNgLatOmjQoLC9WyZUtNmjRJHTp0OGffwsJCFRYWel7n5eX5fHy/1bRpU13Rf0yFXvNiLfjbXf4eAnzkp59+0qFDh9SwYUOFh4f7ezhV3h/XzvX3ECqdt7vcp6ZNm/p7GABQqX3xxReePz/44IMaOXKk9u/fr2uvvVaStHHjRs2ePVtPP/20qfiW7cB56aWX6t1339UHH3xgVchS1atXT3PnzlW7du1UWFiof/7zn+ratas2bdp0zm/N0tPTNXnyZJ+O63wiIiIUUbeB365vBt9AVm7nS+pRscK/qefvIVQ6/PcLAHyvTZs2cjgcMoxfSz9jx449q9+f/vQn3X777eWOb/ljAvr06WN1SC9XXHGFVympffv2OnDggKZNm6bXXnut1HPGjx+vMWN+rWTk5eUpPj7ep+MEgLJwGw5/D6FSCQrEeRIAAlcV3oL44MGDPo1fKZ5lds0112j9+vXnfD80NFShoaEVOCIAAACg8kpISPBp/EqRpGzfvl316jFlAgAAABWHhfO/OnLkiNavX69jx47J7fbe6v/BBx8sdzy/Jyn5+fnav3+/5/XBgwe1fft2RUdH67LLLtP48eP17bfferYvmz59uhITE9WiRQv9/PPP+uc//6lVq1bp448/9tctAABsYsdN/lt/CABVVUZGhu69916FhITokksukcPx61Rmh8MRmEnK5s2bdd1113len1k7MnDgQGVkZOjo0aPKysryvF9UVKSHHnpI3377rSIiInTllVfqk08+8YoBAAAAVIgArXxY6fHHH9eECRM0fvx4BQVZ8ww2vycpXbt29doV4PcyMjK8Xo8dO7bUnQMAAAAAVLxTp07pjjvusCxBkaSq+bhpAAAA4GIZPmoBZsiQIVq4cKGlMf1eSQEAAAAQuNLT03XjjTdq+fLlatWqlapXr+71/gsvvFDumCQpAAAAgAns7nVaenq6PvroI8+zDH+/cN4MkhQAAADAjCr8MMffev755/XKK69o0KBBlsVkTQoAAAAA00JDQ9WhQwdLY5KkAAAA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\n" }, "metadata": {} } ], "source": [ "g.plot_condensed_tree(18)" ] }, { "cell_type": "markdown", "metadata": { "id": "VgvQicvqBa92" }, "source": [ "Intractable condensed tree" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 593, "referenced_widgets": [ "e05db5cbbc1e4ed1b650c69db09004e1", "015f1edd31554ac586bef4e61707aa20", "19f127ad10c443bbb9e5436a80abf8c5", "94938fd0353e4ce38ee2652920ad6091", "96d62b8c414f4fbea5835553f4fcd234", "9a7aabc234d5491b981d338209001d03", "796a92fadb5b46c4aafed48ca62cafef" ] }, "id": "5aaa85a0", "outputId": "9fdd1eb4-5255-46b3-b7ef-8637a13f4175" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "VBox(children=(SelectionSlider(continuous_update=False, description='m', layout=Layout(width='500px'), options…" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "e05db5cbbc1e4ed1b650c69db09004e1" } }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "SelectionSlider(continuous_update=False, description='m', layout=Layout(width='500px'), options=(2, 3, 4, 5, 6…" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "015f1edd31554ac586bef4e61707aa20" } }, "metadata": {} } ], "source": [ "widget = g.interactive_condensed_tree()\n", "widget" ] }, { "cell_type": "markdown", "metadata": { "id": "sLhINs78BkGN" }, "source": [ "Labels for min_samples = 18" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "id": "6Xl7Il-3V1re" }, "outputs": [], "source": [ "labels_ = g.labels_for(18)" ] }, { "cell_type": "markdown", "metadata": { "id": "I14Q_RyVBpH1" }, "source": [ "**Evaluation**" ] }, { "cell_type": "markdown", "metadata": { "id": "K86sVkQloTXL", "outputId": "20cc7122-6cb3-4c24-b281-c55efa4e0e2c" }, "source": [ "Install dependency:\n", "\n", "```bash\n", "!pip install genieclust\n", "```" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2FTrhJevcZYa", "outputId": "9ffc5250-e420-4531-b3b0-0fc947743cfb" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Precomputed matrix mode:\n", "AMI: 0.9481596830161236\n", "ARI: 0.9648083495818396\n", "PSI: 0.9673381405103447\n" ] } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "import scanpy as sc\n", "from sklearn.metrics import adjusted_mutual_info_score, adjusted_rand_score\n", "from sklearn.preprocessing import LabelEncoder\n", "# Import the pair_sets_index function as PSI from genieclust.compare_partitions\n", "from genieclust.compare_partitions import pair_sets_index as PSI\n", "\n", "def evaluate_clustering(true_labels, predicted_labels):\n", " \"\"\"\n", " Compute Adjusted Mutual Information (NMI), Adjusted Rand Index (ARI),\n", " and Pair Set Index (PSI) between true and predicted cluster labels.\n", "\n", " Since PSI (pair set index) expects numeric labels, we convert the input\n", " labels from strings (if necessary) to integers using LabelEncoder.\n", " \"\"\"\n", " # Compute AMI and ARI directly; these metrics accept string labels.\n", " ami = adjusted_mutual_info_score(true_labels, predicted_labels)\n", " ari = adjusted_rand_score(true_labels, predicted_labels)\n", "\n", " # Use a single LabelEncoder fitted on the union of all labels to ensure consistent encoding.\n", " all_labels = list(set(true_labels) | set(predicted_labels))\n", " encoder = LabelEncoder()\n", " encoder.fit(all_labels)\n", "\n", " # Transform true and predicted labels into numeric values.\n", " true_labels_numeric = encoder.transform(true_labels)\n", " predicted_labels_numeric = encoder.transform(predicted_labels)\n", "\n", " # Calculate the Pair Set Index (PSI) using the numeric labels.\n", " psi = PSI(true_labels_numeric, predicted_labels_numeric)\n", "\n", " return ami, ari, psi\n", "\n", "\n", "ami, ari, psi = evaluate_clustering(true_labels, labels_)\n", "print(\"Precomputed matrix mode:\")\n", "print(\"AMI:\", ami)\n", "print(\"ARI:\", ari)\n", "print(\"PSI:\", psi)\n" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "e05db5cbbc1e4ed1b650c69db09004e1": { "model_module": "@jupyter-widgets/controls", "model_name": "VBoxModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_015f1edd31554ac586bef4e61707aa20", "IPY_MODEL_19f127ad10c443bbb9e5436a80abf8c5" ], "layout": "IPY_MODEL_94938fd0353e4ce38ee2652920ad6091" } }, "015f1edd31554ac586bef4e61707aa20": { "model_module": "@jupyter-widgets/controls", "model_name": "SelectionSliderModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "SelectionSliderModel", "_options_labels": [ "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29" ], "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "SelectionSliderView", "continuous_update": false, "description": "m", "description_tooltip": null, "disabled": false, "index": 4, "layout": "IPY_MODEL_96d62b8c414f4fbea5835553f4fcd234", "orientation": "horizontal", "readout": true, "style": "IPY_MODEL_9a7aabc234d5491b981d338209001d03" } }, "19f127ad10c443bbb9e5436a80abf8c5": { "model_module": "@jupyter-widgets/output", "model_name": "OutputModel", "model_module_version": "1.0.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_796a92fadb5b46c4aafed48ca62cafef", "msg_id": "", "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxwAAAIACAYAAAAIZGpcAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASrVJREFUeJzt3XtclHX6//H3gAIeOIgH0EJErTymhUWEWql5zHK1rcwKXdO2ME1Tk93yWFFuB63Msq+ptVmblbYdxDyla+FZf5qrJobJZqhpgmAhzNy/P1xnm/AAw31zM8zr+Xh8Hsvcc3PNNWOrXFyfg8MwDEMAAAAAYIEAuxMAAAAAUHVRcAAAAACwDAUHAAAAAMtQcAAAAACwDAUHAAAAAMtQcAAAAACwDAUHAAAAAMtQcAAAAACwDAUHAAAAAMtQcACw1fz58+VwOHTgwAG7UymXAwcOyOFwaP78+XanUm779u1T9+7dFR4eLofDoSVLltidEgDAh1FwAH5m//79euCBB9S0aVOFhIQoLCxMSUlJmjlzpn755Re706vSmjRpIofDcdFhd9GSnJysnTt36qmnntLbb7+tDh062JpPZbFixQp16dJF4eHhCg0NVXx8vP7xj3/YnRYAVHrV7E4AQMX57LPP9Mc//lHBwcG677771KZNG50+fVrr1q3TuHHjtGvXLs2ZM8fuNKusGTNmKD8/3/34888/17vvvqsXX3xR9erVc1+//vrr7UhPkvTLL78oIyNDf/3rXzVixAjb8qhs5s2bp6FDh+rmm2/W008/rcDAQO3du1fZ2dl2pwYAlR4FB+AnsrKydNdddyk2NlarVq1Sw4YN3c+lpKQoMzNTn332mY0ZVn39+vXzeJyTk6N3331X/fr1U5MmTc77fQUFBapVq5a1yf3X0aNHJUkRERGmxazI/K1w4MABpaSk6OGHH9bMmTPtTgcAfA5TqgA/MX36dOXn52vu3LkexcZZzZs316hRo9yPi4uLNW3aNDVr1kzBwcFq0qSJ/vKXv6iwsNDj+5o0aaJbbrlF69at07XXXquQkBA1bdpUb731VonX2LVrl7p06aIaNWro0ksv1ZNPPimXy3XOfJcuXapOnTqpVq1aCg0NVZ8+fbRr1y6PewYPHqzatWvrhx9+UL9+/VS7dm3Vr19fY8eOldPp9Lj3vffeU3x8vEJDQxUWFqa2bduW+OHxxIkTeuSRRxQTE6Pg4GA1b95czz77bIkcT5w4ocGDBys8PFwRERFKTk7WiRMnzvk+yurse9q/f7969+6t0NBQDRo0SJLkcrk0Y8YMtW7dWiEhIYqKitIDDzygn3/+uUSc0nx+vzd58mTFxsZKksaNGyeHw+FRCG3btk29evVSWFiYateura5du2r9+vUeMc6uyVmzZo0eeughNWjQQJdeeul5X/PLL7+Uw+HQ+++/rylTpuiSSy5RaGiobr/9duXm5qqwsFCPPPKIGjRooNq1a2vIkCEl/hu02muvvSan06mpU6dKkvLz82UYRoXmAAC+jA4H4Cc++eQTNW3atNTTde6//34tWLBAt99+ux599FFt2LBBaWlp2r17txYvXuxxb2Zmpm6//XYNHTpUycnJevPNNzV48GDFx8erdevWks78Nv+mm25ScXGxJkyYoFq1amnOnDmqUaNGidd+++23lZycrB49eujZZ5/VqVOnNHv2bHXs2FHbtm3z+CHY6XSqR48eSkhI0HPPPacVK1bo+eefV7NmzfTggw9KkpYvX66BAweqa9euevbZZyVJu3fv1ldffeUusk6dOqUbbrhBP/zwgx544AE1btxYX3/9tVJTU/Xjjz9qxowZkiTDMHTbbbdp3bp1+vOf/6yWLVtq8eLFSk5OLtOfx4UUFxerR48e6tixo5577jnVrFlTkvTAAw9o/vz5GjJkiEaOHKmsrCy98sor2rZtm7766itVr169zJ/fb/Xv318REREaPXq0Bg4cqN69e6t27dqSzhSLnTp1UlhYmMaPH6/q1avr9ddf14033qg1a9YoISHBI9ZDDz2k+vXra+LEiSooKLjoe05LS1ONGjU0YcIEZWZm6uWXX1b16tUVEBCgn3/+WZMnT9b69es1f/58xcXFaeLEiReMd+rUKZ06deqirxsYGKg6depc8J4VK1aoRYsW+vzzzzVu3Dj98MMPqlOnjlJSUjRlyhQFBPC7OwC4IANAlZebm2tIMm677bZS3b99+3ZDknH//fd7XB87dqwhyVi1apX7WmxsrCHJWLt2rfvakSNHjODgYOPRRx91X3vkkUcMScaGDRs87gsPDzckGVlZWYZhGMbJkyeNiIgIY9iwYR6vnZOTY4SHh3tcT05ONiQZU6dO9bj3qquuMuLj492PR40aZYSFhRnFxcXnfc/Tpk0zatWqZXz77bce1ydMmGAEBgYaBw8eNAzDMJYsWWJIMqZPn+6+p7i42OjUqZMhyZg3b955X+P3/va3v3m899++pwkTJnjc+69//cuQZLzzzjse19PT0z2ul+XzO5esrCxDkvG3v/3N43q/fv2MoKAgY//+/e5rhw4dMkJDQ43OnTu7r82bN8+QZHTs2PGCn/dZq1evNiQZbdq0MU6fPu2+PnDgQMPhcBi9evXyuD8xMdGIjY29aNxJkyYZki46ShMrLCzMqFOnjhEcHGw88cQTxgcffGDcfffd5/xzAgCUxK9lAD+Ql5cnSQoNDS3V/Z9//rkkacyYMR7XH330UUkqsdajVatW6tSpk/tx/fr1dcUVV+i7777ziHndddfp2muv9bjv7HShs5YvX64TJ05o4MCB+umnn9wjMDBQCQkJWr16dYl8//znP3s87tSpk8drR0REqKCgQMuXLz/ve160aJE6deqkOnXqeLxut27d5HQ6tXbtWvf7qFatmrt7Ip35LfnDDz983tje+G38s/mFh4fr5ptv9sgvPj5etWvXdn8u3nx+F+N0OvXFF1+oX79+atq0qft6w4YNdffdd2vdunXu/8bOGjZsmAIDA0v9Gvfdd5+7QyNJCQkJMgxDf/rTnzzuS0hIUHZ2toqLiy8ab/ny5Rcd77zzzkVzy8/P188//6wpU6Zo6tSpGjBggN555x317NlTM2fO1MmTJ0v9PgHAHzGlCvADYWFhklTqH4y+//57BQQEqHnz5h7Xo6OjFRERoe+//97jeuPGjUvEqFOnjsfagu+//77EtBtJuuKKKzwe79u3T5LUpUuXc+Z29r2cFRISovr161/wtR966CG9//776tWrly655BJ1795dd9xxh3r27Onxujt27CgR66wjR46430fDhg3dU43O9z7Ko1q1aiXWPezbt0+5ublq0KDBBfMr6+dXGkePHtWpU6fO+R5btmwpl8ul7Oxs9/Q5SYqLiyvTa/z+v6Hw8HBJUkxMTInrLpdLubm5qlu37nnjNW3a1KM4Ko8aNWqooKBAAwcO9Lg+cOBApaena9u2bercubMprwUAVREFB+AHwsLC1KhRI33zzTdl+j6Hw1Gq+873m2zDi4W1Zxdov/3224qOji7xfLVqnn9tlea36A0aNND27du1bNkyLV26VEuXLtW8efN03333acGCBe7XvfnmmzV+/Phzxrj88svL+la8FhwcXGJdgMvlUoMGDc77G/mzhVJZPz+rnGttzoWc78/R2/+28vPzPbYgvtDrnq/IPKtRo0bat2+foqKiPK6fLf7OtWgfAPA/FByAn7jllls0Z84cZWRkKDEx8YL3xsbGyuVyad++fWrZsqX7+uHDh3XixAn3TkZlERsb6/7t+2/t3bvX43GzZs0knflhrlu3bmV+nfMJCgpS37591bdvX7lcLj300EN6/fXX9cQTT6h58+Zq1qyZ8vPzL/qasbGxWrlypfLz8z26HL9/H2Zr1qyZVqxYoaSkpAv+MG/F51e/fn3VrFnznO9xz549CggIKNGJsNtzzz2nKVOmXPS+2NjYi55yHx8fr3379umHH37w6JocOnRIki5asACAv2MNB+Anxo8fr1q1aun+++/X4cOHSzy/f/9+9zaxvXv3liT3zkxnvfDCC5KkPn36lPn1e/furfXr12vjxo3ua0ePHi3xG/sePXooLCxMTz/9tIqKikrEOXtORFkcO3bM43FAQICuvPJKSXJvsXrHHXcoIyNDy5YtK/H9J06ccK8Z6N27t4qLizV79mz3806nUy+//HKZ8yqLO+64Q06nU9OmTSvxXHFxsXtbXis+v8DAQHXv3l0ff/yxxw/nhw8f1sKFC9WxY0evpmpZycw1HHfeeackae7cue5rLpdL8+bNU2RkpOLj4y17HwBQFdDhAPxEs2bNtHDhQt15551q2bKlx0njX3/9tRYtWqTBgwdLktq1a6fk5GTNmTNHJ06c0A033KCNGzdqwYIF6tevn2666aYyv/748eP19ttvq2fPnho1apR7W9zY2Fjt2LHDfV9YWJhmz56te++9V1dffbXuuusu1a9fXwcPHtRnn32mpKQkvfLKK2V67fvvv1/Hjx9Xly5ddOmll+r777/Xyy+/rPbt27s7OOPGjdM///lP3XLLLe4tfQsKCrRz50598MEHOnDggOrVq6e+ffsqKSlJEyZM0IEDB9SqVSt99NFHys3NLfNnUhY33HCDHnjgAaWlpWn79u3q3r27qlevrn379mnRokWaOXOmbr/9dks+P0l68skntXz5cnXs2FEPPfSQqlWrptdff12FhYWaPn26Be+4fMxcw3Hbbbepa9euSktL008//aR27dppyZIlWrdunV5//XUFBweb8joAUGXZvEsW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raeffloHDhwwOUUAAABckGGUbgAXcc8992ju3LmmxvRqDYck1alTR8OHD9fw4cP1n//8R++++67efPNNTZw4UcXFxWbmCAAAAFirEuxSVRkUFxfrzTff1IoVKxQfH69atWp5PP/CCy+UOabXBcdZRUVF2rx5szZs2KADBw4oKiqqvCEByy3N/Jt6xY2xOw0AAFBJsGj8jG+++UZXX321JOnbb7/1eM7b9dpeFxyrV6/WwoUL9eGHH8rlcql///769NNP1aVLF29DAoD/8Wb9t1eTYQFUVUv3TVev5uPsTgNVxOrVq02P6VXBcckll+j48ePq2bOn5syZo759+3qccAgAsE76Tna7AwDTGY4zw+yYPiozM1P79+9X586dVaNGDRmGUbEdjsmTJ+uPf/yjIiIivHpRAAAAmMjptDsDVBHHjh3THXfcodWrV8vhcGjfvn1q2rSphg4dqjp16uj5558vc0yvGvPDhg2j2AAAAEDVwba4kqTRo0erevXqOnjwoGrWrOm+fueddyo9Pd2rmOVeNA4AAACgavjiiy+0bNkyXXrppR7XL7vsMn3//fdexaTggH8rvkgLulpgxeQBAABsxS5VZxQUFHh0Ns46fvy412u22evELE7nxQcA/E76rqfkKHaWaQAAYJVOnTrprbfecj92OBxyuVyaPn26brrpJq9i0uEwQWnPdFia+bcKyAYAAABlxsF/kqTp06era9eu2rx5s06fPq3x48dr165dOn78uL766iuvYlJwAIDdXGU4jCOAxjSAc3CW4u+RQP7+uCALplT5YsHRpk0bffvtt3rllVcUGhqq/Px89e/fXykpKWrYsKFXMctdcDidTu3Zs0fffPONeyxevLi8YQHLLc16Qb1iRl30HgAAqgL+TUNphYeH669//atp8cpUcHz33XfauXOnR3Gxb98+FRUVKSgoSC1btlTbtm1NSw4AAAClVJZuKUpiSpXbzz//rLlz52r37t2SpFatWmnIkCGKjIz0Kl6pC4577rlH7777rhwOh2rWrKmCggL16dNHEydOVNu2bXXZZZcpMJAdfQAAAABftXbtWvXt21fh4eHq0KGDJOmll17S1KlT9cknn6hz585ljlnqyXwffPCBXnrpJeXn5+vQoUMaMWKEvvjiC23atEmxsbEUG8XOiw8AAABUThz8J0lKSUnRnXfeqaysLH30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\n" }, "metadata": {} } ] } }, "94938fd0353e4ce38ee2652920ad6091": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "96d62b8c414f4fbea5835553f4fcd234": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "500px" } }, "9a7aabc234d5491b981d338209001d03": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "initial" } }, "796a92fadb5b46c4aafed48ca62cafef": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } } } }, "nbformat": 4, "nbformat_minor": 0 }