{ "cells": [ { "cell_type": "markdown", "id": "e0816436", "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\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": "1264b0a4", "metadata": { "execution": { "iopub.execute_input": "2026-03-29T03:04:29.907538Z", "iopub.status.busy": "2026-03-29T03:04:29.907213Z", "iopub.status.idle": "2026-03-29T03:04:31.366760Z", "shell.execute_reply": "2026-03-29T03:04:31.366538Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAYAAABB4NqyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAYYJJREFUeJzt3Qd0VMXbBvAnvUAKoYUAoUOoCQnSkSKIwEcTlQ6iIKIIihULxQIqShMEbCCgAtIVpYgiAtISOgQILXQIkN6z+513+G9MQtomu9n2/M7ZQ+7u3buzIdn7ZOa9M3ZarVYLIiIiIhtib+oGEBEREZU0BiAiIiKyOQxAREREZHMYgIiIiMjmMAARERGRzWEAIiIiIpvDAEREREQ2x9HUDTBHGo0G165dg4eHB+zs7EzdHCIiIioEmdowLi4Ofn5+sLfPv4+HASgXEn6qVq1q6mYQERFREVy+fBlVqlTJdx8GoFxIz4/uG+jp6Wnq5hAREVEhxMbGqg4M3Xk8PwxAudANe0n4YQAiIiKyLIUpX2ERNBEREdkcBiAiIiKyOQxAREREZHMYgIiIiMjmMAARERGRzWEAIiIiIpvDAEREREQ2hwGIiIiIbA4DEBEREdkcBiAiIiKyOQxAREREZHMYgChPS5Ysgbe3d6HWXFm/fr3BXrd69eqYPXs2jKlDhw54+eWXjfoaRERkvhiAKE/9+/fHmTNnMrenTJmCoKCgB/a7fv06unXrVsKtIyIiKjquBk+5SktLg5ubm7oVxNfXt0TaRERkaxITExEeHq7385KSknDx4kXVo16Yz/GcAgIC4O7uDqumpQfExMRo5Vsj/+ojJSUlz1taWlqh901NTS1wX31lZGRoP/nkE22tWrW0zs7O2qpVq2o//PBD9diFCxfU+12xYoX24Ycf1rq4uGgXL16sbl5eXmof+Vr2yXqT+4R8vW7duszXunz5snbAgAHaMmXKaN3d3bUhISHavXv3qsciIiK0vXr10laoUEFbqlQpbbNmzbTbtm3L1tZq1appZ82alev72LJli2rfvXv3st0/btw4bceOHdXXUVFR6vX9/Py0bm5u2kaNGml//PHHbPu3b99eO378+MztnO9ByHvXvUcRGRmpffLJJ9X98t7kfcj3jojIWEJDQx/47C2JW2hoqNbaz9/sATKg6dOn5/lYnTp1MGjQoMztzz77TPWy5KZatWp4+umnM7fnzJmj/grIavLkyXq1beLEifj6668xa9YstG3bVg1b5fyr4q233sLnn3+Opk2bwtXVFVu2bMk2HHb8+HFs3rwZf/zxh7rPy8vrgdeJj49H+/btUblyZWzcuFH1DoWFhUGj0WQ+3r17d3z00UdwcXHB0qVL0bNnT5w+fRr+/v4Fvo9HHnlE1SWtWbMGzz77rLovIyMDK1euVMcUycnJCAkJwZtvvglPT09s2rQJQ4cORa1atdC8eXMUhfxfde3aFa1atcI///wDR0dHfPjhh3jsscdw9OhRODs7F+m4REQF9cSEhobq/bxTp05hyJAhWL58OerXr1+k17V2DEA2IC4uToWoefPmYfjw4eo+CQMShLKSouDHH38812NIF2rp0qXViT+/Ia8ff/wRt2/fxoEDB+Dj46Puq127dubjgYGB6qbzwQcfYN26dSosjR07tsD34uDggAEDBqjX0QWg7du3Izo6Gv369VPbEr5ee+21zOe89NJLKsytWrWqyAFIApaEuG+++UYVfYvFixerMLZjxw48+uijRTouEVF+ZBgqODi4yM+X8FOc51szBiADkl6WvNjbZ683z3qCzkl3gtUZP358sdolfwmkpKSo3pP8NGvWDMV1+PBh1YOkCz85SQ+QFFNLr4z0QqWnp6ux6sjIyEK/xuDBg9GyZUtcu3YNfn5++OGHH9CjR4/MK9akR2jatGkq8Fy9ehWpqanq/RdnPPvIkSOIiIiAh4dHtvult+ncuXNFPi4REZkGA5AB6TMMYqx9c1PYArhSpUoV63UK81oS/LZt26aGAKVnSPZ/4oknVEgprIceekj1YK1YsQJjxoxRPUhyyb7OjBkzVI+XXErfuHFj9b6kdyu/15DQeb8U6D9ZhygluMmwmoStnMqXL1/othMRkXlgALIBUn8kQUOGikaOHFnk40gQk96V/DRp0kQNE929ezfXXqDdu3er+qa+fftmBgu5UkFf0gskYaRKlSqqd016gLK+Ru/evdX4t5ChK7mcv0GDBnkeT0KM9EjpnD17NlvdlXQhyzBYhQoVVF0RERFZNs4DZAOkoFkKgt944w1VdCxDNnv37sW3336r13HkcsoLFy6oYa6oqCg1rJTTwIEDVY1Qnz59VBA5f/68Klj+999/M8PY2rVr1TFkWEkKw3UF0voGICmulsJn6UGS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", "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": "31d99605", "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\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 }