From 5f929f4b3990863a124f07f7bdf89708140adfe9 Mon Sep 17 00:00:00 2001 From: Henrik Finsberg Date: Tue, 26 May 2026 13:48:26 +0200 Subject: [PATCH 01/11] Update readme --- README.md | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 119 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ff6958a..d49b7c6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,120 @@ -# dxa -_________________ +# DOLFINx-Adjoint -[![MIT](https://img.shields.io/github/license/jorgensd/dxa)](LICENSE) -[Read Latest Documentation](https://jorgensd.github.io/dxa/) -_________________ +**DOLFINx-Adjoint** is an algorithmic differentiation (AD) framework for [DOLFINx](https://github.com/FEniCS/dolfinx). It allows you to automatically compute the gradients and Hessians of PDE-constrained optimization problems and track your computational graphs through the `pyadjoint` backend. + +Read the [Latest Documentation here](https://scientificcomputing.github.io/dolfinx-adjoint). + +> **Note for Legacy FEnICS Users:** If you are using the legacy FEnICS (`dolfin`) library, please refer to the original [dolfin-adjoint repository](https://github.com/dolfin-adjoint/dolfin-adjoint). This repository (DOLFINx-Adjoint) is built specifically for the modern DOLFINx environment and is currently under active development. It is intended to eventually support the same comprehensive feature set and capabilities as the legacy version. + +## Features + +* **Automated Adjoints:** Seamlessly derive discrete adjoint models from DOLFINx forward models. + +* **Overloaded API:** Swap out standard `dolfinx` calls with their `dolfinx_adjoint` equivalents (e.g., `Function`, `Constant`, `LinearProblem`, `NonlinearProblem`, `assemble_scalar`) to automatically record the computational tape. + +* **Optimization:** Seamless integration with PDE-constrained optimization frameworks like [Moola](https://github.com/funsim/moola) or SciPy via `pyadjoint.ReducedFunctional`. + +## Installation + +### Dependencies + +DOLFINx-Adjoint requires **DOLFINx** (>=0.10.0) and **pyadjoint-ad**. + +### via pip + +The main way to install the package is via pip: + +```bash +python3 -m pip install dolfinx-adjoint +``` + +### Development Install + +To install the latest development version directly from the repository, use: + +```bash +python3 -m pip install git+[https://github.com/scientificcomputing/dolfinx-adjoint.git](https://github.com/scientificcomputing/dolfinx-adjoint.git) +``` + +If you plan to actively modify the code, clone the repository and install the optional dependencies for testing, development, and documentation generation: + +```bash +git clone [https://github.com/scientificcomputing/dolfinx-adjoint.git](https://github.com/scientificcomputing/dolfinx-adjoint.git) +cd dolfinx-adjoint +python3 -m pip install -e ".[all]" +``` + +### Docker + +A pre-built Docker image is automatically published by the CI. You can pull the nightly build which comes with DOLFINx and DOLFINx-Adjoint pre-installed: + +```bash +docker run -ti ghcr.io/scientificcomputing/dolfinx-adjoint:v0.1.0 +``` + +*(Note: Adjust the tag to the latest release or build).* + +## Quick Start + +Using `dolfinx_adjoint` is designed to be as close to standard `dolfinx` syntax as possible. Here is a brief overview of how to track a parameter and assemble an objective functional: + + +```python +import dolfinx +from mpi4py import MPI +import pyadjoint +import dolfinx_adjoint + +# Create mesh and function space +mesh = dolfinx.mesh.create_unit_square(MPI.COMM_WORLD, 10, 10) +V = dolfinx.fem.functionspace(mesh, ("Lagrange", 1)) + +# Use dolfinx_adjoint overloaded types +# This ensures operations are tracked on the pyadjoint tape! +f = dolfinx_adjoint.Function(V, name="Control") +uh = dolfinx_adjoint.Function(V, name="State") + +# ... Define your UFL forms ... + +# Use overloaded solvers +problem = dolfinx_adjoint.LinearProblem(a, L, u=uh, bcs=[bc]) +problem.solve() + +# Assemble the objective scalar using the overloaded assembly +J_symbolic = 0.5 * ufl.inner(uh - d, uh - d) * ufl.dx +J = dolfinx_adjoint.assemble_scalar(J_symbolic) + +# Create a ReducedFunctional for optimization +control = pyadjoint.Control(f) +Jhat = pyadjoint.ReducedFunctional(J, control) + +# Evaluate gradient +gradient = Jhat.derivative() +``` + + +For more comprehensive examples, such as solving the optimal control of the Poisson equation or time-distributed control problems, check out the `demos/` directory or the [online documentation](https://scientificcomputing.github.io/dolfinx-adjoint). + +## Development and Testing + +Code formatting is enforced via `ruff` and type-checking via `mypy`. To set up your local development environment: + +```bash +# Install development dependencies +python3 -m pip install -e ".[dev,test]" + +# Run formatting checks +ruff check . +ruff format --check . + +# Run type checking +python3 -m mypy . + +# Run tests +python3 -m pytest -vs tests/ +``` + +## License + +MIT License. See [LICENSE](LICENSE) for more details. + From 42e09b9e49d28ce54d0810e2cc0700078f2ad9e5 Mon Sep 17 00:00:00 2001 From: Henrik Finsberg Date: Tue, 26 May 2026 13:48:48 +0200 Subject: [PATCH 02/11] Add bump-my-version config to pyproject.toml --- pyproject.toml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 975f832..e7dd743 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,3 +80,20 @@ section-order = [ [tool.ruff.lint.isort.sections] "mpi" = ["mpi4py", "petsc4py"] + + +[tool.bumpversion] +allow_dirty = false +commit = true +message = "Bump version: {current_version} → {new_version}" +tag = true +sign_tags = false +tag_name = "v{new_version}" +tag_message = "Bump version: {current_version} → {new_version}" +current_version = "0.2.0" + + +[[tool.bumpversion.files]] +filename = "pyproject.toml" +search = 'version = "{current_version}"' +replace = 'version = "{new_version}"' From 405ef2f3f9e7d6de304de1c7b0d419bc976edf37 Mon Sep 17 00:00:00 2001 From: Henrik Finsberg Date: Tue, 26 May 2026 13:49:48 +0200 Subject: [PATCH 03/11] Add pre-commit hooks and format .yml accordingly --- .dockerignore | 2 +- .github/workflows/build_docs.yml | 8 +++---- .github/workflows/check_formatting.yml | 2 +- .github/workflows/deploy.yml | 4 ++-- .github/workflows/test_package.yml | 6 ++--- .gitignore | 2 +- .pre-commit-config.yaml | 31 ++++++++++++++++++++++++++ CITATION.cff | 4 ++-- _toc.yml | 2 +- docs/api.rst | 1 - docs/api_blocks.rst | 2 +- pyproject.toml | 2 +- 12 files changed, 48 insertions(+), 18 deletions(-) create mode 100644 .pre-commit-config.yaml diff --git a/.dockerignore b/.dockerignore index 821c19d..26f5c15 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1 @@ -.github \ No newline at end of file +.github diff --git a/.github/workflows/build_docs.yml b/.github/workflows/build_docs.yml index 47c22b6..fcfb35e 100644 --- a/.github/workflows/build_docs.yml +++ b/.github/workflows/build_docs.yml @@ -26,17 +26,17 @@ jobs: - name: Install graphviz run: apt update && apt install -y graphviz-dev - + - name: Install mesa-utils - run: apt-get update && apt-get install -y mesa-utils - + run: apt-get update && apt-get install -y mesa-utils + - name: Install dependencies run: python3 -m pip install ".[docs]" - name: Build docs run: jupyter book build -W . - - name: Upload artifact + - name: Upload artifact uses: actions/upload-artifact@v7 # always upload artifact, which can include error messages if: always() diff --git a/.github/workflows/check_formatting.yml b/.github/workflows/check_formatting.yml index ce9fc6d..29ac985 100644 --- a/.github/workflows/check_formatting.yml +++ b/.github/workflows/check_formatting.yml @@ -32,6 +32,6 @@ jobs: run: | ruff check . ruff format --check . - + - name: Mypy check run: python3 -m mypy . diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a31de8e..fa60b02 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -15,7 +15,7 @@ concurrency: group: "pages" cancel-in-progress: true -jobs: +jobs: check-formatting: uses: ./.github/workflows/check_formatting.yml @@ -48,7 +48,7 @@ jobs: # with: # name: code-coverage-report # path: "./public/code-coverage-report" - + - name: Upload artifact uses: actions/upload-pages-artifact@v5 with: diff --git a/.github/workflows/test_package.yml b/.github/workflows/test_package.yml index bcec261..b1217e3 100644 --- a/.github/workflows/test_package.yml +++ b/.github/workflows/test_package.yml @@ -4,11 +4,11 @@ on: push: branches: - main - + pull_request: branches: - main - + workflow_dispatch: workflow_call: @@ -28,4 +28,4 @@ jobs: - name: Run tests parallel - run: mpirun -n 2 python3 -m pytest -vs tests/ \ No newline at end of file + run: mpirun -n 2 python3 -m pytest -vs tests/ diff --git a/.gitignore b/.gitignore index 637c030..0e95bcd 100644 --- a/.gitignore +++ b/.gitignore @@ -131,4 +131,4 @@ dmypy.json _build/ *.dot -*.bp \ No newline at end of file +*.bp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..39c107b --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,31 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + args: ['--maxkb=3000'] + - id: check-docstring-first + - id: debug-statements + - id: check-toml + + - repo: https://github.com/astral-sh/ruff-pre-commit + # Ruff version. + rev: 'v0.15.14' + hooks: + # Run the linter. + - id: ruff + args: [ --fix ] + # Run the formatter. + - id: ruff-format + + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v2.1.0 + hooks: + - id: mypy + files: ^src/|^tests/ + args: ["--config-file", "pyproject.toml"] diff --git a/CITATION.cff b/CITATION.cff index 0657a5d..003d6f5 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -10,7 +10,7 @@ authors: email: dokken@simula.no affiliation: Simula Research Laboratory orcid: 'https://orcid.org/0000-0001-6489-8858' -repository-code: 'https://github.com/jorgensd/dxa' +repository-code: 'https://github.com/scientificcomputing/dolfinx-adjoint' url: 'https://jsdokken.com/dxa' abstract: >- Adjoint framework for DOLFINx @@ -21,4 +21,4 @@ keywords: - Optimization license: MIT version: v0.1.0 -date-released: '2023-04-04' \ No newline at end of file +date-released: '2023-04-04' diff --git a/_toc.yml b/_toc.yml index 2d3c948..e166b09 100644 --- a/_toc.yml +++ b/_toc.yml @@ -9,4 +9,4 @@ parts: - caption: Python API chapters: - file: "docs/api" - - file: "docs/api_blocks" \ No newline at end of file + - file: "docs/api_blocks" diff --git a/docs/api.rst b/docs/api.rst index 27f2f1e..e4802b6 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -5,4 +5,3 @@ The following is the API of the functions and classes provided by the `dolfinx_a .. automodule:: dolfinx_adjoint :members: - \ No newline at end of file diff --git a/docs/api_blocks.rst b/docs/api_blocks.rst index aa008c5..a71cb8b 100644 --- a/docs/api_blocks.rst +++ b/docs/api_blocks.rst @@ -4,4 +4,4 @@ DOLFINx-adjoint Blocks API The following is the API of the blocks implemented in the DOLFINx-adjoint package, which is used within the `pyadjoint` framework. .. automodule:: dolfinx_adjoint.blocks - :members: \ No newline at end of file + :members: diff --git a/pyproject.toml b/pyproject.toml index e7dd743..21015ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ docs = [ "moola@git+https://github.com/funsim/moola.git", "pandas", "pyvista[all]>0.45", - "networkx", + "networkx", "pygraphviz" ] all = ["dolfinx_adjoint[test]", "dolfinx_adjoint[dev]", "dolfinx_adjoint[docs]"] From 7481440d2f19fd87d5e55925549082d7084a4886 Mon Sep 17 00:00:00 2001 From: Henrik Finsberg Date: Tue, 26 May 2026 13:52:39 +0200 Subject: [PATCH 04/11] Use reamde as landing page for docs and move .bib file to docs folder --- _config.yml | 2 +- _toc.yml | 2 +- bibliography.bib => docs/bibliography.bib | 0 index.md | 7 ------- 4 files changed, 2 insertions(+), 9 deletions(-) rename bibliography.bib => docs/bibliography.bib (100%) delete mode 100644 index.md diff --git a/_config.yml b/_config.yml index 6f5c3f3..c1998ed 100644 --- a/_config.yml +++ b/_config.yml @@ -24,7 +24,7 @@ html: bibtex_bibfiles: - - bibliography.bib + - docs/bibliography.bib parse: diff --git a/_toc.yml b/_toc.yml index e166b09..b6a5621 100644 --- a/_toc.yml +++ b/_toc.yml @@ -1,5 +1,5 @@ format: jb-book -root: index +root: README parts: - caption: Examples diff --git a/bibliography.bib b/docs/bibliography.bib similarity index 100% rename from bibliography.bib rename to docs/bibliography.bib diff --git a/index.md b/index.md deleted file mode 100644 index ba57af3..0000000 --- a/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# dxa - -Welcome to the webpage of dxa - -## Contents -```{tableofcontents} -``` From 85e066fb12b163d3f619d6df00c7dffcb744d77b Mon Sep 17 00:00:00 2001 From: Henrik Finsberg Date: Tue, 26 May 2026 13:56:21 +0200 Subject: [PATCH 05/11] Fix version of docker images and add these to version bumper --- Dockerfile | 2 +- README.md | 2 +- docker/Dockerfile | 4 ++-- pyproject.toml | 11 +++++++++++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4babb99..de21530 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Use github pages for docker image -FROM ghcr.io/jorgensd/dxa:v0.1.0 +FROM ghcr.io/scientificcomputing/dolfinx-adjoint:v0.2.0 # Create user with a home directory ARG NB_USER diff --git a/README.md b/README.md index d49b7c6..f0ea7ad 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ python3 -m pip install -e ".[all]" A pre-built Docker image is automatically published by the CI. You can pull the nightly build which comes with DOLFINx and DOLFINx-Adjoint pre-installed: ```bash -docker run -ti ghcr.io/scientificcomputing/dolfinx-adjoint:v0.1.0 +docker run -ti ghcr.io/scientificcomputing/dolfinx-adjoint:v0.2.0 ``` *(Note: Adjust the tag to the latest release or build).* diff --git a/docker/Dockerfile b/docker/Dockerfile index 3384f6a..75443cc 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -4,8 +4,8 @@ ENV DEB_PYTHON_INSTALL_LAYOUT=deb_system WORKDIR /tmp/ -COPY . ./dxa -RUN python3 -m pip install ./dxa[all] +COPY . ./dolfinx-adjoint +RUN python3 -m pip install ./dolfinx-adjoint[all] RUN rm -rf /tmp diff --git a/pyproject.toml b/pyproject.toml index 21015ba..d691a63 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -97,3 +97,14 @@ current_version = "0.2.0" filename = "pyproject.toml" search = 'version = "{current_version}"' replace = 'version = "{new_version}"' + + +[[tool.bumpversion.files]] +filename = "README.md" +search = "ghcr.io/scientificcomputing/dolfinx-adjoint:v{current_version}" +replace = "ghcr.io/scientificcomputing/dolfinx-adjoint:v{new_version}" + +[[tool.bumpversion.files]] +filename = "Dockerfile" +search = "ghcr.io/scientificcomputing/dolfinx-adjoint:v{current_version}" +replace = "ghcr.io/scientificcomputing/dolfinx-adjoint:v{new_version}" From eb6170ae794a993e24e3ee1b0f052a6c36b96447 Mon Sep 17 00:00:00 2001 From: Henrik Finsberg Date: Tue, 26 May 2026 15:15:29 +0200 Subject: [PATCH 06/11] Fix deprecated license key in pyproject.toml --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d691a63..53d0234 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,8 @@ name = "dolfinx_adjoint" version = "0.2.0" description = "Automatic differentation compatible with DOLFINx" authors = [{ name = "Jørgen S. Dokken", email = "dokken@simula.no" }] -license = { file = "LICENSE" } +license = "MIT" +license-files = ["LICENSE"] readme = "README.md" dependencies = [ "fenics-dolfinx>=0.10.0", From b755b6dccbc596d0ceeba26462229d646b1a92fd Mon Sep 17 00:00:00 2001 From: Henrik Finsberg Date: Tue, 26 May 2026 15:19:38 +0200 Subject: [PATCH 07/11] Remove moola from pyproject.toml - we cannot get it on pypi if it has to be installed from github --- .github/workflows/build_docs.yml | 4 +++- pyproject.toml | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_docs.yml b/.github/workflows/build_docs.yml index fcfb35e..8969a94 100644 --- a/.github/workflows/build_docs.yml +++ b/.github/workflows/build_docs.yml @@ -31,7 +31,9 @@ jobs: run: apt-get update && apt-get install -y mesa-utils - name: Install dependencies - run: python3 -m pip install ".[docs]" + run: | + python3 -m pip install git+https://github.com/funsim/moola.git + python3 -m pip install ".[docs]" - name: Build docs run: jupyter book build -W . diff --git a/pyproject.toml b/pyproject.toml index 53d0234..588b458 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ requires = ["setuptools>=61.0.0", "wheel"] [project] -name = "dolfinx_adjoint" +name = "dolfinx-adjoint" version = "0.2.0" description = "Automatic differentation compatible with DOLFINx" authors = [{ name = "Jørgen S. Dokken", email = "dokken@simula.no" }] @@ -22,7 +22,7 @@ dev = ["pdbpp", "ipython", "mypy", "ruff"] docs = [ "jupyter-book<2.0", "jupytext", - "moola@git+https://github.com/funsim/moola.git", + # "moola@git+https://github.com/funsim/moola.git", "pandas", "pyvista[all]>0.45", "networkx", From 581435ecda70941465a0b2d9f22fa37fdfdf389c Mon Sep 17 00:00:00 2001 From: Henrik Finsberg Date: Tue, 26 May 2026 15:23:59 +0200 Subject: [PATCH 08/11] Add pypi workflow --- .github/workflows/pypi.yml | 44 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/workflows/pypi.yml diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml new file mode 100644 index 0000000..7bda2cf --- /dev/null +++ b/.github/workflows/pypi.yml @@ -0,0 +1,44 @@ +name: Release + +on: [push, pull_request] + +jobs: + dist: + runs-on: ubuntu-latest + container: ghcr.io/fenics/dolfinx/dolfinx:nightly + env: + DEB_PYTHON_INSTALL_LAYOUT: deb_system + + steps: + - uses: actions/checkout@v6 + + - name: Install build dependencies + run: | + python3 -m pip install --upgrade build twine + python3 -m pip install -r build-requirements.txt + + - name: Build SDist and wheel + run: python3 -m build --no-isolation --sdist + + - uses: actions/upload-artifact@v7 + with: + path: dist/* + + - name: Check metadata + run: python3 -m twine check dist/* + + publish: + needs: [dist] + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags') + environment: pypi + permissions: + id-token: write + + steps: + - uses: actions/download-artifact@v8 + with: + name: artifact + path: dist + + - uses: pypa/gh-action-pypi-publish@release/v1 From d61c0cba3cca09e04cd6d9050be6bba42f928f45 Mon Sep 17 00:00:00 2001 From: Henrik Finsberg Date: Tue, 26 May 2026 15:26:48 +0200 Subject: [PATCH 09/11] Fix url in citation.cff --- CITATION.cff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index 003d6f5..45d8082 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -11,7 +11,7 @@ authors: affiliation: Simula Research Laboratory orcid: 'https://orcid.org/0000-0001-6489-8858' repository-code: 'https://github.com/scientificcomputing/dolfinx-adjoint' -url: 'https://jsdokken.com/dxa' +url: 'https://github.com/scientificcomputing/dolfinx-adjoint' abstract: >- Adjoint framework for DOLFINx keywords: From b2d4fddcb69b5a189a87fa6ca919652f59eadaa7 Mon Sep 17 00:00:00 2001 From: Henrik Finsberg Date: Tue, 26 May 2026 15:43:14 +0200 Subject: [PATCH 10/11] Remove build-requirements in pypi workflow --- .github/workflows/pypi.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 7bda2cf..2a7f848 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -1,31 +1,31 @@ -name: Release +name: PyPI + +on: + push: + branches: + - "main" + tags: + - "v*" + pull_request: + branches: + - "main" -on: [push, pull_request] jobs: dist: runs-on: ubuntu-latest - container: ghcr.io/fenics/dolfinx/dolfinx:nightly - env: - DEB_PYTHON_INSTALL_LAYOUT: deb_system - steps: - uses: actions/checkout@v6 - - name: Install build dependencies - run: | - python3 -m pip install --upgrade build twine - python3 -m pip install -r build-requirements.txt - - name: Build SDist and wheel - run: python3 -m build --no-isolation --sdist + run: pipx run build - uses: actions/upload-artifact@v7 with: path: dist/* - name: Check metadata - run: python3 -m twine check dist/* + run: pipx run twine check dist/* publish: needs: [dist] From 9d60e00e164fc9eb5fdd90baaa6c8aa674752c1b Mon Sep 17 00:00:00 2001 From: Henrik Finsberg Date: Tue, 26 May 2026 22:20:49 +0200 Subject: [PATCH 11/11] Remove README for exclude patterns --- _config.yml | 2 +- _toc.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index c1998ed..e198ed7 100644 --- a/_config.yml +++ b/_config.yml @@ -46,4 +46,4 @@ sphinx: - 'sphinx.ext.autodoc' - 'sphinx.ext.napoleon' - 'sphinx.ext.viewcode' -exclude_patterns: ["README.md",".pytest_cache/*"] +exclude_patterns: [".pytest_cache/*"] diff --git a/_toc.yml b/_toc.yml index b6a5621..1b26ed8 100644 --- a/_toc.yml +++ b/_toc.yml @@ -1,5 +1,5 @@ format: jb-book -root: README +root: README.md parts: - caption: Examples