Outputs
The other half of the site: a place to publish results, data, and figures from
experiments run with the library. Each write-up links its run-dir — the config,
manifest.toml, CSVs, and figures — so a result is always traceable to the exact code
(git SHA), seeds, and package versions that produced it.
This page walks one real run end to end.
The study
Question: on the forage swarm task, how does reservoir wiring density (node.link_p),
swarm size (task.N), and whether agents can see conspecifics (env.conspecific_vision)
move performance and criticality? A one-at-a-time sweep answers it.
(a) The config
Source: configs/sweep_forage_criticality.toml
[sweep]id = "forage_criticality" # names the run-dir: sweeps/forage_criticality/mode = "one_at_a_time" # vary one axis at a time; Σ of axis lengthsseeds = [0, 1, 2, 3]max_rollouts = 80 # cost guard
[baseline] # the setup every axis perturbs aroundnode = "falandays_base"task = "forage"N = 80n_agents = 6ticks = 1200
[axes] # architecture / coupling surface only"node.link_p" = [0.05, 0.1, 0.2]"task.N" = [60, 100]"env.conspecific_vision" = [true, false]
[analytics]measures = ["sigma_mr", "susceptibility_node", "correlation_length", "spectral_radius", "liveness", "regime"]
[capture] # opt-in: record one representative cellgroup = "representative"gif = true
[capture.groups.representative]"node.link_p" = 0.1 # capture only the cell where link_p == 0.1(b) The command
Run from the repo root against the top-level project:
julia --project=. sweep/run.jl configs/sweep_forage_criticality.tomlIt first prints a cost preview — one_at_a_time: 2+3+2 = 7 cells x 4 seeds = 28 rollouts
— then writes each cell. Re-running with the same id resumes: cells with a DONE marker
are skipped, so the run is restartable.
(c) The run-dir that appears
Because the sweep is keyed on its id, everything lands under sweeps/forage_criticality/:
sweeps/forage_criticality/├── manifest.toml # git SHA, dirty flag, Julia + package versions,│ # host, seeds, resolved [baseline]/[axes]/[capture]├── config.resolved.toml # the fully-resolved config actually run├── results.csv # one row per cell: axis, value, *_mean/_std for│ # every measure, regime_mode, warnings, errors├── README.md # the headline callout (read this first)├── figures/│ ├── node.link_p.png # score / σ / liveness vs each knob, house palette│ ├── task.N.png # (+ a .png.csv sidecar with the plotted numbers)│ └── env.conspecific_vision.png└── cells/ ├── cell_001/ # every cell: DONE marker, manifest.toml, metrics.csv │ ├── DONE # (metrics.csv = one row per seed) │ ├── manifest.toml │ └── metrics.csv ├── … cell_002 … cell_007 … └── cell_004/ # the captured cell (node.link_p == 0.1) also gets: ├── representative.gif # a behaviour GIF (placeholder if no ├── criticality_timeseries.csv # Makie backend is loaded) └── null_test.csv(d) Reading the headline result
README.md is the summary. It restates the baseline and cost, then gives a callout per
axis — the best value found, whether the axis flagged a breakdown (a dead/liveness-failed
cell), and whether the regime flipped:
## Callouts- `env.conspecific_vision`: best `true` (score=0.6241); no breakdown flagged; no regime flip- `node.link_p`: best `0.2` (score=0.7017); liveness failed at 0.05; no regime flip- `task.N`: best `100` (score=0.7181); no breakdown flagged; no regime flip
Dead/liveness-failed cells flagged: 1 / 7.Cells with recorded errors: 0 / 7.The read: performance climbs with wiring density and swarm size, and the sparsest reservoir
(node.link_p = 0.05) tips into a dead/liveness-failed regime — the breakdown the sweep was
built to find. For the numbers behind a callout, open results.csv (aggregates across
seeds) or a cell’s metrics.csv (per seed); sigma_mr and spectral_radius are meant to
be read together, since homeostatic rate control can pin σ while still moves.
That whole tree — config, manifest, CSVs, figures, GIF — is what a published result links to, so anyone can trace the headline back to the code and seeds that made it.