{ "cells": [ { "cell_type": "markdown", "id": "350ff1b7", "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": "39df0734", "metadata": { "execution": { "iopub.execute_input": "2026-03-31T14:34:58.479163Z", "iopub.status.busy": "2026-03-31T14:34:58.478724Z", "iopub.status.idle": "2026-03-31T14:35:09.653792Z", "shell.execute_reply": "2026-03-31T14:35:09.652925Z" } }, "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": "e7a7bccf", "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": "c15625e3", "metadata": { "execution": { "iopub.execute_input": "2026-03-31T14:35:09.658972Z", "iopub.status.busy": "2026-03-31T14:35:09.658342Z", "iopub.status.idle": "2026-03-31T14:35:41.574584Z", "shell.execute_reply": "2026-03-31T14:35:41.573887Z" } }, "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": "00c846f0", "metadata": {}, "source": [ "The function `get_bio_models_from_repository` loads, by default, all 122 distinct \n", "biological Boolean network models, analyzed in @kadelka2024meta,\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": "66e1404a", "metadata": { "execution": { "iopub.execute_input": "2026-03-31T14:35:41.577947Z", "iopub.status.busy": "2026-03-31T14:35:41.577672Z", "iopub.status.idle": "2026-03-31T14:35:47.412984Z", "shell.execute_reply": "2026-03-31T14:35:47.412091Z" } }, "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": "708ad82b", "metadata": {}, "source": [ "Note that the last repository is very large, which is why this code is commented out." ] }, { "cell_type": "markdown", "id": "09307274", "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": "e1e0f22b", "metadata": { "execution": { "iopub.execute_input": "2026-03-31T14:35:47.417376Z", "iopub.status.busy": "2026-03-31T14:35:47.417054Z", "iopub.status.idle": "2026-03-31T14:35:47.422227Z", "shell.execute_reply": "2026-03-31T14:35:47.421650Z" } }, "outputs": [], "source": [ "sizes = [bn.N for bn in bns]\n", "average_degrees = [np.mean(bn.indegrees) for bn in bns]" ] }, { "cell_type": "markdown", "id": "0805e096", "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": "b839e01e", "metadata": { "execution": { "iopub.execute_input": "2026-03-31T14:35:47.424745Z", "iopub.status.busy": "2026-03-31T14:35:47.424557Z", "iopub.status.idle": "2026-03-31T14:35:47.765816Z", "shell.execute_reply": "2026-03-31T14:35:47.765542Z" } }, "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": "26371ae8", "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 (see e.g., @kadelka2024canalization).\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": "31eeaec4", "metadata": { "execution": { "iopub.execute_input": "2026-03-31T14:35:47.767225Z", "iopub.status.busy": "2026-03-31T14:35:47.767118Z", "iopub.status.idle": "2026-03-31T14:35:48.570298Z", "shell.execute_reply": "2026-03-31T14:35:48.569940Z" } }, "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: [1 3 1 2 3 2 1 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": "fb740f81", "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": "affea64c", "metadata": { "execution": { "iopub.execute_input": "2026-03-31T14:35:48.571816Z", "iopub.status.busy": "2026-03-31T14:35:48.571712Z", "iopub.status.idle": "2026-03-31T14:35:48.586647Z", "shell.execute_reply": "2026-03-31T14:35:48.586307Z" } }, "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": "39422b73", "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": "97023681", "metadata": { "execution": { "iopub.execute_input": "2026-03-31T14:35:48.588129Z", "iopub.status.busy": "2026-03-31T14:35:48.588023Z", "iopub.status.idle": "2026-03-31T14:35:48.596130Z", "shell.execute_reply": "2026-03-31T14:35:48.595787Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Canalizing depths:\n", "bn_orig: [3, 3, 1, 1, 3, 3, 1, 3]\n", "bn_null00: [0, 1, 0, 0, 0, 0, 0, 0]\n", "bn_null01: [3, 3, 1, 1, 3, 3, 1, 3]\n", "bn_null10: [3, 3, 2, 1, 3, 0, 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: [4, 6, 4, 4, 5, 4, 4, 3]\n", "bn_null01: [5, 5, 6, 6, 3, 3, 6, 1]\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": "50dfe247", "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 (see @bavisetty2025attractors).\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": "23de750b", "metadata": { "execution": { "iopub.execute_input": "2026-03-31T14:35:48.597257Z", "iopub.status.busy": "2026-03-31T14:35:48.597189Z", "iopub.status.idle": "2026-03-31T14:35:52.889918Z", "shell.execute_reply": "2026-03-31T14:35:52.889674Z" }, "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": "d5521a62", "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 (see @bavisetty2025attractors). To test this in BoolForge,\n", "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": "7a01f901", "metadata": { "execution": { "iopub.execute_input": "2026-03-31T14:35:52.891103Z", "iopub.status.busy": "2026-03-31T14:35:52.891032Z", "iopub.status.idle": "2026-03-31T14:35:56.578640Z", "shell.execute_reply": "2026-03-31T14:35:56.578409Z" } }, "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": "dbb8550c", "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 }