Question
Can a real floor from the indoor GIS DB — its envelope, walls and occupiable seats — drive a JuPedSim seek-and-occupy run end-to-end, with the structure supplied as a portable artifact and all simulation params on the sim side?
This is the first exercise of the IP-092 structure→simulation bridge. The library floor (fiit-library-floor-0) is exported to a raw-structure floor_geometry.json by gis export-floor; the from_floor runner (floor_walk.py) derives the walkable area (envelope − buffered walls − obstacles) using its own agent_clearance_cm, spawns N agents, and each navigates to the nearest unclaimed seat and loiters. The GIS DB never learns anything about the run.
Prerequisites (before this can dispatch)
- A furnished floor.
fiit-library-floor-0must carrycell_type='occupiable'seats (≥n_agents). Author them in QGIS (digitise points/footprints →gis_create_occupiable) or via a computed "one seat per desk" pass, taggedprovenanceaccordingly. Until seats exist,n_goals = 0and the run is a no-op (criterion 2 fails by construction). - The structure artifact. Host-side pre-step:
monad-knowledge gis export-floor fiit-library-floor-0 --out floor_geometry.json, staged as the run's/work/inputs/floor_geometry.json(IP-085 input; plural — the staging location written byscene_stage.py, matching thesim_params.floor_bundleabove. The session01KTGV7KJD…failure was a singular/plural path mismatch, now reconciled). - The
walk-notebookimage withfloor_walk.pyon the entrypoint path (sibling tocorridor_walk_fast.py). Until it publishes, treat this brief as a design spec —/campaign-curiousfails atsim_run_launchwithsimulator_not_registered.
What the supervisor does
Two runs (seeds=[0,1]) at the base scenario — no parameter sweep. The analysis-writer:
- Confirms the input contract — each run consumed
floor_geometry.json(no DB call in the container) and returned the scalar floor. - Reads the occupancy floor —
n_goals/n_seated/occupancy_rate/mean_time_to_seat_sfromwalk-notebook.metrics.jsonviasim_read_run. - Names any structural gap — if
occupancy_rateis low, distinguish not enough seats (n_goals < n_agents), unreachable seats (seat points outside the walls-subtracted walkable area — a furniture-placement/clearance issue), or integrator timeout (duration_unitstoo small).
Out of scope
- Calibration against any published crowd-flow band. This validates the structure→walkable→goals plumbing on a real floor, not pedestrian-dynamics physics.
flow/ multi-leg journeys, multi-seat capacity. Onlyseek_and_occupy, one agent per seat (IP-092 Stage B scope).- BLE / CSI coupling. Pure pedestrian sim; the EXP-S1 coupling is a follow-on once occupancy trajectories exist.
- Editing the DB from the run. Occupancy is a run artifact; nothing is written back to PostGIS.
Expected interpretation
- All criteria met → "The IP-092 bridge carries a real DB floor into a JuPedSim seek-and-occupy run via a portable structure artifact; agents reach DB-defined seats with all params sim-side." Unlocks occupancy-driven studies (→ EXP-S1 CSI coupling) on any floor in the DB.
- Criteria 1 + 3 met, criterion 2 low → "Plumbing works; occupancy is gated by furniture data —
<n_goals> seats vs <n_agents> agents/<k> seats unreachable after wall buffering." A data/clearance finding, not a platform bug. - Criterion 1 fails → "The structure artifact didn't round-trip —
<missing field / runner couldn't read bundle>." A platform finding on the export/adapter surface.
Notes (for future sessions)
- The walkable derivation in
floor_walk.pyinlinesmonad_knowledge.sim.floorgeom.walkable_from_floor(the runner can't importmonad_knowledge, per IP-087).floorgeomis the tested reference (tests/sim/test_floorgeom.py); keep the two in sync. - Natural follow-ons (separate briefs):
c-fiit-occupancy-to-csi(couple the trajectory to EXP-S1 BLE/CSI synthesis), and aflowscenario once entrances are tagged (transitionsubtypemain_entry).