{ "cells": [ { "cell_type": "markdown", "id": "c02facb0", "metadata": {}, "source": [ "# Preface {.unnumbered}\n", "\n", "**BoolForge** is a Python toolbox for generating, analyzing, and simulating\n", "Boolean functions and Boolean networks. Boolean network models are widely used\n", "in systems biology, theoretical biology, and complex systems research to study\n", "regulatory systems whose components operate in two qualitative states\n", "(e.g., active/inactive or ON/OFF).\n", "\n", "In gene regulatory network models, for instance, each node represents a molecular component\n", "(such as a gene, protein, or signaling molecule), and each node is updated by a\n", "Boolean function that represents the regulatory logic controlling that component.\n", "\n", "The tutorials in this document provide a structured introduction to BoolForge\n", "and demonstrate how it can be used to perform computational experiments on\n", "Boolean functions and Boolean networks.\n", "\n", "## Philosophy and scope of BoolForge {.unnumbered}\n", "\n", "BoolForge was designed to support both **methodological research on Boolean\n", "networks** and **applied analysis of biological regulatory models**.\n", "\n", "Three principles guide its design:\n", "\n", "**1. Fundamental representations**\n", "\n", "Boolean functions are stored internally as truth tables, the most fundamental\n", "representation of Boolean logic. Logical expressions and polynomial forms can\n", "be derived from this representation when needed.\n", "\n", "**2. Controlled random model generation**\n", "\n", "Many research questions require comparing biological networks with suitable\n", "**null models**. BoolForge therefore provides various tools for generating random\n", "Boolean functions and Boolean networks with prescribed structural properties.\n", "\n", "**3. Integration of structure and dynamics**\n", "\n", "Structural properties of regulatory rules (such as canalization, redundancy,\n", "and symmetry) influence dynamical behavior, including attractors, robustness,\n", "and sensitivity to perturbations. BoolForge enables analysis across these levels,\n", "connecting function-level structure to network-level dynamics.\n", "\n", "**Together, these capabilities enable ensemble-based exploration of the\n", "relationship between structure and dynamics in Boolean networks.**\n", "\n", "For example, we can reproduce, in a few lines of code, the classical phase transition \n", "from order to chaos in random Boolean networks predicted by the annealed approximation of\n", "[Derrida and Pomeau (1986)](https://hal.science/hal-03285912/document)." ] }, { "cell_type": "code", "execution_count": 1, "id": "87f5f003", "metadata": { "execution": { "iopub.execute_input": "2026-06-10T06:40:24.030188Z", "iopub.status.busy": "2026-06-10T06:40:24.029858Z", "iopub.status.idle": "2026-06-10T06:40:25.844038Z", "shell.execute_reply": "2026-06-10T06:40:25.843756Z" } }, "outputs": [ { "data": { "image/png": "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kAULD79bnCxdfrbM29tb6yYQEZGdYQBkwfRF20FBQWp5EHPTr85eHKvPZw1+rHWRWiIisl4MgCyYzJOkH91mS6vPExERwd4XQyUiIiIqbgyAiIiIyO4wACIiIiK7wwCIiIiI7A4DICIiIrI7DICIiIjI7jAAIiIiIrvDAIiIiIjsDgMgIiIisjsMgIiIiMjuMAAiIiIiu8MAiIiIiOwOF0O1QYmJiQgPDy/UavBZvxqruFatJyIiKioGQDZIgp+QkJBCP3/w4MGFel5oaChXkSciIqvAAMgGSSZGghFjJSUlISIiAlWrVoWHh0ehzktERGQNHHQ6nU7rRlia2NhY+Pr6IiYmBj4+Plo3h4iIiEx8/WYRNBEREdkdBkBERERkdxgAERERkd1hAERERER2hwEQERER2R0GQERERGR3GAARERGR3WEARERERHaHARARERHZHQZAREREZHcYABEREZHdYQBEREREdocBEBEREdkdZ60bYIl0Op1hVVkiIiKyDvrrtv46nhcGQDmIi4tTXytVqqR1U4iIiKgQ13FfX98893HQFSRMsjOZmZm4cuUKvL294eDgAHuKnCXou3jxInx8fLRuDpkZf972hT9v+2KvP2+dTqeCn8DAQDg65l3lwwxQDuRNq1ixIuyV/LHY0x+MvePP277w521f7PHn7ZtP5kePRdBERERkdxgAERERkd1hAEQGbm5umDJlivpKto8/b/vCn7d94c87fyyCJiIiIrvDDBARERHZHQZAREREZHcYABEREZHdYQBEREREdocBEGHHjh3o3r27mjlTZr5et26d1k0iM5o2bRoeeOABNdN52bJl0atXL5w8eVLrZpGZzJs3D40aNTJMiNeqVSv8/vvvWjeLisHHH3+sPtNffvllrZtikRgAERISEtC4cWPMnTtX66ZQMdi+fTteeOEF7N69G1u2bEFaWhoeeeQR9XtAtkdmtZcLYWhoKPbv34+OHTuiZ8+eOHbsmNZNIzPat28f5s+fr4JfyhmHwVM28t/C2rVrVVaA7MONGzdUJkgCowcffFDr5lAx8Pf3x/Tp0/Hss89q3RQyg/j4eAQHB+Orr77CBx98gCZNmmDmzJlaN8viMANEZOdiYmIMF0WybRkZGVi+fLnK9klXGNkmyfA+9thj6Ny5s9ZNsWhcDJXIjmVmZqr6gDZt2qBBgwZaN4fM5MiRIyrgSU5ORokSJVSWt169elo3i8xAAtywsDDVBUZ5YwBEZOf/KR49ehQ7d+7UuilkRnXq1MHBgwdVtm/VqlUYNmyY6vJkEGRbLl68iHHjxqnaPnd3d62bY/FYA0TZsAbIfowdOxa//PKLGgVYrVo1rZtDxUi6RmrUqKGKZMl2yAje3r17w8nJKVu3p3yuOzo6IiUlJdtj9o4ZICI7I//zvPjiiyrQ/euvvxj82GnXp1wMybZ06tRJdXdm9fTTTyMoKAivv/46g597MAAiNWLgzJkzhu3z58+rdLkUxVauXFnTtpF5ur2WLVumsj8yF9DVq1fV/b6+vvDw8NC6eWRikyZNQteuXdXfclxcnPrZS+C7adMmrZtGJiZ/z/fW8nl5eaFUqVKs8csBAyBSc4N06NDBsD1+/Hj1VeoEFi5cqGHLyFwT44mHHnoo2/0LFizA8OHDNWoVmcv169cxdOhQREVFqSBX5oWR4Ofhhx/WumlEmmINEBEREdkdzgNEREREdocBEBEREdkdBkBERERkdxgAERERkd1hAERERER2hwEQERER2R0GQERERGR3GAARERGR3WEAREQ2rWrVqpg5c6bJjyuzpPv5+cFayXIYskhmdHS01k0h0gQDICIbJWt8yaKn1atXh5ubGypVqoTu3btj27ZtxdYGWVqjV69eZjm2LOXx8ssv57vfvn37MGrUKLO0gYisF9cCI7JBERERaNOmjcpQTJ8+HQ0bNkRaWppaA0oWQw0PD4e9KFOmDKyZ/NxcXFy0bgaRzWEGiMgGPf/886p7Y+/evejbty9q166N+vXrq4Vud+/ebdgvMjISPXv2RIkSJeDj44Mnn3wS165dMzw+depUNGnSBIsXL1ZdSbKY5oABA9Sq4nqrVq1SAZasJC+rTnfu3BkJCQnquT/++KNadV7aIjfpdhGvv/66apOnp6fKUL3zzjvqQl/Q80pmafv27fjyyy8Nx5agryBdYLLvd999h969e6vz16pVC+vXry9Ql5esqC7PkefeunXrvn3ktQYHB8Pd3V29rnfffRfp6emGxyXwbNu2rXq8Xr162Lp1q2rPunXr1OPyGmR7xYoVaN++vdpv6dKl6jFpc926ddV9QUFB+Oqrr7Kd++LFi+rnJ0Gvv7+/+rnm9p7kJDExUa0aL4Ezu8XILshiqERkO27duqVzcHDQffTRR3nul5GRoWvSpImubdu2uv379+t2796tCwkJ0bVv396wz5QpU3QlSpTQ9enTR3fkyBHdjh07dAEBAbo333xTPX7lyhWds7OzbsaMGbrz58/rDh8+rJs7d64uLi5O3Z588kndo48+qouKilK3lJQU9bz3339f988//6jnrF+/XleuXDndJ598UuDzRkdH61q1aqUbOXKk4djp6ek5vs4qVarovvjiC8O2fOxVrFhRt2zZMt3p06d1L730kjqXvG+5kffG0dFRtfHkyZO6L7/8Uufn56fz9fU17CNt9PHx0S1cuFB39uxZ3ebNm3VVq1bVTZ06VT0u7atTp47u4Ycf1h08eFD3999/65o3b67as3btWrWPvB+yLc9bvXq17ty5c+o9XrJkia58+fKG++Srv7+/OpdITU3V1a1bV/fMM8+on8Hx48d1gwYNUufTv+f3+vPPP9W57ty5o26tW7fWPfLII7qEhIQ8f2+IbAUDICIbs2fPHnVhW7NmTZ77yQXayclJFxkZabjv2LFj6rl79+41BCKenp662NhYwz6vvfaarkWLFur70NBQtX9ERESO5xg2bJiuZ8+e+bZ5+vTpKvjSy++8QgK1cePG5XvsnAKgt99+27AdHx+v7vv9999zPcbAgQN13bp1y3Zf//79swVAnTp1ui/oXLx4sQpchBxfgkUJ1vS2bNmSYwA0c+bMbMepUaOGCtiykiBSgkD9eSTYyczMNDwugY+Hh4du06ZNeQZAJ06c0DVq1EjXt2/fXIMlIlvEGiAiG3P3Gp+/EydOqMJouelJt4x0ochjDzzwgKELydvb27BP+fLlcf36dfV948aN0alTJ9UF1qVLFzzyyCN44oknULJkyTzPLV08s2bNwtmzZxEfH6+6iaQLLqu8zltUjRo1Mnzv5eWlzq0/tnQVXrhwQX3frl07/P777+r9kG6vrFq1aoWNGzcatg8dOoR//vkHH374oeG+jIwMJCcnq+6lkydPqvc6ICDA8Hjz5s1zbF+zZs0M30t3orxPzz77LEaOHGm4X94z6RrUn/vMmTPZ3i8h55bn5uXhhx9W7ZCfiZOTU577EtkSBkBENkZqWqSOxFSFzvcW4MqxMzMz1fdywdyyZQt27dqFzZs3Y/bs2XjrrbewZ88eVKtWLcfj/fvvv3jqqadUfYwETXIRX758OT7//PMCn9ecr+m3334z1CNJXVNBSSAnr6lPnz73PSZ1O8aQoCzrccW3336LFi1aZNtPH7DIPiEhIYZ6IWOKwB977DGsXr0ax48fV4Eskb1gAERkY6QAVgKLuXPn4qWXXsp2MRVS4CpZHimolcJZuemzQHIRlMclE1RQEjxI4azcJk+ejCpVqmDt2rWq4NrV1VVlQbKSYEn2kUBJT59xMUZOxzYFadu95L2SoC6rrMXkQoqfJctTs2bNHI9bp04d9V5LkXm5cuUMQ/TzI/sGBgbi3LlzKnDMiZxbMjhly5a9L5OWn48//lgVwUsmT4rUjfnZE1kzjgIjskES/EhwIF0b8t/96dOnVTeOdDtJ142Q0VryH79cVMPCwtSIsaFDh6rRR1m7YPIiQcFHH32E/fv3qxFla9aswY0bN1TAoO/GOnz4sAoMbt68qTIrkqGSfSXrI90z0iYJmIwlx5bzy0gnObapskM5kUBSurs+++wz9V7OmTMnW/eXkOBv0aJFKgt07Ngx9X7La3z77bcNXU01atTAsGHD1Hsi3WX6xySIzIscc9q0aeq9OnXqFI4cOYIFCxZgxowZ6nH5GZYuXVqN/Pr7779x/vx5FcxIuy9dupTv65PXJcfo2LGjXU2RQPaNARCRDZIh2BLUdOjQAa+++ioaNGigLsAyCeK8efMMF10Zti31Og8++KAKiOR5kkkoKMk27NixA926dVPD2uWCLl1ZMpxaSM2KZD4koJKuGLno9+jRA6+88grGjh2rhrpLRkiGwRtrwoQJqgtIMhZybAmqzKVly5aqC0qG3Uvdk3T36YMXPcm6/frrr+oxqZ+S53zxxReGjJK0VYa7S3eVPD5ixAhDFiy/LjLZV4bBS9AjQasEqTIsX9/NKEPz5ecgw/SlC04CUKkZkhqggmaEpK0yjF6CIAmyiGydg1RCa90IIiJ7JAGhzAskBcySHSKi4sMAiIiomEhXn9TbSDegBD3jxo1TGbidO3dq3TQiu8MiaCKiYiIzWcss2NJdJzU70u147+g3IioezAARERGR3WERNBEREdkdBkBERERkdxgAERERkd1hAERERER2hwEQERER2R0GQERERGR3GAARERGR3WEARERERLA3/we+6UOKEwA5ZwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import boolforge as bf\n", "import matplotlib.pyplot as plt\n", "\n", "N = 100 # network size\n", "ks = range(1,5) # constant in-degree\n", "n_networks = 50 # ensemble size\n", "p = 0.5 # bias p: probability of ones in truth table\n", "\n", "derrida_values = []\n", "for k in ks:\n", " derrida_values.append([])\n", " for _ in range(n_networks):\n", " bn = bf.random_network(N, k, bias = p, allow_degenerate_functions=True)\n", " derrida_values[-1].append( bn.get_derrida_value(exact=True) )\n", "\n", "plt.boxplot(derrida_values, positions=list(ks))\n", "plt.axhline(1, linestyle=\"--\", color=\"gray\", label=\"critical value\")\n", "plt.plot(ks, [2*k*p*(1-p) for k in ks], \"o-\", label=r\"$2kp(1-p)$ (annealed theory)\")\n", "plt.xlabel(\"Constant in-degree k\")\n", "plt.ylabel(\"Derrida value\")\n", "plt.legend(frameon=False);" ] }, { "cell_type": "markdown", "id": "27c25313", "metadata": { "lines_to_next_cell": 2 }, "source": [ "The Derrida value measures the average number of nodes affected by a single-bit \n", "random perturbation after one synchronous update of the network.\n", "\n", "\n", "## Structure of the tutorials {.unnumbered}\n", "\n", "The tutorials gradually introduce the main concepts and tools provided by\n", "BoolForge, moving from individual Boolean functions to full Boolean\n", "network models and their dynamical analysis.\n", "\n", "- **Boolean functions:** representation and structural analysis\n", "- **Canalization:** redundancy and robustness of regulatory rules\n", "- **Random function generation:** sampling functions with prescribed properties\n", "- **Boolean networks:** construction and wiring diagrams\n", "- **Network dynamics:** attractors and state transition graphs\n", "- **Stability and robustness:** sensitivity to perturbations\n", "- **Random network ensembles:** statistical analysis of network dynamics\n", "- **Biological models:** analysis of curated regulatory networks\n", "\n", "Each tutorial contains executable code examples illustrating how these ideas\n", "can be explored using BoolForge.\n", "Readers are encouraged to run the code cells and modify the examples to\n", "explore their own Boolean functions and networks.\n" ] } ], "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 }