Skip to content

Documentation Workflow

Overview

The documentation site is built with MkDocs and uses stored notebook outputs. Notebooks are kept as lightweight .py source files (Jupytext percent format) and must be converted to executed .ipynb files before the site can display outputs. mkdocs build / mkdocs serve never re-executes code — it only renders what is already stored inside the .ipynb files.


Prerequisites by notebook group

Group Notebooks Extra requirements
Tutorials 1–8 tutorials/1_getting_started8_migration_guide DeepMIMO scenario files in deepmimo_scenarios/ — download any scenario with dm.load() or via the database API
Sionna apps 2–4 applications/2_sionna_rt_downstream4_osm_pipeline uv sync --extra sionna (installs PyTorch, Sionna RT, Mitsuba)
App 1 — Channel Prediction applications/1_channel_prediction External ML dataset — maintained on Colab; rendered as a code stub locally

OSM Pipeline (App 4)

The OSM pipeline notebook queries the public Overpass API to fetch OpenStreetMap building data. The API can be slow or temporarily unavailable. If execution fails with a 504 timeout, convert it as a stub (--no-execute) and run it manually when the API is responsive.


Step-by-step workflow

Step 1 — Pre-render notebooks

# Tutorials only (requires downloaded scenario data)
uv run python scripts/pre_render_notebooks.py --tutorials

# Sionna application notebooks (requires deepmimo[sionna])
uv run python scripts/pre_render_notebooks.py --sionna

# Both at once
uv run python scripts/pre_render_notebooks.py

# Code-only stubs — no outputs, no extra deps required
uv run python scripts/pre_render_notebooks.py --no-execute

# Single notebook
uv run python scripts/pre_render_notebooks.py docs/tutorials/3_channel_generation.py

Step 2 — Serve or build

# Live-reloading dev server at http://127.0.0.1:8000
uv run mkdocs serve

# One-shot static build into site/
uv run mkdocs build

That's it. No Makefile, no separate build step.


Timing reference

Measured on an NVIDIA workstation (CPU execution, single machine). GPU-accelerated environments will be faster for Sionna notebooks.

Stub conversion — --no-execute (all 11 notebooks)

Converts every .py source to a bare .ipynb with code cells but no outputs. No execution or extra dependencies required.

Step Time
All 11 notebooks → stubs ~13 s

Tutorial execution — --tutorials (8 notebooks, needs scenario data)

Notebook Approximate time
1 — Getting Started ~30 s
2 — Visualization ~45 s
3 — Channel Generation ~60 s
4 — Dataset Manipulation ~45 s
5 — Doppler & Mobility ~55 s
6 — Beamforming ~65 s
7 — Converters ~55 s
8 — Migration Guide ~30 s
Total (all 8) ~7 min

Sionna app execution — --sionna (apps 2 & 3, GPU optional)

Notebook Approximate time
2 — Sionna RT → DeepMIMO ~25 s
3 — DeepMIMO → Sionna ~28 s
4 — OSM Pipeline network-dependent (Overpass API)
Total (apps 2–3) ~55 s

Docs build

Step Time
mkdocs build (all pages, stored outputs) ~17 s
mkdocs serve first load ~17 s, then incremental

Notebook source files

File Purpose
docs/tutorials/*.py Source of truth — edit this file
docs/tutorials/*.ipynb Rendered output — gitignored; regenerate with pre-render script
docs/applications/*.py Source of truth
docs/applications/*.ipynb Rendered output — gitignored

.ipynb files are gitignored

The generated .ipynb files are excluded from version control (docs/**/*.ipynb in .gitignore). Every contributor who wants to build docs with outputs must run the pre-render script locally.


Which notebooks skip execution?

Two notebooks are intentionally excluded from the pre-render script:

Notebook Reason
tutorials/manual.py Too large; maintained separately on Colab
applications/1_channel_prediction.py Requires an external ML dataset download; rendered as a code stub

To build with all outputs visible, run --tutorials and --sionna, then create a stub for the channel-prediction notebook:

uv run jupytext --to notebook \
    docs/applications/1_channel_prediction.py \
    -o docs/applications/1_channel_prediction.ipynb \
    --quiet