{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "ee24a283" }, "source": [ "# Example: Working on the Tian scRNA-seq CELseq2 QC dataset\n", "\n", "This notebook presents a structured GraphHDBSCAN workflow on the Tian scRNA-seq CELseq2 QC dataset.\n", "\n", "Sections:\n", "1. installation\n", "2. imports and setup\n", "3. data loading / preparation\n", "4. model construction and fitting\n", "5. condensed tree visualization\n", "6. optional interactive exploration" ] }, { "cell_type": "markdown", "metadata": { "id": "48a2dec2" }, "source": [ "## Installation\n", "\n", "These commands are only required when running the notebook in a fresh environment." ] }, { "cell_type": "markdown", "metadata": { "id": "6d21dfd3" }, "source": [ "Install required package(s):\n", "\n", "```bash\n", "!pip install git+https://github.com/Campello-Lab/GraphHDBSCAN.git\n", "```" ] }, { "cell_type": "markdown", "metadata": { "id": "5e8e34d3" }, "source": [ "## Build and fit the model\n", "\n", "Configure GraphHDBSCAN, fit the model, and inspect the clustering result." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nzoye5UBSRAc", "outputId": "c6ce6a98-1df6-41cf-e9d2-38fdd4210f5f" }, "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": "375860d7" }, "source": [ "## Load and prepare the dataset\n", "\n", "Load the Tian CELseq2 QC dataset and prepare the representation used by the clustering workflow." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "M1FwLvVWSw-P", "outputId": "af894329-7e46-4264-ae58-830cb69441b8" }, "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', 'outliers', 'cell_line', 'cell_line_demuxlet', 'demuxlet_cls', 'n_genes', 'norm_factor']\n" ] } ], "source": [ "import yaml\n", "import scanpy as sc\n", "\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", "# Load the AnnData object\n", "adata = sc.read_h5ad(\"/content/Tian-sce_sc_CELseq2_qc.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": "code", "execution_count": 4, "metadata": { "id": "1x2y_IyFTN12" }, "outputs": [], "source": [ "g = GraphCoreSGHDBSCAN(\n", " min_samples=range(2,20),\n", " sim_graph_method=\"sc_gauss\",\n", " n_neighbors=16,\n", " no_noise=True,\n", " metric=\"euclidean\",\n", ")\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "MXK_0VcyVxlS", "outputId": "1f844564-a72d-4b80-f6ac-c0c022b08738" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[CORE-SG] (precomputed) CORE-SG graph has 3256 edges\n", "[CORE-SG] m= 2: MST+tree+labels in 0.0112s\n", "[CORE-SG] m= 3: MST+tree+labels in 0.0069s\n", "[CORE-SG] m= 4: MST+tree+labels in 0.0072s\n", "[CORE-SG] m= 5: MST+tree+labels in 0.0065s\n", "[CORE-SG] m= 6: MST+tree+labels in 0.0066s\n", "[CORE-SG] m= 7: MST+tree+labels in 0.0064s\n", "[CORE-SG] m= 8: MST+tree+labels in 0.0066s\n", "[CORE-SG] m= 9: MST+tree+labels in 0.0061s\n", "[CORE-SG] m=10: MST+tree+labels in 0.0060s\n", "[CORE-SG] m=11: MST+tree+labels in 0.0058s\n", "[CORE-SG] m=12: MST+tree+labels in 0.0058s\n", "[CORE-SG] m=13: MST+tree+labels in 0.0057s\n", "[CORE-SG] m=14: MST+tree+labels in 0.0058s\n", "[CORE-SG] m=15: MST+tree+labels in 0.0057s\n", "[CORE-SG] m=16: MST+tree+labels in 0.0059s\n", "[CORE-SG] m=17: MST+tree+labels in 0.0058s\n", "[CORE-SG] m=18: MST+tree+labels in 0.0058s\n", "[CORE-SG] m=19: MST+tree+labels in 0.0057s\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], 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": 5 } ], "source": [ "g.fit(adata.X)" ] }, { "cell_type": "markdown", "metadata": { "id": "c9fe79d6" }, "source": [ "## Visualize the hierarchy and evaluate flat partitioning results\n", "\n", "A static condensed tree is included first for reliable rendering in the documentation. The interactive widget is shown afterwards for live notebook use." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 547 }, "id": "bf33d6dd", "outputId": "1d011d4a-8ed5-4db6-da82-ef4ef40b8a95" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 6 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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V0iIdwPa7XYrPj7+gt/InyuUfP38rHK+tTkXc6E/R39/twoKCry2IL7YdS9UZF5MWFiY+vTpo5kzZ+r06dM+v18ACCYUHECQuOmmmzR//nxt2rRJaWlpFz03KSlJbrdbe/fuVbNmzTzHjx07ptzcXM9ORr5ISkryfPv+S3v27PF63LhxY0lni4QuXbr4fJ0LCQsLU+/evdW7d2+53W7dd999eumll/TII4+oSZMmaty4sQoKCi55zaSkJK1du1YFBQVeXY5fvw+zNW7cWB999JHS09Mv+o9bKz6/2rVrKyoq6rzvMTs7WyEhIaU6EXZ78sknNX369Euel5SU5Pdd7k+fPi3DMPTTTz9RcADARbCGAwgSEydOVLVq1TR8+HAdO3as1PP79+/3bBPbs2dPSfLszHTO008/LUnq1auXz9fv2bOnNm/erM8//9xz7MSJE6W+se/WrZucTqcef/xxnTlzplScc/eJ8MUPP/zg9TgkJEStW7eWJM8Wq3/605+0adMmrVq1qtTrc3NzPXP1e/bsqZKSEs2bN8/zvMvl0nPPPedzXr7405/+JJfLpUcffbTUcyUlJZ7tWa34/EJDQ9W1a1e99957Xv84P3bsmBYvXqz27dv7NVXLSmau4Tg3Xe2XcnNz9fbbbysxMfGC09wAAGfR4QCCROPGjbV48WLdeuutatasmdedxj/77DMtXbpUQ4cOlSRdc801GjJkiObPn6/c3Fz9/ve/1+eff65Fixapb9++uv76632+/sSJE/Xaa6+pe/fuGjNmjGdb3KSkJH311Vee85xOp+bNm6c77rhDbdu21YABA1S7dm0dOnRIH3zwgdLT0/X888/7dO3hw4fr5MmTuuGGG1S/fn19++23eu6559SmTRtPB2fChAn63//9X910002eLX0LCwu1Y8cOvfXWWzp48KBq1aql3r17Kz09XZMmTdLBgwfVvHlzvfPOO8rLy/P5M/HF73//e919993KzMzU9u3b1bVrV1WtWlV79+7V0qVL9eyzz+qWW26x5POTpMcee0xr1qxR+/btdd9996lKlSp66aWXVFRUpFmzZlnwji+PmWs4evToofr16ys1NVXx8fE6dOiQFixYoCNHjuif//ynKdcAgMqMggMIIn369NFXX32lv/3tb3rvvfc0b948hYeHq3Xr1nrqqac0YsQIz7l///vf1ahR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\n" }, "metadata": {} } ], "source": [ "g.plot_condensed_tree(3)" ] }, { "cell_type": "markdown", "metadata": { "id": "a145ea7c" }, "source": [ "> The widget below is most useful in a live Jupyter environment. In rendered HTML docs, widget interactivity may be limited." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 593, "referenced_widgets": [ "37ba9475ced946c6aa7dd14846c71ede", "330537fa0d6a4630ac216c2bdb847958", "433065a90b1d49cb9f44cc99898e00d2", "f22f502f241a4398beb442f3e6e8de11", "0f149a793c354f5a86017e1a6225c44e", "e1b9ab6f98d7433f8f1277f7c4aec398", "fce5d88992ea4fa7952ea17f8054654f" ] }, "id": "5e04e36c", "outputId": "9a8e624b-f2aa-45b8-ea37-791bcc27374a" }, "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": "37ba9475ced946c6aa7dd14846c71ede" } }, "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": "330537fa0d6a4630ac216c2bdb847958" } }, "metadata": {} } ], "source": [ "g.interactive_condensed_tree()" ] }, { "cell_type": "markdown", "source": [ "Flat partitioing" ], "metadata": { "id": "cWAhFhepsTuh" } }, { "cell_type": "code", "execution_count": 8, "metadata": { "id": "6Xl7Il-3V1re" }, "outputs": [], "source": [ "labels_ = g.labels_for(3)" ] }, { "cell_type": "markdown", "metadata": { "id": "8898a828" }, "source": [ "Install required package(s):\n", "\n", "```bash\n", "!pip install genieclust\n", "```" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2FTrhJevcZYa", "outputId": "3697c893-e075-4bfe-a559-7e13749f8388" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Precomputed matrix mode:\n", "AMI: 1.0\n", "ARI: 1.0\n", "PSI: 1.0\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": { "37ba9475ced946c6aa7dd14846c71ede": { "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_330537fa0d6a4630ac216c2bdb847958", "IPY_MODEL_433065a90b1d49cb9f44cc99898e00d2" ], "layout": "IPY_MODEL_f22f502f241a4398beb442f3e6e8de11" } }, "330537fa0d6a4630ac216c2bdb847958": { "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" ], "_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": 0, "layout": "IPY_MODEL_0f149a793c354f5a86017e1a6225c44e", "orientation": "horizontal", "readout": true, "style": "IPY_MODEL_e1b9ab6f98d7433f8f1277f7c4aec398" } }, "433065a90b1d49cb9f44cc99898e00d2": { "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_fce5d88992ea4fa7952ea17f8054654f", "msg_id": "", "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxwAAAIACAYAAAAIZGpcAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUQxJREFUeJzt3Xl4U3Xa//FPCnQJtIUCpaC1ZVHCJgzVqZ0CoiI7iuKCw1JQwQUEQUWYUWRxrDKKqCDKPAjogI4b+oDKIiA8rGKFn6gUAUFQKDAgrW2hS3J+fzBkiC3Qpuc0SfN+Xde5hnNycudOZErv3N/FZhiGIQAAAACwQIivEwAAAABQdVFwAAAAALAMBQcAAAAAy1BwAAAAALAMBQcAAAAAy1BwAAAAALAMBQcAAAAAy1BwAAAAALAMBQcAAAAAy1BwAPCp+fPny2azaf/+/b5OpUL2798vm82m+fPn+zqVCtu9e7e6du2q6Oho2Ww2ffTRR75OCQAQwCg4gCCzd+9e3XfffWrSpInCw8MVFRWl1NRUvfTSSzp16pSv06vSEhMTZbPZLnr4umhJS0vTjh079Le//U1vvfWWrrrqKp/m42urVq3S3XffrSuuuEJ2u11NmjTRvffeq8OHD/s6NQAICNV9nQCAyvPJJ5/o9ttvV1hYmAYPHqzWrVursLBQ69ev12OPPabvvvtOc+bM8XWaVdaMGTOUm5vrPv/000/19ttv68UXX1S9evXc1//0pz/5Ij1J0qlTp7Rp0yb99a9/1ciRI32Whz95/PHHdeLECd1+++26/PLL9eOPP2rmzJlaunSptm/frri4OF+nCAB+jYIDCBL79u1T//79lZCQoNWrV6thw4bux0aMGKE9e/bok08+8WGGVV/fvn09zrOysvT222+rb9++SkxMPO/z8vLyVLNmTWuT+49jx45JkmrXrm1azMrM3wrTp09Xhw4dFBLy30EB3bt317XXXquZM2fq6aef9mF2AOD/GFIFBIlp06YpNzdXc+fO9Sg2zmrWrJlGjx7tPi8uLtbUqVPVtGlThYWFKTExUX/5y19UUFDg8bzExET17t1b69ev1x//+EeFh4erSZMmevPNN0u8xnfffafrr79eERERuvTSS/X000/L5XKVmu9nn32mjh07qmbNmoqMjFSvXr303XffedwzZMgQ1apVS7/88ov69u2rWrVqqX79+nr00UfldDo97n3nnXeUlJSkyMhIRUVFqU2bNnrppZc87jl58qQefvhhxcfHKywsTM2aNdNzzz1XIseTJ09qyJAhio6OVu3atZWWlqaTJ0+W+j7K6+x72rt3r3r27KnIyEgNGDBAkuRyuTRjxgy1atVK4eHhatCgge677z79+uuvJeKU5fP7vUmTJikhIUGS9Nhjj8lms3kUQtu2bVOPHj0UFRWlWrVq6YYbbtDmzZs9Ypydk7N27Vo9+OCDio2N1aWXXnre1/ziiy9ks9n07rvvavLkybrkkksUGRmp2267TdnZ2SooKNDDDz+s2NhY1apVS0OHDi3xd9BqnTp18ig2zl6LiYnRzp07KzUXAAhEdDiAILFkyRI1adKkzMN17r33Xi1YsEC33XabHnnkEW3ZskXp6enauXOnFi9e7HHvnj17dNttt+mee+5RWlqa3njjDQ0ZMkRJSUlq1aqVpDPf5l933XUqLi7W+PHjVbNmTc2ZM0cRERElXvutt95SWlqaunXrpueee075+fmaPXu2OnTooG3btnn8Eux0OtWtWzclJyfr+eef1+eff64XXnhBTZs21QMPPCBJWrlype666y7dcMMNeu655yRJO3fu1IYNG9xFVn5+vq699lr98ssvuu+++3TZZZdp48aNmjBhgg4fPqwZM2ZIkgzD0M0336z169fr/vvvV4sWLbR48WKlpaWV67/HhRQXF6tbt27q0KGDnn/+edntdknSfffdp/nz52vo0KEaNWqU9u3bp5kzZ2rbtm3asGGDatSoUe7P71y33nqrateurTFjxuiuu+5Sz549VatWLUlnisWOHTsqKipK48aNU40aNfT666+rc+fOWrt2rZKTkz1iPfjgg6pfv74mTpyovLy8i77n9PR0RUREaPz48dqzZ49eeeUV1ahRQyEhIfr11181adIkbd68WfPnz1fjxo01ceLEC8bLz89Xfn7+RV+3WrVqqlOnzkXv+73c3Fzl5uZ6DIUDAJyHAaDKy87ONiQZN998c5nu3759uyHJuPfeez2uP/roo4YkY/Xq1e5rCQkJhiRj3bp17mtHjx41wsLCjEceecR97eGHHzYkGVu2bPG4Lzo62pBk7Nu3zzAMw/jtt9+M2rVrG8OGDfN47aysLCM6OtrjelpamiHJmDJlise9f/jDH4ykpCT3+ejRo42oqCijuLj4vO956tSpRs2aNY0ffvjB4/r48eONatWqGQcOHDAMwzA++ugjQ5Ixbdo09z3FxcVGx44dDUnGvHnzzvsav/f3v//d472f+57Gjx/vce///d//GZKMhQsXelxftmyZx/XyfH6l2bdvnyHJ+Pvf/+5xvW/fvkZoaKixd+9e97VDhw4ZkZGRRqdOndzX5s2bZ0gyOnTocMHP+6w1a9YYkozWrVsbhYWF7ut33XWXYbPZjB49enjcn5KSYiQkJFw07lNPPWVIuuhRllilmTp1qiHJWLVqlVfPB4BgwpAqIAjk5ORIkiIjI8t0/6effipJGjt2rMf1Rx55RJJKzPVo2bKlOnbs6D6vX7++mjdvrh9//NEj5jXXXKM//vGPHvedHS501sqVK3Xy5Enddddd+ve//+0+qlWrpuTkZK1Zs6ZEvvfff7/HeceOHT1eu3bt2srLy9PKlSvP+57fe+89dezYUXXq1PF43S5dusjpdGrdunXu91G9enV390Q68y35Qw89dN7Y3jg3/tn8oqOjdeONN3rkl5SUpFq1ark/F28+v4txOp1asWKF+vbtqyZNmrivN2zYUH/+85+1fv1699+xs4YNG6Zq1aqV+TUGDx7s7tBIUnJysgzD0N133+1xX3Jysg4ePKji4uKLxlu5cuVFj4ULF5Y5x7PWrVunyZMn64477tD1119f7ucDQLBhSBUQBKKioiRJv/32W5nu/+mnnxQSEqJmzZp5XI+Li1Pt2rX1008/eVy/7LLLSsSoU6eOx9yCn376qcSwG0lq3ry5x/nu3bsl6by/yJ19L2eFh4erfv36F3ztBx98UO+++6569OihSy65RF27dtUdd9yh7t27e7zuN998UyLWWUePHnW/j4YNG7qHGp3vfVRE9erVS8x72L17t7KzsxUbG3vB/Mr7+ZXFsWPHlJ+fX+p7bNGihVwulw4ePOgePidJjRs3Ltdr/P7vUHR0tCQpPj6+xHWXy6Xs7GzVrVv3vPGaNGniURyZJTMzU7fccotat26t//mf/zE9PgBURRQcQBCIiopSo0aN9O2335breTabrUz3ne+bbMMwyvV6ktwTtN96661SlxutXt3zx1ZZvkWPjY3V9u3btXz5cn322Wf67LPPNG/ePA0ePFgLFixwv+6NN96ocePGlRrjiiuuKO9b8VpYWFiJScoul0uxsbHn/Ub+bKFU3s/PKqXNzbmQ8/139Pbv1tk5FmV53fMVmb938OBB94aIn376aZk7hgAQ7Cg4gCDRu3dvzZkzR5s2bVJKSsoF701ISJDL5dLu3bvVokUL9/UjR47o5MmT7pWMyiMhIcH97fu5du3a5XHetGlTSWeKhC5dupT7dc4nNDRUffr0UZ8+feRyufTggw/q9ddf15NPPqlmzZqpadOmys3NvehrJiQkaNWqVcrNzfXocvz+fZitadOm+vzzz5WamnrBX+at+Pzq168vu91e6nvMzMxUSEhIiU6Erz3//POaPHnyRe9LSEgo0y73x48fV9euXVVQUKBVq1aVutIbAKB0zOEAgsS4ceNUs2ZN3XvvvTpy5EiJx/fu3eteJrZnz56S5F6Z6azp06dLknr16lXu1+/Zs6c2b96sL7/80n3t2LFjJb6x79atm6KiovTMM8+oqKioRJyz+0SUx/Hjxz3OQ0JCdOWVV0qSe4nVO+64Q5s2bdLy5ctLPP/kyZPuOQM9e/ZUcXGxZs+e7X7c6XTqlVdeKXde5XHHHXfI6XRq6tSpJR4rLi52L8trxedXrVo1de3aVR9//LHHL+dHjhzRokWL1KFDB6+GalnJzDkceXl56tmzp3755Rd9+umnuvzyyyvhHQBA1UGHAwgSTZs21aJFi3TnnXeqRYsWHjuNb9y4Ue+9956GDBkiSWrbtq3S0tI0Z84cnTx5Utdee62+/PJLLViwQH379tV1111X7tcfN26c3nrrLXXv3l2jR492L4ubkJCgb775xn1fVFSUZs+erUGDBql9+/bq37+/6tevrwMHDuiTTz5RamqqZs6cWa7Xvvfee3XixAldf/31uvTSS/XTTz/plVdeUbt27dwdnMcee0z/+7//q969e7uX9M3Ly9OOHTv0/vvva//+/apXr5769Omj1NRUjR8/Xvv371fLli314YcfKjs7u9yfSXlce+21uu+++5Senq7t27era9euqlGjhnbv3q333ntPL730km677TZLPj9Jevrpp7Vy5Up16NBBDz74oKpXr67XX39dBQUFmjZtmgXvuGLMnMMxYMAAffnll7r77ru1c+dOj703atWqVWJDRwDA7/h4lSwAleyHH34whg0bZiQmJhqhoaFGZGSkkZqaarzyyivG6dOn3fcVFRUZkydPNho3bmzUqFHDiI+PNyZMmOBx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q0w51K5dWx9//LF2796tnTt3ymazqUWLFmrWrFn53sw5KDgAAAhSlbFPxlkdOiyxND77ZqAqyMvLU9u2bXX33Xfr1ltvLfWe7t27a968ee7zsLAwj8cHDBigw4cPa+XKlSoqKtLQoUM1fPhwLVq0qFy5XH755e4iw2ar2NAwCg4AAIKUw+FQyqWDJUkzPx5tyWtYvV/GWeybgQrzg0njPXr0UI8ePS54T1hYmOLi4kp9bOfOnVq2bJm2bt2qq666SpL0yiuvqGfPnnr++efVqFGjMuUxd+5cvfjii9q9e7ekM8XHww8/rHvvvbcc7+a/vC44/u///k+vv/669u7dq/fff1+XXHKJ3nrrLTVu3FgdOnTwNiwAAKgkdrtd0eENJFmzT8ZZ7JeBYJeTk+NxHhYWVqIzUVZffPGFYmNjVadOHV1//fV6+umnVbduXUnSpk2bVLt2bXexIUldunRRSEiItmzZoltuueWi8SdOnKjp06froYceUkpKijvumDFjdODAAU2ZMqXcOXs1afyDDz5Qt27dFBERoW3btqmgoECSlJ2drWeeecabkED5nB1oyXKLAFAx/CwFzrBwlar4+HhFR0e7j/T0dK9S7N69u958802tWrVKzz33nNauXasePXrI6XRKkrKyshQbG+vxnOrVqysmJkZZWVlleo3Zs2frH//4h9LT03XTTTfppptuUnp6uubMmaNXX33Vq7y96nA8/fTTeu211zR48GC988477uupqal6+umnvUoEKKuV6/+qG1P5ewb4tf/84wcAkA4ePKioqCj3ubfdjf79+7v/3KZNG1155ZVq2rSpvvjiC91www0VzlOSioqKPDokZyUlJam4uNirmF51OHbt2qVOnTqVuB4dHa2TJ096lQgAAADgKzbDmkOSoqKiPA5vC47fa9KkierVq6c9e/ZIkuLi4nT06FGPe4qLi3XixInzzvv4vUGDBmn27Nklrs+ZM0cDBgzwKk+vOhxxcXHas2ePEhMTPa6vX79eTZo08SoRAEDVYbhYvzpguAwpJPA2JwNM5weTxsvr559/1vHjx9WwYUNJUkpKik6ePKmMjAz3CnSrV6+Wy+VScnJymePOnTtXK1as0DXXXCNJ2rJliw4cOKDBgwdr7Nix7vumT59epnheFRzDhg3T6NGj9cYbb8hms+nQoUPatGmTHn30UT355JPe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\n" }, "metadata": {} } ] } }, "f22f502f241a4398beb442f3e6e8de11": { "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 } }, "0f149a793c354f5a86017e1a6225c44e": { "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" } }, "e1b9ab6f98d7433f8f1277f7c4aec398": { "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" } }, "fce5d88992ea4fa7952ea17f8054654f": { "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 }