# Cell-site selection with fast radio-map predictors

Simplified task: given a city map and a set of candidate transmitter sites, pick the site (or a set of sites) that
covers the most outdoor area. RadioMapSeer provides WinProp maps for 80 candidate sites on each of the 99 official
test maps, so every choice can be checked against the simulator. Code: `rcm_ml/cell_placement.py`; tables below are
generated by `python -m rcm_ml.cell_report` from `runs/mps/cell_placement.json`.

## Setup

- **Scene:** RadioMapSeer, 256 m × 256 m, 25 m buildings, transmitter and receivers at 1.5 m, 5.9 GHz (a street-level
  small cell, not a mast).
- **Coverage of a site:** share of outdoor pixels with path gain above a threshold: −100, −110 and −120 dB (the data
  floor is −127 dB). As an example link budget, 23 dBm transmit power and a −95 dBm receiver need about −118 dB.
- **One site:** each method predicts all 80 maps and picks the site with the highest predicted coverage. "Coverage
  lost" is the true coverage of the best site minus the true coverage of the pick, in percentage points (pp).
- **Three sites:** greedy selection maximising joint predicted coverage (a pixel counts once if any chosen site covers
  it), scored against greedy selection on the true maps.
- **Truths:** WinProp DPM and WinProp IRT2 in turn; each is also scored as a method against the other.
- **Methods:** physics maps B1/B2 (fitted formulas), our 2D ray tracer calibrated to IRT2 (10 CPU processes), and the
  PoC U-Nets (128 px, trained 12 epochs on DPM, one on IRT2; Apple GPU). Sionna is not included: a full map takes
  1.5–10 minutes, so 80 sites × 99 maps is out of reach for this comparison.

## Results

<!-- auto:start -->
Commit of the run: `f209a05`. U-Net checkpoints: U-Net geometry only = `runs/poc/geom_s128_m501_seed0`, U-Net + straight-line physics (B1) = `runs/poc/feats_s128_m501_seed0`, U-Net + street-canyon physics (B2) = `runs/poc/feats-B2_s128_m501_seed0`, U-Net + physics residual = `runs/poc/hybrid_s128_m501_seed0`, U-Net geometry only, trained on IRT2 = `runs/poc/geom_irt2_s128_m501_seed0`.

### Truth: WinProp DPM, coverage threshold -100 dB (99 test maps × 80 candidate sites)

Context (mean over maps): best single site covers 36.38% of outdoor pixels, the median site 24.25%; a random pick loses 12.77 pp; the best 3 sites (greedy on truth) cover 63.07%.

| Method | 1 site: coverage lost vs best, mean (median / 90th pct), pp | Picks the true best | Pick in true top 5 | Rank correlation over 80 sites | 3 sites: coverage lost vs greedy on truth, pp | s per map (80 sites) |
|---|---|---|---|---|---|---|
| *WinProp DPM* (reference) | 0.0 (0.0 / 0.0) | 100.0% | 100.0% | 1.0 | 0.0 | – |
| U-Net + straight-line physics (B1) | 0.04 (0.0 / 0.17) | 81.8% | 100.0% | 0.995 | 0.05 | 0.0364 |
| U-Net + street-canyon physics (B2) | 0.04 (0.0 / 0.17) | 80.8% | 100.0% | 0.996 | 0.02 | 0.0375 |
| U-Net + physics residual | 0.04 (0.0 / 0.13) | 83.8% | 100.0% | 0.995 | -0.07 | 0.0367 |
| Physics map B2 (street canyon) | 0.09 (0.0 / 0.27) | 77.8% | 98.0% | 0.992 | 0.22 | 0.0123 |
| Physics map B1 (straight-line walls) | 0.12 (0.0 / 0.39) | 71.7% | 97.0% | 0.989 | 0.3 | 0.0296 |
| U-Net geometry only | 0.24 (0.0 / 0.76) | 60.6% | 90.9% | 0.984 | 0.28 | 0.0417 |
| WinProp IRT2 | 0.59 (0.05 / 1.78) | 46.5% | 78.8% | 0.977 | 0.27 | – |
| Our ray tracer, calibrated to IRT2 | 0.69 (0.15 / 2.03) | 41.4% | 79.8% | 0.977 | 0.26 | 0.9417 |
| U-Net geometry only, trained on IRT2 | 0.94 (0.49 / 2.54) | 25.3% | 74.7% | 0.962 | 0.66 | 0.0328 |

### Truth: WinProp DPM, coverage threshold -110 dB (99 test maps × 80 candidate sites)

Context (mean over maps): best single site covers 52.09% of outdoor pixels, the median site 40.09%; a random pick loses 13.43 pp; the best 3 sites (greedy on truth) cover 80.3%.

| Method | 1 site: coverage lost vs best, mean (median / 90th pct), pp | Picks the true best | Pick in true top 5 | Rank correlation over 80 sites | 3 sites: coverage lost vs greedy on truth, pp | s per map (80 sites) |
|---|---|---|---|---|---|---|
| *WinProp DPM* (reference) | 0.0 (0.0 / 0.0) | 100.0% | 100.0% | 1.0 | 0.0 | – |
| U-Net + physics residual | 0.14 (0.0 / 0.41) | 75.8% | 97.0% | 0.988 | 0.15 | 0.0367 |
| U-Net + street-canyon physics (B2) | 0.15 (0.0 / 0.37) | 74.7% | 96.0% | 0.99 | 0.14 | 0.0375 |
| U-Net + straight-line physics (B1) | 0.22 (0.0 / 0.7) | 69.7% | 98.0% | 0.987 | 0.11 | 0.0364 |
| Our ray tracer, calibrated to IRT2 | 0.38 (0.0 / 0.93) | 52.5% | 92.9% | 0.97 | 0.14 | 0.9417 |
| U-Net geometry only | 0.41 (0.01 / 1.28) | 49.5% | 90.9% | 0.967 | 0.73 | 0.0417 |
| Physics map B2 (street canyon) | 0.61 (0.0 / 2.02) | 51.5% | 84.8% | 0.959 | 0.46 | 0.0123 |
| WinProp IRT2 | 0.97 (0.33 / 2.77) | 36.4% | 79.8% | 0.948 | 0.85 | – |
| U-Net geometry only, trained on IRT2 | 1.14 (0.48 / 2.84) | 34.3% | 76.8% | 0.936 | 0.89 | 0.0328 |
| Physics map B1 (straight-line walls) | 1.43 (1.03 / 3.63) | 32.3% | 63.6% | 0.879 | 1.77 | 0.0296 |

### Truth: WinProp DPM, coverage threshold -120 dB (99 test maps × 80 candidate sites)

Context (mean over maps): best single site covers 77.94% of outdoor pixels, the median site 65.84%; a random pick loses 13.8 pp; the best 3 sites (greedy on truth) cover 94.84%.

| Method | 1 site: coverage lost vs best, mean (median / 90th pct), pp | Picks the true best | Pick in true top 5 | Rank correlation over 80 sites | 3 sites: coverage lost vs greedy on truth, pp | s per map (80 sites) |
|---|---|---|---|---|---|---|
| *WinProp DPM* (reference) | 0.0 (0.0 / 0.0) | 100.0% | 100.0% | 1.0 | 0.0 | – |
| U-Net + physics residual | 0.59 (0.04 / 1.6) | 46.5% | 87.9% | 0.951 | 0.5 | 0.0367 |
| U-Net + street-canyon physics (B2) | 0.61 (0.04 / 1.92) | 47.5% | 94.9% | 0.955 | 0.35 | 0.0375 |
| U-Net + straight-line physics (B1) | 0.81 (0.04 / 2.37) | 47.5% | 85.9% | 0.951 | 0.4 | 0.0364 |
| U-Net geometry only | 1.04 (0.23 / 3.07) | 41.4% | 83.8% | 0.928 | 0.55 | 0.0417 |
| Our ray tracer, calibrated to IRT2 | 1.47 (0.38 / 4.28) | 40.4% | 69.7% | 0.864 | 0.52 | 0.9417 |
| WinProp IRT2 | 1.84 (0.89 / 5.11) | 30.3% | 65.7% | 0.85 | 0.71 | – |
| U-Net geometry only, trained on IRT2 | 2.07 (1.15 / 4.91) | 22.2% | 64.6% | 0.847 | 0.67 | 0.0328 |
| Physics map B2 (street canyon) | 2.34 (2.05 / 5.66) | 21.2% | 52.5% | 0.846 | 1.65 | 0.0123 |
| Physics map B1 (straight-line walls) | 5.73 (3.93 / 14.26) | 10.1% | 27.3% | 0.668 | 3.67 | 0.0296 |

### Truth: WinProp IRT2, coverage threshold -100 dB (99 test maps × 80 candidate sites)

Context (mean over maps): best single site covers 31.14% of outdoor pixels, the median site 20.58%; a random pick loses 11.04 pp; the best 3 sites (greedy on truth) cover 58.89%.

| Method | 1 site: coverage lost vs best, mean (median / 90th pct), pp | Picks the true best | Pick in true top 5 | Rank correlation over 80 sites | 3 sites: coverage lost vs greedy on truth, pp | s per map (80 sites) |
|---|---|---|---|---|---|---|
| *WinProp IRT2* (reference) | 0.0 (0.0 / 0.0) | 100.0% | 100.0% | 1.0 | 0.0 | – |
| Our ray tracer, calibrated to IRT2 | 0.06 (0.0 / 0.23) | 78.8% | 98.0% | 0.991 | 0.12 | 0.9417 |
| U-Net geometry only, trained on IRT2 | 0.27 (0.05 / 0.82) | 46.5% | 93.9% | 0.981 | 0.48 | 0.0328 |
| U-Net + physics residual | 0.49 (0.08 / 1.45) | 48.5% | 79.8% | 0.977 | 1.58 | 0.0367 |
| U-Net + street-canyon physics (B2) | 0.51 (0.24 / 1.51) | 47.5% | 80.8% | 0.978 | 1.73 | 0.0375 |
| Physics map B2 (street canyon) | 0.54 (0.19 / 1.55) | 45.5% | 81.8% | 0.975 | 1.81 | 0.0123 |
| WinProp DPM | 0.55 (0.21 / 1.56) | 46.5% | 78.8% | 0.977 | 1.89 | – |
| U-Net + straight-line physics (B1) | 0.55 (0.32 / 1.61) | 42.4% | 78.8% | 0.977 | 1.64 | 0.0364 |
| U-Net geometry only | 0.69 (0.34 / 2.06) | 36.4% | 77.8% | 0.971 | 1.86 | 0.0417 |
| Physics map B1 (straight-line walls) | 0.71 (0.34 / 2.02) | 38.4% | 76.8% | 0.966 | 2.45 | 0.0296 |

### Truth: WinProp IRT2, coverage threshold -110 dB (99 test maps × 80 candidate sites)

Context (mean over maps): best single site covers 52.81% of outdoor pixels, the median site 40.02%; a random pick loses 14.46 pp; the best 3 sites (greedy on truth) cover 79.45%.

| Method | 1 site: coverage lost vs best, mean (median / 90th pct), pp | Picks the true best | Pick in true top 5 | Rank correlation over 80 sites | 3 sites: coverage lost vs greedy on truth, pp | s per map (80 sites) |
|---|---|---|---|---|---|---|
| *WinProp IRT2* (reference) | 0.0 (0.0 / 0.0) | 100.0% | 100.0% | 1.0 | 0.0 | – |
| Our ray tracer, calibrated to IRT2 | 0.54 (0.21 / 1.51) | 44.4% | 89.9% | 0.962 | 0.38 | 0.9417 |
| WinProp DPM | 0.94 (0.36 / 2.82) | 36.4% | 83.8% | 0.948 | 1.09 | – |
| U-Net + physics residual | 0.94 (0.31 / 3.01) | 40.4% | 83.8% | 0.947 | 0.86 | 0.0367 |
| U-Net + straight-line physics (B1) | 0.99 (0.41 / 3.01) | 36.4% | 82.8% | 0.947 | 0.9 | 0.0364 |
| U-Net + street-canyon physics (B2) | 1.08 (0.38 / 3.07) | 38.4% | 80.8% | 0.947 | 0.98 | 0.0375 |
| U-Net geometry only, trained on IRT2 | 1.29 (0.59 / 3.55) | 31.3% | 74.7% | 0.943 | 1.09 | 0.0328 |
| U-Net geometry only | 1.32 (0.94 / 3.33) | 28.3% | 69.7% | 0.936 | 1.39 | 0.0417 |
| Physics map B2 (street canyon) | 1.52 (0.95 / 3.97) | 32.3% | 70.7% | 0.912 | 1.42 | 0.0123 |
| Physics map B1 (straight-line walls) | 1.93 (1.35 / 4.7) | 25.3% | 63.6% | 0.85 | 2.36 | 0.0296 |

### Truth: WinProp IRT2, coverage threshold -120 dB (99 test maps × 80 candidate sites)

Context (mean over maps): best single site covers 73.38% of outdoor pixels, the median site 59.15%; a random pick loses 16.17 pp; the best 3 sites (greedy on truth) cover 91.51%.

| Method | 1 site: coverage lost vs best, mean (median / 90th pct), pp | Picks the true best | Pick in true top 5 | Rank correlation over 80 sites | 3 sites: coverage lost vs greedy on truth, pp | s per map (80 sites) |
|---|---|---|---|---|---|---|
| *WinProp IRT2* (reference) | 0.0 (0.0 / 0.0) | 99.0% | 100.0% | 1.0 | 0.0 | – |
| Our ray tracer, calibrated to IRT2 | 1.52 (0.89 / 4.35) | 32.3% | 76.8% | 0.911 | 1.03 | 0.9417 |
| WinProp DPM | 2.09 (1.19 / 6.29) | 30.3% | 68.7% | 0.85 | 2.07 | – |
| U-Net geometry only, trained on IRT2 | 2.16 (1.52 / 5.47) | 24.2% | 59.6% | 0.902 | 1.25 | 0.0328 |
| U-Net + straight-line physics (B1) | 2.47 (1.41 / 6.36) | 24.2% | 66.7% | 0.844 | 2.38 | 0.0364 |
| U-Net + physics residual | 2.54 (1.41 / 6.22) | 25.3% | 68.7% | 0.842 | 2.18 | 0.0367 |
| U-Net + street-canyon physics (B2) | 2.62 (1.52 / 6.22) | 24.2% | 65.7% | 0.838 | 2.05 | 0.0375 |
| U-Net geometry only | 3.27 (2.23 / 7.97) | 16.2% | 53.5% | 0.83 | 2.29 | 0.0417 |
| Physics map B2 (street canyon) | 5.61 (3.66 / 13.69) | 12.1% | 38.4% | 0.708 | 4.65 | 0.0123 |
| Physics map B1 (straight-line walls) | 8.17 (5.99 / 17.1) | 2.0% | 25.3% | 0.547 | 6.31 | 0.0296 |
<!-- auto:end -->

## Tuned Sionna on a subset of maps

Sionna is too slow for all 7,920 sites (1.5–10 minutes per full map), so it is run on an 8 m grid (about 900
receiver points per site) for all 80 sites of the first test maps (`scripts/cell_sionna.sh`, configuration
`scat09a_r100k` of `04-sionna-configurations.md`: rough walls, angle-dependent diffraction; second variant adds our
tracer's two-corner paths). Each grid value fills its 8 m block. The row "WinProp DPM read on the 8 m grid" shows what
the grid alone costs (the true DPM maps sampled at the same points). All other methods are rescored on the same maps. Truth DPM and IRT2, threshold −110 dB.

<!-- sionna:start -->
Commit of the run: `5840498`. Maps: 419, 392, 593, 499, 139, 63, 472, 129, 681, 521, 65, 15, 157, 41, 493, 380, 188, 217, 53, 338. U-Net checkpoints: U-Net geometry only = `runs/poc/geom_s128_m501_seed0`, U-Net + straight-line physics (B1) = `runs/poc/feats_s128_m501_seed0`, U-Net + street-canyon physics (B2) = `runs/poc/feats-B2_s128_m501_seed0`, U-Net + physics residual = `runs/poc/hybrid_s128_m501_seed0`, U-Net geometry only, trained on IRT2 = `runs/poc/geom_irt2_s128_m501_seed0`.

### Truth: WinProp DPM, coverage threshold -110 dB (20 test maps × 80 candidate sites)

Context (mean over maps): best single site covers 43.94% of outdoor pixels, the median site 30.58%; a random pick loses 13.83 pp; the best 3 sites (greedy on truth) cover 74.97%.

| Method | 1 site: coverage lost vs best, mean (median / 90th pct), pp | Picks the true best | Pick in true top 5 | Rank correlation over 80 sites | 3 sites: coverage lost vs greedy on truth, pp | s per map (80 sites) |
|---|---|---|---|---|---|---|
| *WinProp DPM* (reference) | 0.0 (0.0 / 0.0) | 100.0% | 100.0% | 1.0 | 0.0 | – |
| WinProp DPM read on the 8 m grid | 0.0 (0.0 / 0.0) | 100.0% | 100.0% | 0.996 | 0.08 | – |
| U-Net + straight-line physics (B1) | 0.19 (0.0 / 0.7) | 65.0% | 100.0% | 0.987 | -0.43 | 0.0344 |
| U-Net + street-canyon physics (B2) | 0.22 (0.0 / 0.79) | 85.0% | 95.0% | 0.99 | -0.08 | 0.0352 |
| U-Net + physics residual | 0.22 (0.0 / 0.92) | 70.0% | 100.0% | 0.988 | -0.61 | 0.0343 |
| Our ray tracer, calibrated to IRT2 | 0.4 (0.0 / 0.94) | 60.0% | 90.0% | 0.968 | -0.53 | 1.1805 |
| U-Net geometry only | 0.55 (0.1 / 1.74) | 45.0% | 100.0% | 0.971 | 0.74 | 0.048 |
| Physics map B2 (street canyon) | 0.67 (0.25 / 1.61) | 45.0% | 90.0% | 0.961 | 0.94 | 0.011 |
| Physics map B1 (straight-line walls) | 0.82 (0.0 / 2.13) | 55.0% | 80.0% | 0.835 | 2.12 | 0.0293 |
| WinProp IRT2 | 0.86 (0.48 / 1.92) | 30.0% | 85.0% | 0.955 | 0.8 | – |
| Sionna tuned (8 m grid) | 1.27 (0.57 / 3.74) | 40.0% | 70.0% | 0.943 | 1.65 | 255.2 |
| Sionna tuned + two-corner paths (8 m grid) | 1.27 (0.57 / 3.74) | 40.0% | 70.0% | 0.943 | 1.66 | 255.2 |
| U-Net geometry only, trained on IRT2 | 1.38 (0.25 / 3.37) | 40.0% | 85.0% | 0.946 | 0.31 | 0.0308 |

### Truth: WinProp IRT2, coverage threshold -110 dB (20 test maps × 80 candidate sites)

Context (mean over maps): best single site covers 44.8% of outdoor pixels, the median site 30.09%; a random pick loses 15.34 pp; the best 3 sites (greedy on truth) cover 74.16%.

| Method | 1 site: coverage lost vs best, mean (median / 90th pct), pp | Picks the true best | Pick in true top 5 | Rank correlation over 80 sites | 3 sites: coverage lost vs greedy on truth, pp | s per map (80 sites) |
|---|---|---|---|---|---|---|
| *WinProp IRT2* (reference) | 0.0 (0.0 / 0.0) | 100.0% | 100.0% | 1.0 | 0.0 | – |
| Our ray tracer, calibrated to IRT2 | 0.39 (0.03 / 1.08) | 50.0% | 100.0% | 0.967 | 0.52 | 1.1805 |
| U-Net + straight-line physics (B1) | 0.94 (0.07 / 3.46) | 45.0% | 90.0% | 0.952 | 1.12 | 0.0344 |
| U-Net + physics residual | 1.14 (0.18 / 4.13) | 40.0% | 90.0% | 0.953 | 0.97 | 0.0343 |
| WinProp DPM | 1.15 (0.51 / 3.04) | 30.0% | 90.0% | 0.955 | 2.15 | – |
| WinProp DPM read on the 8 m grid | 1.15 (0.51 / 3.04) | 30.0% | 90.0% | 0.953 | 2.14 | – |
| U-Net geometry only, trained on IRT2 | 1.2 (0.54 / 2.64) | 35.0% | 85.0% | 0.955 | 0.7 | 0.0308 |
| Sionna tuned (8 m grid) | 1.24 (0.13 / 2.55) | 40.0% | 85.0% | 0.948 | 2.15 | 255.2 |
| Sionna tuned + two-corner paths (8 m grid) | 1.24 (0.13 / 2.55) | 40.0% | 85.0% | 0.948 | 2.1 | 255.2 |
| U-Net geometry only | 1.44 (1.03 / 4.4) | 30.0% | 80.0% | 0.945 | 2.22 | 0.048 |
| U-Net + street-canyon physics (B2) | 1.49 (0.85 / 4.47) | 30.0% | 85.0% | 0.954 | 1.88 | 0.0352 |
| Physics map B1 (straight-line walls) | 1.87 (0.18 / 4.83) | 40.0% | 85.0% | 0.8 | 3.52 | 0.0293 |
| Physics map B2 (street canyon) | 1.91 (0.92 / 4.52) | 35.0% | 80.0% | 0.908 | 2.85 | 0.011 |
<!-- sionna:end -->

## Findings

Numbers from the tables above; "pp" = percentage points of outdoor area. The −110 dB threshold is used as the main
case unless stated.

1. **Every predictor is far better than chance, and the good ones are close to the simulator.** A random site loses
   13.4 pp against the best of 80 (DPM, −110 dB; the best site covers 52% of the outdoor area). The U-Nets with a
   physics input lose 0.14–0.22 pp on average, pick the exact best site 70–76% of the time and a top-5 site 96–98% of
   the time, and predict all 80 sites of a map in about 0.04 s on the Apple GPU (0.5 ms per site).
2. **The physics input matters for planning, not just for RMSE.** The geometry-only U-Net loses 0.41 pp (picks the best
   site 50% of the time); the physics maps alone lose 0.61 pp (B2) and 1.43 pp (B1). The U-Net that sees the physics map
   beats both. At −120 dB the straight-line physics map (B1) collapses (5.7 pp lost), because its errors near the
   floor decide which pixels count as covered.
3. **Which simulator you trust matters as much as which model you use.** Planning with DPM when IRT2 is the truth loses
   0.94 pp (and 0.97 pp the other way round): the two WinProp methods disagree about the best site about as much as
   our models disagree with either. Against IRT2 the method calibrated to IRT2 (our ray tracer) is best (0.54 pp); the
   DPM-trained U-Nets lose 0.94–1.08 pp. So the models are good enough that the remaining planning error is dominated
   by the choice of reference, which only real measurements can settle.
4. **Three sites:** greedy selection on U-Net predictions covers within 0.11–0.15 pp of greedy selection on the true
   maps (best 3 sites cover 80% of the outdoor area). Slightly negative values in some cells are possible because
   greedy selection is not optimal, so a different pick can beat it.
5. **Speed per map (80 candidate sites):** U-Nets 0.03–0.04 s (GPU), physics maps 0.01–0.03 s, our ray tracer about
   0.9 s on 10 CPU processes; tuned Sionna on the 8 m grid about 250 s (Apple GPU, 128 receivers per call).
6. **Tuned Sionna is a poor site planner here** (20 maps, section above). Against DPM it loses 1.27 pp (best site 40%,
   top-5 70%), worse than our ray tracer (0.40), the physics U-Nets (0.19–0.22) and even IRT2 itself (0.86); against
   IRT2, the simulator it was calibrated to, it loses 1.24 pp vs 0.39 for our tracer. The 8 m grid is not the cause:
   DPM read on the same grid loses 0.00 pp. Adding our two-corner paths changes nothing at −110 dB. Its per-pixel error
   is close to our tracer's (`04`), so the gap comes from how its errors are arranged: the remaining weak deep-shadow
   areas (e.g. map 419, top left) change which site covers most, and it is about 200× slower than our tracer (255 s vs 1.2 s per map on this run). On 20 maps
   one wrong pick moves the mean by about 0.1 pp, so the ranking among methods within ~0.3 pp is not settled.

**Limits.** Street-level transmitters (1.5 m) on flat 256 m tiles with identical 25 m buildings; the candidate sites
are the dataset's 80 positions; the truth is a simulator, not measurements. U-Nets are the 12-epoch PoC checkpoints
at 128 px (2 m pixels).

**Figure:** `figures/05_cell_placement.png`: on test map 419 the site picked by the B2 U-Net is the same as the one
picked by DPM, and its predicted coverage of all 80 sites lies on the diagonal, while the B1 physics map underestimates
the better sites.
