# Are the far-range references converged?

06-cloudrf.md uses our tracer and Sionna as the reference beyond the 256 m WinProp tiles. Neither has a distance
limit, but both can miss long routes: Sionna finds paths by shooting rays, and our tracer stops after `max_int`
interactions with a fixed ray / diffraction-fan count. This note checks whether their far-field coverage grows with
more rays or deeper paths. Code: `rcm_ml/far_convergence.py`, `scripts/far_convergence.sh`. Numbers:
`runs/convergence/report.json`, `runs/convergence/winprop_rings.json`. Figure: `figures/08_far_convergence.png`.

## Setup

- Same 2 km mosaic and Tx as 06-cloudrf.md (`runs/cloudrf/mosaic_2km_anchor`, Tx at 1130,1107).
- 350 fixed outdoor receivers (seed 0): 50 at 0–100 m, 100 each at 100–200, 200–400 and 400–800 m.
- Sionna: scat09a calibration (`--scattering 0.9 --diffuse`), 10⁵–10⁷ rays per source, depth 3–5,
  `--max-paths 15000000`, with and without our tracer's two-corner paths (ddloss 5 dB, as in the recommended setup).
- Our tracer (`runs/mps/raytrace_3_calibrated.json`: PLE 2.6, 10 dB per reflection, 20 dB diffraction slope):
  2, 3 and 4 interactions, and 4× rays and diffraction fan at 2 interactions.

## Result

Receivers above −127 dB, %:

| reference | rays | depth / interactions | 0–100 m | 100–200 m | 200–400 m | 400–800 m | s |
|---|---|---|---|---|---|---|---|
| Sionna (d3_1e5) | 1e+05 | 3 | 90 | 59 | 9 | 1 | 4.27 |
| Sionna + two-corner (d3_1e5) | 1e+05 | 3 | 94 | 67 | 10 | 1 | 4.27 |
| Sionna (d3_1e6) | 1e+06 | 3 | 92 | 63 | 10 | 1 | 15.61 |
| Sionna + two-corner (d3_1e6) | 1e+06 | 3 | 94 | 71 | 12 | 1 | 15.61 |
| Sionna (d3_1e6_c16) | 1e+06 | 3 | 92 | 63 | 10 | 1 | 12.68 |
| Sionna + two-corner (d3_1e6_c16) | 1e+06 | 3 | 94 | 71 | 12 | 1 | 12.68 |
| Sionna (d3_1e7_c16) | 1e+07 | 3 | 92 | 63 | 10 | 1 | 77.21 |
| Sionna + two-corner (d3_1e7_c16) | 1e+07 | 3 | 94 | 71 | 12 | 1 | 77.21 |
| Sionna (d4_1e6) | 1e+06 | 4 | 94 | 64 | 10 | 1 | 19.92 |
| Sionna + two-corner (d4_1e6) | 1e+06 | 4 | 94 | 71 | 12 | 1 | 19.92 |
| Sionna (d5_1e6) | 1e+06 | 5 | 96 | 65 | 10 | 1 | 26.18 |
| Sionna + two-corner (d5_1e6) | 1e+06 | 5 | 96 | 71 | 12 | 1 | 26.18 |
| our tracer (int2) | 57600 | 2 | 92 | 54 | 15 | 1 | 25.3 |
| our tracer (int2_rays4x) | 230400 | 2 | 92 | 55 | 15 | 1 | 85.7 |
| our tracer (int3) | 57600 | 3 | 92 | 58 | 15 | 1 | 30.8 |
| our tracer (int4) | 57600 | 4 | 92 | 58 | 15 | 1 | 36.6 |

Ring sizes: 0–100 m 50, 100–200 m 100, 200–400 m 100, 400–800 m 100 receivers (1 receiver = 1 % in the outer rings). `_c16` solves 16 receivers per Sionna call instead of 128: identical coverage and at most 0.5 dB difference per receiver, so `--max-paths` does not cut paths; 10⁷ rays only run with the smaller chunks (128 fails inside Sionna).

Both tools are converged at this floor. Ten times more rays or two more bounces change coverage by at most a few
points, and beyond 400 m only 1 % of receivers have signal in every setting. So the far-field emptiness of
06-cloudrf.md is not a sampling artefact.

## But the references are only as good as their calibration

WinProp on its own tiles (`winprop` subcommand, every case that has an IRT4 map), outdoor % above −127 dB:

| 1402 cases | 0–50 m | 50–100 m | 100–150 m | 150–200 m | 200–260 m | 260–400 m |
|---|---|---|---|---|---|---|
| DPM | 98.7 % | 95.7 % | 84.1 % | 65.4 % | 45.7 % | 24.5 % |
| IRT2 | 92.9 % | 83.2 % | 67.4 % | 49.6 % | 33.4 % | 16.8 % |
| IRT4 | 97.9 % | 94.8 % | 84.5 % | 68.4 % | 49.8 % | 28.7 % |

The 260–400 m ring is only the tile corners (17,769 outdoor pixels in total); the other rings have millions.

Going from 2 to 4 interactions adds 15–17 points of coverage at 100–260 m in WinProp, and IRT4 ≈ DPM. Our tracer
gains 0–4 points from the same change, because it was calibrated against IRT2 with 10 dB per reflection: every
extra bounce falls under the floor. Sionna was also calibrated against IRT2. So both references are converged
to a 2-interaction world, and they likely understate coverage at 100–400 m. The "over-coverage" of B2 and the
U-Nets there (06-cloudrf.md, option A) is at least partly the references being too pessimistic: on WinProp tiles
the U-Nets track DPM.

What this means: the far field needs a reference calibrated against IRT4 / DPM (per-interaction losses fitted
with ≥ 4 interactions), not more rays. The 400–800 m ring is a separate question: there the coverage is ~1 % in
every setting, and WinProp has no data beyond the 256 m tile.
