diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0755346 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,104 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + package: + name: Julia ${{ matrix.julia-version }} / ${{ matrix.os }} + runs-on: ${{ matrix.os }} + timeout-minutes: 75 + strategy: + fail-fast: false + matrix: + os: [ubuntu-22.04, macos-14, windows-2022] + julia-version: ['1.10.11', '1'] + steps: + - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + - uses: julia-actions/setup-julia@fa02766e078afaaf09b14210362cee14137e6a32 # v3 + with: + version: ${{ matrix.julia-version }} + - uses: julia-actions/cache@a45e8fa8be21c18a06b7177052533149e61e9b38 # v3 + with: + delete-old-caches: false + - name: Instantiate the pinned environment + run: julia --project=. -e 'using Pkg; Pkg.instantiate(); Pkg.precompile()' + - uses: julia-actions/julia-runtest@6e050c8013b833b1195105ff2fce9cd802f53271 # v1 + with: + coverage: false + + compat-floor: + name: Manifest-free resolution / Julia 1.10.11 + runs-on: ubuntu-22.04 + timeout-minutes: 45 + steps: + - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + - uses: julia-actions/setup-julia@fa02766e078afaaf09b14210362cee14137e6a32 # v3 + with: + version: '1.10.11' + - uses: julia-actions/cache@a45e8fa8be21c18a06b7177052533149e61e9b38 # v3 + with: + delete-old-caches: false + - name: Resolve and test without the checked-in manifest + run: julia --project=. -e 'using Pkg; rm("Manifest.toml"; force=true); Pkg.instantiate(); Pkg.test()' + + tool-smoke: + name: Tool and template smoke tests + runs-on: ubuntu-22.04 + timeout-minutes: 45 + env: + BRAINLESSLAB_AUTOTHREADS: '0' + steps: + - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + - uses: julia-actions/setup-julia@fa02766e078afaaf09b14210362cee14137e6a32 # v3 + with: + version: '1.10.11' + - uses: julia-actions/cache@a45e8fa8be21c18a06b7177052533149e61e9b38 # v3 + with: + delete-old-caches: false + - name: Instantiate benchmark environment + run: julia --project=bench -e 'using Pkg; Pkg.instantiate()' + - name: Benchmark statistics and execution smoke + run: | + julia --project=bench bench/test_stats.jl + julia --project=bench -e 'include("bench/Benchmark.jl"); using .Benchmark; cfg = Benchmark.read_bench_config("bench/configs/smoke.toml"); out = Benchmark.run_benchmark(cfg; out_root=mktempdir()); @assert isfile(joinpath(out.dir, "summary.csv"))' + - name: Instantiate profile environment + run: julia --project=profile -e 'using Pkg; Pkg.instantiate()' + - name: Profile execution smoke + run: julia --project=profile -e 'include("profile/Profile.jl"); using .NodeProfile; out = NodeProfile.node_profile(:falandays; tasks=(:tracking,), n_seeds=1, canonical_N=Dict(:tracking => 12), gifs=false, out_root=mktempdir()); @assert isfile(out.metrics)' + - name: Sweep execution smoke + run: julia --project=. -e 'using BrainlessLab; out = run_sweep("configs/ci_sweep.toml"; root=mktempdir()); @assert isfile(out.results)' + - name: Unified plan and record smoke + run: | + julia --project=. bin/brainlesslab.jl check plans/examples/benchmark_core.toml + julia --project=. bin/brainlesslab.jl run plans/examples/profile_tracking.toml --root "${{ runner.temp }}/brainlesslab-records" + - name: Instantiate and execute project template + run: | + julia --project=examples/templates/new_project -e 'using Pkg; Pkg.develop(path=pwd()); Pkg.instantiate()' + julia --project=examples/templates/new_project examples/templates/new_project/run.jl --ticks 20 --n-nodes 12 --out "${{ runner.temp }}/brainlesslab-template-smoke" + julia --project=examples/templates/new_project examples/templates/new_project/run_plan.jl examples/templates/new_project/config.toml "${{ runner.temp }}/brainlesslab-template-records" + + documentation: + name: Locked documentation build + runs-on: ubuntu-22.04 + timeout-minutes: 20 + defaults: + run: + working-directory: site + steps: + - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 + with: + bun-version: 1.3.11 + - run: bun install --frozen-lockfile + - run: bun run build diff --git a/.gitignore b/.gitignore index 8794d02..35fbee3 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ examples/output/ /experiments/runs/ /experiments/results/homeostatic_needs_v2/ /bench/genomes/ -/bench/Manifest.toml /bench/output/ /examples/templates/new_project/output/ /examples/templates/new_project/Manifest.toml diff --git a/AGENTS.md b/AGENTS.md index 8e2a8d8..1ffba32 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,19 +16,19 @@ human-readable guide; update it when the public contract changes. ## Preserve the scientific boundary -- `:falandays` is the canonical fixture-validated baseline; `:falandays_base` remains a - compatibility alias. Do not change their shared behavior, fixtures, or fidelity language - to make another change pass. -- Everything outside that baseline is experimental unless evidence says otherwise. +- `:falandays` is the canonical node validated on declared reference trajectories. Do not + change its behaviour, fixtures, or validation language to make another change pass. +- Each other node, task, analysis, and component has its own declared stability and + readiness. Do not inherit the Falandays validation boundary. - A task score operationalizes performance on that task. It is not, by itself, evidence of cognition, general capability, biological fidelity, or external validity. - Use `task_outcome(sim)` for the task-declared outcome. Report its key, raw value, and - normalized value together; `nothing` means the task declares no scalar objective. Treat + normalised value together; `nothing` means the task declares no scalar objective. Treat other metric fields as diagnostics unless the task contract says otherwise. - Never present development seeds, tuned cells, representative runs, or exploratory plots as sealed evidence. - Do not inspect a sealed evaluation set to answer a planning or debugging question. -- Use the independent randomized block or trial as the inferential unit. Agents and ticks +- Use the independent randomised block or trial as the inferential unit. Agents and ticks within one world do not create additional independent samples. ## Work safely @@ -41,23 +41,24 @@ human-readable guide; update it when the public contract changes. 6. Use stable component and entity IDs; do not infer identity from tuple or vector position. 7. Use `apply_patch` for hand edits. Avoid destructive Git commands. 8. Run the narrowest relevant tests first, then the full package and site gates when the - public surface changes. + public interface changes. 9. Report what is verified, what is inferred, and what remains experimental. ## Keep software readiness separate from study evidence -- The canonical handbook lives under `site/src/content/docs/core/`; it documents stable - composition contracts. +- The public guide lives under `site/src/content/docs/`. Core pages document the main + composition and research interfaces. - Experimental capabilities are listed under `site/src/content/docs/experimental/` with repository-backed source, example, and test metadata. - `available` and `integrated` describe software readiness. They do not validate a biological interpretation, promote a study, or increase its evidence status. -- Experiment evidence (`exploratory`, `tuned`, `frozen`, `confirmed`, `promoted`, or - `retired`) belongs to the study record and is independent of component readiness. +- Experiment evidence (`planned`, `exploratory`, `tuned`, `frozen`, `confirmed`, + `promoted`, or `retired`) belongs to the versioned `ExperimentSpec` and its records. It + is independent of component readiness. ## Choose the narrowest extension -| Intent | Preferred seam | +| Intent | Preferred approach | | --- | --- | | Change parameters of an existing reservoir | config or registered preset | | Add a genuinely different neural substrate | `Reservoir` methods plus node registration | @@ -81,12 +82,16 @@ Use the evidence ladder in `site/src/content/docs/core/design-study.mdx`: conformance → calibration → exploration → tuning/training → variance pilot → frozen protocol → sealed confirmation → robustness → promoted evidence. -For causal comparisons, share randomized worlds within a paired block while giving distinct +For causal comparisons, share randomised worlds within a paired block while giving distinct mechanisms their declared streams. Keep training, selection, variance-pilot, confirmation, and robustness seeds disjoint. The null must match the claim: random action, blind input, shifted or sham input, an ablation, a baseline model, and an oracle answer different questions. +Use an `ExperimentSpec` when a study needs a stable question, version, named conditions, +limitations, and one or more operations. Keep these bundles under `experiments/`. Do not +revive the archived bespoke experiment runner or add another operation-specific schema. + ## Verification For Julia changes: @@ -96,7 +101,7 @@ julia --project=. -e 'using Pkg; Pkg.test()' ``` Also run focused contract tests while iterating. For hot paths, warm the call before checking -inference or allocations. Fixture parity is a separate gate from behavioral performance. +inference or allocations. Fixture parity is a separate gate from behavioural performance. For site changes: @@ -111,7 +116,7 @@ For public changes, also check: - `Test.detect_ambiguities(BrainlessLab; recursive=true)` has no new ambiguity; - examples referenced by docs execute; - no absolute local paths or retired study references remain; -- README, site, examples, and both skills use the same vocabulary. +- README, site, examples, and both skills use the same vocabulary; - canonical Core routes and Experimental feature metadata resolve. ## Documentation standard @@ -129,3 +134,6 @@ guide should say: Do not describe planned automation as implemented. Keep current limits visible and link to `site/src/content/docs/platform-limits.mdx`. + +Follow `docs/WRITING.md`: use British English, stable technical terms, soft-STE sentence +control, and minimal decorative emphasis. diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..176ad45 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,23 @@ +# Changelog + +## 0.2.0 — 2026-07-22 + +BrainlessLab 0.2.0 is an experimental research preview and the first typed research-platform release. + +- Add typed node, task, composition, evaluation, operation, and experiment contracts. +- Add one version-one TOML plan schema for profile, sweep, ablate, evolve, and benchmark. +- Add portable research records with raw CSV data, seed ledgers, checksums, statistics, + resolved provenance, and generated HTML reports. +- Add four experimental Plank CartPole profiles while keeping Tracking and Pong as the + core qualification benchmark. +- Add checked-in operation plans, a unified CLI, and an external-project template. +- Align package and citation metadata on version 0.2.0. +- Add reproducible package, compatibility-floor, tool-smoke, and documentation CI. +- Add package-quality checks without weakening numerical conformance or calibration tests. +- Clarify repository installation and the pre-1.0 stability boundary. + +## 0.1.0 — 2026-07-04 + +The public tag named `v0.1.0` was created from code whose `Project.toml` still reported +version `0.0.1`. That historical tag remains immutable; 0.2.0 is the first release in +which the package and citation versions are aligned. diff --git a/CITATION.cff b/CITATION.cff index a9d0628..e95b6fe 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,12 +1,13 @@ cff-version: 1.2.0 message: >- If you use BrainlessLab, please cite this software, and also cite the - original Falandays et al. work that the :falandays_base model reimplements. + original Falandays et al. work on which the :falandays model is based. title: BrainlessLab.jl abstract: >- - An extensible Julia lab for "brainless" cognition — behaviour that emerges - from collectives of simple neuron-like nodes — built around an authors-faithful - reimplementation of the Falandays et al. homeostatic spiking reservoir. + An experimental Julia research platform for behaviour that emerges from + collectives of simple neuron-like nodes, built around a Falandays et al. + homeostatic spiking reservoir that is validated on declared reference + trajectories. type: software authors: - given-names: Polyphony @@ -17,8 +18,8 @@ authors: family-names: Jackson - given-names: William family-names: O'Hearn -version: 0.0.1 -date-released: "2026-07-04" +version: 0.2.0 +date-released: "2026-07-22" license: MIT repository-code: "https://github.com/btgaskin/brainless-lab" url: "https://brainless-lab.pages.dev" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a45039f..951dd9e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ You do not need to know Julia before contributing. You can begin by running an e simulation, improving a task description, checking an example, or working with a coding agent. The repository contains guidance for both humans and agents. -Start with the online [Getting started](https://brainless-lab.pages.dev/getting-started/) +Start with the online [Getting started](https://brainless-lab.pages.dev/core/getting-started/) guide. If you are using an agent, point it at `AGENTS.md`; that file tells it which repository skills and safeguards to follow. @@ -20,12 +20,13 @@ repository skills and safeguards to follow. - **Add a body component:** extend the narrow physical interface and add strict config materialization, an example, and conformance evidence. - **Add a metric or analysis:** declare its input channels, unit of analysis, diagnostics, - valid null, failure behavior, and scientific limitations. -- **Add an experiment:** use only public BrainlessLab APIs and follow the evidence ladder in - the [Research workflow](https://brainless-lab.pages.dev/research-workflow/). + valid null, failure behaviour, and scientific limitations. +- **Add an experiment:** compose named conditions and typed operations in an + `ExperimentSpec`, then follow the evidence ladder in + [Design a study](https://brainless-lab.pages.dev/core/design-study/). -The [Extending](https://brainless-lab.pages.dev/extending/) page maps every public family to -its contract, example, and required tests. +[Extend the lab](https://brainless-lab.pages.dev/core/extend/) maps each public interface to +its example and required tests. ## Local setup @@ -49,12 +50,12 @@ The first run compiles the package and can be slower than later runs. ## Change discipline 1. Create a branch or isolated worktree. -2. Reproduce the current behavior before editing. +2. Reproduce the current behaviour before editing. 3. Add or update the narrow contract test. 4. Implement through public dispatch boundaries. 5. Run focused tests, then the full applicable gates. 6. Update the canonical site page and executable example. -7. Keep exploratory output out of the evidence surface. +7. Keep exploratory output out of promoted research records. Do not modify fidelity fixtures, committed evidence, or a sealed protocol merely to make a new implementation agree with an expectation. If a scientific expectation changes, explain @@ -75,7 +76,7 @@ bun run build ``` The relevant change should also have a focused test. New hot-loop code should be checked -after warmup for inference and avoidable allocations. New stochastic behavior needs reset, +after warm-up for inference and avoidable allocations. New stochastic behaviour needs reset, replay, stream-ownership, and iteration-order tests. ## Pull-request handoff @@ -89,4 +90,4 @@ State: - the evidence status of scientific outputs; - current limitations and follow-up work. -Keep implementation conformance, behavioral observations, and scientific claims separate. +Keep implementation conformance, behavioural observations, and scientific claims separate. diff --git a/Manifest.toml b/Manifest.toml index d275535..344d9a9 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -1,53 +1,38 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.12.6" +julia_version = "1.10.11" manifest_format = "2.0" -project_hash = "e5f54b75d015108e62f7964a038c6db733ff2e1f" +project_hash = "87b14d94a68c5779ce8674f9ac9e3d6afa6ee0c6" [[deps.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.2" +version = "1.1.1" [[deps.Artifacts]] uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" -version = "1.11.0" [[deps.Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" -version = "1.11.0" - -[[deps.BrainlessLab]] -deps = ["Dates", "JLD2", "LinearAlgebra", "Random", "StaticArrays", "Statistics", "TOML"] -path = "." -uuid = "d12add44-1e3e-4161-9a99-c2121a2f0f38" -version = "0.0.1" - - [deps.BrainlessLab.extensions] - BrainlessLabMakieExt = "Makie" - - [deps.BrainlessLab.weakdeps] - Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.3.0+1" +version = "1.1.1+0" [[deps.Dates]] deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" -version = "1.11.0" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.7.0" +version = "1.6.0" [[deps.FileIO]] deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "8e9c059d6857607253e837730dbf780b6b151acd" +git-tree-sha1 = "6621fef488e496356c9c9625d0562c12a6070819" uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.19.0" +version = "1.20.0" [deps.FileIO.extensions] HTTPExt = "HTTP" @@ -57,13 +42,16 @@ version = "1.19.0" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" -version = "1.11.0" [[deps.HashArrayMappedTries]] git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" version = "0.2.0" +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + [[deps.JLD2]] deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "ScopedValues", "TranscodingStreams"] git-tree-sha1 = "d97791feefda45729613fafeccc4fbef3f539151" @@ -76,48 +64,39 @@ version = "0.5.15" [deps.JLD2.weakdeps] UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" -[[deps.JuliaSyntaxHighlighting]] -deps = ["StyledStrings"] -uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" -version = "1.12.0" - [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" version = "0.6.4" [[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.15.0+0" +version = "8.4.0+0" [[deps.LibGit2]] -deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" -version = "1.11.0" [[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.9.0+0" +version = "1.6.4+0" [[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "OpenSSL_jll"] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.3+1" +version = "1.11.0+1" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" -version = "1.11.0" [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.12.0" [[deps.Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" -version = "1.11.0" [[deps.MacroTools]] git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" @@ -125,31 +104,29 @@ uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" version = "0.5.16" [[deps.Markdown]] -deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] +deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" -version = "1.11.0" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.1010+0" [[deps.Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" -version = "1.11.0" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2025.11.4" +version = "2025.12.2" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.3.0" +version = "1.2.0" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.29+0" - -[[deps.OpenSSL_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.4+0" +version = "0.3.23+5" [[deps.OrderedCollections]] git-tree-sha1 = "94ba93778373a53bfd5a0caaf7d809c445292ff4" @@ -157,21 +134,15 @@ uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.8.2" [[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.12.1" - - [deps.Pkg.extensions] - REPLExt = "REPL" - - [deps.Pkg.weakdeps] - REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.10.0" [[deps.PrecompileTools]] deps = ["Preferences"] -git-tree-sha1 = "edbeefc7a4889f528644251bdb5fc9ab5348bc2c" +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.3.4" +version = "1.2.1" [[deps.Preferences]] deps = ["TOML"] @@ -182,12 +153,14 @@ version = "1.5.2" [[deps.Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" -version = "1.11.0" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" [[deps.Random]] deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" -version = "1.11.0" [[deps.Requires]] deps = ["UUIDs"] @@ -205,6 +178,17 @@ git-tree-sha1 = "67a144433c4ce877ee6d1ada69a124d6b1ecf7be" uuid = "7e506255-f358-4e82-b7e4-beb19740aa63" version = "1.6.2" +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" + [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] git-tree-sha1 = "246a8bb2e6667f832eea063c3a56aef96429a3db" @@ -225,20 +209,14 @@ uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" version = "1.4.4" [[deps.Statistics]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +deps = ["LinearAlgebra", "SparseArrays"] uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.11.1" - - [deps.Statistics.extensions] - SparseArraysExt = ["SparseArrays"] - - [deps.Statistics.weakdeps] - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" -[[deps.StyledStrings]] -uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" -version = "1.11.0" +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.2.1+1" [[deps.TOML]] deps = ["Dates"] @@ -258,28 +236,26 @@ version = "0.11.3" [[deps.UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" -version = "1.11.0" [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" -version = "1.11.0" [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.3.1+2" +version = "1.2.13+1" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.15.0+0" +version = "5.11.0+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.64.0+1" +version = "1.52.0+1" [[deps.p7zip_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +deps = ["Artifacts", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.7.0+0" +version = "17.6.1+0" diff --git a/Project.toml b/Project.toml index 0433b4b..a4a4e56 100644 --- a/Project.toml +++ b/Project.toml @@ -1,13 +1,14 @@ name = "BrainlessLab" uuid = "d12add44-1e3e-4161-9a99-c2121a2f0f38" authors = ["btgaskin "] -version = "0.0.1" +version = "0.2.0" [deps] Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +SHA = "ea8e919c-243c-51af-8825-aaa63cd721ce" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" @@ -19,18 +20,27 @@ Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" BrainlessLabMakieExt = "Makie" [compat] +Aqua = "0.8" CairoMakie = "0.12, 0.13, 0.14, 0.15" +Dates = "1.10" JLD2 = "0.5" +LinearAlgebra = "1.10" Makie = "0.21, 0.22, 0.23, 0.24" NPZ = "0.4" +Random = "1.10" +SHA = "0.7" StaticArrays = "1" +Statistics = "1.10" +TOML = "1" +Test = "1.10" julia = "1.10" [extras] +Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" NPZ = "15e1cf62-19b3-5cfa-8e77-841668bca605" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["CairoMakie", "Makie", "NPZ", "Test"] +test = ["Aqua", "CairoMakie", "Makie", "NPZ", "Test"] diff --git a/README.md b/README.md index 44f0339..78873ce 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,34 @@ # BrainlessLab.jl +[![CI](https://github.com/btgaskin/brainless-lab/actions/workflows/ci.yml/badge.svg)](https://github.com/btgaskin/brainless-lab/actions/workflows/ci.yml) +

BrainlessLab

Behaviour from collectives of simple neuron-like nodes.
- Core handbook + Getting started · - Experimental catalog + Operations and records · - Diverse Intelligences Summer Institute 2026 + Experimental capabilities

-BrainlessLab is an extensible Julia lab for neural reservoirs in closed sensorimotor -loops. It provides tasks, generic embodiment, single-agent and population worlds, -recording, analysis, batch tools, and evidence-aware experiment workflows. +BrainlessLab is an experimental Julia platform for studying neural reservoirs in closed +sensorimotor loops. It separates four concerns: + +- a node type and its registered parameters; +- a body, task, and interaction cycle; +- an evaluation protocol over independent trials; +- a research operation that writes a portable record. -The canonical baseline is `node=:falandays`: an authors-faithful implementation of the -tested Falandays homeostatic spiking reservoir. It adapts neural activity online and has no -trained readout. Other reservoirs, embodiment components, physical worlds, analyses, and -studies are experimental unless their documentation states a narrower validated boundary. +The canonical `:falandays` node is validated against declared reference trajectories. +That validation covers the tested construction and update path. It does not establish +behavioural equivalence across every task or validate a biological interpretation. -## Quickstart +## Quick start -Install Julia, clone the repository, and use the pinned project: +BrainlessLab is not yet registered in Julia General. Clone the repository and use its +project environment: ```bash git clone https://github.com/btgaskin/brainless-lab.git @@ -30,94 +36,107 @@ cd brainless-lab julia --project=. -e 'using Pkg; Pkg.instantiate()' ``` -Run the canonical reservoir on tracking: +Run one diagnostic simulation: ```bash julia --project=. -e 'using BrainlessLab; sim = simulate(:tracking; node=:falandays, ticks=1000, seed=11); println(task_outcome(sim))' ``` -`task_outcome(sim)` returns the task-declared outcome key, raw value, and value normalized -between that task's anchors. It returns `nothing` for a task with no scalar objective. -Scores are task-specific. Do not compare a tracking score directly with a Pong or forage -score. +`task_outcome(sim)` returns the task's outcome key, raw value, and normalised value. It +returns `nothing` when the task declares no scalar outcome. Scores remain task-specific, +even after normalisation. -Continue with: +The public guide starts with: 1. [Getting started](https://brainless-lab.pages.dev/core/getting-started/) 2. [Core task tour](https://brainless-lab.pages.dev/core/task-tour/) 3. [Architecture](https://brainless-lab.pages.dev/core/architecture/) 4. [Design a study](https://brainless-lab.pages.dev/core/design-study/) -## Core composition +## Compose a run, then choose an operation ```text -NodeModel → Reservoir → AbstractBody → Agent → Ensemble{Environment} - ↓ - Task - ↓ - Runner → Run - ↘ - Recorder +NodeSpec + TaskSpec + body + InteractionCycle + → CompositionSpec + +CompositionSpec + EvaluationSpec + → EvaluationTarget + +EvaluationTarget(s) + operation settings + → ProfilePlan | SweepPlan | AblationPlan | EvolutionPlan | BenchmarkPlan + → versioned record + +named conditions + operation plans + → ExperimentSpec +``` + +`simulate` is the convenient path for one in-memory run. A `CompositionSpec` records the +same runtime choices explicitly and is the preferred input for reusable work. + +For repeated work, validate and run a plan: + +```bash +julia --project=. bin/brainlesslab.jl check plans/examples/profile_tracking.toml +julia -t auto --project=. bin/brainlesslab.jl run \ + plans/examples/profile_tracking.toml --root records ``` -`AbstractBody` is the public body boundary. `Embodiment` is the generic concrete -composition of geometry, sensors, encoders, actuators, dynamics, optional physiology, -stable ports, and runtime state. An `Ensemble` of one and an ensemble of many use the same -synchronous lifecycle. +Each operation writes its request, resolved settings, seed ledger, CSV tables, summary, +checksums, and HTML report. `ExperimentSpec` groups named conditions and ordinary +operation plans into a versioned scientific protocol. It does not add another runner. + +The five operations answer different questions: + +- `ProfilePlan` describes one composition and its recorded dynamics. +- `SweepPlan` maps declared parameter values on development trials. +- `AblationPlan` compares registered interventions with a paired baseline. +- `EvolutionPlan` selects node parameters on one target, then evaluates the champion on + declared held-out targets. +- `BenchmarkPlan` compares conditions within each task under paired evaluation blocks. -`ObjectWorld` demonstrates composition of physical components, objects, fields, spectral -appearance, and typed effects. It is not a calibrated benchmark. The established tracking -and Pong tasks are the first core task contracts. +See [Operations and records](https://brainless-lab.pages.dev/core/operations-records/) and +[Runs and results](https://brainless-lab.pages.dev/core/runs-results/). -## Discover the live surface +## Discover registered parts ```julia using BrainlessLab -variants() -tasks() -analyses() -ablations() +nodes(DEFAULT_REGISTRY) +tasks(DEFAULT_REGISTRY) +tasks(DEFAULT_REGISTRY; tag=:benchmark) +analyses(DEFAULT_REGISTRY) +ablations(DEFAULT_REGISTRY) +compositions(DEFAULT_REGISTRY) components() readiness() ``` -Use these registries instead of copying a static symbol list. - -## Execution surfaces - -- `simulate` runs one closed loop and returns an in-memory `SimResult`. -- `sweep/run.jl` runs bounded, resumable development sweeps. -- `experiments/run.jl` runs declared multi-condition protocols. -- `calibration/`, `profile/`, `bench/`, and evolution tools serve specialized questions. - -Start with the smallest tool that can answer the question. A selected sweep cell is a -development result, not a confirmed optimum. Agents and ticks in one world do not increase -the number of independent experimental units. - -See [Tools and artifacts](https://brainless-lab.pages.dev/core/tools-artifacts/) and -[Runs, recording, and results](https://brainless-lab.pages.dev/core/runs-results/). +The registry supports discovery and configuration by name. Julia methods and direct +composition remain the extension mechanism. ## Extend the lab -Public extension uses Julia generics and optional registries. Prefer composition and -multiple dispatch to model-name branches. Import every package generic that receives a new -method. +Start from `examples/templates/new_project/` when adding a node, vector task, or analysis. +Start from `examples/embodiments/` when composing a physical body and `ObjectWorld`. -Copy-ready starting points: +Keep node dynamics independent of task names. Derive receptor and effector widths from the +body ports. Register parameters explicitly so sweeps and evolution do not infer a genome +from runtime fields. -- `examples/templates/new_project/` for a node, vector task, and metric; -- `examples/embodiments/` for strict embodiment TOML and `ObjectWorld` composition. - -Read [Extend the lab](https://brainless-lab.pages.dev/core/extend/) before adding a public +Read [Extend the lab](https://brainless-lab.pages.dev/core/extend/) and +[Interface contracts](https://brainless-lab.pages.dev/contracts/) before adding a public part. -## Agent-assisted use +## Scientific limits + +Tracking and Pong form the initial core benchmark. The four Plank CartPole levels are +experimental challenge tasks. Wall and ecological tasks remain available for exploratory +work but are not part of the core benchmark. -The repository includes `AGENTS.md` plus BrainlessLab and Julia skills. A compatible coding -agent can discover the public surface, run existing tools, explain outputs, and implement -bounded changes. The researcher still owns the question, risk boundary, interpretation, -and decision to promote evidence. +A score can reveal a capacity, limit, or trade-off. It does not, by itself, establish +cognition, general competence, biological fidelity, or external validity. Keep +development, selection, and held-out evaluation seeds separate. ## Development @@ -128,8 +147,8 @@ bun install bun run build ``` -The compute core has no Makie dependency. Load `CairoMakie` in a downstream or tool project -for saved figures and animations. Load `GLMakie` for an interactive window. +The compute package has no Makie dependency. Use a downstream or tool environment with +`CairoMakie` for saved figures and `GLMakie` for interactive windows. See [CONTRIBUTING.md](CONTRIBUTING.md), [CITATION.cff](CITATION.cff), and the -[MIT license](LICENSE). +[MIT licence](LICENSE). diff --git a/archive/2026-07-legacy-research/README.md b/archive/2026-07-legacy-research/README.md new file mode 100644 index 0000000..028c591 --- /dev/null +++ b/archive/2026-07-legacy-research/README.md @@ -0,0 +1,16 @@ +# Legacy research archive + +This directory preserves material retired from the public BrainlessLab guide in July +2026. The source snapshot was commit `f4e417f`. + +The archive contains: + +- literature notes that previously appeared on the public site; +- study pages and their public media; +- compatibility pages from the earlier site structure; +- the bespoke experiment runner, protocols, results, and figure scripts; +- the previous site writing assessment. + +These files describe older research and documentation paths. They are not part of the +current site, package tests, or supported research workflow. Use the current typed plans, +`ExperimentSpec` manifests, and research records for new work. diff --git a/site/ASD-STE100-ASSESSMENT.md b/archive/2026-07-legacy-research/documentation/ASD-STE100-ASSESSMENT.md similarity index 100% rename from site/ASD-STE100-ASSESSMENT.md rename to archive/2026-07-legacy-research/documentation/ASD-STE100-ASSESSMENT.md diff --git a/archive/2026-07-legacy-research/experiments/README.md b/archive/2026-07-legacy-research/experiments/README.md new file mode 100644 index 0000000..3326778 --- /dev/null +++ b/archive/2026-07-legacy-research/experiments/README.md @@ -0,0 +1,125 @@ +# experiments/ + +The multi-run protocol surface. It complements one-run simulation, task calibration, +profiling, sweeps, ablations, benchmarks, and evolution; see the site's Tooling page for the +capability map. `experiments/run.jl` uses the **root project**. + +It holds composed, reproducible experiment protocols that are **not part of the +core library** — core stays lean (the settled Falandays baseline, the validated +per-run measures). This is for studies that combine those parts in a specific way +we want to run *regularly and replicably*, without promoting each one into core. + +> Note: `run_experiment` is a **core** name (`src/run/Artifacts.jl` — run one +> `RunConfig` and write reproducible artifacts). This tool deliberately does not +> reuse it; experiments are invoked as `experiments/run.jl `. + +Rule of thumb: a question answered by **one measure over one run** belongs in the +analysis registry. A **protocol over many runs** (sweep a schedule, contrast +conditions, detect a knee) that isn't general enough to be a core CLI tool belongs +here. + +## Run by name + +Experiments are registered by symbol — the same pattern core uses for +nodes/tasks/analyses — but the registry lives here, not in core. One entrypoint: + +```bash +julia --project=. experiments/run.jl --list # discover +julia --project=. experiments/run.jl freeze_onset # run with defaults +julia --project=. experiments/run.jl freeze_onset seeds=0:9 tasks=tracking,pong window=600 +julia -t 4 --project=. experiments/run.jl shoal_vision_sweep # 44-run exploratory pilot +julia -t 4 --project=. experiments/run.jl shoal_sensitivity_screen # 70-run OFAT screen +``` + +`key=val` values parse as Int (`600`), Float (`0.5`), range (`0:9`), comma-list +(`tracking,pong` → Symbols; `1,2,4,8` → Ints), else a Symbol. Each run writes +`experiments/runs//_/` with `results.json` + `manifest.txt` +(node, tasks, ticks, seeds, git SHA, timestamp). That is a traceable exploratory run, not +an exact-reproduction or promoted-evidence guarantee. + +## Layout + +``` +experiments/ + run.jl # CLI entrypoint: registers all experiments, dispatches by name + registry.jl # ExpRegistry — register/resolve/list experiments by symbol + harness.jl # ExpHarness — reusable building blocks (public-API only) + freeze_onset.jl # experiment (:freeze_onset) + tracking_param_sweep.jl # experiment (:tracking_param_sweep) + tracking_leak_lrate_factorial.jl # experiment (:tracking_leak_lrate_factorial) + shoal_vision_sweep.jl # experiment (:shoal_vision_sweep) + shoal_vision_sweep/protocol.toml # full, pilot, and operating-point sensitivity profiles + figures/ # CairoMakie figure scripts (own env; read a run's results.json) + runs/ # scratch/exploratory outputs (git-ignored) + results/ # curated evidence bundles, committed & traceable to a study/figure +``` + +**Data retention.** Exploratory runs land in the git-ignored `runs/`. Committing a directory +under `results/` makes it reviewable; it does not by itself promote the scientific result. +Large raw data may live in an external archive, but the immutable URI and checksum belong in +the committed bundle. + +## Evidence states and promotion + +Every study page declares `exploratory`, `tuned`, `frozen`, `confirmed`, `promoted`, or +`retired`. `frozen` is a fixed protocol whose sealed outcomes remain unopened; `confirmed` +means the frozen protocol has been executed on those blocks. +Development outputs, selected winners, and representative runs remain exploratory unless a +frozen protocol is evaluated on untouched randomized blocks. + +A promoted bundle requires: + +- frozen protocol and analysis plan; +- resolved config and selected parameters; +- full git SHA plus dirty-worktree status; +- Julia version and Project/Manifest hashes; +- named seed ledger with disjoint-stage and overlap checks; +- per-block results and declared paired contrasts; +- inferential unit, exclusions, and dead/failed-run policy; +- analysis-code version or hash; +- schema-versioned summary JSON; +- figure inputs and representative-selection rule; +- checksums for every promoted artifact; +- immutable external-archive URI and hash when raw data is not committed. + +Do not hardcode numerical prose from a scratch run. Site figures and claims should read from +the promoted summary. Opening sealed data and then changing a parameter, endpoint, exclusion, +or analysis restarts the evidence cycle. + +`harness.jl` composes only the **public** `BrainlessLab` API (`simulate`, +`task_outcome`, …), so experiments survive core refactors: + +- `freeze_sweep(task; freeze_ticks, window, seeds, verb)` — normalized score + rate + vs. the tick an intervention is applied, with a matched full-learning control. +- `onset_tick(freeze_ticks, fz_mean)` — the knee of a score-vs-tick curve (a + sweep-level readout, deliberately *not* a `register_analysis!`, which is per-run). +- `run_dir` / `write_text` / `git_sha` / `stamp` — a traceable run directory. + +## Adding an experiment + +1. Write `experiments/.jl` that defines `run_(; kwargs...)::String` + (does the work, writes a run dir via `run_dir`, returns its path) and registers + it: `register_experiment!(:, run_; description="…")`. +2. Add `include(joinpath(@__DIR__, ".jl"))` to `run.jl`. + +Keep it public-API-only; reaching into `BrainlessLab` internals is a signal the +piece wants to be a registered analysis or a core feature instead. + +Before adding a protocol, follow the site's Research workflow: calibrate the task, choose +controls that match the claim, separate development and confirmation seeds, name the +independent block, and plan power prospectively from a fresh variance pilot. + +Natural next studies on this seam: +- **What sets the onset tick** — sweep `freeze_tick × lrate_targ|threshold_mult` + and read `onset_tick` as a function of the homeostatic rate. +- **Which plasticity carries the load** — `freeze_sweep(...; verb=:clamp_target)` + (targets only) vs `:freeze_plasticity` (weights + targets). + +## Physical composition + +New ecological experiments that need independently composed physical cameras, +field probes, actuators, dynamics, and physiology should start from the public +`ObjectWorld` surface. The copy-ready examples under `examples/embodiments/` +show both levels: `object_world_quickstart.jl` exposes the live `Ensemble` and +`Recorder`, while `object_world_task.jl` adds a `TaskSpec` and returns the +standardized `SimResult`. diff --git a/experiments/figures/Project.toml b/archive/2026-07-legacy-research/experiments/figures/Project.toml similarity index 100% rename from experiments/figures/Project.toml rename to archive/2026-07-legacy-research/experiments/figures/Project.toml diff --git a/experiments/figures/shoal_sensitivity_screen.jl b/archive/2026-07-legacy-research/experiments/figures/shoal_sensitivity_screen.jl similarity index 100% rename from experiments/figures/shoal_sensitivity_screen.jl rename to archive/2026-07-legacy-research/experiments/figures/shoal_sensitivity_screen.jl diff --git a/experiments/figures/shoal_vision_sweep.jl b/archive/2026-07-legacy-research/experiments/figures/shoal_vision_sweep.jl similarity index 100% rename from experiments/figures/shoal_vision_sweep.jl rename to archive/2026-07-legacy-research/experiments/figures/shoal_vision_sweep.jl diff --git a/experiments/figures/tracking_figures.jl b/archive/2026-07-legacy-research/experiments/figures/tracking_figures.jl similarity index 100% rename from experiments/figures/tracking_figures.jl rename to archive/2026-07-legacy-research/experiments/figures/tracking_figures.jl diff --git a/experiments/freeze_onset.jl b/archive/2026-07-legacy-research/experiments/freeze_onset.jl similarity index 98% rename from experiments/freeze_onset.jl rename to archive/2026-07-legacy-research/experiments/freeze_onset.jl index 73ece17..aa283b5 100644 --- a/experiments/freeze_onset.jl +++ b/archive/2026-07-legacy-research/experiments/freeze_onset.jl @@ -61,5 +61,5 @@ function run_freeze_onset(; tasks=[:tracking, :wall, :pong], return dir end -register_experiment!(:freeze_onset, run_freeze_onset; +ExpRegistry.register_experiment!(:freeze_onset, run_freeze_onset; description="Freeze plasticity at tick T across single-agent tasks; find the dead→alive onset (normalized score + rate).") diff --git a/experiments/harness.jl b/archive/2026-07-legacy-research/experiments/harness.jl similarity index 100% rename from experiments/harness.jl rename to archive/2026-07-legacy-research/experiments/harness.jl diff --git a/experiments/registry.jl b/archive/2026-07-legacy-research/experiments/registry.jl similarity index 100% rename from experiments/registry.jl rename to archive/2026-07-legacy-research/experiments/registry.jl diff --git a/experiments/results/tracking_leak_lrate_factorial/20260708T214041Z_752b528/manifest.txt b/archive/2026-07-legacy-research/experiments/results/tracking_leak_lrate_factorial/20260708T214041Z_752b528/manifest.txt similarity index 100% rename from experiments/results/tracking_leak_lrate_factorial/20260708T214041Z_752b528/manifest.txt rename to archive/2026-07-legacy-research/experiments/results/tracking_leak_lrate_factorial/20260708T214041Z_752b528/manifest.txt diff --git a/experiments/results/tracking_leak_lrate_factorial/20260708T214041Z_752b528/results.json b/archive/2026-07-legacy-research/experiments/results/tracking_leak_lrate_factorial/20260708T214041Z_752b528/results.json similarity index 100% rename from experiments/results/tracking_leak_lrate_factorial/20260708T214041Z_752b528/results.json rename to archive/2026-07-legacy-research/experiments/results/tracking_leak_lrate_factorial/20260708T214041Z_752b528/results.json diff --git a/experiments/results/tracking_param_sweep/20260708T214553Z_752b528/manifest.txt b/archive/2026-07-legacy-research/experiments/results/tracking_param_sweep/20260708T214553Z_752b528/manifest.txt similarity index 100% rename from experiments/results/tracking_param_sweep/20260708T214553Z_752b528/manifest.txt rename to archive/2026-07-legacy-research/experiments/results/tracking_param_sweep/20260708T214553Z_752b528/manifest.txt diff --git a/experiments/results/tracking_param_sweep/20260708T214553Z_752b528/results.json b/archive/2026-07-legacy-research/experiments/results/tracking_param_sweep/20260708T214553Z_752b528/results.json similarity index 100% rename from experiments/results/tracking_param_sweep/20260708T214553Z_752b528/results.json rename to archive/2026-07-legacy-research/experiments/results/tracking_param_sweep/20260708T214553Z_752b528/results.json diff --git a/experiments/run.jl b/archive/2026-07-legacy-research/experiments/run.jl similarity index 88% rename from experiments/run.jl rename to archive/2026-07-legacy-research/experiments/run.jl index 04b3142..92b3c7f 100644 --- a/experiments/run.jl +++ b/archive/2026-07-legacy-research/experiments/run.jl @@ -49,15 +49,20 @@ end function main(args) if isempty(args) || first(args) in ("--list", "-l", "list", "--help", "-h") println("Registered experiments (experiments/run.jl [key=val ...]):\n") - for name in experiments() - println(" ", rpad(string(name), 18), " ", experiment_description(name)) + for name in ExpRegistry.experiments() + println( + " ", + rpad(string(name), 18), + " ", + ExpRegistry.experiment_description(name), + ) end return end name = Symbol(first(args)) kw = _parse_kwargs(args[2:end]) println("running :", name, " ", isempty(kw) ? "(defaults)" : kw, "\n") - dir = resolve_experiment(name).run(; kw...) + dir = ExpRegistry.resolve_experiment(name).run(; kw...) println("\nwrote ", dir) end diff --git a/experiments/shoal_vision_sweep.jl b/archive/2026-07-legacy-research/experiments/shoal_vision_sweep.jl similarity index 99% rename from experiments/shoal_vision_sweep.jl rename to archive/2026-07-legacy-research/experiments/shoal_vision_sweep.jl index 50b1e07..67ce19a 100644 --- a/experiments/shoal_vision_sweep.jl +++ b/archive/2026-07-legacy-research/experiments/shoal_vision_sweep.jl @@ -1024,13 +1024,13 @@ end run_shoal_sensitivity_screen(; diagnostics=false, kwargs...) = run_shoal_vision_sweep(; profile=:sensitivity, diagnostics, kwargs...) -register_experiment!( +ExpRegistry.register_experiment!( :shoal_vision_sweep, run_shoal_vision_sweep; description="Underpowered exploratory sweep of conspecific sight distance, bearing alignment, and association need in moving Falandays shoals.", ) -register_experiment!( +ExpRegistry.register_experiment!( :shoal_sensitivity_screen, run_shoal_sensitivity_screen; description="Underpowered one-factor sensitivity screen for shoal input gains, need dynamics, response curves, and resource sight range.", diff --git a/experiments/shoal_vision_sweep/README.md b/archive/2026-07-legacy-research/experiments/shoal_vision_sweep/README.md similarity index 100% rename from experiments/shoal_vision_sweep/README.md rename to archive/2026-07-legacy-research/experiments/shoal_vision_sweep/README.md diff --git a/experiments/shoal_vision_sweep/protocol.toml b/archive/2026-07-legacy-research/experiments/shoal_vision_sweep/protocol.toml similarity index 100% rename from experiments/shoal_vision_sweep/protocol.toml rename to archive/2026-07-legacy-research/experiments/shoal_vision_sweep/protocol.toml diff --git a/experiments/tracking_leak_lrate_factorial.jl b/archive/2026-07-legacy-research/experiments/tracking_leak_lrate_factorial.jl similarity index 99% rename from experiments/tracking_leak_lrate_factorial.jl rename to archive/2026-07-legacy-research/experiments/tracking_leak_lrate_factorial.jl index 76fe252..f02da3e 100644 --- a/experiments/tracking_leak_lrate_factorial.jl +++ b/archive/2026-07-legacy-research/experiments/tracking_leak_lrate_factorial.jl @@ -215,5 +215,5 @@ function run_tracking_leak_lrate_factorial(; leaks=TRACKING_FACTORIAL_DEFAULT_LE return dir end -register_experiment!(:tracking_leak_lrate_factorial, run_tracking_leak_lrate_factorial; +ExpRegistry.register_experiment!(:tracking_leak_lrate_factorial, run_tracking_leak_lrate_factorial; description="leak × lrate_wmat factorial on the paper tracking model — the joint viability landscape over the two interacting homeostatic-gain axes.") diff --git a/experiments/tracking_param_sweep.jl b/archive/2026-07-legacy-research/experiments/tracking_param_sweep.jl similarity index 99% rename from experiments/tracking_param_sweep.jl rename to archive/2026-07-legacy-research/experiments/tracking_param_sweep.jl index 4492efd..b375e98 100644 --- a/experiments/tracking_param_sweep.jl +++ b/archive/2026-07-legacy-research/experiments/tracking_param_sweep.jl @@ -449,5 +449,5 @@ function run_tracking_param_sweep(; seeds=0:99, ticks=7200, warmup=100, nnodes=2 return dir end -register_experiment!(:tracking_param_sweep, run_tracking_param_sweep; +ExpRegistry.register_experiment!(:tracking_param_sweep, run_tracking_param_sweep; description="One-at-a-time parameter sweep of the paper Falandays object-tracking model (leak, lrate_targ, lrate_wmat, input_amp, movement_amp, eye_offset); post-warmup heading error + branching over N random-init seeds.") diff --git a/site/src/content/docs/collective.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/collective.mdx similarity index 100% rename from site/src/content/docs/collective.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/collective.mdx diff --git a/site/src/content/docs/concepts.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/concepts.mdx similarity index 100% rename from site/src/content/docs/concepts.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/concepts.mdx diff --git a/site/src/content/docs/environments-tasks.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/environments-tasks.mdx similarity index 100% rename from site/src/content/docs/environments-tasks.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/environments-tasks.mdx diff --git a/site/src/content/docs/extending.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/extending.mdx similarity index 100% rename from site/src/content/docs/extending.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/extending.mdx diff --git a/site/src/content/docs/getting-started.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/getting-started.mdx similarity index 100% rename from site/src/content/docs/getting-started.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/getting-started.mdx diff --git a/site/src/content/docs/introduction.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/introduction.mdx similarity index 100% rename from site/src/content/docs/introduction.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/introduction.mdx diff --git a/site/src/content/docs/nodes/falandays.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/nodes/falandays.mdx similarity index 100% rename from site/src/content/docs/nodes/falandays.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/nodes/falandays.mdx diff --git a/site/src/content/docs/nodes/overview.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/nodes/overview.mdx similarity index 100% rename from site/src/content/docs/nodes/overview.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/nodes/overview.mdx diff --git a/site/src/content/docs/outputs/overview.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/outputs/overview.mdx similarity index 100% rename from site/src/content/docs/outputs/overview.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/outputs/overview.mdx diff --git a/site/src/content/docs/receptors-effectors.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/receptors-effectors.mdx similarity index 100% rename from site/src/content/docs/receptors-effectors.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/receptors-effectors.mdx diff --git a/site/src/content/docs/research-workflow.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/research-workflow.mdx similarity index 100% rename from site/src/content/docs/research-workflow.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/research-workflow.mdx diff --git a/site/src/content/docs/task-reference.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/task-reference.mdx similarity index 100% rename from site/src/content/docs/task-reference.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/task-reference.mdx diff --git a/site/src/content/docs/tooling.mdx b/archive/2026-07-legacy-research/site/compatibility-pages/tooling.mdx similarity index 100% rename from site/src/content/docs/tooling.mdx rename to archive/2026-07-legacy-research/site/compatibility-pages/tooling.mdx diff --git a/site/src/content/docs/notes/activation-fronts-active-systems.mdx b/archive/2026-07-legacy-research/site/paper-notes/activation-fronts-active-systems.mdx similarity index 100% rename from site/src/content/docs/notes/activation-fronts-active-systems.mdx rename to archive/2026-07-legacy-research/site/paper-notes/activation-fronts-active-systems.mdx diff --git a/site/src/content/docs/notes/cognition-all-the-way-down.mdx b/archive/2026-07-legacy-research/site/paper-notes/cognition-all-the-way-down.mdx similarity index 100% rename from site/src/content/docs/notes/cognition-all-the-way-down.mdx rename to archive/2026-07-legacy-research/site/paper-notes/cognition-all-the-way-down.mdx diff --git a/site/src/content/docs/notes/collective-predator-evasion.mdx b/archive/2026-07-legacy-research/site/paper-notes/collective-predator-evasion.mdx similarity index 100% rename from site/src/content/docs/notes/collective-predator-evasion.mdx rename to archive/2026-07-legacy-research/site/paper-notes/collective-predator-evasion.mdx diff --git a/site/src/content/docs/notes/criticality-and-information.mdx b/archive/2026-07-legacy-research/site/paper-notes/criticality-and-information.mdx similarity index 100% rename from site/src/content/docs/notes/criticality-and-information.mdx rename to archive/2026-07-legacy-research/site/paper-notes/criticality-and-information.mdx diff --git a/site/src/content/docs/notes/criticality-collective-intelligence.mdx b/archive/2026-07-legacy-research/site/paper-notes/criticality-collective-intelligence.mdx similarity index 100% rename from site/src/content/docs/notes/criticality-collective-intelligence.mdx rename to archive/2026-07-legacy-research/site/paper-notes/criticality-collective-intelligence.mdx diff --git a/site/src/content/docs/notes/criticality-living-systems-review.mdx b/archive/2026-07-legacy-research/site/paper-notes/criticality-living-systems-review.mdx similarity index 100% rename from site/src/content/docs/notes/criticality-living-systems-review.mdx rename to archive/2026-07-legacy-research/site/paper-notes/criticality-living-systems-review.mdx diff --git a/site/src/content/docs/notes/criticality-swarm-robots.mdx b/archive/2026-07-legacy-research/site/paper-notes/criticality-swarm-robots.mdx similarity index 100% rename from site/src/content/docs/notes/criticality-swarm-robots.mdx rename to archive/2026-07-legacy-research/site/paper-notes/criticality-swarm-robots.mdx diff --git a/site/src/content/docs/notes/dynamical-criticality-overview.mdx b/archive/2026-07-legacy-research/site/paper-notes/dynamical-criticality-overview.mdx similarity index 100% rename from site/src/content/docs/notes/dynamical-criticality-overview.mdx rename to archive/2026-07-legacy-research/site/paper-notes/dynamical-criticality-overview.mdx diff --git a/site/src/content/docs/notes/emergent-macro-criticality.mdx b/archive/2026-07-legacy-research/site/paper-notes/emergent-macro-criticality.mdx similarity index 100% rename from site/src/content/docs/notes/emergent-macro-criticality.mdx rename to archive/2026-07-legacy-research/site/paper-notes/emergent-macro-criticality.mdx diff --git a/site/src/content/docs/notes/finite-size-scaling-swarms.mdx b/archive/2026-07-legacy-research/site/paper-notes/finite-size-scaling-swarms.mdx similarity index 100% rename from site/src/content/docs/notes/finite-size-scaling-swarms.mdx rename to archive/2026-07-legacy-research/site/paper-notes/finite-size-scaling-swarms.mdx diff --git a/site/src/content/docs/notes/heterogeneous-criticality-fish-school.mdx b/archive/2026-07-legacy-research/site/paper-notes/heterogeneous-criticality-fish-school.mdx similarity index 100% rename from site/src/content/docs/notes/heterogeneous-criticality-fish-school.mdx rename to archive/2026-07-legacy-research/site/paper-notes/heterogeneous-criticality-fish-school.mdx diff --git a/site/src/content/docs/notes/information-based-fitness.mdx b/archive/2026-07-legacy-research/site/paper-notes/information-based-fitness.mdx similarity index 100% rename from site/src/content/docs/notes/information-based-fitness.mdx rename to archive/2026-07-legacy-research/site/paper-notes/information-based-fitness.mdx diff --git a/site/src/content/docs/notes/information-flow-near-criticality.mdx b/archive/2026-07-legacy-research/site/paper-notes/information-flow-near-criticality.mdx similarity index 100% rename from site/src/content/docs/notes/information-flow-near-criticality.mdx rename to archive/2026-07-legacy-research/site/paper-notes/information-flow-near-criticality.mdx diff --git a/site/src/content/docs/notes/papers-overview.mdx b/archive/2026-07-legacy-research/site/paper-notes/papers-overview.mdx similarity index 100% rename from site/src/content/docs/notes/papers-overview.mdx rename to archive/2026-07-legacy-research/site/paper-notes/papers-overview.mdx diff --git a/site/src/content/docs/notes/phase-transitions-collective-behavior.mdx b/archive/2026-07-legacy-research/site/paper-notes/phase-transitions-collective-behavior.mdx similarity index 100% rename from site/src/content/docs/notes/phase-transitions-collective-behavior.mdx rename to archive/2026-07-legacy-research/site/paper-notes/phase-transitions-collective-behavior.mdx diff --git a/site/src/content/docs/notes/scale-free-chaos-swarms.mdx b/archive/2026-07-legacy-research/site/paper-notes/scale-free-chaos-swarms.mdx similarity index 100% rename from site/src/content/docs/notes/scale-free-chaos-swarms.mdx rename to archive/2026-07-legacy-research/site/paper-notes/scale-free-chaos-swarms.mdx diff --git a/site/src/content/docs/notes/soc-aquatic-robot-swarm.mdx b/archive/2026-07-legacy-research/site/paper-notes/soc-aquatic-robot-swarm.mdx similarity index 100% rename from site/src/content/docs/notes/soc-aquatic-robot-swarm.mdx rename to archive/2026-07-legacy-research/site/paper-notes/soc-aquatic-robot-swarm.mdx diff --git a/site/src/content/docs/notes/soc-concepts-controversies.mdx b/archive/2026-07-legacy-research/site/paper-notes/soc-concepts-controversies.mdx similarity index 100% rename from site/src/content/docs/notes/soc-concepts-controversies.mdx rename to archive/2026-07-legacy-research/site/paper-notes/soc-concepts-controversies.mdx diff --git a/site/src/content/docs/notes/soc-induced-by-diversity.mdx b/archive/2026-07-legacy-research/site/paper-notes/soc-induced-by-diversity.mdx similarity index 100% rename from site/src/content/docs/notes/soc-induced-by-diversity.mdx rename to archive/2026-07-legacy-research/site/paper-notes/soc-induced-by-diversity.mdx diff --git a/site/src/content/docs/notes/spectral-radius-criticality.mdx b/archive/2026-07-legacy-research/site/paper-notes/spectral-radius-criticality.mdx similarity index 100% rename from site/src/content/docs/notes/spectral-radius-criticality.mdx rename to archive/2026-07-legacy-research/site/paper-notes/spectral-radius-criticality.mdx diff --git a/site/src/content/docs/notes/subcritical-escape-waves.mdx b/archive/2026-07-legacy-research/site/paper-notes/subcritical-escape-waves.mdx similarity index 100% rename from site/src/content/docs/notes/subcritical-escape-waves.mdx rename to archive/2026-07-legacy-research/site/paper-notes/subcritical-escape-waves.mdx diff --git a/site/src/content/docs/notes/thermodynamics-collective-motion.mdx b/archive/2026-07-legacy-research/site/paper-notes/thermodynamics-collective-motion.mdx similarity index 100% rename from site/src/content/docs/notes/thermodynamics-collective-motion.mdx rename to archive/2026-07-legacy-research/site/paper-notes/thermodynamics-collective-motion.mdx diff --git a/site/src/content/docs/notes/turning-avalanches-fish.mdx b/archive/2026-07-legacy-research/site/paper-notes/turning-avalanches-fish.mdx similarity index 100% rename from site/src/content/docs/notes/turning-avalanches-fish.mdx rename to archive/2026-07-legacy-research/site/paper-notes/turning-avalanches-fish.mdx diff --git a/site/src/content/docs/notes/why-self-organize-to-criticality.mdx b/archive/2026-07-legacy-research/site/paper-notes/why-self-organize-to-criticality.mdx similarity index 100% rename from site/src/content/docs/notes/why-self-organize-to-criticality.mdx rename to archive/2026-07-legacy-research/site/paper-notes/why-self-organize-to-criticality.mdx diff --git a/site/public/experiments/criticality-control/forage-confound.png b/archive/2026-07-legacy-research/site/study-assets/criticality-control/forage-confound.png similarity index 100% rename from site/public/experiments/criticality-control/forage-confound.png rename to archive/2026-07-legacy-research/site/study-assets/criticality-control/forage-confound.png diff --git a/site/public/experiments/criticality-control/m-rate-plane.png b/archive/2026-07-legacy-research/site/study-assets/criticality-control/m-rate-plane.png similarity index 100% rename from site/public/experiments/criticality-control/m-rate-plane.png rename to archive/2026-07-legacy-research/site/study-assets/criticality-control/m-rate-plane.png diff --git a/site/public/experiments/social-foraging/cohesion-cluster.png b/archive/2026-07-legacy-research/site/study-assets/social-foraging/cohesion-cluster.png similarity index 100% rename from site/public/experiments/social-foraging/cohesion-cluster.png rename to archive/2026-07-legacy-research/site/study-assets/social-foraging/cohesion-cluster.png diff --git a/site/public/experiments/social-foraging/forage-blind.gif b/archive/2026-07-legacy-research/site/study-assets/social-foraging/forage-blind.gif similarity index 100% rename from site/public/experiments/social-foraging/forage-blind.gif rename to archive/2026-07-legacy-research/site/study-assets/social-foraging/forage-blind.gif diff --git a/site/public/experiments/social-foraging/forage-social.gif b/archive/2026-07-legacy-research/site/study-assets/social-foraging/forage-social.gif similarity index 100% rename from site/public/experiments/social-foraging/forage-social.gif rename to archive/2026-07-legacy-research/site/study-assets/social-foraging/forage-social.gif diff --git a/site/public/experiments/social-foraging/interaction-graph.png b/archive/2026-07-legacy-research/site/study-assets/social-foraging/interaction-graph.png similarity index 100% rename from site/public/experiments/social-foraging/interaction-graph.png rename to archive/2026-07-legacy-research/site/study-assets/social-foraging/interaction-graph.png diff --git a/site/public/experiments/tracking-sweep/data/tracking_leak_lrate_factorial.manifest.txt b/archive/2026-07-legacy-research/site/study-assets/tracking-sweep/data/tracking_leak_lrate_factorial.manifest.txt similarity index 100% rename from site/public/experiments/tracking-sweep/data/tracking_leak_lrate_factorial.manifest.txt rename to archive/2026-07-legacy-research/site/study-assets/tracking-sweep/data/tracking_leak_lrate_factorial.manifest.txt diff --git a/site/public/experiments/tracking-sweep/data/tracking_leak_lrate_factorial.results.json b/archive/2026-07-legacy-research/site/study-assets/tracking-sweep/data/tracking_leak_lrate_factorial.results.json similarity index 100% rename from site/public/experiments/tracking-sweep/data/tracking_leak_lrate_factorial.results.json rename to archive/2026-07-legacy-research/site/study-assets/tracking-sweep/data/tracking_leak_lrate_factorial.results.json diff --git a/site/public/experiments/tracking-sweep/data/tracking_param_sweep.manifest.txt b/archive/2026-07-legacy-research/site/study-assets/tracking-sweep/data/tracking_param_sweep.manifest.txt similarity index 100% rename from site/public/experiments/tracking-sweep/data/tracking_param_sweep.manifest.txt rename to archive/2026-07-legacy-research/site/study-assets/tracking-sweep/data/tracking_param_sweep.manifest.txt diff --git a/site/public/experiments/tracking-sweep/data/tracking_param_sweep.results.json b/archive/2026-07-legacy-research/site/study-assets/tracking-sweep/data/tracking_param_sweep.results.json similarity index 100% rename from site/public/experiments/tracking-sweep/data/tracking_param_sweep.results.json rename to archive/2026-07-legacy-research/site/study-assets/tracking-sweep/data/tracking_param_sweep.results.json diff --git a/site/public/experiments/tracking-sweep/factorial_heatmap.png b/archive/2026-07-legacy-research/site/study-assets/tracking-sweep/factorial_heatmap.png similarity index 100% rename from site/public/experiments/tracking-sweep/factorial_heatmap.png rename to archive/2026-07-legacy-research/site/study-assets/tracking-sweep/factorial_heatmap.png diff --git a/site/public/experiments/tracking-sweep/frac_viable.png b/archive/2026-07-legacy-research/site/study-assets/tracking-sweep/frac_viable.png similarity index 100% rename from site/public/experiments/tracking-sweep/frac_viable.png rename to archive/2026-07-legacy-research/site/study-assets/tracking-sweep/frac_viable.png diff --git a/site/public/experiments/tracking-sweep/signature_scatter.png b/archive/2026-07-legacy-research/site/study-assets/tracking-sweep/signature_scatter.png similarity index 100% rename from site/public/experiments/tracking-sweep/signature_scatter.png rename to archive/2026-07-legacy-research/site/study-assets/tracking-sweep/signature_scatter.png diff --git a/site/public/experiments/tracking-sweep/viability_strips.png b/archive/2026-07-legacy-research/site/study-assets/tracking-sweep/viability_strips.png similarity index 100% rename from site/public/experiments/tracking-sweep/viability_strips.png rename to archive/2026-07-legacy-research/site/study-assets/tracking-sweep/viability_strips.png diff --git a/site/src/content/docs/experiments/criticality-control.mdx b/archive/2026-07-legacy-research/site/study-pages/criticality-control.mdx similarity index 100% rename from site/src/content/docs/experiments/criticality-control.mdx rename to archive/2026-07-legacy-research/site/study-pages/criticality-control.mdx diff --git a/site/src/content/docs/experiments/freeze-onset.mdx b/archive/2026-07-legacy-research/site/study-pages/freeze-onset.mdx similarity index 100% rename from site/src/content/docs/experiments/freeze-onset.mdx rename to archive/2026-07-legacy-research/site/study-pages/freeze-onset.mdx diff --git a/site/src/content/docs/experiments/overview.mdx b/archive/2026-07-legacy-research/site/study-pages/overview.mdx similarity index 100% rename from site/src/content/docs/experiments/overview.mdx rename to archive/2026-07-legacy-research/site/study-pages/overview.mdx diff --git a/site/src/content/docs/experiments/shoal-vision-sweep.mdx b/archive/2026-07-legacy-research/site/study-pages/shoal-vision-sweep.mdx similarity index 100% rename from site/src/content/docs/experiments/shoal-vision-sweep.mdx rename to archive/2026-07-legacy-research/site/study-pages/shoal-vision-sweep.mdx diff --git a/site/src/content/docs/experiments/social-foraging.mdx b/archive/2026-07-legacy-research/site/study-pages/social-foraging.mdx similarity index 100% rename from site/src/content/docs/experiments/social-foraging.mdx rename to archive/2026-07-legacy-research/site/study-pages/social-foraging.mdx diff --git a/site/src/content/docs/experiments/tracking-param-sweep.mdx b/archive/2026-07-legacy-research/site/study-pages/tracking-param-sweep.mdx similarity index 100% rename from site/src/content/docs/experiments/tracking-param-sweep.mdx rename to archive/2026-07-legacy-research/site/study-pages/tracking-param-sweep.mdx diff --git a/bench/Manifest.toml b/bench/Manifest.toml new file mode 100644 index 0000000..8264e05 --- /dev/null +++ b/bench/Manifest.toml @@ -0,0 +1,1630 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.10.11" +manifest_format = "2.0" +project_hash = "0baf21e6a3229bc7a8eff8a2c7e7ad508f30070e" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "7063ad1083578215c7c4bf410368150abe8d5524" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.45" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "daa72978cd7a624246e894a4f4f067706d4e17e2" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.7.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AdaptivePredicates]] +git-tree-sha1 = "7e651ea8d262d2d74ce75fdf47c4d63c07dba7a6" +uuid = "35492f91-a3bd-45ad-95db-fcad7dcfedb7" +version = "1.2.0" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.Animations]] +deps = ["Colors"] +git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7" +uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" +version = "0.4.2" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Automa]] +deps = ["PrecompileTools", "TranscodingStreams"] +git-tree-sha1 = "94eab0b3ccdcac361188cc661daf69d4433c1818" +uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" +version = "1.2.0" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.1.0" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "4126b08903b777c88edf1754288144a0492c05ad" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.8" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BaseDirs]] +git-tree-sha1 = "8c290a1b223deaeea9aea44b235d24546da8eb98" +uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f" +version = "1.4.0" + +[[deps.BrainlessLab]] +deps = ["Dates", "JLD2", "LinearAlgebra", "Random", "SHA", "StaticArrays", "Statistics", "TOML"] +path = ".." +uuid = "d12add44-1e3e-4161-9a99-c2121a2f0f38" +version = "0.2.0" +weakdeps = ["Makie"] + + [deps.BrainlessLab.extensions] + BrainlessLabMakieExt = "Makie" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.9+0" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CRC32c]] +uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" + +[[deps.CRlibm]] +deps = ["CRlibm_jll"] +git-tree-sha1 = "66188d9d103b92b6cd705214242e27f5737a1e5e" +uuid = "96374032-68de-5a5b-8d9e-752f78720389" +version = "1.0.2" + +[[deps.CRlibm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" +uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" +version = "1.0.1+0" + +[[deps.Cairo]] +deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] +git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9" +uuid = "159f3aea-2a34-519c-b102-8c37f9878175" +version = "1.1.1" + +[[deps.CairoMakie]] +deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] +git-tree-sha1 = "47142129b1777e21da58cff265050b10d8560588" +uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +version = "0.15.13" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "1fa950ebc3e37eccd51c6a8fe1f92f7d86263522" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.7+0" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "12177ad6b3cad7fd50c8b3825ce24a99ad61c18f" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.26.1" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CodecZstd]] +deps = ["TranscodingStreams", "Zstd_jll"] +git-tree-sha1 = "da54a6cd93c54950c15adf1d336cfd7d71f51a56" +uuid = "6b39b394-51ab-5f42-8807-6242bab2b4c2" +version = "0.8.7" + +[[deps.ColorBrewer]] +deps = ["Colors", "JSON"] +git-tree-sha1 = "07da79661b919001e6863b81fc572497daa58349" +uuid = "a2cac450-b92f-5266-8821-25eda20663c8" +version = "0.4.2" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.31.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.12.1" + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" + + [deps.ColorTypes.weakdeps] + StyledStrings = "f489334b-da3d-4c2e-b8f0-e476e12c162b" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.11.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.1" + +[[deps.CommonSolve]] +git-tree-sha1 = "eeaad7cef88554c2fa56b5a3f71cfd5cb708c662" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.11" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.18.1" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ComputePipeline]] +deps = ["Observables", "Preferences"] +git-tree-sha1 = "7bc84b769c1d384315e7b5c4ac03a6c303e6cf35" +uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c" +version = "0.1.8" + +[[deps.ConstructionBase]] +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.6.0" +weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.CoreMath]] +deps = ["CoreMath_jll"] +git-tree-sha1 = "8c0480f92b1b1796239156a1b9b1bfb1b39499b4" +uuid = "b7a15901-be09-4a0e-87d2-2e66b0e09b5a" +version = "0.1.0" + +[[deps.CoreMath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a692a4c1dc59a4b8bc0b6403876eb3250fde2bc3" +uuid = "a38c48d9-6df1-5ac9-9223-b6ada3b5572b" +version = "0.1.0+0" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["OrderedCollections"] +git-tree-sha1 = "b0bc6d2cad1fed8b7fd59a1551a991cb3d2809e6" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.19.6" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelaunayTriangulation]] +deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] +git-tree-sha1 = "c55f5a9fd67bdbc8e089b5a3111fe4292986a8e8" +uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" +version = "1.6.6" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "Roots", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "cd3c5ac74cd3923c8945c6a81518c46abd0e73a3" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.129" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsSparseConnectivityTracerExt = "SparseConnectivityTracer" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.5" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.4+0" + +[[deps.EnumX]] +git-tree-sha1 = "c49898e8438c828577f04b92fc9368c388ac783c" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.7" + +[[deps.ExactPredicates]] +deps = ["IntervalArithmetic", "Random", "StaticArrays"] +git-tree-sha1 = "83231673ea4d3d6008ac74dc5079e77ab2209d8f" +uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" +version = "2.2.9" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e6c4a6407a949e79a9d3f249bf49e6987c80e01f" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.8.2+0" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libva_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "7a58e45171b63ed4782f2d36fdee8713a469e6e0" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "8.1.2+0" + +[[deps.FFTA]] +deps = ["AbstractFFTs", "DocStringExtensions", "LinearAlgebra", "MuladdMacro", "Primes", "Random", "Reexport"] +git-tree-sha1 = "65e55303b72f4a567a51b174dd2c47496efeb95a" +uuid = "b86e33f2-c0db-4aa1-a6e0-ab43e668529e" +version = "0.3.1" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "6621fef488e496356c9c9625d0562c12a6070819" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.20.0" + + [deps.FileIO.extensions] + HTTPExt = "HTTP" + + [deps.FileIO.weakdeps] + HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" + +[[deps.FilePaths]] +deps = ["FilePathsBase", "MacroTools", "Reexport"] +git-tree-sha1 = "a1b2fbfe98503f15b665ed45b3d149e5d8895e4c" +uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" +version = "0.9.0" + + [deps.FilePaths.extensions] + FilePathsGlobExt = "Glob" + FilePathsURIParserExt = "URIParser" + FilePathsURIsExt = "URIs" + + [deps.FilePaths.weakdeps] + Glob = "c27321d9-0574-5035-807b-f59d2c89b15c" + URIParser = "30578b45-9adc-5946-b283-645ec420af67" + URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.24" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "5bad39456d9f0166184fce2248783dd9862645c1" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.17.0" +weakdeps = ["PDMats", "SparseArrays", "StaticArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStaticArraysExt = "StaticArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FixedPointNumbers]] +deps = ["Random", "Statistics"] +git-tree-sha1 = "59af96b98217c6ef4ae0dfe065ac7c20831d1a84" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.6" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.17.1+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.FreeType]] +deps = ["CEnum", "FreeType2_jll"] +git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" +uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" +version = "4.1.1" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "70329abc09b886fd2c5d94ad2d9527639c421e3e" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.14.3+1" + +[[deps.FreeTypeAbstraction]] +deps = ["BaseDirs", "ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "Mmap"] +git-tree-sha1 = "4ebb930ef4a43817991ba35db6317a05e59abd11" +uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" +version = "0.10.8" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.17+0" + +[[deps.Gamma]] +git-tree-sha1 = "86f86b6168a016ed88e4ae4e64577b98c3b59e8e" +uuid = "a0844989-3bd2-4988-8bea-c9407ab0941b" +version = "1.1.0" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] +git-tree-sha1 = "364685f5ffde25deb1bbcfd5bb278a5c6b7a9b37" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.5.11" + + [deps.GeometryBasics.extensions] + ExtentsExt = "Extents" + GeometryBasicsGeoInterfaceExt = "GeoInterface" + IntervalSetsExt = "IntervalSets" + + [deps.GeometryBasics.weakdeps] + Extents = "411431e0-e8b7-467b-b5e0-f676ba4f2910" + GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + +[[deps.GettextRuntime_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"] +git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340" +uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a" +version = "0.22.4+0" + +[[deps.Giflib_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a" +uuid = "59f7168a-df46-5410-90c8-f2779963d0ec" +version = "5.2.3+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "24f6def62397474a297bfcec22384101609142ed" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.86.3+0" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.3" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "69ffb934a5c5b7e086a0b4fee3427db2556fba6e" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.16+0" + +[[deps.GridLayoutBase]] +deps = ["GeometryBasics", "InteractiveUtils", "Observables"] +git-tree-sha1 = "93d5c27c8de51687a2c70ec0716e6e76f298416f" +uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" +version = "0.11.2" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.1+0" + +[[deps.HashArrayMappedTries]] +git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" +uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" +version = "0.2.0" + +[[deps.HypergeometricFunctions]] +deps = ["Gamma", "LinearAlgebra"] +git-tree-sha1 = "18d7deab5fb0440dc6a7b6993c5c27b25420de10" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.29" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.12" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageCore]] +deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.5" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"] +git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.9" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.10" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "dcc8d0cd653e55213df9b75ebc6fe4a8d3254c65" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.2.2+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.5" + +[[deps.IntegerMathUtils]] +git-tree-sha1 = "4c1acff2dc6b6967e7e750633c50bc3b8d83e617" +uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" +version = "0.1.3" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "48922d06068130f87e43edef52382e6a94305ae6" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.16.3" + + [deps.Interpolations.extensions] + InterpolationsForwardDiffExt = "ForwardDiff" + InterpolationsUnitfulExt = "Unitful" + + [deps.Interpolations.weakdeps] + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.IntervalArithmetic]] +deps = ["CRlibm", "CoreMath", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"] +git-tree-sha1 = "c3ee408ae340565f41699e3a3fa1053698c7626e" +uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" +version = "1.0.10" + + [deps.IntervalArithmetic.extensions] + IntervalArithmeticArblibExt = "Arblib" + IntervalArithmeticDiffRulesExt = "DiffRules" + IntervalArithmeticForwardDiffExt = "ForwardDiff" + IntervalArithmeticIntervalSetsExt = "IntervalSets" + IntervalArithmeticIrrationalConstantsExt = "IrrationalConstants" + IntervalArithmeticLinearAlgebraExt = "LinearAlgebra" + IntervalArithmeticRecipesBaseExt = "RecipesBase" + IntervalArithmeticSparseArraysExt = "SparseArrays" + + [deps.IntervalArithmetic.weakdeps] + Arblib = "fb37089c-8514-4489-9461-98f9c8763369" + DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + IrrationalConstants = "92d709cd-6900-40b7-9082-c6be49f344b6" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.IntervalSets]] +git-tree-sha1 = "79d6bd28c8d9bccc2229784f1bd637689b256377" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.14" + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + + [deps.IntervalSets.weakdeps] + Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.6" + +[[deps.Isoband]] +deps = ["isoband_jll"] +git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" +uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "ScopedValues", "TranscodingStreams"] +git-tree-sha1 = "d97791feefda45729613fafeccc4fbef3f539151" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.5.15" + + [deps.JLD2.extensions] + UnPackExt = "UnPack" + + [deps.JLD2.weakdeps] + UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7204148362dafe5fe6a273f855b8ccbe4df8173e" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.8.0" + +[[deps.JSON]] +deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"] +git-tree-sha1 = "c89d196f5ffb64bfbf80985b699ea913b0d2c211" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "1.6.1" + + [deps.JSON.extensions] + JSONArrowExt = ["ArrowTypes"] + + [deps.JSON.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "9496de8fb52c224a2e3f9ff403947674517317d9" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.6" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1dae3057da6f2b9c857afef03177bbdc7c4afe92" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.2.0+0" + +[[deps.KernelDensity]] +deps = ["Distributions", "DocStringExtensions", "FFTA", "Interpolations", "StatsBase"] +git-tree-sha1 = "9eda8292dd3268b3b7ec9df21bbfac24e177ec52" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.6.12" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.3+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "17b94ecafcfa45e8360a4fc9ca6b583b049e4e37" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.1.0+0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b7970cef8ae1c990ba0c09cd8bdc1145e006632f" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "22.1.7+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.4.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.4.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.7.1+1" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "cc3ad4faf30015a3e8094c9b5b7f19e85bdf2386" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.42.0+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "aebd334d06cee9f24cea70bd19a39749daf73881" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.3+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d620582b1f0cbe2c72dd1d5bd195a9ce73370ab1" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.42.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "bba2d9aa057d8f126415de240573e86a8f39d2a1" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "1.0.1" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.MacroTools]] +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.16" + +[[deps.Makie]] +deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "ComputePipeline", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "Pkg", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] +git-tree-sha1 = "f2c8715d05bf10f9d4dc354e69dee30b6be53239" +uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" +version = "0.24.13" + + [deps.Makie.extensions] + MakieDynamicQuantitiesExt = "DynamicQuantities" + + [deps.Makie.weakdeps] + DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821" + +[[deps.MappedArrays]] +git-tree-sha1 = "0ee4497a4e80dbd29c058fcee6493f5219556f40" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.3" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MathTeXEngine]] +deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] +git-tree-sha1 = "aa1078778be5a8e5259ff04fbc3d258b3e78d464" +uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" +version = "0.6.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.1010+0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2025.12.2" + +[[deps.MuladdMacro]] +deps = ["PrecompileTools"] +git-tree-sha1 = "e8dcbeef032ba2f9051a44ac22b4e54e3a1a0099" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.6" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "dbd2e8cd2c1c27f0b584f6661b4309609c5a685e" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.4" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Observables]] +git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" +uuid = "510215fc-4207-5dde-b226-833fc4488ee2" +version = "0.5.5" + +[[deps.OffsetArrays]] +git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.17.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.6+0" + +[[deps.OpenBLASConsistentFPCSR_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "567515ca155d0020a45b05175449b499c63e7015" +uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af" +version = "0.3.29+0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.23+5" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.3" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "0d621a4beb5e48d195f907c3c5b0bea285d9ff9d" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.4.13+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.5+0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d8cce34295c55f47be683580f44791716045b8fe" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.5.7+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e2bb57a313a74b8104064b7efd01406c0a50d2ff" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.6.1+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "94ba93778373a53bfd5a0caaf7d809c445292ff4" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.2" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "26766d4b5f1a410c218a19b85a672c6edb693c65" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.40" +weakdeps = ["StatsBase"] + + [deps.PDMats.extensions] + StatsBaseExt = "StatsBase" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "32b657a0d57c310a1a172bfc8c8cf68c5e674323" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.5" + +[[deps.Packing]] +deps = ["GeometryBasics"] +git-tree-sha1 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c" +uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" +version = "0.5.1" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58e5ed5e386e156bd93e86b305ebd21ac63d2d04" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.57.1+0" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "32a4e09c5f29402573d673901778a0e03b0807b9" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.6" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "e4a6721aa89e62e5d4217c0b21bd714263779dda" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.46.4+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.10.0" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "26ca162858917496748aad52bb5d3be4d26a228a" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.4" + +[[deps.PolygonOps]] +git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" +uuid = "647866c9-e3ac-4575-94e7-e3d426903924" +version = "0.1.2" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "8b770b60760d4451834fe79dd483e318eee709c4" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.5.2" + +[[deps.Primes]] +deps = ["IntegerMathUtils"] +git-tree-sha1 = "25cdd1d20cd005b52fc12cb6be3f75faaf59bb9b" +uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" +version = "0.5.7" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.11.0" + +[[deps.PtrArrays]] +git-tree-sha1 = "4fbbafbc6251b883f4d2705356f3641f3652a7fe" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.4.0" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "472daaa816895cb7aee81658d4e7aec901fa1106" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.2" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "5e8e8b0ab68215d7a2b14b9921a946fee794749e" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.3" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.9.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.Roots]] +deps = ["Accessors", "CommonSolve", "Printf"] +git-tree-sha1 = "7fb25a964849d90a0446366cdefca822e0e84900" +uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" +version = "3.0.6" + + [deps.Roots.extensions] + RootsChainRulesCoreExt = "ChainRulesCore" + RootsForwardDiffExt = "ForwardDiff" + RootsIntervalRootFindingExt = "IntervalRootFinding" + RootsSymPyExt = "SymPy" + RootsSymPyPythonCallExt = "SymPyPythonCall" + RootsUnitfulExt = "Unitful" + + [deps.Roots.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807" + SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" + SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.RoundingEmulator]] +git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" +uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" +version = "0.2.1" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMD]] +deps = ["PrecompileTools"] +git-tree-sha1 = "e24dc23107d426a096d3eae6c165b921e74c18e4" +uuid = "fdea26ae-647d-5447-a871-4b548cad5224" +version = "3.7.2" + +[[deps.ScopedValues]] +deps = ["HashArrayMappedTries", "Logging"] +git-tree-sha1 = "67a144433c4ce877ee6d1ada69a124d6b1ecf7be" +uuid = "7e506255-f358-4e82-b7e4-beb19740aa63" +version = "1.6.2" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.ShaderAbstractions]] +deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"] +git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6" +uuid = "65257c39-d410-5151-9873-9b3e5be5013e" +version = "0.5.0" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.SignedDistanceFields]] +deps = ["Statistics"] +git-tree-sha1 = "3949ad92e1c9d2ff0cd4a1317d5ecbba682f4b92" +uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" +version = "0.4.1" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "7ddb0b49c109481b046972c0e4ab02b2127d6a75" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.6" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "0494aed9501e7fb65daba895fb7fd57cc38bc743" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.5" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "13cd91cc9be159e3f4d95b857fa2aa383b53772a" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.3" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "6547cbdd8ce32efba0d21c5a40fa96d1a3548f9f" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.8.0" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "4f96c596b8c8258cc7d3b19797854d368f243ddc" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.4" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "be1cf4eb0ac528d96f5115b4ed80c26a8d8ae621" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.2" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "246a8bb2e6667f832eea063c3a56aef96429a3db" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.18" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.4" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.10.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "178ed29fd5b2a2cfc3bd31c13375ae925623ff36" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.8.0" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "e4d7a1a0edc20af42689ea6f4f3587a2175d50ee" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.12" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "770240df9a3b8888065046948f7a09b4e0f997d5" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "2.2.0" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "ad8002667372439f2e3611cfd14097e03fa4bccd" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.7.3" + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] + StructArraysLinearAlgebraExt = "LinearAlgebra" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + + [deps.StructArrays.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.StructUtils]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "82bee338d650aa515f31866c460cb7e3bcef90b8" +uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42" +version = "2.8.2" + + [deps.StructUtils.extensions] + StructUtilsMeasurementsExt = ["Measurements"] + StructUtilsStaticArraysCoreExt = ["StaticArraysCore"] + StructUtilsTablesExt = ["Tables"] + + [deps.StructUtils.weakdeps] + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.2.1+1" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "0f38a06c83f0007bbab3cf911262841c9a0f07e0" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.13.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TiffImages]] +deps = ["CodecZstd", "ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"] +git-tree-sha1 = "9ca5f1f2d42f80df4b8c9f6ab5a64f438bbd9976" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.11.9" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.TriplotBase]] +git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" +uuid = "981d1d27-644d-49a2-9326-4793e63143c3" +version = "0.1.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "57e1b2c9de4bd6f40ecb9de4ac1797b81970d008" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.28.0" + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + ForwardDiffExt = "ForwardDiff" + InverseFunctionsUnitfulExt = "InverseFunctions" + LatexifyExt = ["Latexify", "LaTeXStrings"] + NaNMathExt = "NaNMath" + PrintfExt = "Printf" + + [deps.Unitful.weakdeps] + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" + Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" + NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" + Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.WebP]] +deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"] +git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2" +uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1" +version = "0.1.3" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "248a7031b3da79a127f14e5dc5f417e26f9f6db7" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "1.1.0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b29c22e245d092b8b4e8d3c09ad7baa586d9f573" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.8.3+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "808090ede1d41644447dd5cbafced4731c56bd2f" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.13+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.13+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.6+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "1a4a26870bf1e5d26cd585e38038d399d7e65706" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.8+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "75e00946e43621e09d431d9b95818ee751e6b2ef" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "6.0.2+0" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.12+0" + +[[deps.Xorg_libpciaccess_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "58972370b81423fc546c56a60ed1a009450177c3" +uuid = "a65dc6b1-eb27-53a1-bb3e-dea574b5389e" +version = "0.19.0+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] +git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.1+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.6.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+1" + +[[deps.isoband_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" +uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" +version = "0.2.3+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "850b06095ee71f0135d644ffd8a52850699581ed" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.13.3+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "125eedcb0a4a0bba65b657251ce1d27c8714e9d6" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.17.4+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.libdrm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libpciaccess_jll"] +git-tree-sha1 = "28e57478e8a160d346a19c28b3fffb9273bcc9c2" +uuid = "8e53e030-5e6c-5a89-a30b-be5b7263a166" +version = "2.4.134+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.4+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e51150d5ab85cee6fc36726850f0e627ad2e4aba" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.58+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"] +git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.5+0" + +[[deps.libva_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "libdrm_jll"] +git-tree-sha1 = "7dbf96baae3310fe2fa0df0ccbb3c6288d5816c9" +uuid = "9a156e7d-b971-5f62-b2c9-67348b8fb97c" +version = "2.23.0+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"] +git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.8+0" + +[[deps.libwebp_jll]] +deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"] +git-tree-sha1 = "4e4282c4d846e11dce56d74fa8040130b7a95cb3" +uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2" +version = "1.6.0+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.52.0+1" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.6.1+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "10164.0.1+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e7b67590c14d487e734dcb925924c5dc43ec85f3" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "4.1.0+0" diff --git a/bench/Project.toml b/bench/Project.toml index e00dde7..ec91685 100644 --- a/bench/Project.toml +++ b/bench/Project.toml @@ -6,3 +6,15 @@ JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[compat] +BrainlessLab = "0.2" +CairoMakie = "0.12, 0.13, 0.14, 0.15" +Dates = "1.10" +JLD2 = "0.5" +Random = "1.10" +Statistics = "1.10" +TOML = "1" +Test = "1.10" +julia = "1.10" diff --git a/bench/configs/smoke.toml b/bench/configs/smoke.toml index 2caf900..6b454f6 100644 --- a/bench/configs/smoke.toml +++ b/bench/configs/smoke.toml @@ -1,12 +1,12 @@ -neurons = ["falandays", "falandays_ablated", "compartmental_structured"] -tasks = ["wall", "tracking"] +neurons = ["falandays"] +tasks = ["tracking"] -n_trials = 5 -n_nodes = 60 -ticks = 150 +n_trials = 1 +n_nodes = 12 +ticks = 20 seed_base = 1000 baseline = "falandays" alpha = 0.05 -gifs = true +gifs = false [prep] diff --git a/bin/brainlesslab.jl b/bin/brainlesslab.jl new file mode 100644 index 0000000..1da616b --- /dev/null +++ b/bin/brainlesslab.jl @@ -0,0 +1,79 @@ +#!/usr/bin/env julia + +using BrainlessLab + +function usage(io=stdout) + println(io, "Usage:") + println(io, " julia --project=. bin/brainlesslab.jl check PLAN.toml") + println(io, " julia --project=. bin/brainlesslab.jl run PLAN.toml [--root DIR]") + println(io, " julia --project=. bin/brainlesslab.jl check-experiment PROTOCOL_DIR") + println(io, " julia --project=. bin/brainlesslab.jl run-experiment PROTOCOL_DIR [--root DIR]") +end + +function parse_run_options(args) + root = "records" + index = 1 + while index <= length(args) + args[index] == "--root" || throw(ArgumentError( + "unknown run option $(repr(args[index]))", + )) + index < length(args) || throw(ArgumentError("--root requires a directory")) + root = args[index + 1] + index += 2 + end + return root +end + +function main(args=ARGS) + length(args) >= 2 || begin + usage(stderr) + return 2 + end + command = args[1] + command in ("check", "run", "check-experiment", "run-experiment") || begin + usage(stderr) + return 2 + end + source_path = args[2] + + if command in ("check-experiment", "run-experiment") + isdir(source_path) || throw(ArgumentError( + "experiment protocol directory does not exist: $(source_path)", + )) + experiment = read_experiment(source_path) + if command == "check-experiment" + println("valid experiment: ", experiment.id) + println("version: ", experiment.version) + println("evidence state: ", experiment.evidence_state) + println("operations: ", join(string.(getfield.(experiment.operations, :id)), ", ")) + return 0 + end + root = parse_run_options(args[3:end]) + run = run_experiment(experiment; root=root) + println("experiment record: ", run.directory) + println("operation records: ", join(run.records, ", ")) + return 0 + end + + isfile(source_path) || throw(ArgumentError("plan does not exist: $(source_path)")) + plan = read_plan(source_path) + resolved = resolve(plan, DEFAULT_REGISTRY) + + if command == "check" + println("valid plan: ", plan.id) + println("operation: ", operation_kind(plan)) + println("targets: ", join(string.(getfield.(operation_targets(plan), :id)), ", ")) + println("resolved: ", nameof(typeof(resolved))) + return 0 + end + + root = parse_run_options(args[3:end]) + run = run_operation(plan; root=root) + println("record: ", run.directory) + println("summary: ", summary(run.result)) + return 0 +end + +if abspath(PROGRAM_FILE) == @__FILE__ + exit(main()) +end diff --git a/configs/ci_sweep.toml b/configs/ci_sweep.toml new file mode 100644 index 0000000..60a98bd --- /dev/null +++ b/configs/ci_sweep.toml @@ -0,0 +1,20 @@ +[sweep] +id = "ci_sweep_smoke" +mode = "one_at_a_time" +seeds = [0] +max_cells = 1 +max_rollouts = 1 +threaded = false + +[baseline] +node = "falandays" +task = "tracking" +N = 12 +ticks = 20 +window = 20 + +[axes] +"node.leak" = [0.25] + +[analytics] +measures = ["liveness"] diff --git a/docs/README.md b/docs/README.md index a5adc6a..2895f7a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,37 +1,28 @@ -# Documentation has moved +# BrainlessLab documentation -The BrainlessLab documentation now lives in the **Astro/Starlight docs-and-outputs site** -under [`site/`](../site/), published at . That site is the single -source of truth; the old plain-markdown `docs/*.md` pages have been retired. +The public guide lives under [`site/`](../site/) and is published at +. It is the human-readable account of the current public +interfaces. -Browse it online, or run it locally: +The main entry points are: + +- [Getting started](https://brainless-lab.pages.dev/core/getting-started/) +- [Operations and records](https://brainless-lab.pages.dev/core/operations-records/) +- [Design a study](https://brainless-lab.pages.dev/core/design-study/) +- [Extend the lab](https://brainless-lab.pages.dev/core/extend/) +- [Platform limits](https://brainless-lab.pages.dev/platform-limits/) + +Run the site locally: ```bash cd site bun install -bun run dev # http://localhost:4321 +bun run dev ``` -Recommended entry points: - -- [Getting started](https://brainless-lab.pages.dev/getting-started/) — browser, - agent-assisted, and manual paths; -- [Research workflow](https://brainless-lab.pages.dev/research-workflow/) — controls, - tuning, confirmation, and evidence promotion; -- [Agentic workflow](https://brainless-lab.pages.dev/agentic-workflow/) — safe no/low-code - collaboration; -- [Extending](https://brainless-lab.pages.dev/extending/) — every public extension family; -- [Platform limits](https://brainless-lab.pages.dev/platform-limits/) — current modeling and - inference boundaries. - -Page map (old file → site page): +Use [`WRITING.md`](WRITING.md) when changing repository prose. It defines the maintained +soft-STE profile, British spelling, and preferred platform terms. -| old `docs/` page | site page | -|---|---| -| `onboarding.md` | [Introduction](https://brainless-lab.pages.dev/introduction/) | -| `nodes.md` | [Nodes — overview](https://brainless-lab.pages.dev/nodes/overview/) | -| `tasks.md` | [Environments & Tasks](https://brainless-lab.pages.dev/environments-tasks/) | -| `contracts.md` | [Contracts](https://brainless-lab.pages.dev/contracts/) | -| `receptors-effectors.md` | [Embodiment](https://brainless-lab.pages.dev/receptors-effectors/) | -| `collective.md` | [The collective](https://brainless-lab.pages.dev/collective/) | -| `evolution.md` | [Evolution](https://brainless-lab.pages.dev/evolution/) | +Checked-in plans, experiments, examples, tests, and generated records are executable +sources of truth. Documentation must agree with them, but it must not present a planned +protocol or software-ready capability as scientific evidence. diff --git a/docs/WRITING.md b/docs/WRITING.md new file mode 100644 index 0000000..6f92d58 --- /dev/null +++ b/docs/WRITING.md @@ -0,0 +1,82 @@ +# Writing for BrainlessLab + +Use this guide for README files, the public site, skills, examples, and user-facing error +text. The aim is plain technical writing, not formal ASD-STE100 compliance. + +## Writing profile + +Use a soft STE profile: + +1. Give one main claim or instruction in each sentence. +2. Keep the actor, action, and object close together. +3. Use one preferred term for each technical concept. +4. State a condition before its consequence. +5. Introduce information in the order a reader needs it. +6. Use lists for sequences, alternatives, and sets of three or more items. +7. Remove promotional language, repeated conclusions, and decorative emphasis. + +Aim for 12–25 words per sentence. A longer sentence is acceptable when splitting it would +hide a necessary qualification. Use active voice by default, but keep passive voice when +the method or result matters more than the actor. + +Use British English in repository prose. Keep exact API names and quoted source terms +unchanged. + +## Stable terms + +Use these terms consistently: + +| Term | Meaning | +| --- | --- | +| node | the local neural unit model | +| reservoir | a runtime population of nodes | +| `NodeSpec` | registered node metadata, builder, parameters, and capabilities | +| `TaskSpec` | registered task setup, ports, outcome, anchors, and defaults | +| body | the sensorimotor organisation coupled to a task | +| `InteractionCycle` | neural frames executed within one world step | +| `CompositionSpec` | the complete runtime composition | +| `EvaluationSpec` | the outer trial, seed, reset, and aggregation protocol | +| `EvaluationTarget` | one named composition with one evaluation protocol | +| operation plan | a profile, sweep, ablation, evolution, or benchmark plan | +| `ExperimentSpec` | a versioned scientific protocol over named conditions and operations | +| record | the portable output of one operation | + +Use `simulate` for one in-memory run. Use an operation plan for repeated work. Do not call +`ExperimentSpec` another runner. + +Use “validated on declared reference trajectories” for the tested Falandays conformance +boundary. Do not extend this wording to behavioural or biological equivalence. + +Use “normalised score” only for the task-declared anchor transformation. Do not call it a +common competence scale. Use “evidence state” for planned, exploratory, tuned, frozen, +confirmed, promoted, or retired experiment status. + +## Control claims + +Separate four levels: + +- what the code implements; +- what a test verifies; +- what an experiment observes; +- what the evidence can support. + +Software readiness does not validate a biological interpretation. A complete record does +not make a result confirmed. A selected sweep cell is a development result. A task score +does not establish cognition, general competence, or external validity. + +Avoid vague architecture metaphors when a precise term exists. Use “interface”, “method”, +“component”, “boundary”, “stage”, or the exact type name. Use “contract” only for a +declared interface, validation rule, or scoring definition. + +## Review checklist + +Before merging prose, check: + +- every command, path, type, and field exists; +- public guidance uses the typed registries and current plan schema; +- no archived study route or bespoke experiment runner appears as current guidance; +- uncertainty and evidence status remain visible; +- links use stable routes; +- headings and paragraphs follow the reader's task; +- bold text marks only a genuine warning or definition; +- `git diff --check`, package tests, and the site build pass when applicable. diff --git a/examples/embodiments/README.md b/examples/embodiments/README.md index 95a5d2d..fe8152c 100644 --- a/examples/embodiments/README.md +++ b/examples/embodiments/README.md @@ -77,7 +77,7 @@ configuration, replay, and visualization support. The setup accepts the `seed`, `object_world_quickstart.jl` deliberately shows the lower-level alternative: direct `ObjectWorld` composition exposes `Ensemble` + `Recorder`. Add a `TaskSpec` when an experiment -needs the standardized `SimResult`, scoring, or rendering surface. +needs the standard `SimResult`, scoring, or rendering APIs. The current world supports toroidal or walled 2-D arenas, fixed agent populations, static circular objects, named analytic fields, spectral appearance/illumination, and one diff --git a/examples/shoal_forage_quickstart.jl b/examples/shoal_forage_quickstart.jl new file mode 100644 index 0000000..f0289c9 --- /dev/null +++ b/examples/shoal_forage_quickstart.jl @@ -0,0 +1,39 @@ +using BrainlessLab + +""" +Run a small shoal-foraging simulation that exercises sector vision and +antagonistic turning. + +This example is a component smoke test, not an evidence-producing experiment. +""" +function run_shoal_forage_quickstart(; + ticks::Integer=25, + seed::Integer=23, + n_nodes::Integer=40, + n_agents::Integer=4, +) + return simulate( + :shoal_forage; + node=:falandays, + ticks=Int(ticks), + seed=Int(seed), + n_nodes=Int(n_nodes), + n_agents=Int(n_agents), + task_kwargs=( + block=2, + association_need=true, + conspecific_mode=:veridical, + conspecific_range=5.0, + ), + record=(:needs, :poses, :interactions, :rate), + ) +end + +if abspath(PROGRAM_FILE) == @__FILE__ + sim = run_shoal_forage_quickstart() + outcome = task_outcome(sim) + println( + "shoal forage $(outcome.key): raw=$(round(outcome.raw; digits=3)), " * + "normalized=$(round(outcome.normalized; digits=3))", + ) +end diff --git a/examples/templates/new_project/Project.toml b/examples/templates/new_project/Project.toml index 15b757c..3b0d831 100644 --- a/examples/templates/new_project/Project.toml +++ b/examples/templates/new_project/Project.toml @@ -6,7 +6,10 @@ version = "0.1.0" [deps] BrainlessLab = "d12add44-1e3e-4161-9a99-c2121a2f0f38" CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" [compat] +BrainlessLab = "0.2" CairoMakie = "0.12, 0.13, 0.14, 0.15" +Random = "1.10" julia = "1.10" diff --git a/examples/templates/new_project/README.md b/examples/templates/new_project/README.md index d648afe..2bf2fa4 100644 --- a/examples/templates/new_project/README.md +++ b/examples/templates/new_project/README.md @@ -8,15 +8,16 @@ observations, actions, metrics, controls, and calibration before editing. ## Files -- `my_node.jl` defines `MyNode <: Reservoir`, a leaky homeostatic reservoir with online recurrent-weight and target adaptation, then registers it as `:my_node`. -- `my_task.jl` defines `MyTrackingEnv <: TaskWorld`, wraps it in a `TaskSpec`, then registers it as `:my_task`. +- `my_node.jl` defines `MyNode <: Reservoir`, then registers a typed `NodeSpec` with parameters, capabilities, and default sweep/evolution sets. +- `my_task.jl` defines `MyTrackingEnv <: TaskWorld`, wraps it in a `TaskSpec`, then registers the task in `DEFAULT_REGISTRY`. - `my_metric.jl` registers a small metric function as `:final_error_abs`, requested by symbol in `run.jl`. -- `run.jl` includes those three files, runs `simulate(:my_task; node=:my_node)`, prints metrics, and saves a Makie figure. -- `config.toml` is a benchmark config snippet that follows `bench/configs/core.toml`. +- `run.jl` includes those files, runs one explicit `CompositionSpec`, prints metrics, and saves a Makie figure. +- `config.toml` is a version-one `ProfilePlan` using the same node, task, and evaluation contracts as every built-in operation. +- `run_plan.jl` loads the extension, executes `config.toml`, and writes the standard portable record. ## Setup -From this directory: +From this directory while the template remains inside a BrainlessLab checkout: ```bash julia --project=. -e 'using Pkg; Pkg.develop(path="../../.."); Pkg.instantiate()' @@ -28,7 +29,16 @@ Run the example with this template environment: julia --project=. run.jl ``` -The template `Project.toml` depends on `BrainlessLab` and `CairoMakie`. `Pkg.develop(path="../../..")` points the template environment at the local framework checkout, so you can copy this directory into your own project and keep using the framework as a dependency instead of editing `src/`. +The template `Project.toml` depends on `BrainlessLab` and `CairoMakie`. +`Pkg.develop(path="../../..")` points this in-repository copy at the local framework +checkout. After copying the template elsewhere, install the public package source instead: + +```bash +julia --project=. -e 'using Pkg; Pkg.add(url="https://github.com/btgaskin/brainless-lab"); Pkg.instantiate()' +``` + +Once BrainlessLab is registered in Julia General, `Pkg.add("BrainlessLab")` becomes the +normal installation path. ## First Result @@ -41,6 +51,15 @@ Artifacts: - Printed task metrics, including `score`, `mean_abs_error`, `final_error`, liveness, and the registered custom `final_error_abs`. - `output/my_task_my_node_visualize.png`, containing spike raster, population firing rate, and spike-pattern drift panels. +Then run the repeatable profile: + +```bash +julia --project=. run_plan.jl config.toml records +``` + +Open `records//report/index.html`, or inspect the authoritative CSV tables and +the checksums in `record.toml`. + ## Node Contract A high-level node registered for `simulate` must be callable as: @@ -61,7 +80,13 @@ n_receptors(node) n_effectors(node) ``` -`my_node.jl` also implements `snapshot_state` and `load_state!` to show the parameter/state split. `MyNodeParams` is static configuration; `acts`, `targets`, `spikes`, `errors`, and `wmat` are rollout state. The registration declares `genome_type=MyNodeParams`, so `rollout` and `evolve` can derive the genome dimension through `paramdim`, `pack_params`, and `unpack_params`. +`my_node.jl` also implements `snapshot_state` and `load_state!` to show the parameter/state split. `MyNodeParams` is static configuration; `acts`, `targets`, `spikes`, `errors`, and `wmat` are rollout state. + +The public `NodeSpec` builder receives a `NodeBuildContext` and the fully resolved parameter +dictionary. The context supplies node count, body ports, named seeds, and any receptor +profile. `ParameterSpec` declares validation, default sweep values, evolution bounds, and +ownership. Here `link_p` is reservoir-owned connectivity while node count remains part of +the composition. Important Julia gotcha: when extending BrainlessLab generics from outside the package, import the names you extend: @@ -69,7 +94,8 @@ Important Julia gotcha: when extending BrainlessLab generics from outside the pa import BrainlessLab: step!, effectors, n_nodes, n_receptors, n_effectors, reset! ``` -Do not rely on `using BrainlessLab` for method extension. Without `import`, Julia may create or call the wrong method surface, and `simulate` will not see your node contract. +Do not rely on `using BrainlessLab` for method extension. Without `import`, Julia may +create or call the wrong generic, and `simulate` will not see your node implementation. ## Task Contract @@ -109,31 +135,16 @@ register_metric!(:final_error_abs, final_error_abs) In `run.jl`, the simulation requests the metric with `metrics=[:final_error_abs]`; the high-level runner resolves the symbol and appends the derived value to `sim.metrics`. -## Benchmark - -`config.toml` follows the schema in `../../../bench/configs/core.toml`: - -```toml -neurons = ["falandays_base", "my_node"] -tasks = ["my_task"] -n_trials = 5 -n_nodes = 80 -ticks = 300 -baseline = "falandays_base" - -[prep] -my_node = "untrained" -``` +## Operations -The benchmark runner loads registered BrainlessLab symbols, then uses the node's declared `genome_type` to stamp parameters through the public `NodeModel` contract. No framework fork or private-symbol bridge is needed. - -From the repo root, after setting up `bench/` as described in `../../../bench/README.md`, run: - -```bash -julia --project=bench -e 'include("examples/templates/new_project/my_node.jl"); include("examples/templates/new_project/my_task.jl"); include("bench/Benchmark.jl"); using .Benchmark; cfg = Benchmark.read_bench_config("examples/templates/new_project/config.toml"); result = Benchmark.run_benchmark(cfg); println(result.dir); Benchmark.print_short_summary(result.summaries)' -``` +`config.toml` uses the single `brainlesslab-plan` schema. Change `operation` and its final +section to profile, sweep, ablate, evolve, or benchmark. The target composition and +evaluation section stay the same. -Benchmark artifacts are written under `bench/runs/` and include resolved config, manifest, raw trial CSV, summary CSV, stats JSON, report Markdown, plots, and per-cell figures. +The node's `:sweep` and `:evolve` parameter sets provide defaults. A plan can instead name +explicit sweep axes or another registered parameter set. Benchmark conditions reference +registered nodes and tasks but remain task-specific; registering a component does not +automatically qualify it for a benchmark. ## Make It Your Own @@ -142,16 +153,17 @@ Benchmark artifacts are written under `bench/runs/` and include resolved config, 3. Keep receptor and effector counts aligned: for a vector task, `TaskSpec.n_receptors` must match `sense(env)`; for a composed body, use `portspec(body)` as the source of truth. 4. Keep online plasticity inside `step!`; no evolution is needed for a Falandays-style first experiment. 5. Add task-specific metrics to `metrics(env, window)` first. Use `register_metric!` for reusable analysis functions that can be resolved by symbol. -6. Start with `simulate` and `visualize`; move to `bench/` only after the single run behaves sensibly. +6. Start with `simulate` and `visualize`; move to `ProfilePlan`, `SweepPlan`, or + `BenchmarkPlan` only after the single composition behaves sensibly. ## Read More The docs live in the Astro/Starlight site (, or `cd site && bun run dev`): -- [Nodes — overview](https://brainless-lab.pages.dev/nodes/overview/) -- [Environments & Tasks](https://brainless-lab.pages.dev/environments-tasks/) -- [Embodiment](https://brainless-lab.pages.dev/receptors-effectors/) -- [Extending it](https://brainless-lab.pages.dev/extending/) -- [Research workflow](https://brainless-lab.pages.dev/research-workflow/) +- [Reservoirs and node models](https://brainless-lab.pages.dev/core/reservoirs/) +- [Worlds, tasks and populations](https://brainless-lab.pages.dev/core/worlds-tasks-populations/) +- [Embodiment](https://brainless-lab.pages.dev/core/embodiment/) +- [Extend the lab](https://brainless-lab.pages.dev/core/extend/) +- [Design a study](https://brainless-lab.pages.dev/core/design-study/) - [Agentic workflow](https://brainless-lab.pages.dev/agentic-workflow/) -- `../../../bench/README.md` +- [Operations and records](https://brainless-lab.pages.dev/core/operations-records/) diff --git a/examples/templates/new_project/config.toml b/examples/templates/new_project/config.toml index 5ddf654..edb46e5 100644 --- a/examples/templates/new_project/config.toml +++ b/examples/templates/new_project/config.toml @@ -1,18 +1,28 @@ -# Benchmark config snippet following bench/configs/core.toml. -# Load my_node.jl and my_task.jl before running the benchmark so the symbols are -# registered in BrainlessLab. +format = "brainlesslab-plan" +format_version = 1 +operation = "profile" +id = "my_project_profile" -neurons = ["falandays", "my_node"] -tasks = ["my_task"] +[[targets]] +id = "my_task" -n_trials = 5 +[targets.composition] +id = "my_project" +node = "my_node" +task = "my_task" n_nodes = 80 -ticks = 300 -seed_base = 2000 -baseline = "falandays" -alpha = 0.05 -gifs = false -[prep] -falandays = "untrained" -my_node = "untrained" +[targets.evaluation] +blocks = 2 +trials_per_block = 2 +horizon = 300 +warmup = 50 +construction_scope = "trial" +reset = "full" +root_seed = 3001 +aggregate = "mean" + +[profile] +target = "my_task" +analyses = [] +record_every = 1 diff --git a/examples/templates/new_project/my_node.jl b/examples/templates/new_project/my_node.jl index a0145ad..250312d 100644 --- a/examples/templates/new_project/my_node.jl +++ b/examples/templates/new_project/my_node.jl @@ -4,7 +4,8 @@ import BrainlessLab import BrainlessLab: NodeModel, Reservoir import BrainlessLab: step!, effectors, n_nodes, n_receptors, n_effectors, reset! import BrainlessLab: snapshot_state, load_state!, pack_params, unpack_params, paramdim -import BrainlessLab: plasticity, OnlinePlasticity, register_node! +import BrainlessLab: plasticity, OnlinePlasticity +import BrainlessLab: NodeBuildContext, NodeSpec, ParameterSpec, DEFAULT_REGISTRY, register! Base.@kwdef struct MyNodeParams <: NodeModel leak::Float64 = 0.25 @@ -275,4 +276,62 @@ function load_state!(r::MyNode, state) return r end -register_node!(:my_node, MyNode; genome_type=MyNodeParams) +function build_my_node(context::NodeBuildContext, values) + params = MyNodeParams( + leak=values[:leak], + lrate_wmat=values[:lrate_wmat], + lrate_targ=values[:lrate_targ], + threshold_mult=values[:threshold_mult], + target_floor=values[:target_floor], + input_gain=values[:input_gain], + recurrent_scale=values[:recurrent_scale], + weight_limit=values[:weight_limit], + learn_on=values[:learn_on], + ) + seed = Int(mod(context.seeds.topology, UInt64(typemax(Int)))) + return MyNode( + context.n_nodes, + n_receptors(context.ports), + n_effectors(context.ports); + seed=seed, + params=params, + link_p=values[:link_p], + ) +end + +const MY_NODE_SPEC = NodeSpec( + :my_node, + build_my_node; + genome_type=MyNodeParams, + stability=:experimental, + tags=(:experimental,), + capabilities=(:online_plasticity, :recurrent_weights, :homeostatic_target), + parameters=( + ParameterSpec(:leak, 0.25; sweep=(0.1, 0.25, 0.5), evolve=(lower=0.0, upper=0.95)), + ParameterSpec(:lrate_wmat, 0.04; sweep=(0.01, 0.04, 0.1), evolve=(lower=1.0e-4, upper=1.0, scale=:log)), + ParameterSpec(:lrate_targ, 0.01; evolve=(lower=1.0e-4, upper=0.5, scale=:log)), + ParameterSpec(:threshold_mult, 2.0; evolve=(lower=0.1, upper=5.0)), + ParameterSpec(:target_floor, 1.0; evolve=(lower=0.01, upper=3.0, scale=:log)), + ParameterSpec(:input_gain, 1.4; evolve=(lower=0.0, upper=4.0)), + ParameterSpec(:recurrent_scale, 0.7; evolve=(lower=0.0, upper=3.0)), + ParameterSpec(:weight_limit, 3.0; evolve=(lower=0.1, upper=10.0, scale=:log)), + ParameterSpec(:learn_on, true), + ParameterSpec(:link_p, 0.18; owner=:reservoir, sweep=(0.1, 0.18, 0.3), evolve=(lower=0.01, upper=0.8)), + ), + parameter_sets=Dict( + :sweep => (:leak, :lrate_wmat), + :evolve => ( + :leak, + :lrate_wmat, + :lrate_targ, + :threshold_mult, + :target_floor, + :input_gain, + :recurrent_scale, + :weight_limit, + ), + :connectivity => (:link_p,), + ), +) + +register!(DEFAULT_REGISTRY, MY_NODE_SPEC) diff --git a/examples/templates/new_project/my_task.jl b/examples/templates/new_project/my_task.jl index a958937..943c34c 100644 --- a/examples/templates/new_project/my_task.jl +++ b/examples/templates/new_project/my_task.jl @@ -1,9 +1,9 @@ using Random -import BrainlessLab: TaskSpec, TaskWorld +import BrainlessLab: TaskSpec, TaskWorld, analytic import BrainlessLab: sense, step!, reset!, metrics import BrainlessLab: n_receptors, n_effectors, default_ticks, default_window -import BrainlessLab: register_task! +import BrainlessLab: DEFAULT_REGISTRY, register! mutable struct MyTrackingEnv{R<:AbstractRNG} <: TaskWorld rng::R @@ -130,9 +130,9 @@ const MY_TASK = TaskSpec( MyTrackingEnv; default_ticks=default_ticks(MyTrackingEnv), default_window=default_window(MyTrackingEnv), - score_floor=0.0, - score_ceiling=1.0, + floor=analytic(0.0; note="minimum score under this example contract"), + ceiling=analytic(1.0; note="zero tracking error"), score_key=:score, ) -register_task!(:my_task, MY_TASK) +register!(DEFAULT_REGISTRY, MY_TASK) diff --git a/examples/templates/new_project/run.jl b/examples/templates/new_project/run.jl index 52754d4..dfcc9f9 100644 --- a/examples/templates/new_project/run.jl +++ b/examples/templates/new_project/run.jl @@ -60,11 +60,14 @@ function main(args) mkpath(opts[:out]) sim = simulate( - :my_task; - node=:my_node, + CompositionSpec( + :my_project, + :my_node, + :my_task; + n_nodes=opts[:n_nodes], + ); ticks=opts[:ticks], seed=opts[:seed], - n_nodes=opts[:n_nodes], record=RECORD, metrics=[:final_error_abs], ) diff --git a/examples/templates/new_project/run_plan.jl b/examples/templates/new_project/run_plan.jl new file mode 100644 index 0000000..be1a8eb --- /dev/null +++ b/examples/templates/new_project/run_plan.jl @@ -0,0 +1,14 @@ +#!/usr/bin/env julia + +using BrainlessLab + +include("my_node.jl") +include("my_task.jl") +include("my_metric.jl") + +plan_path = isempty(ARGS) ? joinpath(@__DIR__, "config.toml") : ARGS[1] +root = length(ARGS) >= 2 ? ARGS[2] : joinpath(@__DIR__, "records") +plan = read_plan(plan_path) +run = run_operation(plan; root=root) +println("record: ", run.directory) +println("summary: ", summary(run.result)) diff --git a/experiments/README.md b/experiments/README.md index 3326778..ca5110b 100644 --- a/experiments/README.md +++ b/experiments/README.md @@ -1,125 +1,66 @@ -# experiments/ +# Versioned experiments -The multi-run protocol surface. It complements one-run simulation, task calibration, -profiling, sweeps, ablations, benchmarks, and evolution; see the site's Tooling page for the -capability map. `experiments/run.jl` uses the **root project**. +This directory contains reusable scientific protocols written as `ExperimentSpec` bundles. +An experiment gives a stable identity and version to: -It holds composed, reproducible experiment protocols that are **not part of the -core library** — core stays lean (the settled Falandays baseline, the validated -per-run measures). This is for studies that combine those parts in a specific way -we want to run *regularly and replicably*, without promoting each one into core. +- the research question; +- named `EvaluationTarget` conditions; +- one or more ordinary operation plans; +- the current evidence state; +- known limitations and descriptive metadata. -> Note: `run_experiment` is a **core** name (`src/run/Artifacts.jl` — run one -> `RunConfig` and write reproducible artifacts). This tool deliberately does not -> reuse it; experiments are invoked as `experiments/run.jl `. +`ExperimentSpec` is not a second execution path. Each contained profile, sweep, ablation, +evolution, or benchmark plan uses the same validator, executor, and record writer as a +standalone plan. -Rule of thumb: a question answered by **one measure over one run** belongs in the -analysis registry. A **protocol over many runs** (sweep a schedule, contrast -conditions, detect a knee) that isn't general enough to be a core CLI tool belongs -here. +## Layout + +```text +experiments/ +└── examples/ + └── falandays-cross-task-smoke/ + ├── experiment.toml + └── plans/ + ├── 01-evolve_tracking_test_pong_example.toml + └── 02-evolve_pong_test_tracking_example.toml +``` -## Run by name +The reciprocal Falandays example is a small planned smoke protocol. It demonstrates how to +evolve parameters on Tracking and evaluate the selected champion on Pong, then reverse the +direction. Its small budgets are for validation only and do not support a performance +claim. -Experiments are registered by symbol — the same pattern core uses for -nodes/tasks/analyses — but the registry lives here, not in core. One entrypoint: +## Validate and run + +Validate the whole bundle without simulation: ```bash -julia --project=. experiments/run.jl --list # discover -julia --project=. experiments/run.jl freeze_onset # run with defaults -julia --project=. experiments/run.jl freeze_onset seeds=0:9 tasks=tracking,pong window=600 -julia -t 4 --project=. experiments/run.jl shoal_vision_sweep # 44-run exploratory pilot -julia -t 4 --project=. experiments/run.jl shoal_sensitivity_screen # 70-run OFAT screen +julia --project=. bin/brainlesslab.jl check-experiment \ + experiments/examples/falandays-cross-task-smoke ``` -`key=val` values parse as Int (`600`), Float (`0.5`), range (`0:9`), comma-list -(`tracking,pong` → Symbols; `1,2,4,8` → Ints), else a Symbol. Each run writes -`experiments/runs//_/` with `results.json` + `manifest.txt` -(node, tasks, ticks, seeds, git SHA, timestamp). That is a traceable exploratory run, not -an exact-reproduction or promoted-evidence guarantee. - -## Layout +Run each contained operation and write standard records: +```bash +julia -t auto --project=. bin/brainlesslab.jl run-experiment \ + experiments/examples/falandays-cross-task-smoke --root experiment-records ``` -experiments/ - run.jl # CLI entrypoint: registers all experiments, dispatches by name - registry.jl # ExpRegistry — register/resolve/list experiments by symbol - harness.jl # ExpHarness — reusable building blocks (public-API only) - freeze_onset.jl # experiment (:freeze_onset) - tracking_param_sweep.jl # experiment (:tracking_param_sweep) - tracking_leak_lrate_factorial.jl # experiment (:tracking_leak_lrate_factorial) - shoal_vision_sweep.jl # experiment (:shoal_vision_sweep) - shoal_vision_sweep/protocol.toml # full, pilot, and operating-point sensitivity profiles - figures/ # CairoMakie figure scripts (own env; read a run's results.json) - runs/ # scratch/exploratory outputs (git-ignored) - results/ # curated evidence bundles, committed & traceable to a study/figure -``` -**Data retention.** Exploratory runs land in the git-ignored `runs/`. Committing a directory -under `results/` makes it reviewable; it does not by itself promote the scientific result. -Large raw data may live in an external archive, but the immutable URI and checksum belong in -the committed bundle. - -## Evidence states and promotion - -Every study page declares `exploratory`, `tuned`, `frozen`, `confirmed`, `promoted`, or -`retired`. `frozen` is a fixed protocol whose sealed outcomes remain unopened; `confirmed` -means the frozen protocol has been executed on those blocks. -Development outputs, selected winners, and representative runs remain exploratory unless a -frozen protocol is evaluated on untouched randomized blocks. - -A promoted bundle requires: - -- frozen protocol and analysis plan; -- resolved config and selected parameters; -- full git SHA plus dirty-worktree status; -- Julia version and Project/Manifest hashes; -- named seed ledger with disjoint-stage and overlap checks; -- per-block results and declared paired contrasts; -- inferential unit, exclusions, and dead/failed-run policy; -- analysis-code version or hash; -- schema-versioned summary JSON; -- figure inputs and representative-selection rule; -- checksums for every promoted artifact; -- immutable external-archive URI and hash when raw data is not committed. - -Do not hardcode numerical prose from a scratch run. Site figures and claims should read from -the promoted summary. Opening sealed data and then changing a parameter, endpoint, exclusion, -or analysis restarts the evidence cycle. - -`harness.jl` composes only the **public** `BrainlessLab` API (`simulate`, -`task_outcome`, …), so experiments survive core refactors: - -- `freeze_sweep(task; freeze_ticks, window, seeds, verb)` — normalized score + rate - vs. the tick an intervention is applied, with a matched full-learning control. -- `onset_tick(freeze_ticks, fz_mean)` — the knee of a score-vs-tick curve (a - sweep-level readout, deliberately *not* a `register_analysis!`, which is per-run). -- `run_dir` / `write_text` / `git_sha` / `stamp` — a traceable run directory. - -## Adding an experiment - -1. Write `experiments/.jl` that defines `run_(; kwargs...)::String` - (does the work, writes a run dir via `run_dir`, returns its path) and registers - it: `register_experiment!(:, run_; description="…")`. -2. Add `include(joinpath(@__DIR__, ".jl"))` to `run.jl`. - -Keep it public-API-only; reaching into `BrainlessLab` internals is a signal the -piece wants to be a registered analysis or a core feature instead. - -Before adding a protocol, follow the site's Research workflow: calibrate the task, choose -controls that match the claim, separate development and confirmation seeds, name the -independent block, and plan power prospectively from a fresh variance pilot. - -Natural next studies on this seam: -- **What sets the onset tick** — sweep `freeze_tick × lrate_targ|threshold_mult` - and read `onset_tick` as a function of the homeostatic rate. -- **Which plasticity carries the load** — `freeze_sweep(...; verb=:clamp_target)` - (targets only) vs `:freeze_plasticity` (weights + targets). - -## Physical composition - -New ecological experiments that need independently composed physical cameras, -field probes, actuators, dynamics, and physiology should start from the public -`ObjectWorld` surface. The copy-ready examples under `examples/embodiments/` -show both levels: `object_world_quickstart.jl` exposes the live `Ensemble` and -`Recorder`, while `object_world_task.jl` adds a `TaskSpec` and returns the -standardized `SimResult`. +Use `write_experiment(directory, spec)` when publishing a new bundle. It validates the +conditions and writes `experiment.toml` plus one strict plan file for each operation. +`read_experiment(directory)` rejects disagreements between repeated condition definitions. + +## Evidence rules + +The allowed evidence states are `planned`, `exploratory`, `tuned`, `frozen`, `confirmed`, +`promoted`, and `retired`. Changing the state does not change the data. It records how the +protocol and results may be interpreted. + +Create a new version when a scientific change alters the question, conditions, endpoint, +seed policy, exclusions, or operation. Do not edit an executed version in place. Store +operation outputs under a records root or an immutable external archive; do not copy +numerical claims into this directory by hand. + +The archived bespoke experiment runner is retained under +`archive/2026-07-legacy-research/experiments/` for historical reproduction. It is not part +of the current public workflow. diff --git a/experiments/examples/falandays-cross-task-smoke/experiment.toml b/experiments/examples/falandays-cross-task-smoke/experiment.toml new file mode 100644 index 0000000..53d5402 --- /dev/null +++ b/experiments/examples/falandays-cross-task-smoke/experiment.toml @@ -0,0 +1,20 @@ +conditions = ["tracking_development", "tracking_confirmation", "pong_heldout", "pong_development", "pong_confirmation", "tracking_heldout"] +evidence_state = "planned" +format = "brainlesslab-experiment" +format_version = 1 +id = "falandays_cross_task_smoke" +limitations = ["Smoke-test budgets only; the generated outputs are not research evidence.", "The operations evolve registered Falandays parameters while node structure, bodies, receptors, and effectors remain fixed.", "Any later scientific use requires a frozen protocol, larger development budgets, and adequately powered held-out evaluation."] +question = "Can the versioned experiment path evolve Falandays parameters on Tracking or Pong, confirm performance on fresh seeds, and evaluate the selected parameters on the other task?" +title = "Reciprocal Falandays parameter evolution smoke experiment" +version = "1.0.0" + +[metadata] +programme = "initial_core_benchmark" +role = "workflow_smoke" + +[[operations]] +id = "evolve_tracking_test_pong_example" +plan = "01-evolve_tracking_test_pong_example.toml" +[[operations]] +id = "evolve_pong_test_tracking_example" +plan = "02-evolve_pong_test_tracking_example.toml" diff --git a/experiments/examples/falandays-cross-task-smoke/plans/01-evolve_tracking_test_pong_example.toml b/experiments/examples/falandays-cross-task-smoke/plans/01-evolve_tracking_test_pong_example.toml new file mode 100644 index 0000000..a869296 --- /dev/null +++ b/experiments/examples/falandays-cross-task-smoke/plans/01-evolve_tracking_test_pong_example.toml @@ -0,0 +1,99 @@ +format = "brainlesslab-plan" +format_version = 1 +id = "evolve_tracking_test_pong_example" +operation = "evolve" + +[evolve] +generations = 2 +heldout = ["tracking_confirmation", "pong_heldout"] +objective = "normalized_score" +optimizer = "sepcma" +parameter_set = "evolve" +popsize = 6 +sigma0 = 0.5 +training = "tracking_development" + +[[targets]] +id = "tracking_development" + + [targets.composition] + id = "falandays_tracking_evolution" + n_nodes = 200 + node = "falandays" + task = "tracking" + + [targets.composition.parameters] + input_weight = 0.75 + lrate_targ = 0.01 + lrate_wmat = 1.0 + rectify = false + repair_masks = false + topology = "bernoulli" + weight_init_mode = "excitatory" + + [targets.evaluation] + aggregate = "mean" + blocks = 1 + construction_scope = "trial" + horizon = 240 + reset = "full" + root_seed = 0x0579 + streams = ["topology", "node_state", "world", "body", "task", "mechanism"] + trials_per_block = 2 + warmup = 40 +[[targets]] +id = "tracking_confirmation" + + [targets.composition] + id = "falandays_tracking_confirmation" + n_nodes = 200 + node = "falandays" + task = "tracking" + + [targets.composition.parameters] + input_weight = 0.75 + lrate_targ = 0.01 + lrate_wmat = 1.0 + rectify = false + repair_masks = false + topology = "bernoulli" + weight_init_mode = "excitatory" + + [targets.evaluation] + aggregate = "mean" + blocks = 1 + construction_scope = "trial" + horizon = 240 + reset = "full" + root_seed = 0x0d49 + streams = ["topology", "node_state", "world", "body", "task", "mechanism"] + trials_per_block = 2 + warmup = 40 +[[targets]] +id = "pong_heldout" + + [targets.composition] + id = "falandays_pong_heldout" + n_nodes = 500 + node = "falandays" + task = "pong" + + [targets.composition.parameters] + input_weight = 2.75 + lrate_targ = 0.1 + lrate_wmat = 1.0 + rectify = false + repair_masks = false + topology = "bernoulli" + weight_init_mode = "pong_mixed" + + [targets.evaluation] + aggregate = "mean" + blocks = 1 + construction_scope = "trial" + horizon = 400 + reset = "full" + root_seed = 0x0961 + streams = ["topology", "node_state", "world", "body", "task", "mechanism"] + trials_per_block = 2 + warmup = 40 diff --git a/experiments/examples/falandays-cross-task-smoke/plans/02-evolve_pong_test_tracking_example.toml b/experiments/examples/falandays-cross-task-smoke/plans/02-evolve_pong_test_tracking_example.toml new file mode 100644 index 0000000..d02d6db --- /dev/null +++ b/experiments/examples/falandays-cross-task-smoke/plans/02-evolve_pong_test_tracking_example.toml @@ -0,0 +1,99 @@ +format = "brainlesslab-plan" +format_version = 1 +id = "evolve_pong_test_tracking_example" +operation = "evolve" + +[evolve] +generations = 2 +heldout = ["pong_confirmation", "tracking_heldout"] +objective = "normalized_score" +optimizer = "sepcma" +parameter_set = "evolve" +popsize = 6 +sigma0 = 0.5 +training = "pong_development" + +[[targets]] +id = "pong_development" + + [targets.composition] + id = "falandays_pong_evolution" + n_nodes = 500 + node = "falandays" + task = "pong" + + [targets.composition.parameters] + input_weight = 2.75 + lrate_targ = 0.1 + lrate_wmat = 1.0 + rectify = false + repair_masks = false + topology = "bernoulli" + weight_init_mode = "pong_mixed" + + [targets.evaluation] + aggregate = "mean" + blocks = 1 + construction_scope = "trial" + horizon = 400 + reset = "full" + root_seed = 0x0641 + streams = ["topology", "node_state", "world", "body", "task", "mechanism"] + trials_per_block = 2 + warmup = 40 +[[targets]] +id = "pong_confirmation" + + [targets.composition] + id = "falandays_pong_confirmation" + n_nodes = 500 + node = "falandays" + task = "pong" + + [targets.composition.parameters] + input_weight = 2.75 + lrate_targ = 0.1 + lrate_wmat = 1.0 + rectify = false + repair_masks = false + topology = "bernoulli" + weight_init_mode = "pong_mixed" + + [targets.evaluation] + aggregate = "mean" + blocks = 1 + construction_scope = "trial" + horizon = 400 + reset = "full" + root_seed = 0x0e11 + streams = ["topology", "node_state", "world", "body", "task", "mechanism"] + trials_per_block = 2 + warmup = 40 +[[targets]] +id = "tracking_heldout" + + [targets.composition] + id = "falandays_tracking_heldout" + n_nodes = 200 + node = "falandays" + task = "tracking" + + [targets.composition.parameters] + input_weight = 0.75 + lrate_targ = 0.01 + lrate_wmat = 1.0 + rectify = false + repair_masks = false + topology = "bernoulli" + weight_init_mode = "excitatory" + + [targets.evaluation] + aggregate = "mean" + blocks = 1 + construction_scope = "trial" + horizon = 240 + reset = "full" + root_seed = 0x0a29 + streams = ["topology", "node_state", "world", "body", "task", "mechanism"] + trials_per_block = 2 + warmup = 40 diff --git a/ext/BrainlessLabMakieExt.jl b/ext/BrainlessLabMakieExt.jl index 2d7d2b6..dfb54b1 100644 --- a/ext/BrainlessLabMakieExt.jl +++ b/ext/BrainlessLabMakieExt.jl @@ -895,7 +895,8 @@ function _draw_scene_frame!(ax, s, f, nt) color=_TEAL, linewidth=4) # pole Makie.scatter!(ax, [s.x + L * sin(s.theta)], [L * cos(s.theta)]; markersize=12, color=_TEAL, strokecolor=_PAPER, strokewidth=0.8) - ax.title = "cartpole tick $f/$nt θ=$(round(rad2deg(s.theta); digits=1))°" + level = hasproperty(s, :level) ? " · $(s.level)" : "" + ax.title = "cartpole$(level) tick $f/$nt θ=$(round(rad2deg(s.theta); digits=1))°" else ax.title = "tick $f/$nt" end diff --git a/plans/README.md b/plans/README.md new file mode 100644 index 0000000..7134f69 --- /dev/null +++ b/plans/README.md @@ -0,0 +1,31 @@ +# Operation plans + +This directory contains strict `brainlesslab-plan` TOML files. Each plan combines one or +more `EvaluationTarget`s with one research operation: + +```text +CompositionSpec + EvaluationSpec + → EvaluationTarget + → ProfilePlan | SweepPlan | AblationPlan | EvolutionPlan | BenchmarkPlan + → record +``` + +Validate a plan without simulation: + +```bash +julia --project=. bin/brainlesslab.jl check plans/examples/profile_tracking.toml +``` + +Run it and write a portable record: + +```bash +julia -t auto --project=. bin/brainlesslab.jl run \ + plans/examples/profile_tracking.toml --root records +``` + +Files under `plans/examples/` are small executable checks. They demonstrate plan syntax +and validation, not benchmark evidence. + +A versioned scientific protocol belongs under [`../experiments/`](../experiments/). +`ExperimentSpec` names its conditions and refers to ordinary operation plans, so the +experiment and standalone paths use the same executor and record format. diff --git a/plans/examples/ablate_tracking.toml b/plans/examples/ablate_tracking.toml new file mode 100644 index 0000000..c1f7230 --- /dev/null +++ b/plans/examples/ablate_tracking.toml @@ -0,0 +1,25 @@ +format = "brainlesslab-plan" +format_version = 1 +operation = "ablate" +id = "ablate_tracking_example" + +[[targets]] +id = "tracking" + +[targets.composition] +id = "falandays_tracking_ablation" +preset = "falandays_tracking" + +[targets.evaluation] +blocks = 1 +trials_per_block = 2 +horizon = 120 +warmup = 20 +construction_scope = "trial" +reset = "full" +root_seed = 1301 +aggregate = "mean" + +[ablate] +target = "tracking" +ablations = ["freeze_plasticity", "clamp_target"] diff --git a/plans/examples/benchmark_core.toml b/plans/examples/benchmark_core.toml new file mode 100644 index 0000000..5de9eef --- /dev/null +++ b/plans/examples/benchmark_core.toml @@ -0,0 +1,80 @@ +format = "brainlesslab-plan" +format_version = 1 +operation = "benchmark" +id = "core_benchmark_example" + +[[targets]] +id = "tracking_falandays" +[targets.composition] +id = "tracking_falandays" +preset = "falandays_tracking" +[targets.evaluation] +blocks = 2 +trials_per_block = 1 +horizon = 120 +warmup = 20 +construction_scope = "trial" +reset = "full" +root_seed = 1501 +aggregate = "mean" + +[[targets]] +id = "tracking_random" +[targets.composition] +id = "tracking_random" +node = "null_random" +task = "tracking" +n_nodes = 200 +[targets.evaluation] +blocks = 2 +trials_per_block = 1 +horizon = 120 +warmup = 20 +construction_scope = "trial" +reset = "full" +root_seed = 1501 +aggregate = "mean" + +[[targets]] +id = "pong_falandays" +[targets.composition] +id = "pong_falandays" +preset = "falandays_pong" +[targets.evaluation] +blocks = 2 +trials_per_block = 1 +horizon = 400 +warmup = 40 +construction_scope = "trial" +reset = "full" +root_seed = 2501 +aggregate = "mean" + +[[targets]] +id = "pong_random" +[targets.composition] +id = "pong_random" +node = "null_random" +task = "pong" +n_nodes = 500 +[targets.evaluation] +blocks = 2 +trials_per_block = 1 +horizon = 400 +warmup = 40 +construction_scope = "trial" +reset = "full" +root_seed = 2501 +aggregate = "mean" + +[benchmark] + +[[benchmark.cases]] +id = "tracking" +conditions = ["tracking_falandays", "tracking_random"] +baseline = "tracking_random" + +[[benchmark.cases]] +id = "pong" +conditions = ["pong_falandays", "pong_random"] +baseline = "pong_random" diff --git a/plans/examples/profile_tracking.toml b/plans/examples/profile_tracking.toml new file mode 100644 index 0000000..a05ca76 --- /dev/null +++ b/plans/examples/profile_tracking.toml @@ -0,0 +1,26 @@ +format = "brainlesslab-plan" +format_version = 1 +operation = "profile" +id = "profile_tracking_example" + +[[targets]] +id = "tracking" + +[targets.composition] +id = "falandays_tracking_profile" +preset = "falandays_tracking" + +[targets.evaluation] +blocks = 1 +trials_per_block = 2 +horizon = 120 +warmup = 20 +construction_scope = "trial" +reset = "full" +root_seed = 1101 +aggregate = "mean" + +[profile] +target = "tracking" +analyses = ["branching_ratio_mr", "node_target_error"] +record_every = 1 diff --git a/plans/examples/sweep_tracking.toml b/plans/examples/sweep_tracking.toml new file mode 100644 index 0000000..8b737f3 --- /dev/null +++ b/plans/examples/sweep_tracking.toml @@ -0,0 +1,34 @@ +format = "brainlesslab-plan" +format_version = 1 +operation = "sweep" +id = "sweep_tracking_example" + +[[targets]] +id = "tracking" + +[targets.composition] +id = "falandays_tracking_sweep" +preset = "falandays_tracking" + +[targets.evaluation] +blocks = 1 +trials_per_block = 2 +horizon = 120 +warmup = 20 +construction_scope = "trial" +reset = "full" +root_seed = 1201 +aggregate = "mean" + +[sweep] +target = "tracking" +mode = "factorial" +max_rollouts = 8 + +[[sweep.axes]] +parameter = "leak" +values = [0.25, 0.5] + +[[sweep.axes]] +parameter = "lrate_wmat" +values = [0.35, 1.0] diff --git a/profile/Manifest.toml b/profile/Manifest.toml index 9a49021..f35abaf 100644 --- a/profile/Manifest.toml +++ b/profile/Manifest.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.12.6" +julia_version = "1.10.11" manifest_format = "2.0" -project_hash = "9cf78c06b0aac5f1ae9e2713e0087acb7b5b5437" +project_hash = "2593b88b9daf08b67c61cfbe4c803fd0764cf101" [[deps.AbstractFFTs]] deps = ["LinearAlgebra"] @@ -77,11 +77,10 @@ version = "0.4.2" [[deps.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.2" +version = "1.1.1" [[deps.Artifacts]] uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" -version = "1.11.0" [[deps.Automa]] deps = ["PrecompileTools", "TranscodingStreams"] @@ -103,7 +102,6 @@ version = "0.4.8" [[deps.Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" -version = "1.11.0" [[deps.BaseDirs]] git-tree-sha1 = "8c290a1b223deaeea9aea44b235d24546da8eb98" @@ -111,10 +109,10 @@ uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f" version = "1.4.0" [[deps.BrainlessLab]] -deps = ["Dates", "JLD2", "LinearAlgebra", "Random", "StaticArrays", "TOML"] +deps = ["Dates", "JLD2", "LinearAlgebra", "Random", "SHA", "StaticArrays", "Statistics", "TOML"] path = ".." uuid = "d12add44-1e3e-4161-9a99-c2121a2f0f38" -version = "0.0.1" +version = "0.2.0" weakdeps = ["Makie"] [deps.BrainlessLab.extensions] @@ -133,7 +131,6 @@ version = "0.5.0" [[deps.CRC32c]] uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" -version = "1.11.0" [[deps.CRlibm]] deps = ["CRlibm_jll"] @@ -155,9 +152,9 @@ version = "1.1.1" [[deps.CairoMakie]] deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] -git-tree-sha1 = "80b2770813b42f80235ea57f4333de8ff3e1c342" +git-tree-sha1 = "47142129b1777e21da58cff265050b10d8560588" uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -version = "0.15.12" +version = "0.15.13" [[deps.Cairo_jll]] deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] @@ -198,11 +195,13 @@ deps = ["FixedPointNumbers", "Random"] git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" version = "0.12.1" -weakdeps = ["StyledStrings"] [deps.ColorTypes.extensions] StyledStringsExt = "StyledStrings" + [deps.ColorTypes.weakdeps] + StyledStrings = "f489334b-da3d-4c2e-b8f0-e476e12c162b" + [[deps.ColorVectorSpace]] deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" @@ -220,9 +219,9 @@ uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" version = "0.13.1" [[deps.CommonSolve]] -git-tree-sha1 = "99ee296f88c12485402e37c2fd025f95ae097637" +git-tree-sha1 = "eeaad7cef88554c2fa56b5a3f71cfd5cb708c662" uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" -version = "0.2.9" +version = "0.2.11" [[deps.Compat]] deps = ["TOML", "UUIDs"] @@ -237,7 +236,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.3.0+1" +version = "1.1.1+0" [[deps.CompositionsBase]] git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" @@ -289,9 +288,9 @@ version = "1.16.0" [[deps.DataStructures]] deps = ["OrderedCollections"] -git-tree-sha1 = "6fb53a69613a0b2b68a0d12671717d307ab8b24e" +git-tree-sha1 = "b0bc6d2cad1fed8b7fd59a1551a991cb3d2809e6" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.19.5" +version = "0.19.6" [[deps.DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" @@ -301,7 +300,6 @@ version = "1.0.0" [[deps.Dates]] deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" -version = "1.11.0" [[deps.DelaunayTriangulation]] deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] @@ -312,7 +310,6 @@ version = "1.6.6" [[deps.Distributed]] deps = ["Random", "Serialization", "Sockets"] uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" -version = "1.11.0" [[deps.Distributions]] deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "Roots", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] @@ -340,7 +337,7 @@ version = "0.9.5" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.7.0" +version = "1.6.0" [[deps.EarCut_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -361,9 +358,9 @@ version = "2.2.9" [[deps.Expat_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c307cd83373868391f3ac30b41530bc5d5d05d08" +git-tree-sha1 = "e6c4a6407a949e79a9d3f249bf49e6987c80e01f" uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.8.1+0" +version = "2.8.2+0" [[deps.FFMPEG_jll]] deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libva_jll", "libvorbis_jll", "x264_jll", "x265_jll"] @@ -379,9 +376,9 @@ version = "0.3.1" [[deps.FileIO]] deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "8e9c059d6857607253e837730dbf780b6b151acd" +git-tree-sha1 = "6621fef488e496356c9c9625d0562c12a6070819" uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.19.0" +version = "1.20.0" [deps.FileIO.extensions] HTTPExt = "HTTP" @@ -421,13 +418,12 @@ version = "0.9.24" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" -version = "1.11.0" [[deps.FillArrays]] deps = ["LinearAlgebra"] -git-tree-sha1 = "2f979084d1e13948a3352cf64a25df6bd3b4dca3" +git-tree-sha1 = "5bad39456d9f0166184fce2248783dd9862645c1" uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.16.0" +version = "1.17.0" weakdeps = ["PDMats", "SparseArrays", "StaticArrays", "Statistics"] [deps.FillArrays.extensions] @@ -477,6 +473,11 @@ git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" uuid = "559328eb-81f9-559d-9380-de523a88c83c" version = "1.0.17+0" +[[deps.Gamma]] +git-tree-sha1 = "86f86b6168a016ed88e4ae4e64577b98c3b59e8e" +uuid = "a0844989-3bd2-4988-8bea-c9407ab0941b" +version = "1.1.0" + [[deps.GeometryBasics]] deps = ["EarCut_jll", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] git-tree-sha1 = "364685f5ffde25deb1bbcfd5bb278a5c6b7a9b37" @@ -541,10 +542,10 @@ uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" version = "0.2.0" [[deps.HypergeometricFunctions]] -deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] -git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" +deps = ["Gamma", "LinearAlgebra"] +git-tree-sha1 = "18d7deab5fb0440dc6a7b6993c5c27b25420de10" uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.28" +version = "0.3.29" [[deps.ImageAxes]] deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] @@ -600,7 +601,6 @@ version = "0.1.3" [[deps.InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" -version = "1.11.0" [[deps.Interpolations]] deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] @@ -618,9 +618,9 @@ version = "0.16.3" [[deps.IntervalArithmetic]] deps = ["CRlibm", "CoreMath", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"] -git-tree-sha1 = "921d7e91687e15a2c7c269c226960491fc041832" +git-tree-sha1 = "c3ee408ae340565f41699e3a3fa1053698c7626e" uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" -version = "1.0.9" +version = "1.0.10" [deps.IntervalArithmetic.extensions] IntervalArithmeticArblibExt = "Arblib" @@ -729,14 +729,9 @@ version = "0.1.6" [[deps.JpegTurbo_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c0c9b76f3520863909825cbecdef58cd63de705a" +git-tree-sha1 = "1dae3057da6f2b9c857afef03177bbdc7c4afe92" uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.1.5+0" - -[[deps.JuliaSyntaxHighlighting]] -deps = ["StyledStrings"] -uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" -version = "1.12.0" +version = "3.2.0+0" [[deps.KernelDensity]] deps = ["Distributions", "DocStringExtensions", "FFTA", "Interpolations", "StatsBase"] @@ -758,9 +753,9 @@ version = "4.1.0+0" [[deps.LLVMOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8" +git-tree-sha1 = "b7970cef8ae1c990ba0c09cd8bdc1145e006632f" uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" -version = "18.1.8+0" +version = "22.1.7+0" [[deps.LaTeXStrings]] git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" @@ -778,28 +773,26 @@ uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" version = "0.6.4" [[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.15.0+0" +version = "8.4.0+0" [[deps.LibGit2]] -deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" -version = "1.11.0" [[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.9.0+0" +version = "1.6.4+0" [[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "OpenSSL_jll"] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.3+1" +version = "1.11.0+1" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" -version = "1.11.0" [[deps.Libffi_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -827,9 +820,9 @@ version = "2.42.0+0" [[deps.Libtiff_jll]] deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "f04133fe05eff1667d2054c53d59f9122383fe05" +git-tree-sha1 = "aebd334d06cee9f24cea70bd19a39749daf73881" uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.7.2+0" +version = "4.7.3+0" [[deps.Libuuid_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -840,7 +833,6 @@ version = "2.42.0+0" [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.12.0" [[deps.LogExpFunctions]] deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] @@ -860,7 +852,6 @@ version = "1.0.1" [[deps.Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" -version = "1.11.0" [[deps.MacroTools]] git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" @@ -869,9 +860,9 @@ version = "0.5.16" [[deps.Makie]] deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "ComputePipeline", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "Pkg", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] -git-tree-sha1 = "efe001e1ee81b8eee0fe7da5a4328fcbbfd6b3aa" +git-tree-sha1 = "f2c8715d05bf10f9d4dc354e69dee30b6be53239" uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.24.12" +version = "0.24.13" [deps.Makie.extensions] MakieDynamicQuantitiesExt = "DynamicQuantities" @@ -885,9 +876,8 @@ uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" version = "0.4.3" [[deps.Markdown]] -deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] +deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" -version = "1.11.0" [[deps.MathTeXEngine]] deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] @@ -895,6 +885,11 @@ git-tree-sha1 = "aa1078778be5a8e5259ff04fbc3d258b3e78d464" uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" version = "0.6.9" +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.1010+0" + [[deps.Missings]] deps = ["DataAPI"] git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" @@ -903,7 +898,6 @@ version = "1.2.0" [[deps.Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" -version = "1.11.0" [[deps.MosaicViews]] deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] @@ -913,7 +907,7 @@ version = "0.3.4" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2025.11.4" +version = "2025.12.2" [[deps.MuladdMacro]] deps = ["PrecompileTools"] @@ -935,7 +929,7 @@ version = "1.1.1" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.3.0" +version = "1.2.0" [[deps.Observables]] git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" @@ -959,14 +953,14 @@ version = "1.3.6+0" [[deps.OpenBLASConsistentFPCSR_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3287ec88df50429a934ebc6cf14606215e27b987" +git-tree-sha1 = "567515ca155d0020a45b05175449b499c63e7015" uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af" -version = "0.3.33+0" +version = "0.3.29+0" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.29+0" +version = "0.3.23+5" [[deps.OpenEXR]] deps = ["Colors", "FileIO", "OpenEXR_jll"] @@ -983,12 +977,13 @@ version = "3.4.13+0" [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.7+0" +version = "0.8.5+0" [[deps.OpenSSL_jll]] -deps = ["Artifacts", "Libdl"] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d8cce34295c55f47be683580f44791716045b8fe" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.4+0" +version = "3.5.7+0" [[deps.OpenSpecFun_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] @@ -1010,7 +1005,7 @@ version = "1.8.2" [[deps.PCRE2_jll]] deps = ["Artifacts", "Libdl"] uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.44.0+1" +version = "10.42.0+1" [[deps.PDMats]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] @@ -1059,13 +1054,9 @@ uuid = "30392449-352a-5448-841d-b1acce4e97dc" version = "0.46.4+0" [[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.12.1" -weakdeps = ["REPL"] - - [deps.Pkg.extensions] - REPLExt = "REPL" +version = "1.10.0" [[deps.PkgVersion]] deps = ["Pkg"] @@ -1086,9 +1077,9 @@ version = "0.1.2" [[deps.PrecompileTools]] deps = ["Preferences"] -git-tree-sha1 = "edbeefc7a4889f528644251bdb5fc9ab5348bc2c" +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.3.4" +version = "1.2.1" [[deps.Preferences]] deps = ["TOML"] @@ -1105,7 +1096,6 @@ version = "0.5.7" [[deps.Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" -version = "1.11.0" [[deps.ProgressMeter]] deps = ["Distributed", "Printf"] @@ -1137,14 +1127,12 @@ version = "2.11.3" Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" [[deps.REPL]] -deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" -version = "1.11.0" [[deps.Random]] deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" -version = "1.11.0" [[deps.RangeArrays]] git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" @@ -1192,9 +1180,9 @@ version = "0.5.1+0" [[deps.Roots]] deps = ["Accessors", "CommonSolve", "Printf"] -git-tree-sha1 = "91cfb1cb4f6e27557cc2df798a31eff6089a41eb" +git-tree-sha1 = "7fb25a964849d90a0446366cdefca822e0e84900" uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" -version = "3.0.0" +version = "3.0.6" [deps.Roots.extensions] RootsChainRulesCoreExt = "ChainRulesCore" @@ -1241,7 +1229,6 @@ version = "1.3.0" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" -version = "1.11.0" [[deps.ShaderAbstractions]] deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"] @@ -1252,7 +1239,6 @@ version = "0.5.0" [[deps.SharedArrays]] deps = ["Distributed", "Mmap", "Random", "Serialization"] uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" -version = "1.11.0" [[deps.SignedDistanceFields]] deps = ["Statistics"] @@ -1274,7 +1260,6 @@ version = "0.1.5" [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" -version = "1.11.0" [[deps.SortingAlgorithms]] deps = ["DataStructures"] @@ -1285,7 +1270,7 @@ version = "1.2.3" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.12.0" +version = "1.10.0" [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] @@ -1326,14 +1311,9 @@ uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" version = "1.4.4" [[deps.Statistics]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +deps = ["LinearAlgebra", "SparseArrays"] uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.11.1" -weakdeps = ["SparseArrays"] - - [deps.Statistics.extensions] - SparseArraysExt = ["SparseArrays"] +version = "1.10.0" [[deps.StatsAPI]] deps = ["LinearAlgebra"] @@ -1395,10 +1375,6 @@ version = "2.8.2" StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -[[deps.StyledStrings]] -uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" -version = "1.11.0" - [[deps.SuiteSparse]] deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" @@ -1406,7 +1382,7 @@ uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.8.3+2" +version = "7.2.1+1" [[deps.TOML]] deps = ["Dates"] @@ -1455,11 +1431,9 @@ version = "0.1.0" [[deps.UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" -version = "1.11.0" [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" -version = "1.11.0" [[deps.UnicodeFun]] deps = ["REPL"] @@ -1565,7 +1539,7 @@ version = "1.6.0+0" [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.3.1+2" +version = "1.2.13+1" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1594,13 +1568,13 @@ version = "0.17.4+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.15.0+0" +version = "5.11.0+0" [[deps.libdrm_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libpciaccess_jll"] -git-tree-sha1 = "63aac0bcb0b582e11bad965cef4a689905456c03" +git-tree-sha1 = "28e57478e8a160d346a19c28b3fffb9273bcc9c2" uuid = "8e53e030-5e6c-5a89-a30b-be5b7263a166" -version = "2.4.125+1" +version = "2.4.134+0" [[deps.libfdk_aac_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1641,12 +1615,12 @@ version = "1.6.0+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.64.0+1" +version = "1.52.0+1" [[deps.p7zip_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +deps = ["Artifacts", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.7.0+0" +version = "17.6.1+0" [[deps.x264_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] diff --git a/profile/Profile.jl b/profile/Profile.jl index f0ef90a..0347a32 100644 --- a/profile/Profile.jl +++ b/profile/Profile.jl @@ -527,7 +527,8 @@ end task_profile(node_sym, task; n_seeds=8, canonical_N=CANONICAL_N) Run `n_seeds` rollouts of `task` with `node_sym` at the task's canonical N, -recording `(:rate, :scene, :poses)`, over the task's default ticks. Returns a +recording task signals plus rate and scene channels over the task's default +ticks. Returns a NamedTuple with the seed-averaged branching-ratio series, mean/std sigma, mean/std score, the run parameters used (N, R, E, ticks), and `factor_data`: per task-scoped analysis registered for the task, the seed-1 σ(t) and @@ -561,7 +562,9 @@ function task_profile(node_sym::Symbol, task::Symbol; n_seeds::Integer=8, canoni seed1_target_error = nothing seed_results = BrainlessLab.parallel_map(1:Int(n_seeds)) do s - record_channels = s == 1 ? (:spikes, :rate, :scene, :poses, :acts, :targets) : (:spikes, :rate, :scene, :poses) + record_channels = s == 1 ? + (:spikes, :rate, :scene, :poses, :percepts, :acts, :targets) : + (:spikes, :rate, :scene, :poses) sim = simulate(task; node=node_sym, n_nodes=N, seed=s, record=record_channels) br = branching_ratio(sim) sigma_mr_value = try diff --git a/profile/Project.toml b/profile/Project.toml index 24d77e3..1f32f52 100644 --- a/profile/Project.toml +++ b/profile/Project.toml @@ -1,7 +1,20 @@ [deps] BrainlessLab = "d12add44-1e3e-4161-9a99-c2121a2f0f38" +Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[compat] +Base64 = "1.10" +BrainlessLab = "0.2" +CairoMakie = "0.12, 0.13, 0.14, 0.15" +Dates = "1.10" +Printf = "1.10" +Random = "1.10" +Statistics = "1.10" +TOML = "1" +julia = "1.10" diff --git a/site/README.md b/site/README.md index f2983e6..e5ed9cd 100644 --- a/site/README.md +++ b/site/README.md @@ -1,40 +1,46 @@ # BrainlessLab site -The documentation **and** outputs site for BrainlessLab.jl — [Astro](https://astro.build) + -[Starlight](https://starlight.astro.build), with equations (KaTeX) and the interactive -Falandays demo as a React island. +This directory contains the public BrainlessLab platform guide. It uses +[Astro](https://astro.build) and [Starlight](https://starlight.astro.build), with KaTeX +for equations and React for the small interactive Falandays demonstration. -## Run it (bun) +## Run locally ```bash cd site bun install -bun run dev # http://localhost:4321 +bun run dev ``` -Build a static site: +Build and preview the static output: ```bash -bun run build # -> ./dist +bun run build bun run preview ``` -## Layout +## Content model -- `astro.config.mjs` — Starlight config: sidebar, KaTeX (remark-math → rehype-katex), React island, brand CSS. -- `src/styles/theme.css` — the warm brand palette (paper / teal / amber / ink), matching the figures in `src/viz/Style.jl`. -- `src/content/docs/*.mdx` — the pages (Introduction, Concepts, Nodes, Embodiment, Environments & Tasks, The collective, Analysis, Evolution, Tooling, Extending, Contracts, Reference, Outputs). **This site is the single source of truth for the docs** — the old plain-markdown `docs/` set has been retired. -- `src/components/FalandaysDemo.tsx` — the interactive demo island: a live in-browser Falandays simulation (Wall / Track / Pong) driven by the TypeScript port under `src/simulation/`. +The guide is organised by the reader's task: -## Structure +- start with a diagnostic run and the core task tour; +- run repeatable operations and interpret their records; +- understand the runtime and research architecture; +- extend nodes, bodies, tasks, and analyses; +- inspect experimental capabilities and their readiness. -Two halves under one site: **infrastructure docs** (the library) and an **Outputs** -area for publishing experiment results, data, and figures. +The public site does not contain historical literature notes or bespoke study pages. +Versioned `ExperimentSpec` bundles live under [`../experiments/`](../experiments/), and +operation records remain the source for generated reports. -Equations use `$…$` / `$$…$$`. A "Source" callout (`

`) links a -documented concept to its Julia implementation. +Key files: ---- +- `astro.config.mjs` defines navigation and site metadata; +- `src/content/docs/` contains public Markdown and MDX pages; +- `src/content.config.ts` validates content metadata; +- `src/styles/theme.css` defines the visual system; +- `src/components/FalandaysDemo.tsx` contains the browser demonstration; +- `src/simulation/` contains the TypeScript simulation used by that demonstration. -A [Diverse Intelligences Summer Institute](https://disi.org) 2026 (Geneva NY) project — -Polyphony Bruna · Benjamin Gaskin · Ian Jackson · William O'Hearn. +Write equations as `$...$` or `$$...$$`. Follow +[`../docs/WRITING.md`](../docs/WRITING.md) for prose and terminology. diff --git a/site/astro.config.mjs b/site/astro.config.mjs index a580745..70d3fd8 100644 --- a/site/astro.config.mjs +++ b/site/astro.config.mjs @@ -51,98 +51,55 @@ export default defineConfig({ }, sidebar: [ { - label: 'Core handbook', + label: 'Start', items: [ { label: 'Getting started', slug: 'core/getting-started' }, { label: 'Core task tour', slug: 'core/task-tour' }, - { label: 'Architecture', slug: 'core/architecture' }, - { label: 'Falandays node', slug: 'core/falandays' }, - { label: 'Reservoirs & node models', slug: 'core/reservoirs' }, - { label: 'Embodiment', slug: 'core/embodiment' }, - { label: 'Worlds, tasks & populations', slug: 'core/worlds-tasks-populations' }, - { label: 'Runs, recording & results', slug: 'core/runs-results' }, - { label: 'Design a study', slug: 'core/design-study' }, - { label: 'Tools & artifacts', slug: 'core/tools-artifacts' }, - { label: 'Extend the lab', slug: 'core/extend' }, ], }, - { label: 'Experimental', slug: 'experimental' }, { - label: 'Methods & reference', + label: 'Run research', items: [ - { label: 'Agentic workflow', slug: 'agentic-workflow' }, + { label: 'Operations and records', slug: 'core/operations-records' }, + { label: 'Design a study', slug: 'core/design-study' }, + { label: 'Runs and results', slug: 'core/runs-results' }, { label: 'Scoring', slug: 'scoring' }, { label: 'Analysis', slug: 'analysis' }, { label: 'Evolution', slug: 'evolution' }, - { label: 'Biological grounding', slug: 'nodes/neurons' }, - { label: 'Contracts', slug: 'contracts' }, + { label: 'Agent-assisted workflow', slug: 'agentic-workflow' }, + ], + }, + { + label: 'Understand', + items: [ + { label: 'Architecture', slug: 'core/architecture' }, + { label: 'Interaction cycles', slug: 'core/interaction-cycle' }, + { label: 'Falandays node', slug: 'core/falandays' }, + { label: 'Reservoirs and node models', slug: 'core/reservoirs' }, + { label: 'Embodiment', slug: 'core/embodiment' }, + { label: 'Worlds, tasks and populations', slug: 'core/worlds-tasks-populations' }, + { label: 'Node mechanisms', slug: 'node-mechanisms' }, { label: 'Platform limits', slug: 'platform-limits' }, + ], + }, + { + label: 'Build and extend', + items: [ + { label: 'Extend the lab', slug: 'core/extend' }, + { label: 'Interface contracts', slug: 'contracts' }, { label: 'Reference', slug: 'reference' }, ], }, { - label: 'Papers', + label: 'Experimental', items: [ - { label: 'Overview', slug: 'notes/papers-overview' }, - { - label: 'Reviews & foundations', - collapsed: true, - items: [ - { label: 'Dynamical criticality: overview (Roli et al. 2016)', slug: 'notes/dynamical-criticality-overview' }, - { label: 'Criticality in living systems — review (Muñoz 2018)', slug: 'notes/criticality-living-systems-review' }, - { label: '25 years of self-organized criticality (Watkins et al. 2016)', slug: 'notes/soc-concepts-controversies' }, - { label: 'SOC induced by diversity (Corral et al. 1997)', slug: 'notes/soc-induced-by-diversity' }, - ], - }, - { - label: 'Swarm & flock criticality', - collapsed: true, - items: [ - { label: 'Swarm criticality & transmission (Vanni 2011)', slug: 'notes/criticality-and-information' }, - { label: 'Finite-size scaling in natural swarms (Attanasi & Cavagna 2014)', slug: 'notes/finite-size-scaling-swarms' }, - { label: 'Extended critical region in swarms (González-Albaladejo & Bonilla 2024)', slug: 'notes/scale-free-chaos-swarms' }, - { label: 'Collective predator evasion (Klamser & Romanczuk 2021)', slug: 'notes/collective-predator-evasion' }, - { label: 'Criticality in collective behavior (Romanczuk & Daniels 2022)', slug: 'notes/phase-transitions-collective-behavior' }, - { label: 'Subcritical escape waves in fish (Poel et al. 2022)', slug: 'notes/subcritical-escape-waves' }, - { label: 'Turning avalanches in schooling fish (Puy et al. 2024)', slug: 'notes/turning-avalanches-fish' }, - ], - }, - { - label: 'Engineered & robotic collectives', - collapsed: true, - items: [ - { label: 'SOC in an aquatic robot swarm (Zhao et al. 2026)', slug: 'notes/soc-aquatic-robot-swarm' }, - { label: 'Criticality in swarm robots (Lei et al. 2023)', slug: 'notes/criticality-swarm-robots' }, - ], - }, - { - label: 'Information & thermodynamic utility', - collapsed: true, - items: [ - { label: 'Information flow near criticality (Meijers 2021)', slug: 'notes/information-flow-near-criticality' }, - { label: 'Criticality → collective intelligence (De Vincenzo 2017)', slug: 'notes/criticality-collective-intelligence' }, - { label: 'Thermodynamics of collective motion (Crosato et al. 2018)', slug: 'notes/thermodynamics-collective-motion' }, - { label: 'Why self-organize to criticality (Chen & Prokopenko 2025)', slug: 'notes/why-self-organize-to-criticality' }, - { label: 'Information-based fitness & criticality (Hidalgo et al. 2014)', slug: 'notes/information-based-fitness' }, - { label: 'Spectral radius, criticality & dynamic range (Larremore et al. 2011)', slug: 'notes/spectral-radius-criticality' }, - ], - }, - { - label: 'Cross-scale & active matter', - collapsed: true, - items: [ - { label: 'Macro-criticality from micro-critical agents (Bessone & Plantec 2026)', slug: 'notes/emergent-macro-criticality' }, - { label: 'Activation fronts in active systems (Gascuel et al. 2024)', slug: 'notes/activation-fronts-active-systems' }, - ], - }, - { - label: 'Alternative measures & framing', - collapsed: true, - items: [ - { label: 'Heterogeneous criticality in a fish school (Niizato et al. 2024)', slug: 'notes/heterogeneous-criticality-fish-school' }, - { label: 'Cognition as search efficiency (Chis-Ciure & Levin 2025)', slug: 'notes/cognition-all-the-way-down' }, - ], - }, + { label: 'Overview', slug: 'experimental' }, + { label: 'Reservoirs', slug: 'experimental/reservoirs' }, + { label: 'Embodiment', slug: 'experimental/embodiment' }, + { label: 'Worlds and tasks', slug: 'experimental/worlds-tasks' }, + { label: 'Collectives', slug: 'experimental/collectives' }, + { label: 'Analyses', slug: 'experimental/analyses' }, + { label: 'Evolution', slug: 'experimental/evolution' }, ], }, ], diff --git a/site/src/components/PageTitle.astro b/site/src/components/PageTitle.astro index 0fe33a9..0c41a74 100644 --- a/site/src/components/PageTitle.astro +++ b/site/src/components/PageTitle.astro @@ -2,20 +2,7 @@ import DefaultPageTitle from '@astrojs/starlight/components/PageTitle.astro'; const entry = Astro.locals.starlightRoute.entry; -const evidence = entry.data.evidence; const experimental = entry.data.experimental; -const isLiterature = - entry.slug.startsWith('notes/') && entry.slug !== 'notes/papers-overview'; - -const evidenceRows = evidence - ? [ - ['Study', evidence.id], - ['Protocol', evidence.protocol_version], - ['Independent unit', evidence.randomization_unit], - ['Independent blocks', String(evidence.n_independent_blocks)], - ['Primary endpoint', evidence.primary_endpoint], - ] - : []; const titleCase = (value: string) => value @@ -26,40 +13,6 @@ const titleCase = (value: string) => -{ - isLiterature && ( -

- ) -} - -{ - evidence && ( - - ) -} - { experimental && (