Question
We hand-assembled a sim-ready shopping mall from real ArchCAD-400K commercial geometry — a concourse, six shops, a food court, and a lounge, furnished, doored, with a real column grid lifted from a genuine mall CAD tile. Populate it with a relatable crowd (shoppers browsing shops, diners queuing and eating in the food court, people waiting in the lounge, through-traffic crossing the concourse). Then: where do you mount Wi-Fi APs so they both (a) COVER the space for comms and (b) are COUNT-INFORMATIVE for device-free CSI crowd sensing — and how many do you need?
This is c-placement-oracle re-scoped from residential/office floors onto a public retail mall with multi-activity agendas, on geometry grounded in real CAD.
Hypotheses
- H1 (cover ≠ count). The coverage-optimal AP set and the counting-optimal AP set are substantially disjoint (1 − Jaccard ≥ 0.15). Coverage spreads APs to blanket area; counting concentrates them where the crowd flows and dwells.
- H2 (flow hubs are the count hubs). The count-informative candidate APs concentrate on the concourse spine + food-court entrance (high, time-varying occupancy) rather than shop interiors (low, static dwell). The measured I(C;Φ) lower CI bound separates these.
- H3 (optimal density). A small AP count k* saturates footfall coverage (≥ 90%) on an 84 × 39 m concourse-plus-shops floor; beyond k* the marginal covered footfall is < ε (submodular diminishing returns), and the count-informative set needs fewer, better-placed APs than the coverage set.
Method (stages)
- Candidate grid —
csi-mall-grid: 1 reference Tx (concourse centre, ceiling) + 14 ceiling candidate receiversmall-rx-00..13over concourse / shops / food court / lounge (already registered viamall_archcad_assemble.py grid). - Crowd —
walk-notebookkind: agendas, the personas above (shopper / cafeteria_patron / meeter / through_busy / quick_visitor), staggered arrivals + despawn so in-zone count varies (H(C) > 0). 5 seeds. - Cheap coverage + Pareto (NO ray-tracing) —
coverage_submodular(optimal k*, ≥ 1−1/e, coverage↔counting Pareto corner Jaccard) +coverage_meets_crowds(coverage × footfall overlay,blindspot_footfall_frac). Go/no-go gate on the divergence. - Ray-traced kernel (Sionna Metal,
--backend metal --where local) — per-candidate CSIlinks.parquet(candidate_id = link_id) →placement_oraclemeasured-mode I(C;Φ) with bootstrap CI per candidate AP; coverage from the Sionna signal map. - Deliverables —
placement_result.parquet(operational / experimental / both AP sets), five-panel figure, crowd replay to/map, session synthesis (analysis-writer → critic).
Provenance / substrate
- Floor:
mall-archcad-floor-0(buildingmall-archcad), assembled bymonad_knowledge/notebooks/python/mall_archcad_assemble.py. 9 zones · 10 doors · 14 real ArchCAD concrete columns (tileca5fdf5e) · furnished food court + shops + lounge · NRG connected. Rebuild:mall_archcad_assemble.py build --recreate. - Grid:
mall_archcad_assemble.py grid→csi-mall-gridexperiment +mall_grid.json. - Real-data gate: sim-only; magnitudes are a hypothesis until a real AX210/Pi5 floor confirms the ranking (project_cross_env_and_hardware_protocol / IP-112).
Latest session (5-seed, 2026-07-20)
Session 01KY0BYHCV4TXTSJPST5H2AJ2X — sealed (corrective re-seal of 01KY06KYBD90TXXG971XF7CSFB, 5/5 criteria). Coupled walk→Sionna-RT CSI (Metal, 5.2 GHz, depth-3) over seeds {0,1,2,3,4}. Five-panel placement-oracle figure:
fig_placement_oracle_mall-archcad-floor-0.png
Headline (5-seed): H1 cover≠count holds (1−Jaccard = 0.571 ≥ 0.15) — coverage-optimal
{3,6,7,8,11} (footfall 0.568 / count-info 0.761) vs counting-optimal {3,4,7,11,13} (0.359 /
0.896); trade asymmetric (counting-first −37% footfall, coverage-first −15% counting). H2 supported:
count hubs are the lounge (#3) + east-concourse (#9) + food-court (#2) dwell mounts, dead mount is
mid-west concourse (#5). H3 refuted — footfall coverage only 0.568 at k=5 (0.276/0.393/0.493/0.568
for k=2..5), never approaching 0.90 at 14-candidate ceiling density. Seed-rank ρ=0.474.
Follow-on studies (executed 2026-07-20)
#3 — Dense-grid k* study → session 01KY0CPRNYVMDR9EF27A0DET3P (5/5)
Tripled the candidate grid to 40 ceiling mounts (csi-mall-grid-dense, 8×5 lattice, malld-
prefix), 5 Metal seeds, reduced with budget_k=12. k* ≈ 11 APs reach ≥90% footfall (0.908 at
k=11; 0.934 at k=12; ≥95% not reached ≤12). So the 57%-at-k=5 ceiling was the sparse grid, not the
floor — but the mall genuinely needs ~11 ceiling APs at 8 m LOS. Cover≠count is stronger at
density: 1−Jaccard=0.737, seed-rank ρ=0.672 (up from 0.474), MI spread 0.284; top hub cand7
(concourse-centre, 0.337 nats). k* is a greedy upper bound (n=40 > exhaustive cap).
fig_placement_oracle_mall-archcad-floor-0_dense.png
#4 — BLE arm (BLE-calibrated CSI) → session 01KY0CYKXEV4XXZ3RCSYRHBAKJ (5/5)
ble.enabled: true → the runner emits ble_links.parquet (rssi_dbm) alongside CSI. A/B on the same
5 runs (reducer parameterised with a links-file + feature arg): BLE carries counting info (mean
per-mount MI 0.212, ~CSI's 0.172) but is blurry — spread 0.103 vs CSI 0.251, seed-rank ρ=0.186 vs
0.593. BLE-optimal {0,5,7,10,11} vs CSI-optimal {3,4,5,6,7} share only {5,7} (Jaccard 0.25; MI rank
corr 0.248). BLE is a coarse, seed-noisy locator — not a placement substitute for CSI; empirically
backs the thesis's BLE=calibration / CSI=counting split. Caveat: BLE modelled at the 5.2 GHz CSI
carrier (not real 2.4 GHz BLE) + single-scalar RSSI → a proxy, not real BLE.
fig_placement_oracle_mall-archcad-floor-0_ble.png
Real-hardware follow-on (both studies): a real 2.4 GHz BLE beacon + AX210/Pi5 CSI floor (IP-106 / IP-112) to confirm k* and the calibration-vs-counting division of labour.
Changelog
| Date | Author | Change |
|---|---|---|
| 2026-07-16 | Claude AI | Initial brief. Floor + furniture + candidate-AP grid staged; awaiting MCP-server restart to dispatch the walk + Sionna-Metal + reduction session. |
| 2026-07-16 | Claude AI | Seed-0 pilot complete end-to-end. Walk 01KXP915V3FZEPV25A21X52GZC (gate ✅, 1.15 m/s, 0 outside walkable). Coupled ray-traced CSI 01KXP96TEDX366E7S2CJG3SPCP (exp-csi-crowd, Metal, 5.2 GHz, depth-3, 48 s, 14 candidate links). Placement reduction: coverage greedy hits 1−1/e; per-candidate measured-CSI I(C;Φ) 0.12–0.31 nats (top 0.31 [0.22,0.45]); operational vs experimental Jaccard 0.43 → H1 (cover≠count) confirmed on the mall. Fixed: agenda personas must be uniquely named (shopper/shopper_east). Next: 3-seed run for robust CIs. |
| 2026-07-16 | Claude AI | 3-seed campaign complete. CSI runs seed0/1/2 = 01KXP96TEDX366E7S2CJG3SPCP / 01KXPD1B67PPPHK9ED842JP1A3 / 01KXPD2VSE39MHR1DENR5PC4D8 (exp-csi-crowd Metal, 19–48 s each). Multi-seed reduction (oracle_grid_reduce2.py): occupancy count [1,31] std 8.45 (strong H(C)); per-candidate MI spread 0.201 nats; seed-rank Spearman ρ=0.62 (ranking robust to crowd randomness, beats the resplan 0.41 prior); op-vs-exp Jaccard 0.25 — coverage-opt APs {3,6,7,8,11} vs count-opt {2,3,6,9,12} share 2/5 → H1 cover≠count holds under multi-seed; count-informative hotspots concentrate on the east food-court/lounge dwell zone (H2). 5-panel fig_placement_oracle_mall-archcad-floor-0.png + rec.json. Sim-only; hypothesis until a real AX210/Pi5 anchor. |
| 2026-07-20 | Claude AI | Extended pilot → 5 seeds; session sealed. Grid seeds: {0,1,2,3,4} (tightens CIs on the same estimand — crowd design held fixed). Seeds 0–2 reused (2026-07-16 runs, byte-identical params: trajectory_frame_stride: 20, depth-3, 5.2 GHz); seeds 3/4 fresh coupled on Metal = 01KY06XBTDDQRDM99ERNP14W64 / 01KY06ZS347XA6M0DWWT5GHYE0 (mall-csi-s3/s4.yaml, --backend metal --where local, gate ✅). 5-seed reduction (oracle_grid_reduce2.py): occupancy [1,31] std 8.45; per-cand MI 0.079–0.259 nats (top cand 3 = 0.259); seed-rank ρ=0.474 (down from pilot's 0.62 — pilot overstated rank stability); op-vs-exp Jaccard 0.429 (1−J=0.571 ≥ 0.15 → H1 holds, but more modest than pilot's 0.75); coverage-opt {3,6,7,8,11} vs count-opt {3,4,7,11,13}, only site 3 shared with pilot's count-opt → AP identities seed-sensitive; footfall coverage 0.276/0.393/0.493/0.568 for k=2..5 → H3 (≥90% at small k) REFUTED at 14-candidate density (curve not plateaued but only 0.57 at k=5). Session 01KY06KYBD90TXXG971XF7CSFB sealed (synthesis.md + criticism.md on S3; critic caught + fixed an exec-summary trade-off reversal + 4 honesty tightenings; 4/5 criteria met, Stage-3 partial — no per-candidate bootstrap CIs). Sim-only hypothesis generator; real AX210/Pi5 anchor still pending (IP-106/IP-112). |
| 2026-07-20 | Claude AI | Figure into vault + Stage-3 erratum. 5-panel figure committed to _attachments/placement-oracle/fig_placement_oracle_mall-archcad-floor-0.png and embedded above; interactive floor-plan viz (per-mount MI + CIs, coverage discs, both AP sets) published as an Artifact. Erratum: the sealed synthesis marked Stage-3 unmet, but mi_per_candidate carries bootstrap CIs that separate the top mounts (#3, #9) from the dead mount (#5) → Stage-3 is met (5/5); the analysis-writer was mistakenly given the CI-less measured_mi array. Corrected in the session block above; S3 synthesis.md is immutable. |
| 2026-07-20 | Claude AI | Reducer fix + corrective re-seal. placement_oracle.py: unified the per-candidate informativeness onto the measured multi-seed mean (drives selection + figure + mi_per_candidate; the geometric surrogate is now reserved for cross-floor transfer only), and mi_per_candidate gains a multi-seed t-CI (_t_ppf975, df=n−1). Re-ran the 5-seed reduction: placement sets unchanged (op {3,6,7,8,11} / exp {3,4,7,11,13}, 1−J=0.571, ρ=0.474) → fix is science-neutral. Re-sealed as 01KY0BYHCV4TXTSJPST5H2AJ2X (5/5, supersedes the first seal); canonical figure (measured-MI panel) → vault + session S3; rec.json + figure uploaded to the session prefix. Prep staged for the denser-grid k* study (#3) and the BLE arm (#4). |
| 2026-07-20 | Claude AI | #3 dense k* + #4 BLE arm executed & sealed. #3: grid-dense → 40-candidate csi-mall-grid-dense, 5 Metal seeds, reduced budget_k=12 (reducer gained a dense k-sweep: k_grid=range(min,max+1), pareto_k_max=budget_k). k*≈11 for ≥90% footfall; cover≠count stronger (1−J=0.737, ρ=0.672). Session 01KY0CPRNYVMDR9EF27A0DET3P 5/5. #4: 5 BLE seeds (ble.enabled, ble_links.parquet/rssi_dbm); reducer parameterised with links-file+feature args for the A/B. BLE carries count info but blurry+seed-noisy (spread 0.103/ρ0.186 vs CSI 0.251/0.593), BLE-opt vs CSI-opt Jaccard 0.25 → BLE=calibration not placement. Session 01KY0CYKXEV4XXZ3RCSYRHBAKJ 5/5. Both figures → vault; artefacts uploaded to session S3. BLE modelled at 5.2 GHz (proxy, not 2.4 GHz). |