Executive summary
Wi-Fi access points do two jobs that pull in different directions. To cover a floor for communication you spread them out so every corner has a link. To count the crowd from the way bodies disturb the radio channel, you want links concentrated where people actually flow — the doors, the corridors, the busy hub. This experiment asks, across dozens of real floorplans: are those two placements the same, or do you have to choose?
The headline, stated honestly. They are not the same. A cheap geometric screen over 57 floors puts the mean placement divergence at 0.718 (95% CI [0.680, 0.754]) — the two objectives disagree on every floor tested — and on a real institutional corridor the coverage-optimal and count-optimal AP sets are completely disjoint (Jaccard 0.00). A concrete real-world motivation: reconstruct the ATC shopping-mall crowd (18,145 people over ~11 h) and a naive 15-AP coverage grid leaves 46% of the actual footfall in a sensing blind-spot. So far, so clean. But three cautions sit on top, and they matter more than the headline:
- The geometric shortcut that would make this cheap does not work — an RSQ-style surrogate predicts the ray-traced counting signal across floors at only ρ ≈ 0.24 (range −0.52…+0.72). The physics simulator is load-bearing, and the physics simulator is uncalibrated.
- One of the two coverage numbers that started this whole line — a 57% blind-spot on one floor — turned out to be 76% one simulated person who got physically wedged in a doorway. Fixing the estimator dissolved the finding.
- The 57-floor "POWERED GO" verdict was written into a session that attached 0 runs and 0 figures in 44 seconds. The real numbers exist — but in direct-run logs, not in that seal.
Everything here is simulated. It ranks placements and generates hypotheses; it is not deployment guidance until a real AX210/Pi5 floor (IP-106 / IP-112) confirms the ranking.
The problem, in plain words
Think of a room lit by a few lamps. If you want the whole room lit (coverage), you space the lamps out evenly. If instead you want to watch shadows people cast as they move — to count them — you put the lamps where people walk, and you point them across the busy path. Same lamps, different best positions. Wi-Fi sensing is exactly this: an access point "covers" a floor if its signal reaches everywhere, but it "counts" well only if moving bodies pass through its links often enough to leave a measurable fingerprint on the channel.
The naive assumption in a building rollout is that once you have covered the floor for communication, you can bolt on crowd-counting for free — the APs are already there. This experiment tests that assumption. It also asks a subtler question the field has barely touched: prior work scores hand-designed placements against static seated people (wang2025_2c42 ↗). We have a generative twin that walks crowds through real geometry and ray-traces the CSI they produce, so we can ask the placement question against flowing crowds — the exact open question wang2025 leaves at the end of its paper.
What we are trying to prove
- Hypothesis (falsifiable): the count-optimal AP set is a materially different set from the coverage-optimal one — placement divergence (1 − Jaccard of the two chosen sets) is large, its CI excludes a 0.15 threshold, and the count-optimal set tracks the doors/corridors the flow uses. If the two sets coincide everywhere, the hypothesis fails and placement is simply an area/anchor-budget problem, not a counting-geometry one.
- Second claim (the physics is load-bearing): a geometric surrogate cannot stand in for the ray-traced counting signal — if it could (high held-out rank correlation), you would never need the expensive simulator. We expected the surrogate to help; it does not.
- What a null means. If coverage-optimal were count-optimal, retrofitting counting onto a comms rollout would be free and this whole placement question would collapse. It does not collapse — but note the honest limit: the counting signal is only rankable where the headcount actually varies. Pin the count (a full, static room) and the estimand
I(C;Φ)goes to zero by construction — which is why every simulated crowd must enter and leave.
How the experiment works (plain method)
- Walk a crowd on each real floor.
walk-notebook(IP-107 agendas) sends 5–7 personas — a long-stay worker, a study group, a cafeteria patron, a browser, through-traffic streams — door-to-door across the actual wall layout, each arriving and leaving so the headcount ramps and drains. Output: a footfall surface (where people spend time) and a replayable trajectory. - Cheap screen, corpus-wide (no ray-tracing). A submodular optimiser (
coverage_submodular) places k=4 APs two ways — maximise covered footfall (breadth) vs maximise a counting-depth proxy (concentration on flow) — and measures how differently they place: 1 − Jaccard of the two sets. Coverage is provably submodular, so greedy gets within 1−1/e of optimal; counting is not submodular, so greedy there is a heuristic. - Ray-traced kernel, sparse (expensive). On a few verify floors,
sionna-csi-runnercouples to the crowd and computes the mutual informationI(C;Φ)between the live headcount and each anchor's CSI amplitude — the propagation-honest counting signal, with bootstrap CIs. - Coverage-of-demand, separately (c-coverage-meets-crowds / c-coverage-estimator-factorial). For placed anchors, overlay line-of-sight coverage on the footfall and report the one scalar operations cares about: the fraction of real footfall that falls in a sensing blind-spot.
What we've found so far (honest, across three campaigns)
Two of the three campaigns carry real, sealed, run-attached sessions. One does not — read its caveat.
| Finding | Real number | Provenance / caveat |
|---|---|---|
| Coverage-opt ≠ count-opt (cheap screen, 57 floors) | divergence 0.718 [0.680, 0.754], differ 57/57 | Stage-2 geometric proxy, not ray-traced; from direct-run logs, not a sealed session |
| Real corridor, ray-traced (S3DIS area_5) | Jaccard 0.00, per-AP rank ρ −0.23 | direct run; 1 crowd seed; single amplitude feature |
| Real lobby, ray-traced (S3DIS area_4) | Jaccard 0.50, rank ρ 0.04 | open room ⇒ objectives partly coincide (honest geometry nuance) |
| Furniture is not neutral | count-optimal set moves in both rooms; empty↔furnished MI ρ 0.48–0.62 | placement chosen on an empty CAD shell is the wrong placement |
| Real-crowd motivation (ATC, 18,145 persons) | 15-AP coverage grid misses 46% of footfall | reconstructed occupancy, not measured CSI |
| Geometric surrogate for ray-traced MI | mean held-out ρ = 0.24 (−0.52…+0.72) | the physics sim is load-bearing; "expensive-RSQ" risk confirmed |
| Per-candidate MI rank stability across seeds | Spearman ρ = 0.41 | average over seeds before trusting a rank |
| Ray-traced discrimination (verify floors) | spread 0.25 nats where count 1→17; flat where count ≤ 8 | honest dynamic-range limit; 28.5 dB/person mechanism |
| Coverage blind-spot ranking (7 floors, real session, 7 runs) | synth 0% · 12419 1% · 16157 1% · 7421 5% · 1374 14% · 147440 22% · 12439 57% | rises with area at fixed 4-anchor budget; 12439 is N=1 confounded on 4 axes |
| The 57% headline, re-examined (real session, 20 runs) | was 76% one wedged agent; bounded-influence fix → max wedged share 0.7% | the estimator, not the building, produced the number |
| Clean 2×2×2 factorial (placement × anchor × furniture) | placement×anchor interaction +45.8 pp [+43.2,+48.4] → main effect inadmissible | you cannot read an anchor-layout main effect; it depends on placement policy |
| Surrogate+verify (C4) and 3-variant placement_result (C5) | not done | the deliverable a deployer actually needs is unfinished |
The three cautions, plainly. (1) The placement-oracle campaign's latest session 01KXE2P8… stamped a "POWERED GO" with divergence 0.718 — but it ran 0 runs, 0 figures, 0 CPU-hours in 44 s. The numbers are real, but they come from direct sim run executions logged in the campaign note, not from that seal; treat the seal as a write-up, not evidence. (2) The coverage-meets-crowds 57% headline was a single stuck simulated pedestrian — a pedestrian-dynamics artifact, not a coverage fact — and the follow-on coverage-estimator-factorial both fixed it and showed the anchor-layout effect is not separable from placement policy (the interaction dominates). (3) The surrogate failure (ρ=0.24) means there is no cheap path: every floor needs the uncalibrated ray-tracer, and the ray-tracer has never been checked against a real capture.
How to read the figures
Real figures live under _attachments/placement-oracle/ (agendas/, public-day/) and in the two coverage sessions' artefacts/ prefixes.
fig_placement_oracle_<floor>(five panels). (1) candidate grid — where an AP can mount (near a wall) vs mid-room; (2) footfall surface — where people went; (3) coverage layer; (4) per-candidateI(C;Φ)heat — the counting-informativeness of each site; (5) the chosen APs for coverage vs counting. The story is panels 3 and 4 disagreeing: bright coverage sites are not bright counting sites.- Public-day overlays (
public_day_results.ipynb). Coverage × footfall for the S3DIS corridor and lobby, empty vs furnished. Read the corridor as the clean case (fully disjoint) and the lobby as the muddy case (small open room, objectives partly overlap) — the divergence is geometry-dependent, not universal. fig_coverage_summary(coverage-meets-crowds). Blind-spot footfall ranked across 7 floors. Read it with the factorial's corrected CI version — the raw 57% bar is the contaminated one.seed_trace/paired_diff(factorial). The disciplined figures: per-seed paired differences with the interaction plotted first. The honest reading is that the interaction bar excludes 0, so the tempting "hub vs dispersed" main-effect bar must not be read.
Review panel
Each voice is a prepared expert with a one-line stance and the literature it argues from. Verdicts are about this experiment's current evidence — including its broken provenance — not the idea in the abstract.
Key references
- wang2025_2c42 ↗ — the static-seated placement baseline whose Open Question 6 (dynamic/flowing crowds) this experiment answers generatively.
- afghantoloee2021_8628 ↗, zhen2022_bb0b ↗ — indoor sensor/anchor placement optimisation; the OR and deployment framing.
- zhou2020_6173 ↗, liu2022_8a7a ↗, zou2018_1590 ↗ — device-free CSI counting the placement is meant to serve.
- cominelli2023_e6ee ↗ — the field scientist's reality check on clean-tensor CSI.
- helbing2005_94a7 ↗, chen2018_894a ↗, tordeux2016_5e66 ↗ — the crowd-model basis for the footfall surface and the wedge-artifact critique.
- wang2026_2758 ↗, chen2023_5cbd ↗, jin2025_14eb ↗ — the red-team's sim-to-real gap and the surrogate-repair direction.
- zhang2026_ccac ↗, guarino2026_e72c ↗ — the reproducibility bar the phantom seal violates.
- huang2025_060d ↗ — a public real-CSI anchor for the red-team's cross-check demand.
- chen2018_97e0 ↗, chaudhari2024_6efc ↗, chaudhari2026_85b1 ↗ — the facilities/dual-use value framing.
- demrozi2021_bf55 ↗ — BLE occupancy, the deployment practitioner's cost basis.