Repository: computationalgeography/lue (language: python)

Issue:
Refactor and document `qa` target and `lue.qa` subpackage



Discussion / hints:

Fix patch:
diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml
index d4c57bb41..9953e3fae 100644
--- a/.github/workflows/conda.yml
+++ b/.github/workflows/conda.yml
@@ -5,6 +5,7 @@ on:
   push:
     branches:
       - "master"
+  workflow_dispatch:
 
 jobs:
     build:
diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
index 3302d17dc..9025fb69d 100644
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -5,6 +5,7 @@ on:
   push:
     branches:
       - "master"
+  workflow_dispatch:
 
 jobs:
     build:
@@ -137,11 +138,11 @@ jobs:
                       -D CMAKE_POLICY_DEFAULT_CMP0167=NEW \
                       -D CMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} \
                       -D LUE_BUILD_DOCUMENTATION=TRUE \
-                      -D LUE_BUILD_QA=TRUE \
-                      -D LUE_QA_WITH_PYTHON_API=TRUE \
-                      -D LUE_QA_WITH_TESTS=TRUE \
-                      -D LUE_QA_TEST_NR_LOCALITIES_PER_TEST=1 \
-                      -D LUE_QA_TEST_NR_THREADS_PER_LOCALITY=2 \
+                      -D LUE_BUILD_QUALITY_ASSURANCE=TRUE \
+                      -D LUE_QUALITY_ASSURANCE_WITH_PYTHON_API=TRUE \
+                      -D LUE_QUALITY_ASSURANCE_WITH_TESTS=TRUE \
+                      -D LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST=1 \
+                      -D LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY=2 \
                       -D LUE_DATA_MODEL_WITH_PYTHON_API=TRUE \
                       -D LUE_DATA_MODEL_WITH_UTILITIES=TRUE \
                       -D LUE_FRAMEWORK_WITH_IMAGE_LAND=TRUE \
@@ -172,10 +173,7 @@ jobs:
               ctest \
                   --test-dir ${{ env.lue_build_directory }} \
                   --output-on-failure \
-                  --exclude-regex algorithm_decreasing_order_test \
-                  --exclude-regex algorithm_image_land_integrate_test \
-                  --exclude-regex algorithm_image_land_integrate_and_allocate_test \
-                  --exclude-regex lue_py_image_land_python_test
+                  --exclude-regex "(algorithm_decreasing_order_test|algorithm_image_land_integrate_test|algorithm_image_land_integrate_and_allocate_test|lue_py_image_land_python_test)"
 
               # Test of runtime targets
               ${{ env.lue_runtime_install_directory }}/bin/lue_translate --version
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index 807907b5f..bab1ec777 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -5,6 +5,7 @@ on:
   push:
     branches:
       - "master"
+  workflow_dispatch:
 
 jobs:
     build:
@@ -134,11 +135,11 @@ jobs:
                       --preset conan-release \
                       -D CMAKE_OSX_DEPLOYMENT_TARGET=${{ matrix.macos_version }}.0 \
                       -D CMAKE_POLICY_DEFAULT_CMP0167=NEW \
-                      -D LUE_BUILD_QA=TRUE \
-                      -D LUE_QA_WITH_PYTHON_API=TRUE \
-                      -D LUE_QA_WITH_TESTS=TRUE \
-                      -D LUE_QA_TEST_NR_LOCALITIES_PER_TEST=1 \
-                      -D LUE_QA_TEST_NR_THREADS_PER_LOCALITY=2 \
+                      -D LUE_BUILD_QUALITY_ASSURANCE=TRUE \
+                      -D LUE_QUALITY_ASSURANCE_WITH_PYTHON_API=TRUE \
+                      -D LUE_QUALITY_ASSURANCE_WITH_TESTS=TRUE \
+                      -D LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST=1 \
+                      -D LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY=2 \
                       -D LUE_DATA_MODEL_WITH_PYTHON_API=TRUE \
                       -D LUE_DATA_MODEL_WITH_UTILITIES=TRUE \
                       -D LUE_FRAMEWORK_WITH_IMAGE_LAND=TRUE \
@@ -172,10 +173,7 @@ jobs:
               ctest \
                   --test-dir ${{ env.lue_build_directory }} \
                   --output-on-failure \
-                  --exclude-regex algorithm_decreasing_order_test \
-                  --exclude-regex algorithm_image_land_integrate_test \
-                  --exclude-regex algorithm_image_land_integrate_and_allocate_test \
-                  --exclude-regex lue_py_image_land_python_test
+                  --exclude-regex "(algorithm_decreasing_order_test|algorithm_image_land_integrate_test|algorithm_image_land_integrate_and_allocate_test|lue_py_image_land_python_test)"
 
               # Test of runtime targets
               ${{ env.lue_runtime_install_directory }}/bin/lue_translate --version
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index 3fbf49279..35bc857f3 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -5,6 +5,7 @@ on:
   push:
     branches:
       - "master"
+  workflow_dispatch:
 
 jobs:
     build:
@@ -151,11 +152,11 @@ jobs:
                       -B ${{ env.lue_build_directory }} \
                       --preset conan-release \
                       -D CMAKE_POLICY_DEFAULT_CMP0167=NEW \
-                      -D LUE_BUILD_QA=TRUE \
-                      -D LUE_QA_WITH_PYTHON_API=TRUE \
-                      -D LUE_QA_WITH_TESTS=TRUE \
-                      -D LUE_QA_TEST_NR_LOCALITIES_PER_TEST=1 \
-                      -D LUE_QA_TEST_NR_THREADS_PER_LOCALITY=2 \
+                      -D LUE_BUILD_QUALITY_ASSURANCE=TRUE \
+                      -D LUE_QUALITY_ASSURANCE_WITH_PYTHON_API=TRUE \
+                      -D LUE_QUALITY_ASSURANCE_WITH_TESTS=TRUE \
+                      -D LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST=1 \
+                      -D LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY=2 \
                       -D LUE_DATA_MODEL_WITH_PYTHON_API=TRUE \
                       -D LUE_DATA_MODEL_WITH_UTILITIES=TRUE \
                       -D LUE_FRAMEWORK_WITH_IMAGE_LAND=TRUE \
@@ -188,10 +189,7 @@ jobs:
               ctest \
                   --test-dir ${{ env.lue_build_directory }} \
                   --output-on-failure \
-                  --exclude-regex algorithm_decreasing_order_test \
-                  --exclude-regex algorithm_image_land_integrate_test \
-                  --exclude-regex algorithm_image_land_integrate_and_allocate_test \
-                  --exclude-regex lue_py_image_land_python_test
+                  --exclude-regex "(algorithm_decreasing_order_test|algorithm_image_land_integrate_test|algorithm_image_land_integrate_and_allocate_test|lue_py_image_land_python_test)"
 
               # Tests of runtime targets
               # Add location of dependencies installed with Conan to the runtime environment
diff --git a/.mdl_style.rb b/.mdl_style.rb
index 6ca9b3ba1..e95f912a4 100644
--- a/.mdl_style.rb
+++ b/.mdl_style.rb
@@ -3,9 +3,11 @@
 # https://github.com/markdownlint/markdownlint/blob/main/docs/configuration.md
 # https://github.com/markdownlint/markdownlint/blob/main/docs/RULES.md
 all
+exclude_rule 'MD003'
 exclude_rule 'MD004'
 exclude_rule 'MD005'
 exclude_rule 'MD012'
+exclude_rule 'MD022'
 exclude_rule 'MD024'
 exclude_rule 'MD030'
 exclude_rule 'MD034'
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 03ba518a7..dee1bad2d 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -5,7 +5,6 @@ exclude: |
     environment/cmake/.*\.patch|
     environment/cmake/UseLATEX\.cmake|
     environment/cmake/conan-.*\.cmake|
-    # environment/conda/meta\.yaml|
     source/view/imgui/include/lue/imgui/font/.*
   )$
 repos:
@@ -32,8 +31,6 @@ repos:
         document/luepy/ext/.*|
         source/framework/case_study/.*|
         source/framework/python/test/.*|
-        source/qa/python/qa/.*|
-        source/qa/script/.*|
       )$
 - repo: https://github.com/pycqa/isort
   rev: 5.13.2
@@ -78,7 +75,5 @@ repos:
         source/data_model/utility/.*|
         source/data_model/validate/.*|
         source/framework/.*|
-        source/python/.*|
-        source/qa/.*|
         source/view/.*|
       )$
diff --git a/document/doc/CMakeLists.txt b/document/doc/CMakeLists.txt
index 241f0301e..a817d6d28 100644
--- a/document/doc/CMakeLists.txt
+++ b/document/doc/CMakeLists.txt
@@ -45,12 +45,20 @@ foreach(name IN ITEMS
     manual/framework/execute.md
     manual/framework/index.md
     manual/framework/python/index.md
-    manual/framework/scalability.md
     manual/glossary.md
     manual/index.md
     manual/install/conda.md
     manual/install/index.md
     manual/install/source.md
+    manual/quality_assurance/index.md
+    manual/quality_assurance/scalability/experiment.md
+    manual/quality_assurance/scalability/game_of_life.py
+    manual/quality_assurance/scalability/index.md
+    manual/quality_assurance/scalability/partition_shape.svg
+    manual/quality_assurance/scalability/quick_start.md
+    manual/quality_assurance/scalability/scalability.sh
+    manual/quality_assurance/scalability/strong_scalability.svg
+    manual/quality_assurance/scalability/weak_scalability.svg
     manual/view/index.md
     pcraster/index.md
     pcraster/port.md
@@ -124,6 +132,10 @@ foreach(name IN ITEMS
     framework/partitioned_route/doc/index.md
 
     framework/doc/index.md
+
+    quality_assurance/doc/index.md
+    quality_assurance/cxx/doc/index.md
+    quality_assurance/python/doc/index.md
 )
     configure_file(${PROJECT_SOURCE_DIR}/source/${name} source/${name} COPYONLY)
 endforeach()
diff --git a/document/doc/_config.yml.in b/document/doc/_config.yml.in
index 56643cf59..dabfb6c49 100644
--- a/document/doc/_config.yml.in
+++ b/document/doc/_config.yml.in
@@ -2,7 +2,7 @@
 # Learn more at https://jupyterbook.org/customize/config.html
 
 title: @LUE_TITLE@
-copyright: 2016 -- This work is licensed under Creative Commons Attribution 4.0 International (CC-BY-4.0)
+copyright: 2016-now -- This work is licensed under Creative Commons Attribution 4.0 International (CC-BY-4.0)
 author: @LUE_AUTHOR@
 # TODO logo: logo.png
 
@@ -88,8 +88,13 @@ sphinx:
     - "sphinxcontrib.mermaid"
     - "sphinxcontrib.bibtex"
 
-# parse:
-#   myst_enable_extensions:
-#     - aside
-#     - deflist
-#     - colon_fence
+parse:
+  # https://jupyterbook.org/en/stable/content/content-blocks.html#myst-syntax-extensions
+  # https://myst-parser.readthedocs.io/en/latest/syntax/optional.html
+  myst_enable_extensions:
+    - "attrs_inline"
+    - "dollarmath"
+    - "linkify"
+    # - aside
+    # - deflist
+    # - colon_fence  # Don't use this. Syntax is already confusing enough.
diff --git a/document/doc/_toc.yml b/document/doc/_toc.yml
index 31b07ef24..59ef65aab 100644
--- a/document/doc/_toc.yml
+++ b/document/doc/_toc.yml
@@ -26,8 +26,12 @@ parts:
         - file: manual/framework/python/index.md
         - file: manual/framework/cpp/index.md
         - file: manual/framework/execute.md
-        - file: manual/framework/scalability.md
       - file: manual/view/index.md
+      - file: manual/quality_assurance/index.md
+        sections:
+        - file: manual/quality_assurance/scalability/index.md
+        - file: manual/quality_assurance/scalability/quick_start.md
+        - file: manual/quality_assurance/scalability/experiment.md
       - file: manual/glossary.md
 
     - file: reference/index.md
@@ -57,6 +61,10 @@ parts:
       - file: reference/algorithm/index.md
         sections:
         - file: reference/algorithm/clump.md
+      - file: source/quality_assurance/doc/index.md
+        sections:
+        - file: source/quality_assurance/cxx/doc/index.md
+        - file: source/quality_assurance/python/doc/index.md
 
     - file: pcraster/index.md
       sections:
diff --git a/document/doc/about/project.md b/document/doc/about/project.md
index f12edb85f..62f5b8a44 100644
--- a/document/doc/about/project.md
+++ b/document/doc/about/project.md
@@ -5,10 +5,10 @@
 ```{include} short_description.md
 ```
 
-:::{margin}
+```{margin}
 LUE is an acronym for "Life, the Universe and Everything". It is pronounced as the French pronounce the name
 Louis (`LU-EE`).
-:::
+```
 
 The LUE data model is described in more detail in {cite}`DeBakker:2017` and {cite}`DeJong:2019`. Details
 about the LUE framework can be found in {cite}`DeJong:2021` and {cite}`DeJong:2022`.
diff --git a/document/doc/about/release.md b/document/doc/about/release.md
index 40ff600eb..3e5081d41 100644
--- a/document/doc/about/release.md
+++ b/document/doc/about/release.md
@@ -22,7 +22,7 @@
 - New operations: `kinematic_wave`, `unique_id` `zonal_area`, `zonal_average`, `zonal_diversity`,
   `zonal_majority`, `zonal_maximum`, `zonal_minimum`, `zonal_normal`, `zonal_uniform`.
 - Add `lue.pcraster` package to ease porting PCRaster models to LUE.
-- Add `LUE_BUILD_QA` target with support for quality assurance.
+- Add `LUE_BUILD_QUALITY_ASSURANCE` target with support for quality assurance.
 - No need to construct `numpy.dtype` instances explicitly anymore. Operations accepting a `numpy.dtype` now
   also accept Numpy scalar type (e.g. `numpy.float64`).
 - [Full list of closed issues on Github](https://github.com/computationalgeography/lue/issues?q=is%3Aclosed+is%3Aissue+milestone%3A0.3.6+)
diff --git a/document/doc/conf.py.in b/document/doc/conf.py.in
deleted file mode 100644
index 966483585..000000000
--- a/document/doc/conf.py.in
+++ /dev/null
@@ -1,80 +0,0 @@
-# Configuration file for the Sphinx documentation builder.
-#
-# This file only contains a selection of the most common options. For a full
-# list see the documentation:
-# https://www.sphinx-doc.org/en/master/usage/configuration.html
-
-# -- Path setup --------------------------------------------------------------
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath("."))
-# import sphinx_rtd_theme
-
-
-# -- Project information -----------------------------------------------------
-
-project = "LUE"
-copyright = "2016-now, LUE R&D team"
-author = "LUE developers"
-
-
-# -- General configuration ---------------------------------------------------
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = [
-    "breathe",
-    "sphinx.ext.autodoc",
-    "sphinx.ext.autosummary",
-    "sphinx.ext.graphviz",
-    # "sphinx.ext.graphviz",  # -> Conflict with other doc generation stuff?
-    # "sphinx.ext.inheritance_diagram",
-    "sphinx.ext.ifconfig",
-    "sphinx.ext.intersphinx",
-    # "ext.generated_image",
-]
-
-# Add any paths that contain templates here, relative to this directory.
-# templates_path = ["@CMAKE_CURRENT_SOURCE_DIR@/_templates"]
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
-
-
-# -- Options for HTML output -------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-html_theme = "sphinx_rtd_theme"
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-# html_static_path = ["@CMAKE_CURRENT_SOURCE_DIR@/_static"]
-
-breathe_default_project = "LUE"
-breathe_default_members = ("members", "undoc-members")
-
-# Doesn't seem to work
-# add_module_names = False
-
-html_show_sourcelink = False
-
-graphviz_output_format = "svg"
-
-autodoc_default_options = {
-    "members": None,
-}
-
-intersphinx_mapping = {
-    "python": ("https://docs.python.org/3", None),
-    "numpy": ("https://numpy.org/doc/stable", None),
-}
diff --git a/document/doc/contribute/index.md b/document/doc/contribute/index.md
index ceb79f00c..87ad7038d 100644
--- a/document/doc/contribute/index.md
+++ b/document/doc/contribute/index.md
@@ -4,10 +4,10 @@
 
 Thank you for investing your time in contributing to this project!
 
-:::{note}
+```{note}
 If you are a model or software developer interested in *using* LUE, then you can safely skip everything in
 this part of the manual. You will likely not need to know about the contents.
-:::
+```
 
 
 ## Issues
diff --git a/document/doc/contribute/release.md b/document/doc/contribute/release.md
index ed556fd66..ce4037f97 100644
--- a/document/doc/contribute/release.md
+++ b/document/doc/contribute/release.md
@@ -60,13 +60,13 @@ git checkout 0.3.4_h813c5f  # Update for actual branch mentioned in PR
 git push
 ```
 
-:::{important}
+```{important}
 Before merging the changes in the pull request's branch the build number in `meta.yaml` must be correct:
 
 - In case LUE's version was bumped, the build number must be 0. This is done by the bot that created the pull
   request in the first place.
 - In case LUE's version was not bumped, the build number must be bumped by 1. In this case there was some
   other reason for rebuilding a Conda package.
-:::
+```
 
 Once the PR is fine, merge it into the main branch.
diff --git a/document/doc/index.md b/document/doc/index.md
index e243c579f..7aacf03a5 100644
--- a/document/doc/index.md
+++ b/document/doc/index.md
@@ -1,5 +1,5 @@
 # LUE
 
-:::{warning}
+```{note}
 This documentation is work in progress. It is improved continuously, but nowhere near being complete.
-:::
+```
diff --git a/document/doc/manual/framework/execute.md b/document/doc/manual/framework/execute.md
index bf25a339c..bf01d9964 100644
--- a/document/doc/manual/framework/execute.md
+++ b/document/doc/manual/framework/execute.md
@@ -31,8 +31,7 @@ Each cluster node contains 2 CPUs, each of which contains 4 NUMA nodes, each of
 easy way to make use of the fact that latencies to memory within a NUMA node are smaller than between them is
 to assign a LUE framework program to each NUMA node (8 / cluster node).
 
-:::{note}
-
+````{note}
 In case you experience crashes when running LUE framework programs, these may be related to the custom memory
 allocator being loaded later than the program starts allocating memory. Memory allocations and deallocations
 must be handled by the same allocation library. Depending on how the HPX library LUE depends upon is built, a
@@ -44,8 +43,7 @@ starting LUE Python scripts like this solved the crashes:
 ```bash
 LD_PRELOAD=<prefix>/lib/libtcmalloc_minimal.so.4 python ./my_lue_script.py
 ```
-
-:::
+````
 
 
 ## Single-node execution
@@ -102,14 +100,14 @@ salloc \
             --hpx:print-bind
 ```
 
-:::{note}
+```{note}
 In case you see this warning::
 
     hpx::init: command line warning: --hpx:localities used when running with SLURM, requesting a different
     number of localities (8) than have been assigned by SLURM (1), the application might not run properly.
 
 but the printed CPU bindings seem fine, then you can safely ignore it.
-:::
+```
 
 #### Asynchronous
 
diff --git a/document/doc/manual/install/conda.md b/document/doc/manual/install/conda.md
index 724528b26..9c50c3f7b 100644
--- a/document/doc/manual/install/conda.md
+++ b/document/doc/manual/install/conda.md
@@ -6,13 +6,13 @@ The LUE Conda package is a great way to get LUE installed quickly on your laptop
 maximum portability, it is built using general sane settings. This version is fine for demo's, testing models,
 and in education, for example. But,
 
-:::{warning}
+```{warning}
 In case you want the best possible performance, you must build LUE yourself, from the sources and using
 settings that match your specific platform.
 
 Building LUE yourself is also required if you want to perform distributed calculations, using multiple
 cooroperating processes. For more information about building LUE, see [](#install-source).
-:::
+```
 
 
 Installing LUE using Conda is as easy as:
diff --git a/document/doc/manual/install/source.md b/document/doc/manual/install/source.md
index f004ca062..a556bd44e 100644
--- a/document/doc/manual/install/source.md
+++ b/document/doc/manual/install/source.md
@@ -10,13 +10,13 @@ for building LUE.
 
 The following CMake variables are used to determine which targets to build:
 
-| Variable                  | Default | Effect |
-| ---                       | ---     | --- |
-| `LUE_BUILD_DATA_MODEL`    | `TRUE`  | Build data model C++ API |
-| `LUE_BUILD_FRAMEWORK`     | `TRUE`  | Build modelling framework |
-| `LUE_BUILD_VIEW`          | `TRUE`  | Build data model viewer |
-| `LUE_BUILD_DOCUMENTATION` | `FALSE` | Build API documentation |
-| `LUE_BUILD_QA`            | `FALSE` | Build QA targets |
+| Variable                      | Default | Effect                          |
+| ---                           | ---     | ---                             |
+| `LUE_BUILD_DATA_MODEL`        | `TRUE`  | Build data model C++ API        |
+| `LUE_BUILD_FRAMEWORK`         | `TRUE`  | Build modelling framework       |
+| `LUE_BUILD_VIEW`              | `TRUE`  | Build data model viewer         |
+| `LUE_BUILD_DOCUMENTATION`     | `FALSE` | Build API documentation         |
+| `LUE_BUILD_QUALITY_ASSURANCE` | `FALSE` | Build quality assurance targets |
 
 Here is an example session of building the default LUE targets and installing them in `$HOME/lue_install`:
 
@@ -84,30 +84,31 @@ Optional features:
 - Breathe, Doxygen, Graphviz, Jupyter-Book, Sphinx
 
 
-### QA
+### Quality assurance
 
 Optional features:
 
-| Variable                              | Default | Effect |
-| ---                                   | ---     | --- |
-| `LUE_QA_WITH_PYTHON_API`              | `FALSE` | Build QA Python API |
-| `LUE_QA_WITH_TESTS`                   | `FALSE` | Build test targets |
-| `LUE_QA_TEST_NR_LOCALITIES_PER_TEST`  | `1`     | Localities used when testing the framework |
-| `LUE_QA_TEST_NR_THREADS_PER_LOCALITY` | `1`     | Threads per locality used when testing the framework |
-| `LUE_QA_TEST_HPX_RUNWRAPPER`          | `none`  | Runwrapper to use (see `hpxrun.py`) |
-| `LUE_QA_TEST_HPX_PARCELPORT`          | `tcp`   | Parcelport to use (see `hpxrun.py`) |
-
-:::{note}
-Changing `LUE_QA_TEST_NR_LOCALITIES_PER_TEST` and `LUE_QA_TEST_NR_THREADS_PER_LOCALITY` is only relevant for
-tests that depend on the HPX library. Using multiple localities (`LUE_QA_TEST_NR_LOCALITIES_PER_TEST` > 1),
-requires that HPX is built with support for networking.
-:::
+| Variable                                             | Default | Effect                              |
+| ---                                                  | ---     | ---                                 |
+| `LUE_QUALITY_ASSURANCE_WITH_PYTHON_API`              | `FALSE` | Build quality assurance Python API  |
+| `LUE_QUALITY_ASSURANCE_WITH_TESTS`                   | `FALSE` | Build test targets                  |
+| `LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST`  | `1`     | Number of localities to use         |
+| `LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY` | `1`     | Number of threads per locality      |
+| `LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER`          | `none`  | Runwrapper to use (see `hpxrun.py`) |
+| `LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT`          | `tcp`   | Parcelport to use (see `hpxrun.py`) |
+
+```{note}
+Changing `LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST` and
+`LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY` is only relevant for tests that depend on the HPX
+library. Using multiple localities (`LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST` > 1), requires that
+HPX is built with support for networking.
+```
 
 #### Dependencies
 
 - Nlohmann JSON
-- `LUE_QA_WITH_TESTS`: Boost filesystem, system, unit-test framework libraries
-- `LUE_QA_WITH_PYTHON_API`: pybind11, Python
+- `LUE_QUALITY_ASSURANCE_WITH_TESTS`: Boost filesystem, system, unit-test framework libraries
+- `LUE_QUALITY_ASSURANCE_WITH_PYTHON_API`: pybind11, Python
 
 
 ## Dependencies
diff --git a/document/doc/manual/quality_assurance/index.md b/document/doc/manual/quality_assurance/index.md
new file mode 100644
index 000000000..9ab36de63
--- /dev/null
+++ b/document/doc/manual/quality_assurance/index.md
@@ -0,0 +1,1 @@
+# Quality assurance
diff --git a/document/doc/manual/framework/scalability.md b/document/doc/manual/quality_assurance/scalability/experiment.md
similarity index 75%
rename from document/doc/manual/framework/scalability.md
rename to document/doc/manual/quality_assurance/scalability/experiment.md
index b6fee313b..da745678f 100644
--- a/document/doc/manual/framework/scalability.md
+++ b/document/doc/manual/quality_assurance/scalability/experiment.md
@@ -1,21 +1,23 @@
 (scalability-experiments)=
 
-# Scalability experiments
+# Experiments
 
 The goal of a scalability experiment is to determine how well software is able to make good use of additional
 hardware. In the case of a LUE model, the goal is to determine how well the model is capable of using
-additional CPU cores, NUMA nodes (grouping CPU cores), or cluster nodes (grouping NUMA nodes). These are the
-kinds of workers we will focus on here.
+additional CPU cores, NUMA nodes (grouping CPU cores and memory), or cluster nodes (grouping NUMA nodes).
+These are the kinds of workers we will focus on here.
 
 There are two kinds of scalability: strong scalability and weak scalability. Strong scalability is not better
 than weak scalability. They are just different kinds of scalability. Depending on your use-case, you may be
 more interested in strong scalability or in weak scalability.
 
 There are limits to scalability. Any piece of software will scale up to a certain number of workers. Serial
-software scales up to 1 worker, parallel software may scale up to many more. Scalability measures must always
-be associated with the number of workers used to calculate them.
+software "scales" up to 1 worker, parallel software may scale up to many more. Scalability measures must
+always be associated with the number of workers used to calculate them.
 
 
+(strong-scalability-experiment)=
+
 ## Strong scalability
 
 Strong scalability is relevant if you are interested in speeding up your existing model. A model that has a
@@ -26,10 +28,10 @@ when more workers are allocated to the process. The problem size (model + data)
 model is run on a larger amount of hardware.
 
 Strong scalability is harder to achieve than weak scalability. Software contains serial and parallel
-fractions. Serial fractions can't make use of additional workers - they have to run in serial. Parallel
-fractions may make good using of additional workers. Even in case of a small serial fraction and a perfectly
-scalable parallel fraction, overall strong scalability will be limited. See the [Wikipedia page on Amdahl's
-law](https://en.wikipedia.org/wiki/Amdahl%27s_law) for a sobering explanation of this fact.
+fractions. Serial fractions can't make use of additional workers - they have to run in serial, on a single
+worker. Parallel fractions may make good using of additional workers. Even in case of a small serial fraction
+and a perfectly scalable parallel fraction, overall strong scalability will be limited. See the [Wikipedia
+page on Amdahl's law](https://en.wikipedia.org/wiki/Amdahl%27s_law) for a sobering explanation of this fact.
 
 A good way to express strong scalability is the relative strong scalability efficiency ($RSE_{strong}$):
 
@@ -47,11 +49,13 @@ For a strong scalability experiment you have to run the model multiple times, at
 workers, and measure the amount of time it takes to finish executing.
 
 
+(weak-scalability-experiment)=
+
 ## Weak scalability
 
 Weak scalability is relevant if you are interested in increasing the amount of data used by your model. A
-model that has high weak scalability can make good use of the additional hardware to make the time used to
-execute it not increase much.
+model that has high weak scalability can make good use of the additional hardware so the time it takes to
+execute a larger problem does not increase much.
 
 In the case of a weak scalability experiment, the goal is to determine whether or not the time it takes to
 execute a model stays the same when the amount of data and the amount of workers is increased. The amount of
@@ -74,7 +78,7 @@ $$
 | $T_{W,1}$ | Latency when using one worker |
 | $T_{W,P}$ | Latency when working $P$ workers |
 
-For a strong scalability experiment you have to run the model multiple times, at least once for each number of
+For a weak scalability experiment you have to run the model multiple times, at least once for each number of
 workers, and measure the amount of time it takes to finish executing. The size of the datasets must be scaled
 linearly with the number of workers used.
 
@@ -93,11 +97,10 @@ linearly with the number of workers used.
 - Make sure the number of partitions is larger than the number of CPU cores used in the experiment. Otherwise
   the CPUs will be drained of useful work to do. This may indicate that you are using too much hardware for
   the problem size.
-- A good way to present the results is to graph $RSE_{strong}$ or $RSE_{weak}$
-  against $P$. Also plot the lines for linear (perfect) and serial (no) scalability. This
-  helps putting the actual scalabilities into perspective visually.
-- It may be useful to run the model multiple times for each number of workers, to learn about
-  the spread in the results.
-- Some more information and scripts for automating scalability experiments can be found in the [LUE Quality
-  Assurance](https://github.com/computationalgeography/lue_qa) repository. Use it for inspiration, but note
-  that this is still very much work in progress.
+- A good way to present the results is to graph $RSE_{strong}$ or $RSE_{weak}$ against $P$. Also plot the
+  lines for linear (perfect) and serial (no) scalability. This helps putting the actual scalabilities into
+  perspective visually.
+- It may be useful to run the model multiple times for each number of workers, to learn about the spread in
+  the results.
+- Be sure to check the [lue_scalability.py](#lue-scalability) script, which automates much of the book keeping
+  required when performing scalability experiments.
diff --git a/document/doc/manual/quality_assurance/scalability/game_of_life.py b/document/doc/manual/quality_assurance/scalability/game_of_life.py
new file mode 100755
index 000000000..67f6e6e0c
--- /dev/null
+++ b/document/doc/manual/quality_assurance/scalability/game_of_life.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+import sys
+from pathlib import Path
+
+import docopt
+import numpy as np
+
+import lue.framework as lfr
+import lue.qa.scalability.instrument as lqi
+
+
+def initialize_generation(array_shape, partition_shape):
+    generation = lfr.create_array(
+        array_shape=array_shape,
+        partition_shape=partition_shape,
+        dtype=np.dtype(np.float32),
+        fill_value=0,
+    )
+    fraction_alive_cells = 0.25
+    generation = lfr.uniform(generation, np.float32, 0, 1) <= fraction_alive_cells
+
+    return generation
+
+
+def next_generation(generation):
+    kernel = np.array(
+        [
+            [1, 1, 1],
+            [1, 0, 1],
+            [1, 1, 1],
+        ],
+        dtype=np.uint8,
+    )
+    nr_alive_cells = lfr.focal_sum(generation, kernel)
+
+    # Next state of currently alive cells
+    underpopulated = nr_alive_cells < 2
+    overpopulated = nr_alive_cells > 3
+
+    # Next state of currently dead cells
+    reproducing = nr_alive_cells == 3
+
+    generation = lfr.where(
+        generation,
+        # True if alive and not under/overpopulated
+        ~(underpopulated | overpopulated),
+        # True if dead with three neighbours
+        reproducing,
+    )
+
+    return generation
+
+
+@lfr.runtime_scope
+def game_of_life_scalability(
+    count: int,
+    nr_workers: int,
+    array_shape: tuple[int, int],
+    partition_shape: tuple[int, int],
+    nr_generations: int,
+    result_pathname: str,
+) -> None:
+
+    generation = initialize_generation(array_shape, partition_shape)
+    lfr.wait(generation)
+
+    experiment = lqi.ArrayExperiment(nr_workers, array_shape, partition_shape)
+    experiment.start()
+
+    for _ in range(count):
+        run = lqi.Run()
+
+        run.start()
+
+        for _ in range(1, nr_generations + 1):
+            generation = next_generation(generation)
+
+        lfr.wait(generation)
+        run.stop()
+
+        experiment.add(run)
+
+    experiment.stop()
+    lqi.save_results(experiment, result_pathname)
+
+
+def parse_shape(string):
+    string = string.strip("[]")
+    return tuple(int(extent) for extent in string.split(","))
+
+
+def main():
+    usage = """\
+Calculate the generations of alive cells according to the Game of Life
+cellular automaton
+
+Usage:
+    {command}
+        --lue:count=<count> --lue:nr_workers=<nr_workers>
+        --lue:array_shape=<array_shape> --lue:partition_shape=<partition_shape>
+        --lue:result=<result>
+        <nr_generations>
+
+Options:
+    <nr_generations>  Number of Game of Life generations to calculate
+""".format(
+        command=Path(sys.argv[0]).name
+    )
+
+    # Filter out arguments meant for the HPX runtime
+    argv = [arg for arg in sys.argv[1:] if not arg.startswith("--hpx")]
+    arguments = docopt.docopt(usage, argv)
+    nr_generations = int(arguments["<nr_generations>"])
+    count = int(arguments["--lue:count"])
+    nr_workers = int(arguments["--lue:nr_workers"])
+    array_shape = parse_shape(arguments["--lue:array_shape"])
+    partition_shape = parse_shape(arguments["--lue:partition_shape"])
+    result_pathname = arguments["--lue:result"]
+
+    assert nr_generations >= 0, nr_generations
+    assert count > 0, count
+    assert nr_workers > 0, nr_workers
+
+    game_of_life_scalability(
+        count,
+        nr_workers,
+        array_shape,
+        partition_shape,
+        nr_generations,
+        result_pathname,
+    )
+
+
+if __name__ == "__main__":
+    main()
diff --git a/document/doc/manual/quality_assurance/scalability/index.md b/document/doc/manual/quality_assurance/scalability/index.md
new file mode 100644
index 000000000..f2e7e4c1b
--- /dev/null
+++ b/document/doc/manual/quality_assurance/scalability/index.md
@@ -0,0 +1,9 @@
+# Scalability
+
+See the [experiments page](#scalability-experiments) for general information about scalability experiments.
+The [quick start page](#scalability-quick-start) describes how to perform such experiments using an example
+model. It makes use of the [lue_scalability.py command](#lue-scalability).
+
+```{note}
+Use optimized / release builds when performing performance or scalability experiments.
+```
diff --git a/document/doc/manual/quality_assurance/scalability/partition_shape.svg b/document/doc/manual/quality_assurance/scalability/partition_shape.svg
new file mode 100644
index 000000000..644ac5b71
--- /dev/null
+++ b/document/doc/manual/quality_assurance/scalability/partition_shape.svg
@@ -0,0 +1,1731 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="902.621708pt" height="747.756201pt" viewBox="0 0 902.621708 747.756201" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2024-10-30T15:33:20.830508</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.9.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 747.756201
+L 902.621708 747.756201
+L 902.621708 0
+L 0 0
+L 0 747.756201
+z
+" style="fill: none"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 53.328125 633.6
+L 890.328125 633.6
+L 890.328125 79.2
+L 53.328125 79.2
+L 53.328125 633.6
+z
+" style="fill: none"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <path d="M 91.37358 633.6
+L 91.37358 79.2
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_2">
+      <defs>
+       <path id="m04ffa02b5c" d="M 0 0
+L 0 3.5
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m04ffa02b5c" x="91.37358" y="633.6" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 500x500 (250000) -->
+      <g transform="translate(60.355899 711.910614) rotate(-45) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666
+L 3169 4666
+L 3169 4134
+L 1269 4134
+L 1269 2991
+Q 1406 3038 1543 3061
+Q 1681 3084 1819 3084
+Q 2600 3084 3056 2656
+Q 3513 2228 3513 1497
+Q 3513 744 3044 326
+Q 2575 -91 1722 -91
+Q 1428 -91 1123 -41
+Q 819 9 494 109
+L 494 744
+Q 775 591 1075 516
+Q 1375 441 1709 441
+Q 2250 441 2565 725
+Q 2881 1009 2881 1497
+Q 2881 1984 2565 2268
+Q 2250 2553 1709 2553
+Q 1456 2553 1204 2497
+Q 953 2441 691 2322
+L 691 4666
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-30" d="M 2034 4250
+Q 1547 4250 1301 3770
+Q 1056 3291 1056 2328
+Q 1056 1369 1301 889
+Q 1547 409 2034 409
+Q 2525 409 2770 889
+Q 3016 1369 3016 2328
+Q 3016 3291 2770 3770
+Q 2525 4250 2034 4250
+z
+M 2034 4750
+Q 2819 4750 3233 4129
+Q 3647 3509 3647 2328
+Q 3647 1150 3233 529
+Q 2819 -91 2034 -91
+Q 1250 -91 836 529
+Q 422 1150 422 2328
+Q 422 3509 836 4129
+Q 1250 4750 2034 4750
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-78" d="M 3513 3500
+L 2247 1797
+L 3578 0
+L 2900 0
+L 1881 1375
+L 863 0
+L 184 0
+L 1544 1831
+L 300 3500
+L 978 3500
+L 1906 2253
+L 2834 3500
+L 3513 3500
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-28" d="M 1984 4856
+Q 1566 4138 1362 3434
+Q 1159 2731 1159 2009
+Q 1159 1288 1364 580
+Q 1569 -128 1984 -844
+L 1484 -844
+Q 1016 -109 783 600
+Q 550 1309 550 2009
+Q 550 2706 781 3412
+Q 1013 4119 1484 4856
+L 1984 4856
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-32" d="M 1228 531
+L 3431 531
+L 3431 0
+L 469 0
+L 469 531
+Q 828 903 1448 1529
+Q 2069 2156 2228 2338
+Q 2531 2678 2651 2914
+Q 2772 3150 2772 3378
+Q 2772 3750 2511 3984
+Q 2250 4219 1831 4219
+Q 1534 4219 1204 4116
+Q 875 4013 500 3803
+L 500 4441
+Q 881 4594 1212 4672
+Q 1544 4750 1819 4750
+Q 2544 4750 2975 4387
+Q 3406 4025 3406 3419
+Q 3406 3131 3298 2873
+Q 3191 2616 2906 2266
+Q 2828 2175 2409 1742
+Q 1991 1309 1228 531
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-29" d="M 513 4856
+L 1013 4856
+Q 1481 4119 1714 3412
+Q 1947 2706 1947 2009
+Q 1947 1309 1714 600
+Q 1481 -109 1013 -844
+L 513 -844
+Q 928 -128 1133 580
+Q 1338 1288 1338 2009
+Q 1338 2731 1133 3434
+Q 928 4138 513 4856
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-35"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-78" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-35" x="250.048828"/>
+       <use xlink:href="#DejaVuSans-30" x="313.671875"/>
+       <use xlink:href="#DejaVuSans-30" x="377.294922"/>
+       <use xlink:href="#DejaVuSans-20" x="440.917969"/>
+       <use xlink:href="#DejaVuSans-28" x="472.705078"/>
+       <use xlink:href="#DejaVuSans-32" x="511.71875"/>
+       <use xlink:href="#DejaVuSans-35" x="575.341797"/>
+       <use xlink:href="#DejaVuSans-30" x="638.964844"/>
+       <use xlink:href="#DejaVuSans-30" x="702.587891"/>
+       <use xlink:href="#DejaVuSans-30" x="766.210938"/>
+       <use xlink:href="#DejaVuSans-30" x="829.833984"/>
+       <use xlink:href="#DejaVuSans-29" x="893.457031"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_3">
+      <path d="M 186.147444 633.6
+L 186.147444 79.2
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#m04ffa02b5c" x="186.147444" y="633.6" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 612x612 (374544) -->
+      <g transform="translate(155.129763 711.910614) rotate(-45) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-36" d="M 2113 2584
+Q 1688 2584 1439 2293
+Q 1191 2003 1191 1497
+Q 1191 994 1439 701
+Q 1688 409 2113 409
+Q 2538 409 2786 701
+Q 3034 994 3034 1497
+Q 3034 2003 2786 2293
+Q 2538 2584 2113 2584
+z
+M 3366 4563
+L 3366 3988
+Q 3128 4100 2886 4159
+Q 2644 4219 2406 4219
+Q 1781 4219 1451 3797
+Q 1122 3375 1075 2522
+Q 1259 2794 1537 2939
+Q 1816 3084 2150 3084
+Q 2853 3084 3261 2657
+Q 3669 2231 3669 1497
+Q 3669 778 3244 343
+Q 2819 -91 2113 -91
+Q 1303 -91 875 529
+Q 447 1150 447 2328
+Q 447 3434 972 4092
+Q 1497 4750 2381 4750
+Q 2619 4750 2861 4703
+Q 3103 4656 3366 4563
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-31" d="M 794 531
+L 1825 531
+L 1825 4091
+L 703 3866
+L 703 4441
+L 1819 4666
+L 2450 4666
+L 2450 531
+L 3481 531
+L 3481 0
+L 794 0
+L 794 531
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-33" d="M 2597 2516
+Q 3050 2419 3304 2112
+Q 3559 1806 3559 1356
+Q 3559 666 3084 287
+Q 2609 -91 1734 -91
+Q 1441 -91 1130 -33
+Q 819 25 488 141
+L 488 750
+Q 750 597 1062 519
+Q 1375 441 1716 441
+Q 2309 441 2620 675
+Q 2931 909 2931 1356
+Q 2931 1769 2642 2001
+Q 2353 2234 1838 2234
+L 1294 2234
+L 1294 2753
+L 1863 2753
+Q 2328 2753 2575 2939
+Q 2822 3125 2822 3475
+Q 2822 3834 2567 4026
+Q 2313 4219 1838 4219
+Q 1578 4219 1281 4162
+Q 984 4106 628 3988
+L 628 4550
+Q 988 4650 1302 4700
+Q 1616 4750 1894 4750
+Q 2613 4750 3031 4423
+Q 3450 4097 3450 3541
+Q 3450 3153 3228 2886
+Q 3006 2619 2597 2516
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-37" d="M 525 4666
+L 3525 4666
+L 3525 4397
+L 1831 0
+L 1172 0
+L 2766 4134
+L 525 4134
+L 525 4666
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-34" d="M 2419 4116
+L 825 1625
+L 2419 1625
+L 2419 4116
+z
+M 2253 4666
+L 3047 4666
+L 3047 1625
+L 3713 1625
+L 3713 1100
+L 3047 1100
+L 3047 0
+L 2419 0
+L 2419 1100
+L 313 1100
+L 313 1709
+L 2253 4666
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-31" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-32" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-78" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-36" x="250.048828"/>
+       <use xlink:href="#DejaVuSans-31" x="313.671875"/>
+       <use xlink:href="#DejaVuSans-32" x="377.294922"/>
+       <use xlink:href="#DejaVuSans-20" x="440.917969"/>
+       <use xlink:href="#DejaVuSans-28" x="472.705078"/>
+       <use xlink:href="#DejaVuSans-33" x="511.71875"/>
+       <use xlink:href="#DejaVuSans-37" x="575.341797"/>
+       <use xlink:href="#DejaVuSans-34" x="638.964844"/>
+       <use xlink:href="#DejaVuSans-35" x="702.587891"/>
+       <use xlink:href="#DejaVuSans-34" x="766.210938"/>
+       <use xlink:href="#DejaVuSans-34" x="829.833984"/>
+       <use xlink:href="#DejaVuSans-29" x="893.457031"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_5">
+      <path d="M 281.500405 633.6
+L 281.500405 79.2
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#m04ffa02b5c" x="281.500405" y="633.6" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 707x707 (499849) -->
+      <g transform="translate(250.482724 711.910614) rotate(-45) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-39" d="M 703 97
+L 703 672
+Q 941 559 1184 500
+Q 1428 441 1663 441
+Q 2288 441 2617 861
+Q 2947 1281 2994 2138
+Q 2813 1869 2534 1725
+Q 2256 1581 1919 1581
+Q 1219 1581 811 2004
+Q 403 2428 403 3163
+Q 403 3881 828 4315
+Q 1253 4750 1959 4750
+Q 2769 4750 3195 4129
+Q 3622 3509 3622 2328
+Q 3622 1225 3098 567
+Q 2575 -91 1691 -91
+Q 1453 -91 1209 -44
+Q 966 3 703 97
+z
+M 1959 2075
+Q 2384 2075 2632 2365
+Q 2881 2656 2881 3163
+Q 2881 3666 2632 3958
+Q 2384 4250 1959 4250
+Q 1534 4250 1286 3958
+Q 1038 3666 1038 3163
+Q 1038 2656 1286 2365
+Q 1534 2075 1959 2075
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-38" d="M 2034 2216
+Q 1584 2216 1326 1975
+Q 1069 1734 1069 1313
+Q 1069 891 1326 650
+Q 1584 409 2034 409
+Q 2484 409 2743 651
+Q 3003 894 3003 1313
+Q 3003 1734 2745 1975
+Q 2488 2216 2034 2216
+z
+M 1403 2484
+Q 997 2584 770 2862
+Q 544 3141 544 3541
+Q 544 4100 942 4425
+Q 1341 4750 2034 4750
+Q 2731 4750 3128 4425
+Q 3525 4100 3525 3541
+Q 3525 3141 3298 2862
+Q 3072 2584 2669 2484
+Q 3125 2378 3379 2068
+Q 3634 1759 3634 1313
+Q 3634 634 3220 271
+Q 2806 -91 2034 -91
+Q 1263 -91 848 271
+Q 434 634 434 1313
+Q 434 1759 690 2068
+Q 947 2378 1403 2484
+z
+M 1172 3481
+Q 1172 3119 1398 2916
+Q 1625 2713 2034 2713
+Q 2441 2713 2670 2916
+Q 2900 3119 2900 3481
+Q 2900 3844 2670 4047
+Q 2441 4250 2034 4250
+Q 1625 4250 1398 4047
+Q 1172 3844 1172 3481
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-37"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-37" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-78" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-37" x="250.048828"/>
+       <use xlink:href="#DejaVuSans-30" x="313.671875"/>
+       <use xlink:href="#DejaVuSans-37" x="377.294922"/>
+       <use xlink:href="#DejaVuSans-20" x="440.917969"/>
+       <use xlink:href="#DejaVuSans-28" x="472.705078"/>
+       <use xlink:href="#DejaVuSans-34" x="511.71875"/>
+       <use xlink:href="#DejaVuSans-39" x="575.341797"/>
+       <use xlink:href="#DejaVuSans-39" x="638.964844"/>
+       <use xlink:href="#DejaVuSans-38" x="702.587891"/>
+       <use xlink:href="#DejaVuSans-34" x="766.210938"/>
+       <use xlink:href="#DejaVuSans-39" x="829.833984"/>
+       <use xlink:href="#DejaVuSans-29" x="893.457031"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_7">
+      <path d="M 376.051306 633.6
+L 376.051306 79.2
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#m04ffa02b5c" x="376.051306" y="633.6" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 790x790 (624100) -->
+      <g transform="translate(345.033625 711.910614) rotate(-45) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-37"/>
+       <use xlink:href="#DejaVuSans-39" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-78" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-37" x="250.048828"/>
+       <use xlink:href="#DejaVuSans-39" x="313.671875"/>
+       <use xlink:href="#DejaVuSans-30" x="377.294922"/>
+       <use xlink:href="#DejaVuSans-20" x="440.917969"/>
+       <use xlink:href="#DejaVuSans-28" x="472.705078"/>
+       <use xlink:href="#DejaVuSans-36" x="511.71875"/>
+       <use xlink:href="#DejaVuSans-32" x="575.341797"/>
+       <use xlink:href="#DejaVuSans-34" x="638.964844"/>
+       <use xlink:href="#DejaVuSans-31" x="702.587891"/>
+       <use xlink:href="#DejaVuSans-30" x="766.210938"/>
+       <use xlink:href="#DejaVuSans-30" x="829.833984"/>
+       <use xlink:href="#DejaVuSans-29" x="893.457031"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_9">
+      <path d="M 471.823559 633.6
+L 471.823559 79.2
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#m04ffa02b5c" x="471.823559" y="633.6" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 866x866 (749956) -->
+      <g transform="translate(440.805878 711.910614) rotate(-45) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-38"/>
+       <use xlink:href="#DejaVuSans-36" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-36" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-78" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-38" x="250.048828"/>
+       <use xlink:href="#DejaVuSans-36" x="313.671875"/>
+       <use xlink:href="#DejaVuSans-36" x="377.294922"/>
+       <use xlink:href="#DejaVuSans-20" x="440.917969"/>
+       <use xlink:href="#DejaVuSans-28" x="472.705078"/>
+       <use xlink:href="#DejaVuSans-37" x="511.71875"/>
+       <use xlink:href="#DejaVuSans-34" x="575.341797"/>
+       <use xlink:href="#DejaVuSans-39" x="638.964844"/>
+       <use xlink:href="#DejaVuSans-39" x="702.587891"/>
+       <use xlink:href="#DejaVuSans-35" x="766.210938"/>
+       <use xlink:href="#DejaVuSans-36" x="829.833984"/>
+       <use xlink:href="#DejaVuSans-29" x="893.457031"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_11">
+      <path d="M 566.388158 633.6
+L 566.388158 79.2
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#m04ffa02b5c" x="566.388158" y="633.6" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 935x935 (874225) -->
+      <g transform="translate(535.370477 711.910614) rotate(-45) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-39"/>
+       <use xlink:href="#DejaVuSans-33" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-35" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-78" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-39" x="250.048828"/>
+       <use xlink:href="#DejaVuSans-33" x="313.671875"/>
+       <use xlink:href="#DejaVuSans-35" x="377.294922"/>
+       <use xlink:href="#DejaVuSans-20" x="440.917969"/>
+       <use xlink:href="#DejaVuSans-28" x="472.705078"/>
+       <use xlink:href="#DejaVuSans-38" x="511.71875"/>
+       <use xlink:href="#DejaVuSans-37" x="575.341797"/>
+       <use xlink:href="#DejaVuSans-34" x="638.964844"/>
+       <use xlink:href="#DejaVuSans-32" x="702.587891"/>
+       <use xlink:href="#DejaVuSans-32" x="766.210938"/>
+       <use xlink:href="#DejaVuSans-35" x="829.833984"/>
+       <use xlink:href="#DejaVuSans-29" x="893.457031"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_13">
+      <path d="M 662.098773 633.6
+L 662.098773 79.2
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_14">
+      <g>
+       <use xlink:href="#m04ffa02b5c" x="662.098773" y="633.6" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 1000x1000 (1000000) -->
+      <g transform="translate(624.332642 725.407515) rotate(-45) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-78" x="254.492188"/>
+       <use xlink:href="#DejaVuSans-31" x="313.671875"/>
+       <use xlink:href="#DejaVuSans-30" x="377.294922"/>
+       <use xlink:href="#DejaVuSans-30" x="440.917969"/>
+       <use xlink:href="#DejaVuSans-30" x="504.541016"/>
+       <use xlink:href="#DejaVuSans-20" x="568.164062"/>
+       <use xlink:href="#DejaVuSans-28" x="599.951172"/>
+       <use xlink:href="#DejaVuSans-31" x="638.964844"/>
+       <use xlink:href="#DejaVuSans-30" x="702.587891"/>
+       <use xlink:href="#DejaVuSans-30" x="766.210938"/>
+       <use xlink:href="#DejaVuSans-30" x="829.833984"/>
+       <use xlink:href="#DejaVuSans-30" x="893.457031"/>
+       <use xlink:href="#DejaVuSans-30" x="957.080078"/>
+       <use xlink:href="#DejaVuSans-30" x="1020.703125"/>
+       <use xlink:href="#DejaVuSans-29" x="1084.326172"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_8">
+     <g id="line2d_15">
+      <path d="M 756.154285 633.6
+L 756.154285 79.2
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_16">
+      <g>
+       <use xlink:href="#m04ffa02b5c" x="756.154285" y="633.6" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 1060x1060 (1123600) -->
+      <g transform="translate(718.388153 725.407515) rotate(-45) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-36" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-78" x="254.492188"/>
+       <use xlink:href="#DejaVuSans-31" x="313.671875"/>
+       <use xlink:href="#DejaVuSans-30" x="377.294922"/>
+       <use xlink:href="#DejaVuSans-36" x="440.917969"/>
+       <use xlink:href="#DejaVuSans-30" x="504.541016"/>
+       <use xlink:href="#DejaVuSans-20" x="568.164062"/>
+       <use xlink:href="#DejaVuSans-28" x="599.951172"/>
+       <use xlink:href="#DejaVuSans-31" x="638.964844"/>
+       <use xlink:href="#DejaVuSans-31" x="702.587891"/>
+       <use xlink:href="#DejaVuSans-32" x="766.210938"/>
+       <use xlink:href="#DejaVuSans-33" x="829.833984"/>
+       <use xlink:href="#DejaVuSans-36" x="893.457031"/>
+       <use xlink:href="#DejaVuSans-30" x="957.080078"/>
+       <use xlink:href="#DejaVuSans-30" x="1020.703125"/>
+       <use xlink:href="#DejaVuSans-29" x="1084.326172"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_9">
+     <g id="line2d_17">
+      <path d="M 852.28267 633.6
+L 852.28267 79.2
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_18">
+      <g>
+       <use xlink:href="#m04ffa02b5c" x="852.28267" y="633.6" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 1118x1118 (1249924) -->
+      <g transform="translate(814.516539 725.407515) rotate(-45) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-31" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-31" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-38" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-78" x="254.492188"/>
+       <use xlink:href="#DejaVuSans-31" x="313.671875"/>
+       <use xlink:href="#DejaVuSans-31" x="377.294922"/>
+       <use xlink:href="#DejaVuSans-31" x="440.917969"/>
+       <use xlink:href="#DejaVuSans-38" x="504.541016"/>
+       <use xlink:href="#DejaVuSans-20" x="568.164062"/>
+       <use xlink:href="#DejaVuSans-28" x="599.951172"/>
+       <use xlink:href="#DejaVuSans-31" x="638.964844"/>
+       <use xlink:href="#DejaVuSans-32" x="702.587891"/>
+       <use xlink:href="#DejaVuSans-34" x="766.210938"/>
+       <use xlink:href="#DejaVuSans-39" x="829.833984"/>
+       <use xlink:href="#DejaVuSans-39" x="893.457031"/>
+       <use xlink:href="#DejaVuSans-32" x="957.080078"/>
+       <use xlink:href="#DejaVuSans-34" x="1020.703125"/>
+       <use xlink:href="#DejaVuSans-29" x="1084.326172"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_10">
+     <!-- partition shape -->
+     <g transform="translate(433.930469 738.476513) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-70" d="M 1159 525
+L 1159 -1331
+L 581 -1331
+L 581 3500
+L 1159 3500
+L 1159 2969
+Q 1341 3281 1617 3432
+Q 1894 3584 2278 3584
+Q 2916 3584 3314 3078
+Q 3713 2572 3713 1747
+Q 3713 922 3314 415
+Q 2916 -91 2278 -91
+Q 1894 -91 1617 61
+Q 1341 213 1159 525
+z
+M 3116 1747
+Q 3116 2381 2855 2742
+Q 2594 3103 2138 3103
+Q 1681 3103 1420 2742
+Q 1159 2381 1159 1747
+Q 1159 1113 1420 752
+Q 1681 391 2138 391
+Q 2594 391 2855 752
+Q 3116 1113 3116 1747
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759
+Q 1497 1759 1228 1600
+Q 959 1441 959 1056
+Q 959 750 1161 570
+Q 1363 391 1709 391
+Q 2188 391 2477 730
+Q 2766 1069 2766 1631
+L 2766 1759
+L 2194 1759
+z
+M 3341 1997
+L 3341 0
+L 2766 0
+L 2766 531
+Q 2569 213 2275 61
+Q 1981 -91 1556 -91
+Q 1019 -91 701 211
+Q 384 513 384 1019
+Q 384 1609 779 1909
+Q 1175 2209 1959 2209
+L 2766 2209
+L 2766 2266
+Q 2766 2663 2505 2880
+Q 2244 3097 1772 3097
+Q 1472 3097 1187 3025
+Q 903 2953 641 2809
+L 641 3341
+Q 956 3463 1253 3523
+Q 1550 3584 1831 3584
+Q 2591 3584 2966 3190
+Q 3341 2797 3341 1997
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-72" d="M 2631 2963
+Q 2534 3019 2420 3045
+Q 2306 3072 2169 3072
+Q 1681 3072 1420 2755
+Q 1159 2438 1159 1844
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1341 3275 1631 3429
+Q 1922 3584 2338 3584
+Q 2397 3584 2469 3576
+Q 2541 3569 2628 3553
+L 2631 2963
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494
+L 1172 3500
+L 2356 3500
+L 2356 3053
+L 1172 3053
+L 1172 1153
+Q 1172 725 1289 603
+Q 1406 481 1766 481
+L 2356 481
+L 2356 0
+L 1766 0
+Q 1100 0 847 248
+Q 594 497 594 1153
+L 594 3053
+L 172 3053
+L 172 3500
+L 594 3500
+L 594 4494
+L 1172 4494
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500
+L 1178 3500
+L 1178 0
+L 603 0
+L 603 3500
+z
+M 603 4863
+L 1178 4863
+L 1178 4134
+L 603 4134
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097
+Q 1497 3097 1228 2736
+Q 959 2375 959 1747
+Q 959 1119 1226 758
+Q 1494 397 1959 397
+Q 2419 397 2687 759
+Q 2956 1122 2956 1747
+Q 2956 2369 2687 2733
+Q 2419 3097 1959 3097
+z
+M 1959 3584
+Q 2709 3584 3137 3096
+Q 3566 2609 3566 1747
+Q 3566 888 3137 398
+Q 2709 -91 1959 -91
+Q 1206 -91 779 398
+Q 353 888 353 1747
+Q 353 2609 779 3096
+Q 1206 3584 1959 3584
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113
+L 3513 0
+L 2938 0
+L 2938 2094
+Q 2938 2591 2744 2837
+Q 2550 3084 2163 3084
+Q 1697 3084 1428 2787
+Q 1159 2491 1159 1978
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1366 3272 1645 3428
+Q 1925 3584 2291 3584
+Q 2894 3584 3203 3211
+Q 3513 2838 3513 2113
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-73" d="M 2834 3397
+L 2834 2853
+Q 2591 2978 2328 3040
+Q 2066 3103 1784 3103
+Q 1356 3103 1142 2972
+Q 928 2841 928 2578
+Q 928 2378 1081 2264
+Q 1234 2150 1697 2047
+L 1894 2003
+Q 2506 1872 2764 1633
+Q 3022 1394 3022 966
+Q 3022 478 2636 193
+Q 2250 -91 1575 -91
+Q 1294 -91 989 -36
+Q 684 19 347 128
+L 347 722
+Q 666 556 975 473
+Q 1284 391 1588 391
+Q 1994 391 2212 530
+Q 2431 669 2431 922
+Q 2431 1156 2273 1281
+Q 2116 1406 1581 1522
+L 1381 1569
+Q 847 1681 609 1914
+Q 372 2147 372 2553
+Q 372 3047 722 3315
+Q 1072 3584 1716 3584
+Q 2034 3584 2315 3537
+Q 2597 3491 2834 3397
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-68" d="M 3513 2113
+L 3513 0
+L 2938 0
+L 2938 2094
+Q 2938 2591 2744 2837
+Q 2550 3084 2163 3084
+Q 1697 3084 1428 2787
+Q 1159 2491 1159 1978
+L 1159 0
+L 581 0
+L 581 4863
+L 1159 4863
+L 1159 2956
+Q 1366 3272 1645 3428
+Q 1925 3584 2291 3584
+Q 2894 3584 3203 3211
+Q 3513 2838 3513 2113
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894
+L 3597 1613
+L 953 1613
+Q 991 1019 1311 708
+Q 1631 397 2203 397
+Q 2534 397 2845 478
+Q 3156 559 3463 722
+L 3463 178
+Q 3153 47 2828 -22
+Q 2503 -91 2169 -91
+Q 1331 -91 842 396
+Q 353 884 353 1716
+Q 353 2575 817 3079
+Q 1281 3584 2069 3584
+Q 2775 3584 3186 3129
+Q 3597 2675 3597 1894
+z
+M 3022 2063
+Q 3016 2534 2758 2815
+Q 2500 3097 2075 3097
+Q 1594 3097 1305 2825
+Q 1016 2553 972 2059
+L 3022 2063
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-70"/>
+      <use xlink:href="#DejaVuSans-61" x="63.476562"/>
+      <use xlink:href="#DejaVuSans-72" x="124.755859"/>
+      <use xlink:href="#DejaVuSans-74" x="165.869141"/>
+      <use xlink:href="#DejaVuSans-69" x="205.078125"/>
+      <use xlink:href="#DejaVuSans-74" x="232.861328"/>
+      <use xlink:href="#DejaVuSans-69" x="272.070312"/>
+      <use xlink:href="#DejaVuSans-6f" x="299.853516"/>
+      <use xlink:href="#DejaVuSans-6e" x="361.035156"/>
+      <use xlink:href="#DejaVuSans-20" x="424.414062"/>
+      <use xlink:href="#DejaVuSans-73" x="456.201172"/>
+      <use xlink:href="#DejaVuSans-68" x="508.300781"/>
+      <use xlink:href="#DejaVuSans-61" x="571.679688"/>
+      <use xlink:href="#DejaVuSans-70" x="632.958984"/>
+      <use xlink:href="#DejaVuSans-65" x="696.435547"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_19">
+      <path d="M 53.328125 583.550264
+L 890.328125 583.550264
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_20">
+      <defs>
+       <path id="md1946cda19" d="M 0 0
+L -3.5 0
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#md1946cda19" x="53.328125" y="583.550264" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 6000 -->
+      <g transform="translate(20.878125 587.349482) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_21">
+      <path d="M 53.328125 517.750068
+L 890.328125 517.750068
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_22">
+      <g>
+       <use xlink:href="#md1946cda19" x="53.328125" y="517.750068" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 6200 -->
+      <g transform="translate(20.878125 521.549287) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_23">
+      <path d="M 53.328125 451.949873
+L 890.328125 451.949873
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_24">
+      <g>
+       <use xlink:href="#md1946cda19" x="53.328125" y="451.949873" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 6400 -->
+      <g transform="translate(20.878125 455.749092) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-34" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_25">
+      <path d="M 53.328125 386.149678
+L 890.328125 386.149678
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_26">
+      <g>
+       <use xlink:href="#md1946cda19" x="53.328125" y="386.149678" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 6600 -->
+      <g transform="translate(20.878125 389.948897) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-36" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_27">
+      <path d="M 53.328125 320.349483
+L 890.328125 320.349483
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_28">
+      <g>
+       <use xlink:href="#md1946cda19" x="53.328125" y="320.349483" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 6800 -->
+      <g transform="translate(20.878125 324.148702) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-38" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_29">
+      <path d="M 53.328125 254.549288
+L 890.328125 254.549288
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_30">
+      <g>
+       <use xlink:href="#md1946cda19" x="53.328125" y="254.549288" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_16">
+      <!-- 7000 -->
+      <g transform="translate(20.878125 258.348507) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-37"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_7">
+     <g id="line2d_31">
+      <path d="M 53.328125 188.749093
+L 890.328125 188.749093
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_32">
+      <g>
+       <use xlink:href="#md1946cda19" x="53.328125" y="188.749093" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_17">
+      <!-- 7200 -->
+      <g transform="translate(20.878125 192.548312) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-37"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_8">
+     <g id="line2d_33">
+      <path d="M 53.328125 122.948898
+L 890.328125 122.948898
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_34">
+      <g>
+       <use xlink:href="#md1946cda19" x="53.328125" y="122.948898" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_18">
+      <!-- 7400 -->
+      <g transform="translate(20.878125 126.748117) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-37"/>
+       <use xlink:href="#DejaVuSans-34" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_19">
+     <!-- duration (Unit.millisecond) ± stddev (count=3) -->
+     <g transform="translate(14.798438 474.241406) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-64" d="M 2906 2969
+L 2906 4863
+L 3481 4863
+L 3481 0
+L 2906 0
+L 2906 525
+Q 2725 213 2448 61
+Q 2172 -91 1784 -91
+Q 1150 -91 751 415
+Q 353 922 353 1747
+Q 353 2572 751 3078
+Q 1150 3584 1784 3584
+Q 2172 3584 2448 3432
+Q 2725 3281 2906 2969
+z
+M 947 1747
+Q 947 1113 1208 752
+Q 1469 391 1925 391
+Q 2381 391 2643 752
+Q 2906 1113 2906 1747
+Q 2906 2381 2643 2742
+Q 2381 3103 1925 3103
+Q 1469 3103 1208 2742
+Q 947 2381 947 1747
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-75" d="M 544 1381
+L 544 3500
+L 1119 3500
+L 1119 1403
+Q 1119 906 1312 657
+Q 1506 409 1894 409
+Q 2359 409 2629 706
+Q 2900 1003 2900 1516
+L 2900 3500
+L 3475 3500
+L 3475 0
+L 2900 0
+L 2900 538
+Q 2691 219 2414 64
+Q 2138 -91 1772 -91
+Q 1169 -91 856 284
+Q 544 659 544 1381
+z
+M 1991 3584
+L 1991 3584
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-55" d="M 556 4666
+L 1191 4666
+L 1191 1831
+Q 1191 1081 1462 751
+Q 1734 422 2344 422
+Q 2950 422 3222 751
+Q 3494 1081 3494 1831
+L 3494 4666
+L 4128 4666
+L 4128 1753
+Q 4128 841 3676 375
+Q 3225 -91 2344 -91
+Q 1459 -91 1007 375
+Q 556 841 556 1753
+L 556 4666
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2e" d="M 684 794
+L 1344 794
+L 1344 0
+L 684 0
+L 684 794
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828
+Q 3544 3216 3844 3400
+Q 4144 3584 4550 3584
+Q 5097 3584 5394 3201
+Q 5691 2819 5691 2113
+L 5691 0
+L 5113 0
+L 5113 2094
+Q 5113 2597 4934 2840
+Q 4756 3084 4391 3084
+Q 3944 3084 3684 2787
+Q 3425 2491 3425 1978
+L 3425 0
+L 2847 0
+L 2847 2094
+Q 2847 2600 2669 2842
+Q 2491 3084 2119 3084
+Q 1678 3084 1418 2786
+Q 1159 2488 1159 1978
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1356 3278 1631 3431
+Q 1906 3584 2284 3584
+Q 2666 3584 2933 3390
+Q 3200 3197 3328 2828
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863
+L 1178 4863
+L 1178 0
+L 603 0
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366
+L 3122 2828
+Q 2878 2963 2633 3030
+Q 2388 3097 2138 3097
+Q 1578 3097 1268 2742
+Q 959 2388 959 1747
+Q 959 1106 1268 751
+Q 1578 397 2138 397
+Q 2388 397 2633 464
+Q 2878 531 3122 666
+L 3122 134
+Q 2881 22 2623 -34
+Q 2366 -91 2075 -91
+Q 1284 -91 818 406
+Q 353 903 353 1747
+Q 353 2603 823 3093
+Q 1294 3584 2113 3584
+Q 2378 3584 2631 3529
+Q 2884 3475 3122 3366
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-b1" d="M 2944 4013
+L 2944 2803
+L 4684 2803
+L 4684 2272
+L 2944 2272
+L 2944 1063
+L 2419 1063
+L 2419 2272
+L 678 2272
+L 678 2803
+L 2419 2803
+L 2419 4013
+L 2944 4013
+z
+M 678 531
+L 4684 531
+L 4684 0
+L 678 0
+L 678 531
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-76" d="M 191 3500
+L 800 3500
+L 1894 563
+L 2988 3500
+L 3597 3500
+L 2284 0
+L 1503 0
+L 191 3500
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-3d" d="M 678 2906
+L 4684 2906
+L 4684 2381
+L 678 2381
+L 678 2906
+z
+M 678 1631
+L 4684 1631
+L 4684 1100
+L 678 1100
+L 678 1631
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-64"/>
+      <use xlink:href="#DejaVuSans-75" x="63.476562"/>
+      <use xlink:href="#DejaVuSans-72" x="126.855469"/>
+      <use xlink:href="#DejaVuSans-61" x="167.96875"/>
+      <use xlink:href="#DejaVuSans-74" x="229.248047"/>
+      <use xlink:href="#DejaVuSans-69" x="268.457031"/>
+      <use xlink:href="#DejaVuSans-6f" x="296.240234"/>
+      <use xlink:href="#DejaVuSans-6e" x="357.421875"/>
+      <use xlink:href="#DejaVuSans-20" x="420.800781"/>
+      <use xlink:href="#DejaVuSans-28" x="452.587891"/>
+      <use xlink:href="#DejaVuSans-55" x="491.601562"/>
+      <use xlink:href="#DejaVuSans-6e" x="564.794922"/>
+      <use xlink:href="#DejaVuSans-69" x="628.173828"/>
+      <use xlink:href="#DejaVuSans-74" x="655.957031"/>
+      <use xlink:href="#DejaVuSans-2e" x="695.166016"/>
+      <use xlink:href="#DejaVuSans-6d" x="726.953125"/>
+      <use xlink:href="#DejaVuSans-69" x="824.365234"/>
+      <use xlink:href="#DejaVuSans-6c" x="852.148438"/>
+      <use xlink:href="#DejaVuSans-6c" x="879.931641"/>
+      <use xlink:href="#DejaVuSans-69" x="907.714844"/>
+      <use xlink:href="#DejaVuSans-73" x="935.498047"/>
+      <use xlink:href="#DejaVuSans-65" x="987.597656"/>
+      <use xlink:href="#DejaVuSans-63" x="1049.121094"/>
+      <use xlink:href="#DejaVuSans-6f" x="1104.101562"/>
+      <use xlink:href="#DejaVuSans-6e" x="1165.283203"/>
+      <use xlink:href="#DejaVuSans-64" x="1228.662109"/>
+      <use xlink:href="#DejaVuSans-29" x="1292.138672"/>
+      <use xlink:href="#DejaVuSans-20" x="1331.152344"/>
+      <use xlink:href="#DejaVuSans-b1" x="1362.939453"/>
+      <use xlink:href="#DejaVuSans-20" x="1446.728516"/>
+      <use xlink:href="#DejaVuSans-73" x="1478.515625"/>
+      <use xlink:href="#DejaVuSans-74" x="1530.615234"/>
+      <use xlink:href="#DejaVuSans-64" x="1569.824219"/>
+      <use xlink:href="#DejaVuSans-64" x="1633.300781"/>
+      <use xlink:href="#DejaVuSans-65" x="1696.777344"/>
+      <use xlink:href="#DejaVuSans-76" x="1758.300781"/>
+      <use xlink:href="#DejaVuSans-20" x="1817.480469"/>
+      <use xlink:href="#DejaVuSans-28" x="1849.267578"/>
+      <use xlink:href="#DejaVuSans-63" x="1888.28125"/>
+      <use xlink:href="#DejaVuSans-6f" x="1943.261719"/>
+      <use xlink:href="#DejaVuSans-75" x="2004.443359"/>
+      <use xlink:href="#DejaVuSans-6e" x="2067.822266"/>
+      <use xlink:href="#DejaVuSans-74" x="2131.201172"/>
+      <use xlink:href="#DejaVuSans-3d" x="2170.410156"/>
+      <use xlink:href="#DejaVuSans-33" x="2254.199219"/>
+      <use xlink:href="#DejaVuSans-29" x="2317.822266"/>
+     </g>
+    </g>
+   </g>
+   <g id="LineCollection_1">
+    <path d="M 91.37358 323.396612
+L 91.37358 238.122786
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 186.147444 527.153372
+L 186.147444 450.881261
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 281.500405 591.338262
+L 281.500405 518.077428
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 376.051306 595.38122
+L 376.051306 538.380542
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 471.823559 608.4
+L 471.823559 528.213103
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 566.388158 561.134743
+L 566.388158 495.860124
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 662.098773 539.936007
+L 662.098773 512.014179
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 756.154285 539.685669
+L 756.154285 430.452941
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 852.28267 241.514092
+L 852.28267 104.4
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+   </g>
+   <g id="line2d_35">
+    <path d="M 91.37358 280.759699
+L 186.147444 489.017317
+L 281.500405 554.707845
+L 376.051306 566.880881
+L 471.823559 568.306552
+L 566.388158 528.497434
+L 662.098773 525.975093
+L 756.154285 485.069305
+L 852.28267 172.957046
+" clip-path="url(#pfe508e9439)" style="fill: none; stroke: #5e81ac; stroke-width: 2; stroke-linecap: square"/>
+    <defs>
+     <path id="m67eb3fadf8" d="M 0 3
+C 0.795609 3 1.55874 2.683901 2.12132 2.12132
+C 2.683901 1.55874 3 0.795609 3 0
+C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132
+C 1.55874 -2.683901 0.795609 -3 0 -3
+C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132
+C -2.683901 -1.55874 -3 -0.795609 -3 0
+C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132
+C -1.55874 2.683901 -0.795609 3 0 3
+z
+" style="stroke: #5e81ac"/>
+    </defs>
+    <g clip-path="url(#pfe508e9439)">
+     <use xlink:href="#m67eb3fadf8" x="91.37358" y="280.759699" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#m67eb3fadf8" x="186.147444" y="489.017317" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#m67eb3fadf8" x="281.500405" y="554.707845" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#m67eb3fadf8" x="376.051306" y="566.880881" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#m67eb3fadf8" x="471.823559" y="568.306552" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#m67eb3fadf8" x="566.388158" y="528.497434" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#m67eb3fadf8" x="662.098773" y="525.975093" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#m67eb3fadf8" x="756.154285" y="485.069305" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#m67eb3fadf8" x="852.28267" y="172.957046" style="fill: #5e81ac; stroke: #5e81ac"/>
+    </g>
+   </g>
+   <g id="patch_3">
+    <path d="M 53.328125 633.6
+L 53.328125 79.2
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 890.328125 633.6
+L 890.328125 79.2
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 53.328125 633.6
+L 890.328125 633.6
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 53.328125 79.2
+L 890.328125 79.2
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="text_20">
+    <!-- 10000x10000 (100000000) -->
+    <g transform="translate(389.155625 73.2) scale(0.12 -0.12)">
+     <use xlink:href="#DejaVuSans-31"/>
+     <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+     <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+     <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+     <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+     <use xlink:href="#DejaVuSans-78" x="318.115234"/>
+     <use xlink:href="#DejaVuSans-31" x="377.294922"/>
+     <use xlink:href="#DejaVuSans-30" x="440.917969"/>
+     <use xlink:href="#DejaVuSans-30" x="504.541016"/>
+     <use xlink:href="#DejaVuSans-30" x="568.164062"/>
+     <use xlink:href="#DejaVuSans-30" x="631.787109"/>
+     <use xlink:href="#DejaVuSans-20" x="695.410156"/>
+     <use xlink:href="#DejaVuSans-28" x="727.197266"/>
+     <use xlink:href="#DejaVuSans-31" x="766.210938"/>
+     <use xlink:href="#DejaVuSans-30" x="829.833984"/>
+     <use xlink:href="#DejaVuSans-30" x="893.457031"/>
+     <use xlink:href="#DejaVuSans-30" x="957.080078"/>
+     <use xlink:href="#DejaVuSans-30" x="1020.703125"/>
+     <use xlink:href="#DejaVuSans-30" x="1084.326172"/>
+     <use xlink:href="#DejaVuSans-30" x="1147.949219"/>
+     <use xlink:href="#DejaVuSans-30" x="1211.572266"/>
+     <use xlink:href="#DejaVuSans-30" x="1275.195312"/>
+     <use xlink:href="#DejaVuSans-29" x="1338.818359"/>
+    </g>
+   </g>
+  </g>
+  <g id="text_21">
+   <!-- game_of_life.py, orkney, Wed Oct 30 14:38:51 2024 -->
+   <g transform="translate(301.896875 16.318125) scale(0.12 -0.12)">
+    <defs>
+     <path id="DejaVuSans-67" d="M 2906 1791
+Q 2906 2416 2648 2759
+Q 2391 3103 1925 3103
+Q 1463 3103 1205 2759
+Q 947 2416 947 1791
+Q 947 1169 1205 825
+Q 1463 481 1925 481
+Q 2391 481 2648 825
+Q 2906 1169 2906 1791
+z
+M 3481 434
+Q 3481 -459 3084 -895
+Q 2688 -1331 1869 -1331
+Q 1566 -1331 1297 -1286
+Q 1028 -1241 775 -1147
+L 775 -588
+Q 1028 -725 1275 -790
+Q 1522 -856 1778 -856
+Q 2344 -856 2625 -561
+Q 2906 -266 2906 331
+L 2906 616
+Q 2728 306 2450 153
+Q 2172 0 1784 0
+Q 1141 0 747 490
+Q 353 981 353 1791
+Q 353 2603 747 3093
+Q 1141 3584 1784 3584
+Q 2172 3584 2450 3431
+Q 2728 3278 2906 2969
+L 2906 3500
+L 3481 3500
+L 3481 434
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-5f" d="M 3263 -1063
+L 3263 -1509
+L -63 -1509
+L -63 -1063
+L 3263 -1063
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-66" d="M 2375 4863
+L 2375 4384
+L 1825 4384
+Q 1516 4384 1395 4259
+Q 1275 4134 1275 3809
+L 1275 3500
+L 2222 3500
+L 2222 3053
+L 1275 3053
+L 1275 0
+L 697 0
+L 697 3053
+L 147 3053
+L 147 3500
+L 697 3500
+L 697 3744
+Q 697 4328 969 4595
+Q 1241 4863 1831 4863
+L 2375 4863
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-79" d="M 2059 -325
+Q 1816 -950 1584 -1140
+Q 1353 -1331 966 -1331
+L 506 -1331
+L 506 -850
+L 844 -850
+Q 1081 -850 1212 -737
+Q 1344 -625 1503 -206
+L 1606 56
+L 191 3500
+L 800 3500
+L 1894 763
+L 2988 3500
+L 3597 3500
+L 2059 -325
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-2c" d="M 750 794
+L 1409 794
+L 1409 256
+L 897 -744
+L 494 -744
+L 750 256
+L 750 794
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-6b" d="M 581 4863
+L 1159 4863
+L 1159 1991
+L 2875 3500
+L 3609 3500
+L 1753 1863
+L 3688 0
+L 2938 0
+L 1159 1709
+L 1159 0
+L 581 0
+L 581 4863
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-57" d="M 213 4666
+L 850 4666
+L 1831 722
+L 2809 4666
+L 3519 4666
+L 4500 722
+L 5478 4666
+L 6119 4666
+L 4947 0
+L 4153 0
+L 3169 4050
+L 2175 0
+L 1381 0
+L 213 4666
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-4f" d="M 2522 4238
+Q 1834 4238 1429 3725
+Q 1025 3213 1025 2328
+Q 1025 1447 1429 934
+Q 1834 422 2522 422
+Q 3209 422 3611 934
+Q 4013 1447 4013 2328
+Q 4013 3213 3611 3725
+Q 3209 4238 2522 4238
+z
+M 2522 4750
+Q 3503 4750 4090 4092
+Q 4678 3434 4678 2328
+Q 4678 1225 4090 567
+Q 3503 -91 2522 -91
+Q 1538 -91 948 565
+Q 359 1222 359 2328
+Q 359 3434 948 4092
+Q 1538 4750 2522 4750
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-3a" d="M 750 794
+L 1409 794
+L 1409 0
+L 750 0
+L 750 794
+z
+M 750 3309
+L 1409 3309
+L 1409 2516
+L 750 2516
+L 750 3309
+z
+" transform="scale(0.015625)"/>
+    </defs>
+    <use xlink:href="#DejaVuSans-67"/>
+    <use xlink:href="#DejaVuSans-61" x="63.476562"/>
+    <use xlink:href="#DejaVuSans-6d" x="124.755859"/>
+    <use xlink:href="#DejaVuSans-65" x="222.167969"/>
+    <use xlink:href="#DejaVuSans-5f" x="283.691406"/>
+    <use xlink:href="#DejaVuSans-6f" x="333.691406"/>
+    <use xlink:href="#DejaVuSans-66" x="394.873047"/>
+    <use xlink:href="#DejaVuSans-5f" x="430.078125"/>
+    <use xlink:href="#DejaVuSans-6c" x="480.078125"/>
+    <use xlink:href="#DejaVuSans-69" x="507.861328"/>
+    <use xlink:href="#DejaVuSans-66" x="535.644531"/>
+    <use xlink:href="#DejaVuSans-65" x="570.849609"/>
+    <use xlink:href="#DejaVuSans-2e" x="632.373047"/>
+    <use xlink:href="#DejaVuSans-70" x="664.160156"/>
+    <use xlink:href="#DejaVuSans-79" x="727.636719"/>
+    <use xlink:href="#DejaVuSans-2c" x="786.816406"/>
+    <use xlink:href="#DejaVuSans-20" x="818.603516"/>
+    <use xlink:href="#DejaVuSans-6f" x="850.390625"/>
+    <use xlink:href="#DejaVuSans-72" x="911.572266"/>
+    <use xlink:href="#DejaVuSans-6b" x="952.685547"/>
+    <use xlink:href="#DejaVuSans-6e" x="1010.595703"/>
+    <use xlink:href="#DejaVuSans-65" x="1073.974609"/>
+    <use xlink:href="#DejaVuSans-79" x="1135.498047"/>
+    <use xlink:href="#DejaVuSans-2c" x="1194.677734"/>
+    <use xlink:href="#DejaVuSans-20" x="1226.464844"/>
+    <use xlink:href="#DejaVuSans-57" x="1258.251953"/>
+    <use xlink:href="#DejaVuSans-65" x="1351.253906"/>
+    <use xlink:href="#DejaVuSans-64" x="1412.777344"/>
+    <use xlink:href="#DejaVuSans-20" x="1476.253906"/>
+    <use xlink:href="#DejaVuSans-4f" x="1508.041016"/>
+    <use xlink:href="#DejaVuSans-63" x="1586.751953"/>
+    <use xlink:href="#DejaVuSans-74" x="1641.732422"/>
+    <use xlink:href="#DejaVuSans-20" x="1680.941406"/>
+    <use xlink:href="#DejaVuSans-33" x="1712.728516"/>
+    <use xlink:href="#DejaVuSans-30" x="1776.351562"/>
+    <use xlink:href="#DejaVuSans-20" x="1839.974609"/>
+    <use xlink:href="#DejaVuSans-31" x="1871.761719"/>
+    <use xlink:href="#DejaVuSans-34" x="1935.384766"/>
+    <use xlink:href="#DejaVuSans-3a" x="1999.007812"/>
+    <use xlink:href="#DejaVuSans-33" x="2032.699219"/>
+    <use xlink:href="#DejaVuSans-38" x="2096.322266"/>
+    <use xlink:href="#DejaVuSans-3a" x="2159.945312"/>
+    <use xlink:href="#DejaVuSans-35" x="2193.636719"/>
+    <use xlink:href="#DejaVuSans-31" x="2257.259766"/>
+    <use xlink:href="#DejaVuSans-20" x="2320.882812"/>
+    <use xlink:href="#DejaVuSans-32" x="2352.669922"/>
+    <use xlink:href="#DejaVuSans-30" x="2416.292969"/>
+    <use xlink:href="#DejaVuSans-32" x="2479.916016"/>
+    <use xlink:href="#DejaVuSans-34" x="2543.539062"/>
+   </g>
+   <!-- Partition shape scalability experiment (core_numa_node) -->
+   <g transform="translate(287.193125 30.08925) scale(0.12 -0.12)">
+    <defs>
+     <path id="DejaVuSans-50" d="M 1259 4147
+L 1259 2394
+L 2053 2394
+Q 2494 2394 2734 2622
+Q 2975 2850 2975 3272
+Q 2975 3691 2734 3919
+Q 2494 4147 2053 4147
+L 1259 4147
+z
+M 628 4666
+L 2053 4666
+Q 2838 4666 3239 4311
+Q 3641 3956 3641 3272
+Q 3641 2581 3239 2228
+Q 2838 1875 2053 1875
+L 1259 1875
+L 1259 0
+L 628 0
+L 628 4666
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-62" d="M 3116 1747
+Q 3116 2381 2855 2742
+Q 2594 3103 2138 3103
+Q 1681 3103 1420 2742
+Q 1159 2381 1159 1747
+Q 1159 1113 1420 752
+Q 1681 391 2138 391
+Q 2594 391 2855 752
+Q 3116 1113 3116 1747
+z
+M 1159 2969
+Q 1341 3281 1617 3432
+Q 1894 3584 2278 3584
+Q 2916 3584 3314 3078
+Q 3713 2572 3713 1747
+Q 3713 922 3314 415
+Q 2916 -91 2278 -91
+Q 1894 -91 1617 61
+Q 1341 213 1159 525
+L 1159 0
+L 581 0
+L 581 4863
+L 1159 4863
+L 1159 2969
+z
+" transform="scale(0.015625)"/>
+    </defs>
+    <use xlink:href="#DejaVuSans-50"/>
+    <use xlink:href="#DejaVuSans-61" x="55.802734"/>
+    <use xlink:href="#DejaVuSans-72" x="117.082031"/>
+    <use xlink:href="#DejaVuSans-74" x="158.195312"/>
+    <use xlink:href="#DejaVuSans-69" x="197.404297"/>
+    <use xlink:href="#DejaVuSans-74" x="225.1875"/>
+    <use xlink:href="#DejaVuSans-69" x="264.396484"/>
+    <use xlink:href="#DejaVuSans-6f" x="292.179688"/>
+    <use xlink:href="#DejaVuSans-6e" x="353.361328"/>
+    <use xlink:href="#DejaVuSans-20" x="416.740234"/>
+    <use xlink:href="#DejaVuSans-73" x="448.527344"/>
+    <use xlink:href="#DejaVuSans-68" x="500.626953"/>
+    <use xlink:href="#DejaVuSans-61" x="564.005859"/>
+    <use xlink:href="#DejaVuSans-70" x="625.285156"/>
+    <use xlink:href="#DejaVuSans-65" x="688.761719"/>
+    <use xlink:href="#DejaVuSans-20" x="750.285156"/>
+    <use xlink:href="#DejaVuSans-73" x="782.072266"/>
+    <use xlink:href="#DejaVuSans-63" x="834.171875"/>
+    <use xlink:href="#DejaVuSans-61" x="889.152344"/>
+    <use xlink:href="#DejaVuSans-6c" x="950.431641"/>
+    <use xlink:href="#DejaVuSans-61" x="978.214844"/>
+    <use xlink:href="#DejaVuSans-62" x="1039.494141"/>
+    <use xlink:href="#DejaVuSans-69" x="1102.970703"/>
+    <use xlink:href="#DejaVuSans-6c" x="1130.753906"/>
+    <use xlink:href="#DejaVuSans-69" x="1158.537109"/>
+    <use xlink:href="#DejaVuSans-74" x="1186.320312"/>
+    <use xlink:href="#DejaVuSans-79" x="1225.529297"/>
+    <use xlink:href="#DejaVuSans-20" x="1284.708984"/>
+    <use xlink:href="#DejaVuSans-65" x="1316.496094"/>
+    <use xlink:href="#DejaVuSans-78" x="1376.269531"/>
+    <use xlink:href="#DejaVuSans-70" x="1435.449219"/>
+    <use xlink:href="#DejaVuSans-65" x="1498.925781"/>
+    <use xlink:href="#DejaVuSans-72" x="1560.449219"/>
+    <use xlink:href="#DejaVuSans-69" x="1601.5625"/>
+    <use xlink:href="#DejaVuSans-6d" x="1629.345703"/>
+    <use xlink:href="#DejaVuSans-65" x="1726.757812"/>
+    <use xlink:href="#DejaVuSans-6e" x="1788.28125"/>
+    <use xlink:href="#DejaVuSans-74" x="1851.660156"/>
+    <use xlink:href="#DejaVuSans-20" x="1890.869141"/>
+    <use xlink:href="#DejaVuSans-28" x="1922.65625"/>
+    <use xlink:href="#DejaVuSans-63" x="1961.669922"/>
+    <use xlink:href="#DejaVuSans-6f" x="2016.650391"/>
+    <use xlink:href="#DejaVuSans-72" x="2077.832031"/>
+    <use xlink:href="#DejaVuSans-65" x="2116.695312"/>
+    <use xlink:href="#DejaVuSans-5f" x="2178.21875"/>
+    <use xlink:href="#DejaVuSans-6e" x="2228.21875"/>
+    <use xlink:href="#DejaVuSans-75" x="2291.597656"/>
+    <use xlink:href="#DejaVuSans-6d" x="2354.976562"/>
+    <use xlink:href="#DejaVuSans-61" x="2452.388672"/>
+    <use xlink:href="#DejaVuSans-5f" x="2513.667969"/>
+    <use xlink:href="#DejaVuSans-6e" x="2563.667969"/>
+    <use xlink:href="#DejaVuSans-6f" x="2627.046875"/>
+    <use xlink:href="#DejaVuSans-64" x="2688.228516"/>
+    <use xlink:href="#DejaVuSans-65" x="2751.705078"/>
+    <use xlink:href="#DejaVuSans-29" x="2813.228516"/>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="pfe508e9439">
+   <rect x="53.328125" y="79.2" width="837" height="554.4"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/document/doc/manual/quality_assurance/scalability/quick_start.md b/document/doc/manual/quality_assurance/scalability/quick_start.md
new file mode 100644
index 000000000..99e4f974f
--- /dev/null
+++ b/document/doc/manual/quality_assurance/scalability/quick_start.md
@@ -0,0 +1,307 @@
+(scalability-quick-start)=
+
+# Quick start
+
+Let us assume we want to perform [scalability experiments](#scalability-experiments) for a very simple model.
+This allows us to focus on the experiment itself rather than the model. We will skip over details for now, but
+provide links to reference pages with more information.
+
+Performing scalability experiments for a LUE computation translating rasters involves the following steps:
+
+1. Determine a good array partition shape
+1. Determine the strong or weak scalability efficiencies
+
+Performing scalability experiments involves a lot of book keeping. A model must be run several times and the
+time it stakes to perform all computations has to be saved for post-processing. Information to save includes
+the amount of hardware used, the shape of the arrays, the shape of the partitions, and the time it took. To
+help with this administration we will use the [lue_scalability.py](#lue-scalability) command[^build].
+
+[^build]: This command should be installed if LUE was [built](#install-source) with the option
+`LUE_BUILD_QUALITY_ASSURANCE=TRUE`.
+
+```{note}
+This quick start illustrates performing scalability experiments using a LUE model implemented using the Python
+language bindings, but everything works similar when using a model implemented using the C++ API.
+
+For simplicity we will be performing scalability experiments over the CPU cores within a single desktop
+computer here, but everything works similar when performing experiments over cluster nodes in a multi-node
+computer cluster.
+```
+
+
+## Model
+
+The model we will be using here is [Conway's Game of
+Life](https://en.wikipedia.org/wiki/Conway's_Game_of_Life). A version of the model that is capable of saving
+results as rasters is available in the [LUE tutorial
+repository](https://github.com/computationalgeography/lue_tutorial). For this quick start, we simplified that
+model to be (only) useful in scalability experiments. Here is the complete working model:
+
+```{literalinclude} game_of_life.py
+   :caption: game_of_life.py, with the code added for performing scalability experiments highlighted
+   :linenos:
+   :emphasize-lines: 9, 65, 67, 68, 70, 71, 73, 78, 79, 81, 83, 84
+```
+
+A few changes were made to the original model. First an import statement was added for the
+`scalability.instrument` sub-package. The code in this sub-package simplifies adhering to the requirements
+lue_scalability.py poses on a model.
+
+Next, the part of the model containing the code we want to measure the scalability of was identified. This is
+the code between the `run.start()`{l=python} and `run.wait()`{l=python} calls. The time it takes to execute
+the statements between those calls ends up in the result file, and is used for further processing. It is
+important that time spent on code that should not be part of the measurements has finished executing before
+calling `run.start()`{l=python} and that time spent on code that should be part of the measurements has
+finished executing before calling `run.end()`{l=python}.
+
+An experiment involves measuring the time it takes to perform one or more model runs. All measurements end up
+in the result file. More information about the `scalability.instrument` sub-package can be found in the
+[associated reference](#source-lue-qa-python) pages.
+
+
+## Configuration
+
+### Platform
+
+The lue_scalability.py command requires information about the platform used to perform the experiments on. In
+this example we will be using a platform called orkney, which is a desktop computer. Its configuration can be
+found in the [lue_qa repository](https://github.com/computationalgeography/lue_qa), in
+`configuration/orkney/platform.json`.
+
+```json
+{
+    "name": "orkney",
+    "scheduler": {
+        "kind": "shell"
+    },
+    "nr_cluster_nodes": 1,
+    "cluster_node": {
+        "nr_packages": 1,
+        "package": {
+            "nr_numa_nodes": 1,
+            "numa_node": {
+                "memory": 128,
+                "nr_cores": 12,
+                "core": {
+                    "nr_threads": 2
+                }
+            }
+        }
+    }
+}
+```
+
+The terminology used in describing a cluster node is inspired by the [Portable Hardware Locality
+(hwloc)](https://www.open-mpi.org/projects/hwloc/) software package.
+
+In case of multi-node computer clusters, scheduler can be "slurm" and several settings can be added as well,
+like the name of the partition to use. The lue_qa repository contains examples for those as well.
+
+
+### Worker
+
+Since we are using the orkney desktop computer as our platform here, the worker we are interested in here is
+the CPU core. The worker configuration file can be found in the lue_qa repository, in
+`configuration/orkney/core_numa_node/{partition_shape,strong_scalability,weak_scalability}.json`. For each
+kind of experiment (partition shape, strong scalability, weak scalability), a worker configuration can be
+provided. In the case of the strong and weak scalability experiments it is not unusual for the configurations
+to be the same, and a symbolic link can be used to refer to a single file containing this information.
+
+Example configuration for the partition shape experiment:
+
+```json
+{
+    "scenario": "core_numa_node",
+    "count": 3,
+    "locality_per": "numa_node",
+    "worker": {
+        "type": "thread",
+        "pool": {
+            "size": 12
+        }
+    }
+}
+```
+
+Example configuration for the strong and weak scalability experiments:
+
+```json
+{
+    "scenario": "core_numa_node",
+    "count": 3,
+    "locality_per": "numa_node",
+    "worker": {
+        "type": "thread",
+        "pool": {
+            "min_size": 1,
+            "max_size": 12,
+            "incrementor": 1
+        }
+    }
+}
+```
+
+The count is the number of times an experimental run should be repeated. Doing it more than once allows for
+the inspection of the spread in the resulting scalability metrics.
+
+
+### Experiment
+
+For each kind of experiment we must create a configuration file containing the settings lue_scalability.py
+must use. For the command to be able to find the correct configuration file, these files must be stored in a
+directory named after the the platform, kind of worker, command and kind of experiment. For the Game of Life
+model, example configuration files can be found in the lue_qa repository, in
+`experiment/configuration/orkney/game_of_life.py/core_numa_node`.
+
+Example configuration for the partition shape experiment:
+
+```json
+{
+    "array": {
+        "shape": [10000, 10000]
+    },
+    "partition": {
+        "shape": [500, 500],
+        "range": {
+            "max_nr_elements": 1250000,
+            "multiplier": 1.5,
+            "method": "linear"
+        }
+    },
+    "arguments": {
+        "positionals": [
+        ],
+        "options": {
+        }
+    }
+}
+```
+
+
+## Experiment
+
+### Partition shape
+
+Given the above configuration files we can start the scalability experiments. The first thing to do is to
+determine a good partition shape to use for the strong and weak scalability experiments. For this we can call
+lue_scalability.py with the prefixes of the paths containing the cluster, worker, and experiment configuration
+files. Additionally, we need to tell it that we want to perform a partition shape experiment. This results in
+a command like this:
+
+```bash
+# 50 Is a model-specific argument. In this case the number of generations
+# that we want the model to simulate
+lue_scalability.py \
+    partition_shape script game_of_life.py "50" orkney cpu_core \
+    ./lue_qa/configuration ./lue_qa/experiment /tmp/scalability
+```
+
+This command will create a Bash script for us, containing all the commands that need to be executed to end up
+with enough information to be able to select a good partition shape. The name of the script will be printed.
+Its name is based on the information passed in:
+`<result_prefix>/<cluster_name>/<worker_name>/<command_name>/<experiment_name>.sh`.
+
+Once the commands from this Bash script have finished executing, all results must be aggregated into a single
+LUE dataset called `scalability.lue`, using the same command as before, but using the import stage name
+instead of script:
+
+```bash
+lue_scalability.py \
+    partition_shape import game_of_life.py "50" orkney cpu_core \
+    ./lue_qa/configuration ./lue_qa/experiment /tmp/scalability
+```
+
+The last step of this experiment involves postprocessing the results. This results in various statistics
+ending up in the same LUE dataset as created in the previous step, as well as in a PDF containing a graph
+showing the latencies of performing the experimental runs for different partition shapes. For this we can
+again use the same command as before, but using the postprocess stage name instead of import:
+
+```bash
+lue_scalability.py \
+    partition_shape postprocess game_of_life.py "50" orkney cpu_core \
+    ./lue_qa/configuration ./lue_qa/experiment /tmp/scalability
+```
+
+The experiment is now finished and we can inspect the plot in `plot.pdf` to visually inspect the results. We
+are interested in a partition shape for which the latency is the lowest. In general we will have multiple
+options that have good (low) latencies.
+
+```{figure} partition_shape.svg
+---
+width: 75%
+---
+Latencies by partition shape. Note the range in good partition shapes resulting in low latencies. Partition
+shape 850x850 appears to be a good candidate.
+```
+
+
+### Strong scalability
+
+Performing a strong scalability experiment involves calling the same commands as in the partition shape
+experiment, but now using the strong_scalability experiment name instead of partition_shape:
+
+```bash
+lue_scalability.py \
+    strong_scalability script game_of_life.py "50" orkney cpu_core \
+    ./lue_qa/configuration ./lue_qa/experiment /tmp/scalability
+lue_scalability.py \
+    strong_scalability import game_of_life.py "50" orkney cpu_core \
+    ./lue_qa/configuration ./lue_qa/experiment /tmp/scalability
+lue_scalability.py \
+    strong_scalability postprocess game_of_life.py "50" orkney cpu_core \
+    ./lue_qa/configuration ./lue_qa/experiment /tmp/scalability
+```
+
+```{figure} strong_scalability.svg
+---
+width: 75%
+---
+Strong scalability efficiencies. The model executes almost 10 times faster when using all 12 CPU cores. The
+loss in efficiency compared to a linear scaling model is about 20%.
+```
+
+Both model users and LUE developers can be quite happy with these results. The model can actually use
+additional hardware to speed up the model, but there is still a challenge left for the developers to look
+into.
+
+
+### Weak scalability
+
+Performing a weak scalability experiment involves calling the same commands as in the partition shape and
+strong scalability experiment, but now using the weak_scalability experiment name:
+
+```bash
+lue_scalability.py \
+    weak_scalability script game_of_life.py "50" orkney cpu_core \
+    ./lue_qa/configuration ./lue_qa/experiment /tmp/scalability
+lue_scalability.py \
+    weak_scalability import game_of_life.py "50" orkney cpu_core \
+    ./lue_qa/configuration ./lue_qa/experiment /tmp/scalability
+lue_scalability.py \
+    weak_scalability postprocess game_of_life.py "50" orkney cpu_core \
+    ./lue_qa/configuration ./lue_qa/experiment /tmp/scalability
+```
+
+```{figure} weak_scalability.svg
+---
+width: 75%
+---
+Weak scalability efficiencies. The model takes a little bit more time when executing a 12 times larger problem
+using 12 CPU cores. The loss in efficiency compared to a linear scaling model is about 20%.
+```
+
+Given these results, model users can make good use of additional hardware to process larger datasets. As we
+learned already, there is still some room left for improvement.
+
+
+## Bash script
+
+To make it easy to start a scalability experiment for other models and on different platforms, below is the
+Bash script used to obtain the results presented above. To be able to run it the pathname of the directory of
+the command used in the experiment (`game_of_life.py` in this case) has to be added to `$PATH` (and LUE has to
+be installed, obviously).
+
+```{literalinclude} scalability.sh
+   :language: bash
+   :caption: scalability.sh
+```
diff --git a/document/doc/manual/quality_assurance/scalability/scalability.sh b/document/doc/manual/quality_assurance/scalability/scalability.sh
new file mode 100644
index 000000000..1515cee48
--- /dev/null
+++ b/document/doc/manual/quality_assurance/scalability/scalability.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+platform_config_prefix="$HOME/development/project/github/computational_geography/lue_qa/configuration"
+experiment_config_prefix="$HOME/development/project/github/computational_geography/lue_qa/experiment/configuration"
+result_prefix="/tmp/scalability"
+
+command_name="game_of_life.py"
+nr_generations=50
+command_arguments="$nr_generations"
+platform_name="orkney"
+worker_name="core_numa_node"
+
+experiment_names="
+    partition_shape
+    strong_scalability
+    weak_scalability
+"
+
+for experiment_name in $experiment_names;
+do
+    echo $experiment_name
+
+    lue_scalability.py \
+        $experiment_name script $command_name "$command_arguments" \
+        $platform_name $worker_name \
+        $platform_config_prefix $experiment_config_prefix $result_prefix
+
+    script="$result_prefix/$platform_name/$command_name/$worker_name/$experiment_name.sh"
+    bash $script
+
+    lue_scalability.py \
+        $experiment_name import $command_name "$command_arguments" \
+        $platform_name $worker_name \
+        $platform_config_prefix $experiment_config_prefix $result_prefix
+
+    lue_scalability.py \
+        $experiment_name postprocess $command_name "$command_arguments" \
+        $platform_name $worker_name \
+        $platform_config_prefix $experiment_config_prefix $result_prefix
+done
diff --git a/document/doc/manual/quality_assurance/scalability/strong_scalability.svg b/document/doc/manual/quality_assurance/scalability/strong_scalability.svg
new file mode 100644
index 000000000..5126840f1
--- /dev/null
+++ b/document/doc/manual/quality_assurance/scalability/strong_scalability.svg
@@ -0,0 +1,2846 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1069.890625pt" height="808.71625pt" viewBox="0 0 1069.890625 808.71625" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2024-10-30T15:45:43.476150</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.9.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 808.71625
+L 1069.890625 808.71625
+L 1069.890625 0
+L 0 0
+L 0 808.71625
+z
+" style="fill: none"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 59.690625 408.28
+L 465.508807 408.28
+L 465.508807 105.88
+L 59.690625 105.88
+L 59.690625 408.28
+z
+" style="fill: none"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <path d="M 78.136906 408.28
+L 78.136906 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_2">
+      <defs>
+       <path id="md57f27ebeb" d="M 0 0
+L 0 3.5
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#md57f27ebeb" x="78.136906" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 1 -->
+      <g transform="translate(74.955656 422.878438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531
+L 1825 531
+L 1825 4091
+L 703 3866
+L 703 4441
+L 1819 4666
+L 2450 4666
+L 2450 531
+L 3481 531
+L 3481 0
+L 794 0
+L 794 531
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_3">
+      <path d="M 111.675599 408.28
+L 111.675599 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="111.675599" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 2 -->
+      <g transform="translate(108.494349 422.878438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-32" d="M 1228 531
+L 3431 531
+L 3431 0
+L 469 0
+L 469 531
+Q 828 903 1448 1529
+Q 2069 2156 2228 2338
+Q 2531 2678 2651 2914
+Q 2772 3150 2772 3378
+Q 2772 3750 2511 3984
+Q 2250 4219 1831 4219
+Q 1534 4219 1204 4116
+Q 875 4013 500 3803
+L 500 4441
+Q 881 4594 1212 4672
+Q 1544 4750 1819 4750
+Q 2544 4750 2975 4387
+Q 3406 4025 3406 3419
+Q 3406 3131 3298 2873
+Q 3191 2616 2906 2266
+Q 2828 2175 2409 1742
+Q 1991 1309 1228 531
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-32"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_5">
+      <path d="M 145.214291 408.28
+L 145.214291 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="145.214291" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 3 -->
+      <g transform="translate(142.033041 422.878438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-33" d="M 2597 2516
+Q 3050 2419 3304 2112
+Q 3559 1806 3559 1356
+Q 3559 666 3084 287
+Q 2609 -91 1734 -91
+Q 1441 -91 1130 -33
+Q 819 25 488 141
+L 488 750
+Q 750 597 1062 519
+Q 1375 441 1716 441
+Q 2309 441 2620 675
+Q 2931 909 2931 1356
+Q 2931 1769 2642 2001
+Q 2353 2234 1838 2234
+L 1294 2234
+L 1294 2753
+L 1863 2753
+Q 2328 2753 2575 2939
+Q 2822 3125 2822 3475
+Q 2822 3834 2567 4026
+Q 2313 4219 1838 4219
+Q 1578 4219 1281 4162
+Q 984 4106 628 3988
+L 628 4550
+Q 988 4650 1302 4700
+Q 1616 4750 1894 4750
+Q 2613 4750 3031 4423
+Q 3450 4097 3450 3541
+Q 3450 3153 3228 2886
+Q 3006 2619 2597 2516
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-33"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_7">
+      <path d="M 178.752984 408.28
+L 178.752984 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="178.752984" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 4 -->
+      <g transform="translate(175.571734 422.878438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116
+L 825 1625
+L 2419 1625
+L 2419 4116
+z
+M 2253 4666
+L 3047 4666
+L 3047 1625
+L 3713 1625
+L 3713 1100
+L 3047 1100
+L 3047 0
+L 2419 0
+L 2419 1100
+L 313 1100
+L 313 1709
+L 2253 4666
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-34"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_9">
+      <path d="M 212.291677 408.28
+L 212.291677 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="212.291677" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 5 -->
+      <g transform="translate(209.110427 422.878438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666
+L 3169 4666
+L 3169 4134
+L 1269 4134
+L 1269 2991
+Q 1406 3038 1543 3061
+Q 1681 3084 1819 3084
+Q 2600 3084 3056 2656
+Q 3513 2228 3513 1497
+Q 3513 744 3044 326
+Q 2575 -91 1722 -91
+Q 1428 -91 1123 -41
+Q 819 9 494 109
+L 494 744
+Q 775 591 1075 516
+Q 1375 441 1709 441
+Q 2250 441 2565 725
+Q 2881 1009 2881 1497
+Q 2881 1984 2565 2268
+Q 2250 2553 1709 2553
+Q 1456 2553 1204 2497
+Q 953 2441 691 2322
+L 691 4666
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-35"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_11">
+      <path d="M 245.83037 408.28
+L 245.83037 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="245.83037" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 6 -->
+      <g transform="translate(242.64912 422.878438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-36" d="M 2113 2584
+Q 1688 2584 1439 2293
+Q 1191 2003 1191 1497
+Q 1191 994 1439 701
+Q 1688 409 2113 409
+Q 2538 409 2786 701
+Q 3034 994 3034 1497
+Q 3034 2003 2786 2293
+Q 2538 2584 2113 2584
+z
+M 3366 4563
+L 3366 3988
+Q 3128 4100 2886 4159
+Q 2644 4219 2406 4219
+Q 1781 4219 1451 3797
+Q 1122 3375 1075 2522
+Q 1259 2794 1537 2939
+Q 1816 3084 2150 3084
+Q 2853 3084 3261 2657
+Q 3669 2231 3669 1497
+Q 3669 778 3244 343
+Q 2819 -91 2113 -91
+Q 1303 -91 875 529
+Q 447 1150 447 2328
+Q 447 3434 972 4092
+Q 1497 4750 2381 4750
+Q 2619 4750 2861 4703
+Q 3103 4656 3366 4563
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-36"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_13">
+      <path d="M 279.369062 408.28
+L 279.369062 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_14">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="279.369062" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 7 -->
+      <g transform="translate(276.187812 422.878438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-37" d="M 525 4666
+L 3525 4666
+L 3525 4397
+L 1831 0
+L 1172 0
+L 2766 4134
+L 525 4134
+L 525 4666
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-37"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_8">
+     <g id="line2d_15">
+      <path d="M 312.907755 408.28
+L 312.907755 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_16">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="312.907755" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 8 -->
+      <g transform="translate(309.726505 422.878438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-38" d="M 2034 2216
+Q 1584 2216 1326 1975
+Q 1069 1734 1069 1313
+Q 1069 891 1326 650
+Q 1584 409 2034 409
+Q 2484 409 2743 651
+Q 3003 894 3003 1313
+Q 3003 1734 2745 1975
+Q 2488 2216 2034 2216
+z
+M 1403 2484
+Q 997 2584 770 2862
+Q 544 3141 544 3541
+Q 544 4100 942 4425
+Q 1341 4750 2034 4750
+Q 2731 4750 3128 4425
+Q 3525 4100 3525 3541
+Q 3525 3141 3298 2862
+Q 3072 2584 2669 2484
+Q 3125 2378 3379 2068
+Q 3634 1759 3634 1313
+Q 3634 634 3220 271
+Q 2806 -91 2034 -91
+Q 1263 -91 848 271
+Q 434 634 434 1313
+Q 434 1759 690 2068
+Q 947 2378 1403 2484
+z
+M 1172 3481
+Q 1172 3119 1398 2916
+Q 1625 2713 2034 2713
+Q 2441 2713 2670 2916
+Q 2900 3119 2900 3481
+Q 2900 3844 2670 4047
+Q 2441 4250 2034 4250
+Q 1625 4250 1398 4047
+Q 1172 3844 1172 3481
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-38"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_9">
+     <g id="line2d_17">
+      <path d="M 346.446448 408.28
+L 346.446448 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_18">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="346.446448" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 9 -->
+      <g transform="translate(343.265198 422.878438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-39" d="M 703 97
+L 703 672
+Q 941 559 1184 500
+Q 1428 441 1663 441
+Q 2288 441 2617 861
+Q 2947 1281 2994 2138
+Q 2813 1869 2534 1725
+Q 2256 1581 1919 1581
+Q 1219 1581 811 2004
+Q 403 2428 403 3163
+Q 403 3881 828 4315
+Q 1253 4750 1959 4750
+Q 2769 4750 3195 4129
+Q 3622 3509 3622 2328
+Q 3622 1225 3098 567
+Q 2575 -91 1691 -91
+Q 1453 -91 1209 -44
+Q 966 3 703 97
+z
+M 1959 2075
+Q 2384 2075 2632 2365
+Q 2881 2656 2881 3163
+Q 2881 3666 2632 3958
+Q 2384 4250 1959 4250
+Q 1534 4250 1286 3958
+Q 1038 3666 1038 3163
+Q 1038 2656 1286 2365
+Q 1534 2075 1959 2075
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-39"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_10">
+     <g id="line2d_19">
+      <path d="M 379.98514 408.28
+L 379.98514 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_20">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="379.98514" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 10 -->
+      <g transform="translate(373.62264 422.878438) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250
+Q 1547 4250 1301 3770
+Q 1056 3291 1056 2328
+Q 1056 1369 1301 889
+Q 1547 409 2034 409
+Q 2525 409 2770 889
+Q 3016 1369 3016 2328
+Q 3016 3291 2770 3770
+Q 2525 4250 2034 4250
+z
+M 2034 4750
+Q 2819 4750 3233 4129
+Q 3647 3509 3647 2328
+Q 3647 1150 3233 529
+Q 2819 -91 2034 -91
+Q 1250 -91 836 529
+Q 422 1150 422 2328
+Q 422 3509 836 4129
+Q 1250 4750 2034 4750
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_11">
+     <g id="line2d_21">
+      <path d="M 413.523833 408.28
+L 413.523833 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_22">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="413.523833" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 11 -->
+      <g transform="translate(407.161333 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-31" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_12">
+     <g id="line2d_23">
+      <path d="M 447.062526 408.28
+L 447.062526 105.88
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_24">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="447.062526" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 12 -->
+      <g transform="translate(440.700026 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_13">
+     <!-- workers (thread) -->
+     <g transform="translate(221.067685 436.556563) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-77" d="M 269 3500
+L 844 3500
+L 1563 769
+L 2278 3500
+L 2956 3500
+L 3675 769
+L 4391 3500
+L 4966 3500
+L 4050 0
+L 3372 0
+L 2619 2869
+L 1863 0
+L 1184 0
+L 269 3500
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097
+Q 1497 3097 1228 2736
+Q 959 2375 959 1747
+Q 959 1119 1226 758
+Q 1494 397 1959 397
+Q 2419 397 2687 759
+Q 2956 1122 2956 1747
+Q 2956 2369 2687 2733
+Q 2419 3097 1959 3097
+z
+M 1959 3584
+Q 2709 3584 3137 3096
+Q 3566 2609 3566 1747
+Q 3566 888 3137 398
+Q 2709 -91 1959 -91
+Q 1206 -91 779 398
+Q 353 888 353 1747
+Q 353 2609 779 3096
+Q 1206 3584 1959 3584
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-72" d="M 2631 2963
+Q 2534 3019 2420 3045
+Q 2306 3072 2169 3072
+Q 1681 3072 1420 2755
+Q 1159 2438 1159 1844
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1341 3275 1631 3429
+Q 1922 3584 2338 3584
+Q 2397 3584 2469 3576
+Q 2541 3569 2628 3553
+L 2631 2963
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6b" d="M 581 4863
+L 1159 4863
+L 1159 1991
+L 2875 3500
+L 3609 3500
+L 1753 1863
+L 3688 0
+L 2938 0
+L 1159 1709
+L 1159 0
+L 581 0
+L 581 4863
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894
+L 3597 1613
+L 953 1613
+Q 991 1019 1311 708
+Q 1631 397 2203 397
+Q 2534 397 2845 478
+Q 3156 559 3463 722
+L 3463 178
+Q 3153 47 2828 -22
+Q 2503 -91 2169 -91
+Q 1331 -91 842 396
+Q 353 884 353 1716
+Q 353 2575 817 3079
+Q 1281 3584 2069 3584
+Q 2775 3584 3186 3129
+Q 3597 2675 3597 1894
+z
+M 3022 2063
+Q 3016 2534 2758 2815
+Q 2500 3097 2075 3097
+Q 1594 3097 1305 2825
+Q 1016 2553 972 2059
+L 3022 2063
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-73" d="M 2834 3397
+L 2834 2853
+Q 2591 2978 2328 3040
+Q 2066 3103 1784 3103
+Q 1356 3103 1142 2972
+Q 928 2841 928 2578
+Q 928 2378 1081 2264
+Q 1234 2150 1697 2047
+L 1894 2003
+Q 2506 1872 2764 1633
+Q 3022 1394 3022 966
+Q 3022 478 2636 193
+Q 2250 -91 1575 -91
+Q 1294 -91 989 -36
+Q 684 19 347 128
+L 347 722
+Q 666 556 975 473
+Q 1284 391 1588 391
+Q 1994 391 2212 530
+Q 2431 669 2431 922
+Q 2431 1156 2273 1281
+Q 2116 1406 1581 1522
+L 1381 1569
+Q 847 1681 609 1914
+Q 372 2147 372 2553
+Q 372 3047 722 3315
+Q 1072 3584 1716 3584
+Q 2034 3584 2315 3537
+Q 2597 3491 2834 3397
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856
+Q 1566 4138 1362 3434
+Q 1159 2731 1159 2009
+Q 1159 1288 1364 580
+Q 1569 -128 1984 -844
+L 1484 -844
+Q 1016 -109 783 600
+Q 550 1309 550 2009
+Q 550 2706 781 3412
+Q 1013 4119 1484 4856
+L 1984 4856
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494
+L 1172 3500
+L 2356 3500
+L 2356 3053
+L 1172 3053
+L 1172 1153
+Q 1172 725 1289 603
+Q 1406 481 1766 481
+L 2356 481
+L 2356 0
+L 1766 0
+Q 1100 0 847 248
+Q 594 497 594 1153
+L 594 3053
+L 172 3053
+L 172 3500
+L 594 3500
+L 594 4494
+L 1172 4494
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-68" d="M 3513 2113
+L 3513 0
+L 2938 0
+L 2938 2094
+Q 2938 2591 2744 2837
+Q 2550 3084 2163 3084
+Q 1697 3084 1428 2787
+Q 1159 2491 1159 1978
+L 1159 0
+L 581 0
+L 581 4863
+L 1159 4863
+L 1159 2956
+Q 1366 3272 1645 3428
+Q 1925 3584 2291 3584
+Q 2894 3584 3203 3211
+Q 3513 2838 3513 2113
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759
+Q 1497 1759 1228 1600
+Q 959 1441 959 1056
+Q 959 750 1161 570
+Q 1363 391 1709 391
+Q 2188 391 2477 730
+Q 2766 1069 2766 1631
+L 2766 1759
+L 2194 1759
+z
+M 3341 1997
+L 3341 0
+L 2766 0
+L 2766 531
+Q 2569 213 2275 61
+Q 1981 -91 1556 -91
+Q 1019 -91 701 211
+Q 384 513 384 1019
+Q 384 1609 779 1909
+Q 1175 2209 1959 2209
+L 2766 2209
+L 2766 2266
+Q 2766 2663 2505 2880
+Q 2244 3097 1772 3097
+Q 1472 3097 1187 3025
+Q 903 2953 641 2809
+L 641 3341
+Q 956 3463 1253 3523
+Q 1550 3584 1831 3584
+Q 2591 3584 2966 3190
+Q 3341 2797 3341 1997
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-64" d="M 2906 2969
+L 2906 4863
+L 3481 4863
+L 3481 0
+L 2906 0
+L 2906 525
+Q 2725 213 2448 61
+Q 2172 -91 1784 -91
+Q 1150 -91 751 415
+Q 353 922 353 1747
+Q 353 2572 751 3078
+Q 1150 3584 1784 3584
+Q 2172 3584 2448 3432
+Q 2725 3281 2906 2969
+z
+M 947 1747
+Q 947 1113 1208 752
+Q 1469 391 1925 391
+Q 2381 391 2643 752
+Q 2906 1113 2906 1747
+Q 2906 2381 2643 2742
+Q 2381 3103 1925 3103
+Q 1469 3103 1208 2742
+Q 947 2381 947 1747
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856
+L 1013 4856
+Q 1481 4119 1714 3412
+Q 1947 2706 1947 2009
+Q 1947 1309 1714 600
+Q 1481 -109 1013 -844
+L 513 -844
+Q 928 -128 1133 580
+Q 1338 1288 1338 2009
+Q 1338 2731 1133 3434
+Q 928 4138 513 4856
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-77"/>
+      <use xlink:href="#DejaVuSans-6f" x="81.787109"/>
+      <use xlink:href="#DejaVuSans-72" x="142.96875"/>
+      <use xlink:href="#DejaVuSans-6b" x="184.082031"/>
+      <use xlink:href="#DejaVuSans-65" x="238.367188"/>
+      <use xlink:href="#DejaVuSans-72" x="299.890625"/>
+      <use xlink:href="#DejaVuSans-73" x="341.003906"/>
+      <use xlink:href="#DejaVuSans-20" x="393.103516"/>
+      <use xlink:href="#DejaVuSans-28" x="424.890625"/>
+      <use xlink:href="#DejaVuSans-74" x="463.904297"/>
+      <use xlink:href="#DejaVuSans-68" x="503.113281"/>
+      <use xlink:href="#DejaVuSans-72" x="566.492188"/>
+      <use xlink:href="#DejaVuSans-65" x="605.355469"/>
+      <use xlink:href="#DejaVuSans-61" x="666.878906"/>
+      <use xlink:href="#DejaVuSans-64" x="728.158203"/>
+      <use xlink:href="#DejaVuSans-29" x="791.634766"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_25">
+      <path d="M 59.690625 368.436793
+L 465.508807 368.436793
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_26">
+      <defs>
+       <path id="m57c2ef369f" d="M 0 0
+L -3.5 0
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m57c2ef369f" x="59.690625" y="368.436793" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 10000 -->
+      <g transform="translate(20.878125 372.236012) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_27">
+      <path d="M 59.690625 317.988212
+L 465.508807 317.988212
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_28">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="59.690625" y="317.988212" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 20000 -->
+      <g transform="translate(20.878125 321.787431) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_29">
+      <path d="M 59.690625 267.53963
+L 465.508807 267.53963
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_30">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="59.690625" y="267.53963" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_16">
+      <!-- 30000 -->
+      <g transform="translate(20.878125 271.338849) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_31">
+      <path d="M 59.690625 217.091048
+L 465.508807 217.091048
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_32">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="59.690625" y="217.091048" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_17">
+      <!-- 40000 -->
+      <g transform="translate(20.878125 220.890267) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_33">
+      <path d="M 59.690625 166.642467
+L 465.508807 166.642467
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_34">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="59.690625" y="166.642467" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_18">
+      <!-- 50000 -->
+      <g transform="translate(20.878125 170.441686) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-35"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_35">
+      <path d="M 59.690625 116.193885
+L 465.508807 116.193885
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_36">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="59.690625" y="116.193885" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_19">
+      <!-- 60000 -->
+      <g transform="translate(20.878125 119.993104) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_20">
+     <!-- duration (Unit.millisecond) ± stddev (count=3) -->
+     <g transform="translate(14.798438 374.921406) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-75" d="M 544 1381
+L 544 3500
+L 1119 3500
+L 1119 1403
+Q 1119 906 1312 657
+Q 1506 409 1894 409
+Q 2359 409 2629 706
+Q 2900 1003 2900 1516
+L 2900 3500
+L 3475 3500
+L 3475 0
+L 2900 0
+L 2900 538
+Q 2691 219 2414 64
+Q 2138 -91 1772 -91
+Q 1169 -91 856 284
+Q 544 659 544 1381
+z
+M 1991 3584
+L 1991 3584
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500
+L 1178 3500
+L 1178 0
+L 603 0
+L 603 3500
+z
+M 603 4863
+L 1178 4863
+L 1178 4134
+L 603 4134
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113
+L 3513 0
+L 2938 0
+L 2938 2094
+Q 2938 2591 2744 2837
+Q 2550 3084 2163 3084
+Q 1697 3084 1428 2787
+Q 1159 2491 1159 1978
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1366 3272 1645 3428
+Q 1925 3584 2291 3584
+Q 2894 3584 3203 3211
+Q 3513 2838 3513 2113
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-55" d="M 556 4666
+L 1191 4666
+L 1191 1831
+Q 1191 1081 1462 751
+Q 1734 422 2344 422
+Q 2950 422 3222 751
+Q 3494 1081 3494 1831
+L 3494 4666
+L 4128 4666
+L 4128 1753
+Q 4128 841 3676 375
+Q 3225 -91 2344 -91
+Q 1459 -91 1007 375
+Q 556 841 556 1753
+L 556 4666
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2e" d="M 684 794
+L 1344 794
+L 1344 0
+L 684 0
+L 684 794
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828
+Q 3544 3216 3844 3400
+Q 4144 3584 4550 3584
+Q 5097 3584 5394 3201
+Q 5691 2819 5691 2113
+L 5691 0
+L 5113 0
+L 5113 2094
+Q 5113 2597 4934 2840
+Q 4756 3084 4391 3084
+Q 3944 3084 3684 2787
+Q 3425 2491 3425 1978
+L 3425 0
+L 2847 0
+L 2847 2094
+Q 2847 2600 2669 2842
+Q 2491 3084 2119 3084
+Q 1678 3084 1418 2786
+Q 1159 2488 1159 1978
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1356 3278 1631 3431
+Q 1906 3584 2284 3584
+Q 2666 3584 2933 3390
+Q 3200 3197 3328 2828
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863
+L 1178 4863
+L 1178 0
+L 603 0
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366
+L 3122 2828
+Q 2878 2963 2633 3030
+Q 2388 3097 2138 3097
+Q 1578 3097 1268 2742
+Q 959 2388 959 1747
+Q 959 1106 1268 751
+Q 1578 397 2138 397
+Q 2388 397 2633 464
+Q 2878 531 3122 666
+L 3122 134
+Q 2881 22 2623 -34
+Q 2366 -91 2075 -91
+Q 1284 -91 818 406
+Q 353 903 353 1747
+Q 353 2603 823 3093
+Q 1294 3584 2113 3584
+Q 2378 3584 2631 3529
+Q 2884 3475 3122 3366
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-b1" d="M 2944 4013
+L 2944 2803
+L 4684 2803
+L 4684 2272
+L 2944 2272
+L 2944 1063
+L 2419 1063
+L 2419 2272
+L 678 2272
+L 678 2803
+L 2419 2803
+L 2419 4013
+L 2944 4013
+z
+M 678 531
+L 4684 531
+L 4684 0
+L 678 0
+L 678 531
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-76" d="M 191 3500
+L 800 3500
+L 1894 563
+L 2988 3500
+L 3597 3500
+L 2284 0
+L 1503 0
+L 191 3500
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-3d" d="M 678 2906
+L 4684 2906
+L 4684 2381
+L 678 2381
+L 678 2906
+z
+M 678 1631
+L 4684 1631
+L 4684 1100
+L 678 1100
+L 678 1631
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-64"/>
+      <use xlink:href="#DejaVuSans-75" x="63.476562"/>
+      <use xlink:href="#DejaVuSans-72" x="126.855469"/>
+      <use xlink:href="#DejaVuSans-61" x="167.96875"/>
+      <use xlink:href="#DejaVuSans-74" x="229.248047"/>
+      <use xlink:href="#DejaVuSans-69" x="268.457031"/>
+      <use xlink:href="#DejaVuSans-6f" x="296.240234"/>
+      <use xlink:href="#DejaVuSans-6e" x="357.421875"/>
+      <use xlink:href="#DejaVuSans-20" x="420.800781"/>
+      <use xlink:href="#DejaVuSans-28" x="452.587891"/>
+      <use xlink:href="#DejaVuSans-55" x="491.601562"/>
+      <use xlink:href="#DejaVuSans-6e" x="564.794922"/>
+      <use xlink:href="#DejaVuSans-69" x="628.173828"/>
+      <use xlink:href="#DejaVuSans-74" x="655.957031"/>
+      <use xlink:href="#DejaVuSans-2e" x="695.166016"/>
+      <use xlink:href="#DejaVuSans-6d" x="726.953125"/>
+      <use xlink:href="#DejaVuSans-69" x="824.365234"/>
+      <use xlink:href="#DejaVuSans-6c" x="852.148438"/>
+      <use xlink:href="#DejaVuSans-6c" x="879.931641"/>
+      <use xlink:href="#DejaVuSans-69" x="907.714844"/>
+      <use xlink:href="#DejaVuSans-73" x="935.498047"/>
+      <use xlink:href="#DejaVuSans-65" x="987.597656"/>
+      <use xlink:href="#DejaVuSans-63" x="1049.121094"/>
+      <use xlink:href="#DejaVuSans-6f" x="1104.101562"/>
+      <use xlink:href="#DejaVuSans-6e" x="1165.283203"/>
+      <use xlink:href="#DejaVuSans-64" x="1228.662109"/>
+      <use xlink:href="#DejaVuSans-29" x="1292.138672"/>
+      <use xlink:href="#DejaVuSans-20" x="1331.152344"/>
+      <use xlink:href="#DejaVuSans-b1" x="1362.939453"/>
+      <use xlink:href="#DejaVuSans-20" x="1446.728516"/>
+      <use xlink:href="#DejaVuSans-73" x="1478.515625"/>
+      <use xlink:href="#DejaVuSans-74" x="1530.615234"/>
+      <use xlink:href="#DejaVuSans-64" x="1569.824219"/>
+      <use xlink:href="#DejaVuSans-64" x="1633.300781"/>
+      <use xlink:href="#DejaVuSans-65" x="1696.777344"/>
+      <use xlink:href="#DejaVuSans-76" x="1758.300781"/>
+      <use xlink:href="#DejaVuSans-20" x="1817.480469"/>
+      <use xlink:href="#DejaVuSans-28" x="1849.267578"/>
+      <use xlink:href="#DejaVuSans-63" x="1888.28125"/>
+      <use xlink:href="#DejaVuSans-6f" x="1943.261719"/>
+      <use xlink:href="#DejaVuSans-75" x="2004.443359"/>
+      <use xlink:href="#DejaVuSans-6e" x="2067.822266"/>
+      <use xlink:href="#DejaVuSans-74" x="2131.201172"/>
+      <use xlink:href="#DejaVuSans-3d" x="2170.410156"/>
+      <use xlink:href="#DejaVuSans-33" x="2254.199219"/>
+      <use xlink:href="#DejaVuSans-29" x="2317.822266"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_37">
+    <path d="M 78.136906 126.675419
+L 111.675599 126.675419
+L 145.214291 126.675419
+L 178.752984 126.675419
+L 212.291677 126.675419
+L 245.83037 126.675419
+L 279.369062 126.675419
+L 312.907755 126.675419
+L 346.446448 126.675419
+L 379.98514 126.675419
+L 413.523833 126.675419
+L 447.062526 126.675419
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #bf616a; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_38">
+    <path d="M 78.136906 126.675419
+L 111.675599 272.780397
+L 145.214291 321.482056
+L 178.752984 345.832886
+L 212.291677 360.443384
+L 245.83037 370.183716
+L 279.369062 377.141096
+L 312.907755 382.359131
+L 346.446448 386.417602
+L 379.98514 389.66438
+L 413.523833 392.320834
+L 447.062526 394.534545
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #a3be8c; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="LineCollection_1">
+    <path d="M 78.136906 133.725383
+L 78.136906 119.625455
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 111.675599 274.742931
+L 111.675599 268.075142
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 145.214291 321.866059
+L 145.214291 317.02293
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 178.752984 344.9208
+L 178.752984 341.857345
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 212.291677 359.386348
+L 212.291677 356.483813
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 245.83037 368.605688
+L 245.83037 366.132242
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 279.369062 373.820824
+L 279.369062 372.103239
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 312.907755 378.043267
+L 312.907755 376.420059
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 346.446448 381.905058
+L 346.446448 380.145734
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 379.98514 384.618509
+L 379.98514 383.361674
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 413.523833 386.900999
+L 413.523833 385.411035
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 447.062526 388.611015
+L 447.062526 387.656187
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+   </g>
+   <g id="line2d_39">
+    <path d="M 78.136906 126.675419
+L 111.675599 271.409036
+L 145.214291 319.444494
+L 178.752984 343.389073
+L 212.291677 357.93508
+L 245.83037 367.368965
+L 279.369062 372.962031
+L 312.907755 377.231663
+L 346.446448 381.025396
+L 379.98514 383.990091
+L 413.523833 386.156017
+L 447.062526 388.133601
+" clip-path="url(#p84b6c0779c)" style="fill: none; stroke: #5e81ac; stroke-width: 2; stroke-linecap: square"/>
+    <defs>
+     <path id="mdbeaff0397" d="M 0 3
+C 0.795609 3 1.55874 2.683901 2.12132 2.12132
+C 2.683901 1.55874 3 0.795609 3 0
+C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132
+C 1.55874 -2.683901 0.795609 -3 0 -3
+C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132
+C -2.683901 -1.55874 -3 -0.795609 -3 0
+C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132
+C -1.55874 2.683901 -0.795609 3 0 3
+z
+" style="stroke: #5e81ac"/>
+    </defs>
+    <g clip-path="url(#p84b6c0779c)">
+     <use xlink:href="#mdbeaff0397" x="78.136906" y="126.675419" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="111.675599" y="271.409036" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="145.214291" y="319.444494" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="178.752984" y="343.389073" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="212.291677" y="357.93508" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="245.83037" y="367.368965" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="279.369062" y="372.962031" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="312.907755" y="377.231663" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="346.446448" y="381.025396" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="379.98514" y="383.990091" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="413.523833" y="386.156017" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="447.062526" y="388.133601" style="fill: #5e81ac; stroke: #5e81ac"/>
+    </g>
+   </g>
+   <g id="patch_3">
+    <path d="M 59.690625 408.28
+L 59.690625 105.88
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 465.508807 408.28
+L 465.508807 105.88
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 59.690625 408.28
+L 465.508807 408.28
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 59.690625 105.88
+L 465.508807 105.88
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+  </g>
+  <g id="axes_2">
+   <g id="patch_7">
+    <path d="M 546.672443 408.28
+L 952.490625 408.28
+L 952.490625 105.88
+L 546.672443 105.88
+L 546.672443 408.28
+z
+" style="fill: none"/>
+   </g>
+   <g id="matplotlib.axis_3">
+    <g id="xtick_13">
+     <g id="line2d_40">
+      <path d="M 565.118724 408.28
+L 565.118724 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_41">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="565.118724" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_21">
+      <!-- 1 -->
+      <g transform="translate(561.937474 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_14">
+     <g id="line2d_42">
+      <path d="M 598.657417 408.28
+L 598.657417 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_43">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="598.657417" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_22">
+      <!-- 2 -->
+      <g transform="translate(595.476167 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_15">
+     <g id="line2d_44">
+      <path d="M 632.19611 408.28
+L 632.19611 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_45">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="632.19611" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_23">
+      <!-- 3 -->
+      <g transform="translate(629.01486 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_16">
+     <g id="line2d_46">
+      <path d="M 665.734802 408.28
+L 665.734802 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_47">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="665.734802" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_24">
+      <!-- 4 -->
+      <g transform="translate(662.553552 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_17">
+     <g id="line2d_48">
+      <path d="M 699.273495 408.28
+L 699.273495 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_49">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="699.273495" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_25">
+      <!-- 5 -->
+      <g transform="translate(696.092245 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-35"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_18">
+     <g id="line2d_50">
+      <path d="M 732.812188 408.28
+L 732.812188 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_51">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="732.812188" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_26">
+      <!-- 6 -->
+      <g transform="translate(729.630938 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_19">
+     <g id="line2d_52">
+      <path d="M 766.35088 408.28
+L 766.35088 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_53">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="766.35088" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_27">
+      <!-- 7 -->
+      <g transform="translate(763.16963 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-37"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_20">
+     <g id="line2d_54">
+      <path d="M 799.889573 408.28
+L 799.889573 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_55">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="799.889573" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_28">
+      <!-- 8 -->
+      <g transform="translate(796.708323 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-38"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_21">
+     <g id="line2d_56">
+      <path d="M 833.428266 408.28
+L 833.428266 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_57">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="833.428266" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_29">
+      <!-- 9 -->
+      <g transform="translate(830.247016 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-39"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_22">
+     <g id="line2d_58">
+      <path d="M 866.966959 408.28
+L 866.966959 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_59">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="866.966959" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_30">
+      <!-- 10 -->
+      <g transform="translate(860.604459 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_23">
+     <g id="line2d_60">
+      <path d="M 900.505651 408.28
+L 900.505651 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_61">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="900.505651" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_31">
+      <!-- 11 -->
+      <g transform="translate(894.143151 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-31" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_24">
+     <g id="line2d_62">
+      <path d="M 934.044344 408.28
+L 934.044344 105.88
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_63">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="934.044344" y="408.28" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_32">
+      <!-- 12 -->
+      <g transform="translate(927.681844 422.878438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_33">
+     <!-- workers (thread) -->
+     <g transform="translate(708.049503 436.556563) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-77"/>
+      <use xlink:href="#DejaVuSans-6f" x="81.787109"/>
+      <use xlink:href="#DejaVuSans-72" x="142.96875"/>
+      <use xlink:href="#DejaVuSans-6b" x="184.082031"/>
+      <use xlink:href="#DejaVuSans-65" x="238.367188"/>
+      <use xlink:href="#DejaVuSans-72" x="299.890625"/>
+      <use xlink:href="#DejaVuSans-73" x="341.003906"/>
+      <use xlink:href="#DejaVuSans-20" x="393.103516"/>
+      <use xlink:href="#DejaVuSans-28" x="424.890625"/>
+      <use xlink:href="#DejaVuSans-74" x="463.904297"/>
+      <use xlink:href="#DejaVuSans-68" x="503.113281"/>
+      <use xlink:href="#DejaVuSans-72" x="566.492188"/>
+      <use xlink:href="#DejaVuSans-65" x="605.355469"/>
+      <use xlink:href="#DejaVuSans-61" x="666.878906"/>
+      <use xlink:href="#DejaVuSans-64" x="728.158203"/>
+      <use xlink:href="#DejaVuSans-29" x="791.634766"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_4">
+    <g id="ytick_7">
+     <g id="line2d_64">
+      <path d="M 546.672443 369.54281
+L 952.490625 369.54281
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_65">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="546.672443" y="369.54281" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_34">
+      <!-- 2 -->
+      <g transform="translate(533.309943 373.342029) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_8">
+     <g id="line2d_66">
+      <path d="M 546.672443 319.559339
+L 952.490625 319.559339
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_67">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="546.672443" y="319.559339" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_35">
+      <!-- 4 -->
+      <g transform="translate(533.309943 323.358558) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_9">
+     <g id="line2d_68">
+      <path d="M 546.672443 269.575868
+L 952.490625 269.575868
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_69">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="546.672443" y="269.575868" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_36">
+      <!-- 6 -->
+      <g transform="translate(533.309943 273.375087) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_10">
+     <g id="line2d_70">
+      <path d="M 546.672443 219.592397
+L 952.490625 219.592397
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_71">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="546.672443" y="219.592397" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_37">
+      <!-- 8 -->
+      <g transform="translate(533.309943 223.391615) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-38"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_11">
+     <g id="line2d_72">
+      <path d="M 546.672443 169.608926
+L 952.490625 169.608926
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_73">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="546.672443" y="169.608926" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_38">
+      <!-- 10 -->
+      <g transform="translate(526.947443 173.408144) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_12">
+     <g id="line2d_74">
+      <path d="M 546.672443 119.625455
+L 952.490625 119.625455
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_75">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="546.672443" y="119.625455" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_39">
+      <!-- 12 -->
+      <g transform="translate(526.947443 123.424673) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_40">
+     <!-- relative speed-up (-) -->
+     <g transform="translate(520.867756 308.074531) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-70" d="M 1159 525
+L 1159 -1331
+L 581 -1331
+L 581 3500
+L 1159 3500
+L 1159 2969
+Q 1341 3281 1617 3432
+Q 1894 3584 2278 3584
+Q 2916 3584 3314 3078
+Q 3713 2572 3713 1747
+Q 3713 922 3314 415
+Q 2916 -91 2278 -91
+Q 1894 -91 1617 61
+Q 1341 213 1159 525
+z
+M 3116 1747
+Q 3116 2381 2855 2742
+Q 2594 3103 2138 3103
+Q 1681 3103 1420 2742
+Q 1159 2381 1159 1747
+Q 1159 1113 1420 752
+Q 1681 391 2138 391
+Q 2594 391 2855 752
+Q 3116 1113 3116 1747
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2d" d="M 313 2009
+L 1997 2009
+L 1997 1497
+L 313 1497
+L 313 2009
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-72"/>
+      <use xlink:href="#DejaVuSans-65" x="38.863281"/>
+      <use xlink:href="#DejaVuSans-6c" x="100.386719"/>
+      <use xlink:href="#DejaVuSans-61" x="128.169922"/>
+      <use xlink:href="#DejaVuSans-74" x="189.449219"/>
+      <use xlink:href="#DejaVuSans-69" x="228.658203"/>
+      <use xlink:href="#DejaVuSans-76" x="256.441406"/>
+      <use xlink:href="#DejaVuSans-65" x="315.621094"/>
+      <use xlink:href="#DejaVuSans-20" x="377.144531"/>
+      <use xlink:href="#DejaVuSans-73" x="408.931641"/>
+      <use xlink:href="#DejaVuSans-70" x="461.03125"/>
+      <use xlink:href="#DejaVuSans-65" x="524.507812"/>
+      <use xlink:href="#DejaVuSans-65" x="586.03125"/>
+      <use xlink:href="#DejaVuSans-64" x="647.554688"/>
+      <use xlink:href="#DejaVuSans-2d" x="711.03125"/>
+      <use xlink:href="#DejaVuSans-75" x="747.115234"/>
+      <use xlink:href="#DejaVuSans-70" x="810.494141"/>
+      <use xlink:href="#DejaVuSans-20" x="873.970703"/>
+      <use xlink:href="#DejaVuSans-28" x="905.757812"/>
+      <use xlink:href="#DejaVuSans-2d" x="944.771484"/>
+      <use xlink:href="#DejaVuSans-29" x="980.855469"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_76">
+    <path d="M 565.118724 394.534545
+L 598.657417 394.534545
+L 632.19611 394.534545
+L 665.734802 394.534545
+L 699.273495 394.534545
+L 732.812188 394.534545
+L 766.35088 394.534545
+L 799.889573 394.534545
+L 833.428266 394.534545
+L 866.966959 394.534545
+L 900.505651 394.534545
+L 934.044344 394.534545
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #bf616a; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_77">
+    <path d="M 565.118724 394.534545
+L 598.657417 369.54281
+L 632.19611 344.551074
+L 665.734802 319.559339
+L 699.273495 294.567603
+L 732.812188 269.575868
+L 766.35088 244.584132
+L 799.889573 219.592397
+L 833.428266 194.600661
+L 866.966959 169.608926
+L 900.505651 144.61719
+L 934.044344 119.625455
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #a3be8c; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="LineCollection_2">
+    <path d="M 565.118724 394.534545
+L 565.118724 394.534545
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 598.657417 370.085827
+L 598.657417 369.932725
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 632.19611 346.2689
+L 632.19611 345.904384
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 665.734802 323.1754
+L 665.734802 322.430004
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 699.273495 299.821268
+L 699.273495 299.600607
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 732.812188 277.793535
+L 732.812188 277.744981
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 766.35088 261.399922
+L 766.35088 259.639927
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 799.889573 245.76437
+L 799.889573 242.663981
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 833.428266 226.837867
+L 833.428266 226.4413
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 866.966959 211.80169
+L 866.966959 208.735746
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 900.505651 197.066346
+L 900.505651 195.742795
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 934.044344 184.16129
+L 934.044344 179.999624
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+   </g>
+   <g id="line2d_78">
+    <path d="M 565.118724 394.534545
+L 598.657417 370.009276
+L 632.19611 346.086642
+L 665.734802 322.802702
+L 699.273495 299.710937
+L 732.812188 277.769258
+L 766.35088 260.519924
+L 799.889573 244.214175
+L 833.428266 226.639584
+L 866.966959 210.268718
+L 900.505651 196.40457
+L 934.044344 182.080457
+" clip-path="url(#p6151ceb985)" style="fill: none; stroke: #5e81ac; stroke-width: 2; stroke-linecap: square"/>
+    <g clip-path="url(#p6151ceb985)">
+     <use xlink:href="#mdbeaff0397" x="565.118724" y="394.534545" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="598.657417" y="370.009276" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="632.19611" y="346.086642" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="665.734802" y="322.802702" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="699.273495" y="299.710937" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="732.812188" y="277.769258" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="766.35088" y="260.519924" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="799.889573" y="244.214175" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="833.428266" y="226.639584" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="866.966959" y="210.268718" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="900.505651" y="196.40457" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="934.044344" y="182.080457" style="fill: #5e81ac; stroke: #5e81ac"/>
+    </g>
+   </g>
+   <g id="patch_8">
+    <path d="M 546.672443 408.28
+L 546.672443 105.88
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_9">
+    <path d="M 952.490625 408.28
+L 952.490625 105.88
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_10">
+    <path d="M 546.672443 408.28
+L 952.490625 408.28
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_11">
+    <path d="M 546.672443 105.88
+L 952.490625 105.88
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+  </g>
+  <g id="axes_3">
+   <g id="patch_12">
+    <path d="M 59.690625 771.16
+L 465.508807 771.16
+L 465.508807 468.76
+L 59.690625 468.76
+L 59.690625 771.16
+z
+" style="fill: none"/>
+   </g>
+   <g id="matplotlib.axis_5">
+    <g id="xtick_25">
+     <g id="line2d_79">
+      <path d="M 78.136906 771.16
+L 78.136906 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_80">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="78.136906" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_41">
+      <!-- 1 -->
+      <g transform="translate(74.955656 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_26">
+     <g id="line2d_81">
+      <path d="M 111.675599 771.16
+L 111.675599 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_82">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="111.675599" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_42">
+      <!-- 2 -->
+      <g transform="translate(108.494349 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_27">
+     <g id="line2d_83">
+      <path d="M 145.214291 771.16
+L 145.214291 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_84">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="145.214291" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_43">
+      <!-- 3 -->
+      <g transform="translate(142.033041 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_28">
+     <g id="line2d_85">
+      <path d="M 178.752984 771.16
+L 178.752984 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_86">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="178.752984" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_44">
+      <!-- 4 -->
+      <g transform="translate(175.571734 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_29">
+     <g id="line2d_87">
+      <path d="M 212.291677 771.16
+L 212.291677 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_88">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="212.291677" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_45">
+      <!-- 5 -->
+      <g transform="translate(209.110427 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-35"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_30">
+     <g id="line2d_89">
+      <path d="M 245.83037 771.16
+L 245.83037 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_90">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="245.83037" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_46">
+      <!-- 6 -->
+      <g transform="translate(242.64912 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_31">
+     <g id="line2d_91">
+      <path d="M 279.369062 771.16
+L 279.369062 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_92">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="279.369062" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_47">
+      <!-- 7 -->
+      <g transform="translate(276.187812 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-37"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_32">
+     <g id="line2d_93">
+      <path d="M 312.907755 771.16
+L 312.907755 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_94">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="312.907755" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_48">
+      <!-- 8 -->
+      <g transform="translate(309.726505 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-38"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_33">
+     <g id="line2d_95">
+      <path d="M 346.446448 771.16
+L 346.446448 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_96">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="346.446448" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_49">
+      <!-- 9 -->
+      <g transform="translate(343.265198 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-39"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_34">
+     <g id="line2d_97">
+      <path d="M 379.98514 771.16
+L 379.98514 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_98">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="379.98514" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_50">
+      <!-- 10 -->
+      <g transform="translate(373.62264 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_35">
+     <g id="line2d_99">
+      <path d="M 413.523833 771.16
+L 413.523833 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_100">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="413.523833" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_51">
+      <!-- 11 -->
+      <g transform="translate(407.161333 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-31" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_36">
+     <g id="line2d_101">
+      <path d="M 447.062526 771.16
+L 447.062526 468.76
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_102">
+      <g>
+       <use xlink:href="#md57f27ebeb" x="447.062526" y="771.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_52">
+      <!-- 12 -->
+      <g transform="translate(440.700026 785.758438) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_53">
+     <!-- workers (thread) -->
+     <g transform="translate(221.067685 799.436563) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-77"/>
+      <use xlink:href="#DejaVuSans-6f" x="81.787109"/>
+      <use xlink:href="#DejaVuSans-72" x="142.96875"/>
+      <use xlink:href="#DejaVuSans-6b" x="184.082031"/>
+      <use xlink:href="#DejaVuSans-65" x="238.367188"/>
+      <use xlink:href="#DejaVuSans-72" x="299.890625"/>
+      <use xlink:href="#DejaVuSans-73" x="341.003906"/>
+      <use xlink:href="#DejaVuSans-20" x="393.103516"/>
+      <use xlink:href="#DejaVuSans-28" x="424.890625"/>
+      <use xlink:href="#DejaVuSans-74" x="463.904297"/>
+      <use xlink:href="#DejaVuSans-68" x="503.113281"/>
+      <use xlink:href="#DejaVuSans-72" x="566.492188"/>
+      <use xlink:href="#DejaVuSans-65" x="605.355469"/>
+      <use xlink:href="#DejaVuSans-61" x="666.878906"/>
+      <use xlink:href="#DejaVuSans-64" x="728.158203"/>
+      <use xlink:href="#DejaVuSans-29" x="791.634766"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_6">
+    <g id="ytick_13">
+     <g id="line2d_103">
+      <path d="M 59.690625 722.426116
+L 465.508807 722.426116
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_104">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="59.690625" y="722.426116" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_54">
+      <!-- 20 -->
+      <g transform="translate(39.965625 726.225334) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_14">
+     <g id="line2d_105">
+      <path d="M 59.690625 662.44595
+L 465.508807 662.44595
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_106">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="59.690625" y="662.44595" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_55">
+      <!-- 40 -->
+      <g transform="translate(39.965625 666.245169) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_15">
+     <g id="line2d_107">
+      <path d="M 59.690625 602.465785
+L 465.508807 602.465785
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_108">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="59.690625" y="602.465785" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_56">
+      <!-- 60 -->
+      <g transform="translate(39.965625 606.265004) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_16">
+     <g id="line2d_109">
+      <path d="M 59.690625 542.48562
+L 465.508807 542.48562
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_110">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="59.690625" y="542.48562" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_57">
+      <!-- 80 -->
+      <g transform="translate(39.965625 546.284839) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-38"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_17">
+     <g id="line2d_111">
+      <path d="M 59.690625 482.505455
+L 465.508807 482.505455
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_112">
+      <g>
+       <use xlink:href="#m57c2ef369f" x="59.690625" y="482.505455" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_58">
+      <!-- 100 -->
+      <g transform="translate(33.603125 486.304673) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_59">
+     <!-- relative efficiency (%) -->
+     <g transform="translate(27.523438 674.726406) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-66" d="M 2375 4863
+L 2375 4384
+L 1825 4384
+Q 1516 4384 1395 4259
+Q 1275 4134 1275 3809
+L 1275 3500
+L 2222 3500
+L 2222 3053
+L 1275 3053
+L 1275 0
+L 697 0
+L 697 3053
+L 147 3053
+L 147 3500
+L 697 3500
+L 697 3744
+Q 697 4328 969 4595
+Q 1241 4863 1831 4863
+L 2375 4863
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-79" d="M 2059 -325
+Q 1816 -950 1584 -1140
+Q 1353 -1331 966 -1331
+L 506 -1331
+L 506 -850
+L 844 -850
+Q 1081 -850 1212 -737
+Q 1344 -625 1503 -206
+L 1606 56
+L 191 3500
+L 800 3500
+L 1894 763
+L 2988 3500
+L 3597 3500
+L 2059 -325
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-25" d="M 4653 2053
+Q 4381 2053 4226 1822
+Q 4072 1591 4072 1178
+Q 4072 772 4226 539
+Q 4381 306 4653 306
+Q 4919 306 5073 539
+Q 5228 772 5228 1178
+Q 5228 1588 5073 1820
+Q 4919 2053 4653 2053
+z
+M 4653 2450
+Q 5147 2450 5437 2106
+Q 5728 1763 5728 1178
+Q 5728 594 5436 251
+Q 5144 -91 4653 -91
+Q 4153 -91 3862 251
+Q 3572 594 3572 1178
+Q 3572 1766 3864 2108
+Q 4156 2450 4653 2450
+z
+M 1428 4353
+Q 1159 4353 1004 4120
+Q 850 3888 850 3481
+Q 850 3069 1003 2837
+Q 1156 2606 1428 2606
+Q 1700 2606 1854 2837
+Q 2009 3069 2009 3481
+Q 2009 3884 1853 4118
+Q 1697 4353 1428 4353
+z
+M 4250 4750
+L 4750 4750
+L 1831 -91
+L 1331 -91
+L 4250 4750
+z
+M 1428 4750
+Q 1922 4750 2215 4408
+Q 2509 4066 2509 3481
+Q 2509 2891 2217 2550
+Q 1925 2209 1428 2209
+Q 931 2209 642 2551
+Q 353 2894 353 3481
+Q 353 4063 643 4406
+Q 934 4750 1428 4750
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-72"/>
+      <use xlink:href="#DejaVuSans-65" x="38.863281"/>
+      <use xlink:href="#DejaVuSans-6c" x="100.386719"/>
+      <use xlink:href="#DejaVuSans-61" x="128.169922"/>
+      <use xlink:href="#DejaVuSans-74" x="189.449219"/>
+      <use xlink:href="#DejaVuSans-69" x="228.658203"/>
+      <use xlink:href="#DejaVuSans-76" x="256.441406"/>
+      <use xlink:href="#DejaVuSans-65" x="315.621094"/>
+      <use xlink:href="#DejaVuSans-20" x="377.144531"/>
+      <use xlink:href="#DejaVuSans-65" x="408.931641"/>
+      <use xlink:href="#DejaVuSans-66" x="470.455078"/>
+      <use xlink:href="#DejaVuSans-66" x="505.660156"/>
+      <use xlink:href="#DejaVuSans-69" x="540.865234"/>
+      <use xlink:href="#DejaVuSans-63" x="568.648438"/>
+      <use xlink:href="#DejaVuSans-69" x="623.628906"/>
+      <use xlink:href="#DejaVuSans-65" x="651.412109"/>
+      <use xlink:href="#DejaVuSans-6e" x="712.935547"/>
+      <use xlink:href="#DejaVuSans-63" x="776.314453"/>
+      <use xlink:href="#DejaVuSans-79" x="831.294922"/>
+      <use xlink:href="#DejaVuSans-20" x="890.474609"/>
+      <use xlink:href="#DejaVuSans-28" x="922.261719"/>
+      <use xlink:href="#DejaVuSans-25" x="961.275391"/>
+      <use xlink:href="#DejaVuSans-29" x="1056.294922"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_113">
+    <path d="M 78.136906 482.505455
+L 111.675599 632.455868
+L 145.214291 682.439339
+L 178.752984 707.431074
+L 212.291677 722.426116
+L 245.83037 732.42281
+L 279.369062 739.563306
+L 312.907755 744.918678
+L 346.446448 749.083967
+L 379.98514 752.416198
+L 413.523833 755.142569
+L 447.062526 757.414545
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #bf616a; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_114">
+    <path d="M 78.136906 482.505455
+L 111.675599 482.505455
+L 145.214291 482.505455
+L 178.752984 482.505455
+L 212.291677 482.505455
+L 245.83037 482.505455
+L 279.369062 482.505455
+L 312.907755 482.505455
+L 346.446448 482.505455
+L 379.98514 482.505455
+L 413.523833 482.505455
+L 447.062526 482.505455
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #a3be8c; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="LineCollection_3">
+    <path d="M 78.136906 482.505455
+L 78.136906 482.505455
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 111.675599 485.763559
+L 111.675599 484.844945
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 145.214291 489.376755
+L 145.214291 487.918694
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 178.752984 493.353639
+L 178.752984 491.11745
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 212.291677 495.114249
+L 212.291677 494.584662
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 245.83037 498.940789
+L 245.83037 498.843681
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 279.369062 511.332523
+L 279.369062 508.315388
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 312.907755 521.763414
+L 312.907755 517.112831
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 346.446448 525.488396
+L 346.446448 524.95964
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 379.98514 533.136771
+L 379.98514 529.457639
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 413.523833 539.722715
+L 413.523833 538.278841
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 447.062526 547.04129
+L 447.062526 542.879624
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+   </g>
+   <g id="line2d_115">
+    <path d="M 78.136906 482.505455
+L 111.675599 485.304252
+L 145.214291 488.647725
+L 178.752984 492.235545
+L 212.291677 494.849456
+L 245.83037 498.892235
+L 279.369062 509.823955
+L 312.907755 519.438123
+L 346.446448 525.224018
+L 379.98514 531.297205
+L 413.523833 539.000778
+L 447.062526 544.960457
+" clip-path="url(#pb8b4554f42)" style="fill: none; stroke: #5e81ac; stroke-width: 2; stroke-linecap: square"/>
+    <g clip-path="url(#pb8b4554f42)">
+     <use xlink:href="#mdbeaff0397" x="78.136906" y="482.505455" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="111.675599" y="485.304252" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="145.214291" y="488.647725" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="178.752984" y="492.235545" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="212.291677" y="494.849456" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="245.83037" y="498.892235" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="279.369062" y="509.823955" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="312.907755" y="519.438123" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="346.446448" y="525.224018" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="379.98514" y="531.297205" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="413.523833" y="539.000778" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mdbeaff0397" x="447.062526" y="544.960457" style="fill: #5e81ac; stroke: #5e81ac"/>
+    </g>
+   </g>
+   <g id="patch_13">
+    <path d="M 59.690625 771.16
+L 59.690625 468.76
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_14">
+    <path d="M 465.508807 771.16
+L 465.508807 468.76
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_15">
+    <path d="M 59.690625 771.16
+L 465.508807 771.16
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_16">
+    <path d="M 59.690625 468.76
+L 465.508807 468.76
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+  </g>
+  <g id="axes_4"/>
+  <g id="text_60">
+   <!-- game_of_life.py, orkney, Wed Oct 30 15:36:12 2024 -->
+   <g transform="translate(335.259375 28.598125) scale(0.12 -0.12)">
+    <defs>
+     <path id="DejaVuSans-67" d="M 2906 1791
+Q 2906 2416 2648 2759
+Q 2391 3103 1925 3103
+Q 1463 3103 1205 2759
+Q 947 2416 947 1791
+Q 947 1169 1205 825
+Q 1463 481 1925 481
+Q 2391 481 2648 825
+Q 2906 1169 2906 1791
+z
+M 3481 434
+Q 3481 -459 3084 -895
+Q 2688 -1331 1869 -1331
+Q 1566 -1331 1297 -1286
+Q 1028 -1241 775 -1147
+L 775 -588
+Q 1028 -725 1275 -790
+Q 1522 -856 1778 -856
+Q 2344 -856 2625 -561
+Q 2906 -266 2906 331
+L 2906 616
+Q 2728 306 2450 153
+Q 2172 0 1784 0
+Q 1141 0 747 490
+Q 353 981 353 1791
+Q 353 2603 747 3093
+Q 1141 3584 1784 3584
+Q 2172 3584 2450 3431
+Q 2728 3278 2906 2969
+L 2906 3500
+L 3481 3500
+L 3481 434
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-5f" d="M 3263 -1063
+L 3263 -1509
+L -63 -1509
+L -63 -1063
+L 3263 -1063
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-2c" d="M 750 794
+L 1409 794
+L 1409 256
+L 897 -744
+L 494 -744
+L 750 256
+L 750 794
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-57" d="M 213 4666
+L 850 4666
+L 1831 722
+L 2809 4666
+L 3519 4666
+L 4500 722
+L 5478 4666
+L 6119 4666
+L 4947 0
+L 4153 0
+L 3169 4050
+L 2175 0
+L 1381 0
+L 213 4666
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-4f" d="M 2522 4238
+Q 1834 4238 1429 3725
+Q 1025 3213 1025 2328
+Q 1025 1447 1429 934
+Q 1834 422 2522 422
+Q 3209 422 3611 934
+Q 4013 1447 4013 2328
+Q 4013 3213 3611 3725
+Q 3209 4238 2522 4238
+z
+M 2522 4750
+Q 3503 4750 4090 4092
+Q 4678 3434 4678 2328
+Q 4678 1225 4090 567
+Q 3503 -91 2522 -91
+Q 1538 -91 948 565
+Q 359 1222 359 2328
+Q 359 3434 948 4092
+Q 1538 4750 2522 4750
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-3a" d="M 750 794
+L 1409 794
+L 1409 0
+L 750 0
+L 750 794
+z
+M 750 3309
+L 1409 3309
+L 1409 2516
+L 750 2516
+L 750 3309
+z
+" transform="scale(0.015625)"/>
+    </defs>
+    <use xlink:href="#DejaVuSans-67"/>
+    <use xlink:href="#DejaVuSans-61" x="63.476562"/>
+    <use xlink:href="#DejaVuSans-6d" x="124.755859"/>
+    <use xlink:href="#DejaVuSans-65" x="222.167969"/>
+    <use xlink:href="#DejaVuSans-5f" x="283.691406"/>
+    <use xlink:href="#DejaVuSans-6f" x="333.691406"/>
+    <use xlink:href="#DejaVuSans-66" x="394.873047"/>
+    <use xlink:href="#DejaVuSans-5f" x="430.078125"/>
+    <use xlink:href="#DejaVuSans-6c" x="480.078125"/>
+    <use xlink:href="#DejaVuSans-69" x="507.861328"/>
+    <use xlink:href="#DejaVuSans-66" x="535.644531"/>
+    <use xlink:href="#DejaVuSans-65" x="570.849609"/>
+    <use xlink:href="#DejaVuSans-2e" x="632.373047"/>
+    <use xlink:href="#DejaVuSans-70" x="664.160156"/>
+    <use xlink:href="#DejaVuSans-79" x="727.636719"/>
+    <use xlink:href="#DejaVuSans-2c" x="786.816406"/>
+    <use xlink:href="#DejaVuSans-20" x="818.603516"/>
+    <use xlink:href="#DejaVuSans-6f" x="850.390625"/>
+    <use xlink:href="#DejaVuSans-72" x="911.572266"/>
+    <use xlink:href="#DejaVuSans-6b" x="952.685547"/>
+    <use xlink:href="#DejaVuSans-6e" x="1010.595703"/>
+    <use xlink:href="#DejaVuSans-65" x="1073.974609"/>
+    <use xlink:href="#DejaVuSans-79" x="1135.498047"/>
+    <use xlink:href="#DejaVuSans-2c" x="1194.677734"/>
+    <use xlink:href="#DejaVuSans-20" x="1226.464844"/>
+    <use xlink:href="#DejaVuSans-57" x="1258.251953"/>
+    <use xlink:href="#DejaVuSans-65" x="1351.253906"/>
+    <use xlink:href="#DejaVuSans-64" x="1412.777344"/>
+    <use xlink:href="#DejaVuSans-20" x="1476.253906"/>
+    <use xlink:href="#DejaVuSans-4f" x="1508.041016"/>
+    <use xlink:href="#DejaVuSans-63" x="1586.751953"/>
+    <use xlink:href="#DejaVuSans-74" x="1641.732422"/>
+    <use xlink:href="#DejaVuSans-20" x="1680.941406"/>
+    <use xlink:href="#DejaVuSans-33" x="1712.728516"/>
+    <use xlink:href="#DejaVuSans-30" x="1776.351562"/>
+    <use xlink:href="#DejaVuSans-20" x="1839.974609"/>
+    <use xlink:href="#DejaVuSans-31" x="1871.761719"/>
+    <use xlink:href="#DejaVuSans-35" x="1935.384766"/>
+    <use xlink:href="#DejaVuSans-3a" x="1999.007812"/>
+    <use xlink:href="#DejaVuSans-33" x="2032.699219"/>
+    <use xlink:href="#DejaVuSans-36" x="2096.322266"/>
+    <use xlink:href="#DejaVuSans-3a" x="2159.945312"/>
+    <use xlink:href="#DejaVuSans-31" x="2193.636719"/>
+    <use xlink:href="#DejaVuSans-32" x="2257.259766"/>
+    <use xlink:href="#DejaVuSans-20" x="2320.882812"/>
+    <use xlink:href="#DejaVuSans-32" x="2352.669922"/>
+    <use xlink:href="#DejaVuSans-30" x="2416.292969"/>
+    <use xlink:href="#DejaVuSans-32" x="2479.916016"/>
+    <use xlink:href="#DejaVuSans-34" x="2543.539062"/>
+   </g>
+   <!-- Strong scalability experiment on 10000x10000 array and 850x850 partitions (core_numa_node) -->
+   <g transform="translate(203.086875 42.36925) scale(0.12 -0.12)">
+    <defs>
+     <path id="DejaVuSans-53" d="M 3425 4513
+L 3425 3897
+Q 3066 4069 2747 4153
+Q 2428 4238 2131 4238
+Q 1616 4238 1336 4038
+Q 1056 3838 1056 3469
+Q 1056 3159 1242 3001
+Q 1428 2844 1947 2747
+L 2328 2669
+Q 3034 2534 3370 2195
+Q 3706 1856 3706 1288
+Q 3706 609 3251 259
+Q 2797 -91 1919 -91
+Q 1588 -91 1214 -16
+Q 841 59 441 206
+L 441 856
+Q 825 641 1194 531
+Q 1563 422 1919 422
+Q 2459 422 2753 634
+Q 3047 847 3047 1241
+Q 3047 1584 2836 1778
+Q 2625 1972 2144 2069
+L 1759 2144
+Q 1053 2284 737 2584
+Q 422 2884 422 3419
+Q 422 4038 858 4394
+Q 1294 4750 2059 4750
+Q 2388 4750 2728 4690
+Q 3069 4631 3425 4513
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-62" d="M 3116 1747
+Q 3116 2381 2855 2742
+Q 2594 3103 2138 3103
+Q 1681 3103 1420 2742
+Q 1159 2381 1159 1747
+Q 1159 1113 1420 752
+Q 1681 391 2138 391
+Q 2594 391 2855 752
+Q 3116 1113 3116 1747
+z
+M 1159 2969
+Q 1341 3281 1617 3432
+Q 1894 3584 2278 3584
+Q 2916 3584 3314 3078
+Q 3713 2572 3713 1747
+Q 3713 922 3314 415
+Q 2916 -91 2278 -91
+Q 1894 -91 1617 61
+Q 1341 213 1159 525
+L 1159 0
+L 581 0
+L 581 4863
+L 1159 4863
+L 1159 2969
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-78" d="M 3513 3500
+L 2247 1797
+L 3578 0
+L 2900 0
+L 1881 1375
+L 863 0
+L 184 0
+L 1544 1831
+L 300 3500
+L 978 3500
+L 1906 2253
+L 2834 3500
+L 3513 3500
+z
+" transform="scale(0.015625)"/>
+    </defs>
+    <use xlink:href="#DejaVuSans-53"/>
+    <use xlink:href="#DejaVuSans-74" x="63.476562"/>
+    <use xlink:href="#DejaVuSans-72" x="102.685547"/>
+    <use xlink:href="#DejaVuSans-6f" x="141.548828"/>
+    <use xlink:href="#DejaVuSans-6e" x="202.730469"/>
+    <use xlink:href="#DejaVuSans-67" x="266.109375"/>
+    <use xlink:href="#DejaVuSans-20" x="329.585938"/>
+    <use xlink:href="#DejaVuSans-73" x="361.373047"/>
+    <use xlink:href="#DejaVuSans-63" x="413.472656"/>
+    <use xlink:href="#DejaVuSans-61" x="468.453125"/>
+    <use xlink:href="#DejaVuSans-6c" x="529.732422"/>
+    <use xlink:href="#DejaVuSans-61" x="557.515625"/>
+    <use xlink:href="#DejaVuSans-62" x="618.794922"/>
+    <use xlink:href="#DejaVuSans-69" x="682.271484"/>
+    <use xlink:href="#DejaVuSans-6c" x="710.054688"/>
+    <use xlink:href="#DejaVuSans-69" x="737.837891"/>
+    <use xlink:href="#DejaVuSans-74" x="765.621094"/>
+    <use xlink:href="#DejaVuSans-79" x="804.830078"/>
+    <use xlink:href="#DejaVuSans-20" x="864.009766"/>
+    <use xlink:href="#DejaVuSans-65" x="895.796875"/>
+    <use xlink:href="#DejaVuSans-78" x="955.570312"/>
+    <use xlink:href="#DejaVuSans-70" x="1014.75"/>
+    <use xlink:href="#DejaVuSans-65" x="1078.226562"/>
+    <use xlink:href="#DejaVuSans-72" x="1139.75"/>
+    <use xlink:href="#DejaVuSans-69" x="1180.863281"/>
+    <use xlink:href="#DejaVuSans-6d" x="1208.646484"/>
+    <use xlink:href="#DejaVuSans-65" x="1306.058594"/>
+    <use xlink:href="#DejaVuSans-6e" x="1367.582031"/>
+    <use xlink:href="#DejaVuSans-74" x="1430.960938"/>
+    <use xlink:href="#DejaVuSans-20" x="1470.169922"/>
+    <use xlink:href="#DejaVuSans-6f" x="1501.957031"/>
+    <use xlink:href="#DejaVuSans-6e" x="1563.138672"/>
+    <use xlink:href="#DejaVuSans-20" x="1626.517578"/>
+    <use xlink:href="#DejaVuSans-31" x="1658.304688"/>
+    <use xlink:href="#DejaVuSans-30" x="1721.927734"/>
+    <use xlink:href="#DejaVuSans-30" x="1785.550781"/>
+    <use xlink:href="#DejaVuSans-30" x="1849.173828"/>
+    <use xlink:href="#DejaVuSans-30" x="1912.796875"/>
+    <use xlink:href="#DejaVuSans-78" x="1976.419922"/>
+    <use xlink:href="#DejaVuSans-31" x="2035.599609"/>
+    <use xlink:href="#DejaVuSans-30" x="2099.222656"/>
+    <use xlink:href="#DejaVuSans-30" x="2162.845703"/>
+    <use xlink:href="#DejaVuSans-30" x="2226.46875"/>
+    <use xlink:href="#DejaVuSans-30" x="2290.091797"/>
+    <use xlink:href="#DejaVuSans-20" x="2353.714844"/>
+    <use xlink:href="#DejaVuSans-61" x="2385.501953"/>
+    <use xlink:href="#DejaVuSans-72" x="2446.78125"/>
+    <use xlink:href="#DejaVuSans-72" x="2486.144531"/>
+    <use xlink:href="#DejaVuSans-61" x="2527.257812"/>
+    <use xlink:href="#DejaVuSans-79" x="2588.537109"/>
+    <use xlink:href="#DejaVuSans-20" x="2647.716797"/>
+    <use xlink:href="#DejaVuSans-61" x="2679.503906"/>
+    <use xlink:href="#DejaVuSans-6e" x="2740.783203"/>
+    <use xlink:href="#DejaVuSans-64" x="2804.162109"/>
+    <use xlink:href="#DejaVuSans-20" x="2867.638672"/>
+    <use xlink:href="#DejaVuSans-38" x="2899.425781"/>
+    <use xlink:href="#DejaVuSans-35" x="2963.048828"/>
+    <use xlink:href="#DejaVuSans-30" x="3026.671875"/>
+    <use xlink:href="#DejaVuSans-78" x="3090.294922"/>
+    <use xlink:href="#DejaVuSans-38" x="3149.474609"/>
+    <use xlink:href="#DejaVuSans-35" x="3213.097656"/>
+    <use xlink:href="#DejaVuSans-30" x="3276.720703"/>
+    <use xlink:href="#DejaVuSans-20" x="3340.34375"/>
+    <use xlink:href="#DejaVuSans-70" x="3372.130859"/>
+    <use xlink:href="#DejaVuSans-61" x="3435.607422"/>
+    <use xlink:href="#DejaVuSans-72" x="3496.886719"/>
+    <use xlink:href="#DejaVuSans-74" x="3538"/>
+    <use xlink:href="#DejaVuSans-69" x="3577.208984"/>
+    <use xlink:href="#DejaVuSans-74" x="3604.992188"/>
+    <use xlink:href="#DejaVuSans-69" x="3644.201172"/>
+    <use xlink:href="#DejaVuSans-6f" x="3671.984375"/>
+    <use xlink:href="#DejaVuSans-6e" x="3733.166016"/>
+    <use xlink:href="#DejaVuSans-73" x="3796.544922"/>
+    <use xlink:href="#DejaVuSans-20" x="3848.644531"/>
+    <use xlink:href="#DejaVuSans-28" x="3880.431641"/>
+    <use xlink:href="#DejaVuSans-63" x="3919.445312"/>
+    <use xlink:href="#DejaVuSans-6f" x="3974.425781"/>
+    <use xlink:href="#DejaVuSans-72" x="4035.607422"/>
+    <use xlink:href="#DejaVuSans-65" x="4074.470703"/>
+    <use xlink:href="#DejaVuSans-5f" x="4135.994141"/>
+    <use xlink:href="#DejaVuSans-6e" x="4185.994141"/>
+    <use xlink:href="#DejaVuSans-75" x="4249.373047"/>
+    <use xlink:href="#DejaVuSans-6d" x="4312.751953"/>
+    <use xlink:href="#DejaVuSans-61" x="4410.164062"/>
+    <use xlink:href="#DejaVuSans-5f" x="4471.443359"/>
+    <use xlink:href="#DejaVuSans-6e" x="4521.443359"/>
+    <use xlink:href="#DejaVuSans-6f" x="4584.822266"/>
+    <use xlink:href="#DejaVuSans-64" x="4646.003906"/>
+    <use xlink:href="#DejaVuSans-65" x="4709.480469"/>
+    <use xlink:href="#DejaVuSans-29" x="4771.003906"/>
+   </g>
+  </g>
+  <g id="legend_1">
+   <g id="patch_17">
+    <path d="M 1000.1 52.034375
+L 1062.890625 52.034375
+Q 1064.890625 52.034375 1064.890625 50.034375
+L 1064.890625 7
+Q 1064.890625 5 1062.890625 5
+L 1000.1 5
+Q 998.1 5 998.1 7
+L 998.1 50.034375
+Q 998.1 52.034375 1000.1 52.034375
+L 1000.1 52.034375
+z
+" style="fill: none; opacity: 0"/>
+   </g>
+   <g id="line2d_116">
+    <path d="M 1002.1 13.098437
+L 1012.1 13.098437
+L 1022.1 13.098437
+" style="fill: none; stroke: #bf616a; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="text_61">
+    <!-- serial -->
+    <g transform="translate(1030.1 16.598437) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-73"/>
+     <use xlink:href="#DejaVuSans-65" x="52.099609"/>
+     <use xlink:href="#DejaVuSans-72" x="113.623047"/>
+     <use xlink:href="#DejaVuSans-69" x="154.736328"/>
+     <use xlink:href="#DejaVuSans-61" x="182.519531"/>
+     <use xlink:href="#DejaVuSans-6c" x="243.798828"/>
+    </g>
+   </g>
+   <g id="line2d_117">
+    <path d="M 1002.1 27.776562
+L 1012.1 27.776562
+L 1022.1 27.776562
+" style="fill: none; stroke: #a3be8c; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="text_62">
+    <!-- linear -->
+    <g transform="translate(1030.1 31.276562) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-6c"/>
+     <use xlink:href="#DejaVuSans-69" x="27.783203"/>
+     <use xlink:href="#DejaVuSans-6e" x="55.566406"/>
+     <use xlink:href="#DejaVuSans-65" x="118.945312"/>
+     <use xlink:href="#DejaVuSans-61" x="180.46875"/>
+     <use xlink:href="#DejaVuSans-72" x="241.748047"/>
+    </g>
+   </g>
+   <g id="LineCollection_4">
+    <path d="M 1012.1 47.454687
+L 1012.1 37.454687
+" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+   </g>
+   <g id="line2d_118">
+    <path d="M 1002.1 42.454687
+L 1022.1 42.454687
+" style="fill: none; stroke: #5e81ac; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_119">
+    <g>
+     <use xlink:href="#mdbeaff0397" x="1012.1" y="42.454687" style="fill: #5e81ac; stroke: #5e81ac"/>
+    </g>
+   </g>
+   <g id="text_63">
+    <!-- actual -->
+    <g transform="translate(1030.1 45.954687) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-61"/>
+     <use xlink:href="#DejaVuSans-63" x="61.279297"/>
+     <use xlink:href="#DejaVuSans-74" x="116.259766"/>
+     <use xlink:href="#DejaVuSans-75" x="155.46875"/>
+     <use xlink:href="#DejaVuSans-61" x="218.847656"/>
+     <use xlink:href="#DejaVuSans-6c" x="280.126953"/>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="p84b6c0779c">
+   <rect x="59.690625" y="105.88" width="405.818182" height="302.4"/>
+  </clipPath>
+  <clipPath id="p6151ceb985">
+   <rect x="546.672443" y="105.88" width="405.818182" height="302.4"/>
+  </clipPath>
+  <clipPath id="pb8b4554f42">
+   <rect x="59.690625" y="468.76" width="405.818182" height="302.4"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/document/doc/manual/quality_assurance/scalability/weak_scalability.svg b/document/doc/manual/quality_assurance/scalability/weak_scalability.svg
new file mode 100644
index 000000000..cace86149
--- /dev/null
+++ b/document/doc/manual/quality_assurance/scalability/weak_scalability.svg
@@ -0,0 +1,2349 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1076.253125pt" height="424.23625pt" viewBox="0 0 1076.253125 424.23625" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2024-10-30T15:55:19.658661</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.9.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 424.23625
+L 1076.253125 424.23625
+L 1076.253125 0
+L 0 0
+L 0 424.23625
+z
+" style="fill: none"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 66.053125 386.68
+L 471.871307 386.68
+L 471.871307 54.04
+L 66.053125 54.04
+L 66.053125 386.68
+z
+" style="fill: none"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <path d="M 84.499406 386.68
+L 84.499406 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_2">
+      <defs>
+       <path id="mfb9b06afb3" d="M 0 0
+L 0 3.5
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="84.499406" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 1 -->
+      <g transform="translate(81.318156 401.278437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531
+L 1825 531
+L 1825 4091
+L 703 3866
+L 703 4441
+L 1819 4666
+L 2450 4666
+L 2450 531
+L 3481 531
+L 3481 0
+L 794 0
+L 794 531
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_3">
+      <path d="M 118.038099 386.68
+L 118.038099 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="118.038099" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 2 -->
+      <g transform="translate(114.856849 401.278437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-32" d="M 1228 531
+L 3431 531
+L 3431 0
+L 469 0
+L 469 531
+Q 828 903 1448 1529
+Q 2069 2156 2228 2338
+Q 2531 2678 2651 2914
+Q 2772 3150 2772 3378
+Q 2772 3750 2511 3984
+Q 2250 4219 1831 4219
+Q 1534 4219 1204 4116
+Q 875 4013 500 3803
+L 500 4441
+Q 881 4594 1212 4672
+Q 1544 4750 1819 4750
+Q 2544 4750 2975 4387
+Q 3406 4025 3406 3419
+Q 3406 3131 3298 2873
+Q 3191 2616 2906 2266
+Q 2828 2175 2409 1742
+Q 1991 1309 1228 531
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-32"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_5">
+      <path d="M 151.576791 386.68
+L 151.576791 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="151.576791" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 3 -->
+      <g transform="translate(148.395541 401.278437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-33" d="M 2597 2516
+Q 3050 2419 3304 2112
+Q 3559 1806 3559 1356
+Q 3559 666 3084 287
+Q 2609 -91 1734 -91
+Q 1441 -91 1130 -33
+Q 819 25 488 141
+L 488 750
+Q 750 597 1062 519
+Q 1375 441 1716 441
+Q 2309 441 2620 675
+Q 2931 909 2931 1356
+Q 2931 1769 2642 2001
+Q 2353 2234 1838 2234
+L 1294 2234
+L 1294 2753
+L 1863 2753
+Q 2328 2753 2575 2939
+Q 2822 3125 2822 3475
+Q 2822 3834 2567 4026
+Q 2313 4219 1838 4219
+Q 1578 4219 1281 4162
+Q 984 4106 628 3988
+L 628 4550
+Q 988 4650 1302 4700
+Q 1616 4750 1894 4750
+Q 2613 4750 3031 4423
+Q 3450 4097 3450 3541
+Q 3450 3153 3228 2886
+Q 3006 2619 2597 2516
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-33"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_7">
+      <path d="M 185.115484 386.68
+L 185.115484 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="185.115484" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 4 -->
+      <g transform="translate(181.934234 401.278437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116
+L 825 1625
+L 2419 1625
+L 2419 4116
+z
+M 2253 4666
+L 3047 4666
+L 3047 1625
+L 3713 1625
+L 3713 1100
+L 3047 1100
+L 3047 0
+L 2419 0
+L 2419 1100
+L 313 1100
+L 313 1709
+L 2253 4666
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-34"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_9">
+      <path d="M 218.654177 386.68
+L 218.654177 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="218.654177" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 5 -->
+      <g transform="translate(215.472927 401.278437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666
+L 3169 4666
+L 3169 4134
+L 1269 4134
+L 1269 2991
+Q 1406 3038 1543 3061
+Q 1681 3084 1819 3084
+Q 2600 3084 3056 2656
+Q 3513 2228 3513 1497
+Q 3513 744 3044 326
+Q 2575 -91 1722 -91
+Q 1428 -91 1123 -41
+Q 819 9 494 109
+L 494 744
+Q 775 591 1075 516
+Q 1375 441 1709 441
+Q 2250 441 2565 725
+Q 2881 1009 2881 1497
+Q 2881 1984 2565 2268
+Q 2250 2553 1709 2553
+Q 1456 2553 1204 2497
+Q 953 2441 691 2322
+L 691 4666
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-35"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_11">
+      <path d="M 252.19287 386.68
+L 252.19287 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="252.19287" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 6 -->
+      <g transform="translate(249.01162 401.278437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-36" d="M 2113 2584
+Q 1688 2584 1439 2293
+Q 1191 2003 1191 1497
+Q 1191 994 1439 701
+Q 1688 409 2113 409
+Q 2538 409 2786 701
+Q 3034 994 3034 1497
+Q 3034 2003 2786 2293
+Q 2538 2584 2113 2584
+z
+M 3366 4563
+L 3366 3988
+Q 3128 4100 2886 4159
+Q 2644 4219 2406 4219
+Q 1781 4219 1451 3797
+Q 1122 3375 1075 2522
+Q 1259 2794 1537 2939
+Q 1816 3084 2150 3084
+Q 2853 3084 3261 2657
+Q 3669 2231 3669 1497
+Q 3669 778 3244 343
+Q 2819 -91 2113 -91
+Q 1303 -91 875 529
+Q 447 1150 447 2328
+Q 447 3434 972 4092
+Q 1497 4750 2381 4750
+Q 2619 4750 2861 4703
+Q 3103 4656 3366 4563
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-36"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_13">
+      <path d="M 285.731562 386.68
+L 285.731562 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_14">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="285.731562" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 7 -->
+      <g transform="translate(282.550312 401.278437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-37" d="M 525 4666
+L 3525 4666
+L 3525 4397
+L 1831 0
+L 1172 0
+L 2766 4134
+L 525 4134
+L 525 4666
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-37"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_8">
+     <g id="line2d_15">
+      <path d="M 319.270255 386.68
+L 319.270255 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_16">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="319.270255" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 8 -->
+      <g transform="translate(316.089005 401.278437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-38" d="M 2034 2216
+Q 1584 2216 1326 1975
+Q 1069 1734 1069 1313
+Q 1069 891 1326 650
+Q 1584 409 2034 409
+Q 2484 409 2743 651
+Q 3003 894 3003 1313
+Q 3003 1734 2745 1975
+Q 2488 2216 2034 2216
+z
+M 1403 2484
+Q 997 2584 770 2862
+Q 544 3141 544 3541
+Q 544 4100 942 4425
+Q 1341 4750 2034 4750
+Q 2731 4750 3128 4425
+Q 3525 4100 3525 3541
+Q 3525 3141 3298 2862
+Q 3072 2584 2669 2484
+Q 3125 2378 3379 2068
+Q 3634 1759 3634 1313
+Q 3634 634 3220 271
+Q 2806 -91 2034 -91
+Q 1263 -91 848 271
+Q 434 634 434 1313
+Q 434 1759 690 2068
+Q 947 2378 1403 2484
+z
+M 1172 3481
+Q 1172 3119 1398 2916
+Q 1625 2713 2034 2713
+Q 2441 2713 2670 2916
+Q 2900 3119 2900 3481
+Q 2900 3844 2670 4047
+Q 2441 4250 2034 4250
+Q 1625 4250 1398 4047
+Q 1172 3844 1172 3481
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-38"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_9">
+     <g id="line2d_17">
+      <path d="M 352.808948 386.68
+L 352.808948 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_18">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="352.808948" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 9 -->
+      <g transform="translate(349.627698 401.278437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-39" d="M 703 97
+L 703 672
+Q 941 559 1184 500
+Q 1428 441 1663 441
+Q 2288 441 2617 861
+Q 2947 1281 2994 2138
+Q 2813 1869 2534 1725
+Q 2256 1581 1919 1581
+Q 1219 1581 811 2004
+Q 403 2428 403 3163
+Q 403 3881 828 4315
+Q 1253 4750 1959 4750
+Q 2769 4750 3195 4129
+Q 3622 3509 3622 2328
+Q 3622 1225 3098 567
+Q 2575 -91 1691 -91
+Q 1453 -91 1209 -44
+Q 966 3 703 97
+z
+M 1959 2075
+Q 2384 2075 2632 2365
+Q 2881 2656 2881 3163
+Q 2881 3666 2632 3958
+Q 2384 4250 1959 4250
+Q 1534 4250 1286 3958
+Q 1038 3666 1038 3163
+Q 1038 2656 1286 2365
+Q 1534 2075 1959 2075
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-39"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_10">
+     <g id="line2d_19">
+      <path d="M 386.34764 386.68
+L 386.34764 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_20">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="386.34764" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 10 -->
+      <g transform="translate(379.98514 401.278437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250
+Q 1547 4250 1301 3770
+Q 1056 3291 1056 2328
+Q 1056 1369 1301 889
+Q 1547 409 2034 409
+Q 2525 409 2770 889
+Q 3016 1369 3016 2328
+Q 3016 3291 2770 3770
+Q 2525 4250 2034 4250
+z
+M 2034 4750
+Q 2819 4750 3233 4129
+Q 3647 3509 3647 2328
+Q 3647 1150 3233 529
+Q 2819 -91 2034 -91
+Q 1250 -91 836 529
+Q 422 1150 422 2328
+Q 422 3509 836 4129
+Q 1250 4750 2034 4750
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_11">
+     <g id="line2d_21">
+      <path d="M 419.886333 386.68
+L 419.886333 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_22">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="419.886333" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 11 -->
+      <g transform="translate(413.523833 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-31" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_12">
+     <g id="line2d_23">
+      <path d="M 453.425026 386.68
+L 453.425026 54.04
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_24">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="453.425026" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 12 -->
+      <g transform="translate(447.062526 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_13">
+     <!-- workers (thread) -->
+     <g transform="translate(227.430185 414.956562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-77" d="M 269 3500
+L 844 3500
+L 1563 769
+L 2278 3500
+L 2956 3500
+L 3675 769
+L 4391 3500
+L 4966 3500
+L 4050 0
+L 3372 0
+L 2619 2869
+L 1863 0
+L 1184 0
+L 269 3500
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097
+Q 1497 3097 1228 2736
+Q 959 2375 959 1747
+Q 959 1119 1226 758
+Q 1494 397 1959 397
+Q 2419 397 2687 759
+Q 2956 1122 2956 1747
+Q 2956 2369 2687 2733
+Q 2419 3097 1959 3097
+z
+M 1959 3584
+Q 2709 3584 3137 3096
+Q 3566 2609 3566 1747
+Q 3566 888 3137 398
+Q 2709 -91 1959 -91
+Q 1206 -91 779 398
+Q 353 888 353 1747
+Q 353 2609 779 3096
+Q 1206 3584 1959 3584
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-72" d="M 2631 2963
+Q 2534 3019 2420 3045
+Q 2306 3072 2169 3072
+Q 1681 3072 1420 2755
+Q 1159 2438 1159 1844
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1341 3275 1631 3429
+Q 1922 3584 2338 3584
+Q 2397 3584 2469 3576
+Q 2541 3569 2628 3553
+L 2631 2963
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6b" d="M 581 4863
+L 1159 4863
+L 1159 1991
+L 2875 3500
+L 3609 3500
+L 1753 1863
+L 3688 0
+L 2938 0
+L 1159 1709
+L 1159 0
+L 581 0
+L 581 4863
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894
+L 3597 1613
+L 953 1613
+Q 991 1019 1311 708
+Q 1631 397 2203 397
+Q 2534 397 2845 478
+Q 3156 559 3463 722
+L 3463 178
+Q 3153 47 2828 -22
+Q 2503 -91 2169 -91
+Q 1331 -91 842 396
+Q 353 884 353 1716
+Q 353 2575 817 3079
+Q 1281 3584 2069 3584
+Q 2775 3584 3186 3129
+Q 3597 2675 3597 1894
+z
+M 3022 2063
+Q 3016 2534 2758 2815
+Q 2500 3097 2075 3097
+Q 1594 3097 1305 2825
+Q 1016 2553 972 2059
+L 3022 2063
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-73" d="M 2834 3397
+L 2834 2853
+Q 2591 2978 2328 3040
+Q 2066 3103 1784 3103
+Q 1356 3103 1142 2972
+Q 928 2841 928 2578
+Q 928 2378 1081 2264
+Q 1234 2150 1697 2047
+L 1894 2003
+Q 2506 1872 2764 1633
+Q 3022 1394 3022 966
+Q 3022 478 2636 193
+Q 2250 -91 1575 -91
+Q 1294 -91 989 -36
+Q 684 19 347 128
+L 347 722
+Q 666 556 975 473
+Q 1284 391 1588 391
+Q 1994 391 2212 530
+Q 2431 669 2431 922
+Q 2431 1156 2273 1281
+Q 2116 1406 1581 1522
+L 1381 1569
+Q 847 1681 609 1914
+Q 372 2147 372 2553
+Q 372 3047 722 3315
+Q 1072 3584 1716 3584
+Q 2034 3584 2315 3537
+Q 2597 3491 2834 3397
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856
+Q 1566 4138 1362 3434
+Q 1159 2731 1159 2009
+Q 1159 1288 1364 580
+Q 1569 -128 1984 -844
+L 1484 -844
+Q 1016 -109 783 600
+Q 550 1309 550 2009
+Q 550 2706 781 3412
+Q 1013 4119 1484 4856
+L 1984 4856
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494
+L 1172 3500
+L 2356 3500
+L 2356 3053
+L 1172 3053
+L 1172 1153
+Q 1172 725 1289 603
+Q 1406 481 1766 481
+L 2356 481
+L 2356 0
+L 1766 0
+Q 1100 0 847 248
+Q 594 497 594 1153
+L 594 3053
+L 172 3053
+L 172 3500
+L 594 3500
+L 594 4494
+L 1172 4494
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-68" d="M 3513 2113
+L 3513 0
+L 2938 0
+L 2938 2094
+Q 2938 2591 2744 2837
+Q 2550 3084 2163 3084
+Q 1697 3084 1428 2787
+Q 1159 2491 1159 1978
+L 1159 0
+L 581 0
+L 581 4863
+L 1159 4863
+L 1159 2956
+Q 1366 3272 1645 3428
+Q 1925 3584 2291 3584
+Q 2894 3584 3203 3211
+Q 3513 2838 3513 2113
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759
+Q 1497 1759 1228 1600
+Q 959 1441 959 1056
+Q 959 750 1161 570
+Q 1363 391 1709 391
+Q 2188 391 2477 730
+Q 2766 1069 2766 1631
+L 2766 1759
+L 2194 1759
+z
+M 3341 1997
+L 3341 0
+L 2766 0
+L 2766 531
+Q 2569 213 2275 61
+Q 1981 -91 1556 -91
+Q 1019 -91 701 211
+Q 384 513 384 1019
+Q 384 1609 779 1909
+Q 1175 2209 1959 2209
+L 2766 2209
+L 2766 2266
+Q 2766 2663 2505 2880
+Q 2244 3097 1772 3097
+Q 1472 3097 1187 3025
+Q 903 2953 641 2809
+L 641 3341
+Q 956 3463 1253 3523
+Q 1550 3584 1831 3584
+Q 2591 3584 2966 3190
+Q 3341 2797 3341 1997
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-64" d="M 2906 2969
+L 2906 4863
+L 3481 4863
+L 3481 0
+L 2906 0
+L 2906 525
+Q 2725 213 2448 61
+Q 2172 -91 1784 -91
+Q 1150 -91 751 415
+Q 353 922 353 1747
+Q 353 2572 751 3078
+Q 1150 3584 1784 3584
+Q 2172 3584 2448 3432
+Q 2725 3281 2906 2969
+z
+M 947 1747
+Q 947 1113 1208 752
+Q 1469 391 1925 391
+Q 2381 391 2643 752
+Q 2906 1113 2906 1747
+Q 2906 2381 2643 2742
+Q 2381 3103 1925 3103
+Q 1469 3103 1208 2742
+Q 947 2381 947 1747
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856
+L 1013 4856
+Q 1481 4119 1714 3412
+Q 1947 2706 1947 2009
+Q 1947 1309 1714 600
+Q 1481 -109 1013 -844
+L 513 -844
+Q 928 -128 1133 580
+Q 1338 1288 1338 2009
+Q 1338 2731 1133 3434
+Q 928 4138 513 4856
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-77"/>
+      <use xlink:href="#DejaVuSans-6f" x="81.787109"/>
+      <use xlink:href="#DejaVuSans-72" x="142.96875"/>
+      <use xlink:href="#DejaVuSans-6b" x="184.082031"/>
+      <use xlink:href="#DejaVuSans-65" x="238.367188"/>
+      <use xlink:href="#DejaVuSans-72" x="299.890625"/>
+      <use xlink:href="#DejaVuSans-73" x="341.003906"/>
+      <use xlink:href="#DejaVuSans-20" x="393.103516"/>
+      <use xlink:href="#DejaVuSans-28" x="424.890625"/>
+      <use xlink:href="#DejaVuSans-74" x="463.904297"/>
+      <use xlink:href="#DejaVuSans-68" x="503.113281"/>
+      <use xlink:href="#DejaVuSans-72" x="566.492188"/>
+      <use xlink:href="#DejaVuSans-65" x="605.355469"/>
+      <use xlink:href="#DejaVuSans-61" x="666.878906"/>
+      <use xlink:href="#DejaVuSans-64" x="728.158203"/>
+      <use xlink:href="#DejaVuSans-29" x="791.634766"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_25">
+      <path d="M 66.053125 359.920774
+L 471.871307 359.920774
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_26">
+      <defs>
+       <path id="m45782c255c" d="M 0 0
+L -3.5 0
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m45782c255c" x="66.053125" y="359.920774" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 20000 -->
+      <g transform="translate(27.240625 363.719993) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_27">
+      <path d="M 66.053125 321.54158
+L 471.871307 321.54158
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_28">
+      <g>
+       <use xlink:href="#m45782c255c" x="66.053125" y="321.54158" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 40000 -->
+      <g transform="translate(27.240625 325.340799) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_29">
+      <path d="M 66.053125 283.162386
+L 471.871307 283.162386
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_30">
+      <g>
+       <use xlink:href="#m45782c255c" x="66.053125" y="283.162386" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_16">
+      <!-- 60000 -->
+      <g transform="translate(27.240625 286.961605) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_31">
+      <path d="M 66.053125 244.783192
+L 471.871307 244.783192
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_32">
+      <g>
+       <use xlink:href="#m45782c255c" x="66.053125" y="244.783192" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_17">
+      <!-- 80000 -->
+      <g transform="translate(27.240625 248.582411) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-38"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_33">
+      <path d="M 66.053125 206.403998
+L 471.871307 206.403998
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_34">
+      <g>
+       <use xlink:href="#m45782c255c" x="66.053125" y="206.403998" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_18">
+      <!-- 100000 -->
+      <g transform="translate(20.878125 210.203217) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+       <use xlink:href="#DejaVuSans-30" x="318.115234"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_35">
+      <path d="M 66.053125 168.024804
+L 471.871307 168.024804
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_36">
+      <g>
+       <use xlink:href="#m45782c255c" x="66.053125" y="168.024804" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_19">
+      <!-- 120000 -->
+      <g transform="translate(20.878125 171.824023) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+       <use xlink:href="#DejaVuSans-30" x="318.115234"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_7">
+     <g id="line2d_37">
+      <path d="M 66.053125 129.64561
+L 471.871307 129.64561
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_38">
+      <g>
+       <use xlink:href="#m45782c255c" x="66.053125" y="129.64561" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_20">
+      <!-- 140000 -->
+      <g transform="translate(20.878125 133.444829) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-34" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+       <use xlink:href="#DejaVuSans-30" x="318.115234"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_8">
+     <g id="line2d_39">
+      <path d="M 66.053125 91.266416
+L 471.871307 91.266416
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_40">
+      <g>
+       <use xlink:href="#m45782c255c" x="66.053125" y="91.266416" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_21">
+      <!-- 160000 -->
+      <g transform="translate(20.878125 95.065635) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-36" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+       <use xlink:href="#DejaVuSans-30" x="318.115234"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_22">
+     <!-- duration (Unit.millisecond) ± stddev (count=3) -->
+     <g transform="translate(14.798438 338.201406) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-75" d="M 544 1381
+L 544 3500
+L 1119 3500
+L 1119 1403
+Q 1119 906 1312 657
+Q 1506 409 1894 409
+Q 2359 409 2629 706
+Q 2900 1003 2900 1516
+L 2900 3500
+L 3475 3500
+L 3475 0
+L 2900 0
+L 2900 538
+Q 2691 219 2414 64
+Q 2138 -91 1772 -91
+Q 1169 -91 856 284
+Q 544 659 544 1381
+z
+M 1991 3584
+L 1991 3584
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500
+L 1178 3500
+L 1178 0
+L 603 0
+L 603 3500
+z
+M 603 4863
+L 1178 4863
+L 1178 4134
+L 603 4134
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113
+L 3513 0
+L 2938 0
+L 2938 2094
+Q 2938 2591 2744 2837
+Q 2550 3084 2163 3084
+Q 1697 3084 1428 2787
+Q 1159 2491 1159 1978
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1366 3272 1645 3428
+Q 1925 3584 2291 3584
+Q 2894 3584 3203 3211
+Q 3513 2838 3513 2113
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-55" d="M 556 4666
+L 1191 4666
+L 1191 1831
+Q 1191 1081 1462 751
+Q 1734 422 2344 422
+Q 2950 422 3222 751
+Q 3494 1081 3494 1831
+L 3494 4666
+L 4128 4666
+L 4128 1753
+Q 4128 841 3676 375
+Q 3225 -91 2344 -91
+Q 1459 -91 1007 375
+Q 556 841 556 1753
+L 556 4666
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2e" d="M 684 794
+L 1344 794
+L 1344 0
+L 684 0
+L 684 794
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828
+Q 3544 3216 3844 3400
+Q 4144 3584 4550 3584
+Q 5097 3584 5394 3201
+Q 5691 2819 5691 2113
+L 5691 0
+L 5113 0
+L 5113 2094
+Q 5113 2597 4934 2840
+Q 4756 3084 4391 3084
+Q 3944 3084 3684 2787
+Q 3425 2491 3425 1978
+L 3425 0
+L 2847 0
+L 2847 2094
+Q 2847 2600 2669 2842
+Q 2491 3084 2119 3084
+Q 1678 3084 1418 2786
+Q 1159 2488 1159 1978
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1356 3278 1631 3431
+Q 1906 3584 2284 3584
+Q 2666 3584 2933 3390
+Q 3200 3197 3328 2828
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863
+L 1178 4863
+L 1178 0
+L 603 0
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366
+L 3122 2828
+Q 2878 2963 2633 3030
+Q 2388 3097 2138 3097
+Q 1578 3097 1268 2742
+Q 959 2388 959 1747
+Q 959 1106 1268 751
+Q 1578 397 2138 397
+Q 2388 397 2633 464
+Q 2878 531 3122 666
+L 3122 134
+Q 2881 22 2623 -34
+Q 2366 -91 2075 -91
+Q 1284 -91 818 406
+Q 353 903 353 1747
+Q 353 2603 823 3093
+Q 1294 3584 2113 3584
+Q 2378 3584 2631 3529
+Q 2884 3475 3122 3366
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-b1" d="M 2944 4013
+L 2944 2803
+L 4684 2803
+L 4684 2272
+L 2944 2272
+L 2944 1063
+L 2419 1063
+L 2419 2272
+L 678 2272
+L 678 2803
+L 2419 2803
+L 2419 4013
+L 2944 4013
+z
+M 678 531
+L 4684 531
+L 4684 0
+L 678 0
+L 678 531
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-76" d="M 191 3500
+L 800 3500
+L 1894 563
+L 2988 3500
+L 3597 3500
+L 2284 0
+L 1503 0
+L 191 3500
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-3d" d="M 678 2906
+L 4684 2906
+L 4684 2381
+L 678 2381
+L 678 2906
+z
+M 678 1631
+L 4684 1631
+L 4684 1100
+L 678 1100
+L 678 1631
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-64"/>
+      <use xlink:href="#DejaVuSans-75" x="63.476562"/>
+      <use xlink:href="#DejaVuSans-72" x="126.855469"/>
+      <use xlink:href="#DejaVuSans-61" x="167.96875"/>
+      <use xlink:href="#DejaVuSans-74" x="229.248047"/>
+      <use xlink:href="#DejaVuSans-69" x="268.457031"/>
+      <use xlink:href="#DejaVuSans-6f" x="296.240234"/>
+      <use xlink:href="#DejaVuSans-6e" x="357.421875"/>
+      <use xlink:href="#DejaVuSans-20" x="420.800781"/>
+      <use xlink:href="#DejaVuSans-28" x="452.587891"/>
+      <use xlink:href="#DejaVuSans-55" x="491.601562"/>
+      <use xlink:href="#DejaVuSans-6e" x="564.794922"/>
+      <use xlink:href="#DejaVuSans-69" x="628.173828"/>
+      <use xlink:href="#DejaVuSans-74" x="655.957031"/>
+      <use xlink:href="#DejaVuSans-2e" x="695.166016"/>
+      <use xlink:href="#DejaVuSans-6d" x="726.953125"/>
+      <use xlink:href="#DejaVuSans-69" x="824.365234"/>
+      <use xlink:href="#DejaVuSans-6c" x="852.148438"/>
+      <use xlink:href="#DejaVuSans-6c" x="879.931641"/>
+      <use xlink:href="#DejaVuSans-69" x="907.714844"/>
+      <use xlink:href="#DejaVuSans-73" x="935.498047"/>
+      <use xlink:href="#DejaVuSans-65" x="987.597656"/>
+      <use xlink:href="#DejaVuSans-63" x="1049.121094"/>
+      <use xlink:href="#DejaVuSans-6f" x="1104.101562"/>
+      <use xlink:href="#DejaVuSans-6e" x="1165.283203"/>
+      <use xlink:href="#DejaVuSans-64" x="1228.662109"/>
+      <use xlink:href="#DejaVuSans-29" x="1292.138672"/>
+      <use xlink:href="#DejaVuSans-20" x="1331.152344"/>
+      <use xlink:href="#DejaVuSans-b1" x="1362.939453"/>
+      <use xlink:href="#DejaVuSans-20" x="1446.728516"/>
+      <use xlink:href="#DejaVuSans-73" x="1478.515625"/>
+      <use xlink:href="#DejaVuSans-74" x="1530.615234"/>
+      <use xlink:href="#DejaVuSans-64" x="1569.824219"/>
+      <use xlink:href="#DejaVuSans-64" x="1633.300781"/>
+      <use xlink:href="#DejaVuSans-65" x="1696.777344"/>
+      <use xlink:href="#DejaVuSans-76" x="1758.300781"/>
+      <use xlink:href="#DejaVuSans-20" x="1817.480469"/>
+      <use xlink:href="#DejaVuSans-28" x="1849.267578"/>
+      <use xlink:href="#DejaVuSans-63" x="1888.28125"/>
+      <use xlink:href="#DejaVuSans-6f" x="1943.261719"/>
+      <use xlink:href="#DejaVuSans-75" x="2004.443359"/>
+      <use xlink:href="#DejaVuSans-6e" x="2067.822266"/>
+      <use xlink:href="#DejaVuSans-74" x="2131.201172"/>
+      <use xlink:href="#DejaVuSans-3d" x="2170.410156"/>
+      <use xlink:href="#DejaVuSans-33" x="2254.199219"/>
+      <use xlink:href="#DejaVuSans-29" x="2317.822266"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_41">
+    <path d="M 84.499406 370.871637
+L 118.038099 343.443307
+L 151.576791 316.014976
+L 185.115484 288.586645
+L 218.654177 261.158315
+L 252.19287 233.729984
+L 285.731562 206.301653
+L 319.270255 178.873323
+L 352.808948 151.444992
+L 386.34764 124.016661
+L 419.886333 96.588331
+L 453.425026 69.16
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #bf616a; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_42">
+    <path d="M 84.499406 370.871637
+L 118.038099 370.871637
+L 151.576791 370.871637
+L 185.115484 370.871637
+L 218.654177 370.871637
+L 252.19287 370.871637
+L 285.731562 370.871637
+L 319.270255 370.871637
+L 352.808948 370.871637
+L 386.34764 370.871637
+L 419.886333 370.871637
+L 453.425026 370.871637
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #a3be8c; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="LineCollection_1">
+    <path d="M 84.499406 371.56
+L 84.499406 370.183275
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 118.038099 370.476473
+L 118.038099 369.13036
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 151.576791 370.268223
+L 151.576791 368.994476
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 185.115484 370.199372
+L 185.115484 368.815142
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 218.654177 370.06255
+L 218.654177 368.783095
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 252.19287 369.652429
+L 252.19287 368.342478
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 285.731562 368.632982
+L 285.731562 367.387955
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 319.270255 367.822762
+L 319.270255 366.471112
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 352.808948 367.180444
+L 352.808948 365.976126
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 386.34764 366.592452
+L 386.34764 365.36157
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 419.886333 365.848344
+L 419.886333 364.764965
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 453.425026 365.08437
+L 453.425026 363.996329
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+   </g>
+   <g id="line2d_43">
+    <path d="M 84.499406 370.871637
+L 118.038099 369.803417
+L 151.576791 369.63135
+L 185.115484 369.507257
+L 218.654177 369.422823
+L 252.19287 368.997453
+L 285.731562 368.010469
+L 319.270255 367.146937
+L 352.808948 366.578285
+L 386.34764 365.977011
+L 419.886333 365.306654
+L 453.425026 364.54035
+" clip-path="url(#p1031157c27)" style="fill: none; stroke: #5e81ac; stroke-width: 2; stroke-linecap: square"/>
+    <defs>
+     <path id="mce4831cd19" d="M 0 3
+C 0.795609 3 1.55874 2.683901 2.12132 2.12132
+C 2.683901 1.55874 3 0.795609 3 0
+C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132
+C 1.55874 -2.683901 0.795609 -3 0 -3
+C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132
+C -2.683901 -1.55874 -3 -0.795609 -3 0
+C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132
+C -1.55874 2.683901 -0.795609 3 0 3
+z
+" style="stroke: #5e81ac"/>
+    </defs>
+    <g clip-path="url(#p1031157c27)">
+     <use xlink:href="#mce4831cd19" x="84.499406" y="370.871637" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="118.038099" y="369.803417" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="151.576791" y="369.63135" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="185.115484" y="369.507257" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="218.654177" y="369.422823" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="252.19287" y="368.997453" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="285.731562" y="368.010469" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="319.270255" y="367.146937" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="352.808948" y="366.578285" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="386.34764" y="365.977011" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="419.886333" y="365.306654" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="453.425026" y="364.54035" style="fill: #5e81ac; stroke: #5e81ac"/>
+    </g>
+   </g>
+   <g id="patch_3">
+    <path d="M 66.053125 386.68
+L 66.053125 54.04
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 471.871307 386.68
+L 471.871307 54.04
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 66.053125 386.68
+L 471.871307 386.68
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 66.053125 54.04
+L 471.871307 54.04
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+  </g>
+  <g id="axes_2">
+   <g id="patch_7">
+    <path d="M 553.034943 386.68
+L 958.853125 386.68
+L 958.853125 54.04
+L 553.034943 54.04
+L 553.034943 386.68
+z
+" style="fill: none"/>
+   </g>
+   <g id="matplotlib.axis_3">
+    <g id="xtick_13">
+     <g id="line2d_44">
+      <path d="M 571.481224 386.68
+L 571.481224 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_45">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="571.481224" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_23">
+      <!-- 1 -->
+      <g transform="translate(568.299974 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_14">
+     <g id="line2d_46">
+      <path d="M 605.019917 386.68
+L 605.019917 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_47">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="605.019917" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_24">
+      <!-- 2 -->
+      <g transform="translate(601.838667 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_15">
+     <g id="line2d_48">
+      <path d="M 638.55861 386.68
+L 638.55861 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_49">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="638.55861" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_25">
+      <!-- 3 -->
+      <g transform="translate(635.37736 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_16">
+     <g id="line2d_50">
+      <path d="M 672.097302 386.68
+L 672.097302 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_51">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="672.097302" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_26">
+      <!-- 4 -->
+      <g transform="translate(668.916052 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_17">
+     <g id="line2d_52">
+      <path d="M 705.635995 386.68
+L 705.635995 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_53">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="705.635995" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_27">
+      <!-- 5 -->
+      <g transform="translate(702.454745 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-35"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_18">
+     <g id="line2d_54">
+      <path d="M 739.174688 386.68
+L 739.174688 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_55">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="739.174688" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_28">
+      <!-- 6 -->
+      <g transform="translate(735.993438 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_19">
+     <g id="line2d_56">
+      <path d="M 772.71338 386.68
+L 772.71338 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_57">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="772.71338" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_29">
+      <!-- 7 -->
+      <g transform="translate(769.53213 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-37"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_20">
+     <g id="line2d_58">
+      <path d="M 806.252073 386.68
+L 806.252073 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_59">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="806.252073" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_30">
+      <!-- 8 -->
+      <g transform="translate(803.070823 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-38"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_21">
+     <g id="line2d_60">
+      <path d="M 839.790766 386.68
+L 839.790766 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_61">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="839.790766" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_31">
+      <!-- 9 -->
+      <g transform="translate(836.609516 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-39"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_22">
+     <g id="line2d_62">
+      <path d="M 873.329459 386.68
+L 873.329459 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_63">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="873.329459" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_32">
+      <!-- 10 -->
+      <g transform="translate(866.966959 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_23">
+     <g id="line2d_64">
+      <path d="M 906.868151 386.68
+L 906.868151 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_65">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="906.868151" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_33">
+      <!-- 11 -->
+      <g transform="translate(900.505651 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-31" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_24">
+     <g id="line2d_66">
+      <path d="M 940.406844 386.68
+L 940.406844 54.04
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_67">
+      <g>
+       <use xlink:href="#mfb9b06afb3" x="940.406844" y="386.68" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_34">
+      <!-- 12 -->
+      <g transform="translate(934.044344 401.278437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_35">
+     <!-- workers (thread) -->
+     <g transform="translate(714.412003 414.956562) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-77"/>
+      <use xlink:href="#DejaVuSans-6f" x="81.787109"/>
+      <use xlink:href="#DejaVuSans-72" x="142.96875"/>
+      <use xlink:href="#DejaVuSans-6b" x="184.082031"/>
+      <use xlink:href="#DejaVuSans-65" x="238.367188"/>
+      <use xlink:href="#DejaVuSans-72" x="299.890625"/>
+      <use xlink:href="#DejaVuSans-73" x="341.003906"/>
+      <use xlink:href="#DejaVuSans-20" x="393.103516"/>
+      <use xlink:href="#DejaVuSans-28" x="424.890625"/>
+      <use xlink:href="#DejaVuSans-74" x="463.904297"/>
+      <use xlink:href="#DejaVuSans-68" x="503.113281"/>
+      <use xlink:href="#DejaVuSans-72" x="566.492188"/>
+      <use xlink:href="#DejaVuSans-65" x="605.355469"/>
+      <use xlink:href="#DejaVuSans-61" x="666.878906"/>
+      <use xlink:href="#DejaVuSans-64" x="728.158203"/>
+      <use xlink:href="#DejaVuSans-29" x="791.634766"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_4">
+    <g id="ytick_9">
+     <g id="line2d_68">
+      <path d="M 553.034943 333.072727
+L 958.853125 333.072727
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_69">
+      <g>
+       <use xlink:href="#m45782c255c" x="553.034943" y="333.072727" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_36">
+      <!-- 20 -->
+      <g transform="translate(533.309943 336.871946) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_10">
+     <g id="line2d_70">
+      <path d="M 553.034943 267.094545
+L 958.853125 267.094545
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_71">
+      <g>
+       <use xlink:href="#m45782c255c" x="553.034943" y="267.094545" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_37">
+      <!-- 40 -->
+      <g transform="translate(533.309943 270.893764) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_11">
+     <g id="line2d_72">
+      <path d="M 553.034943 201.116364
+L 958.853125 201.116364
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_73">
+      <g>
+       <use xlink:href="#m45782c255c" x="553.034943" y="201.116364" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_38">
+      <!-- 60 -->
+      <g transform="translate(533.309943 204.915582) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_12">
+     <g id="line2d_74">
+      <path d="M 553.034943 135.138182
+L 958.853125 135.138182
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_75">
+      <g>
+       <use xlink:href="#m45782c255c" x="553.034943" y="135.138182" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_39">
+      <!-- 80 -->
+      <g transform="translate(533.309943 138.937401) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-38"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_13">
+     <g id="line2d_76">
+      <path d="M 553.034943 69.16
+L 958.853125 69.16
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_77">
+      <g>
+       <use xlink:href="#m45782c255c" x="553.034943" y="69.16" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_40">
+      <!-- 100 -->
+      <g transform="translate(526.947443 72.959219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_41">
+     <!-- relative efficiency (%) -->
+     <g transform="translate(520.867756 275.126406) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-66" d="M 2375 4863
+L 2375 4384
+L 1825 4384
+Q 1516 4384 1395 4259
+Q 1275 4134 1275 3809
+L 1275 3500
+L 2222 3500
+L 2222 3053
+L 1275 3053
+L 1275 0
+L 697 0
+L 697 3053
+L 147 3053
+L 147 3500
+L 697 3500
+L 697 3744
+Q 697 4328 969 4595
+Q 1241 4863 1831 4863
+L 2375 4863
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-79" d="M 2059 -325
+Q 1816 -950 1584 -1140
+Q 1353 -1331 966 -1331
+L 506 -1331
+L 506 -850
+L 844 -850
+Q 1081 -850 1212 -737
+Q 1344 -625 1503 -206
+L 1606 56
+L 191 3500
+L 800 3500
+L 1894 763
+L 2988 3500
+L 3597 3500
+L 2059 -325
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-25" d="M 4653 2053
+Q 4381 2053 4226 1822
+Q 4072 1591 4072 1178
+Q 4072 772 4226 539
+Q 4381 306 4653 306
+Q 4919 306 5073 539
+Q 5228 772 5228 1178
+Q 5228 1588 5073 1820
+Q 4919 2053 4653 2053
+z
+M 4653 2450
+Q 5147 2450 5437 2106
+Q 5728 1763 5728 1178
+Q 5728 594 5436 251
+Q 5144 -91 4653 -91
+Q 4153 -91 3862 251
+Q 3572 594 3572 1178
+Q 3572 1766 3864 2108
+Q 4156 2450 4653 2450
+z
+M 1428 4353
+Q 1159 4353 1004 4120
+Q 850 3888 850 3481
+Q 850 3069 1003 2837
+Q 1156 2606 1428 2606
+Q 1700 2606 1854 2837
+Q 2009 3069 2009 3481
+Q 2009 3884 1853 4118
+Q 1697 4353 1428 4353
+z
+M 4250 4750
+L 4750 4750
+L 1831 -91
+L 1331 -91
+L 4250 4750
+z
+M 1428 4750
+Q 1922 4750 2215 4408
+Q 2509 4066 2509 3481
+Q 2509 2891 2217 2550
+Q 1925 2209 1428 2209
+Q 931 2209 642 2551
+Q 353 2894 353 3481
+Q 353 4063 643 4406
+Q 934 4750 1428 4750
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-72"/>
+      <use xlink:href="#DejaVuSans-65" x="38.863281"/>
+      <use xlink:href="#DejaVuSans-6c" x="100.386719"/>
+      <use xlink:href="#DejaVuSans-61" x="128.169922"/>
+      <use xlink:href="#DejaVuSans-74" x="189.449219"/>
+      <use xlink:href="#DejaVuSans-69" x="228.658203"/>
+      <use xlink:href="#DejaVuSans-76" x="256.441406"/>
+      <use xlink:href="#DejaVuSans-65" x="315.621094"/>
+      <use xlink:href="#DejaVuSans-20" x="377.144531"/>
+      <use xlink:href="#DejaVuSans-65" x="408.931641"/>
+      <use xlink:href="#DejaVuSans-66" x="470.455078"/>
+      <use xlink:href="#DejaVuSans-66" x="505.660156"/>
+      <use xlink:href="#DejaVuSans-69" x="540.865234"/>
+      <use xlink:href="#DejaVuSans-63" x="568.648438"/>
+      <use xlink:href="#DejaVuSans-69" x="623.628906"/>
+      <use xlink:href="#DejaVuSans-65" x="651.412109"/>
+      <use xlink:href="#DejaVuSans-6e" x="712.935547"/>
+      <use xlink:href="#DejaVuSans-63" x="776.314453"/>
+      <use xlink:href="#DejaVuSans-79" x="831.294922"/>
+      <use xlink:href="#DejaVuSans-20" x="890.474609"/>
+      <use xlink:href="#DejaVuSans-28" x="922.261719"/>
+      <use xlink:href="#DejaVuSans-25" x="961.275391"/>
+      <use xlink:href="#DejaVuSans-29" x="1056.294922"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_78">
+    <path d="M 571.481224 69.16
+L 605.019917 234.105455
+L 638.55861 289.087273
+L 672.097302 316.578182
+L 705.635995 333.072727
+L 739.174688 344.069091
+L 772.71338 351.923636
+L 806.252073 357.814545
+L 839.790766 362.396364
+L 873.329459 366.061818
+L 906.868151 369.060826
+L 940.406844 371.56
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #bf616a; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_79">
+    <path d="M 571.481224 69.16
+L 605.019917 69.16
+L 638.55861 69.16
+L 672.097302 69.16
+L 705.635995 69.16
+L 739.174688 69.16
+L 772.71338 69.16
+L 806.252073 69.16
+L 839.790766 69.16
+L 873.329459 69.16
+L 906.868151 69.16
+L 940.406844 69.16
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #a3be8c; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="LineCollection_2">
+    <path d="M 571.481224 69.16
+L 571.481224 69.16
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 605.019917 83.259305
+L 605.019917 79.807676
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 638.55861 84.405754
+L 638.55861 82.498108
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 672.097302 85.216565
+L 672.097302 84.383594
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 705.635995 87.276857
+L 705.635995 84.181937
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 739.174688 91.466926
+L 739.174688 89.088572
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 772.71338 101.921432
+L 772.71338 98.775876
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 806.252073 110.144743
+L 806.252073 107.098381
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 839.790766 115.786825
+L 839.790766 111.894572
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 873.329459 120.944341
+L 873.329459 117.348858
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 906.868151 127.695355
+L 906.868151 121.978965
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+    <path d="M 940.406844 133.765631
+L 940.406844 128.361844
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+   </g>
+   <g id="line2d_80">
+    <path d="M 571.481224 69.16
+L 605.019917 81.53349
+L 638.55861 83.451931
+L 672.097302 84.800079
+L 705.635995 85.729397
+L 739.174688 90.277749
+L 772.71338 100.348654
+L 806.252073 108.621562
+L 839.790766 113.840699
+L 873.329459 119.1466
+L 906.868151 124.83716
+L 940.406844 131.063737
+" clip-path="url(#p436e6804ea)" style="fill: none; stroke: #5e81ac; stroke-width: 2; stroke-linecap: square"/>
+    <g clip-path="url(#p436e6804ea)">
+     <use xlink:href="#mce4831cd19" x="571.481224" y="69.16" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="605.019917" y="81.53349" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="638.55861" y="83.451931" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="672.097302" y="84.800079" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="705.635995" y="85.729397" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="739.174688" y="90.277749" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="772.71338" y="100.348654" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="806.252073" y="108.621562" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="839.790766" y="113.840699" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="873.329459" y="119.1466" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="906.868151" y="124.83716" style="fill: #5e81ac; stroke: #5e81ac"/>
+     <use xlink:href="#mce4831cd19" x="940.406844" y="131.063737" style="fill: #5e81ac; stroke: #5e81ac"/>
+    </g>
+   </g>
+   <g id="patch_8">
+    <path d="M 553.034943 386.68
+L 553.034943 54.04
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_9">
+    <path d="M 958.853125 386.68
+L 958.853125 54.04
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_10">
+    <path d="M 553.034943 386.68
+L 958.853125 386.68
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_11">
+    <path d="M 553.034943 54.04
+L 958.853125 54.04
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+  </g>
+  <g id="text_42">
+   <!-- game_of_life.py, orkney, Wed Oct 30 15:45:44 2024 -->
+   <g transform="translate(341.621875 19.958125) scale(0.12 -0.12)">
+    <defs>
+     <path id="DejaVuSans-67" d="M 2906 1791
+Q 2906 2416 2648 2759
+Q 2391 3103 1925 3103
+Q 1463 3103 1205 2759
+Q 947 2416 947 1791
+Q 947 1169 1205 825
+Q 1463 481 1925 481
+Q 2391 481 2648 825
+Q 2906 1169 2906 1791
+z
+M 3481 434
+Q 3481 -459 3084 -895
+Q 2688 -1331 1869 -1331
+Q 1566 -1331 1297 -1286
+Q 1028 -1241 775 -1147
+L 775 -588
+Q 1028 -725 1275 -790
+Q 1522 -856 1778 -856
+Q 2344 -856 2625 -561
+Q 2906 -266 2906 331
+L 2906 616
+Q 2728 306 2450 153
+Q 2172 0 1784 0
+Q 1141 0 747 490
+Q 353 981 353 1791
+Q 353 2603 747 3093
+Q 1141 3584 1784 3584
+Q 2172 3584 2450 3431
+Q 2728 3278 2906 2969
+L 2906 3500
+L 3481 3500
+L 3481 434
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-5f" d="M 3263 -1063
+L 3263 -1509
+L -63 -1509
+L -63 -1063
+L 3263 -1063
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-70" d="M 1159 525
+L 1159 -1331
+L 581 -1331
+L 581 3500
+L 1159 3500
+L 1159 2969
+Q 1341 3281 1617 3432
+Q 1894 3584 2278 3584
+Q 2916 3584 3314 3078
+Q 3713 2572 3713 1747
+Q 3713 922 3314 415
+Q 2916 -91 2278 -91
+Q 1894 -91 1617 61
+Q 1341 213 1159 525
+z
+M 3116 1747
+Q 3116 2381 2855 2742
+Q 2594 3103 2138 3103
+Q 1681 3103 1420 2742
+Q 1159 2381 1159 1747
+Q 1159 1113 1420 752
+Q 1681 391 2138 391
+Q 2594 391 2855 752
+Q 3116 1113 3116 1747
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-2c" d="M 750 794
+L 1409 794
+L 1409 256
+L 897 -744
+L 494 -744
+L 750 256
+L 750 794
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-57" d="M 213 4666
+L 850 4666
+L 1831 722
+L 2809 4666
+L 3519 4666
+L 4500 722
+L 5478 4666
+L 6119 4666
+L 4947 0
+L 4153 0
+L 3169 4050
+L 2175 0
+L 1381 0
+L 213 4666
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-4f" d="M 2522 4238
+Q 1834 4238 1429 3725
+Q 1025 3213 1025 2328
+Q 1025 1447 1429 934
+Q 1834 422 2522 422
+Q 3209 422 3611 934
+Q 4013 1447 4013 2328
+Q 4013 3213 3611 3725
+Q 3209 4238 2522 4238
+z
+M 2522 4750
+Q 3503 4750 4090 4092
+Q 4678 3434 4678 2328
+Q 4678 1225 4090 567
+Q 3503 -91 2522 -91
+Q 1538 -91 948 565
+Q 359 1222 359 2328
+Q 359 3434 948 4092
+Q 1538 4750 2522 4750
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-3a" d="M 750 794
+L 1409 794
+L 1409 0
+L 750 0
+L 750 794
+z
+M 750 3309
+L 1409 3309
+L 1409 2516
+L 750 2516
+L 750 3309
+z
+" transform="scale(0.015625)"/>
+    </defs>
+    <use xlink:href="#DejaVuSans-67"/>
+    <use xlink:href="#DejaVuSans-61" x="63.476562"/>
+    <use xlink:href="#DejaVuSans-6d" x="124.755859"/>
+    <use xlink:href="#DejaVuSans-65" x="222.167969"/>
+    <use xlink:href="#DejaVuSans-5f" x="283.691406"/>
+    <use xlink:href="#DejaVuSans-6f" x="333.691406"/>
+    <use xlink:href="#DejaVuSans-66" x="394.873047"/>
+    <use xlink:href="#DejaVuSans-5f" x="430.078125"/>
+    <use xlink:href="#DejaVuSans-6c" x="480.078125"/>
+    <use xlink:href="#DejaVuSans-69" x="507.861328"/>
+    <use xlink:href="#DejaVuSans-66" x="535.644531"/>
+    <use xlink:href="#DejaVuSans-65" x="570.849609"/>
+    <use xlink:href="#DejaVuSans-2e" x="632.373047"/>
+    <use xlink:href="#DejaVuSans-70" x="664.160156"/>
+    <use xlink:href="#DejaVuSans-79" x="727.636719"/>
+    <use xlink:href="#DejaVuSans-2c" x="786.816406"/>
+    <use xlink:href="#DejaVuSans-20" x="818.603516"/>
+    <use xlink:href="#DejaVuSans-6f" x="850.390625"/>
+    <use xlink:href="#DejaVuSans-72" x="911.572266"/>
+    <use xlink:href="#DejaVuSans-6b" x="952.685547"/>
+    <use xlink:href="#DejaVuSans-6e" x="1010.595703"/>
+    <use xlink:href="#DejaVuSans-65" x="1073.974609"/>
+    <use xlink:href="#DejaVuSans-79" x="1135.498047"/>
+    <use xlink:href="#DejaVuSans-2c" x="1194.677734"/>
+    <use xlink:href="#DejaVuSans-20" x="1226.464844"/>
+    <use xlink:href="#DejaVuSans-57" x="1258.251953"/>
+    <use xlink:href="#DejaVuSans-65" x="1351.253906"/>
+    <use xlink:href="#DejaVuSans-64" x="1412.777344"/>
+    <use xlink:href="#DejaVuSans-20" x="1476.253906"/>
+    <use xlink:href="#DejaVuSans-4f" x="1508.041016"/>
+    <use xlink:href="#DejaVuSans-63" x="1586.751953"/>
+    <use xlink:href="#DejaVuSans-74" x="1641.732422"/>
+    <use xlink:href="#DejaVuSans-20" x="1680.941406"/>
+    <use xlink:href="#DejaVuSans-33" x="1712.728516"/>
+    <use xlink:href="#DejaVuSans-30" x="1776.351562"/>
+    <use xlink:href="#DejaVuSans-20" x="1839.974609"/>
+    <use xlink:href="#DejaVuSans-31" x="1871.761719"/>
+    <use xlink:href="#DejaVuSans-35" x="1935.384766"/>
+    <use xlink:href="#DejaVuSans-3a" x="1999.007812"/>
+    <use xlink:href="#DejaVuSans-34" x="2032.699219"/>
+    <use xlink:href="#DejaVuSans-35" x="2096.322266"/>
+    <use xlink:href="#DejaVuSans-3a" x="2159.945312"/>
+    <use xlink:href="#DejaVuSans-34" x="2193.636719"/>
+    <use xlink:href="#DejaVuSans-34" x="2257.259766"/>
+    <use xlink:href="#DejaVuSans-20" x="2320.882812"/>
+    <use xlink:href="#DejaVuSans-32" x="2352.669922"/>
+    <use xlink:href="#DejaVuSans-30" x="2416.292969"/>
+    <use xlink:href="#DejaVuSans-32" x="2479.916016"/>
+    <use xlink:href="#DejaVuSans-34" x="2543.539062"/>
+   </g>
+   <!-- Weak scalability experiment on 5000x5000 array per worker and 850x850 partitions (core_numa_node) -->
+   <g transform="translate(186.195625 33.72925) scale(0.12 -0.12)">
+    <defs>
+     <path id="DejaVuSans-62" d="M 3116 1747
+Q 3116 2381 2855 2742
+Q 2594 3103 2138 3103
+Q 1681 3103 1420 2742
+Q 1159 2381 1159 1747
+Q 1159 1113 1420 752
+Q 1681 391 2138 391
+Q 2594 391 2855 752
+Q 3116 1113 3116 1747
+z
+M 1159 2969
+Q 1341 3281 1617 3432
+Q 1894 3584 2278 3584
+Q 2916 3584 3314 3078
+Q 3713 2572 3713 1747
+Q 3713 922 3314 415
+Q 2916 -91 2278 -91
+Q 1894 -91 1617 61
+Q 1341 213 1159 525
+L 1159 0
+L 581 0
+L 581 4863
+L 1159 4863
+L 1159 2969
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-78" d="M 3513 3500
+L 2247 1797
+L 3578 0
+L 2900 0
+L 1881 1375
+L 863 0
+L 184 0
+L 1544 1831
+L 300 3500
+L 978 3500
+L 1906 2253
+L 2834 3500
+L 3513 3500
+z
+" transform="scale(0.015625)"/>
+    </defs>
+    <use xlink:href="#DejaVuSans-57"/>
+    <use xlink:href="#DejaVuSans-65" x="93.001953"/>
+    <use xlink:href="#DejaVuSans-61" x="154.525391"/>
+    <use xlink:href="#DejaVuSans-6b" x="215.804688"/>
+    <use xlink:href="#DejaVuSans-20" x="273.714844"/>
+    <use xlink:href="#DejaVuSans-73" x="305.501953"/>
+    <use xlink:href="#DejaVuSans-63" x="357.601562"/>
+    <use xlink:href="#DejaVuSans-61" x="412.582031"/>
+    <use xlink:href="#DejaVuSans-6c" x="473.861328"/>
+    <use xlink:href="#DejaVuSans-61" x="501.644531"/>
+    <use xlink:href="#DejaVuSans-62" x="562.923828"/>
+    <use xlink:href="#DejaVuSans-69" x="626.400391"/>
+    <use xlink:href="#DejaVuSans-6c" x="654.183594"/>
+    <use xlink:href="#DejaVuSans-69" x="681.966797"/>
+    <use xlink:href="#DejaVuSans-74" x="709.75"/>
+    <use xlink:href="#DejaVuSans-79" x="748.958984"/>
+    <use xlink:href="#DejaVuSans-20" x="808.138672"/>
+    <use xlink:href="#DejaVuSans-65" x="839.925781"/>
+    <use xlink:href="#DejaVuSans-78" x="899.699219"/>
+    <use xlink:href="#DejaVuSans-70" x="958.878906"/>
+    <use xlink:href="#DejaVuSans-65" x="1022.355469"/>
+    <use xlink:href="#DejaVuSans-72" x="1083.878906"/>
+    <use xlink:href="#DejaVuSans-69" x="1124.992188"/>
+    <use xlink:href="#DejaVuSans-6d" x="1152.775391"/>
+    <use xlink:href="#DejaVuSans-65" x="1250.1875"/>
+    <use xlink:href="#DejaVuSans-6e" x="1311.710938"/>
+    <use xlink:href="#DejaVuSans-74" x="1375.089844"/>
+    <use xlink:href="#DejaVuSans-20" x="1414.298828"/>
+    <use xlink:href="#DejaVuSans-6f" x="1446.085938"/>
+    <use xlink:href="#DejaVuSans-6e" x="1507.267578"/>
+    <use xlink:href="#DejaVuSans-20" x="1570.646484"/>
+    <use xlink:href="#DejaVuSans-35" x="1602.433594"/>
+    <use xlink:href="#DejaVuSans-30" x="1666.056641"/>
+    <use xlink:href="#DejaVuSans-30" x="1729.679688"/>
+    <use xlink:href="#DejaVuSans-30" x="1793.302734"/>
+    <use xlink:href="#DejaVuSans-78" x="1856.925781"/>
+    <use xlink:href="#DejaVuSans-35" x="1916.105469"/>
+    <use xlink:href="#DejaVuSans-30" x="1979.728516"/>
+    <use xlink:href="#DejaVuSans-30" x="2043.351562"/>
+    <use xlink:href="#DejaVuSans-30" x="2106.974609"/>
+    <use xlink:href="#DejaVuSans-20" x="2170.597656"/>
+    <use xlink:href="#DejaVuSans-61" x="2202.384766"/>
+    <use xlink:href="#DejaVuSans-72" x="2263.664062"/>
+    <use xlink:href="#DejaVuSans-72" x="2303.027344"/>
+    <use xlink:href="#DejaVuSans-61" x="2344.140625"/>
+    <use xlink:href="#DejaVuSans-79" x="2405.419922"/>
+    <use xlink:href="#DejaVuSans-20" x="2464.599609"/>
+    <use xlink:href="#DejaVuSans-70" x="2496.386719"/>
+    <use xlink:href="#DejaVuSans-65" x="2559.863281"/>
+    <use xlink:href="#DejaVuSans-72" x="2621.386719"/>
+    <use xlink:href="#DejaVuSans-20" x="2662.5"/>
+    <use xlink:href="#DejaVuSans-77" x="2694.287109"/>
+    <use xlink:href="#DejaVuSans-6f" x="2776.074219"/>
+    <use xlink:href="#DejaVuSans-72" x="2837.255859"/>
+    <use xlink:href="#DejaVuSans-6b" x="2878.369141"/>
+    <use xlink:href="#DejaVuSans-65" x="2932.654297"/>
+    <use xlink:href="#DejaVuSans-72" x="2994.177734"/>
+    <use xlink:href="#DejaVuSans-20" x="3035.291016"/>
+    <use xlink:href="#DejaVuSans-61" x="3067.078125"/>
+    <use xlink:href="#DejaVuSans-6e" x="3128.357422"/>
+    <use xlink:href="#DejaVuSans-64" x="3191.736328"/>
+    <use xlink:href="#DejaVuSans-20" x="3255.212891"/>
+    <use xlink:href="#DejaVuSans-38" x="3287"/>
+    <use xlink:href="#DejaVuSans-35" x="3350.623047"/>
+    <use xlink:href="#DejaVuSans-30" x="3414.246094"/>
+    <use xlink:href="#DejaVuSans-78" x="3477.869141"/>
+    <use xlink:href="#DejaVuSans-38" x="3537.048828"/>
+    <use xlink:href="#DejaVuSans-35" x="3600.671875"/>
+    <use xlink:href="#DejaVuSans-30" x="3664.294922"/>
+    <use xlink:href="#DejaVuSans-20" x="3727.917969"/>
+    <use xlink:href="#DejaVuSans-70" x="3759.705078"/>
+    <use xlink:href="#DejaVuSans-61" x="3823.181641"/>
+    <use xlink:href="#DejaVuSans-72" x="3884.460938"/>
+    <use xlink:href="#DejaVuSans-74" x="3925.574219"/>
+    <use xlink:href="#DejaVuSans-69" x="3964.783203"/>
+    <use xlink:href="#DejaVuSans-74" x="3992.566406"/>
+    <use xlink:href="#DejaVuSans-69" x="4031.775391"/>
+    <use xlink:href="#DejaVuSans-6f" x="4059.558594"/>
+    <use xlink:href="#DejaVuSans-6e" x="4120.740234"/>
+    <use xlink:href="#DejaVuSans-73" x="4184.119141"/>
+    <use xlink:href="#DejaVuSans-20" x="4236.21875"/>
+    <use xlink:href="#DejaVuSans-28" x="4268.005859"/>
+    <use xlink:href="#DejaVuSans-63" x="4307.019531"/>
+    <use xlink:href="#DejaVuSans-6f" x="4362"/>
+    <use xlink:href="#DejaVuSans-72" x="4423.181641"/>
+    <use xlink:href="#DejaVuSans-65" x="4462.044922"/>
+    <use xlink:href="#DejaVuSans-5f" x="4523.568359"/>
+    <use xlink:href="#DejaVuSans-6e" x="4573.568359"/>
+    <use xlink:href="#DejaVuSans-75" x="4636.947266"/>
+    <use xlink:href="#DejaVuSans-6d" x="4700.326172"/>
+    <use xlink:href="#DejaVuSans-61" x="4797.738281"/>
+    <use xlink:href="#DejaVuSans-5f" x="4859.017578"/>
+    <use xlink:href="#DejaVuSans-6e" x="4909.017578"/>
+    <use xlink:href="#DejaVuSans-6f" x="4972.396484"/>
+    <use xlink:href="#DejaVuSans-64" x="5033.578125"/>
+    <use xlink:href="#DejaVuSans-65" x="5097.054688"/>
+    <use xlink:href="#DejaVuSans-29" x="5158.578125"/>
+   </g>
+  </g>
+  <g id="legend_1">
+   <g id="patch_12">
+    <path d="M 1006.4625 52.034375
+L 1069.253125 52.034375
+Q 1071.253125 52.034375 1071.253125 50.034375
+L 1071.253125 7
+Q 1071.253125 5 1069.253125 5
+L 1006.4625 5
+Q 1004.4625 5 1004.4625 7
+L 1004.4625 50.034375
+Q 1004.4625 52.034375 1006.4625 52.034375
+L 1006.4625 52.034375
+z
+" style="fill: none; opacity: 0"/>
+   </g>
+   <g id="line2d_81">
+    <path d="M 1008.4625 13.098437
+L 1018.4625 13.098437
+L 1028.4625 13.098437
+" style="fill: none; stroke: #bf616a; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="text_43">
+    <!-- serial -->
+    <g transform="translate(1036.4625 16.598437) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-73"/>
+     <use xlink:href="#DejaVuSans-65" x="52.099609"/>
+     <use xlink:href="#DejaVuSans-72" x="113.623047"/>
+     <use xlink:href="#DejaVuSans-69" x="154.736328"/>
+     <use xlink:href="#DejaVuSans-61" x="182.519531"/>
+     <use xlink:href="#DejaVuSans-6c" x="243.798828"/>
+    </g>
+   </g>
+   <g id="line2d_82">
+    <path d="M 1008.4625 27.776563
+L 1018.4625 27.776563
+L 1028.4625 27.776563
+" style="fill: none; stroke: #a3be8c; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="text_44">
+    <!-- linear -->
+    <g transform="translate(1036.4625 31.276563) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-6c"/>
+     <use xlink:href="#DejaVuSans-69" x="27.783203"/>
+     <use xlink:href="#DejaVuSans-6e" x="55.566406"/>
+     <use xlink:href="#DejaVuSans-65" x="118.945312"/>
+     <use xlink:href="#DejaVuSans-61" x="180.46875"/>
+     <use xlink:href="#DejaVuSans-72" x="241.748047"/>
+    </g>
+   </g>
+   <g id="LineCollection_3">
+    <path d="M 1018.4625 47.454687
+L 1018.4625 37.454687
+" style="fill: none; stroke: #5e81ac; stroke-width: 2"/>
+   </g>
+   <g id="line2d_83">
+    <path d="M 1008.4625 42.454687
+L 1028.4625 42.454687
+" style="fill: none; stroke: #5e81ac; stroke-width: 2; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_84">
+    <g>
+     <use xlink:href="#mce4831cd19" x="1018.4625" y="42.454687" style="fill: #5e81ac; stroke: #5e81ac"/>
+    </g>
+   </g>
+   <g id="text_45">
+    <!-- actual -->
+    <g transform="translate(1036.4625 45.954687) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-61"/>
+     <use xlink:href="#DejaVuSans-63" x="61.279297"/>
+     <use xlink:href="#DejaVuSans-74" x="116.259766"/>
+     <use xlink:href="#DejaVuSans-75" x="155.46875"/>
+     <use xlink:href="#DejaVuSans-61" x="218.847656"/>
+     <use xlink:href="#DejaVuSans-6c" x="280.126953"/>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="p1031157c27">
+   <rect x="66.053125" y="54.04" width="405.818182" height="332.64"/>
+  </clipPath>
+  <clipPath id="p436e6804ea">
+   <rect x="553.034943" y="54.04" width="405.818182" height="332.64"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/document/doc/pcraster/status.md b/document/doc/pcraster/status.md
index cf5971f00..01592e674 100644
--- a/document/doc/pcraster/status.md
+++ b/document/doc/pcraster/status.md
@@ -21,14 +21,14 @@ If an operation used in a PCRaster model is not available in LUE yet, it is a go
 project team. Various factors determine the order in which operations are added to the LUE framework. The
 number of model developers requesting one is one of them.
 
-:::{note}
+```{note}
 A LUE operation that implements an operation that is also in PCRaster may be different from the PCRaster
 operation. It may be named different, it may accept different arguments, or accept them in a different order.
 We provide a [special module](lue-pcraster-module) that can be used to quickly port PCRaster model by hiding
 these differences as much as possible.
-:::
+```
 
-:::{list-table} Legend
+```{list-table} Legend
 :widths: auto
 
 *   - ✅
@@ -42,9 +42,9 @@ these differences as much as possible.
     - Guesstimate of the amount of effort required to add it: \
       1 little, 2 somewhat, 3 serious. \
       This is only relevant for operations that have not been added yet.
-:::
+```
 
-:::{list-table} Status of LUE operations vs PCRaster operations
+```{list-table} Status of LUE operations vs PCRaster operations
 :header-rows: 1
 :widths: auto
 
@@ -502,8 +502,7 @@ these differences as much as possible.
 *   - ycoordinate
     - 🗑
     - Not sure why this is useful...
-
-:::
+```
 
 %    In LUE, not in PCRaster:
 %    - atan2.hpp
@@ -554,7 +553,7 @@ PCRaster Python Framework classes, but are implemented in terms of the LUE class
 have been ported to LUE yet. The next table lists the current status.
 
 
-:::{list-table} Legend
+```{list-table} Legend
 :widths: auto
 
 *   - ✅
@@ -569,9 +568,9 @@ have been ported to LUE yet. The next table lists the current status.
     - Guesstimate of the amount of effort required to add it: \
       1 little, 2 somewhat, 3 serious. \
       This is only relevant for classes that have not been added yet.
-:::
+```
 
-:::{list-table} Status of LUE model development support classes vs PCRaster Python Framework classes
+```{list-table} Status of LUE model development support classes vs PCRaster Python Framework classes
 :header-rows: 1
 :widths: auto
 
@@ -614,4 +613,4 @@ have been ported to LUE yet. The next table lists the current status.
 *   - `EnsKalmanFilterFramework`
     - ❌
     -
-:::
+```
diff --git a/document/doc/reference/algorithm/clump.md b/document/doc/reference/algorithm/clump.md
index 1992c3f27..173913cc3 100644
--- a/document/doc/reference/algorithm/clump.md
+++ b/document/doc/reference/algorithm/clump.md
@@ -77,10 +77,10 @@ partitions. Before we can continue we must update `global_clump_ids` and
 in `global_clump_ids` with each other and merge the ones that intersect with each other. Global clump ID
 collections that intersect are part of the same global clump.
 
-:::{note}
+```{note}
 This is actually the most expensive step of the whole algorithm and it executes on the root locality. Can we
 get rid of it?
-:::
+```
 
 Once done `global_clump_ids` and `global_clump_ids_by_local_clump_id` contain all information needed to update
 global clump IDs for local clumps that extend over partition borders.
diff --git a/document/doc/reference/utility/lue_scalability.md b/document/doc/reference/utility/lue_scalability.md
index ebb1d5c25..7a2ab5756 100644
--- a/document/doc/reference/utility/lue_scalability.md
+++ b/document/doc/reference/utility/lue_scalability.md
@@ -1,1 +1,363 @@
-# lue_scalability
+(lue-scalability)=
+
+# lue_scalability.py
+
+The lue_scalability.py command has been created to make it as easy as possible to perform scalability
+experiments for LUE computations. Performing scalability experiments involves a lot of book keeping. Given a
+set of built-in conventions, performing these experiments become easy to do, on different platforms, like
+laptops or computer clusters, and for different computations.
+
+For information about the command's usage, type `lue_scalability.py --help`{l=bash} on the command-line.
+
+There are three kinds of experiments supported by the command, for determining a good array partition shape,
+and the strong and weak scalabilities. Each of these is described in more detail below.
+
+Each kind of experiment is split into three stages that have to be performed in order and which results in a
+LUE dataset containing the raw latencies of all runs and statistics, and plots. Each of these stages is
+described in more detail below.
+
+Here is an example for performing a strong scalability experiment over all CPU cores on a desktop computer
+called orkney:
+
+```bash
+# Variables used in the commands below
+command_name="my_model.py"
+command_arguments="--my_parameter=5"
+platform_name="orkney"
+experiment_name="strong_scalability"
+worker_name="core_numa_node"
+platform_config_prefix="./platform_configuration/"
+experiment_config_prefix="./experiment_configuration/"
+result_prefix="./result/"
+
+# Create a Bash script that will start all commands needed for the experiment
+lue_scalability.py \
+    $experiment_name script $command_name "$command_arguments" \
+    $platform_name $worker_name \
+    $platform_config_prefix $experiment_config_prefix $result_prefix
+
+# Run the Bash script just created, writing results to a set of JSON files
+script="$result_prefix/$platform_name/$command_name/$worker_name/$experiment_name.sh"
+bash $script
+
+# Import all experiment results into a single LUE dataset
+lue_scalability.py \
+    $experiment_name import $command_name "$command_arguments" \
+    $platform_name $worker_name \
+    $platform_config_prefix $experiment_config_prefix $result_prefix
+
+# Add statistics to the dataset, generate scalability plots
+lue_scalability.py \
+    $experiment_name postprocess $command_name "$command_arguments" \
+    $platform_name $worker_name \
+    $platform_config_prefix $experiment_config_prefix $result_prefix
+```
+
+Note that, except for the stage (script, import, postprocess), the arguments passed to the lue_scalability.py
+command are the same for each invocation.
+
+
+## Conventions
+
+The conventions used by the lue_scalability.py command are related to:
+
+- Storing information about each *platform*
+- Storing information about each *worker*
+- Storing information about each *experiment*
+- *Calling conventions* for computations
+
+
+### Platform
+
+To be able to do its work, the command needs to know some properties of the platform, like information about
+the scheduler to use to submit commands, the number of nodes in the cluster (partition), the nesting of
+hardware resources in a single node, etc.
+
+Properties of a platform are described in a file called `platform.json`. Examples of platform configurations for
+several platforms used by the LUE R&D team can be found in the [lue_qa
+repository](https://github.com/computationalgeography/lue_qa). In case you are using one of those platforms,
+you can clone the project and pass the pathname of the configuration directory as an argument to the
+lue_scalability.py command. Otherwise, these configuration can be used as inspiration for describing other
+platforms. Platform configuration files must be named after the platform:
+`<platform_config_prefix>/<platform_name>.json`.
+
+Once setup correctly, platform configuration files likely won't have to be changed anymore.
+
+
+### Workers
+
+A worker is an amount of hardware which will be increased during a scalability experiment. Supported
+kinds of hardware are CPU cores, NUMA nodes, and cluster nodes. The output of the strong and weak scalability
+experiments are *relative* scalability measures, which means that they are relative to the latency of the
+software when using a single worker (CPU core, NUMA node, or cluster node).
+
+Like platforms, workers have to be described as well. Examples of configuration files can be found in the above
+mentioned lue_qa repository. The worker configuration files are named after the worker and the experiment, and
+must be nested in the platform configuration file directories:
+`<platform_config_prefix>/<platform_name>/<worker_name>/<experiment_name>.json`.
+
+Once setup correctly, worker configuration files likely won't have to be changed anymore.
+
+
+### Experiments
+
+Each experiment (partition shape, strong or weak scalability) needs to be described in a configuration file as
+well. In this file, properties are described which are unique to the command tested. For example, depending on
+the computation, larger or smaller arrays or partition sizes need to be used.
+
+Examples of configuration files can be found in the above mentioned lue_qa repository, in the `experiment`
+directory. The experiment configuration files need to be put in a directory named after the platform name and
+experiment name, and the name of the command tested, including any file extension this command might have:
+`<experiment_config_prefix>/<platform_name>/<command_name>/<worker_name>/<experiment_name>.json`
+
+Contrary to the platform and worker configuration files, configuration files for experiments need to be created
+for each command tested.
+
+
+### Calling conventions
+
+The lue_scalability.py command requires each command to be tested to support certain command line options.
+These are used to vary those aspects of the experimental run that are required to be able to compute
+scalability measures afterwards. Two sets of command line options are used for this. The first ones, prefixed
+by `hpx:` are targeted at the HPX runtime used by LUE. Each LUE computation automatically supports these
+options so there is no need to make any code changes for this. The second set of options is prefixed by `lue:`
+and is specific for scalability experiments. The next table lists all options:
+
+| Option                                    | Effect                                                |
+| ---                                       | ---                                                   |
+| `--lue:count=<count>`                     | Number of times the computations need to be performed |
+| `--lue:nr_workers=<nr_workers>`           | Number of workers used to perform the computations    |
+| `--lue:array_shape=<array_shape>`         | Shape of arrays to use                                |
+| `--lue:partition_shape=<partition_shape>` | Shape of partitions to use                            |
+| `--lue:result=<result>`                   | Pathname of JSON file to store results in             |
+
+The author of the command used in scalability experiments is responsible for make sure the command behaves
+correctly to the arguments to these options passed in.
+
+The count is used for statistical purposes. Performing computations multiple times and recording latencies for
+each of those runs allows for the analysis of spread in the results.
+
+The number of workers is a value to store in the result file. It is unlikely that this value has to be used by
+the computation itself.
+
+The result pathname is the name of the file in which the results of the experimental runs need to be stored.
+
+LUE contains support code which can be used to instrument code for measuring and storing results of
+experimental runs. This makes it easy to save the necessary information to files without having to know about
+file formats that have to be used. Here is an example of how this works for a Python script that uses LUE.
+
+
+```python
+import lue.framework as lfr
+import lue.qa.scalability.instrument as lqi
+
+
+def run_my_model() -> None:
+    pass
+
+
+@lfr.runtime_scope
+def my_model(
+    count: int,
+    nr_workers: int,
+    array_shape: tuple[int, int],
+    partition_shape: tuple[int, int],
+    result_pathname: str,
+) -> None:
+    # Before calling start(), wait for any irrelevant code (I/O?) to finish. Otherwise the time this code
+    # takes to execute will be part of the measurement.
+    # Before calling stop(), wait for any relevant code (model!) to finish. Otherwise the time this code
+    # takes will not be completely part of the measurement.
+
+    experiment = lqi.ArrayExperiment(nr_workers, array_shape, partition_shape)
+    experiment.start()
+
+    for _ in range(count):
+        run = lqi.Run()
+
+        run.start()
+        run_my_model()
+        run.stop()
+        experiment.add(run)
+
+    experiment.stop()
+    lqi.save_results(experiment, result_pathname)
+```
+
+
+A similar approach can be taken for C++ code using LUE. For more information about this, see the [reference
+pages about LUE quality assurance](#source-lue-qa).
+
+
+## Experiments
+
+See the [scalability quick start](#scalability-quick-start) for outputs of the experiment for an example
+model.
+
+
+### Partition shape
+
+Before doing strong and weak scalability experiments, a good partition shape must be determined. Using the
+wrong partition shape results in bad results. In short:
+
+- Small partitions → many tasks → much overhead → higher latencies
+- Large partitions → few tasks → not enough work to keep all workers busy → higher latencies
+
+What entails a good partition shape depends on various factors, like the specific operations used in the
+computation and the properties of the hardware. LUE has built-in support for determining default partition
+sizes, which is convenient, but these may not (yet) result in the best performance and scalability.
+
+The goal of the partition shape experiment is to identify the range of good partition shapes to use. The
+experiment involves trying out different partition shapes, and recording the associated latencies of the
+computations. In the experiment configuration file, the user can define the smallest and largest partition
+shapes to test, and which shapes to test in between those extremes. When the range of partition shapes to test
+is configured correctly (this may involve some trial and error), the resulting plot showing the latency by
+partition shape will show a range of good partition shapes to use.
+
+
+### Strong scalability
+
+The goal of a strong scalability experiment is to determine how well software is capable to use additional
+workers to decrease the latency of the computations. For this, a certain total problem size needs to be
+configured, as well a range of workers to try. After the latencies have been recorded, [strong scalability
+efficiencies](#strong-scalability-experiment) can be calculated and plotted.
+
+
+### Weak scalability
+
+The goal of a weak scalability experiment is to determine how well software is capable to use additional
+workers to process a larger number of computations. For this, a certain problem size per worker needs to be
+configured, as well a range of workers to try. After the latencies have been recorded, [weak scalability
+efficiencies](#weak-scalability-experiment) can be calculated and plotted.
+
+
+## Stages
+
+All scalability experiments supported by the command are divided into three stages -- script, import, and
+postprocess -- which must be run in that order.
+
+
+### Script
+
+In the script stage the command outputs a Bash script that contains all commands needed to end up with all the
+information required for the subsequent stages. Depending on the scheduler, this script will synchronously
+execute the commands in order, or it will pass the commands to a job-scheduler, to be asynchronously
+scheduled once the required hardware resources have become available.
+
+```{note}
+In case the commands in the script are passed on to a scheduler for asynchronous execution, continuing with
+the subsequent stages must be postponed until all commands have finished writing their result files.
+```
+
+As a side-effect of this stage, a LUE dataset called `raw.lue` is written containing all information about the
+experiment performed, including the Bash script itself.
+
+This is the directory and file layout after running this stage for a partition shape experiment:
+
+```bash
+orkney/
+└── core_numa_node
+    └── game_of_life.py
+        ├── partition_shape
+        │   └── raw.lue
+        └── partition_shape.sh
+```
+
+When running this stage multiple times for the same configuration, the command will rename the `<experiment>`
+directory (partition_shape, strong_scalability, or weak_scalability) by appending the last modification date
+to the directory name. This way existing results will not be overwritten.
+
+After running the Bash script created by this stage for a partition shape experiment, the directory and file
+layout looks like this:
+
+```bash
+orkney/
+└── core_numa_node
+    └── game_of_life.py
+        ├── partition_shape
+        │   ├── 10000x10000
+        │   │   ├── 1000x1000.json
+        │   │   ├── 1060x1060.json
+        │   │   ├── 1118x1118.json
+        │   │   ├── 500x500.json
+        │   │   ├── 612x612.json
+        │   │   ├── 707x707.json
+        │   │   ├── 790x790.json
+        │   │   ├── 866x866.json
+        │   │   └── 935x935.json
+        │   └── raw.lue
+        └── partition_shape.sh
+```
+
+
+### Import
+
+Once all commands from the script stage have finished executing, the import stage will aggregate the
+information from `raw.lue` and all individual output files written by the commands in the Bash script into a
+single LUE data set called `scalability.lue`. This file contains all information related to the scalability
+experiment, in an open data format. It can be used as a backup of the results for the long term.
+
+After running this stage for a partition shape experiment, the above directory and file layout now looks like
+this:
+
+```bash
+orkney/
+└── core_numa_node
+    └── game_of_life.py
+        ├── partition_shape
+        │   ├── 10000x10000
+        │   │   ├── 1000x1000.json
+        │   │   ├── 1060x1060.json
+        │   │   ├── 1118x1118.json
+        │   │   ├── 500x500.json
+        │   │   ├── 612x612.json
+        │   │   ├── 707x707.json
+        │   │   ├── 790x790.json
+        │   │   ├── 866x866.json
+        │   │   └── 935x935.json
+        │   ├── raw.lue
+        │   └── scalability.lue
+        └── partition_shape.sh
+```
+
+Each JSON file contains results for running the experiment for a certain array shape and partition shape.
+
+
+### Postprocess
+
+After the import stage has finished successfully, the postprocess stage computes statistics and creates a plot
+(`plot.pdf`) containing one or more graphs illustrating the results of the scalability experiments.
+
+After running this stage for a partition shape experiment, the above directory and file layout now looks like
+this:
+
+```bash
+orkney/
+└── core_numa_node
+    └── game_of_life.py
+        ├── partition_shape
+        │   ├── 10000x10000
+        │   │   ├── 1000x1000.json
+        │   │   ├── 1060x1060.json
+        │   │   ├── 1118x1118.json
+        │   │   ├── 500x500.json
+        │   │   ├── 612x612.json
+        │   │   ├── 707x707.json
+        │   │   ├── 790x790.json
+        │   │   ├── 866x866.json
+        │   │   ├── 935x935.json
+        │   │   └── plot.pdf
+        │   ├── graph.pdf
+        │   ├── plot.pdf
+        │   ├── raw.lue
+        │   └── scalability.lue
+        └── partition_shape.sh
+```
+
+In case custom postprocessing needs to happen, for example for creating tables or plots for a publication,
+additional scripts can be created that read the relevant information directly from `scalability.lue`. Each LUE
+dataset is an HDF5 file, so besides using the LUE data model Python package, any software that is capable of
+reading HDF5 files can be used for this, like [h5py](https://www.h5py.org/) for example. A graph of the layout
+of the LUE data set is written in the postprocess stage as well; see `graph.pdf`. The HDFView application
+released by the [HDF Group](https://www.hdfgroup.org/) can also be used to browse the layout and contents of
+LUE datasets.
diff --git a/environment/cmake/Lue.cmake b/environment/cmake/Lue.cmake
index 8c9d35be4..0b9702c78 100644
--- a/environment/cmake/Lue.cmake
+++ b/environment/cmake/Lue.cmake
@@ -36,7 +36,7 @@ if(LUE_BUILD_DATA_MODEL)
     endif()
 endif()
 
-if(LUE_BUILD_QA AND LUE_QA_WITH_TESTS)
+if(LUE_BUILD_QUALITY_ASSURANCE AND LUE_QUALITY_ASSURANCE_WITH_TESTS)
     enable_testing()
 endif()
 
@@ -99,9 +99,9 @@ message(STATUS "+ python api                  : ${LUE_FRAMEWORK_WITH_PYTHON_API}
 message(STATUS "Build view                    : ${LUE_BUILD_VIEW}")
 message(STATUS "+ value inspection            : ${LUE_BUILD_FRAMEWORK}")
 message(STATUS "Build documentation           : ${LUE_BUILD_DOCUMENTATION}")
-message(STATUS "Build QA                      : ${LUE_BUILD_QA}")
-message(STATUS "+ python api                  : ${LUE_QA_WITH_PYTHON_API}")
-message(STATUS "+ tests                       : ${LUE_QA_WITH_TESTS}")
+message(STATUS "Build quality assurance       : ${LUE_BUILD_QUALITY_ASSURANCE}")
+message(STATUS "+ python api                  : ${LUE_QUALITY_ASSURANCE_WITH_PYTHON_API}")
+message(STATUS "+ tests                       : ${LUE_QUALITY_ASSURANCE_WITH_TESTS}")
 message(STATUS "")
 message(STATUS "CMAKE_GENERATOR               : ${CMAKE_GENERATOR}")
 message(STATUS "GENERATOR_IS_MULTI_CONFIG     : ${GENERATOR_IS_MULTI_CONFIG}")
diff --git a/environment/cmake/LueConfiguration.cmake b/environment/cmake/LueConfiguration.cmake
index 5822ca70f..c589c80f6 100644
--- a/environment/cmake/LueConfiguration.cmake
+++ b/environment/cmake/LueConfiguration.cmake
@@ -37,22 +37,22 @@ option(LUE_BUILD_DOCUMENTATION
     "Build documentation"
     FALSE)
 
-option(LUE_BUILD_QA
-    "Include support for QA"
+option(LUE_BUILD_QUALITY_ASSURANCE
+    "Include support for quality assurance"
     FALSE)
-option(LUE_QA_WITH_PYTHON_API
-    "Include Python API for QA"
+option(LUE_QUALITY_ASSURANCE_WITH_PYTHON_API
+    "Include Python API for quality assurance"
     FALSE)
-option(LUE_QA_WITH_TESTS
+option(LUE_QUALITY_ASSURANCE_WITH_TESTS
     "Include tests"
     FALSE)
-set(LUE_QA_TEST_NR_LOCALITIES_PER_TEST
+set(LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST
     1 CACHE STRING "Number of localities to use")
-set(LUE_QA_TEST_NR_THREADS_PER_LOCALITY
+set(LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY
     1 CACHE STRING "Number of threads to use")
-set(LUE_QA_TEST_HPX_RUNWRAPPER
+set(LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER
     none CACHE STRING "Which runwrapper to use (see hpxrun.py)")
-set(LUE_QA_TEST_HPX_PARCELPORT
+set(LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT
     tcp CACHE STRING "Which parcelport to use (see hpxrun.py)")
 
 # Options related to external software used by the project
@@ -187,10 +187,10 @@ if(LUE_BUILD_FRAMEWORK)
 endif()
 
 
-if(LUE_BUILD_QA)
+if(LUE_BUILD_QUALITY_ASSURANCE)
     set(LUE_NLOHMANN_JSON_REQUIRED TRUE)
 
-    if(LUE_QA_WITH_TESTS)
+    if(LUE_QUALITY_ASSURANCE_WITH_TESTS)
         set(LUE_BOOST_REQUIRED TRUE)
         list(APPEND LUE_REQUIRED_BOOST_COMPONENTS
             filesystem system unit_test_framework)
@@ -203,7 +203,7 @@ if(LUE_BUILD_QA)
         endif()
     endif()
 
-    if(LUE_QA_WITH_PYTHON_API)
+    if(LUE_QUALITY_ASSURANCE_WITH_PYTHON_API)
         set(LUE_PYBIND11_REQUIRED TRUE)
         set(LUE_PYTHON_REQUIRED TRUE)
     endif()
diff --git a/environment/cmake/LueMacro.cmake b/environment/cmake/LueMacro.cmake
index f046b7d02..c81d0e446 100644
--- a/environment/cmake/LueMacro.cmake
+++ b/environment/cmake/LueMacro.cmake
@@ -1,10 +1,10 @@
-# Tests can be added conditionally. When the build is configured, the
-# LUE_BUILD_QA and LUE_QA_WITH_TESTS options can be set to TRUE or FALSE. Depending on
-# these settings tests are build or not.
+# Tests can be added conditionally. When the build is configured, the LUE_BUILD_QUALITY_ASSURANCE and
+# LUE_QUALITY_ASSURANCE_WITH_TESTS options can be set to TRUE or FALSE. Depending on these settings tests are
+# build or not.
 # DIRECTORY_NAME: Name of subdirectory containing the target.
 function(add_test_conditionally
         DIRECTORY_NAME)
-    if(LUE_BUILD_QA AND LUE_QA_WITH_TESTS)
+    if(LUE_BUILD_QUALITY_ASSURANCE AND LUE_QUALITY_ASSURANCE_WITH_TESTS)
         add_subdirectory(${DIRECTORY_NAME})
     endif()
 endfunction()
diff --git a/environment/conda/bld.bat b/environment/conda/bld.bat
index 9feeffada..094093aee 100644
--- a/environment/conda/bld.bat
+++ b/environment/conda/bld.bat
@@ -12,8 +12,8 @@ cmake -S . -B build %CMAKE_ARGS% ^
     -D LUE_DATA_MODEL_WITH_PYTHON_API=TRUE ^
     -D LUE_DATA_MODEL_WITH_UTILITIES=TRUE ^
     -D LUE_BUILD_VIEW=FALSE ^
-    -D LUE_BUILD_QA=TRUE ^
-    -D LUE_QA_WITH_PYTHON_API=TRUE ^
+    -D LUE_BUILD_QUALITY_ASSURANCE=TRUE ^
+    -D LUE_QUALITY_ASSURANCE_WITH_PYTHON_API=TRUE ^
     -D LUE_FRAMEWORK_WITH_IMAGE_LAND=TRUE ^
     -D LUE_FRAMEWORK_WITH_PYTHON_API=TRUE ^
     -D HPX_IGNORE_COMPILER_COMPATIBILITY=TRUE ^
diff --git a/environment/conda/build.sh b/environment/conda/build.sh
index b82872137..9ba885101 100644
--- a/environment/conda/build.sh
+++ b/environment/conda/build.sh
@@ -18,8 +18,8 @@ cmake -S . -B build $CMAKE_ARGS \
     -D LUE_DATA_MODEL_WITH_PYTHON_API=TRUE \
     -D LUE_DATA_MODEL_WITH_UTILITIES=TRUE \
     -D LUE_BUILD_VIEW=FALSE \
-    -D LUE_BUILD_QA=TRUE \
-    -D LUE_QA_WITH_PYTHON_API=TRUE \
+    -D LUE_BUILD_QUALITY_ASSURANCE=TRUE \
+    -D LUE_QUALITY_ASSURANCE_WITH_PYTHON_API=TRUE \
     -D LUE_FRAMEWORK_WITH_IMAGE_LAND=TRUE \
     -D LUE_FRAMEWORK_WITH_PYTHON_API=TRUE \
     -D HPX_IGNORE_COMPILER_COMPATIBILITY=TRUE \
diff --git a/environment/configuration/requirements-dev.txt b/environment/configuration/requirements-dev.txt
index d653a82a7..c39cbaafd 100644
--- a/environment/configuration/requirements-dev.txt
+++ b/environment/configuration/requirements-dev.txt
@@ -4,6 +4,7 @@ docopt==0.6.2
 jinja2==3.1.4
 matplotlib==3.9.0
 mypy==1.10.1
+types-python-dateutil==2.9.0.20241003
 
 # Build against numpy 2, while also supporting running against numpy 1
 numpy>=2.0
diff --git a/pyproject.toml b/pyproject.toml
index efa7d729b..580762622 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -3,11 +3,18 @@ known_lue = "lue, lue_test"
 lines_after_imports = 2
 sections = "FUTURE,STDLIB,THIRDPARTY,LUE,FIRSTPARTY,LOCALFOLDER"
 profile = "black"
+# line_length = 110
+
+# [tool.black]
+# line-length = 110
 
 [tool.codespell]
 skip = "*.cpp,*.hpp,*.tex,*_test.py,pyproject.toml"
 ignore-words-list = "nD"
 
+# [tool.pyright]
+# max-line-length = 110
+
 [tool.typos]
 default.extend-ignore-identifiers-re = [
     ".*_FPR_.*",
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index be4dd90af..d1385b99c 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -13,8 +13,8 @@ if((LUE_BUILD_DATA_MODEL AND LUE_DATA_MODEL_WITH_PYTHON_API) OR
     add_subdirectory(python)
 endif()
 
-if(LUE_BUILD_QA)
-    add_subdirectory(qa)
+if(LUE_BUILD_QUALITY_ASSURANCE)
+    add_subdirectory(quality_assurance)
 endif()
 
 if(LUE_BUILD_VIEW)
diff --git a/source/data_model/CMakeLists.txt b/source/data_model/CMakeLists.txt
index 69125b6c8..6aa6b10c0 100644
--- a/source/data_model/CMakeLists.txt
+++ b/source/data_model/CMakeLists.txt
@@ -48,7 +48,7 @@ if(LUE_DATA_MODEL_WITH_PYTHON_API)
     ### )
 endif()
 
-if(LUE_BUILD_QA AND LUE_QA_WITH_TESTS)
+if(LUE_BUILD_QUALITY_ASSURANCE AND LUE_QUALITY_ASSURANCE_WITH_TESTS)
     add_subdirectory(test)
     list(APPEND doxygen_input ${CMAKE_CURRENT_SOURCE_DIR}/test)
 endif()
diff --git a/source/data_model/gdal/include/lue/gdal/error.hpp b/source/data_model/gdal/include/lue/gdal/error.hpp
index 93faf84fb..ebf263bd7 100644
--- a/source/data_model/gdal/include/lue/gdal/error.hpp
+++ b/source/data_model/gdal/include/lue/gdal/error.hpp
@@ -4,6 +4,10 @@
 namespace lue::gdal {
 
 
+    /*!
+        @brief      Class which installs (pushes) a quiet error handler upon construction and de-installs
+                    (pops) it again upon destruction
+    */
     class QuietErrorHandler
     {
 
diff --git a/source/data_model/python/src/submodule.cpp b/source/data_model/python/src/submodule.cpp
index 50c40623b..069ffe466 100644
--- a/source/data_model/python/src/submodule.cpp
+++ b/source/data_model/python/src/submodule.cpp
@@ -2,10 +2,10 @@
 #include "different_shape/submodule.hpp"
 #include "python_extension.hpp"
 #include "same_shape/submodule.hpp"
-#include "lue/configure.hpp"  // LUE_BUILD_QA and LUE_QA_WITH_TESTS
+#include "lue/configure.hpp"  // LUE_BUILD_QUALITY_ASSURANCE and LUE_QUALITY_ASSURANCE_WITH_TESTS
 #include "lue/py/data_model/submodule.hpp"
 
-#if defined(LUE_BUILD_QA) && defined(LUE_QA_WITH_TESTS)
+#if defined(LUE_BUILD_QUALITY_ASSURANCE) && defined(LUE_QUALITY_ASSURANCE_WITH_TESTS)
 #include "test/submodule.hpp"
 #endif
 
@@ -95,7 +95,7 @@ namespace lue::data_model {
 
         /// constant_collection::init_submodule(submodule);
 
-#if defined(LUE_BUILD_QA) && defined(LUE_QA_WITH_TESTS)
+#if defined(LUE_BUILD_QUALITY_ASSURANCE) && defined(LUE_QUALITY_ASSURANCE_WITH_TESTS)
         test::init_submodule(submodule);
 #endif
 
diff --git a/source/data_model/translate/include/lue/translate/translate.hpp b/source/data_model/translate/include/lue/translate/translate.hpp
index ef2a679d9..e27d2de81 100644
--- a/source/data_model/translate/include/lue/translate/translate.hpp
+++ b/source/data_model/translate/include/lue/translate/translate.hpp
@@ -1,28 +1,29 @@
 #pragma once
+#include "lue/gdal/error.hpp"
 #include "lue/utility/application.hpp"
 
 
-namespace lue {
-    namespace utility {
+namespace lue::utility {
 
-        class Translate: public Application
+    class Translate: public Application
 
-        {
+    {
 
-            public:
+        public:
 
-                explicit Translate(std::vector<std::string> const& arguments);
+            explicit Translate(std::vector<std::string> const& arguments);
 
-            private:
+        private:
 
-                // static CommandPtr import_data      (std::vector<std::string> const&
-                //                                         arguments);
+            // static CommandPtr import_data      (std::vector<std::string> const&
+            //                                         arguments);
 
-                static CommandPtr export_data(std::vector<std::string> const& arguments);
+            static auto export_data(std::vector<std::string> const& arguments) -> CommandPtr;
 
-                // void           print_format        (std::string const& dataset_name,
-                //                                     std::string const& format);
-        };
+            // void           print_format        (std::string const& dataset_name,
+            //                                     std::string const& format);
 
-    }  // namespace utility
-}  // namespace lue
+            gdal::QuietErrorHandler _gdal_error_handler;
+    };
+
+}  // namespace lue::utility
diff --git a/source/data_model/translate/src/translate.cpp b/source/data_model/translate/src/translate.cpp
index 138c5f8c6..53bc159b3 100644
--- a/source/data_model/translate/src/translate.cpp
+++ b/source/data_model/translate/src/translate.cpp
@@ -70,35 +70,33 @@ See '{0} <command> --help' for more information on a command.
 }  // Anonymous namespace
 
 
-namespace lue {
-    namespace utility {
-
-        Translate::Translate(std::vector<std::string> const& arguments):
-            Application(
-                usage,
-                arguments,
-                {
-                    {Import::name, Import::command},
-                    {Export::name, Export::command},
-                })
-
-        {
-            // Turn off error stack traversal. The default functions prints
-            // lots of messages we usually don't care about.
-            H5Eset_auto(H5E_DEFAULT, nullptr, nullptr);
-
-            gdal::register_gdal_drivers();
-        }
-
-
-        // void Translate::print_format(
-        //     std::string const& dataset_name,
-        //     std::string const& format)
-        // {
-        //     print_verbose_message((boost::format("%1% format: %2%")
-        //         % dataset_name
-        //         % format).str());
-        // }
-
-    }  // namespace utility
-}  // namespace lue
+namespace lue::utility {
+
+    Translate::Translate(std::vector<std::string> const& arguments):
+        Application(
+            usage,
+            arguments,
+            {
+                {Import::name, Import::command},
+                {Export::name, Export::command},
+            })
+
+    {
+        // Turn off error stack traversal. The default functions prints
+        // lots of messages we usually don't care about.
+        H5Eset_auto(H5E_DEFAULT, nullptr, nullptr);
+
+        gdal::register_gdal_drivers();
+    }
+
+
+    // void Translate::print_format(
+    //     std::string const& dataset_name,
+    //     std::string const& format)
+    // {
+    //     print_verbose_message((boost::format("%1% format: %2%")
+    //         % dataset_name
+    //         % format).str());
+    // }
+
+}  // namespace lue::utility
diff --git a/source/framework/CMakeLists.txt b/source/framework/CMakeLists.txt
index 4ebe4df2c..fee6e002b 100644
--- a/source/framework/CMakeLists.txt
+++ b/source/framework/CMakeLists.txt
@@ -38,7 +38,7 @@ if(LUE_FRAMEWORK_WITH_PYTHON_API)
     add_subdirectory(python)
 endif()
 
-if(LUE_BUILD_QA AND LUE_QA_WITH_TESTS)
+if(LUE_BUILD_QUALITY_ASSURANCE AND LUE_QUALITY_ASSURANCE_WITH_TESTS)
     add_subdirectory(test)
     list(APPEND doxygen_input ${CMAKE_CURRENT_SOURCE_DIR}/test)
 endif()
diff --git a/source/framework/algorithm/doc/policy/index.md b/source/framework/algorithm/doc/policy/index.md
index 7151f2c59..979267c0d 100644
--- a/source/framework/algorithm/doc/policy/index.md
+++ b/source/framework/algorithm/doc/policy/index.md
@@ -35,9 +35,9 @@ algorithm can support multiple conventions, like for representing no-data values
 In general, the various policies are aggregated into a single {cpp:class}`lue::policy::Policies` instance,
 which is passed as an argument to an algorithm.
 
-:::{margin}
+```{margin}
 Please suggest a better name for the "default" and "value" policies...
-:::
+```
 
 LUE provides two sets of algorithm policies: "default" policies and "value" policies. They may not be correct
 for all use-cases. Different policies can be created and used by 3rd-party users of the LUE C++ API.
diff --git a/source/framework/api/doc/index.md b/source/framework/api/doc/index.md
index 5bde9b789..6ebe37c1e 100644
--- a/source/framework/api/doc/index.md
+++ b/source/framework/api/doc/index.md
@@ -7,11 +7,11 @@ the functionality provided by this library. It hides a lot of the complexities o
 libraries. People interested in using C or Python can use the language wrappers provided by the
 `lue_framework_api_c` and `lue_framework_api_python` libraries, respectively.
 
-:::{note}
+```{note}
 If language bindings for other languages than C, C++, and Python (e.g. for Fortran, Java, Julia, Lua, R, Rust)
 interest you, you may want to [help us](#doc-contribute) adding them. Do
 [contact](https://lue.computationalgeography.org/) us if you want to discuss this.
-:::
+```
 
 The idea of the setup of the API libraries is to collect all functionality required by multiple language
 wrapping APIs in the `lue_framework_api_cxx` library and make the language wrapper libraries as small as
@@ -25,9 +25,9 @@ by users of bindings for other languages.
 The algorithms in the `lue_framework_api_cxx` library hide the fact that they are overloaded for different
 argument types. The algorithms and the types used in this library are of a higher abstraction level than the
 libraries they depend on. The Field type is a variant that can be represented by several concrete types, like
-a {cpp:class}`lue::PartitionedArray` or a {cpp:class}`lue::Scalar`. Algorithms translating fields accept fields and
-forward the call to the concrete algorithm overload that supports the passed in concrete types. If no such
-algorithm exists, a general overload is called that will throw an overload error exception.
+a {cpp:class}`lue::PartitionedArray` or a {cpp:class}`lue::Scalar`. Algorithms translating fields accept
+fields and forward the call to the concrete algorithm overload that supports the passed in concrete types. If
+no such algorithm exists, a general overload is called that will throw an overload error exception.
 
 Using the algorithms from the `lue_framework_api_cxx` library makes life for the user a lot easier. A (minor)
 drawback for the user of the API's of statically typed languages like C and C++ is that overload errors only
diff --git a/source/framework/doc/howto/add_local_operation.md b/source/framework/doc/howto/add_local_operation.md
index 76393100a..abd88b048 100644
--- a/source/framework/doc/howto/add_local_operation.md
+++ b/source/framework/doc/howto/add_local_operation.md
@@ -9,9 +9,9 @@ Here you will find information about how to add a new local operation to the LUE
 - When implementing an algorithm that has an equivalent in C++, try to name and mimic the behaviour of that
   algorithm.
 
-:::{note}
+```{note}
 All relative paths are relative to `source/framework/algorithm/`
-:::
+```
 
 
 ## Algorithm
diff --git a/source/python/CMakeLists.txt b/source/python/CMakeLists.txt
index f44bf03a5..0fc7798c4 100644
--- a/source/python/CMakeLists.txt
+++ b/source/python/CMakeLists.txt
@@ -67,7 +67,7 @@ if(LUE_BUILD_FRAMEWORK AND LUE_FRAMEWORK_WITH_PYTHON_API)
     endif()
 endif()
 
-if(LUE_BUILD_QA AND LUE_QA_WITH_PYTHON_API)
+if(LUE_BUILD_QUALITY_ASSURANCE AND LUE_QUALITY_ASSURANCE_WITH_PYTHON_API)
     target_link_libraries(lue_py
         PRIVATE
             lue::py_qa)
diff --git a/source/python/src/python_extension.cpp b/source/python/src/python_extension.cpp
index 34e5105cd..70067ca0a 100644
--- a/source/python/src/python_extension.cpp
+++ b/source/python/src/python_extension.cpp
@@ -15,8 +15,8 @@
 #endif
 #endif
 #endif
-#ifdef LUE_BUILD_QA
-#ifdef LUE_QA_WITH_PYTHON_API
+#ifdef LUE_BUILD_QUALITY_ASSURANCE
+#ifdef LUE_QUALITY_ASSURANCE_WITH_PYTHON_API
 #include "lue/py/qa/submodule.hpp"
 #endif
 #endif
@@ -46,7 +46,7 @@ namespace lue {
 #endif
 #endif
 
-#ifdef LUE_QA_WITH_PYTHON_API
+#ifdef LUE_QUALITY_ASSURANCE_WITH_PYTHON_API
         automodules.push_back("qa");
 #endif
 
@@ -86,8 +86,8 @@ namespace lue {
 #endif
 #endif
 
-#ifdef LUE_BUILD_QA
-#ifdef LUE_QA_WITH_PYTHON_API
+#ifdef LUE_BUILD_QUALITY_ASSURANCE
+#ifdef LUE_QUALITY_ASSURANCE_WITH_PYTHON_API
         qa::init_submodule(module);
 #endif
 #endif
diff --git a/source/qa/cxx/src/scalability/experiment.cpp b/source/qa/cxx/src/scalability/experiment.cpp
deleted file mode 100644
index 8e953c1eb..000000000
--- a/source/qa/cxx/src/scalability/experiment.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-#include "lue/qa/scalability/experiment.hpp"
-
-
-namespace lue::qa {
-
-    Experiment::Experiment(Count const nr_workers):
-
-        Run{},
-        _nr_workers{nr_workers}
-
-    {
-    }
-
-
-    auto Experiment::nr_workers() const -> Count
-    {
-        return _nr_workers;
-    }
-
-
-    void Experiment::add(Run const& run)
-    {
-        _runs.push_back(run);
-    }
-
-
-    auto Experiment::runs() const -> Runs const&
-    {
-        return _runs;
-    }
-
-}  // namespace lue::qa
diff --git a/source/qa/doc/qa.md b/source/qa/doc/qa.md
deleted file mode 100644
index e7e4e281a..000000000
--- a/source/qa/doc/qa.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# LUE quality assurance {#lue_qa}
-
-[TOC]
diff --git a/source/qa/python/CMakeLists.txt b/source/qa/python/CMakeLists.txt
deleted file mode 100644
index c4c560df2..000000000
--- a/source/qa/python/CMakeLists.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-add_subdirectory(qa)
-add_test_conditionally(test)
-
-if(LUE_QA_WITH_PYTHON_API)
-
-    # A pybind11 SHARED library is a CMake runtime output artifact. Target properties to set/get are
-    # RUNTIME_OUTPUT_DIRECTORY and RUNTIME_OUTPUT_NAME.
-    add_library(lue_py_qa SHARED
-        src/python_extension.cpp
-        src/submodule.cpp
-    )
-
-    add_library(lue::py_qa ALIAS lue_py_qa)
-
-    set_target_properties(lue_py_qa
-        PROPERTIES
-            VERSION ${LUE_VERSION}
-            SOVERSION ${LUE_VERSION_MAJOR}
-    )
-    target_include_directories(lue_py_qa
-        PUBLIC
-            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
-    )
-
-    target_link_libraries(lue_py_qa
-        PRIVATE
-            lue::qa
-            lue::shared
-            pybind11::module
-            pybind11::thin_lto
-            pybind11::opt_size
-            pybind11::windows_extras
-    )
-
-    # TODO pybind11_strip does not work on macOS, when building using Conda packages
-    #      The resulting binary can't be imported. Results in "killed: 9".
-    if(NOT MSVC AND NOT APPLE AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo)
-        pybind11_strip(lue_py_qa)
-    endif()
-
-    lue_install_runtime_libraries(
-        TARGETS lue_py_qa
-    )
-
-    if(LUE_PYTHON_FROM_CONDA AND NOT DEFINED ENV{CONDA_BUILD})
-        # If we are using a Python interpreter from a Conda environment then we must expand RPATH
-        # to include the location of the Python libraries. But if we are building a Conda package,
-        # we assume Conda takes care of RPATH handling.
-        set_property(
-            TARGET lue_py_qa
-            APPEND
-            PROPERTY INSTALL_RPATH
-                ${Python_LIBRARY_DIRS}
-        )
-    endif()
-
-    install(
-        DIRECTORY ${CMAKE_BINARY_DIR}/${LUE_BUILD_PYTHON_PACKAGE_DIR}/$<$<BOOL:${LUE_GENERATOR_IS_MULTI_CONFIG}>:$<CONFIG>>/qa
-        DESTINATION ${LUE_INSTALL_PYTHON_PACKAGE_DIR}
-        COMPONENT lue_runtime
-    )
-endif()
diff --git a/source/qa/python/qa/__init__.py b/source/qa/python/qa/__init__.py
deleted file mode 100644
index f7b7f544a..000000000
--- a/source/qa/python/qa/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-try:
-    from ..lue_py.qa import *
-except ModuleNotFoundError:
-    # Apparently, the LUE QA Python API was not built/installed. This is OK.
-    # TODO Assert that the project wasn't configured such that the LUE QA Python API should
-    #      actually be available.
-    pass
diff --git a/source/qa/python/src/submodule.cpp b/source/qa/python/src/submodule.cpp
deleted file mode 100644
index e2ce22918..000000000
--- a/source/qa/python/src/submodule.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#include "lue/py/qa/submodule.hpp"
-#include "lue/qa/scalability/array_experiment.hpp"
-#include "lue/qa/scalability/io.hpp"
-#include "lue/qa/scalability/run.hpp"
-
-
-using namespace pybind11::literals;
-
-
-namespace lue::qa {
-
-    void init_submodule(pybind11::module& module)
-    {
-        pybind11::module submodule = module.def_submodule("qa");
-
-        pybind11::class_<Experiment>(
-            submodule,
-            "Experiment",
-            R"(
-    Class for instances containing information about a scalability experiment.
-)")
-            .def("add", &Experiment::add, "run"_a)
-
-            ;
-
-        pybind11::class_<ArrayExperiment, Experiment>(
-            submodule,
-            "ArrayExperiment",
-            R"(
-    Class for instances containing information about an array scalability
-    experiment.
-)")
-            .def(
-                pybind11::init<Count, Shape const&, Shape const&>(),
-                "nr_workers"_a,
-                "array_shape"_a,
-                "partition_shape"_a)
-            .def("start", &Run::start)
-            .def("stop", &Run::stop);
-
-        pybind11::class_<Run>(
-            submodule,
-            "Run",
-            R"(
-    Class for keeping track of information of running some calculations once.
-)")
-            .def(pybind11::init<>())
-            .def("start", &Run::start)
-            .def("stop", &Run::stop);
-
-
-        submodule.def("save_results", save_results, "experiment"_a, "pathname"_a);
-    }
-
-}  // namespace lue::qa
diff --git a/source/qa/script/CMakeLists.txt b/source/qa/script/CMakeLists.txt
deleted file mode 100644
index 2f355efc6..000000000
--- a/source/qa/script/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-file(GENERATE
-    OUTPUT ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/$<$<BOOL:${LUE_GENERATOR_IS_MULTI_CONFIG}>:$<CONFIG>>/lue_scalability.py
-    INPUT lue_scalability.py
-)
-
-
-lue_install_programs(TARGETS
-    ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/$<$<BOOL:${LUE_GENERATOR_IS_MULTI_CONFIG}>:$<CONFIG>>/lue_scalability.py
-)
diff --git a/source/qa/script/lue_scalability.py b/source/qa/script/lue_scalability.py
deleted file mode 100755
index 3578f60c3..000000000
--- a/source/qa/script/lue_scalability.py
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/env python
-import os.path
-import sys
-
-import docopt
-
-from lue import __version__ as lue_version
-from lue.qa.scalability import perform_experiment_task
-from lue.qa.scalability.core import json_to_data
-
-
-def main():
-    usage = """\
-Perform scalability experiment
-
-Usage:
-    {command}
-        (partition_shape | weak_scalability | strong_scalability)
-        (script | import | postprocess) <configuration>
-    {command}
-        (partition_shape | weak_scalability | strong_scalability)
-        (script | import | postprocess)
-        <command> <result_prefix> <cluster> <worker> <experiment> <script>
-    {command} -h | --help
-    {command} --version
-
-Options:
-    -h --help        Show this screen
-    --version        Show version
-""".format(
-        command=os.path.basename(sys.argv[0])
-    )
-
-    arguments = docopt.docopt(usage, version=lue_version)
-
-    if arguments["partition_shape"]:
-        experiment = "partition_shape"
-    elif arguments["weak_scalability"]:
-        experiment = "weak_scalability"
-    elif arguments["strong_scalability"]:
-        experiment = "strong_scalability"
-
-    configuration_pathname = arguments["<configuration>"]
-
-    if configuration_pathname is not None:
-        configuration_data = json_to_data(configuration_pathname)
-    else:
-        configuration_data = {
-            "command_pathname": "{}".format(arguments["<command>"]),
-            "script_pathname": "{}".format(arguments["<script>"]),
-            "result_prefix": "{}".format(arguments["<result_prefix>"]),
-            "cluster": "{}".format(arguments["<cluster>"]),
-            "benchmark": "{}".format(arguments["<worker>"]),
-            "experiment": "{}".format(arguments["<experiment>"]),
-        }
-
-    if arguments["script"]:
-        task = "script"
-    elif arguments["import"]:
-        task = "import"
-    elif arguments["postprocess"]:
-        task = "postprocess"
-
-    perform_experiment_task(experiment, task, configuration_data)
-
-
-if __name__ == "__main__":
-    sys.exit(main())
diff --git a/source/qa/CMakeLists.txt b/source/quality_assurance/CMakeLists.txt
similarity index 63%
rename from source/qa/CMakeLists.txt
rename to source/quality_assurance/CMakeLists.txt
index 1197c272e..657a06377 100644
--- a/source/qa/CMakeLists.txt
+++ b/source/quality_assurance/CMakeLists.txt
@@ -3,7 +3,10 @@ list(APPEND doxygen_input ${CMAKE_CURRENT_SOURCE_DIR}/doc)
 add_subdirectory(cxx)
 list(APPEND doxygen_input ${CMAKE_CURRENT_SOURCE_DIR}/cxx)
 
-add_subdirectory(python)
-add_subdirectory(script)
+if(LUE_QUALITY_ASSURANCE_WITH_PYTHON_API)
+    add_subdirectory(python)
+endif()
+
+add_subdirectory(scalability)
 
 set(doxygen_input ${doxygen_input} PARENT_SCOPE)
diff --git a/source/qa/cxx/CMakeLists.txt b/source/quality_assurance/cxx/CMakeLists.txt
similarity index 100%
rename from source/qa/cxx/CMakeLists.txt
rename to source/quality_assurance/cxx/CMakeLists.txt
diff --git a/source/quality_assurance/cxx/doc/index.md b/source/quality_assurance/cxx/doc/index.md
new file mode 100644
index 000000000..c40d99dd1
--- /dev/null
+++ b/source/quality_assurance/cxx/doc/index.md
@@ -0,0 +1,20 @@
+(source-lue-qa-cxx)=
+
+# C++
+
+```{eval-rst}
+.. doxygenclass:: lue::qa::Experiment
+.. doxygenclass:: lue::qa::ArrayExperiment
+.. doxygenclass:: lue::qa::Run
+```
+
+<!--
+TODO For some reason Breathe crashes. Try again later with updated versions.
+.. doxygenfunction:: save_results
+.. doxygenclass:: lue::qa::Stopwatch
+-->
+
+<!--
+Not part of public API
+.. doxygenclass:: lue::qa::TimeInterval
+-->
diff --git a/source/quality_assurance/cxx/doc/namespace.dox b/source/quality_assurance/cxx/doc/namespace.dox
new file mode 100644
index 000000000..3a0582105
--- /dev/null
+++ b/source/quality_assurance/cxx/doc/namespace.dox
@@ -0,0 +1,9 @@
+namespace lue {
+
+    /*!
+        @brief      Namespace containing the code related to quality assurance
+    */
+    namespace qa {
+    }
+
+}
diff --git a/source/qa/cxx/include/lue/qa/scalability/array_experiment.hpp b/source/quality_assurance/cxx/include/lue/qa/scalability/instrument/array_experiment.hpp
similarity index 90%
rename from source/qa/cxx/include/lue/qa/scalability/array_experiment.hpp
rename to source/quality_assurance/cxx/include/lue/qa/scalability/instrument/array_experiment.hpp
index 11fa35eb7..70ea792a3 100644
--- a/source/qa/cxx/include/lue/qa/scalability/array_experiment.hpp
+++ b/source/quality_assurance/cxx/include/lue/qa/scalability/instrument/array_experiment.hpp
@@ -1,5 +1,5 @@
 #pragma once
-#include "lue/qa/scalability/experiment.hpp"
+#include "lue/qa/scalability/instrument/experiment.hpp"
 #include <tuple>
 
 
@@ -24,7 +24,7 @@ namespace lue::qa {
 
             ArrayExperiment(ArrayExperiment&&) = default;
 
-            ~ArrayExperiment() = default;
+            ~ArrayExperiment() override = default;
 
             auto operator=(ArrayExperiment const&) -> ArrayExperiment& = default;
 
diff --git a/source/qa/cxx/include/lue/qa/scalability/experiment.hpp b/source/quality_assurance/cxx/include/lue/qa/scalability/instrument/experiment.hpp
similarity index 71%
rename from source/qa/cxx/include/lue/qa/scalability/experiment.hpp
rename to source/quality_assurance/cxx/include/lue/qa/scalability/instrument/experiment.hpp
index 3c19f2f85..af5941808 100644
--- a/source/qa/cxx/include/lue/qa/scalability/experiment.hpp
+++ b/source/quality_assurance/cxx/include/lue/qa/scalability/instrument/experiment.hpp
@@ -1,5 +1,5 @@
 #pragma once
-#include "lue/qa/scalability/run.hpp"
+#include "lue/qa/scalability/instrument/run.hpp"
 #include <vector>
 
 
@@ -15,13 +15,15 @@ namespace lue::qa {
     /*!
         @brief      The Experiment class represents the results of performing one or more experimental runs
 
-        During a scalability experiment, software is being executed one or multiple
-        times. Executing it multiple times allows for the calculation of statistics, like the
-        mean duration a run took.
+        During a scalability experiment, software is being executed once or multiple times. Executing it
+        multiple times allows for the calculation of statistics, like the mean duration a run took.
 
-        Typical pattern:
+        This class inherits from Run, so it is an experimental run itself. This allows the duration of the
+        whole "experiment run" to be measured.
 
-        \code
+        Typical usage pattern:
+
+        @code{.cpp}
         Experiment experiment(nr_workers);
         experiment.start();
 
@@ -31,19 +33,25 @@ namespace lue::qa {
 
             // Do any preprocessing before this point. Also, be sure to wait
             // for any asynchronous work started to finish.
+            // ...
+
+            // Now start the run, measuring its duration
             run.start();
 
             // The actual work to measure the runtime of
             do_something();
 
             // Be sure to first wait for any asynchronous work started to finish
+            // ...
+
+            // Now stop this run and store the results. Do any post processing after this point.
             run.stop();
             experiment.add(run);
         }
 
         experiment.stop();
         save_results(experiment, result_pathname);
-        \endcode
+        @endcode
     */
     class Experiment: public Run
     {
@@ -56,7 +64,7 @@ namespace lue::qa {
 
             Experiment(Experiment&&) = default;
 
-            ~Experiment() = default;
+            ~Experiment() override = default;
 
             auto operator=(Experiment const&) -> Experiment& = default;
 
diff --git a/source/qa/cxx/include/lue/qa/scalability/io.hpp b/source/quality_assurance/cxx/include/lue/qa/scalability/instrument/io.hpp
similarity index 72%
rename from source/qa/cxx/include/lue/qa/scalability/io.hpp
rename to source/quality_assurance/cxx/include/lue/qa/scalability/instrument/io.hpp
index f0974813e..c3c454e05 100644
--- a/source/qa/cxx/include/lue/qa/scalability/io.hpp
+++ b/source/quality_assurance/cxx/include/lue/qa/scalability/instrument/io.hpp
@@ -1,5 +1,5 @@
 #pragma once
-#include "lue/qa/scalability/array_experiment.hpp"
+#include "lue/qa/scalability/instrument/array_experiment.hpp"
 #include <string>
 
 
diff --git a/source/qa/cxx/include/lue/qa/scalability/run.hpp b/source/quality_assurance/cxx/include/lue/qa/scalability/instrument/run.hpp
similarity index 96%
rename from source/qa/cxx/include/lue/qa/scalability/run.hpp
rename to source/quality_assurance/cxx/include/lue/qa/scalability/instrument/run.hpp
index 3758c4bec..cccd56b76 100644
--- a/source/qa/cxx/include/lue/qa/scalability/run.hpp
+++ b/source/quality_assurance/cxx/include/lue/qa/scalability/instrument/run.hpp
@@ -1,5 +1,5 @@
 #pragma once
-#include "lue/qa/scalability/stopwatch.hpp"
+#include "lue/qa/scalability/instrument/stopwatch.hpp"
 
 
 namespace lue::qa {
diff --git a/source/qa/cxx/include/lue/qa/scalability/stopwatch.hpp b/source/quality_assurance/cxx/include/lue/qa/scalability/instrument/stopwatch.hpp
similarity index 86%
rename from source/qa/cxx/include/lue/qa/scalability/stopwatch.hpp
rename to source/quality_assurance/cxx/include/lue/qa/scalability/instrument/stopwatch.hpp
index a167d01ca..38ee73ed1 100644
--- a/source/qa/cxx/include/lue/qa/scalability/stopwatch.hpp
+++ b/source/quality_assurance/cxx/include/lue/qa/scalability/instrument/stopwatch.hpp
@@ -1,5 +1,5 @@
 #pragma once
-#include "lue/qa/scalability/time_interval.hpp"
+#include "lue/qa/scalability/instrument/time_interval.hpp"
 
 
 namespace lue::qa {
@@ -46,8 +46,11 @@ namespace lue::qa {
             /*!
                 @brief      Return the duration casted to @a ToDuration
 
-                Use this function to convert the high resolution duration to some
-                courser unit, like seconds.
+                Use this function to convert the high resolution duration to some courser unit, like seconds.
+
+                @code{.cpp}
+                auto const nr_seconds = stopwatch.duration<std::chrono::seconds>().count();
+                @endcode
             */
             template<typename ToDuration>
             [[nodiscard]] auto duration() const -> ToDuration
diff --git a/source/qa/cxx/include/lue/qa/scalability/time_interval.hpp b/source/quality_assurance/cxx/include/lue/qa/scalability/instrument/time_interval.hpp
similarity index 100%
rename from source/qa/cxx/include/lue/qa/scalability/time_interval.hpp
rename to source/quality_assurance/cxx/include/lue/qa/scalability/instrument/time_interval.hpp
diff --git a/source/qa/cxx/src/scalability/array_experiment.cpp b/source/quality_assurance/cxx/src/scalability/array_experiment.cpp
similarity index 57%
rename from source/qa/cxx/src/scalability/array_experiment.cpp
rename to source/quality_assurance/cxx/src/scalability/array_experiment.cpp
index 7d5df657b..eaf196dc0 100644
--- a/source/qa/cxx/src/scalability/array_experiment.cpp
+++ b/source/quality_assurance/cxx/src/scalability/array_experiment.cpp
@@ -1,8 +1,12 @@
-#include "lue/qa/scalability/array_experiment.hpp"
+#include "lue/qa/scalability/instrument/array_experiment.hpp"
 
 
 namespace lue::qa {
 
+    /*!
+        @brief      Construct and instance for experiment using @a nr_workers and with arrays of shape
+                    @a arrays_shape and partitioned using @a partition_shape
+    */
     ArrayExperiment::ArrayExperiment(
         Count const nr_workers, Shape const& array_shape, Shape const& partition_shape):
 
@@ -14,12 +18,18 @@ namespace lue::qa {
     }
 
 
+    /*!
+        @brief      Return the array shape
+    */
     auto ArrayExperiment::array_shape() const -> Shape const&
     {
         return _array_shape;
     }
 
 
+    /*!
+        @brief      Return the partition shape
+    */
     auto ArrayExperiment::partition_shape() const -> Shape const&
     {
         return _partition_shape;
diff --git a/source/quality_assurance/cxx/src/scalability/experiment.cpp b/source/quality_assurance/cxx/src/scalability/experiment.cpp
new file mode 100644
index 000000000..c90c26736
--- /dev/null
+++ b/source/quality_assurance/cxx/src/scalability/experiment.cpp
@@ -0,0 +1,43 @@
+#include "lue/qa/scalability/instrument/experiment.hpp"
+
+
+namespace lue::qa {
+
+    /*!
+        @brief      Construct and instance for an experiment using @a nr_workers workers
+    */
+    Experiment::Experiment(Count const nr_workers):
+
+        _nr_workers{nr_workers}
+
+    {
+    }
+
+
+    /*!
+        @brief      Return the number of workers this experiment is for
+    */
+    auto Experiment::nr_workers() const -> Count
+    {
+        return _nr_workers;
+    }
+
+
+    /*!
+        @brief      Add (save) the results of an experimental run
+    */
+    void Experiment::add(Run const& run)
+    {
+        _runs.push_back(run);
+    }
+
+
+    /*!
+        @brief      Return the collection with the results of the experimental runs added
+    */
+    auto Experiment::runs() const -> Runs const&
+    {
+        return _runs;
+    }
+
+}  // namespace lue::qa
diff --git a/source/qa/cxx/src/scalability/io.cpp b/source/quality_assurance/cxx/src/scalability/io.cpp
similarity index 93%
rename from source/qa/cxx/src/scalability/io.cpp
rename to source/quality_assurance/cxx/src/scalability/io.cpp
index ca16f0164..bed340c8c 100644
--- a/source/qa/cxx/src/scalability/io.cpp
+++ b/source/quality_assurance/cxx/src/scalability/io.cpp
@@ -1,10 +1,9 @@
-#include "lue/qa/scalability/io.hpp"
+#include "lue/qa/scalability/instrument/io.hpp"
 #include <fstream>
 #include <nlohmann/json.hpp>
 
 
 namespace lue::qa {
-
     namespace {
 
         /*!
@@ -87,7 +86,8 @@ namespace lue::qa {
 
 
     /*!
-        @brief      Save the experiment results to a file
+        @brief      Save the @a experiment results to a file called @a pathname
+        @exception  std::runtime_error In case the file cannot be opened or is not writable
     */
     void save_results(ArrayExperiment const& experiment, std::string const& pathname)
     {
diff --git a/source/qa/cxx/src/scalability/run.cpp b/source/quality_assurance/cxx/src/scalability/run.cpp
similarity index 92%
rename from source/qa/cxx/src/scalability/run.cpp
rename to source/quality_assurance/cxx/src/scalability/run.cpp
index be30dc3f5..c3ae9462a 100644
--- a/source/qa/cxx/src/scalability/run.cpp
+++ b/source/quality_assurance/cxx/src/scalability/run.cpp
@@ -1,4 +1,4 @@
-#include "lue/qa/scalability/run.hpp"
+#include "lue/qa/scalability/instrument/run.hpp"
 
 
 namespace lue::qa {
diff --git a/source/qa/cxx/src/scalability/stopwatch.cpp b/source/quality_assurance/cxx/src/scalability/stopwatch.cpp
similarity index 94%
rename from source/qa/cxx/src/scalability/stopwatch.cpp
rename to source/quality_assurance/cxx/src/scalability/stopwatch.cpp
index 52cd2bfcd..b22269416 100644
--- a/source/qa/cxx/src/scalability/stopwatch.cpp
+++ b/source/quality_assurance/cxx/src/scalability/stopwatch.cpp
@@ -1,4 +1,4 @@
-#include "lue/qa/scalability/stopwatch.hpp"
+#include "lue/qa/scalability/instrument/stopwatch.hpp"
 
 
 namespace lue::qa {
diff --git a/source/qa/cxx/src/scalability/time_interval.cpp b/source/quality_assurance/cxx/src/scalability/time_interval.cpp
similarity index 92%
rename from source/qa/cxx/src/scalability/time_interval.cpp
rename to source/quality_assurance/cxx/src/scalability/time_interval.cpp
index 386375e53..01f7bea55 100644
--- a/source/qa/cxx/src/scalability/time_interval.cpp
+++ b/source/quality_assurance/cxx/src/scalability/time_interval.cpp
@@ -1,4 +1,4 @@
-#include "lue/qa/scalability/time_interval.hpp"
+#include "lue/qa/scalability/instrument/time_interval.hpp"
 #include <cassert>
 
 
diff --git a/source/quality_assurance/doc/index.md b/source/quality_assurance/doc/index.md
new file mode 100644
index 000000000..bfe4bdaef
--- /dev/null
+++ b/source/quality_assurance/doc/index.md
@@ -0,0 +1,8 @@
+(source-lue-qa)=
+
+# Quality assurance
+
+Software quality assurance is about verifying that the software meets certain criteria, like correctness,
+performance, and scalability. The LUE quality assurance part contains software that makes performing
+scalability experiments more convenient. For this we developed a [C++ API](#source-lue-qa-cxx) and a [Python
+API](#source-lue-qa-python).
diff --git a/source/quality_assurance/python/CMakeLists.txt b/source/quality_assurance/python/CMakeLists.txt
new file mode 100644
index 000000000..64a5fa562
--- /dev/null
+++ b/source/quality_assurance/python/CMakeLists.txt
@@ -0,0 +1,60 @@
+add_subdirectory(qa)
+
+add_test_conditionally(test)
+
+# A pybind11 SHARED library is a CMake runtime output artifact. Target properties to set/get are
+# RUNTIME_OUTPUT_DIRECTORY and RUNTIME_OUTPUT_NAME.
+add_library(lue_py_qa SHARED
+    src/python_extension.cpp
+    src/submodule.cpp
+)
+
+add_library(lue::py_qa ALIAS lue_py_qa)
+
+set_target_properties(lue_py_qa
+    PROPERTIES
+        VERSION ${LUE_VERSION}
+        SOVERSION ${LUE_VERSION_MAJOR}
+)
+target_include_directories(lue_py_qa
+    PUBLIC
+        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+)
+
+target_link_libraries(lue_py_qa
+    PRIVATE
+        lue::qa
+        lue::shared
+        pybind11::module
+        pybind11::thin_lto
+        pybind11::opt_size
+        pybind11::windows_extras
+)
+
+# TODO pybind11_strip does not work on macOS, when building using Conda packages
+#      The resulting binary can't be imported. Results in "killed: 9".
+if(NOT MSVC AND NOT APPLE AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo)
+    pybind11_strip(lue_py_qa)
+endif()
+
+lue_install_runtime_libraries(
+    TARGETS lue_py_qa
+)
+
+if(LUE_PYTHON_FROM_CONDA AND NOT DEFINED ENV{CONDA_BUILD})
+    # If we are using a Python interpreter from a Conda environment then we must expand RPATH
+    # to include the location of the Python libraries. But if we are building a Conda package,
+    # we assume Conda takes care of RPATH handling.
+    set_property(
+        TARGET lue_py_qa
+        APPEND
+        PROPERTY INSTALL_RPATH
+            ${Python_LIBRARY_DIRS}
+    )
+endif()
+
+install(
+    DIRECTORY ${CMAKE_BINARY_DIR}/${LUE_BUILD_PYTHON_PACKAGE_DIR}/$<$<BOOL:${LUE_GENERATOR_IS_MULTI_CONFIG}>:$<CONFIG>>/qa
+    DESTINATION ${LUE_INSTALL_PYTHON_PACKAGE_DIR}
+    COMPONENT lue_runtime
+)
diff --git a/source/quality_assurance/python/doc/index.md b/source/quality_assurance/python/doc/index.md
new file mode 100644
index 000000000..8447cceac
--- /dev/null
+++ b/source/quality_assurance/python/doc/index.md
@@ -0,0 +1,14 @@
+(source-lue-qa-python)=
+
+# Python
+
+```{eval-rst}
+.. automodule:: lue.qa
+.. automodule:: lue.qa.correctness
+.. automodule:: lue.qa.scalability
+.. automodule:: lue.qa.scalability.instrument
+.. autoclass:: lue.qa.scalability.instrument.Experiment
+.. autoclass:: lue.qa.scalability.instrument.ArrayExperiment
+.. autoclass:: lue.qa.scalability.instrument.Run
+.. autofunction:: lue.qa.scalability.instrument.save_results
+```
diff --git a/source/qa/python/include/lue/py/qa/submodule.hpp b/source/quality_assurance/python/include/lue/py/qa/submodule.hpp
similarity index 100%
rename from source/qa/python/include/lue/py/qa/submodule.hpp
rename to source/quality_assurance/python/include/lue/py/qa/submodule.hpp
diff --git a/source/qa/python/qa/CMakeLists.txt b/source/quality_assurance/python/qa/CMakeLists.txt
similarity index 100%
rename from source/qa/python/qa/CMakeLists.txt
rename to source/quality_assurance/python/qa/CMakeLists.txt
diff --git a/source/quality_assurance/python/qa/__init__.py b/source/quality_assurance/python/qa/__init__.py
new file mode 100644
index 000000000..12a3ad240
--- /dev/null
+++ b/source/quality_assurance/python/qa/__init__.py
@@ -0,0 +1,6 @@
+"""
+:mod:`lue.qa` --- LUE Quality Assurance
+=======================================
+"""
+
+from ..lue_py.qa import *
diff --git a/source/quality_assurance/python/qa/correctness/__init__.py b/source/quality_assurance/python/qa/correctness/__init__.py
new file mode 100644
index 000000000..a41d28778
--- /dev/null
+++ b/source/quality_assurance/python/qa/correctness/__init__.py
@@ -0,0 +1,4 @@
+"""
+:mod:`lue.qa.correctness`
+=========================
+"""
diff --git a/source/quality_assurance/python/qa/scalability/__init__.py b/source/quality_assurance/python/qa/scalability/__init__.py
new file mode 100644
index 000000000..83f337a90
--- /dev/null
+++ b/source/quality_assurance/python/qa/scalability/__init__.py
@@ -0,0 +1,6 @@
+"""
+:mod:`lue.qa.scalability`
+=========================
+"""
+
+from ...lue_py.qa.scalability import *
diff --git a/source/quality_assurance/python/qa/scalability/instrument/__init__.py b/source/quality_assurance/python/qa/scalability/instrument/__init__.py
new file mode 100644
index 000000000..15bf3a9bd
--- /dev/null
+++ b/source/quality_assurance/python/qa/scalability/instrument/__init__.py
@@ -0,0 +1,6 @@
+"""
+:mod:`lue.qa.scalability.instrument`
+====================================
+"""
+
+from ....lue_py.qa.scalability.instrument import *
diff --git a/source/qa/python/src/python_extension.cpp b/source/quality_assurance/python/src/python_extension.cpp
similarity index 78%
rename from source/qa/python/src/python_extension.cpp
rename to source/quality_assurance/python/src/python_extension.cpp
index 41edc1753..cb6ac526c 100644
--- a/source/qa/python/src/python_extension.cpp
+++ b/source/quality_assurance/python/src/python_extension.cpp
@@ -11,6 +11,11 @@ namespace lue::qa {
             R"(
     :mod:`lue_py_qa` --- LUE Quality Assurance
     ==========================================
+
+    .. note
+
+       Most classes and functions are thin wrappers around their C++ counterparts. See for more details the
+       C++ API documentation.
 )";
         module.attr("__version__") = pybind11::str(version());
         module.attr("lue_version") = pybind11::str(version());
diff --git a/source/quality_assurance/python/src/submodule.cpp b/source/quality_assurance/python/src/submodule.cpp
new file mode 100644
index 000000000..d1d34552b
--- /dev/null
+++ b/source/quality_assurance/python/src/submodule.cpp
@@ -0,0 +1,90 @@
+#include "lue/py/qa/submodule.hpp"
+#include "lue/qa/scalability/instrument/array_experiment.hpp"
+#include "lue/qa/scalability/instrument/io.hpp"
+#include "lue/qa/scalability/instrument/run.hpp"
+
+
+using namespace pybind11::literals;
+
+
+namespace lue::qa {
+
+    void init_submodule(pybind11::module& module)
+    {
+        pybind11::module qa_module = module.def_submodule("qa");
+
+        pybind11::module scalability_module = qa_module.def_submodule(
+            "scalability",
+            R"(
+    lue.qa.scalability
+    ==================
+)");
+
+        pybind11::module instrument_module = scalability_module.def_submodule(
+            "instrument",
+            R"(
+    lue.qa.scalability.instrument
+    =============================
+)");
+
+        pybind11::class_<Run>(
+            instrument_module,
+            "Run",
+            R"(
+    Class for keeping track of information of running some calculations once.
+)")
+            .def(pybind11::init<>())
+            .def(
+                "start",
+                &Run::start,
+                R"(
+    Start the run
+)")
+            .def(
+                "stop",
+                &Run::stop,
+                R"(
+    Stop the run
+)");
+
+        pybind11::class_<Experiment, Run>(
+            instrument_module,
+            "Experiment",
+            R"(
+    Class for instances containing information about scalability experiments
+
+    :param int nr_workers: Number of workers
+)")
+            .def(pybind11::init<Count>(), "nr_workers"_a)
+            .def_property_readonly("nr_workers", &Experiment::nr_workers)
+            .def(
+                "add",
+                &Experiment::add,
+                "run"_a,
+                R"(
+    Add the results of an experimental run
+)");
+
+        pybind11::class_<ArrayExperiment, Experiment>(
+            instrument_module,
+            "ArrayExperiment",
+            R"(
+    Class for instances containing information about a scalability experiments involving (2D) partitioned
+    arrays
+
+    :param int nr_workers: Number of workers
+    :param tuple array_shape: Shape of the array
+    :param tuple partition_shape: Shape of the array partitions
+)")
+            .def(
+                pybind11::init<Count, Shape const&, Shape const&>(),
+                "nr_workers"_a,
+                "array_shape"_a,
+                "partition_shape"_a)
+            .def_property_readonly("array_shape", &ArrayExperiment::array_shape)
+            .def_property_readonly("partition_shape", &ArrayExperiment::partition_shape);
+
+        instrument_module.def("save_results", save_results, "experiment"_a, "pathname"_a);
+    }
+
+}  // namespace lue::qa
diff --git a/source/quality_assurance/scalability/CMakeLists.txt b/source/quality_assurance/scalability/CMakeLists.txt
new file mode 100644
index 000000000..0615b7f26
--- /dev/null
+++ b/source/quality_assurance/scalability/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_subdirectory(command)
+add_subdirectory(script)
+
+add_test_conditionally(test)
+
+install(
+    DIRECTORY ${CMAKE_BINARY_DIR}/${LUE_BUILD_PYTHON_PACKAGE_DIR}/$<$<BOOL:${LUE_GENERATOR_IS_MULTI_CONFIG}>:$<CONFIG>>/command
+    DESTINATION ${LUE_INSTALL_PYTHON_PACKAGE_DIR}
+    COMPONENT lue_runtime
+)
diff --git a/source/quality_assurance/scalability/command/CMakeLists.txt b/source/quality_assurance/scalability/command/CMakeLists.txt
new file mode 100644
index 000000000..fc0f5cb0e
--- /dev/null
+++ b/source/quality_assurance/scalability/command/CMakeLists.txt
@@ -0,0 +1,8 @@
+file(GLOB_RECURSE pathnames RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS "*.py")
+
+foreach(pathname ${pathnames})
+    file(GENERATE
+        OUTPUT ${CMAKE_BINARY_DIR}/${LUE_BUILD_PYTHON_PACKAGE_DIR}/$<$<BOOL:${LUE_GENERATOR_IS_MULTI_CONFIG}>:$<CONFIG>>/command/${pathname}
+        INPUT ${pathname}
+    )
+endforeach()
diff --git a/source/quality_assurance/scalability/command/__init__.py b/source/quality_assurance/scalability/command/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/source/qa/python/qa/scalability/__init__.py b/source/quality_assurance/scalability/command/scalability/__init__.py
similarity index 100%
rename from source/qa/python/qa/scalability/__init__.py
rename to source/quality_assurance/scalability/command/scalability/__init__.py
diff --git a/source/quality_assurance/scalability/command/scalability/cli/__init__.py b/source/quality_assurance/scalability/command/scalability/cli/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/source/qa/script/array_shape.py b/source/quality_assurance/scalability/command/scalability/cli/array_shape.py
old mode 100755
new mode 100644
similarity index 61%
rename from source/qa/script/array_shape.py
rename to source/quality_assurance/scalability/command/scalability/cli/array_shape.py
index 40e39aa8b..47a957989
--- a/source/qa/script/array_shape.py
+++ b/source/quality_assurance/scalability/command/scalability/cli/array_shape.py
@@ -1,15 +1,20 @@
-#!/usr/bin/env python
-# -*- encoding: utf8 -*-
+"""
+Implementation of the array_shape command-line utility
+"""
+
 import functools
-import math
 import os.path
 import sys
 
 import docopt
 
+from lue import __version__ as lue_version
+from lue.command.scalability.experiment.shape import array_shape
+
 
-usage = """\
-Calculate array shape to use for scaling experiments
+def main():
+    usage = """\
+Calculate array shape to use for scalability experiments
 
 Usage:
     {command} <memory> <rank> <nr_arrays> <size_of_element> <nr_nodes>
@@ -26,38 +31,10 @@
     In the context of computer memory, gigabyte and GB are customarily
     used to mean 1024³ (2³⁰) bytes.
 """.format(
-    command=os.path.basename(sys.argv[0])
-)
-
-
-def array_shape(memory_available, rank, nr_arrays, size_of_element, nr_nodes):
-    """
-    Determine a maximum array shape to use in scaling experiments, given the
-    amount of memory to use, and properties of the arrays
-
-    memory_available: bytes per node
-    rank: int
-    nr_arrays: int
-    size_of_element: bytes
-    nr_nodes: int
-    """
-    assert memory_available > 0
-    assert rank > 0
-    assert nr_arrays > 0
-    assert size_of_element > 0
-    assert nr_nodes > 0
-
-    nr_elements = float(nr_nodes * memory_available) / size_of_element
-    elements_per_array = nr_elements / nr_arrays
-    elements_per_dimension = math.pow(elements_per_array, 1.0 / rank)
-
-    elements_per_dimension = int(math.floor(elements_per_dimension))
-
-    return rank * (elements_per_dimension,)
-
+        command=os.path.basename(sys.argv[0])
+    )
 
-if __name__ == "__main__":
-    arguments = docopt.docopt(usage)
+    arguments = docopt.docopt(usage, version=lue_version)
 
     memory_available = int(arguments["<memory>"])
     memory_available *= 2**30
diff --git a/source/quality_assurance/scalability/command/scalability/cli/scalability.py b/source/quality_assurance/scalability/command/scalability/cli/scalability.py
new file mode 100644
index 000000000..acbb3ef35
--- /dev/null
+++ b/source/quality_assurance/scalability/command/scalability/cli/scalability.py
@@ -0,0 +1,116 @@
+import datetime
+import sys
+from pathlib import Path
+
+import docopt
+
+from lue import __version__ as lue_version
+from lue.command.scalability import perform_experiment_task
+
+
+def main():
+    usage = """\
+Perform scalability experiment
+
+Usage:
+    {command}
+        (partition_shape | weak_scalability | strong_scalability)
+        (script | import | postprocess)
+        <command> <arguments>
+        <platform> (core_numa_node | core_cluster_node | numa_node | cluster_node)
+        <platform_config_prefix> <experiment_config_prefix> <result_prefix>
+    {command} -h | --help
+    {command} --version
+
+Options:
+    -h --help       Show this screen
+    --version       Show version
+    command         Command to analyse
+    arguments       Additional arguments to pass on to the command. Pass an
+                    empty string if this is not needed.
+    result_prefix   Directory to store results in
+    platform        Name of platform
+""".format(
+        command=Path(sys.argv[0]).name
+    )
+
+    arguments = docopt.docopt(usage, version=lue_version)
+
+    if arguments["partition_shape"]:
+        experiment_name = "partition_shape"
+    elif arguments["weak_scalability"]:
+        experiment_name = "weak_scalability"
+    elif arguments["strong_scalability"]:
+        experiment_name = "strong_scalability"
+    else:
+        experiment_name = "unknown"
+
+    if arguments["script"]:
+        task_name = "script"
+    elif arguments["import"]:
+        task_name = "import"
+    elif arguments["postprocess"]:
+        task_name = "postprocess"
+    else:
+        task_name = "unknown"
+
+    if arguments["core_numa_node"]:
+        worker_name = "core_numa_node"
+    elif arguments["core_cluster_node"]:
+        worker_name = "core_cluster_node"
+    elif arguments["numa_node"]:
+        worker_name = "numa_node"
+    elif arguments["cluster_node"]:
+        worker_name = "cluster_node"
+    else:
+        worker_name = "unknown"
+
+    command_name = arguments["<command>"]
+    command_arguments = arguments["<arguments>"]
+    platform_name = arguments["<platform>"]
+
+    platform_config_prefix = arguments["<platform_config_prefix>"]
+    experiment_config_prefix = arguments["<experiment_config_prefix>"]
+    result_prefix = arguments["<result_prefix>"]
+
+    script_pathname = Path(result_prefix).joinpath(
+        platform_name, command_name, worker_name, f"{experiment_name}.sh"
+    )
+    platform_config_pathname = Path(platform_config_prefix).joinpath(
+        platform_name, "platform.json"
+    )
+    worker_config_pathname = Path(platform_config_prefix).joinpath(
+        platform_name, worker_name, f"{experiment_name}.json"
+    )
+    experiment_config_pathname = Path(experiment_config_prefix).joinpath(
+        platform_name, command_name, worker_name, f"{experiment_name}.json"
+    )
+
+    result_path = Path(result_prefix).joinpath(
+        platform_name, command_name, worker_name, experiment_name
+    )
+
+    if task_name == "script" and result_path.exists():
+        modification_time_point = datetime.datetime.fromtimestamp(
+            result_path.stat().st_mtime
+        )
+
+        result_path.rename(
+            f"{result_path}-{modification_time_point.isoformat(timespec='seconds')}"
+        )
+
+    configuration_data = {
+        "command_pathname": f"{command_name}",
+        "command_arguments": f"{command_arguments}",
+        "script_pathname": f"{script_pathname}",
+        "result_prefix": f"{result_prefix}",
+        "platform": f"{platform_config_pathname}",
+        "benchmark": f"{worker_config_pathname}",  # TODO worker?
+        "experiment": f"{experiment_config_pathname}",
+    }
+
+    # import pprint
+    # pprint.pprint(configuration_data)
+    # meh
+
+    perform_experiment_task(experiment_name, task_name, configuration_data)
diff --git a/source/qa/python/qa/scalability/core/__init__.py b/source/quality_assurance/scalability/command/scalability/core/__init__.py
similarity index 100%
rename from source/qa/python/qa/scalability/core/__init__.py
rename to source/quality_assurance/scalability/command/scalability/core/__init__.py
diff --git a/source/qa/python/qa/scalability/core/format.py b/source/quality_assurance/scalability/command/scalability/core/format.py
similarity index 100%
rename from source/qa/python/qa/scalability/core/format.py
rename to source/quality_assurance/scalability/command/scalability/core/format.py
diff --git a/source/qa/python/qa/scalability/core/hpx.py b/source/quality_assurance/scalability/command/scalability/core/hpx.py
similarity index 88%
rename from source/qa/python/qa/scalability/core/hpx.py
rename to source/quality_assurance/scalability/command/scalability/core/hpx.py
index 433cdd61f..f16ae7588 100644
--- a/source/qa/python/qa/scalability/core/hpx.py
+++ b/source/quality_assurance/scalability/command/scalability/core/hpx.py
@@ -9,5 +9,5 @@ def performance_counter_name_to_property_name(counter_name):
 
 
 def property_name_to_performance_counter_name(property_name):
-    assert property_name.find("/") == -1, counter_name
+    assert property_name.find("/") == -1, property_name
     return property_name.replace("|", "/")
diff --git a/source/qa/python/qa/scalability/core/json.py b/source/quality_assurance/scalability/command/scalability/core/json.py
similarity index 100%
rename from source/qa/python/qa/scalability/core/json.py
rename to source/quality_assurance/scalability/command/scalability/core/json.py
diff --git a/source/qa/python/qa/scalability/core/math.py b/source/quality_assurance/scalability/command/scalability/core/math.py
similarity index 100%
rename from source/qa/python/qa/scalability/core/math.py
rename to source/quality_assurance/scalability/command/scalability/core/math.py
diff --git a/source/qa/python/qa/scalability/core/plot.py b/source/quality_assurance/scalability/command/scalability/core/plot.py
similarity index 100%
rename from source/qa/python/qa/scalability/core/plot.py
rename to source/quality_assurance/scalability/command/scalability/core/plot.py
diff --git a/source/qa/python/qa/scalability/core/process.py b/source/quality_assurance/scalability/command/scalability/core/process.py
similarity index 100%
rename from source/qa/python/qa/scalability/core/process.py
rename to source/quality_assurance/scalability/command/scalability/core/process.py
diff --git a/source/quality_assurance/scalability/command/scalability/experiment/__init__.py b/source/quality_assurance/scalability/command/scalability/experiment/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/source/qa/python/qa/scalability/experiment/benchmark.py b/source/quality_assurance/scalability/command/scalability/experiment/benchmark.py
similarity index 99%
rename from source/qa/python/qa/scalability/experiment/benchmark.py
rename to source/quality_assurance/scalability/command/scalability/experiment/benchmark.py
index 138182140..9f0ee3ad4 100644
--- a/source/qa/python/qa/scalability/experiment/benchmark.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/benchmark.py
@@ -1,5 +1,4 @@
-from lue.qa.scalability.core import json_to_data
-
+from ..core import json_to_data
 from . import worker
 
 
diff --git a/source/qa/python/qa/scalability/experiment/cluster.py b/source/quality_assurance/scalability/command/scalability/experiment/cluster.py
similarity index 100%
rename from source/qa/python/qa/scalability/experiment/cluster.py
rename to source/quality_assurance/scalability/command/scalability/experiment/cluster.py
diff --git a/source/qa/python/qa/scalability/experiment/configuration.py b/source/quality_assurance/scalability/command/scalability/experiment/configuration.py
similarity index 76%
rename from source/qa/python/qa/scalability/experiment/configuration.py
rename to source/quality_assurance/scalability/command/scalability/experiment/configuration.py
index 559d55f66..8a5cc83a1 100644
--- a/source/qa/python/qa/scalability/experiment/configuration.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/configuration.py
@@ -1,7 +1,6 @@
 import os.path
 
-from lue.qa.scalability.core import json_to_data
-
+from ..core import json_to_data
 from .benchmark import Benchmark
 from .cluster import Cluster
 
@@ -12,7 +11,8 @@ def __init__(self, data):
 
     def _from_json(self, data):
         self.command_pathname = os.path.expandvars(data["command_pathname"])
+        self.command_arguments = data["command_arguments"]
         self.script_pathname = os.path.expandvars(data["script_pathname"])
         self.result_prefix = os.path.expandvars(data["result_prefix"])
-        self.cluster = Cluster(json_to_data(data["cluster"]))
+        self.cluster = Cluster(json_to_data(data["platform"]))
         self.benchmark = Benchmark(json_to_data(data["benchmark"]), self.cluster)
diff --git a/source/qa/python/qa/scalability/experiment/dataset.py b/source/quality_assurance/scalability/command/scalability/experiment/dataset.py
similarity index 100%
rename from source/qa/python/qa/scalability/experiment/dataset.py
rename to source/quality_assurance/scalability/command/scalability/experiment/dataset.py
diff --git a/source/qa/python/qa/scalability/experiment/experiment.py b/source/quality_assurance/scalability/command/scalability/experiment/experiment.py
similarity index 92%
rename from source/qa/python/qa/scalability/experiment/experiment.py
rename to source/quality_assurance/scalability/command/scalability/experiment/experiment.py
index cd735e9f3..8fb357be4 100644
--- a/source/qa/python/qa/scalability/experiment/experiment.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/experiment.py
@@ -30,6 +30,7 @@ def __init__(self, data, name, description):
 
         self.description = description
         self.command_pathname = data["command_pathname"]
+        self.command_arguments = data["command_arguments"]
         self.arguments = (
             Arguments(data["arguments"]) if "arguments" in data else Arguments({})
         )
@@ -45,6 +46,7 @@ def __init__(self, data, name, description):
     def to_json(self):
         result = {
             "command_pathname": self.command_pathname,
+            "command_arguments": self.command_arguments,
             # "nr_time_steps": self.nr_time_steps,
         }
 
@@ -74,9 +76,9 @@ def workspace_pathname(self, result_prefix, cluster_name, scenario_name):
         )
 
     def result_pathname(
-        self, result_prefix, cluster_name, scenario_name, basename, extension
+        self, result_prefix, cluster_name, scenario_name, basename, extension=""
     ):
         return os.path.join(
             self.workspace_pathname(result_prefix, cluster_name, scenario_name),
-            "{}.{}".format(basename, extension),
+            f"{basename}.{extension}" if extension else basename,
         )
diff --git a/source/qa/python/qa/scalability/experiment/job.py b/source/quality_assurance/scalability/command/scalability/experiment/job.py
similarity index 99%
rename from source/qa/python/qa/scalability/experiment/job.py
rename to source/quality_assurance/scalability/command/scalability/experiment/job.py
index addee7ffc..951e0845d 100644
--- a/source/qa/python/qa/scalability/experiment/job.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/job.py
@@ -235,7 +235,7 @@ def create_slurm_script(
 {job_steps}""".format(
         nr_cluster_nodes=nr_cluster_nodes,  # Ask for this nr_cluster_nodes
         nr_tasks=nr_tasks,  # Ask for hardware for max nr_tasks
-        cores_per_socket=nr_cores_per_socket,  # Ask for whole sockets of core
+        # cores_per_socket=nr_cores_per_socket,  # Ask for whole sockets of core
         # cores_per_socket=nr_cores_per_numa_node,
         cpus_per_task=cpus_per_task,
         output_filename=output_filename,
diff --git a/source/qa/python/qa/scalability/experiment/partition_shape/__init__.py b/source/quality_assurance/scalability/command/scalability/experiment/partition_shape/__init__.py
similarity index 100%
rename from source/qa/python/qa/scalability/experiment/partition_shape/__init__.py
rename to source/quality_assurance/scalability/command/scalability/experiment/partition_shape/__init__.py
diff --git a/source/qa/python/qa/scalability/experiment/strong_scalability/configuration.py b/source/quality_assurance/scalability/command/scalability/experiment/partition_shape/configuration.py
similarity index 80%
rename from source/qa/python/qa/scalability/experiment/strong_scalability/configuration.py
rename to source/quality_assurance/scalability/command/scalability/experiment/partition_shape/configuration.py
index 321692d0b..e019058bf 100644
--- a/source/qa/python/qa/scalability/experiment/strong_scalability/configuration.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/partition_shape/configuration.py
@@ -1,5 +1,4 @@
-from lue.qa.scalability.core import json_to_data
-
+from ...core import json_to_data
 from .. import configuration
 from . import experiment
 
@@ -12,4 +11,5 @@ def __init__(self, data):
     def from_json(self, data):
         experiment_data = json_to_data(data["experiment"])
         experiment_data["command_pathname"] = self.command_pathname
+        experiment_data["command_arguments"] = self.command_arguments
         self.experiment = experiment.Experiment(experiment_data)
diff --git a/source/qa/python/qa/scalability/experiment/partition_shape/experiment.py b/source/quality_assurance/scalability/command/scalability/experiment/partition_shape/experiment.py
similarity index 100%
rename from source/qa/python/qa/scalability/experiment/partition_shape/experiment.py
rename to source/quality_assurance/scalability/command/scalability/experiment/partition_shape/experiment.py
diff --git a/source/qa/python/qa/scalability/experiment/partition_shape/generate_script.py b/source/quality_assurance/scalability/command/scalability/experiment/partition_shape/generate_script.py
similarity index 94%
rename from source/qa/python/qa/scalability/experiment/partition_shape/generate_script.py
rename to source/quality_assurance/scalability/command/scalability/experiment/partition_shape/generate_script.py
index 8c597296a..ff6bedfff 100644
--- a/source/qa/python/qa/scalability/experiment/partition_shape/generate_script.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/partition_shape/generate_script.py
@@ -1,7 +1,6 @@
 import os.path
 
-from lue.qa.scalability.core import hpx
-
+from ...core import hpx
 from .. import dataset, job
 from .configuration import Configuration
 
@@ -52,8 +51,7 @@ def generate_script_slurm(
                     os.path.dirname(result_pathname)
                 ),
                 # Run the benchmark, resulting in a json file
-                # "srun --ntasks {nr_tasks} {srun_configuration} {command_pathname} "
-                "mpirun --n {nr_tasks} {mpirun_configuration} {command_pathname} "
+                f"mpirun --n {nr_tasks} {mpirun_configuration} {experiment.command_pathname} {experiment.command_arguments} "
                 # '--hpx:ini="hpx.parcel.mpi.enable=1" '
                 # '--hpx:ini="hpx.os_threads={nr_threads}" '
                 '--hpx:threads="{nr_threads}" '
@@ -62,7 +60,6 @@ def generate_script_slurm(
                     nr_tasks=nr_localities,
                     mpirun_configuration=job.mpirun_configuration(cluster),
                     # srun_configuration=job.srun_configuration(cluster),
-                    command_pathname=experiment.command_pathname,
                     nr_threads=nr_threads,
                     # thread_binding=hpx.thread_binding(nr_threads),
                     program_configuration=job.program_configuration(
@@ -120,7 +117,7 @@ def generate_script_slurm(
     ]
 
     job.write_script(commands, script_pathname)
-    print("bash ./{}".format(script_pathname))
+    print("bash {}".format(script_pathname))
 
 
 def generate_script_shell(
@@ -150,12 +147,11 @@ def generate_script_shell(
                 # Create directory for the resulting json file
                 "mkdir -p {}".format(os.path.dirname(result_pathname)),
                 # Run the benchmark, resulting in a json file
-                "{command_pathname} "
+                f"{experiment.command_pathname} {experiment.command_arguments} "
                 # '--hpx:ini="hpx.os_threads={nr_threads}" '
                 '--hpx:threads="{nr_threads}" '
                 # '--hpx:bind="{thread_binding}" '
                 "{program_configuration}".format(
-                    command_pathname=experiment.command_pathname,
                     nr_threads=nr_threads,
                     # thread_binding=hpx.thread_binding(nr_threads),
                     program_configuration=job.program_configuration(
@@ -172,7 +168,7 @@ def generate_script_shell(
             ]
 
     job.write_script(commands, script_pathname)
-    print("bash ./{}".format(script_pathname))
+    print("bash {}".format(script_pathname))
 
 
 def generate_script(configuration_data):
diff --git a/source/qa/python/qa/scalability/experiment/partition_shape/import_results.py b/source/quality_assurance/scalability/command/scalability/experiment/partition_shape/import_results.py
similarity index 97%
rename from source/qa/python/qa/scalability/experiment/partition_shape/import_results.py
rename to source/quality_assurance/scalability/command/scalability/experiment/partition_shape/import_results.py
index 710941514..b99472c5c 100644
--- a/source/qa/python/qa/scalability/experiment/partition_shape/import_results.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/partition_shape/import_results.py
@@ -6,8 +6,8 @@
 import numpy as np
 
 import lue.data_model as ldm
-from lue.qa.scalability.core import process
 
+from ...core import process
 from .. import dataset, job
 from .configuration import Configuration
 from .experiment import Experiment
@@ -51,6 +51,13 @@ def benchmark_meta_to_lue_json(
                                     "datatype": "string",
                                     "value": [experiment.command_pathname],
                                 },
+                                {
+                                    "name": "arguments",
+                                    "shape_per_object": "same_shape",
+                                    "value_variability": "constant",
+                                    "datatype": "string",
+                                    "value": [experiment.command_arguments],
+                                },
                                 {
                                     "name": "kind",
                                     "shape_per_object": "same_shape",
diff --git a/source/qa/python/qa/scalability/experiment/partition_shape/postprocess_results.py b/source/quality_assurance/scalability/command/scalability/experiment/partition_shape/postprocess_results.py
similarity index 89%
rename from source/qa/python/qa/scalability/experiment/partition_shape/postprocess_results.py
rename to source/quality_assurance/scalability/command/scalability/experiment/partition_shape/postprocess_results.py
index c5a3732a1..a610007c3 100644
--- a/source/qa/python/qa/scalability/experiment/partition_shape/postprocess_results.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/partition_shape/postprocess_results.py
@@ -3,14 +3,16 @@
 import numpy as np
 
 import lue.data_model as ldm
-from lue.qa.scalability.core import math, plot, process
 
+from ...core import math, plot, process
 from .. import dataset, job
 from .configuration import Configuration
 from .experiment import Experiment
 
 
-def post_process_raw_results(lue_dataset, result_prefix, plot_pathname, experiment):
+def post_process_raw_results(
+    lue_dataset, result_prefix, plot_pathname, experiment, filetypes
+):
     """
     Create plots and tables from raw benchmark results
     """
@@ -122,10 +124,11 @@ def plot_duration(axis, array_idx, partition_sizes, partition_shapes):
             )
         )
 
-        a_plot_pathname = experiment.benchmark_result_pathname(
-            result_prefix, system_name, scenario_name, array_shape, "plot", "pdf"
-        )
-        plt.savefig(a_plot_pathname, bbox_inches="tight")
+        for filetype in filetypes:
+            a_plot_pathname = experiment.benchmark_result_pathname(
+                result_prefix, system_name, scenario_name, array_shape, "plot", filetype
+            )
+            plt.savefig(a_plot_pathname, bbox_inches="tight", transparent=True)
 
     # --------------------------------------------------------------------------
     array_shapes = lue_dataset.array.array.shape.value[:]
@@ -160,7 +163,10 @@ def plot_duration(axis, array_idx, partition_sizes, partition_shapes):
         )
     )
 
-    plt.savefig(plot_pathname, bbox_inches="tight")
+    for filetype in filetypes:
+        plt.savefig(
+            f"{plot_pathname}.{filetype}", bbox_inches="tight", transparent=True
+        )
 
 
 def postprocess_results(configuration_data):
@@ -177,6 +183,8 @@ def postprocess_results(configuration_data):
         lue_dataset, Experiment
     )
 
+    filetypes = ["pdf", "png", "svg"]
+
     process.create_dot_graph(
         lue_dataset.pathname,
         experiment.result_pathname(
@@ -184,6 +192,8 @@ def postprocess_results(configuration_data):
         ),
     )
     plot_pathname = experiment.result_pathname(
-        result_prefix, cluster.name, benchmark.scenario_name, "plot", "pdf"
+        result_prefix, cluster.name, benchmark.scenario_name, "plot"
+    )
+    post_process_raw_results(
+        lue_dataset, result_prefix, plot_pathname, experiment, filetypes
     )
-    post_process_raw_results(lue_dataset, result_prefix, plot_pathname, experiment)
diff --git a/source/qa/python/qa/scalability/experiment/pool.py b/source/quality_assurance/scalability/command/scalability/experiment/pool.py
similarity index 100%
rename from source/qa/python/qa/scalability/experiment/pool.py
rename to source/quality_assurance/scalability/command/scalability/experiment/pool.py
diff --git a/source/qa/python/qa/scalability/experiment/shape.py b/source/quality_assurance/scalability/command/scalability/experiment/shape.py
similarity index 87%
rename from source/qa/python/qa/scalability/experiment/shape.py
rename to source/quality_assurance/scalability/command/scalability/experiment/shape.py
index 917c50b9f..52e33e153 100644
--- a/source/qa/python/qa/scalability/experiment/shape.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/shape.py
@@ -2,6 +2,32 @@
 from functools import reduce
 
 
+def array_shape(memory_available, rank, nr_arrays, size_of_element, nr_nodes):
+    """
+    Determine a maximum array shape to use in scaling experiments, given the
+    amount of memory to use, and properties of the arrays
+
+    memory_available: bytes per node
+    rank: int
+    nr_arrays: int
+    size_of_element: bytes
+    nr_nodes: int
+    """
+    assert memory_available > 0
+    assert rank > 0
+    assert nr_arrays > 0
+    assert size_of_element > 0
+    assert nr_nodes > 0
+
+    nr_elements = float(nr_nodes * memory_available) / size_of_element
+    elements_per_array = nr_elements / nr_arrays
+    elements_per_dimension = math.pow(elements_per_array, 1.0 / rank)
+
+    elements_per_dimension = int(math.floor(elements_per_dimension))
+
+    return rank * (elements_per_dimension,)
+
+
 def partition_shape_multipliers(shape, partition_shape):
     """
     Given an array shape and a partition shape, determine for each dimension
diff --git a/source/qa/python/qa/scalability/experiment/strong_scalability/__init__.py b/source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/__init__.py
similarity index 100%
rename from source/qa/python/qa/scalability/experiment/strong_scalability/__init__.py
rename to source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/__init__.py
diff --git a/source/qa/python/qa/scalability/experiment/weak_scalability/configuration.py b/source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/configuration.py
similarity index 80%
rename from source/qa/python/qa/scalability/experiment/weak_scalability/configuration.py
rename to source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/configuration.py
index 321692d0b..e019058bf 100644
--- a/source/qa/python/qa/scalability/experiment/weak_scalability/configuration.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/configuration.py
@@ -1,5 +1,4 @@
-from lue.qa.scalability.core import json_to_data
-
+from ...core import json_to_data
 from .. import configuration
 from . import experiment
 
@@ -12,4 +11,5 @@ def __init__(self, data):
     def from_json(self, data):
         experiment_data = json_to_data(data["experiment"])
         experiment_data["command_pathname"] = self.command_pathname
+        experiment_data["command_arguments"] = self.command_arguments
         self.experiment = experiment.Experiment(experiment_data)
diff --git a/source/qa/python/qa/scalability/experiment/strong_scalability/experiment.py b/source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/experiment.py
similarity index 100%
rename from source/qa/python/qa/scalability/experiment/strong_scalability/experiment.py
rename to source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/experiment.py
diff --git a/source/qa/python/qa/scalability/experiment/strong_scalability/generate_script.py b/source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/generate_script.py
similarity index 94%
rename from source/qa/python/qa/scalability/experiment/strong_scalability/generate_script.py
rename to source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/generate_script.py
index 2d60bcde1..ae1b4a37f 100644
--- a/source/qa/python/qa/scalability/experiment/strong_scalability/generate_script.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/generate_script.py
@@ -25,10 +25,11 @@ def generate_script_slurm_threads(
             result_prefix, cluster.name, benchmark.scenario_name, nr_workers, "json"
         )
 
+        a = 3
+
         job_steps += [
             # Run the benchmark, resulting in a json file
-            # "srun --ntasks {nr_tasks} {srun_configuration} {command_pathname} "
-            "mpirun --n {nr_tasks} {mpirun_configuration} {command_pathname} "
+            f"mpirun --n {nr_tasks} {mpirun_configuration} {experiment.command_pathname} {experiment.command_arguments} "
             # '--hpx:ini="hpx.parcel.mpi.enable=1" '
             # '--hpx:ini="hpx.os_threads={nr_threads}" '
             '--hpx:threads="{nr_threads}" '
@@ -37,7 +38,6 @@ def generate_script_slurm_threads(
                 nr_tasks=1,  # Single NUMA node or cluster node
                 mpirun_configuration=job.mpirun_configuration(cluster),
                 # srun_configuration=job.srun_configuration(cluster),
-                command_pathname=experiment.command_pathname,
                 nr_threads=nr_threads,
                 # thread_binding=hpx.thread_binding(nr_threads),
                 program_configuration=job.program_configuration(
@@ -93,7 +93,7 @@ def generate_script_slurm_threads(
     ]
 
     job.write_script(commands, script_pathname)
-    print("bash ./{}".format(script_pathname))
+    print("bash {}".format(script_pathname))
 
 
 def generate_script_slurm_numa_nodes(
@@ -121,8 +121,7 @@ def generate_script_slurm_numa_nodes(
 
         job_steps += [
             # Run the benchmark, resulting in a json file
-            # "srun --ntasks {nr_tasks} {srun_configuration} {command_pathname} "
-            "mpirun --n {nr_tasks} {mpirun_configuration} {command_pathname} "
+            f"mpirun --n {nr_tasks} {mpirun_configuration} {experiment.command_pathname} {experiment.command_arguments} "
             # '--hpx:ini="hpx.parcel.mpi.enable=1" '
             # '--hpx:ini="hpx.os_threads={nr_threads}" '
             '--hpx:threads="{nr_threads}" '
@@ -131,7 +130,6 @@ def generate_script_slurm_numa_nodes(
                 nr_tasks=nr_localities,
                 mpirun_configuration=job.mpirun_configuration(cluster),
                 # srun_configuration=job.srun_configuration(cluster),
-                command_pathname=experiment.command_pathname,
                 nr_threads=nr_threads,
                 # thread_binding=util.thread_binding(nr_threads),
                 program_configuration=job.program_configuration(
@@ -191,7 +189,7 @@ def generate_script_slurm_numa_nodes(
     ]
 
     job.write_script(commands, script_pathname)
-    print("bash ./{}".format(script_pathname))
+    print("bash {}".format(script_pathname))
 
 
 def generate_script_slurm_cluster_nodes(
@@ -229,8 +227,7 @@ def generate_script_slurm_cluster_nodes(
 
         job_steps = [
             # Run the benchmark, resulting in a json file
-            # "srun --ntasks {nr_tasks} {srun_configuration} {command_pathname} "
-            "mpirun --n {nr_tasks} {mpirun_configuration} {command_pathname} "
+            f"mpirun --n {nr_tasks} {mpirun_configuration} {experiment.command_pathname} {experiment.command_arguments} "
             # '--hpx:ini="hpx.parcel.mpi.enable=1" '
             # '--hpx:ini="hpx.os_threads={nr_threads}" '
             '--hpx:threads="{nr_threads}" '
@@ -239,7 +236,6 @@ def generate_script_slurm_cluster_nodes(
                 nr_tasks=nr_localities,
                 mpirun_configuration=job.mpirun_configuration(cluster),
                 # srun_configuration=job.srun_configuration(cluster),
-                command_pathname=experiment.command_pathname,
                 nr_threads=nr_threads,
                 # thread_binding=util.thread_binding(nr_threads),
                 program_configuration=job.program_configuration(
@@ -300,7 +296,7 @@ def generate_script_slurm_cluster_nodes(
         ]
 
     job.write_script(commands, script_pathname)
-    print("bash ./{}".format(script_pathname))
+    print("bash {}".format(script_pathname))
 
 
 def generate_script_slurm(
@@ -348,12 +344,11 @@ def generate_script_shell(
             # Create directory for the resulting json file
             "mkdir -p {}".format(os.path.dirname(result_pathname)),
             # Run the benchmark, resulting in a json file
-            "{command_pathname} "
+            f"{experiment.command_pathname} {experiment.command_arguments} "
             # '--hpx:ini="hpx.os_threads={nr_threads}" '
             '--hpx:threads="{nr_threads}" '
             # '--hpx:bind="{thread_binding}" '
             "{program_configuration}".format(
-                command_pathname=experiment.command_pathname,
                 nr_threads=nr_threads,
                 # thread_binding=hpx.thread_binding(nr_threads),
                 program_configuration=job.program_configuration(
@@ -369,7 +364,7 @@ def generate_script_shell(
         ]
 
     job.write_script(commands, script_pathname)
-    print("bash ./{}".format(script_pathname))
+    print("bash {}".format(script_pathname))
 
 
 def generate_script(configuration_data):
diff --git a/source/qa/python/qa/scalability/experiment/strong_scalability/import_results.py b/source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/import_results.py
similarity index 98%
rename from source/qa/python/qa/scalability/experiment/strong_scalability/import_results.py
rename to source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/import_results.py
index a20771961..27baf8ed4 100644
--- a/source/qa/python/qa/scalability/experiment/strong_scalability/import_results.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/import_results.py
@@ -6,8 +6,8 @@
 import numpy as np
 
 import lue.data_model as ldm
-from lue.qa.scalability.core import process
 
+from ...core import process
 from .. import dataset, job, util
 from .configuration import Configuration
 from .experiment import Experiment
@@ -49,6 +49,13 @@ def benchmark_meta_to_lue_json(
                                     "datatype": "string",
                                     "value": [experiment.command_pathname],
                                 },
+                                {
+                                    "name": "arguments",
+                                    "shape_per_object": "same_shape",
+                                    "value_variability": "constant",
+                                    "datatype": "string",
+                                    "value": [experiment.command_arguments],
+                                },
                                 {
                                     "name": "kind",
                                     "shape_per_object": "same_shape",
diff --git a/source/qa/python/qa/scalability/experiment/strong_scalability/postprocess_results.py b/source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/postprocess_results.py
similarity index 97%
rename from source/qa/python/qa/scalability/experiment/strong_scalability/postprocess_results.py
rename to source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/postprocess_results.py
index cc08b3f38..853c1a6ef 100644
--- a/source/qa/python/qa/scalability/experiment/strong_scalability/postprocess_results.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/strong_scalability/postprocess_results.py
@@ -3,8 +3,8 @@
 import numpy as np
 
 import lue.data_model as ldm
-from lue.qa.scalability.core import math, plot, process
 
+from ...core import math, plot, process
 from .. import dataset, job
 from .configuration import Configuration
 from .experiment import Experiment
@@ -17,7 +17,7 @@
 # import re
 
 
-def post_process_raw_results(lue_dataset, result_prefix, plot_pathname):
+def post_process_raw_results(lue_dataset, result_prefix, plot_pathname, filetypes):
     """
     Create plots and tables from raw benchmark results
     """
@@ -151,7 +151,7 @@ def plot_relative_speed_up(axis):
 
         plot_actual(relative_speed_up)
 
-        y_label = "relative speed_up (-)"
+        y_label = "relative speed-up (-)"
 
         annotate_plot(axis, y_label)
 
@@ -253,7 +253,7 @@ def plot_relative_efficiency(axis):
     # plot_lups(axes[1][1])
     axes[1, 1].axis("off")
 
-    figure.legend(labels=["serial", "linear", "actual"])
+    figure.legend(labels=["serial", "linear", "actual"], framealpha=0.0)
 
     name = lue_meta_information.name.value[:][0]
     system_name = lue_meta_information.system_name.value[:][0]
@@ -273,7 +273,10 @@ def plot_relative_efficiency(axis):
         )
     )
 
-    plt.savefig(plot_pathname, bbox_inches="tight")
+    for filetype in filetypes:
+        plt.savefig(
+            f"{plot_pathname}.{filetype}", bbox_inches="tight", transparent=True
+        )
 
 
 # class PerformanceCounter(object):
@@ -647,7 +650,7 @@ def plot_relative_efficiency(axis):
 #                     labels=[
 #                         counter.label for counter in counter_group.counters])
 #
-#             plt.savefig(plot_pathname, bbox_inches="tight")
+#             plt.savefig(plot_pathname, bbox_inches="tight", transparent=True)
 #             plt.close(figure)
 
 
@@ -684,6 +687,8 @@ def postprocess_results(configuration_data):
         "performance_counter_1" in lue_dataset.benchmark.property_sets.names
     )
 
+    filetypes = ["pdf", "png", "svg"]
+
     if not performance_counters_available:
         process.create_dot_graph(
             lue_dataset.pathname,
@@ -693,9 +698,9 @@ def postprocess_results(configuration_data):
         )
 
     plot_pathname = experiment.result_pathname(
-        result_prefix, cluster.name, benchmark.scenario_name, "plot", "pdf"
+        result_prefix, cluster.name, benchmark.scenario_name, "plot"
     )
-    post_process_raw_results(lue_dataset, result_prefix, plot_pathname)
+    post_process_raw_results(lue_dataset, result_prefix, plot_pathname, filetypes)
 
     # TODO revamp
     # if performance_counters_available:
diff --git a/source/qa/python/qa/scalability/experiment/util.py b/source/quality_assurance/scalability/command/scalability/experiment/util.py
similarity index 95%
rename from source/qa/python/qa/scalability/experiment/util.py
rename to source/quality_assurance/scalability/command/scalability/experiment/util.py
index 23548bd41..4b9953672 100644
--- a/source/qa/python/qa/scalability/experiment/util.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/util.py
@@ -2,7 +2,7 @@
 
 import dateutil.parser
 
-from lue.qa.scalability.core import json
+from ..core import json
 
 
 def sort_benchmarks_by_time(result_prefix, cluster, benchmark, experiment):
diff --git a/source/qa/python/qa/scalability/experiment/weak_scalability/__init__.py b/source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/__init__.py
similarity index 100%
rename from source/qa/python/qa/scalability/experiment/weak_scalability/__init__.py
rename to source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/__init__.py
diff --git a/source/qa/python/qa/scalability/experiment/partition_shape/configuration.py b/source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/configuration.py
similarity index 80%
rename from source/qa/python/qa/scalability/experiment/partition_shape/configuration.py
rename to source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/configuration.py
index 321692d0b..e019058bf 100644
--- a/source/qa/python/qa/scalability/experiment/partition_shape/configuration.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/configuration.py
@@ -1,5 +1,4 @@
-from lue.qa.scalability.core import json_to_data
-
+from ...core import json_to_data
 from .. import configuration
 from . import experiment
 
@@ -12,4 +11,5 @@ def __init__(self, data):
     def from_json(self, data):
         experiment_data = json_to_data(data["experiment"])
         experiment_data["command_pathname"] = self.command_pathname
+        experiment_data["command_arguments"] = self.command_arguments
         self.experiment = experiment.Experiment(experiment_data)
diff --git a/source/qa/python/qa/scalability/experiment/weak_scalability/experiment.py b/source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/experiment.py
similarity index 100%
rename from source/qa/python/qa/scalability/experiment/weak_scalability/experiment.py
rename to source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/experiment.py
diff --git a/source/qa/python/qa/scalability/experiment/weak_scalability/generate_script.py b/source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/generate_script.py
similarity index 94%
rename from source/qa/python/qa/scalability/experiment/weak_scalability/generate_script.py
rename to source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/generate_script.py
index bdf1fb2a1..870582df9 100644
--- a/source/qa/python/qa/scalability/experiment/weak_scalability/generate_script.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/generate_script.py
@@ -55,8 +55,7 @@ def generate_script_slurm_threads(
 
         job_steps += [
             # Run the benchmark, resulting in a json file
-            # "srun --ntasks {nr_tasks} {srun_configuration} {command_pathname} "
-            "mpirun --n {nr_tasks} {mpirun_configuration} {command_pathname} "
+            f"mpirun --n {nr_tasks} {mpirun_configuration} {experiment.command_pathname} {experiment.command_arguments} "
             # '--hpx:ini="hpx.parcel.mpi.enable=1" '
             # '--hpx:ini="hpx.os_threads={nr_threads}" '
             '--hpx:threads="{nr_threads}" '
@@ -65,7 +64,6 @@ def generate_script_slurm_threads(
                 nr_tasks=1,  # Single NUMA node or cluster node
                 mpirun_configuration=job.mpirun_configuration(cluster),
                 # srun_configuration=job.srun_configuration(cluster),
-                command_pathname=experiment.command_pathname,
                 nr_threads=nr_threads,
                 # thread_binding=util.thread_binding(nr_threads),
                 program_configuration=job.program_configuration(
@@ -127,7 +125,7 @@ def generate_script_slurm_threads(
     ]
 
     job.write_script(commands, script_pathname)
-    print("bash ./{}".format(script_pathname))
+    print("bash {}".format(script_pathname))
 
 
 def generate_script_slurm_numa_nodes(
@@ -156,8 +154,7 @@ def generate_script_slurm_numa_nodes(
 
         job_steps += [
             # Run the benchmark, resulting in a json file
-            # "srun --ntasks {nr_tasks} {srun_configuration} {command_pathname} "
-            "mpirun --n {nr_tasks} {mpirun_configuration} {command_pathname} "
+            f"mpirun --n {nr_tasks} {mpirun_configuration} {experiment.command_pathname} {experiment.command_arguments} "
             # '--hpx:ini="hpx.parcel.mpi.enable=1" '
             # '--hpx:ini="hpx.os_threads={nr_threads}" '
             '--hpx:threads="{nr_threads}" '
@@ -166,7 +163,6 @@ def generate_script_slurm_numa_nodes(
                 nr_tasks=nr_localities,
                 mpirun_configuration=job.mpirun_configuration(cluster),
                 # srun_configuration=job.srun_configuration(cluster),
-                command_pathname=experiment.command_pathname,
                 nr_threads=nr_threads,
                 # thread_binding=util.thread_binding(nr_threads),
                 program_configuration=job.program_configuration(
@@ -228,7 +224,7 @@ def generate_script_slurm_numa_nodes(
     ]
 
     job.write_script(commands, script_pathname)
-    print("bash ./{}".format(script_pathname))
+    print("bash {}".format(script_pathname))
 
 
 def generate_script_slurm_cluster_nodes(
@@ -269,8 +265,7 @@ def generate_script_slurm_cluster_nodes(
 
         job_steps = [
             # Run the benchmark, resulting in a json file
-            # "srun --ntasks {nr_tasks} {srun_configuration} {command_pathname} "
-            "mpirun --n {nr_tasks} {mpirun_configuration} {command_pathname} "
+            f"mpirun --n {nr_tasks} {mpirun_configuration} {experiment.command_pathname} {experiment.command_arguments} "
             # '--hpx:ini="hpx.parcel.mpi.enable=1" '
             # '--hpx:ini="hpx.os_threads={nr_threads}" '
             '--hpx:threads="{nr_threads}" '
@@ -279,7 +274,6 @@ def generate_script_slurm_cluster_nodes(
                 nr_tasks=nr_localities,
                 mpirun_configuration=job.mpirun_configuration(cluster),
                 # srun_configuration=job.srun_configuration(cluster),
-                command_pathname=experiment.command_pathname,
                 nr_threads=nr_threads,
                 # thread_binding=util.thread_binding(nr_threads),
                 program_configuration=job.program_configuration(
@@ -340,7 +334,7 @@ def generate_script_slurm_cluster_nodes(
         ]
 
     job.write_script(commands, script_pathname)
-    print("bash ./{}".format(script_pathname))
+    print("bash {}".format(script_pathname))
 
 
 def generate_script_slurm(
@@ -389,12 +383,11 @@ def generate_script_shell(
             # Create directory for the resulting json file
             "mkdir -p {}".format(os.path.dirname(result_pathname)),
             # Run the benchmark, resulting in a json file
-            "{command_pathname} "
+            f"{experiment.command_pathname} {experiment.command_arguments} "
             # '--hpx:ini="hpx.os_threads={nr_threads}" '
             '--hpx:threads="{nr_threads}" '
             # '--hpx:bind="{thread_binding}" '
             "{program_configuration}".format(
-                command_pathname=experiment.command_pathname,
                 nr_threads=nr_threads,
                 # thread_binding=util.thread_binding(nr_threads),
                 program_configuration=job.program_configuration(
@@ -410,7 +403,7 @@ def generate_script_shell(
         ]
 
     job.write_script(commands, script_pathname)
-    print("bash ./{}".format(script_pathname))
+    print("bash {}".format(script_pathname))
 
 
 def generate_script(configuration_data):
diff --git a/source/qa/python/qa/scalability/experiment/weak_scalability/import_results.py b/source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/import_results.py
similarity index 97%
rename from source/qa/python/qa/scalability/experiment/weak_scalability/import_results.py
rename to source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/import_results.py
index 11b914ed4..df4ae1ebf 100644
--- a/source/qa/python/qa/scalability/experiment/weak_scalability/import_results.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/import_results.py
@@ -6,8 +6,8 @@
 import numpy as np
 
 import lue.data_model as ldm
-from lue.qa.scalability.core import process
 
+from ...core import process
 from .. import dataset, job, util
 from .configuration import Configuration
 from .experiment import Experiment
@@ -49,6 +49,13 @@ def benchmark_meta_to_lue_json(
                                     "datatype": "string",
                                     "value": [experiment.command_pathname],
                                 },
+                                {
+                                    "name": "arguments",
+                                    "shape_per_object": "same_shape",
+                                    "value_variability": "constant",
+                                    "datatype": "string",
+                                    "value": [experiment.command_arguments],
+                                },
                                 {
                                     "name": "kind",
                                     "shape_per_object": "same_shape",
diff --git a/source/qa/python/qa/scalability/experiment/weak_scalability/postprocess_results.py b/source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/postprocess_results.py
similarity index 96%
rename from source/qa/python/qa/scalability/experiment/weak_scalability/postprocess_results.py
rename to source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/postprocess_results.py
index 744f8ddb1..407af3fd0 100644
--- a/source/qa/python/qa/scalability/experiment/weak_scalability/postprocess_results.py
+++ b/source/quality_assurance/scalability/command/scalability/experiment/weak_scalability/postprocess_results.py
@@ -3,14 +3,14 @@
 import numpy as np
 
 import lue.data_model as ldm
-from lue.qa.scalability.core import math, plot, process
 
+from ...core import math, plot, process
 from .. import dataset, job
 from .configuration import Configuration
 from .experiment import Experiment
 
 
-def post_process_raw_results(lue_dataset, result_prefix, plot_pathname):
+def post_process_raw_results(lue_dataset, result_prefix, plot_pathname, filetypes):
     """
     Create plots and tables from raw benchmark results
     """
@@ -197,7 +197,7 @@ def plot_relative_efficiency(axis):
     # plot_lups(axes[1][0])
     # axes[1, 1].axis("off")
 
-    figure.legend(labels=["serial", "linear", "actual"])
+    figure.legend(labels=["serial", "linear", "actual"], framealpha=0.0)
 
     name = lue_meta_information.name.value[:][0]
     system_name = lue_meta_information.system_name.value[:][0]
@@ -217,7 +217,10 @@ def plot_relative_efficiency(axis):
         )
     )
 
-    plt.savefig(plot_pathname, bbox_inches="tight")
+    for filetype in filetypes:
+        plt.savefig(
+            f"{plot_pathname}.{filetype}", bbox_inches="tight", transparent=True
+        )
 
 
 def postprocess_results(configuration_data):
@@ -239,6 +242,8 @@ def postprocess_results(configuration_data):
         lue_dataset, Experiment
     )
 
+    filetypes = ["pdf", "png", "svg"]
+
     process.create_dot_graph(
         lue_dataset.pathname,
         experiment.result_pathname(
@@ -247,7 +252,7 @@ def postprocess_results(configuration_data):
     )
 
     plot_pathname = experiment.result_pathname(
-        result_prefix, cluster.name, benchmark.scenario_name, "plot", "pdf"
+        result_prefix, cluster.name, benchmark.scenario_name, "plot"
     )
 
-    post_process_raw_results(lue_dataset, result_prefix, plot_pathname)
+    post_process_raw_results(lue_dataset, result_prefix, plot_pathname, filetypes)
diff --git a/source/qa/python/qa/scalability/experiment/worker.py b/source/quality_assurance/scalability/command/scalability/experiment/worker.py
similarity index 100%
rename from source/qa/python/qa/scalability/experiment/worker.py
rename to source/quality_assurance/scalability/command/scalability/experiment/worker.py
diff --git a/source/quality_assurance/scalability/doc/index.md b/source/quality_assurance/scalability/doc/index.md
new file mode 100644
index 000000000..07437b5c1
--- /dev/null
+++ b/source/quality_assurance/scalability/doc/index.md
@@ -0,0 +1,4 @@
+(source-lue-qa-scalability)=
+
+This directory contains code related to the lue_scalability.py command. The package is not useful in another
+context, yet. The command is useful for performing scalability experiments.
diff --git a/source/quality_assurance/scalability/script/CMakeLists.txt b/source/quality_assurance/scalability/script/CMakeLists.txt
new file mode 100644
index 000000000..27ce859f5
--- /dev/null
+++ b/source/quality_assurance/scalability/script/CMakeLists.txt
@@ -0,0 +1,15 @@
+set(names
+    array_shape
+    scalability
+)
+
+foreach(name ${names})
+    file(GENERATE
+        OUTPUT ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/$<$<BOOL:${LUE_GENERATOR_IS_MULTI_CONFIG}>:$<CONFIG>>/lue_${name}.py
+        INPUT lue_${name}.py
+    )
+
+    lue_install_programs(TARGETS
+        ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/$<$<BOOL:${LUE_GENERATOR_IS_MULTI_CONFIG}>:$<CONFIG>>/lue_${name}.py
+    )
+endforeach()
diff --git a/source/qa/script/benchmark_to_lue_json.py b/source/quality_assurance/scalability/script/benchmark_to_lue_json.py
similarity index 100%
rename from source/qa/script/benchmark_to_lue_json.py
rename to source/quality_assurance/scalability/script/benchmark_to_lue_json.py
diff --git a/source/qa/script/create_raster.py b/source/quality_assurance/scalability/script/create_raster.py
similarity index 100%
rename from source/qa/script/create_raster.py
rename to source/quality_assurance/scalability/script/create_raster.py
diff --git a/source/qa/script/export_benchmark_results.py b/source/quality_assurance/scalability/script/export_benchmark_results.py
similarity index 100%
rename from source/qa/script/export_benchmark_results.py
rename to source/quality_assurance/scalability/script/export_benchmark_results.py
diff --git a/source/quality_assurance/scalability/script/lue_array_shape.py b/source/quality_assurance/scalability/script/lue_array_shape.py
new file mode 100755
index 000000000..81245b17e
--- /dev/null
+++ b/source/quality_assurance/scalability/script/lue_array_shape.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+"""
+Wrapper for the array_shape command-line utility
+"""
+import sys
+
+from lue.command.scalability.cli.array_shape import main
+
+
+sys.exit(main())
diff --git a/source/quality_assurance/scalability/script/lue_scalability.py b/source/quality_assurance/scalability/script/lue_scalability.py
new file mode 100755
index 000000000..251787eae
--- /dev/null
+++ b/source/quality_assurance/scalability/script/lue_scalability.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+"""
+Wrapper for the scalability command-line utility
+"""
+import sys
+
+from lue.command.scalability.cli.scalability import main
+
+
+sys.exit(main())
diff --git a/source/qa/script/post_process_benchmarks.py b/source/quality_assurance/scalability/script/post_process_benchmarks.py
similarity index 100%
rename from source/qa/script/post_process_benchmarks.py
rename to source/quality_assurance/scalability/script/post_process_benchmarks.py
diff --git a/source/shared/include/lue/configure.hpp.in b/source/shared/include/lue/configure.hpp.in
index e205358fb..c598e46a0 100644
--- a/source/shared/include/lue/configure.hpp.in
+++ b/source/shared/include/lue/configure.hpp.in
@@ -10,9 +10,9 @@
 
 #cmakedefine01 LUE_VALIDATE_IDXS
 #cmakedefine01 LUE_ASSERT_CONDITIONS
-#cmakedefine LUE_BUILD_QA
-#cmakedefine LUE_QA_WITH_PYTHON_API
-#cmakedefine LUE_QA_WITH_TESTS
+#cmakedefine LUE_BUILD_QUALITY_ASSURANCE
+#cmakedefine LUE_QUALITY_ASSURANCE_WITH_PYTHON_API
+#cmakedefine LUE_QUALITY_ASSURANCE_WITH_TESTS
 
 
 namespace lue {
@@ -35,7 +35,7 @@ namespace lue {
             static constexpr bool assert_conditions{LUE_ASSERT_CONDITIONS};
 
             static constexpr bool build_qa{
-#ifdef LUE_BUILD_QA
+#ifdef LUE_BUILD_QUALITY_ASSURANCE
                 true
 #else
                 false
@@ -43,7 +43,7 @@ namespace lue {
             };
 
             static constexpr bool qa_with_tests{
-#ifdef LUE_QA_WITH_TESTS
+#ifdef LUE_QUALITY_ASSURANCE_WITH_TESTS
                 true
 #else
                 false


Test patch:
diff --git a/environment/conda/run_test.py b/environment/conda/run_test.py
index 86e910b52..3075d8c4f 100644
--- a/environment/conda/run_test.py
+++ b/environment/conda/run_test.py
@@ -2,7 +2,7 @@
 import lue.data_model as ldm
 import lue.framework as lfr
 import lue.pcraster as lpr
-import lue.qa.scalability as lqs
+import lue.qa.scalability.instrument as lqi
 
 
 print("lue version: {}".format(lue.lue_version))
@@ -11,4 +11,4 @@
 
 assert ldm.SpaceDomain
 assert lfr.log
-assert lqs.perform_experiment_task
+assert lqi.ArrayExperiment
diff --git a/source/framework/algorithm/test/CMakeLists.txt b/source/framework/algorithm/test/CMakeLists.txt
index 528b136ae..2dd20c698 100644
--- a/source/framework/algorithm/test/CMakeLists.txt
+++ b/source/framework/algorithm/test/CMakeLists.txt
@@ -146,10 +146,10 @@ foreach(name ${names})
     add_test(NAME ${test_name}
         COMMAND
             ${Python_EXECUTABLE} ${HPXRUN}
-                "--runwrapper" ${LUE_QA_TEST_HPX_RUNWRAPPER}
-                "--parcelport" ${LUE_QA_TEST_HPX_PARCELPORT}
-                "--localities" ${LUE_QA_TEST_NR_LOCALITIES_PER_TEST}
-                "--thread" ${LUE_QA_TEST_NR_THREADS_PER_LOCALITY} --
+                "--runwrapper" ${LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER}
+                "--parcelport" ${LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT}
+                "--localities" ${LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST}
+                "--thread" ${LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY} --
                     "$<TARGET_FILE:${test_name}>"
     )
 
diff --git a/source/framework/api/c/test/CMakeLists.txt b/source/framework/api/c/test/CMakeLists.txt
index c0834976d..f033321c9 100644
--- a/source/framework/api/c/test/CMakeLists.txt
+++ b/source/framework/api/c/test/CMakeLists.txt
@@ -22,10 +22,10 @@ foreach(name ${names})
     add_test(NAME ${test_name}
         COMMAND
             ${Python_EXECUTABLE} ${HPXRUN}
-                "--runwrapper" ${LUE_QA_TEST_HPX_RUNWRAPPER}
-                "--parcelport" ${LUE_QA_TEST_HPX_PARCELPORT}
-                "--localities" ${LUE_QA_TEST_NR_LOCALITIES_PER_TEST}
-                "--thread" ${LUE_QA_TEST_NR_THREADS_PER_LOCALITY} --
+                "--runwrapper" ${LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER}
+                "--parcelport" ${LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT}
+                "--localities" ${LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST}
+                "--thread" ${LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY} --
                     "$<TARGET_FILE:${test_name}>"
     )
 
diff --git a/source/framework/api/cxx/test/CMakeLists.txt b/source/framework/api/cxx/test/CMakeLists.txt
index 33023f638..6cd6a88f3 100644
--- a/source/framework/api/cxx/test/CMakeLists.txt
+++ b/source/framework/api/cxx/test/CMakeLists.txt
@@ -31,10 +31,10 @@ foreach(name ${names})
     add_test(NAME ${test_name}
         COMMAND
             ${Python_EXECUTABLE} ${HPXRUN}
-                "--runwrapper" ${LUE_QA_TEST_HPX_RUNWRAPPER}
-                "--parcelport" ${LUE_QA_TEST_HPX_PARCELPORT}
-                "--localities" ${LUE_QA_TEST_NR_LOCALITIES_PER_TEST}
-                "--thread" ${LUE_QA_TEST_NR_THREADS_PER_LOCALITY} --
+                "--runwrapper" ${LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER}
+                "--parcelport" ${LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT}
+                "--localities" ${LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST}
+                "--thread" ${LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY} --
                     "$<TARGET_FILE:${test_name}>"
     )
 
diff --git a/source/framework/api/python/test/CMakeLists.txt b/source/framework/api/python/test/CMakeLists.txt
index 5177cca79..5a4fd5d33 100644
--- a/source/framework/api/python/test/CMakeLists.txt
+++ b/source/framework/api/python/test/CMakeLists.txt
@@ -2,10 +2,10 @@ add_test(
     NAME lue_framework_api_python_test
     COMMAND
         ${Python_EXECUTABLE} ${HPXRUN}
-            "--runwrapper" ${LUE_QA_TEST_HPX_RUNWRAPPER}
-            "--parcelport" ${LUE_QA_TEST_HPX_PARCELPORT}
-            "--localities" ${LUE_QA_TEST_NR_LOCALITIES_PER_TEST}
-            "--thread" ${LUE_QA_TEST_NR_THREADS_PER_LOCALITY} --
+            "--runwrapper" ${LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER}
+            "--parcelport" ${LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT}
+            "--localities" ${LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST}
+            "--thread" ${LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY} --
                 ${Python_EXECUTABLE}
                     -m lue_unit_test discover
                     --verbose
diff --git a/source/framework/image_land/python/test/CMakeLists.txt b/source/framework/image_land/python/test/CMakeLists.txt
index b5993eaf6..be2d00d59 100644
--- a/source/framework/image_land/python/test/CMakeLists.txt
+++ b/source/framework/image_land/python/test/CMakeLists.txt
@@ -2,10 +2,10 @@ add_test(
     NAME lue_py_image_land_python_test
     COMMAND
         ${Python_EXECUTABLE} ${HPXRUN}
-            "--runwrapper" ${LUE_QA_TEST_HPX_RUNWRAPPER}
-            "--parcelport" ${LUE_QA_TEST_HPX_PARCELPORT}
-            "--localities" ${LUE_QA_TEST_NR_LOCALITIES_PER_TEST}
-            "--thread" ${LUE_QA_TEST_NR_THREADS_PER_LOCALITY} --
+            "--runwrapper" ${LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER}
+            "--parcelport" ${LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT}
+            "--localities" ${LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST}
+            "--thread" ${LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY} --
                 ${Python_EXECUTABLE}
                     -m lue_unit_test discover
                     --verbose
diff --git a/source/framework/image_land/test/CMakeLists.txt b/source/framework/image_land/test/CMakeLists.txt
index 22df9d0a3..1c9414394 100644
--- a/source/framework/image_land/test/CMakeLists.txt
+++ b/source/framework/image_land/test/CMakeLists.txt
@@ -22,10 +22,10 @@ foreach(name ${names})
     add_test(NAME ${test_name}
         COMMAND
             ${Python_EXECUTABLE} ${HPXRUN}
-                "--runwrapper" ${LUE_QA_TEST_HPX_RUNWRAPPER}
-                "--parcelport" ${LUE_QA_TEST_HPX_PARCELPORT}
-                "--localities" ${LUE_QA_TEST_NR_LOCALITIES_PER_TEST}
-                "--thread" ${LUE_QA_TEST_NR_THREADS_PER_LOCALITY} --
+                "--runwrapper" ${LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER}
+                "--parcelport" ${LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT}
+                "--localities" ${LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST}
+                "--thread" ${LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY} --
                     "$<TARGET_FILE:${test_name}>"
     )
 
diff --git a/source/framework/io/test/CMakeLists.txt b/source/framework/io/test/CMakeLists.txt
index 6f4c567e0..9d889c730 100644
--- a/source/framework/io/test/CMakeLists.txt
+++ b/source/framework/io/test/CMakeLists.txt
@@ -21,10 +21,10 @@ foreach(name ${names})
     add_test(NAME ${test_name}
         COMMAND
             ${Python_EXECUTABLE} ${HPXRUN}
-                "--runwrapper" ${LUE_QA_TEST_HPX_RUNWRAPPER}
-                "--parcelport" ${LUE_QA_TEST_HPX_PARCELPORT}
-                "--localities" ${LUE_QA_TEST_NR_LOCALITIES_PER_TEST}
-                "--thread" ${LUE_QA_TEST_NR_THREADS_PER_LOCALITY} --
+                "--runwrapper" ${LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER}
+                "--parcelport" ${LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT}
+                "--localities" ${LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST}
+                "--thread" ${LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY} --
                     "$<TARGET_FILE:${test_name}>"
     )
 
diff --git a/source/framework/model/test/CMakeLists.txt b/source/framework/model/test/CMakeLists.txt
index 953ae7781..1ea8d2f8d 100644
--- a/source/framework/model/test/CMakeLists.txt
+++ b/source/framework/model/test/CMakeLists.txt
@@ -50,10 +50,10 @@ foreach(name ${names})
     add_test(NAME ${test_name}
         COMMAND
             ${Python_EXECUTABLE} ${HPXRUN}
-                "--runwrapper" ${LUE_QA_TEST_HPX_RUNWRAPPER}
-                "--parcelport" ${LUE_QA_TEST_HPX_PARCELPORT}
-                "--localities" ${LUE_QA_TEST_NR_LOCALITIES_PER_TEST}
-                "--thread" ${LUE_QA_TEST_NR_THREADS_PER_LOCALITY} --
+                "--runwrapper" ${LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER}
+                "--parcelport" ${LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT}
+                "--localities" ${LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST}
+                "--thread" ${LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY} --
                     "$<TARGET_FILE:${test_name}>"
     )
 
diff --git a/source/framework/partitioned_array/test/CMakeLists.txt b/source/framework/partitioned_array/test/CMakeLists.txt
index 808495c71..e6bc92a3b 100644
--- a/source/framework/partitioned_array/test/CMakeLists.txt
+++ b/source/framework/partitioned_array/test/CMakeLists.txt
@@ -46,10 +46,10 @@ foreach(name ${names})
     add_test(NAME ${test_name}
         COMMAND
             ${Python_EXECUTABLE} ${HPXRUN}
-                "--runwrapper" ${LUE_QA_TEST_HPX_RUNWRAPPER}
-                "--parcelport" ${LUE_QA_TEST_HPX_PARCELPORT}
-                "--localities" ${LUE_QA_TEST_NR_LOCALITIES_PER_TEST}
-                "--thread" ${LUE_QA_TEST_NR_THREADS_PER_LOCALITY} --
+                "--runwrapper" ${LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER}
+                "--parcelport" ${LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT}
+                "--localities" ${LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST}
+                "--thread" ${LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY} --
                     "$<TARGET_FILE:${test_name}>"
     )
 
diff --git a/source/framework/partitioned_route/test/CMakeLists.txt b/source/framework/partitioned_route/test/CMakeLists.txt
index 66df478ee..aceeb00a4 100644
--- a/source/framework/partitioned_route/test/CMakeLists.txt
+++ b/source/framework/partitioned_route/test/CMakeLists.txt
@@ -46,10 +46,10 @@ foreach(name ${names})
     add_test(NAME ${test_name}
         COMMAND
             ${Python_EXECUTABLE} ${HPXRUN}
-                "--runwrapper" ${LUE_QA_TEST_HPX_RUNWRAPPER}
-                "--parcelport" ${LUE_QA_TEST_HPX_PARCELPORT}
-                "--localities" ${LUE_QA_TEST_NR_LOCALITIES_PER_TEST}
-                "--thread" ${LUE_QA_TEST_NR_THREADS_PER_LOCALITY} --
+                "--runwrapper" ${LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER}
+                "--parcelport" ${LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT}
+                "--localities" ${LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST}
+                "--thread" ${LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY} --
                     "$<TARGET_FILE:${test_name}>"
     )
 
diff --git a/source/framework/python/test/CMakeLists.txt b/source/framework/python/test/CMakeLists.txt
index 35df27a5a..95504944e 100644
--- a/source/framework/python/test/CMakeLists.txt
+++ b/source/framework/python/test/CMakeLists.txt
@@ -2,10 +2,10 @@ add_test(
     NAME lue_py_framework_python_test
     COMMAND
         ${Python_EXECUTABLE} ${HPXRUN}
-            "--runwrapper" ${LUE_QA_TEST_HPX_RUNWRAPPER}
-            "--parcelport" ${LUE_QA_TEST_HPX_PARCELPORT}
-            "--localities" ${LUE_QA_TEST_NR_LOCALITIES_PER_TEST}
-            "--thread" ${LUE_QA_TEST_NR_THREADS_PER_LOCALITY} --
+            "--runwrapper" ${LUE_QUALITY_ASSURANCE_TEST_HPX_RUNWRAPPER}
+            "--parcelport" ${LUE_QUALITY_ASSURANCE_TEST_HPX_PARCELPORT}
+            "--localities" ${LUE_QUALITY_ASSURANCE_TEST_NR_LOCALITIES_PER_TEST}
+            "--thread" ${LUE_QUALITY_ASSURANCE_TEST_NR_THREADS_PER_LOCALITY} --
                 ${Python_EXECUTABLE}
                     -m lue_unit_test discover
                     --verbose
diff --git a/source/qa/python/test/CMakeLists.txt b/source/qa/python/test/CMakeLists.txt
deleted file mode 100644
index 464090415..000000000
--- a/source/qa/python/test/CMakeLists.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-# TODO
diff --git a/source/qa/python/test/run_unit_tests.sh b/source/qa/python/test/run_unit_tests.sh
deleted file mode 100755
index fbd5eb04d..000000000
--- a/source/qa/python/test/run_unit_tests.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env bash
-
-python -m unittest discover \
-    --start-directory $LUE/benchmark/test \
-    --pattern "*_test.py"
diff --git a/source/quality_assurance/cxx/test/CMakeLists.txt b/source/quality_assurance/cxx/test/CMakeLists.txt
new file mode 100644
index 000000000..d17b3cbd5
--- /dev/null
+++ b/source/quality_assurance/cxx/test/CMakeLists.txt
@@ -0,0 +1,16 @@
+set(names
+    scalability/array_experiment
+    scalability/experiment
+    scalability/run
+    scalability/stopwatch
+)
+
+add_unit_tests(
+    SCOPE lue_qa
+    NAMES ${names}
+    LIBRARIES
+        lue::qa
+        lue::shared
+    TARGETS
+        test_names
+)
diff --git a/source/quality_assurance/cxx/test/scalability/array_experiment_test.cpp b/source/quality_assurance/cxx/test/scalability/array_experiment_test.cpp
new file mode 100644
index 000000000..68d25f8a7
--- /dev/null
+++ b/source/quality_assurance/cxx/test/scalability/array_experiment_test.cpp
@@ -0,0 +1,35 @@
+#define BOOST_TEST_MODULE lue qa scalability instrument array_experiment
+#include "lue/qa/scalability/instrument/array_experiment.hpp"
+#include "lue/stream.hpp"
+#include <boost/test/included/unit_test.hpp>
+
+
+BOOST_AUTO_TEST_CASE(use_case_01)
+{
+    lue::qa::Count const nr_workers{5};
+    lue::qa::Shape const array_shape{60, 40};
+    lue::qa::Shape const partition_shape{10, 10};
+    lue::qa::ArrayExperiment array_experiment{nr_workers, array_shape, partition_shape};
+
+    BOOST_CHECK_EQUAL(array_experiment.nr_workers(), nr_workers);
+    BOOST_CHECK_EQUAL(array_experiment.array_shape(), array_shape);
+    BOOST_CHECK_EQUAL(array_experiment.partition_shape(), partition_shape);
+
+    array_experiment.start();
+
+    lue::qa::Count const nr_runs{3};
+
+    for (lue::qa::Count run_idx = 0; run_idx < nr_runs; ++run_idx)
+    {
+        lue::qa::Run run{};
+
+        run.start();
+        run.stop();
+
+        array_experiment.add(run);
+    }
+
+    array_experiment.stop();
+
+    BOOST_CHECK_EQUAL(std::size(array_experiment.runs()), nr_runs);
+}
diff --git a/source/quality_assurance/cxx/test/scalability/experiment_test.cpp b/source/quality_assurance/cxx/test/scalability/experiment_test.cpp
new file mode 100644
index 000000000..ef7025961
--- /dev/null
+++ b/source/quality_assurance/cxx/test/scalability/experiment_test.cpp
@@ -0,0 +1,31 @@
+#define BOOST_TEST_MODULE lue qa scalability instrument experiment
+#include "lue/qa/scalability/instrument/experiment.hpp"
+#include "lue/stream.hpp"
+#include <boost/test/included/unit_test.hpp>
+
+
+BOOST_AUTO_TEST_CASE(use_case_01)
+{
+    lue::qa::Count const nr_workers{5};
+    lue::qa::Experiment experiment{nr_workers};
+
+    BOOST_CHECK_EQUAL(experiment.nr_workers(), nr_workers);
+
+    experiment.start();
+
+    lue::qa::Count const nr_runs{3};
+
+    for (lue::qa::Count run_idx = 0; run_idx < nr_runs; ++run_idx)
+    {
+        lue::qa::Run run{};
+
+        run.start();
+        run.stop();
+
+        experiment.add(run);
+    }
+
+    experiment.stop();
+
+    BOOST_CHECK_EQUAL(std::size(experiment.runs()), nr_runs);
+}
diff --git a/source/quality_assurance/cxx/test/scalability/run_test.cpp b/source/quality_assurance/cxx/test/scalability/run_test.cpp
new file mode 100644
index 000000000..e9547a762
--- /dev/null
+++ b/source/quality_assurance/cxx/test/scalability/run_test.cpp
@@ -0,0 +1,17 @@
+#define BOOST_TEST_MODULE lue qa scalability instrument run
+#include "lue/qa/scalability/instrument/run.hpp"
+#include <boost/test/included/unit_test.hpp>
+
+
+BOOST_AUTO_TEST_CASE(use_case_01)
+{
+    lue::qa::Run run{};
+    run.start();
+    run.stop();
+
+    using namespace std::chrono_literals;
+
+    // Casting to bool because some compilers still don't support streaming chrono durations...
+    BOOST_TEST(static_cast<bool>(run.duration<std::chrono::nanoseconds>() > std::chrono::nanoseconds(0ns)));
+    BOOST_TEST(static_cast<bool>(run.duration<std::chrono::seconds>() == std::chrono::seconds(0s)));
+}
diff --git a/source/quality_assurance/cxx/test/scalability/stopwatch_test.cpp b/source/quality_assurance/cxx/test/scalability/stopwatch_test.cpp
new file mode 100644
index 000000000..8e8977cc7
--- /dev/null
+++ b/source/quality_assurance/cxx/test/scalability/stopwatch_test.cpp
@@ -0,0 +1,18 @@
+#define BOOST_TEST_MODULE lue qa scalability instrument stopwatch
+#include "lue/qa/scalability/instrument/stopwatch.hpp"
+#include <boost/test/included/unit_test.hpp>
+
+
+BOOST_AUTO_TEST_CASE(use_case_01)
+{
+    lue::qa::Stopwatch stopwatch{};
+    stopwatch.start();
+    stopwatch.stop();
+
+    using namespace std::chrono_literals;
+
+    // Casting to bool because some compilers still don't support streaming chrono durations...
+    BOOST_TEST(
+        static_cast<bool>(stopwatch.duration<std::chrono::nanoseconds>() > std::chrono::nanoseconds(0ns)));
+    BOOST_TEST(static_cast<bool>(stopwatch.duration<std::chrono::seconds>() == std::chrono::seconds(0s)));
+}
diff --git a/source/quality_assurance/python/test/CMakeLists.txt b/source/quality_assurance/python/test/CMakeLists.txt
new file mode 100644
index 000000000..02012986a
--- /dev/null
+++ b/source/quality_assurance/python/test/CMakeLists.txt
@@ -0,0 +1,30 @@
+add_test(
+    NAME lue_py_qa_python_test
+    COMMAND ${Python_EXECUTABLE}
+        -m unittest discover
+        --verbose
+        --start-directory ${CMAKE_CURRENT_SOURCE_DIR}
+        --pattern "*_test.py"
+)
+
+set_property(
+    TEST
+        lue_py_qa_python_test
+    APPEND
+    PROPERTY
+        # Add the path to our Python modules to PYTHONPATH.
+        ENVIRONMENT_MODIFICATION
+            PYTHONPATH=path_list_prepend:$<TARGET_FILE_DIR:lue::py>/..
+            # This should not be necessary, but copying in all shared libs we depend on skips a few
+            PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:hdf5::hdf5>/../bin>
+            PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
+)
+
+set_property(
+    TEST
+        lue_py_qa_python_test
+    APPEND
+    PROPERTY
+        FIXTURES_REQUIRED
+            lue_py_test_fixture
+)
diff --git a/source/qa/cxx/test/CMakeLists.txt b/source/quality_assurance/python/test/lue_qa_test/__init__.py
similarity index 100%
rename from source/qa/cxx/test/CMakeLists.txt
rename to source/quality_assurance/python/test/lue_qa_test/__init__.py
diff --git a/source/quality_assurance/python/test/lue_qa_test/scalability/__init__.py b/source/quality_assurance/python/test/lue_qa_test/scalability/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/source/quality_assurance/python/test/lue_qa_test/scalability/instrument/__init__.py b/source/quality_assurance/python/test/lue_qa_test/scalability/instrument/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/source/quality_assurance/python/test/lue_qa_test/scalability/instrument/array_experiment_test.py b/source/quality_assurance/python/test/lue_qa_test/scalability/instrument/array_experiment_test.py
new file mode 100644
index 000000000..04db87cb0
--- /dev/null
+++ b/source/quality_assurance/python/test/lue_qa_test/scalability/instrument/array_experiment_test.py
@@ -0,0 +1,19 @@
+import unittest
+
+import lue.qa.scalability.instrument as lqi
+
+
+class ArrayExperimentTest(unittest.TestCase):
+    def test_use_case_01(self):
+
+        nr_workers = 5
+        array_shape = (60, 40)
+        partition_shape = (10, 10)
+        experiment = lqi.ArrayExperiment(nr_workers, array_shape, partition_shape)
+
+        self.assertEqual(experiment.nr_workers, nr_workers)
+        self.assertEqual(experiment.array_shape, array_shape)
+        self.assertEqual(experiment.partition_shape, partition_shape)
+
+        experiment.start()
+        experiment.stop()
diff --git a/source/quality_assurance/python/test/lue_qa_test/scalability/instrument/experiment_test.py b/source/quality_assurance/python/test/lue_qa_test/scalability/instrument/experiment_test.py
new file mode 100644
index 000000000..02ec4a35f
--- /dev/null
+++ b/source/quality_assurance/python/test/lue_qa_test/scalability/instrument/experiment_test.py
@@ -0,0 +1,15 @@
+import unittest
+
+import lue.qa.scalability.instrument as lqi
+
+
+class ExperimentTest(unittest.TestCase):
+    def test_use_case_01(self):
+
+        nr_workers = 5
+        experiment = lqi.Experiment(nr_workers)
+
+        self.assertEqual(experiment.nr_workers, nr_workers)
+
+        experiment.start()
+        experiment.stop()
diff --git a/source/quality_assurance/python/test/lue_qa_test/scalability/instrument/run_test.py b/source/quality_assurance/python/test/lue_qa_test/scalability/instrument/run_test.py
new file mode 100644
index 000000000..872b8b13c
--- /dev/null
+++ b/source/quality_assurance/python/test/lue_qa_test/scalability/instrument/run_test.py
@@ -0,0 +1,12 @@
+import unittest
+
+import lue.qa.scalability.instrument as lqi
+
+
+class RunTest(unittest.TestCase):
+    def test_use_case_01(self):
+
+        run = lqi.Run()
+
+        run.start()
+        run.stop()
diff --git a/source/quality_assurance/scalability/test/CMakeLists.txt b/source/quality_assurance/scalability/test/CMakeLists.txt
new file mode 100644
index 000000000..518e7a5db
--- /dev/null
+++ b/source/quality_assurance/scalability/test/CMakeLists.txt
@@ -0,0 +1,30 @@
+add_test(
+    NAME lue_qa_command_test
+    COMMAND ${Python_EXECUTABLE}
+        -m unittest discover
+        --verbose
+        --start-directory ${CMAKE_CURRENT_SOURCE_DIR}
+        --pattern "*_test.py"
+)
+
+set_property(
+    TEST
+        lue_qa_command_test
+    APPEND
+    PROPERTY
+        # Add the path to our Python modules to PYTHONPATH.
+        ENVIRONMENT_MODIFICATION
+            PYTHONPATH=path_list_prepend:$<TARGET_FILE_DIR:lue::py>/..
+            # # This should not be necessary, but copying in all shared libs we depend on skips a few
+            # PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:hdf5::hdf5>/../bin>
+            # PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
+)
+
+set_property(
+    TEST
+        lue_qa_command_test
+    APPEND
+    PROPERTY
+        FIXTURES_REQUIRED
+            lue_py_test_fixture
+)
diff --git a/source/qa/python/test/array_shape_test.py b/source/quality_assurance/scalability/test/array_shape_test.py
similarity index 90%
rename from source/qa/python/test/array_shape_test.py
rename to source/quality_assurance/scalability/test/array_shape_test.py
index fda26eacf..b0da07da2 100644
--- a/source/qa/python/test/array_shape_test.py
+++ b/source/quality_assurance/scalability/test/array_shape_test.py
@@ -1,11 +1,6 @@
-import os.path
-import sys
-
-
-sys.path = [os.path.join(os.path.split(__file__)[0], "..")] + sys.path
 import unittest
 
-from lue.benchmark import *
+from lue.command.scalability.experiment.shape import array_shape
 
 
 class ArrayShapeTest(unittest.TestCase):
diff --git a/source/qa/python/test/partition_shape_test.py b/source/quality_assurance/scalability/test/partition_shape_test.py
similarity index 97%
rename from source/qa/python/test/partition_shape_test.py
rename to source/quality_assurance/scalability/test/partition_shape_test.py
index 8dcfeae31..51683713e 100644
--- a/source/qa/python/test/partition_shape_test.py
+++ b/source/quality_assurance/scalability/test/partition_shape_test.py
@@ -1,11 +1,12 @@
-import os.path
-import sys
-
-
-sys.path = [os.path.join(os.path.split(__file__)[0], "..")] + sys.path
 import unittest
 
-from lue.benchmark.shape import *
+from lue.command.scalability.experiment.shape import (
+    partition_shape_multipliers,
+    partition_shapes,
+    range_of_shapes,
+    ranges_of_partition_shape_multipliers,
+    shape_ranges,
+)
 
 
 class PartitionShapeTest(unittest.TestCase):
diff --git a/source/qa/python/test/pool_test.py b/source/quality_assurance/scalability/test/pool_test.py
similarity index 94%
rename from source/qa/python/test/pool_test.py
rename to source/quality_assurance/scalability/test/pool_test.py
index 586115b17..d380aca61 100644
--- a/source/qa/python/test/pool_test.py
+++ b/source/quality_assurance/scalability/test/pool_test.py
@@ -1,11 +1,6 @@
-import os.path
-import sys
-
-
-sys.path = [os.path.join(os.path.split(__file__)[0], "..")] + sys.path
 import unittest
 
-from lue.benchmark.pool import *
+from lue.command.scalability.experiment.pool import Pool
 
 
 class PoolTest(unittest.TestCase):