{
 "name": "A learned movement model against real pedestrians in unopened unidirectional Jülich experiments and two unopened ATC days",
 "registered": "2026-10-11",
 "why": "The crowd that met on 10 October (protocol-crowds-juelich.json) with a learned movement layer on top (docs/research/movement-model.md). Development cleared with the layer plus a packed-crowd time gap; this is the one protocol for the movement model, scored once on data no run here has opened.",
 "data": {
  "uo2009": "Jülich 2009unidirectional open, DOI 10.34735/ped.2009.14, 29 runs, CC BY 4.0, 16 fps, cm; [host name redacted] [path redacted]",
  "uni2013": "Jülich 2013unidirectional, DOI 10.34735/ped.2013.6, 9 runs, CC BY 4.0, 16 fps; [host name redacted] [path redacted]",
  "atc2012112": "ATC 2012-11-21 and 2012-11-25, six 3-minute windows each starting 10:00, 11:30, 13:00, 14:30, 16:00, 17:30, from atc-20121121.csv and atc-20121125.csv inside [host name redacted] [path redacted] (ATC licence: research use with citation)",
  "not used": "2013entrance_semicircle and 2013entrance_corridor were downloaded with the holdout and are not part of this study",
  "opened": "only dataset pages, zip listings and checksums were read before registration; no trajectory file was opened. Sealed copies on [host name redacted] ([path redacted] for the two zips, [path redacted] for the ATC archive) were checked by sha256 only.",
  "sha256": {
   "2009unidirectional_open_trajectories_txt.zip": "dd57948f026440d1c0f0aa947e7ec474861c6a549d235d394fa1a6d8deb05a31",
   "2013unidirectional_trajectories_txt.zip": "53832a705358110eb3abe1acd99b7d1b252baced0c0ec6a8ccdad36aa544b787",
   "atc-tracking-part1.7z": "558f08145e15a94aae4baa1c60608b047257b9448093fab5dc967776d8b48ea9"
  }
 },
 "conversion": "juelich_convert2.py (uo2009: 16 fps, cm; uni2013: 16 fps, units from each file's header) and atc_convert.py (180 s windows at the six start times), as in move_holdout.sh at this commit; walkable areas by those fixed rules. Only atc-20121121.csv and atc-20121125.csv are extracted from the ATC archive, at run time, and deleted after conversion.",
 "crowds": {
  "learned (candidate)": "experiment/movement-model/movesim.py (sha256 a489ca33cbfabb8c7811d44d5d04fc7efaf5c2411e9c98fb49052a4016dd8036) REAL WALKABLE OUT --weights W --comp-radius 0.12 --comp-gap 0.2 --comp-range 0.1 --comp-range-max-n 2 --comp-dv 0.5 --gain 0.1214 --temp 0.5018 --temp-lat 0.6224 --gain-dense 0.9418 --norm-share 0.4242 --speed-sd 0.0031 --time-gap 0.4821 --gap-dense 0.3 --gap-n 1 --seed S, every other option at its default; W = the r1 weights (search blend 0), sha256 f73b2536add4d6228b9752e6efe9a84d23bc85ba0e4f2f7c7b68f09743774acb (identical to [host name redacted] models/cma1-e154.npz)",
  "met": "experiment/crowds/crowdsim.py with the arguments of protocol-crowds-juelich.json: --model avm --radius 0.12 --radius-sparse 0.22 --rho0 0.5 --time-gap 0.45 --anticipation 0.75 --reaction 0.3 --strength 8 --range 0.2 --look 1.0 --vmax 1.5 --grace 10 --stand 0 --wall-slack 0.2 --dt 0.02 --seed 1",
  "socialforce": "experiment/crowds/opp.py REAL WKT OUT socialforce (pedreplay_398957f.py with groups, spring, density-aware grouping and walls), as in protocol-crowds-juelich.json",
  "orca": "the same with orca",
  "straight": "experiment/peds/peds_straight.py REAL OUT, unchanged"
 },
 "engine commit": "this commit; movesim.py is unchanged from engine 0335919 (the development runs used that file byte for byte)",
 "environment": "[host name redacted] (x86_64), venv at [path redacted], Python 3.12.14: jupedsim 1.4.2, numpy 2.5.3, shapely 2.2.0, deprecated 1.2.18, wrapt 1.17.3, py7zr 1.1.3 (with backports.zstd 1.7.0, brotli 1.2.0, inflate64 1.0.4, multivolumefile 0.2.3, psutil 7.2.2, pybcj 1.0.8, pycryptodomex 3.24.0, pyppmd 1.3.1, texttable 1.7.0; only for extracting the ATC days). Development was run on [host name redacted] with this venv; [host name redacted] (aarch64, Python 3.12.3, the same package versions) gives counts within one run per group for the same settings, so the run host is fixed to [host name redacted].",
 "measures": "experiment/movement-model/score_move.py at this commit, peds_realism.py unchanged: per run, rank sum over speed, nearest distance, straightness and contact among the five crowds (ties share the mean rank); a run is won when the learned crowd's rank sum is lower than both the met crowd's and social force's, the same per-run test as in development (devscore2.py); a run where any crowd has no output is not won",
 "seeds": "declared now: the learned crowd runs on seeds 1 and 2 and every set must clear on both; the other four crowds are built once (met on seed 1 as registered for it) and shared by both seeds",
 "primary": "in each set (uo2009, 29 runs; uni2013, 9 runs; atc2012112, 12 windows), on seed 1 and on seed 2 separately, the learned crowd wins at least two thirds of runs (3 x won >= 2 x runs); the study is met only if all three sets clear on both seeds",
 "failures": "nothing is re-run",
 "development": "only runs already read (176 runs in 11 groups, [host name redacted] lw-move/data/manifest.txt). Seeds 1 / 2 / 3, won of runs: atc1114 19/19, 18/19, 19/19; atc1118 6/6, 6/6, 6/6; bidirectional 11/15, 11/15, 10/15; bidirectional2009 14/18, 15/18, 16/18; bottleneck 27/40, 33/40, 29/40; bottleneck2009 5/5, 5/5, 5/5; corner2009 8/11, 8/11, 8/11; crossing120 16/16, 15/16, 15/16; crossing90 18/24, 21/24, 21/24; ethucy 7/8, 7/8, 8/8; tjunction 10/11, 10/11, 11/11. The search's best alone (no packed time gap) fails seed 2 (bottleneck 22/40, bidirectional 9/15).",
 "disclosure": "the packed time gap 0.3 s was chosen after seeing development seeds 1 and 2 (0.25 s missed one group by one run on each search best); seed 3 played no part in the choice and confirmed it. Margins are thin: the 2014 bottleneck on seed 1 and corner2009 on all three seeds sit exactly on the bar. The holdout sets are unidirectional and open-concourse crowds, where the packed time gap acts on people walking the same way.",
 "order": "after this commit, once, on [host name redacted]: the user timer lwb-move-holdout.timer fires at 2026-10-14 00:05 UTC and starts lwb-move-holdout.service (MemoryMax 16G, CPUQuota 800 percent, nice 10), which checks the sha256 of move_holdout.sh and this file against the values recorded at installation, then runs move_holdout.sh: checksums, conversion, the five crowds on every run (learned on seeds 1 and 2), score_move.py once per seed, VERDICT. Outputs in [path redacted] (results-seed1.json, results-seed2.json, VERDICT); it writes nothing else except the scratch folder for the two ATC days, removed after conversion. Before registration move_holdout.sh was run end to end on two development archives only (2009bottleneck and ATC 2012-11-14, both already read in development) to check the pipeline; that output was deleted.",
 "publish": "results-movement.json (both seeds' results and the verdict) is committed whatever the outcome",
 "limits": "the crowd knows each person's real first and last position and time, as the straight walkers do",
 "code": "the files below as they are in the engine at this commit (movement-model: movesim.py, crowdsim.py, movemodel.py, score_move.py, move_holdout.sh; crowds: crowdsim.py, opp.py, pedreplay_398957f.py, juelich_convert2.py, atc_convert.py; peds: peds_straight.py, peds_realism.py), copied to [host name redacted] [path redacted]; movesim.py and crowdsim.py of the movement model import pedreplay_398957f.py from their own folder, the crowds copy. move_holdout.sh checks every sha256 below before anything runs and stops on any mismatch.",
 "frozen files sha256": {
  "movesim.py": "a489ca33cbfabb8c7811d44d5d04fc7efaf5c2411e9c98fb49052a4016dd8036",
  "crowdsim.py": "de5549c31c8f4da3f11a566a3110cd40974303366689cd5404c5ba1f8b596470",
  "movemodel.py": "0577adce24e9a1a0d90fab00b1cefed00a8ffda6b282394545f985c2348d323a",
  "pedreplay_398957f.py": "9db67325d971a824f70eede97bc1215f40934392f5926e18919e22ce4f14d817",
  "score_move.py": "51d7aa98e07ef4ab1b137b2d3661421630654f448840f3d87bf2a783f942c1d2",
  "peds_realism.py": "21426a046a24b2f0079ab3889b90927198b90f6d32dc23cfe49a8cbc31ff9db4",
  "juelich_convert2.py": "cbddd2c3193829e9bebfb66cfa2ba79ff01f76ad8f85667c39eab9104fa84b9d",
  "atc_convert.py": "b8e816d15c6b025f6f392720c4c1854d8a0c418f112c83e6161c982dd226d1cd",
  "peds_straight.py": "4d158b805045441ab7fd38bbb04dcfeada356530cb59586f62e1caf6fd797bb4",
  "crowds/crowdsim.py": "a1593eb7ae792a9eba8a29b2ff59c014dbdf4e63c338937fc8324b297c9b7bd8",
  "crowds/opp.py": "ec936d664f09886bdb82f64f2b6547c03792e696dc023a6263d09fbd72c4c290",
  "crowds/pedreplay_398957f.py": "9db67325d971a824f70eede97bc1215f40934392f5926e18919e22ce4f14d817",
  "registered.npz": "f73b2536add4d6228b9752e6efe9a84d23bc85ba0e4f2f7c7b68f09743774acb"
 },
 "secondary": "learned against straight and against orca, per set and seed (score_move.py counts); each measure"
}
