{ "cells": [ { "cell_type": "markdown", "id": "153af0e3", "metadata": {}, "source": [ "# Curated biological Boolean networks and null models\n", "\n", "In this tutorial, we study how to analyze curated biological Boolean networks.\n", "\n", "## What you will learn\n", "You will learn how to:\n", "\n", "- load repositories of curated biological Boolean network models,\n", "- analyze these models,\n", "- generate null models to test the statistical significance of features in biological models.\n", "\n", "These tools enable real research findings, namely the identification of \n", "design principles of regulatory functions and networks.\n", "\n", "## Setup" ] }, { "cell_type": "code", "execution_count": 1, "id": "c3a3daf8", "metadata": { "execution": { "iopub.execute_input": "2026-03-25T05:34:51.654156Z", "iopub.status.busy": "2026-03-25T05:34:51.653841Z", "iopub.status.idle": "2026-03-25T05:34:55.258157Z", "shell.execute_reply": "2026-03-25T05:34:55.256861Z" } }, "outputs": [], "source": [ "import boolforge as bf\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.stats import ttest_rel" ] }, { "cell_type": "markdown", "id": "4e0995de", "metadata": {}, "source": [ "## Loading model repositories\n", "BoolForge makes it very easy to load all models included in three different \n", "repositories of curated biological Boolean networks." ] }, { "cell_type": "code", "execution_count": 2, "id": "4a6fc4d5", "metadata": { "execution": { "iopub.execute_input": "2026-03-25T05:34:55.262281Z", "iopub.status.busy": "2026-03-25T05:34:55.261830Z", "iopub.status.idle": "2026-03-25T05:35:17.234416Z", "shell.execute_reply": "2026-03-25T05:35:17.233498Z" } }, "outputs": [], "source": [ "models = bf.get_bio_models_from_repository(simplify_functions=True)\n", "bns = models['BooleanNetworks']\n", "n_models = len(bns)" ] }, { "cell_type": "markdown", "id": "191ca520", "metadata": {}, "source": [ "The function `get_bio_models_from_repository` loads, by default, all 122 distinct \n", "biological Boolean network models, analyzed in \n", "[Kadelka et al., Sci Adv, 2024](https://www.science.org/doi/full/10.1126/sciadv.adj0822),\n", "and deposited in a [Github repository](https://github.com/ckadelka/DesignPrinciplesGeneNetworks).\n", "The models are parsed directly from the associated Github repository, meaning\n", "a wireless connection is required to successfully execute this function.\n", "Setting the optional parameter `simplify_functions=True` ensures that all update functions\n", "are non-degenerate. This is important for correct null model computation. By default,\n", "because this procedure may be very time-confusing for networks with very high degree,\n", "`simplify_functions=False`. Note that any `BooleanNetwork` object `bn` can be simplified at any time,\n", "using `bn.simplify_functions()`.\n", "\n", "Models from the two other available repositories can be loaded by selecting the \n", "respective Github repository name:\n", "\n", "- ['pystablemotifs (jcrozum)'](https://github.com/jcrozum/pystablemotifs)\n", "- ['biodivine (sybila)'](https://github.com/sybila/biodivine-boolean-models)" ] }, { "cell_type": "code", "execution_count": 3, "id": "a0dff66f", "metadata": { "execution": { "iopub.execute_input": "2026-03-25T05:35:17.238733Z", "iopub.status.busy": "2026-03-25T05:35:17.238471Z", "iopub.status.idle": "2026-03-25T05:35:23.136828Z", "shell.execute_reply": "2026-03-25T05:35:23.135726Z" } }, "outputs": [], "source": [ "models_sm = bf.get_bio_models_from_repository('pystablemotifs (jcrozum)',\n", " simplify_functions=True)\n", "bns_sm = models_sm['BooleanNetworks']\n", "n_models_sm = len(bns_sm)\n", "\n", "#models_bd = bf.get_bio_models_from_repository('biodivine (sybila)',\n", "# simplify_functions=True)\n", "#n_models_bd = len(models_bd)\n", "#bns_bd = models_bd['BooleanNetworks']" ] }, { "cell_type": "markdown", "id": "a239671a", "metadata": {}, "source": [ "Note that the last repository is very large, which is why this code is commented out." ] }, { "cell_type": "markdown", "id": "c7ce0923", "metadata": {}, "source": [ "## Analyzing model repositories\n", "By applying BoolForge functions to all models in a repository, we can swiftly\n", "generate summary statistics, such as the size distribution of the models, or their average degree." ] }, { "cell_type": "code", "execution_count": 4, "id": "fb19a26e", "metadata": { "execution": { "iopub.execute_input": "2026-03-25T05:35:23.142031Z", "iopub.status.busy": "2026-03-25T05:35:23.141737Z", "iopub.status.idle": "2026-03-25T05:35:23.147025Z", "shell.execute_reply": "2026-03-25T05:35:23.146412Z" } }, "outputs": [], "source": [ "sizes = [bn.N for bn in bns]\n", "average_degrees = [np.mean(bn.indegrees) for bn in bns]" ] }, { "cell_type": "markdown", "id": "51315060", "metadata": {}, "source": [ "Plotting the size of a model against its average essential degree \n", "(essential because we removed all non-essential inputs by setting \n", "`simplify_functions=True`), we observe that, for these models, \n", "there exists no strong correlation between size and degree." ] }, { "cell_type": "code", "execution_count": 5, "id": "ed4aa745", "metadata": { "execution": { "iopub.execute_input": "2026-03-25T05:35:23.149705Z", "iopub.status.busy": "2026-03-25T05:35:23.149470Z", "iopub.status.idle": "2026-03-25T05:35:23.341874Z", "shell.execute_reply": "2026-03-25T05:35:23.341654Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAG1CAYAAADX6N+4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAV7BJREFUeJzt3QeYE9XaB/B3d2XpHURgKVKlCFhAUZAuxYJy8aqoWFCv5SqKUmyAVOUqwvXzClYECyhNLHAVKS4oCIqAIiCIsDRRepGl7HzP/+ydmGST3Uwyk2n/3/OEbCaTyckk5Lw55z3npGiapgkRERGRA6XaXQAiIiKiaBioEBERkWMxUCEiIiLHYqBCREREjsVAhYiIiByLgQoRERE5FgMVIiIiciwGKkRERORYZ4iL5eTkyM6dO6VkyZKSkpJid3GIiIgoBphr9vDhw1KlShVJTU31bqCCIKVatWp2F4OIiIjikJWVJRkZGd4NVNCSor/QUqVK2V0cIiIiisGhQ4dUQ4Nej3s2UNG7exCkMFAhIiJyl1jSNphMS0RERI7FQIWIiIgci4EKERERORYDFSIiInIsBipERETkWAxUiIiIyLEYqBAREZFjMVAhIiIix2KgQkRERI7FQIWIKD9Dh4oMHx75PmzH/URkGQYqRDFM8Tx79ux899m7d6+ceeaZ8uuvv8Z0zNtuu02uueYaMROeG2X9/vvvY35M27Zt5aGHHgrcrlmzpowbNy7uMsybN0+aNWumVjb3jLQ0kcGD8wYruI3tuJ+ILMNAJT/8JWVKZejU4MJMI0eOlO7du6uK3s+6dOkihQoVknfeeUc846mnRIYNCw1W9CAF23E/EVmGgUp++EsqxIkTJ2x9/tOnTzvyl/qxY8fk9ddflz59+thdFEdAa9G///1v8ZTgYKVwYQYpREnEQMWBv6RQGY8ePVrOPvtsKVq0qDRt2lSmT5+u7tM0TTp27CidO3dWf8O+ffskIyNDBqNcIrJo0SLVovDJJ59IkyZNpEiRInLxxRfLDz/8EPI8S5YskdatW6vnwHLbDz74oBw9ejRwP1oHhg8fLr1791arU999992qTHDeeeep50DXQX6vY8yYMVKnTh0pXLiwVK9eXbU8BJfxwIEDgf3RSoNtevfJpEmTpEyZMjJnzhxp2LChOsa2bdtkxYoV0qlTJ6lQoYKULl1a2rRpI999911IueHaa69Vxwtu5fjwww/l/PPPV+ekVq1a8vTTT8upU6cC9//8889y2WWXqfvxnJ9//nmB79enn36qyoZzHOzHH3+UK6+8Up07LGWOc7158+aIx8Brqlixojz77LOBLpRWrVqp11++fHl1nPDHfvPNN+p9QFkvvPBCWbVqVZ7j4j3v2rWrlChRQipVqiS33HKL/PHHHxKr1157TZXhiy++ULfHjh0r5557rhQvXlx9Zu677z45cuRIyGOuuuoqWblyZdTX6lr4/56ejog995pBClFyaC528OBB1NTq2lLDhiEk0LT09Nxr3LbQiBEjtHPOOUebN2+etnnzZu3NN9/UChcurC1atEjdv337dq1s2bLauHHj1O3rrrtOa9GihXby5El1e+HCheq8NGjQQPvss8+0NWvWaFdeeaVWs2ZN7cSJE2qfTZs2acWLF9deeOEFbePGjdrSpUu18847T7vtttsC5ahRo4ZWqlQp7bnnnlP74/LNN9+oY8+fP1/btWuXtnfv3qivY8CAAaqckyZNUo/NzMzUXn311ZAy7t+/P7D/qlWr1LYtW7ao23jdhQoV0i655BJVvvXr12tHjx7VvvjiC23KlCnaTz/9pK1bt07r06ePVqlSJe3QoUPqcXv27FHHweNRRtyGL7/8Ur0elAfnFecG52To0KHq/tOnT2uNGzfWOnTooH3//ffa4sWL1TnBsWbNmhX1dT744INaly5dQrbhPSpXrpzWo0cPbcWKFdqGDRu0N954Q70GuPXWW7Xu3burv/F6SpcurU2cODHw+OnTp2szZszQfv75Z3VerrrqKu3cc89VZYTDhw9rFStW1Hr16qX98MMP2kcffaTVqlVLlRX7A84t9nnsscfUufruu++0Tp06ae3atQs8T5s2bbS+ffuGvOf4TMCzzz6rlS9fXlu+fHngfty3YMEC9R6h3PXr19fuvffePOcE7wfOv6ck+XuAyMsOGqi/bQ9U8IV+0003qS/1IkWKqIoCX+yOClRA/3LCtYWOHz+uFStWTPvqq69CtqMyvvHGGwO333//fXW+Bg0apAIOBBs6PQiYOnVqYBsCiqJFi2rTpk0LHO/uu+8OeQ4EEqmpqdqff/4ZqLSuueaakH1QQQVXhtEgaEBwpQcm4WINVHAbQUN+UHmXLFlSVda6SMEFApBRo0aFbEPAU7lyZfX3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hjFQIU/6448/VD94pUqVQrbjNkYd6PBlet1118mnn34qGRkZDGKILPi/tnTpUtU9hNwWJNXisnbtWptKTG5zht0FILLT/Pnz7S4Ckee1atVKdQcRxYMtKuRJGP6Ylpam5m4IhtsYHklE5uD/NbIaAxXypPT0dDWp1BdffBHYhl90uN2yZUtby0bkJfy/RlZj1w+51pEjR2TTpk2B21u2bJHvv/9eypUrJ9WrV1fDJW+99Va58MILpUWLFjJu3Dg1zPL222+3tdxEbsP/a2QrDE8mcqOFCxdiaH2ey6233hrY58UXX9SqV6+upaenay1atNCWLVtma5mJ3Ij/18hOnEeFiIiIHIs5KkRERORYDFSIiIjIsRioEBERkWMxUCEiIiLHYqBCREREjsVAhYiIiByLgQoRERE5FgMVIiIiciwGKkTkKpMmTZIyZcqYdry2bdvKQw89ZNrxiMhcXOuHiAwbOnSozJ49W6334nYzZ86UQoUK2V0MIoqCgQoRucbJkydNPyYW1iMi52LXD5HPoKvjwQcflAEDBqhK+qyzzlItJMEOHDggd955p1SsWFFKlSol7du3l9WrVwe6Xp5++ml1OyUlRV2w7dFHH5Urr7wycAysoIv75s2bF9hWp04dee2119TfOTk5MmzYMMnIyJDChQtLs2bNQvb99ddf1eOnTZsmbdq0kSJFisg777yT5/X8/vvvatXea6+9VrKzsyO+5v/85z9St25ddYxKlSpJz549I3b9LFq0KPCagi+33XZbYP8PP/xQzj//fHWsWrVqqXNx6tSpuN4LIioYAxUiH3rrrbekePHisnz5chkzZowKGD7//PPA/dddd53s2bNH5s6dK99++62qmDt06CD79u2T66+/Xh555BFp1KiR7Nq1S12wDcHEkiVL5PTp0+oYixcvlgoVKqjKH3bs2CGbN29WgQGMHz9enn/+eXnuuedkzZo10rlzZ7n66qvl559/DinroEGDpG/fvvLTTz+pfYJlZWVJ69atpXHjxjJ9+nQV8IRbuXKlCszwGjds2KCCocsuuyziebnkkksCrwmXBQsWqIBE3z8zM1N69+6tyrNu3TqZOHGiCtJGjhyZ8HtCRFHYunYzESVdmzZttFatWoVsa968uTZw4ED1d2ZmplaqVCnt+PHjIfvUrl1bmzhxovp7yJAhWtOmTUPu379/v5aamqqtWLFCy8nJ0cqVK6eNHj1au+iii9T9b7/9tla1atXA/lWqVNFGjhyZpxz33Xef+nvLli1Y2V0bN25cyD5vvvmmVrp0aW39+vVatWrVtAcffFA9XzQzZsxQr+fQoUNRz0ffvn3zbP/jjz+0WrVqBcoDHTp00EaNGhWy35QpU7TKlStHfX4iSgxzVIh8qEmTJiG3K1eurFpQAF06R44ckfLly4fs8+eff6oWkWgwEqdp06aqBSU9PV1d7r77bhkyZIg6HlpY0OoChw4dkp07d8qll14acgzc1ruYdOjWCYeyoCWlV69eqospP506dZIaNWqobpouXbqoC7qJihUrlm8uzN/+9jf1OLT86FC2pUuXhrSgoAXp+PHjcuzYsXyPSUTxYaBC5EPho1yQh4GcEUBQgcBF77IJVtCwYHTr4HHogkFQghyYBg0aqC4hBCroMjIKXVThcPyOHTvKxx9/LP3795eqVatGfXzJkiXlu+++U+X67LPPZPDgwSonZ8WKFVFfz7333qu6lb755hs544y/viZxbpCT0qNHjzyPQRcREZmPgQoRhUA+yu7du1UFXbNmzYj7oLVEz0UJhuDkjTfeUI9Fy4UevLz33nuycePGQH4KEnSrVKmiWif0VhbA7RYtWhRYxtTUVJkyZYpqUWnXrp0KQnC8aFAeBDa4oIUHAQryTyIFHGPHjpX3339fvvrqqzytSjg3yHNBUjARJQcDFSIKgcq8ZcuWcs0116hE23r16qlumk8++UR1maArBgHMli1b1DwqGLWDVgu0ciDp9PDhw6ql45lnnlHHQ3CCUTZopcGxdGgJQdBQu3ZtNeLnzTffVMeLNLInkrS0NLXvjTfeqEYlIVjBCKZwKMsvv/yiyla2bFn59NNPVetR/fr18+w7f/58NRrqpZdeUonACNigaNGiUrp0adUag5FN1atXV68JARO6g3744QcZMWJEAmediKLhqB8iytMNhMocFfvtt9+ugosbbrhBtm7dqob2AvI30GKC1gwMYUaLCSAQOPfcc9W2c845R23DcRAYBLecAEbi9OvXT3UH4TEYjTNnzhw1jDhWaCnBc2MEEoIVPc8mGFpPMKkb7kc31IQJEwKPCaePWrrnnntUYKVfMMoHMOoIgQ+6kJo3by4XX3yxvPDCCyqXhYiskYKMWouOTURERJQQtqgQERGRYzFQISIiIsdioEJERESOxUCFiIiIHIuBChERETkWAxUiIiJyLAYqRERE5FgMVIiIiMixGKgQERGRYzFQISIiIsdioEJERESOxUCFiIiIxKn+H9jZXq6UXZ/BAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sizes_sm = [bn.N for bn in bns_sm]\n", "average_degrees_sm = [np.mean(bn.indegrees) for bn in bns_sm]\n", "\n", "f,ax = plt.subplots()\n", "ax.semilogx(sizes, average_degrees, 'rx', \n", " label = 'expert-curated (ckadelka)')\n", "ax.semilogx(sizes_sm, average_degrees_sm, 'bo', \n", " label = 'pystablemotifs (jcrozum)')\n", "ax.set_xlabel('network size')\n", "ax.set_ylabel('average essential degree')\n", "ax.legend(loc='best',frameon=False);" ] }, { "cell_type": "markdown", "id": "ea7e0ece", "metadata": {}, "source": [ "## Null models\n", "\n", "Observed properties of Boolean networks are often difficult to interpret in\n", "isolation. For example, a network may exhibit a certain number of attractors,\n", "a particular robustness to perturbations, or a specific Derrida value.\n", "However, it is not immediately clear whether such properties are meaningful or\n", "simply typical for networks with the same size and structural characteristics.\n", "\n", "To address this question, researchers compare observed networks with\n", "**null models**: randomly generated Boolean networks that preserve selected\n", "structural features, such as the number of nodes, the wiring diagram, or the\n", "bias of regulatory functions. By analyzing ensembles of such randomized\n", "networks, it becomes possible to determine whether the behavior of a given\n", "network is unusual or expected.\n", "\n", "The BoolForge function `random_null_model(BooleanNetwork, *args)` provides \n", "extensive tools for generating these null models and for performing \n", "ensemble-based analyses that connect structural properties of Boolean functions\n", "and networks with their dynamical behavior.\n", "\n", "The function takes as required input a Boolean network. Important: This network\n", "may not contain any degenerate update functions. If it does, these functions must\n", "be simplified via `bn.simplify_functions()` prior to generating null models. \n", "The avoid repeating this step many times, this simplification is not performed \n", "inside `random_null_model`. The type of null model is specified by optional arguments. \n", "Both the wiring diagram and the Boolean update rules can be randomized subject \n", "to specified invariants.\n", "\n", "### Randomization of the wiring diagram\n", "\n", "By default, the wiring diagram of the provided Boolean network is not changed.\n", "However, setting `wiring_diagram=\"fixed_indegree\"` generates a new wiring\n", "diagram using `random_wiring_diagram`. Each node in the new wiring diagram\n", "has exactly the same in-degree as in the provided Boolean network." ] }, { "cell_type": "code", "execution_count": 6, "id": "baf7472e", "metadata": { "execution": { "iopub.execute_input": "2026-03-25T05:35:23.342980Z", "iopub.status.busy": "2026-03-25T05:35:23.342898Z", "iopub.status.idle": "2026-03-25T05:35:23.550165Z", "shell.execute_reply": "2026-03-25T05:35:23.549932Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "bn_orig.in-degrees: [1 2 1 2 1 2 3 2]\n", "bn_null.in-degrees: [1 2 1 2 1 2 3 2]\n", "\n", "bn_orig.out-degrees: [4 3 1 0 1 0 1 4]\n", "bn_null.out-degrees: [2 2 0 1 5 1 2 1]\n" ] } ], "source": [ "bn_orig = bf.random_network(N=8, n=2, indegree_distribution='Poisson', rng = 3)\n", "\n", "bn_null = bf.random_null_model(bn_orig, \n", " wiring_diagram='fixed_indegree')\n", "\n", "print('bn_orig.in-degrees:',bn_orig.indegrees)\n", "print('bn_null.in-degrees:',bn_null.indegrees)\n", "print()\n", "print('bn_orig.out-degrees:',bn_orig.outdegrees)\n", "print('bn_null.out-degrees:',bn_null.outdegrees)" ] }, { "cell_type": "markdown", "id": "e65da17c", "metadata": {}, "source": [ "We see that the in-degrees of the original Boolean network are preserved,\n", "while the out-degrees change substantially. Additional optional arguments\n", "in the `fixed_indegree` mode include `strongly_connected`, `allow_self_loops`,\n", "and `min_out_degree_one`, as described in detail in Tutorial 9.\n", "\n", "A more constrained null model fixes the out-degree in addition to the\n", "in-degree. This can be obtained by setting\n", "`wiring_diagram=\"fixed_in_and_outdegree\"`." ] }, { "cell_type": "code", "execution_count": 7, "id": "18f90781", "metadata": { "execution": { "iopub.execute_input": "2026-03-25T05:35:23.551318Z", "iopub.status.busy": "2026-03-25T05:35:23.551242Z", "iopub.status.idle": "2026-03-25T05:35:23.565019Z", "shell.execute_reply": "2026-03-25T05:35:23.564825Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "bn_orig.in-degrees: [1 2 1 2 1 2 3 2]\n", "bn_null.in-degrees: [1 2 1 2 1 2 3 2]\n", "\n", "bn_orig.out-degrees: [4 3 1 0 1 0 1 4]\n", "bn_null.out-degrees: [4 3 1 0 1 0 1 4]\n" ] } ], "source": [ "bn_orig = bf.random_network(N=8, n=2, indegree_distribution='Poisson', rng = 3)\n", "\n", "bn_null = bf.random_null_model(bn_orig, \n", " wiring_diagram='fixed_in_and_outdegree')\n", "\n", "print('bn_orig.in-degrees:',bn_orig.indegrees)\n", "print('bn_null.in-degrees:',bn_null.indegrees)\n", "print()\n", "print('bn_orig.out-degrees:',bn_orig.outdegrees)\n", "print('bn_null.out-degrees:',bn_null.outdegrees)" ] }, { "cell_type": "markdown", "id": "010fe063", "metadata": {}, "source": [ "In the `fixed_in_and_outdegree` mode, the original wiring diagram is rewired\n", "through an edge-swapping algorithm. Additional optional arguments that can\n", "be used in this mode include `allow_new_self_loops` and\n", "`allow_self_loop_rewiring`.\n", "\n", "### Randomization of the update functions\n", "\n", "In addition to the wiring diagram, the Boolean update functions can also be\n", "randomized. This behavior is controlled by two Boolean flags:\n", "\n", "- `preserve_bias`: If True (default), the newly generated update function of\n", " each node has the same Hamming weight (number of ones in the truth table) \n", " as the original update function.\n", "\n", "- `preserve_canalizing_depth`: If True (default), the newly generated update\n", " function of each node has the same canalizing depth as the original update\n", " function.\n", "\n", "If both flags are True (the default), both properties are preserved\n", "simultaneously. If neither flag is True, the newly generated update rules may\n", "be any non-degenerate Boolean function consistent with the given in-degree." ] }, { "cell_type": "code", "execution_count": 8, "id": "ce44ae46", "metadata": { "execution": { "iopub.execute_input": "2026-03-25T05:35:23.566025Z", "iopub.status.busy": "2026-03-25T05:35:23.565966Z", "iopub.status.idle": "2026-03-25T05:35:23.573076Z", "shell.execute_reply": "2026-03-25T05:35:23.572880Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Canalizing depths:\n", "bn_orig: [3, 3, 1, 1, 3, 3, 1, 3]\n", "bn_null00: [0, 3, 0, 3, 3, 0, 0, 0]\n", "bn_null01: [3, 3, 1, 1, 3, 3, 1, 3]\n", "bn_null10: [0, 3, 2, 1, 3, 3, 2, 3]\n", "bn_null11: [3, 3, 1, 1, 3, 3, 1, 3]\n", "\n", "Hamming weights:\n", "bn_orig: [3, 5, 6, 6, 1, 5, 2, 7]\n", "bn_null00: [6, 5, 4, 7, 5, 4, 4, 4]\n", "bn_null01: [3, 1, 6, 6, 3, 5, 2, 5]\n", "bn_null10: [3, 5, 6, 6, 1, 5, 2, 7]\n", "bn_null11: [3, 5, 6, 6, 1, 5, 2, 7]\n" ] } ], "source": [ "# 8-node network governed by 3-input functions with minimum canalizing depth 1\n", "bn_orig = bf.random_network(N=8, n=3, depth=1, rng = 6)\n", "\n", "bn_null00 = bf.random_null_model(bn_orig, \n", " preserve_bias=False, \n", " preserve_canalizing_depth=False)\n", "bn_null01 = bf.random_null_model(bn_orig, \n", " preserve_bias=False, \n", " preserve_canalizing_depth=True)\n", "bn_null10 = bf.random_null_model(bn_orig, \n", " preserve_bias=True, \n", " preserve_canalizing_depth=False)\n", "bn_null11 = bf.random_null_model(bn_orig, \n", " preserve_bias=True, \n", " preserve_canalizing_depth=True)\n", "\n", "print('Canalizing depths:')\n", "print('bn_orig: ',\n", " [f.get_canalizing_depth() for f in bn_orig.F])\n", "print('bn_null00:',\n", " [f.get_canalizing_depth() for f in bn_null00.F])\n", "print('bn_null01:',\n", " [f.get_canalizing_depth() for f in bn_null01.F])\n", "print('bn_null10:',\n", " [f.get_canalizing_depth() for f in bn_null10.F])\n", "print('bn_null11:',\n", " [f.get_canalizing_depth() for f in bn_null11.F])\n", "print()\n", "print('Hamming weights:')\n", "\n", "print('bn_orig: ',\n", " [f.hamming_weight for f in bn_orig.F])\n", "print('bn_null00:',\n", " [f.hamming_weight for f in bn_null00.F])\n", "print('bn_null01:',\n", " [f.hamming_weight for f in bn_null01.F])\n", "print('bn_null10:',\n", " [f.hamming_weight for f in bn_null10.F])\n", "print('bn_null11:',\n", " [f.hamming_weight for f in bn_null11.F])" ] }, { "cell_type": "markdown", "id": "a536ec59", "metadata": {}, "source": [ "We see that the preserved structural constraints determine which properties\n", "of the original network are retained in the null models. Such controlled\n", "randomization allows systematic investigation of how structural features\n", "influence network dynamics.\n", "\n", "## Example use case: high coherence of biological networks\n", "\n", "As an example, we compare the *coherence* of curated biological Boolean\n", "network models with the coherence expected under randomized null models.\n", "Coherence measures the long-term resilience of a network to small perturbations.\n", "\n", "For each biological network, we generate an ensemble of randomized null\n", "models in which the wiring diagram is preserved but the Boolean update rules\n", "are replaced by random Boolean functions. We then compare the coherence of the\n", "biological model with the average coherence of its corresponding null models.\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "5dae6baa", "metadata": { "execution": { "iopub.execute_input": "2026-03-25T05:35:23.574094Z", "iopub.status.busy": "2026-03-25T05:35:23.574022Z", "iopub.status.idle": "2026-03-25T05:35:27.684015Z", "shell.execute_reply": "2026-03-25T05:35:27.683784Z" }, "lines_to_next_cell": 2 }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n_null_models = 50\n", "\n", "bns_to_analyze = [bn for bn in bns if bn.N <= 16]\n", "bio_data = [bn.get_attractors_and_robustness_synchronous_exact()['Coherence']\n", " for bn in bns_to_analyze]\n", "\n", "null_data = []\n", "for bn in bns_to_analyze:\n", " null_data.append([])\n", " for _ in range(n_null_models):\n", " null_model = bf.random_null_model(bn,\n", " preserve_bias=False,\n", " preserve_canalizing_depth=False)\n", " null_data[-1].append(\n", " null_model.get_attractors_and_robustness_synchronous_exact()['Coherence']\n", " )\n", "\n", "f,ax = plt.subplots()\n", "ax.plot(bio_data,np.mean(null_data,1),'x')\n", "ax.plot([0,1],[0,1],'r--')\n", "ax.set_aspect('equal', adjustable='box')\n", "ax.set_xlabel('Biological network coherence')\n", "ax.set_ylabel('Average null model coherence')\n", "stat, p = ttest_rel(bio_data,np.mean(null_data,1), alternative='greater')\n", "p_str = f\"{p:.2g}\" if p >= 1e-3 else \"< 0.001\"\n", "ax.set_title(f\"One-sided paired t-test: p {('= ' if p >= 1e-3 else '')}{p_str}\");" ] }, { "cell_type": "markdown", "id": "39ccbac3", "metadata": {}, "source": [ "We see that most biological networks exhibit higher than expected coherence. \n", "Even for this small ensemble of biological networks (restricted here to\n", "networks with at most 16 nodes to allow exact dynamical analysis), this\n", "is a statistically significant difference, as exemplified by the one-sided paired t-test.\n", "\n", "The higher coherence observed in biological networks is likely due to their highly biased \n", "and canalized regulatory logic. To test this, we can rerun the computational experiment, \n", "this time with null models where bias and/or canalizing depth are preserved." ] }, { "cell_type": "code", "execution_count": 10, "id": "f140ecc7", "metadata": { "execution": { "iopub.execute_input": "2026-03-25T05:35:27.685216Z", "iopub.status.busy": "2026-03-25T05:35:27.685146Z", "iopub.status.idle": "2026-03-25T05:35:31.329494Z", "shell.execute_reply": "2026-03-25T05:35:31.329261Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "null_data = []\n", "for i,bn in enumerate(bns_to_analyze):\n", " null_data.append([])\n", " for _ in range(n_null_models):\n", " null_model = bf.random_null_model(bn,\n", " preserve_bias=True,\n", " preserve_canalizing_depth=True)\n", " null_data[-1].append(\n", " null_model.get_attractors_and_robustness_synchronous_exact()['Coherence']\n", " )\n", "\n", "f,ax = plt.subplots()\n", "ax.plot(bio_data,np.mean(null_data,1),'x')\n", "ax.plot([0,1],[0,1],'r--')\n", "ax.set_aspect('equal', adjustable='box')\n", "ax.set_xlabel('Biological network coherence')\n", "ax.set_ylabel('Average null model coherence');\n", "stat, p = ttest_rel(bio_data,np.mean(null_data,1), alternative='greater')\n", "p_str = f\"{p:.2g}\" if p >= 1e-3 else \"< 0.001\"\n", "ax.set_title(f\"One-sided paired t-test: p {('= ' if p >= 1e-3 else '')}{p_str}\");" ] }, { "cell_type": "markdown", "id": "baae1cdf", "metadata": {}, "source": [ "We observe that matching canalizing depth and bias (or just one of them, try it!)\n", "suffices to eliminate the significant difference in coherence between\n", "biological networks and their null models.\n", "\n", "This illustrates how controlled null models can reveal which structural\n", "properties of biological regulatory logic are responsible for observed\n", "dynamical behavior.\n", "\n", "## Summary\n", "\n", "In this tutorial, we introduced **null models for Boolean networks** and\n", "demonstrated how BoolForge can generate randomized networks while preserving\n", "selected structural properties. Such null models provide a statistical\n", "baseline that helps determine whether observed structural or dynamical\n", "properties of a Boolean network are unusual or simply typical for networks\n", "with similar characteristics.\n", "\n", "We considered two main classes of null models:\n", "\n", "- **Wiring diagram randomization**, where the regulatory graph is modified\n", " while preserving invariants such as node in-degrees or both in- and\n", " out-degrees.\n", "- **Update function randomization**, where Boolean update rules are replaced\n", " by new functions that preserve properties such as bias or canalizing depth.\n", "\n", "In addition, we demonstrated how Boolean network models can be **loaded from\n", "biological model repositories** and analyzed using the same structural and\n", "dynamical tools provided by BoolForge. This enables systematic investigation\n", "of curated regulatory network models and comparison with appropriate null\n", "models.\n", "\n", "Together, these capabilities allow researchers to study how structural\n", "features of regulatory networks influence their dynamical behavior and to\n", "place biological models in the broader context of ensembles of randomized\n", "networks." ] } ], "metadata": { "jupytext": { "cell_metadata_filter": "-all", "main_language": "python", "notebook_metadata_filter": "-all" }, "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.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }