Repository topology¶
MAMUT-routing (superproject, this repository)
├── MAMUT-routing-lib/ submodule kept for browsing/diffing; NOT the copy uv installs
├── MAMUT-routing-tools/ submodule and uv workspace member
│ └── MAMUT-routing-lib/ nested submodule: the lib uv installs ([tool.uv.sources])
├── benchmarks/
│ ├── VRPTW/{Sintef2008,Dimacs2021,Ortec2022}/ in-repo families
│ ├── TDVRPTW/Dabia2013/, TDVRP/Dabia2013/ in-repo default TD family
│ ├── TDVRPTW/<Family>/, TDVRP/<Family>/ satellite submodules (Ari2018, Vu2020, Rifki2020, Lera2026, Blauth2024)
│ ├── Poryos2026/, Mamut2026/ family-first collection satellites
├── osmdata/ git-ignored OSM extracts feeding route geometry
├── src/mamut_routing_publish/ the publisher
├── docs/ + mkdocs.yml this documentation
├── tests/ publisher tests (pytest also runs MAMUT-routing-lib/tests)
├── dist/ site output; on deployments a symlink to the live release
├── dist-release/ release archives + snapshot-manifest.json
└── publish-state/ history ledger + snapshot inventories, git-ignored, survives releases
Four repositories, one contract¶
| Repository | Owns | Published as |
|---|---|---|
MAMUT-routing-lib |
the contract: models, checkers, BKS logic, sidecars, remote archives, CVRPLIB export, mamut-routing CLI |
PyPI mamut-routing-lib |
MAMUT-routing-tools |
everything that computes: OSM, road graphs, generation, traffic models, converters, geometry, workbench GUI, mamut-tools CLI |
PyPI mamut-routing-tools |
MAMUT-routing |
the benchmark tree, the publisher, the website, the docs, the releases | GitHub releases (archives + manifest), the website |
mamut-routing-deploy (private) |
host provisioning, nginx and systemd templates, deploy.sh, the operations runbook of the production VM |
not published |
The lib is the only shared dependency. The tools pin a lib commit as their nested submodule and declare it as an
editable source; the superproject must resolve mamut-routing-lib from that same nested path, otherwise uv sees
two editable URLs for one package and refuses to resolve. That is why pyproject.toml here says:
[tool.uv.sources]
mamut-routing-lib = { path = "MAMUT-routing-tools/MAMUT-routing-lib", editable = true }
mamut-routing-tools = { workspace = true }
Keep the top-level MAMUT-routing-lib pointer on the same commit as the nested one (it exists so a browse or a
git diff from the superproject shows the lib; nothing imports it).
Satellites¶
A satellite is a self-contained repository (instances, BKS, sidecars, README.md, CHANGELOG.md, LICENSE) mounted
at its family directory. A plain clone leaves the directory empty; every tool, test and build must tolerate that,
and the documentation build does (family pages fall back to a GitHub link).
git submodule update --init benchmarks/TDVRPTW/Rifki2020 # one family (0.1–0.8 GB each)
git submodule update --init benchmarks/Poryos2026 # a collection (~0.4 GB)
git submodule update --init # everything (~2.8 GB)
Two layouts, both discovered by discover_benchmark_instances in the lib:
- classic:
benchmarks/<ProblemType>/<Family>/n=<N>/<instance>.vrp.json; - family-first collection:
benchmarks/<Family>/{CVRP,VRPTW,TDVRP,TDVRPTW}/...plusbenchmarks/<Family>/sidecars/, rooted bymamut-collection.json({"format": "mamut-collection", "format_version": 1, "family": "<Family>", "layout_version": 1}).
.gitmodules is the list of satellites; the README satellite table is the human copy.
The uv workspace¶
uv sync # publisher + dev + docs groups, editable lib and tools
uv run pytest # tests/ and MAMUT-routing-lib/tests
uv run --project MAMUT-routing-tools pytest
uv lock # after any dependency change; uv.lock is tracked
Environment variables that change where things are looked up are listed in the
reference; the two that matter daily are MAMUT_ROUTING_ROOT (repo root for
the CLIs when not run from the checkout) and MAMUT_BASEMAP_API_KEY.
Where the truth lives¶
| Question | Look at |
|---|---|
| Which families exist | BenchmarkName in mamut_routing_lib.enums and .gitmodules |
| What a family is, for the website and these docs | src/mamut_routing_publish/site_assets/texts/mamut-routing_benchmark_families.md |
| Data licenses | each family LICENSE (first line SPDX-License-Identifier: ...) and the root NOTICE |
| Why a decision was made | the owning module docstring, the Formats pages, the family README and changelog |
| How the production host is set up | mamut-routing-deploy/docs/OPERATIONS.md (private) |