From d5da16423517af1e7f8b52ddfd7e6aaed11b912a Mon Sep 17 00:00:00 2001 From: ide-screen Date: Fri, 10 Apr 2026 12:42:23 +0900 Subject: [PATCH] Add example notebook --- ...th_continuous_and_discrete_variables.ipynb | 1051 +++++++++++++++++ 1 file changed, 1051 insertions(+) create mode 100644 Example_to_use_FCI_algorithm_on_data_with_continuous_and_discrete_variables.ipynb diff --git a/Example_to_use_FCI_algorithm_on_data_with_continuous_and_discrete_variables.ipynb b/Example_to_use_FCI_algorithm_on_data_with_continuous_and_discrete_variables.ipynb new file mode 100644 index 0000000..5196013 --- /dev/null +++ b/Example_to_use_FCI_algorithm_on_data_with_continuous_and_discrete_variables.ipynb @@ -0,0 +1,1051 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d82d787b-33a6-4347-9190-f12d10a2fc11", + "metadata": {}, + "source": [ + "# How to use the FCI algorithm on data with discrete variables" + ] + }, + { + "cell_type": "markdown", + "id": "9b134699-6741-4e69-9b65-f5fa52d59bf0", + "metadata": {}, + "source": [ + "## Import and settings" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5eded77f-6495-4f84-b066-3ae1dd98173a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "python 3.11.9\n", + "numpy 2.3.2\n", + "pandas 2.3.2\n", + "sklearn 1.7.1\n", + "matplotlib 3.10.5\n", + "networkx 3.5\n" + ] + } + ], + "source": [ + "import sys\n", + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as patches\n", + "import networkx as nx\n", + "\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "# version\n", + "import sklearn\n", + "import matplotlib\n", + "import platform\n", + "print('python', platform.python_version())\n", + "for lib in [np, pd, sklearn, matplotlib, nx]:\n", + " print(lib.__name__, lib.__version__)\n", + "\n", + "np.set_printoptions(precision=3, suppress=True)" + ] + }, + { + "cell_type": "markdown", + "id": "ae0c8b65-7edc-4e64-a544-d98b5427adf5", + "metadata": {}, + "source": [ + "## Test data\n", + "First, we generate a causal structure with 8 variables.\n", + "\n", + "These variables are grouped as follows:\n", + "- Exogenous variables: X1, B1, T1\n", + "- Endogenous variables: X2_1, X2_2, X2_3, X2_4\n", + "- Sink variable: B3\n", + "\n", + "The types of the variables are as follows:\n", + "- Continuous variables: X1, X2_1, X2_2, X2_3, X2_4\n", + "- Binary variables: B1, B3\n", + "- Ternary variable: T1\n", + "\n", + "In addition, there are 2 latent variables, U1 and U2." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "af435ca6-e1ea-4551-bdca-27b4fc836b46", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
X1B1T1X2_1X2_2X2_3X2_4B3
00.532412020.864091-1.0518173.1015970.4737081
1-0.621139021.314322-1.085594-1.128762-0.9187941
2-0.28132010-1.4934060.084458-0.585393-0.1367501
3-1.50589502-2.383614-0.5037310.713074-2.6383500
4-2.162436020.4195590.349438-0.3828631.5988341
\n", + "
" + ], + "text/plain": [ + " X1 B1 T1 X2_1 X2_2 X2_3 X2_4 B3\n", + "0 0.532412 0 2 0.864091 -1.051817 3.101597 0.473708 1\n", + "1 -0.621139 0 2 1.314322 -1.085594 -1.128762 -0.918794 1\n", + "2 -0.281320 1 0 -1.493406 0.084458 -0.585393 -0.136750 1\n", + "3 -1.505895 0 2 -2.383614 -0.503731 0.713074 -2.638350 0\n", + "4 -2.162436 0 2 0.419559 0.349438 -0.382863 1.598834 1" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rng = np.random.default_rng(0)\n", + "\n", + "n_sample = 1000\n", + "sigmoid = lambda z: 1/(1 + np.exp(-z))\n", + "\n", + "U1 = rng.normal(0, 1, n_sample)\n", + "U2 = rng.normal(0, 1, n_sample)\n", + "\n", + "X1 = 0.9 * U1 + rng.normal(0, 1, n_sample) # X1 <- U1\n", + "B1 = rng.binomial(1, sigmoid(0.8 * U1), size=n_sample) # B1 <- U1\n", + "\n", + "Zt = 1.0 * rng.normal(0, 1, n_sample)\n", + "q1, q2 = np.quantile(Zt, [1/3, 2/3])\n", + "T1 = np.digitize(Zt, bins=[q1, q2])\n", + "\n", + "X2_1 = 0.9 * X1 - 0.8 * B1 - 0.4 * U2 + rng.normal(0, 1, n_sample) # X2_1 <- X1, B1, U2\n", + "X2_2 = 0.4 * B1 - 0.3 * T1 + rng.normal(0, 1, n_sample) # X2_2 <- B1, T1\n", + "X2_3 = 0.5 * T1 + 0.5 * U2 + rng.normal(0, 1, n_sample) # X2_3 <- T1, U2\n", + "X2_4 = 0.3 * X1 + 0.6 * X2_1 + 0.7 * X2_3 + rng.normal(0, 1, n_sample) # X2_4 <- X1, X2_1, X2_3\n", + "\n", + "B3 = rng.binomial(1, sigmoid(0.9 * X2_3 + 1.1 * X2_4), size=n_sample) # B3 <- X2_3, X2_4\n", + "\n", + "X = pd.DataFrame({'X1': X1, 'B1': B1, 'T1': T1, 'X2_1': X2_1, 'X2_2': X2_2, 'X2_3': X2_3, 'X2_4': X2_4, 'B3': B3})\n", + "NODE_NAMES = list(X.columns)\n", + "X.head()" + ] + }, + { + "cell_type": "markdown", + "id": "c999848b-6ac1-46dc-9f4e-717979a5e09e", + "metadata": {}, + "source": [ + "Histograms of test data are as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1da34eed-adaa-47c6-bf80-3b0e4dbeaaea", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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AMARggoAAAAAjhBUAAAAAHCEoAIAAACAI8WcPR0AAACID3XGLAlq+4NTe0i8oKYCAAAAgCMEFQAAAAAiG1Rs2LBB7rjjDqlevbokJCTIe++95/e4ZVkyfvx4qVatmpQoUUK6dOkin376qd82J0+elD59+kjZsmWlfPnyMnDgQDl79qyzlAARNmXKFGnVqpWUKVNGKleuLD179pQDBw74bfPTTz/J4MGDpWLFilK6dGnp3bu3HD9+3G+bQ4cOSY8ePaRkyZLmdUaNGiUXL16McGoAAAAiGFScO3dOmjZtKrNmzQr4eHp6ujz//PPy4osvykcffSSlSpWSbt26mZMrmwYUe/bskZUrV8rixYtNoPLggw86SAYQeevXrzcBw5YtW0xezsrKkq5du5oyYhs+fLgsWrRI5s+fb7Y/cuSI9OrVy/d4dna2CSguXLggmzZtktdff10yMjJMYA4AABCzHbVvu+02swSitRQzZsyQcePGyZ133mnWvfHGG1KlShVTo3HPPffIvn37ZNmyZbJt2zZp2bKl2WbmzJly++23y7Rp00wNSF6ZmZlmsZ05c8bc6kmcLtFgv28w75+SZIVxj/7/eyRafrfhEOwxL8qxCqVwva/m49w0GNCahh07dkj79u3l9OnT8uqrr8rbb78tnTp1MtvMnTtXGjRoYAKRm266SVasWCF79+6VVatWmXLSrFkzmTx5sowePVrS0tKkePHijsqDfT+Y/BCtzynUop3vQi3Y7w/7M88vTwAA4NrRn7788ks5duyYafJkK1eunLRp00Y2b95sggq91SZPdkChdPvExERTs/HrX/86YDOTiRMnXrZeT8i0yUg06RXqwkpvLREzuWVO2F576dKlYT9WoXT+/PmIvI8GEapChQrmVoMLPYHLXR7q168vtWrVMuVAgwq9bdKkiQkobFqzN2jQIFOb17x585CUh2DyQ1E/X7eKVr4LtaJ+f+RNf6TKAxDvtBXGM888Y34Ljh49KgsXLjTNZHNfiJ0wYYK88sorcurUKWnXrp3MmTNHrrvuOr/m4kOHDjU13nqepE1on3vuOdOcFojpoEIDCpX7BMm+bz+mt3o1128nihUzJ2L2NnmNHTtWRowY4XdltmbNmqapifbLiAY9WdQf61tvvVWSk5ML9ZzGacvDvl96dVJPIB/fniiZOQlheY/dad3CfqxCyb6S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brnlFpk4caI899xzJvDQctW9e3fJycmJ6v57joWoO378uPVf//VfVseOHf3Wf/HFF1aJEiWs3r17m/uLFi2ykpOTrTvvvNOaMWOG9cILL5jn6Mc4fvz4oN4zlK8FeL08qHbt2lkPP/yw9fzzz1svv/yyNWjQICslJcWsz87ODln6AK+UidzuuOMOq1SpUua1tm3b5ui1gHCbO3duwLx68uRJU0buvffeAp8/bdo08/zNmzeHeU9jC0GFS+hJjGbgjIwM37ru3btbZcuWtb7++mvfD8jBgwf9npeTk2N16tTJnPycPXu20O8XytcCvF4e8sMPC9wimmVi2bJlVvHixa1x48YRVMDTQYWWBy0z/fr1K/D5f/3rX83zP/jggzDvaWyh+ZNL3H///dKuXTv54x//aKqw582bJ8uWLZMnnnhCrr76arNN3bp1pXbt2n7P06ronj17SmZmpnzxxReFfr9Qvhbg9fKQnzp16pjbU6dOOX4twItlIisrSx555BGz/OxnPwtZeoBIOH36tHz33Xem2dOePXtk0KBBpkmrNinM7eLFi2a7I0eOyIoVK2TcuHFSpkwZad26ddT23YuKRXsHcOmL/6WXXpLmzZubTP/3v/9dWrZsKYMHD77ic48dO2ZuK1Wq5Hg/QvlagNfKg/6waABx4cIF2b17Nz8skHgvEzNmzJB///vfpiwsWLCgSPsOREuXLl387qekpMhrr70mt956q9967SfUtm1b3/169erJ3/72N9PHDoVHUOEijRo1MlehpkyZIklJSbJkyRJJTCy4MunkyZPy5z//2XQyqlatmqP3D+VrAV4sD/ywwM0iXSY0GJk8ebJMmzZNypYt63DvgcibNWuWXH/99eb/48ePy5tvvmlq/fRiUa9evXzbNWzYUFauXCnnzp2TTZs2yapVqxikowgIKlzGvpJUvXp1ady4cYHb6qgEffr0MVdWZ86c6eh9Q/lagFfLAz8scLtIlonRo0fLNddcY07CAC/SWmat0bP99re/NbV9Q4YMkV/+8pdSvHhxs16DZrtW484775S3337b3H788cfStGnTqO2/50S7UwcuOXTokFW6dGmrcePGpoPQ5MmTC9z+f/7nf8x2b7zxhuP3DuVrAV4vD7a33nrLSkxMtHbu3Bmy1wS8UCZ0cIKEhARrzZo1V+z8CrhNQXn1kUceMY/t3r07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flmB0u6kjxFBBQAgJBghEPCnfSU+/vhj0/wpr2j3MbL7qwTb/yba/WxCxU19qiLdL8vuexUo7U76GBFUAABCghECgUsOHz5sOmXriasOYhMpwfYxCrb/TSycgLutT1UoFKUPVaC0OzkWBBUAgJBghEBA/Jo3aTO+G2+80bdOO15rX6MXXnhBli9fTh8jxO+M2gAAALiyzp07y65du2Tnzp2+pWXLlqbTtv2/3cfIFqiPkb6GBic2+hjBraipAAAACDHtV2TP0WLT5nwVK1b0raePEWIJQQUAAEAU0McIsYSgAgAAIAJ0qOXc6GOEWEKfCgAAAACOEFQAAAAAcISgAgAAAIAjBBUAAAAAHCGoAAAAAOAIQQUAAAAARwgqAAAAADhCUAEAAADAEYIKAAAAAI4QVAAAAABwhKACAAAAgCMEFQAAAAAcIagAAAAA4EgxZ08HgKKpM2ZJtHcBAACECDUVAAAAABwhqAAAAADgCEEFAAAAAEcIKgAAAAA4QlABAAAAwBGCCgAAAACOEFQAAAAAcISgAgAAAIAjTH4XQUz2BQAAgFhETQUAAAAARwgqAAAAADhCUAEAAADAEYIKwIENGzbIHXfcIdWrV5eEhAR57733/B63LEvGjx8v1apVkxIlSkiXLl3k008/9dvm5MmT0qdPHylbtqyUL19eBg4cKGfPno1wSgAAAIqOjtqISIfzg1N7SCw6d+6cNG3aVH7/+99Lr169Lns8PT1dnn/+eXn99delbt268vjjj0u3bt1k7969kpqaarbRgOLo0aOycuVKycrKkvvuu08efPBBefvtt6OQIkSiTMRqeQAAxK9iRbky+8wzz8iOHTvMidDChQulZ8+efldmJ0yYIK+88oqcOnVK2rVrJ3PmzJHrrrvO78rs0KFDZdGiRZKYmCi9e/eW5557TkqXLh26lAERcNttt5klEC0LM2bMkHHjxsmdd95p1r3xxhtSpUoVU6Nxzz33yL59+2TZsmWybds2admypdlm5syZcvvtt8u0adNMDQgARAsXkQCELajgyixQOF9++aUcO3bMNHmylStXTtq0aSObN282QYXeapMnO6BQur0G2x999JH8+te/vux1MzMzzWI7c+aMudWypEu42K8dqvdISbJC8jqXvW6i5XfrRrk/q3B+Zvm9NwAAUQ8quDILFI4GFErzf256335MbytX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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "X.hist(layout=(2, 4), figsize=(8, 4))\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "75d07d8c-60e6-43fa-8172-6117902518b4", + "metadata": {}, + "source": [ + "### Classify test data variables into three subsets\n", + "We classify test data variables into three subsets: exogenous variables, endogenous variables, and the sink variable." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e110b342-6cf9-41b4-b742-12d13ab7ced0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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SKhFljCfmlYb612zClQoRBJXqlTJtP20C/R6sHrarFmz4HTWr1+P+fPn22YiJYSvkFCLbOFNkdWfWAXKybC954cffmjafbLtp11o0KABLr744pAIKuPaNNelWZ1NiFBCQi2ypUmTJibCmNamk5k6dapp88l2n3acTLGKGqupOZUTJ06Yc8SqbFyOESKUkFALr4Rg8eLFJl3LiTDVhxORa6+91ri+7cYll1yCmjVrOnoyxSpscXFxpiqbEKGGhFrkyBVXXIGqVas6Vgh++OEHbNy40bZrn6yexipqrCR38OBBOA0W3WEQ2VVXXWWqkQkRakioRY6w+hOrQLEaFKtCOQ2KwHnnnYcLLrgAdoVV1JhSx6pqToOR+P/9959tJ1JC5BcJtfAKVoFisQl2bXISW7ZswbfffmtEgEVE7EqZMmVw0003mapqrK7mtIkUYyW6dOkS7KEIERQk1MIrypcvj+uvv964vynYTookZhoa23vaHaZq7dy5E19//TWcAquusfqa3SdSQuQHCbXwGt4st27dirlz58IJsI0n60azrSfbe9qdVq1aGfe9k8q+Moc/OjoaN998c7CHIkTQkFALr/FUhHKKEMyYMcPkT3P93UmTqQULFpjOWnaH1dbee+89DBw40Ii1EKGKhFrkWgjmzZuHDRs2wAmRxGznybaeTqFv376oWLGiIyL0P/30U1N1jRHtQoQyEmqRK1gVqmzZsmZt184sWbIEq1evxgMPPAAnwapqrK72wQcfGG+BneFEqlevXqhfv36whyJEUJFQi1xRpEgRUx2K0d+xsbGwswhQAHr06AGnwepqrLI2bdo02BVWWWO1NaVkCSGhFnmA1aEo0qwWZUf27NmDzz//3ERJM/fYaVSuXNm4wOn+ZtU1u06katWqhT59+gR7KEIEHefdpYTfqV69uqkSxZsp13rtBttCsl4023g6FVqijCP48ccfYTcOHDiAmTNnmokUq64JEepE5OfFLFd4/Phx341G5ArPGqQnsIuRvoE6H+zYxI5ajMpt06YN7MLp06fNBIOW2ubNm+FUihYtinr16uHFF180MQV2gilzzJlmutnKlSsD8p7btm0zP//666+gdU/jeeIkWIiMhLnyaBKxEMEjjzxi1sJEcPjmm2+CPQQhhI9gLv/atWsl1sJ3FjXTJijSjz76qArlB4nnn3/e/Fy+fLmJ9GUFp0Cei1mzZmH06NGYM2eOSQmyS03sggULYsKECXA6J0+eRO/evXHNNdfgwQcfhB34+eef8fjjj5scd/baDhTfffcdnnnmGfz2229Bsagp0CzqwvuqhFr41PVNKAx16tTJ72FEPvC4u1kPuW7dugF7X0ZNM02LqU4jR46E1aFbkylZDCSjWzUU4ARu8uTJpga4HaqvceJ/4YUXBrykK5t+kJYtW6rftbAcCiYTeYbVogYMGGCCs1hFyupwbZrtOtm2M1Rg1bWYmBh8/PHHsDpr1qwxnbKUkiVEeiTUIl+wahTddXSDW5nDhw8bdyqFi207QwV6uy655BJbROgznaxSpUq4+uqrgz0UISyFrYSas21Gg9JCENaA64iMALd6/W+6f5lTzGItoQarr61atQpLly6FVeE1zWpqdNUHK+paiJATarpEKaoZNwa3CGdBVyUrSXGzImzLybX0G264AeXKlUOo0bNnT5OqZeXJFKuoJSYmmqpqQogAWtQU5b1796bb7LBWJnIHXas1a9a0bCMIRvQyTzZU1z5ZfY3FQz777DNzDVoNejr43bn22muN61sIEUChZvQk03bSbqVKlTLP0bqeNGmSWY9iNCpn/Bkb3vMGy8hiFm/o1q1balGCtDCCl9HOfC+Kxeuvv57ued6Y2CGJx2BJQq5Tcr8xY8akc7vdcccdxtoqXrw4unfvbqKDPTz33HM477zz8OGHH5rXlihRwlhnJ06cSN2HqWqDBw9G+fLlTT1sRq6yVrGHqVOnomTJkunGxnQq/h888D35OYsVK2bG0bp1a5N6ZXVYPYpr1Z988okpgmM1aEl6WnSGKqzCxmuEgX9W44cffsDGjRtDdiIlhKXXqJkHzG5Mf//9t7HK+vfvjyNHjpjndu7cafI/L7/8crO+RiF98skn071+xYoV5vUUzX/++ccIKnMhKYoebr31VlPbmevbFHXeqFiiMC3XXXedeWzu3LnmmEzdueiii1LHQljFisLKIiPcfv31V7zyyiupzz/xxBPm+HThsZoS06TY+SftMXKCn59RyRR4joOflzm/dslPpuXGyZeVWL9+PebPnx/yIsBJ4i233ILx48cbF7PVJlKcCF9wwQXBHooQ1sSVR1asWOG67LLLXJs2bcr0+dtuu80VHh7uioqKSreNHDnSPM+3HjZsWOr+sbGx5rG5c+eav596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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def add_fixed_box(ax, box, label, *, padding=0.01):\n", + " x0, y0, w, h = box\n", + " rect = patches.Rectangle((x0, y0), w, h, fill=False)\n", + " ax.add_patch(rect)\n", + " ax.text(\n", + " x0 + padding, y0 + h - padding, label,\n", + " ha='left', va='top',\n", + " bbox=dict(facecolor='white', alpha=0.3, edgecolor='none')\n", + " )\n", + " return rect\n", + "\n", + "# Node positions\n", + "POS = {\n", + " 'U1': (0.3, 0.95),\n", + " 'X1': (0.2, 0.8),\n", + " 'B1': (0.4, 0.8),\n", + " 'T1': (0.6, 0.8),\n", + " 'U2': (0.8, 0.48),\n", + " 'X2_1': (0.3, 0.55),\n", + " 'X2_2': (0.5, 0.55),\n", + " 'X2_3': (0.6, 0.4),\n", + " 'X2_4': (0.2, 0.4),\n", + " 'B3': (0.4, 0.2),\n", + "}\n", + "\n", + "B_true = pd.DataFrame([\n", + " [0, 0, 0, 1, 0, 0, 1, 0],\n", + " [0, 0, 0, 1, 1, 0, 0, 0],\n", + " [0, 0, 0, 0, 1, 1, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 1, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 1, 1],\n", + " [0, 0, 0, 0, 0, 0, 0, 1],\n", + " [0, 0, 0, 0, 0, 0, 0, 0]\n", + "], index=NODE_NAMES, columns=NODE_NAMES)\n", + "\n", + "G_true = nx.from_pandas_adjacency(B_true, create_using=nx.DiGraph)\n", + "\n", + "# Latent Confounder\n", + "latent_nodes = {'U1', 'U2'}\n", + "latent_edges = [\n", + " ('U1', 'X1'),\n", + " ('U1', 'B1'),\n", + " ('U2', 'X2_1'),\n", + " ('U2', 'X2_3'),\n", + "]\n", + "G_true.add_nodes_from(['U1', 'U2'])\n", + "G_true.add_edges_from(latent_edges)\n", + "node_colors = ['#EEEEEE' if n in latent_nodes else '#AACCFF' for n in G_true.nodes()]\n", + "\n", + "# Draw nodes\n", + "fig, ax = plt.subplots(figsize=(5, 5))\n", + "nx.draw_networkx_nodes(\n", + " G_true, POS,\n", + " node_color=node_colors,\n", + " node_size=1500,\n", + " ax=ax\n", + ")\n", + "nx.draw_networkx_labels(G_true, POS, ax=ax)\n", + "\n", + "# Draw edges\n", + "dashed_edges = [(u, v) for (u, v) in G_true.edges() if (u in latent_nodes or v in latent_nodes)]\n", + "solid_edges = [(u, v) for (u, v) in G_true.edges() if (u, v) not in dashed_edges]\n", + "\n", + "nx.draw_networkx_edges(\n", + " G_true, POS,\n", + " edgelist=solid_edges,\n", + " arrowsize=20,\n", + " min_target_margin=18,\n", + " ax=ax\n", + ")\n", + "nx.draw_networkx_edges(\n", + " G_true, POS,\n", + " edgelist=dashed_edges,\n", + " arrowsize=20,\n", + " min_target_margin=18,\n", + " style='dashed'\n", + ")\n", + "\n", + "xs, ys = map(np.array, zip(*POS.values()))\n", + "ax.set_xlim(xs.min() - 0.20, xs.max() + 0.10)\n", + "ax.set_ylim(ys.min() - 0.10, ys.max() + 0.10)\n", + "\n", + "# Draw grouping boxes\n", + "add_fixed_box(ax, (0.01, 0.74, 0.65, 0.12), 'Exogenous')\n", + "add_fixed_box(ax, (0.01, 0.34, 0.65, 0.32), 'Endogenous')\n", + "add_fixed_box(ax, (0.01, 0.14, 0.65, 0.12), 'Sink')\n", + "\n", + "ax.set_axis_off()\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "0c8fad38-e4aa-4fa9-b08a-033a01ec7848", + "metadata": {}, + "source": [ + "## Setting prior knowledge\n", + "Based on a three-layer structure of exogenous, endogenous, and sink variables, reverse-direction edges are prohibited." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "2eb61e9a-93ce-48c2-bab5-41a8f2dd13c3", + "metadata": {}, + "outputs": [], + "source": [ + "from causallearn.utils.PCUtils.BackgroundKnowledge import BackgroundKnowledge\n", + "from causallearn.graph.GraphNode import GraphNode\n", + "\n", + "exog_var_names = ['X1', 'B1', 'T1']\n", + "endog_var_names = ['X2_1', 'X2_2', 'X2_3', 'X2_4']\n", + "sink_var_name = 'B3'\n", + "\n", + "all_names = exog_var_names + endog_var_names + [sink_var_name]\n", + "nodes = {name: GraphNode(name) for name in all_names}\n", + "\n", + "# Setting prior knowledge\n", + "bk = BackgroundKnowledge()\n", + "\n", + "# Prohibit edges Endogenous -> Exogenous\n", + "for endog in endog_var_names:\n", + " for exog in exog_var_names:\n", + " bk.add_forbidden_by_node(nodes[endog], nodes[exog])\n", + "\n", + "# Prohibit edges Exogenous <-> Sink\n", + "for exog in exog_var_names:\n", + " bk.add_forbidden_by_node(nodes[sink_var_name], nodes[exog])\n", + " bk.add_forbidden_by_node(nodes[endog], nodes[sink_var_name])\n", + "\n", + "# Prohibit edges Sink -> Endogenous\n", + "for endog in endog_var_names:\n", + " bk.add_forbidden_by_node(nodes[sink_var_name], nodes[endog])" + ] + }, + { + "cell_type": "markdown", + "id": "8e11d165-ac32-4b11-ab96-3cd33e4b18c8", + "metadata": {}, + "source": [ + "## FCI algorithm" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e79b322f-60aa-43ae-9388-c38e34fc3e13", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: total: 78.1 ms\n", + "Wall time: 222 ms\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
X1B1T1X2_1X2_2X2_3X2_4B3
X1020-100-10
B1200-1-1000
T10000-1-100
X2_111000110
X2_201100000
X2_3001100-1-1
X2_410010100
B300000100
\n", + "
" + ], + "text/plain": [ + " X1 B1 T1 X2_1 X2_2 X2_3 X2_4 B3\n", + "X1 0 2 0 -1 0 0 -1 0\n", + "B1 2 0 0 -1 -1 0 0 0\n", + "T1 0 0 0 0 -1 -1 0 0\n", + "X2_1 1 1 0 0 0 1 1 0\n", + "X2_2 0 1 1 0 0 0 0 0\n", + "X2_3 0 0 1 1 0 0 -1 -1\n", + "X2_4 1 0 0 1 0 1 0 0\n", + "B3 0 0 0 0 0 1 0 0" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "from io import StringIO\n", + "from causallearn.search.ConstraintBased.FCI import fci\n", + "\n", + "# start capture\n", + "default_out = sys.stdout\n", + "sys.stdout = StringIO()\n", + "\n", + "G_fci, _ = fci(\n", + " X.values,\n", + " node_names=NODE_NAMES,\n", + " is_discrete=[False, True, True, False, False, False, False, True],\n", + " indep_test='kci', # Use KCI for the independence test\n", + " background_knowledge=bk,\n", + " show_progress=False, \n", + " verbose=False\n", + ")\n", + "\n", + "# stop capture\n", + "del sys.stdout\n", + "sys.stdout = default_out\n", + "\n", + "adjacency_matrix = G_fci.graph\n", + "B_est = pd.DataFrame(adjacency_matrix, index=NODE_NAMES, columns=NODE_NAMES)\n", + "B_est" + ] + }, + { + "cell_type": "markdown", + "id": "64682c74-1b61-4618-a0f0-222a6e06187a", + "metadata": {}, + "source": [ + "## Visualize a result\n", + "The causal graph is as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e549cf81-0fa4-44ef-b576-88766df97a52", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAHqCAYAAADLbQ06AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAYE5JREFUeJzt3Qd4FEUbB/A/KZQECCWEXkOvUgREAWlSBCw0lf5RPkEUFRBFBPkQ6YJYaEq1UwTpiICgIEJogkhHkBIIJJCEmuS+553zjiSkXL/dvf/veY5cruzNZth9b2Zn3sliMplMICIiIk3y83YBiIiIKH0M1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzUREREGsZATUREpGEM1ERERBrGQE1ERKRhDNREREQaxkBNRESkYQzURERE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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib.patches import FancyArrowPatch\n", + "\n", + "# causal-learn endpoint codes\n", + "TAIL, ARROW, CIRCLE, NULL = -1, 1, 2, 0\n", + "\n", + "n_variables = len(NODE_NAMES)\n", + "\n", + "# undirected skeleton graph for positioning\n", + "G_est = nx.Graph()\n", + "G_est.add_nodes_from(NODE_NAMES)\n", + "\n", + "# collect unique edges (i < j) where something exists\n", + "edges = []\n", + "for i in range(n_variables):\n", + " for j in range(i + 1, n_variables):\n", + " if adjacency_matrix[i, j] != NULL or adjacency_matrix[j, i] != NULL:\n", + " G_est.add_edge(NODE_NAMES[i], NODE_NAMES[j])\n", + " edges.append((i, j))\n", + "\n", + "fig, ax = plt.subplots(figsize=(5, 5))\n", + "\n", + "# draw nodes\n", + "nx.draw_networkx_nodes(G_est, POS, node_color='#AACCFF', node_size=1500, ax=ax)\n", + "nx.draw_networkx_labels(G_est, POS, ax=ax)\n", + "\n", + "for i, j in edges:\n", + " p_i = POS[NODE_NAMES[i]]\n", + " p_j = POS[NODE_NAMES[j]]\n", + "\n", + " # base line\n", + " ax.plot([p_i[0], p_j[0]], [p_i[1], p_j[1]], color='black', zorder=1)\n", + "\n", + " # direction vector (for small offsets)\n", + " vx = p_j[0] - p_i[0]\n", + " vy = p_j[1] - p_i[1]\n", + " norm = (vx**2 + vy**2) ** 0.5 + 1e-12\n", + " ux, uy = vx / norm, vy / norm\n", + "\n", + " # endpoint types at i and j\n", + " a_ij = adjacency_matrix[i, j]\n", + " a_ji = adjacency_matrix[j, i]\n", + "\n", + " # draw arrowheads\n", + " # j -> i\n", + " if a_ij == ARROW:\n", + " p_start = (p_j[0] - ux * 0.04, p_j[1] - uy * 0.04)\n", + " p_end = (p_i[0] + ux * 0.04, p_i[1] + uy * 0.04)\n", + " arrow = FancyArrowPatch(p_start, p_end, arrowstyle='-|>', mutation_scale=20, color=\"black\", zorder=2)\n", + " ax.add_patch(arrow)\n", + "\n", + " # i -> j\n", + " if a_ji == ARROW:\n", + " p_start = (p_i[0] + ux * 0.04, p_i[1] + uy * 0.04)\n", + " p_end = (p_j[0] - ux * 0.04, p_j[1] - uy * 0.04)\n", + " arrow = FancyArrowPatch(p_start, p_end, arrowstyle='-|>', mutation_scale=20, color=\"black\", zorder=2)\n", + " ax.add_patch(arrow)\n", + "\n", + " # draw circle endpoints\n", + " if a_ij == CIRCLE:\n", + " x = p_i[0] + ux * 0.04\n", + " y = p_i[1] + uy * 0.04\n", + " ax.scatter([x], [y], s=100, facecolors='white', edgecolors='black', zorder=3)\n", + "\n", + " if a_ji == CIRCLE:\n", + " x = p_j[0] - ux * 0.04\n", + " y = p_j[1] - uy * 0.04\n", + " ax.scatter([x], [y], s=100, facecolors='white', edgecolors='black', zorder=3)\n", + "\n", + "xs = np.array([p[0] for p in POS.values()])\n", + "ys = np.array([p[1] for p in POS.values()])\n", + "ax.set_xlim(xs.min() - 0.20, xs.max() + 0.10)\n", + "ax.set_ylim(ys.min() - 0.10, ys.max() + 0.10)\n", + "\n", + "# Draw a box\n", + "add_fixed_box(ax, (0.01, 0.74, 0.65, 0.12), 'Exogenous')\n", + "add_fixed_box(ax, (0.01, 0.34, 0.65, 0.32), 'Endogenous')\n", + "add_fixed_box(ax, (0.01, 0.14, 0.65, 0.12), 'Sink')\n", + "\n", + "ax.set_axis_off()\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c327d171-ef1a-4de9-83b5-2ac1ab85d936", + "metadata": {}, + "source": [ + "## Perform bootstrapping" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "dd9fdd13-e755-4064-811f-977e5e0fc259", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.utils import resample\n", + "\n", + "def bootstrap(X, n_sampling=100):\n", + " rng = np.random.default_rng(0)\n", + " results = []\n", + " for i in range(n_sampling):\n", + " seed_i = int(rng.integers(2**32))\n", + " resampled_X = resample(X, random_state=seed_i)\n", + " G_fci, _ = fci(\n", + " resampled_X.values,\n", + " node_names=NODE_NAMES,\n", + " is_discrete=[False, True, True, False, False, False, False, True],\n", + " indep_test='kci', # Use KCI for the independence test\n", + " background_knowledge=bk,\n", + " show_progress=False, \n", + " verbose=False\n", + " )\n", + " results.append(G_fci) # Save the results\n", + "\n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f153074b-a2d5-471b-b4f5-ad718074b7d1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: total: 1.3 s\n", + "Wall time: 1.69 s\n" + ] + } + ], + "source": [ + "%%time\n", + "# start capture\n", + "default_out = sys.stdout\n", + "sys.stdout = StringIO()\n", + "\n", + "results = bootstrap(X, n_sampling=100)\n", + "\n", + "# stop capture\n", + "del sys.stdout\n", + "sys.stdout = default_out" + ] + }, + { + "cell_type": "markdown", + "id": "e37642a1-8e59-4c40-81a0-ee7a628acd70", + "metadata": {}, + "source": [ + "## Compute precision, recall, and F1" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "076fb679-7fd2-40d5-80d9-7cf6c0c1f6e4", + "metadata": {}, + "outputs": [], + "source": [ + "from causallearn.graph.GeneralGraph import GeneralGraph\n", + "\n", + "# Convert the true causal graph to a GeneralGraph\n", + "A = np.asarray(B_true.values)\n", + "nodes = [GraphNode(name) for name in NODE_NAMES]\n", + "G_true_graph = GeneralGraph(nodes)\n", + "\n", + "for i in range(A.shape[0]):\n", + " for j in range(A.shape[1]):\n", + " if i != j and A[i, j] == 1:\n", + " G_true_graph.add_directed_edge(nodes[i], nodes[j]) # i -> j" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c957a194-0538-4cad-8114-840711fb57cb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
precision_skeletonrecall_skeletonf1_skeletonprecision_directedrecall_directedf1_directed
00.8181820.90.8571430.750.90.818182
10.8181820.90.8571430.750.90.818182
20.8181820.90.8571430.750.90.818182
30.8181820.90.8571430.750.90.818182
40.8181820.90.8571430.750.90.818182
\n", + "
" + ], + "text/plain": [ + " precision_skeleton recall_skeleton f1_skeleton precision_directed \\\n", + "0 0.818182 0.9 0.857143 0.75 \n", + "1 0.818182 0.9 0.857143 0.75 \n", + "2 0.818182 0.9 0.857143 0.75 \n", + "3 0.818182 0.9 0.857143 0.75 \n", + "4 0.818182 0.9 0.857143 0.75 \n", + "\n", + " recall_directed f1_directed \n", + "0 0.9 0.818182 \n", + "1 0.9 0.818182 \n", + "2 0.9 0.818182 \n", + "3 0.9 0.818182 \n", + "4 0.9 0.818182 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from causallearn.graph.AdjacencyConfusion import AdjacencyConfusion\n", + "from causallearn.graph.ArrowConfusion import ArrowConfusion\n", + "\n", + "rows = []\n", + "for G_est_graph in results:\n", + " # Compute with edge skeleton\n", + " adjacency_confusion = AdjacencyConfusion(G_true_graph, G_est_graph)\n", + " precision_skeleton = adjacency_confusion.get_adj_precision()\n", + " recall_skeleton = adjacency_confusion.get_adj_recall()\n", + " f1_skeleton = 0.0 if (precision_skeleton + recall_skeleton) == 0 else 2 * precision_skeleton * recall_skeleton / (precision_skeleton + recall_skeleton)\n", + " # Compute with edge directions\n", + " arrow_confusion = ArrowConfusion(G_true_graph, G_est_graph)\n", + " precision_directed = arrow_confusion.get_arrows_precision()\n", + " recall_directed = arrow_confusion.get_arrows_recall()\n", + " f1_directed = 0.0 if (precision_directed + recall_directed) == 0 else 2 * precision_directed * recall_directed / (precision_directed + recall_directed)\n", + " # Save the results\n", + " rows.append({\n", + " \"precision_skeleton\": precision_skeleton, \"recall_skeleton\": recall_skeleton, \"f1_skeleton\": f1_skeleton,\n", + " \"precision_directed\": precision_directed, \"recall_directed\": recall_directed, \"f1_directed\": f1_directed\n", + " })\n", + "\n", + "df_results = pd.DataFrame(rows)\n", + "df_results.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "41089da2-8bd4-4d70-aa52-d82f96434c71", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAEiCAYAAAAWHJuuAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAARgBJREFUeJzt3Qm4rWP9P/77DMZwkCF0zBkTGVIyJ6KvIWQqIaUypEjpiyhDSCikKJQMZcwvMpM5KmSWmZQyyzys//V+vv+1r7X3Xs8+e5+z99nT63Vdy7Ke9ay1nvWctZ/PfX/uaUyj0WgUAAAAAACgm7HdNwEAAAAAACGJDgAAAAAANSTRAQAAAACghiQ6AAAAAADUkEQHAAAAAIAakugAAAAAAFBDEh0AAAAAAGpIogMAAAAAQA1JdAAAAAAAqCGJDox6Y8aMKQcccECfXrP99tuXBRdccMCOCQDom1NOOaWK6Y888kjHtjXXXLO6AQCTdsstt5RVVlmlvOtd76pi6m233TbYhwRDhiQ6AAAAAIxib775Zvn0pz9dnn322XLUUUeVU089tcw999xl7733LmuttVaZeeaZq8T61VdfPdiHCoNi/OB8LMDQ8eqrr5bx4/t2OTzxxBPLO++8M2DHBAAAAFPLgw8+WB599NGqrvuFL3yh2paE+WGHHVbe9773lWWWWabceOONg32YMGj0RAeGjSStX3vttX5/3+mnn77PSfRpppmmTDfddP1+LAAw3L388suDfQgAQB/9+9//ru5nnXXWjm0rrLBCeeaZZ8r9999f9thjj0E8Ohh8kujAVJf5xzMM7N577y1bbLFFmWWWWcq73/3usvvuu3dKkmefXXfdtZx22mll6aWXrpLWF198cfXcP/7xj/L5z3++Gl6W7Xn+pJNO6vZZeb983mKLLVYly+eZZ56y6aabVq3sdXOiv/TSS+VrX/taNed53nuuueYqH//4x8tf//rXHudET9Jgzz33LBMnTqxet/jii5cjjjiiNBqNTvs1v9f5559f3v/+93ccf/O7AcBwi+l333132Wabbcpss81WVl111eq5X//611Xle4YZZiizzz572Wqrrcrjjz/e7T3+9Kc/lQ022KB6beZg/cAHPlB+9KMfdTz/t7/9rYq7Cy+8cBXL3/Oe91RlgFTqAYAplzi7xhprVP+fKV0S27OmSKZwSQwHTOcCDKIk0JOI/v73v19uuumm8uMf/7g899xz5Ve/+lXHPldeeWX57W9/WyWd55hjjmr/p556qnz4wx/uSEbPOeec5Q9/+EPZcccdy4svvlglwOPtt98u//M//1OuuOKKquKeJH0S5Jdddlm58847yyKLLNL2uL785S+Xs88+u3rvpZZaqqqkX3fddeWee+4pyy+/fNvXJFG+0UYblauuuqo6juWWW65ccsklZa+99qoS/plTrlXe79xzzy0777xzVTDJd99ss83KY489VjUoAMBwkgp3hnofcsghVUw8+OCDy3777VfF+gwJ/89//lOOOeaYsvrqq5dbb721o5dbYnJidRq5E6eTIE+8/f3vf189bu7z0EMPlR122KF6/q677ionnHBCdZ/yQ8oDAMDk+9KXvlTmm2++Ko5/9atfLSuttFLVYQ1o0QCYyvbff/90zW5stNFGnbbvvPPO1fbbb7+9epz/Hzt2bOOuu+7qtN+OO+7YmGeeeRpPP/10p+1bbbVVY8KECY1XXnmlenzSSSdV73HkkUd2O4Z33nmn4/+zT46pKe+xyy679Pgdtttuu8YCCyzQ8fj888+v3ueggw7qtN/mm2/eGDNmTOOBBx7o9HnTTjttp235ztl+zDHH9Pi5ADAUY/rWW2/dse2RRx5pjBs3rnHwwQd32veOO+5ojB8/vmP7W2+91VhooYWqePrcc8/VxulmXG91xhlnVJ97zTXXdGw7+eSTq20PP/xwx7Y11lijugEAPbvqqquqOHrWWWe1fT7b83z2g9HIdC7AoNlll106Pd5tt92q+4suuqhjW4aUpTd4U3LQ55xzTtlwww2r/3/66ac7buutt1554YUXOqZdyX7pvd5831Y99VpL77gMLX/yySd7/V1yzOPGjata7VtlepccZ3rKt1pnnXU69YTP0PVMa5OedgAw3GQUV1NGWmUdk/RCb43T6UWe3uoZtRXpkf7www9XI8ha51/tGqczHUzrNG15r4xIi9ap1gAAYKCYzgUYNKlIt0pSeezYseWRRx7p2LbQQgt12ifDwZ9//vlqGHduPS2IknnPMy95XxcNPfzww8t2221XzW2euVwzT+vnPve5ai7WOlnFfN55562mZmm15JJLdjzfav755+/2HpkLNtPZAMBw0xqv//73v1cNyF3jfOvi3NFcnyTrg/Tk2WefLd/97nfLmWee2RHjm9J4DgAAA00SHRgy2vUOb+19FunZFp/97GerRHc76dU9JdJzbrXVVivnnXdeufTSS8sPfvCDcthhh1U969Zff/3SH9JrvZ2ui5ACwHDQGq8TqxPTMwqrXbybaaaZ+hyXb7jhhmqdkaw5ktfnMz7xiU90lAsAAGAgSaIDgyY91Vp7rj3wwANVZTiLh9bJIqLp7Z1FQzMlSk/Ssz3Tsrz55psdvd56KwucZdHP3NLrLQuKZpG0uiT6AgssUC6//PJq4dLW3uj33ntvx/MAMBok/qZRODF+scUW63G/yGLfdTE9I7SyQHh6on/nO9/pVIYAAICpxZzowKA57rjjOj0+5phjqvueenunR9tmm21WzXeeSndXme6lKftl3tRjjz221z2+k5zvOjR8rrnmqqZqef3112uPK1O+5LVdP+uoo46qeuP1Vw92ABjqNt100ypeJ/HdNd7m8TPPPFP9fxqok2g/+uijq6nauu4XzZ7sXd8nrwEAgKlFT3Rg0GQxsY022qgajn3jjTeWX//612WbbbYpyy67bI+vO/TQQ6tFyVZeeeXyxS9+sVp4NPOlZnGx9AbP/0fmMf/Vr35V9thjj3LzzTdXU7S8/PLL1T7pYb7xxht3e+/0JH/ve99bNt988+o4MmQ8+99yyy3lhz/8Ye0xZaHTtdZaq+yzzz7VnO55baaC+d3vflctmNa6iCgAjGSJeQcddFD59re/XcXETTbZpBqllbifqdJ22mmn8o1vfKNaB+X444+vYmimadlhhx2qkWAZxXXXXXeVSy65pFp0e/XVV6/WK8nIsvnmm6+Kr3kvAGDgJaZHYnOceuqp5brrrqv+f9999x3UY4OpSRIdGDS/+c1vqqHZe++9d7X456677lrNPz4pc889d5UU/973vlfNU/6Tn/ykvPvd7y5LL710NXd5U3qvXXTRRdU0LKeffnrVez37rbrqqmWZZZZp+94zzjhjlWBPBT3vnellFl100eozvvKVr9QeUxIBF1xwQfV98r1OPvnkalqafJ8999xzMs8QAAxPie2ZyiUjstIjPbJg97rrrls1oDett956VcN49kljdeJukvBpJG9KDN9tt92qEWzpkZ73yHzrGSUGAAys/fbbr9Pjk046qeP/JdEZTcY0rGIHTGUHHHBAVVnO1CtzzDHHYB8OAAAAANQyJzoAAAAAANSQRAcAAAAAgBqS6AAAAAAAUMOc6AAAAAAAUENPdAAAAAAAqCGJDgAAAAAANcbXPQF99c4775Qnn3yyzDzzzGXMmDGDfTgAI1JmYXvppZfKvPPOW8aO1RZOz8RmgIEnNtNb4jLA8I3Nkuj0mxQGJk6cONiHATAqPP744+W9733vYB8GQ5zYDDD1iM1MirgMMHxjsyQ6/Sat6c0f6CyzzDLYhwMwIr344otV5at5zYWeiM0AA09sprfEZYDhG5sl0ek3zeFoKQwoEAAMLEOA6Q2xGWDqEZuZFHEZYPjGZhO2AQAAAABADUl0AAAAAACoIYkOAAAAAAA1JNEBAAAAAKCGJDoAAAAAANSQRAcAAAAAgBqS6AAAAAAAUEMSHQAAAAAAakiiAzDsPPDAA2X33Xev7gGA0UdZAAD6n/haTxIdgGHn4YcfLrfffnt1DwCMPsoCAND/xNd6kugAAAAAAFBDEh0AAAAAAGpIogMAAAAAQA1JdAAAAAAAqCGJDgAAAAAANSTRAQAAAACghiQ6AAAAAADUkEQHAAAAAIAakugAAAAAAFBDEh0AAAAAAGpIogMAAAAAQA1JdAAAAAAAqCGJDgAAAAAANSTRAQAAAACghiQ6AAAAAADUkEQHAAAAAIAakugAAAAAAFBDEh2AYeeVV17pdA8AjC7KAgDQ/8TXepLoAAw7Dz74YKd7AGB0URYAgP4nvtaTRAcAAAAAgBqS6AAAAAAAUEMSHQAAAAAAakiiAwAAAABADUl0AAAAAACoIYkOAAAAAAA1JNEBAAAAAKCGJDoAAAAAANSQRAcAAAAAgBqS6AAAAAAAUEMSHQAAAAAAakiiAwAAAABADUl0AAAAAACoIYkOAAAAAADDNYl+9dVXlzFjxpTnn3++X/edGnIs559//mS/fsEFFyxHH310vx4TQH949dVXq+vTN77xjeo+j5ueeOKJ8olPfKKstdZa1X0eT45//etf5VOf+lT5+Mc/Xt3n8WB5++23y6233lquuOKK6j6PGVgHHHBAWW655Toeb7/99mWTTTaZ4ved0vfpelwAo8ljjz1WxeU111yzus9jRqZGo1F22mmnMvvss1f12ttuu23APiu/p6997WuT/fr+KiMADNU69uTUmfurXt5bb4+COvP4MsStssoq5Z///GeZMGFCv+47EqVin6T9QBZwAPbZZ59y/fXXdzz+85//XF17PvrRj5abbrqpU7B87bXXymc/+9kybty4Kpj2VoJ8Xtv03HPPla222qpMP/305eKLLy5T0zXXXFN+8pOfdCqQvOc97yk777xzWX311afqsTD8PPLII2WhhRaqCpKS78Bwtvbaa5d33nmn4/Gbb75ZPve5z5WxY8eWK6+8clCPjf6X8tYpp5xSdVRbeOGFy/3331823HDD8pe//KWqc5933nnDNnGd75SkUsqXs84662AfDkCPdeyDDz64z3XmxOj+qJf31jWjpM48oD3R33jjjSl+j2mnnbY68Wn97s99AZj84D7NNNOUbbbZpvz617+u7vM425uBepZZZil77rlndR/Z/rGPfaxXn9FaGMg1ff/996/uI9vz/NSSwkA+P5XH4447rlx00UXVfR5ne54fjfojvgMwPBPoM844Y9ltt92q+8j2PM/I8uCDD5Z55pmn6qiWctjLL79cll122aocBMDUq2Pn+b7WmfujXt5b14yiOvPYvg6z2nXXXatbenvPMcccZb/99quGejWnHznwwAOrHgn5B8rwr7juuuvKaqutVmaYYYYyceLE8tWvfrUKwk2vv/56+da3vlU9N91005VFF120/OIXv2g7Rcujjz5atYDPNtts5V3veldZeumlq3+gdvvGOeecU+2T983x/fCHP+z0nbLtkEMOKZ///OfLzDPPXOaff/5ywgkn9DqJkHORwkVaehZYYIHy/e9/v3b//Hiy79/+9rdenZeu8r2+8IUvlDnnnLM6vyms3n777dVz6SXw3e9+t3qcc5BbtkWGWW688cZlpplmql63xRZblKeeeqrb0PRTTz21Oh/5t03r1UsvvdSr8wCMDhlO1gzuF154YXWNf+9731vd/+xnP+vYL0H/ggsuqK7VuT/77LM7AvakhpCl5bpZGEjL+5lnnln1FMp9c3qsPP/f//53QL9r83jTmv6Rj3ykHHTQQVUsScIg93mc7ccff/yIHKZWF/8z1Dqxf7311it33nlnWX/99avYMvfcc5dtt922PP300x2vSVLl8MMPr2J6YnDia2svisT9xRZbrDqnKWClPJEeE/0hv7llllmmiq/vfve7yzrrrFMbX2+55ZYqrh522GGTjLV1fv7zn5cll1yyKgssscQS1e+mKb3Q44Mf/GAVm3Mum+fne9/7XvU3lPOTONw6yiI92LP/ueeeW/0N5DwleXHjjTf2yzkC6K3UJZoJ9N/+9rdV3WuzzTar7vM48rypXUaOTI+ShpL8myYWpY6YmJ/yT6YLmByJje973/uqWJlyw+abb167b8qZqZOedtpp1ePHH3+8qsOm13iml0ndNnGyTn6PqZcnBqcskPjZLI/mdYmrkZxCvl++bzMvkTr5XHPNVR3nqquuWpUTmpr5hvTiXHHFFavYnEaG++67b7LOCUBPdew8bibSW6d26anOnPpp009/+tPJrpf31tujrM7c557ov/zlL8v48ePLzTffXH70ox+VI488sqo8Nh1xxBFVkMqw5VSI04KdFpIUtJI8/s1vflMlj1MZb0rS/Ywzzig//vGPyz333FMlY1Ipb2eXXXapgltaMu64446q0lu3b4aaJdgmIZx9kyzOMTWTy01JrCcI5pgz1OArX/lKrwJhjjc/xBQes3+CfAoYXaWRIYWQX/3qV+Xaa68tH/jAB3p1Xrr69Kc/Xf7973+XP/zhD9V3W3755asWpGeffbZsueWWVetSfqgZXpdbtqUAkUJG9vnjH/9YLrvssvLQQw9Vz7XK8eSP7/e//311y76HHnpoj98//w4vvvhipxswcjUT5bkWZeRPq1w7m5rBuSlJ1zRSRpKTPcn1N9KK3nV4bR43W9dzvRxouTangPKZz3ymGqreKo+zPdfaZsPoSJf4n3/3FOISH5JcTmI4Qw2T/E3jbGJu07e//e1qv8Tdu+++u5x++ulVpbkpv4nE4zyX8sSJJ55YjjrqqCk+zvybbL311lXjeMoUqfBuuummHQ3+rTL9QOYPTHI/Sf1Jxdp2Evu/853vVO+Rz0vDfL5zzlekvBSXX355dWxJike+c8ofKTflN5SGiY022qj8/e9/7/T+6XmSeREzVVsaHfLd3nrrrdrvLzYD/W3HHXes7lMpTnKxVR43e6Q392P4S4xqNvQmdrUmkidHygpJTuc9U29OuaFueH/KC4l1ia8pa6WBPTEy5YbUpVMOSf0/dem6kXFJoKfunQTSXXfdVb7+9a9X0xikjpvOa+loFzmWfL983/jmN79ZPZcY/te//rXqCJDP7loGSGxODM/3Sm4kZY464jIwuXXsPG42OLZ2WuupzpzrXWt9bHLr5b31t9FWZ270wRprrNFYcsklG++8807Htm9961vVtlhggQUam2yySafX7Ljjjo2ddtqp07Zrr722MXbs2Marr77auO+++1KrbVx22WVtP/Oqq66qnn/uueeqx8sss0zjgAMO6NW+22yzTePjH/94p3322muvxlJLLdXxOMf82c9+tuNxvttcc83VOP744yd5PnbbbbfG2muv3el8tMqxnHXWWdVx5Bw98cQTvT4vzWM76qijOp6bZZZZGq+99lqn1yyyyCKNn/3sZ9X/77///o1ll1220/OXXnppY9y4cY3HHnusY9tdd91VHdvNN9/c8boZZ5yx8eKLL3Y6TyuvvHKP3z+vy/t0vb3wwguTOHPAcLTnnntWceDxxx/v9tyaa65ZPZdb9uvqnHPOqZ7Lfj1ZZ511qv2uvPLKts/nmtb8nNx++MMfNgbK5ZdfXn3Gyy+/3Pb5bM/z2W9qyjV2al9r8z0/+MEPdjw+8MADG+uuu26nffK7yHElrieeTDfddI0TTzyx15/xgx/8oLHCCit0PO4a07bbbrvGxhtvPMn3+ctf/lIdxyOPPNL2+eb7nHvuuY2ZZpqpceaZZ3Y8NzmxNs+dfvrpnfbP+fnIRz5S/f/DDz9cHc+tt97aaZ955523cfDBB3fattJKKzV23nnnTq/7+c9/3i1+33PPPbXfX2wG+lsz5p599tltnz/jjDM69pmaUgYY6LLAUI7NAy310NRH28l3Pe+883r9XikHJr621jdb5d9x9913bxx77LGNCRMmNK6++uqO50499dTG4osv3qnO/frrrzdmmGGGxiWXXNKtjJAYnrrtDTfc0OkzUv/eeuut2+YN4r///W9jmmmmaZx22mkd2954440qXh9++OGdXtda9rvwwgurbc06fFfiMjC5dexILq9rHbunOnNrvTz7TU69vC/x9fIhWmceqNjc557oH/7whzvNOZ6u+ek11eyanx7drTIEOj3N0lrcvKU1Nz2kH3744apnVSa2X2ONNXr1+WnBzpCATK6f6VF6as1Ij7Ds1yqPW4830jO8Kd8trTnphTYpGfaV41988cWr47r00ku77ZNWoD/96U9Vz/n55puv1+elq+yf6QsyLL31Ndk3vch7Ogdpbc+taamllqpaq/JcU3rQN1ukItPOTOocpFXrhRde6LhlmB0wcqU3UjSn0GqV6Si67tfq5JNP7rZfO82RRa0t7a2aU311baUfCBkuHO2uya3bm/uNdCussEKnmHTVVVd1ikeZxiQSkxJf0vOqp/n2MgIrMTkxN6/fd999+2UqgIyGy+dmOpf06EgP9yyy0ypxOc9lGrPWkVl9jbWZIibb0/uydf+UU3qKzemF9uSTT7Yto7TG5q5llMTm6Ck+i81Af8tQ8tYY3FV6/LbuB11l1FemPs30bZn+Lb3MX3nllU77ZCRj6s4ZOd2aG0hsfuCBB6q6ajPOpuyVqQzaxdrsm/fOZ7bG5vxOe4rNeS693ltjc37TH/rQh6YoNovLwOTWsVu3t9axe6ozt9a3283a0dt6eW/NPsrqzP2+sGjmKW+VyuiXvvSlKtncvCUQJpG9yCKLVHOU9UWGHGQ6kgTfTNGSpP0xxxwzRcfctcCXRHrryvN1MsQ7P4jMA5/5iTKMvevcbgne//jHP8oll1zSp/PSVfZPgG7dP7cMQdtrr73KlJqcc5A/uswX23oDRq5cs+Kss87qNny2dQ7ortfBzJPdXGOhdfqvdppzuGVIWOv6FpHHzdW+M0flQEsFKQneVPS6Xg/zONtzXW6tSI1krfE9MSlz63WNSYlhGZ49qdieeb0ztG+DDTaophDLdGoZGt0fC5amYT4V8EzHkkbjlBHS2N1asEucTdL/pJNO6jQPe19jbXNu/iTqW/fPfPE33XRT6Q+t8bnZiaGn+Cw2A/2tmTxPYrJrojCPm8nQuiQ7JAGe6VEyhWvibKZBS6N3a1kvU8RlPZLE5tYp2BJr05DfNTbff//91cJ7dbE5cwm37p/p47pOOTg1YrO4DExuHTuPm9et5n6TqjO3To/Zdc3GvtTLe+sDo6zOPL6vL0jvrVapJGaBkFRa6xLNCViZT6yd9BTLic38ZFn4qzfSq/rLX/5ydUvLbiqvmXO8qyzylTnTWuVx5hStO96+ShBML7bckjjK3GyZM63ZypL5TZNoSIDPZ2Z+9t6cl66yf/5AMudau3nXmz0zu07Wn3OQ1u7cmr3R87n5Q0tyAaC3khhN75xcRz/5yU9W17wkQdM63lopyZyTqSztsMMOVUt3M1DnGtiul3qrBOAs5JTeRZtsskn1OL18UzFvJtDzfN1aGP0px5u53jPqKb2kk/TNAlVJxqYwkERwFnTur3gynCQmZc7QxKPEpa5SLsjvJQtvtZtv74Ybbqh6pLWuNJ+Fw/tLKrT5reaWino+67zzzit77LFHx3yAmZs8i3ymATxrm6RC3JtY2ypzvM8777xV435+H+00R020xueUHfK6/C219rbL4/R4AxhKsjB05jVNnS3XzMyBnjWt0rO3mUDP89kP6iS2pr6fW8pWGRmdtUmybkmzgTvzjCc2p2x17LHHVtsTmzN6LfPv9yYBnTpuEtcZ3VY32r1dbM7nN9d+Sbkh0tCe+eCzsDrAYNSxmyNkWjsp9abOHMmZTm69vLfGjbI6c597oicYpRKaXllpSU4Pr9133712/yzUlcpyFsxs9lL73e9+17GAZiqp2223XbUYRxa2zInOImDNld67SgBLr+7sl9bsDCdPoridLLSZCnx6iqelOguEJBhnga7+kEVVcw7uvffe6v3TctRuYv+sYJ4h4/nhNhNNkzovXaWwkalz8geSaWOyqnhenwREFjRpnsvmFDlpYcpQ+rwuDRX5Ied8ZYGzFHpToOg69Q7ApGTxxATxBPNc/zIqKPfN4N4MjgnQWXy5NVDnetwbWWwqhYJIISCf2ZpAz/NTS3pVJ+gnSZqFrVOgyX2utdletyjWSJdzkAbjLPyVymWGQCc2J86lQpp/p8S5LNDVHD6dRvdmL8Uk2VOeyAryeS6/lSS5+0Ma+7O4Z2JjPiPJ8v/85z/dygqpjKfynhjeXKyzN7G2q/wO0ssj3yFlgYySSyE1ZYTm56TQ21x8NUO5Iz3bszh6EgMpU+29995V/O6pTAUwWHK9bC4YlsR5FmxsTaDneUa29PBu9uqOZr2zN1OxZdRZ4mT2T6N5ygZplMlIsVbp7Jb6fRrqm4nr1GPT+L3xxhtXC4s28wWZTvWJJ57o9llJGKW+n6lhUv9POSP14OQtmot+J0meBvccV8oI+W4ZcZfF+hKfE7PT8eyLX/xi9Tu3aC4wmHXsPN/XOnN/1Mt7a/VRVGfuc0/0JGAzdUl6SuXkp7K300471e6fLvvpZZ4K6GqrrVYNzUorb+scpBmK8L//+79V68UzzzxT9WLI43ZSOc8/RgJmWqLT87t1uEKrtFonGZ9eaEmkZwhBVgTPXOb9IQH68MMPrxLgORcrrbRS1VrUdUXaSGtSCgr5Y8jzaXGf1HlplSCf987+SVIk2Cdhnx9jesLFZpttViUL1lprraqneSrx+a5JzqenfvbNZ+ecTekUOMDolQCdOJA52HItTit2hpc1W8ezLb2P05CXnkAZKtbXlu4UClIISGUmFZv0PE+syHVvasu1M4WXrMHRHGmU2DZSWtMnR7MXdRLl6667bvVvnQpp4kszBu63335Vr7PE4Mz/nRic3hDNUVqp3KbhOK9Nr4vsf8ABB0zxsaVskHVIjj766Gru8RxXeratv/763fbN7ymJn/R6SyX99NNPn2Ss7Sq/9fTK/MEPflBVvFMJT+N1s/Kfc5CCa8ofOReJ+c3KfxLqafDPdAjpOXfBBRdUDQwAQ1Gul0mYJqGYin1G8KRxVA/00SGNyalnNjVHd6VDXNb66kk6maWemjifnpOJdUkQLb300t32TWK9GZtT1koMT1xPmSN16CSCstZY1j+p65meun+mhkkjd5I6+fzkBpo5hrw+iZ00YCfeJ8eR73DooYd21NnzOel0lk4Cs8022xSePYApq2NPTp25P+rlvbX6KKkzj8nqor3dOYFsueWWqyqm0FWSFRMmTKiSAuZ6AwZSevkm4ZhkbLMSN1q41tIXfi/ASDWUygKutfSW3wow1A2l+DrUrrf9vrAoAAAAAACMFJLoPcicqhkO0e7Wblg4ADCwMpVAXWzOrTdzswIA/SdzlfcUmwFg1M2Jnjk8R5PM3ZoV6NvpaV4iAGDg5mNvLmpW9zwAMPVk7vCeYjMAjMqFRUeTTISfGwAwNGShzkUXXXSwDwMAaOlgJjYDMNKZzgUAAAAAAGpIogMAAAAAQA1JdAAAAAAAqCGJDgAAAAAANSTRAQAAAACghiQ6AAAAAADUkEQHAAAAAIAakugAAAAAAFBDEh0AAAAAAGpIogMAAAAAQA1JdAAAAAAAqCGJDsCws8gii3S6BwBGF2UBAOh/4ms9SXQAhp0ZZ5yx0z0AMLooCwBA/xNf60miAwAAAABADUl0AAAAAACoIYkOAAAAAAA1JNEBAAAAAKCGJDoAAAAAANSQRAcAAAAAgBqS6AAAAAAAUEMSHQAAAAAAakiiAwAAAABADUl0AAAAAACoIYkOAAAAAAA1JNEBAAAAAKCGJDoAAAAAANSQRAcAAAAAgBqS6AAAAAAAUEMSHQAAAAAAakiiAwAAAABADUl0AIadhRZaqCy77LLVPQAw+igLAED/E1/rjWk0Go0enodee/HFF8uECRPKCy+8UGaZZZbBPhyAEcm1lr7wewEYeK619JbfCsDwvd7qiQ4AAAAAADUk0QEAAAAAoIYkOgAAAAAA1JBEBwAAAACAGpLoAAAAAABQQxIdAAAAAABqSKIDAAAAAEANSXQAAAAAAKghiQ4AAAAAADUk0QEAAAAAoIYkOgAAAAAA1JBEBwAAAACAGpLoAAAAAABQQxIdAAAAAABqSKIDAAAAAEANSXQAAAAAAKghiQ4AAAAAADUk0QEAAAAAoMb4uicAYEo89dRT5YUXXhiw958wYUKZe+65B+z9AQAAYLTVy9W125NEB6Df3XvvvWWXnXcub7/zzoB9xnTTTlN+deqvBXcAGIUeeOCBcswxx5TddtutLLroooN9OAAwYurl6trtSaID0O8ef/zxKlBvttDLZdk53uz393/y5XHlp3fPXLWoC+wAMPo8/PDD5fbbb6/uJdEBoH/q5era9STRARgwc87wTllw5rcH+zAAAABgVFIv7x8WFgUAAAAAgBqS6AAAAAAAUEMSHQAAAAAAakiiAwAAAABADUl0AAAAAACoIYkOAAAAAAA1JNEBAAAAAKCGJDoAAAAAANSQRAcAAAAAgBqS6AAAAAAAUEMSHQAAAAAAakiiAwAAAABADUl0AAAAAACoIYkOAAAAAAA1JNEBAAAAAKCGJDoAAAAAANSQRAegvPbaa+X++++v7mnPOQKAoeOVV17pdA8Aw91wr3O+NsyPf1Ik0QEojz32WNlpp52qe9pzjgBg6HjwwQc73QPAcDfc65yPDfPjnxRJdAAAAAAAqCGJDgAAAAAANSTRAQAAAACghiQ6AAAAAADUkEQHAAAAAIAakugAAAAAAFBDEh0AAAAAAGpIogMAAAAAQA1JdAAAAAAAqCGJDgAAAAAANSTRAQAAAACghiQ6AAAAAADUkEQHAAAAAIAakugAAAAAADCck+hXX311GTNmTHn++ef7dd+B8sgjj1THcNtttw2ZY+qrNddcs3zta18b7MMAYBQ74IADynLLLdfxePvtty+bbLJJv8W2BRdcsBx99NFluDjllFPKrLPOOtiHAcAo0Wg0yk477VRmn332TvXb/tQ1Fudzzj///DJcyyoAjFzDIom+yiqrlH/+859lwoQJ/brv1DK1jkniG0aPN954o5x11lnlRz/6UXWfx0Df3HLLLVVyYCBJfAMjKeY/+eST5X/+53/Kxz72seo+jxm5Lr744iqO/f73v6/qsy+++GLZcMMNy7zzzjtgye58zvrrr18GksQ3MJRjLUPX+IH+gPzwpp122il6j7z+Pe95T7/vO7VM6pjefvvtqhAyduywaNMABtlPf/rTKrDn2tG67dOf/nT58pe/PKjHxujRH/F9sM0555w9Pv/mm2+WaaaZZqodD8BQjvkf//jHq+ti03//+9+yzTbbVNfJyy67bKoeC1PHgw8+WOaZZ56qU1jceuutZdllly2f//zny6abbjognzmpurzYDIzkWMvQNnZyejvvuuuu1S09q+eYY46y3377VUO9msOxDjzwwPK5z32uzDLLLB09vK677rqy2mqrlRlmmKFMnDixfPWrXy0vv/xyx/u+/vrr5Vvf+lb13HTTTVcWXXTR8otf/KLtdCiPPvpo1QI+22yzlXe9611l6aWXLhdddFHbfeOcc86p9sn75vh++MMfdvpO2XbIIYdUhYGZZ565zD///OWEE07o9Tm5+eabywc/+MEy/fTTlxVXXLEqXLTqekzNXmkXXHBBWWqpparjeuyxx6pz8I1vfKPMN9981fdaeeWVq9e2uv7666t/gxlnnLH6/uutt1557rnnqiHuf/zjH6tWs3xWbplWJu68886qNX+mmWYqc889d9l2223L008/3fGe+XfIv1eeTyGp6/kBho4E8zPPPLO6vuZ6ketb7vM42/M8DIRm/M+Ip8T+xJ9JxZd33nmnHH744VVMT6xLfD344IM7nk/cX2yxxaqYtvDCC1flidYEzZToTWxrN4T8+OOPLxtttFEVh5vH+rvf/a4sv/zyVZzPcX73u98tb731VsfrEt+/9KUvVecg+7z//e+veu0lhu+www7lhRde6IjN6f0WvYn5KS/knOX8fOpTnyrPPPNMv5wbYHgYSjG/NYGeqT2+/e1vV/eR7XmekSX1y912262qpyZ+JWYm5h900EFVTJoc//73v6t6fHICCy20UDnttNO67dPaw705TepvfvObssYaa1Qxtvman//852XJJZesti2xxBLlJz/5Saf3eeKJJ8rWW29d/U4TZ1NP/9Of/lTF1sTx22+/vSM2Z1sznn/hC1+oGtnzd7b22mtX+7U69NBDq3ifvMGOO+5YXnvttck6F8DQMJRiLUPfZHV9/uUvf1nGjx9fJY+TtD3yyCOrINZ0xBFHVC3USSanQpwW7E984hNls802K3/729+qIJikeirjTanonnHGGeXHP/5xueeee8rPfvazquLbzi677FJVPq+55ppyxx13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OgD9buLEiWXc2LHlnIffVc55eGA+Y7pppykTJkwYmDcHAIa0hRZaqCy77LLVPQDQf/Vyde32xjQajUbNc9AnL774YvVH9sILL5RZZpllsA8HGGRPPfVUdT0YKLnezD333GW0ca2lL/xeAAaeay295bcCDId6+Uioa784ANdbPdEBGBAJusM98AIAAMBwpV7efywsCgAAAAAANSTRAQAAAACghiQ6AAAAAADUkEQHAAAAAIAakugAAAAAAFBDEh0AAAAAAGqMr3sC+qrRaFT3L7744mAfCsCI1bzGNq+50BOxGWDgic30lrgMMHxjsyQ6/eaZZ56p7idOnDjYhwIwKq65EyZMGOzDYIgTmwGmHrGZSRGXAYZvbJZEp9/MPvvs1f1jjz2m8NjS8pUC0uOPP15mmWWWwT6cIcN56c45ac956e6FF14o888/f8c1F3oiNnfnutKe89Kdc9Ke89Kd2Exvicvtua5055y057x055xMvdgsiU6/GTv2/6bYT2HAH25nOR/OSXfOS3fOSXvOS/01F3oiNtdzXWnPeenOOWnPeelObGZSxOWeua5055y057x055wMfGwW5QEAAAAAoIYkOgAAAAAA1JBEp99MN910Zf/996/u+T/OSXvOS3fOSXvOS3fOCX3h99Kdc9Ke89Kdc9Ke89Kdc0Jv+a2057x055y057x055xMvfMyptFoNPrt3QAAAAAAYATREx0AAAAAAGpIogMAAAAAQA1JdAAAAAAAqCGJTp8cd9xxZcEFFyzTTz99WXnllcvNN9/c4/5nnXVWWWKJJar9l1lmmXLRRReV0XxOTjzxxLLaaquV2Wabrbqts846kzyHo+W30nTmmWeWMWPGlE022aSM9nPy/PPPl1122aXMM8881WIYiy222Kj/G4qjjz66LL744mWGGWYoEydOLF//+tfLa6+9VkaKa665pmy44YZl3nnnrf4Wzj///Em+5uqrry7LL7989TtZdNFFyymnnDJVjpXBJy63Jza3JzZ3Jza3JzZ3JjbTF2Jze2Jzd+Jye2Jzd+LyEInNWVgUeuPMM89sTDvttI2TTjqpcddddzW++MUvNmadddbGU0891Xb/66+/vjFu3LjG4Ycf3rj77rsb++67b2OaaaZp3HHHHY3Rek622WabxnHHHde49dZbG/fcc09j++23b0yYMKHxxBNPNEaSvp6Xpocffrgx33zzNVZbbbXGxhtv3BjN5+T1119vrLjiio0NNtigcd1111Xn5uqrr27cdtttjdF8Xk477bTGdNNNV93nnFxyySWNeeaZp/H1r3+9MVJcdNFFjX322adx7rnnZuHvxnnnndfj/g899FBjxhlnbOyxxx7VtfaYY46prr0XX3zxVDtmBoe43J7Y3J7Y3J3Y3J7Y3J3YTG+Jze2Jzd2Jy+2Jzd2Jy0MnNkui02sf+tCHGrvsskvH47fffrsx77zzNr7//e+33X+LLbZofPKTn+y0beWVV2586UtfaozWc9LVW2+91Zh55pkbv/zlLxsjyeScl5yLVVZZpfHzn/+8sd122424AkFfz8nxxx/fWHjhhRtvvPFGYyTr63nJvmuvvXanbQmCH/3oRxsjUW8KA9/85jcbSy+9dKdtW265ZWO99dYb4KNjsInL7YnN7YnN3YnN7YnNPROb6YnY3J7Y3J243J7Y3J24PHRis+lc6JU33nij/OUvf6mGUTWNHTu2enzjjTe2fU22t+4f6623Xu3+o+GcdPXKK6+UN998s8w+++xlpJjc8/K9732vzDXXXGXHHXcsI83knJMLLrigfOQjH6mGpc0999zl/e9/fznkkEPK22+/XUbzeVlllVWq1zSHrz300EPVUL0NNtigjFYj/VpLe+Jye2Jze2Jzd2Jze2Jz/xgN11u6E5vbE5u7E5fbE5u7E5f7T39cb8f34/Ewgj399NPVRSgXpVZ5fO+997Z9zb/+9a+2+2f7aD0nXX3rW9+q5m/q+oc82s7LddddV37xi1+U2267rYxEk3NOEuiuvPLK8pnPfKYKeA888EDZeeedq8Lj/vvvX0bredlmm22q16266qoZSVXeeuut8uUvf7n87//+bxmt6q61L774Ynn11VerefAYecTl9sTm9sTm7sTm9sTm/iE2j05ic3tic3ficntic3fi8tCKzXqiwyA59NBDqwVBzjvvvGpxiNHqpZdeKttuu221eMwcc8wx2IczZLzzzjtVL4MTTjihrLDCCmXLLbcs++yzT/npT39aRrMsBJKeBT/5yU/KX//613LuueeWCy+8sBx44IGDfWjACCA2/x+xuT2xuT2xGRhIYrO43BOxuTtxeeDoiU6v5EI9bty48tRTT3Xansfvec972r4m2/uy/2g4J01HHHFEVRi4/PLLywc+8IEykvT1vDz44IPlkUceqVZVbg2EMX78+HLfffeVRRZZpIy230pWFp9mmmmq1zUtueSSVetphnRNO+20ZbibnPOy3377VQXIL3zhC9XjZZZZprz88stlp512qgpLGdo22tRda2eZZRY93UYwcbk9sbk9sbk7sbk9sbl/iM2jk9jcntjcnbjcntjcnbg8tGLz6Dxz9FkuPGnVu+KKKzpdtPM480+1k+2t+8dll11Wu/9oOCdx+OGHVy2AF198cVlxxRXLSNPX87LEEkuUO+64oxqW1rxttNFGZa211qr+f+LEiWU0/lY++tGPVkPRmoWjuP/++6tCwnAvCEzJecl8iF2DfrPA9H/riYw+I/1aS3vicntic3tic3dic3tic/8YDddbuhOb2xObuxOX2xObuxOX+0+/XG97vQQpo96ZZ57ZmG666RqnnHJK4+67727stNNOjVlnnbXxr3/9q3p+2223bey9994d+19//fWN8ePHN4444ojGPffc09h///0b00wzTeOOO+5ojNZzcuihhzamnXbaxtlnn9345z//2XF76aWXGiNJX89LVyNxpfG+npPHHnusWoF+1113bdx3332N3//+94255pqrcdBBBzVG83nJdSTn5Ywzzmg89NBDjUsvvbSxyCKLNLbYYovGSJHrwa233lrdEqaPPPLI6v8fffTR6vmcj5yXppyHGWecsbHXXntV19rjjjuuMW7cuMbFF188iN+CqUFcbk9sbk9s7k5sbk9s7k5sprfE5vbE5u7E5fbE5u7E5aETmyXR6ZNjjjmmMf/881cB7UMf+lDjpptu6nhujTXWqC7krX772982FltssWr/pZdeunHhhRc2RvM5WWCBBao/7q63XORG+29lNBQI+npObrjhhsbKK69cBcyFF164cfDBBzfeeuutxmg+L2+++WbjgAMOqAoB008/fWPixImNnXfeufHcc881Roqrrrqq7XWieR5yn/PS9TXLLbdcdQ7zWzn55JMH6eiZ2sTl9sTm9sTm7sTm9sTmzsRm+kJsbk9s7k5cbk9s7k5cHhqxeUz+04+94wEAAAAAYMQwJzoAAAAAANSQRAcAAAAAgBqS6AAAAAAAUEMSHQAAAAAAakiiAwAAAABADUl0AAAAAACoIYkOAAAAAAA1JNEBAAAAAKCGJDowai244ILl6KOPHuzDAAD+f2IzAAwtYjP8H0l0AAAAAACoIYkOAAAAAAA1JNGBYemEE04o8847b3nnnXc6bd94443L5z//+fLggw9W/z/33HOXmWaaqay00krl8ssvr32/Rx55pIwZM6bcdtttHduef/75atvVV1/dse3OO+8s66+/fvWeee9tt922PP300wP0LQFg+BCbAWBoEZuh/0iiA8PSpz/96fLMM8+Uq666qmPbs88+Wy6++OLymc98pvz3v/8tG2ywQbniiivKrbfeWj7xiU+UDTfcsDz22GOT/ZkpHKy99trlgx/8YPnzn/9cfdZTTz1Vtthii376VgAwfInNADC0iM3Qf8b343sBTDWzzTZb1bJ9+umnl4997GPVtrPPPrvMMcccZa211ipjx44tyy67bMf+Bx54YDnvvPPKBRdcUHbdddfJ+sxjjz22KggccsghHdtOOumkMnHixHL//feXxRZbrB++GQAMT2IzAAwtYjP0Hz3RgWErLefnnHNOef3116vHp512Wtlqq62qgkBa1L/xjW+UJZdcssw666zVMLJ77rlnilrUb7/99qoFP+/VvC2xxBLVcxkGBwCjndgMAEOL2Az9Q090YNjKMLNGo1EuvPDCau62a6+9thx11FHVcykIXHbZZeWII44oiy66aJlhhhnK5ptvXt54442275UCROT9mt58881O+6SAkc887LDDur1+nnnm6edvBwDDj9gMAEOL2Az9QxIdGLamn376summm1Yt6Q888EBZfPHFy/LLL189d/3115ftt9++fOpTn+oI5FkEpc6cc85Z3f/zn/+shp5F62IpkfdOC/6CCy5Yxo93+QSArsRmABhaxGboH6ZzAYb90LS0qGeOtfx/0/ve975y7rnnVgE9w8m22WabbiuSt0qL+4c//OFy6KGHVsPX/vjHP5Z999230z677LJLtQjL1ltvXW655ZZqKNoll1xSdthhh/L2228P6PcEgOFCbAaAoUVshikniQ4Ma1n1e/bZZy/33XdfFfCbjjzyyGoRlVVWWaUaSrbeeut1tLbXSYHirbfeKiussEL52te+Vg466KBOz88777xVS30C/7rrrluWWWaZar/MHdcc1gYAo53YDABDi9gMU25Mo3UiIwAAAAAAoIMmIAAAAAAAqCGJDgAAAAAANSTRAQAAAACghiQ6AAAAAADUkEQHAAAAAIAakugAAAAAAFBDEh0AAAAAAGpIogMAAAAAQA1JdAAAAAAAqCGJDgAAAAAANSTRAQAAAACghiQ6AAAAAACU9v4/uaVTQf2HeTUAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pairs = {\n", + " 'precision': ['precision_skeleton', 'precision_directed'],\n", + " 'recall': ['recall_skeleton', 'recall_directed'],\n", + " 'f1': ['f1_skeleton', 'f1_directed'],\n", + "}\n", + "\n", + "# Show box plots\n", + "fig, axes = plt.subplots(1, 3, figsize=(15, 3), sharex=True)\n", + "for ax, (metric, cols) in zip(axes, pairs.items()):\n", + " sns.boxplot(data=df_results[cols], orient='h', ax=ax)\n", + " ax.set_title(metric)\n", + " ax.set_xlim(0, 1)\n", + " ax.set_xlabel('value')\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "d6888996-3e47-4514-ad65-e182ec801e21", + "metadata": {}, + "source": [ + "## Directed edge counts (excluding bidirectional edges)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "73ca22ee-c4c1-435b-b7ec-cab36d93d440", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n = len(NODE_NAMES)\n", + "counts = np.zeros((n, n), dtype=float)\n", + "for G_est_graph in results:\n", + " A = G_est_graph.graph\n", + " edge_ij = ((A == 1) & (A.T == -1)).astype(float)\n", + " counts += edge_ij\n", + "\n", + "prob = counts / len(results)\n", + "prob_df = pd.DataFrame(prob, index=NODE_NAMES, columns=NODE_NAMES)\n", + "\n", + "plt.figure(figsize=(5, 4))\n", + "ax = sns.heatmap(prob_df, cmap='viridis', linewidths=0.3, linecolor='white', fmt='.2f', annot=True, cbar_kws={'label': 'Probability'})\n", + "ax.xaxis.tick_top()\n", + "ax.xaxis.set_label_position('top')\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fb666073-fe24-4905-9613-55671688e048", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "python311", + "language": "python", + "name": "python311" + }, + "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.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}