Question
Can
fiit-library-floor-0, furnished with tables + table-anchored seats from the LiDAR scan, drive an 8-hour campus-day JuPedSim run in which students arrive on a realistic daily rhythm, friends claim adjacent seats at one table and sit together, study a log-normal session, and leave — freeing tables for later arrivals — with all behaviour parameters on the sim side?
This is the IP-102 exercise of the campus_day + cohesive-seating behaviour model
(floor_walk.py, kind campus_day) on a real DB floor. The day is synthesised into a
stream of cohesive social-group arrivals; each group books one table; seats are reused
across the day (after_dwell: return). It is the occupancy base the BLE/CSI work
(c-fiit-occupancy-to-csi → exp-csi-crowd, IP-094) builds on — see Out of scope.
Prerequisites (before this can dispatch) — ⚠️ floor not yet sim-ready
The converter notebooks/floorplans/converters/04_fiit_library_furniture.py runs an
offline reachability check and surfaces a geometry-quality blocker that must be fixed
in QGIS first (geometry editing is direct-in-PostGIS work, not converter round-tripping):
- Co-register the scan furniture with the polygonized floor. The scan
obstacles.geojson(SRID-900010 cm, bounds[3177,2255]–[5472,4276]) is offset from the polygonized envelope ([0,0]–[5376,3974]) and pokes outside it (y 4276 > 3974). 17/20 table centroids land inside the envelope but only 5 near the main walkable region; 0 of 80 derived seats are reachable until this is reconciled. - Clean the walls into rooms with doors. The polygonized layer is 453 wall segments
→ 281 walkable fragments (the main hall is one 1038 m² piece, but the furniture
half is shattered). Merge/clean to a single connected room (or rooms joined by tagged
transitiondoor gaps) so agents can reach the tables. Tag the real entrance. - Apply the furniture. Once 1–2 hold,
… 04_fiit_library_furniture.py --applyingests the 20 tables / 5 cabinets / 2 shelves / 2 columns (provenancelidar) and derives table-anchored seats (provenancecomputed), keeping only reachable ones. - Re-export + validate.
gis export-floor fiit-library-floor-0→ stage as the run input;gis_validate; confirm reachable seats ≥ ~22 and one connected walkable region.
Until 1–4 hold, treat this brief as a design spec — the behaviour model
(campus_day, cohesive seating) is implemented and unit-tested; the floor data is the gap.
What the supervisor does
Three seeds at the base scenario (no parameter sweep). The analysis-writer:
- Confirms the input contract — each run consumed
floor_geometry.json, returned the scalar floor,n_outside_walkable=0. - Reads the day — occupancy time-series shape (ramp / lunch dip / afternoon peak /
decline),
cohesive_fully_seated_rate,mean_group_size, mean session length back-out. - Names any gap — low occupancy ⇒ too few tables/seats vs seat contention vs
integrator timeout; low cohesion ⇒ tables too small for the group-size mix (raise
seats-per-table or shift
group_size_weights).
Out of scope
- Calibration against a measured library occupancy trace. This validates the
furnished-floor → campus-day → cohesive-seating plumbing and that the day-shape emerges;
it is not fitted to a specific real day.
day_profile/ session distribution are literature-justified priors (see IP-102), not measurements. - BLE / CSI coupling. Pure pedestrian sim; the occupancy trajectory is the input the
c-fiit-occupancy-to-csifollow-on couples toexp-csi-crowd(IP-094). - Editing the DB from the run. Occupancy/seat ledger is a run artefact; nothing is written back to PostGIS.
Cost note (full micro-sim, full-rate emission)
Per the operator's choice the integrator steps at dt=0.05 for the whole 8 h (576 000
steps) and emit_stride=1 saves every frame. With seated bodies persisting as scatterers
the trajectory parquet is large (tens of millions of rows) — hence the generous
s3_bytes/cpu_hours budget and systematic (CI) dispatch, not a local run. Raising
emit_stride (e.g. 20 → ~1 Hz saved) bounds the artefact without changing the simulated
physics — the integrator always steps at dt.
Notes (for future sessions)
- The
campus_dayexpansion + cohesive seating live infloor_walk.py(_expand_campus_day,_try_spawn_cohesive); seats are mapped to their nearesttableobstacle so a group sits together. Unit tests:tests/sim/test_floor_walk_campus_day.py. - Seats-per-table must be ≥ the largest group size in
group_size_weights, or those groups can never be seated as a unit (they wait, then count as turned away).
Status — 2026-07-06 overhaul triage
Blocked (geometry). fiit-library-floor-0 is not sim-ready: scan furniture is mis-registered against the polygonized walls (453 wall segments → 281 fragments) and 0/80 seats are reachable from the walkable region. Unblock condition: the QGIS reconcile pass on the library floor (queued alongside IP-102). Until then any run would exercise a broken walkable graph, not the library.