Training-free, formally-guaranteed candidate beam sets for mmWave/sub-6GHz beam management
A Kalman filter's own uncertainty, calibrated online with conformal inference — no training data, no offline calibration, no trained neural network.
A 5G mmWave gNB with an
This project replaces that binary choice with a candidate beam set that grows and shrinks with the
Kalman filter's own posterior covariance, sized online by adaptive conformal inference (ACI) so it
carries a formal, distribution-free coverage guarantee —
At a matched ~2-beam overhead, the conformal candidate set beats a static top-$k$ window by +37 percentage points, and matches full-codebook-sweep accuracy at 8× lower cost — by spending probes only when the filter is actually uncertain.
The identical pipeline — unmodified — runs on four real DeepSense6G scenarios (real RTK-class GPS, real 64-beam measured power). A fixed-quantile baseline that shares the exact same Kalman covariance collapses to ~51% coverage against a 90% target on real data — a guarantee-breaking failure. The online-adaptive conformal set, using nothing else, recovers to ~90%. This isolates what the online adaptation is doing: it's not a refinement, it's the thing that makes the guarantee hold at all outside the synthetic Gaussian-noise regime it was designed under.
A real trained MLP and LSTM (same real DeepSense6G data, matched candidate-set size, no power-privilege either side) match or exceed the training-free method's coverage in-distribution — trained models are not a strawman here. But trained on two scenarios and tested on a real, held-out third with no spatial overlap, the LSTM collapses (95.7% → 68.8%, a 26.9-point drop) while the conformal set barely moves (91.0% → 89.5%, 1.5 points) — because it has no training distribution to fall out of. This is the concrete, measured evidence for the training-free method's actual advantage: not raw accuracy, but robustness to shift, zero training cost, and a coverage guarantee neither trained baseline provides.
This project reports 16 sub-studies (C1–C16) — coverage-guarantee stress tests, adaptation-speed characterization, per-user budget allocation under scarcity, a legible-degradation monitor, and more — with the same discipline throughout: pre-registered thresholds, seed-disciplined evaluation, and negative results kept rather than tuned away. Two headline examples of the latter: the closed-loop budget controller has a real overhead ceiling it can't grow past on demand, and a blockage-vs-misalignment discriminator does not clear a usable precision bar at the project's default GPS rate — both reported plainly rather than omitted. → Results summary in RESULTS.md
flowchart LR
A["GPS fix<br/>(noisy, 5 Hz)"] --> B["Kalman filter<br/>kf_step.m"]
B --> C["Angular uncertainty<br/>kf_angle_uncertainty.m<br/>(delta-method)"]
C --> D["Online conformal<br/>calibration<br/>conformal_beamset.m"]
D --> E["Candidate beam set<br/>(grows/shrinks with<br/>reported uncertainty)"]
E --> F["Mini-sweep<br/>(probe only the set)"]
F --> G["Served beam"]
F -.->|"trailing score<br/>feedback"| D
style D fill:#2a78d6,color:#ffffff,stroke:#184f95
style E fill:#2a78d6,color:#ffffff,stroke:#184f95
- Kalman filter tracks UE position from sparse, noisy GPS fixes — standard constant-velocity model.
- Angular uncertainty is derived from the filter's own posterior covariance via a delta-method
projection through
atan2— no extra state, no extra model. - Online conformal calibration (Gibbs & Candès 2021-style ACI) sizes the candidate set's angular radius from a trailing window of the system's own recent prediction errors — self-correcting, with no labeled data and no offline pass.
- Only the candidate set is probed — a real, counted cost, not a free oracle lookup — and the feedback from whether the true beam landed inside it drives the next step's calibration.
Every module in this pipeline is Octave/MATLAB-compatible, reused unmodified across all 16 sub-studies.
core/ # shared simulation modules (single source of truth): sim_config.m, generate_trajectory.m,
# kf_step.m, beam_mapping.m, signal_model.m, evaluation.m, comms_metrics.m, ...
conformal/ # the flagship contribution: kf_angle_uncertainty.m, conformal_*.m,
# run_conformal_tracking.m, budget_controller.m, reliability_monitor.m, ...
deepsense/ # real-data (DeepSense6G) validation bridge: deepsense_loader.m, run_deepsense_tracking.m
analysis/ # runnable top-level scripts: main.m, run_verification.m, conformal_beamset_analysis.m,
# deepsense_validation.m, heterogeneous_reliability.m, and every other "octave --eval X" entry point
python_baseline/ # C14 satellite: real trained-baseline comparison (PyTorch)
docs/ # figures, theory notes, novelty checks, legacy .fig outputs
RESULTS.md # results summary (C1–C16 headline numbers)
ENVIRONMENT.md # exact tool versions + determinism confirmation
.octaverc # adds core/, conformal/, deepsense/, analysis/ to Octave's path automatically
There is no build system — this is a topically-organized directory of .m scripts and functions, verified
against GNU Octave 11.3 (no proprietary toolboxes). .octaverc is sourced automatically by Octave whenever
it starts in this directory, so every octave --eval "<script>" command below works unqualified regardless
of which subfolder that script lives in.
# core simulation + headline ablation grid
octave --eval "main"
# structural correctness suite (28 invariants, ~30s, exits nonzero on failure)
octave --eval "run_verification"
# the flagship frontier result (Figure 1 above)
octave --eval "conformal_beamset_analysis"
# real-data validation on DeepSense6G (Figure 2 above; requires the dataset — see Data below)
octave --eval "deepsense_validation"The C14 real-trained-baseline satellite comparison (Figure 3) runs separately, in Python:
octave --eval "export_deepsense_for_python" # bridges Octave -> CSV
cd python_baseline && python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python train_eval.py && .venv/bin/python compare.py # writes results/c14_table.txtSee the analysis/ directory for the complete list of runnable analysis scripts, and
RESULTS.md § Reproducing these results for the full reproduction
log.
Real-data validation (C7, C9, C11, C12, C14) uses the DeepSense6G adaptive
beam-tracking scenarios 31–34. Neither the raw dataset nor any per-row extraction of it is included in
this repository — request access from the DeepSense6G project directly and place each scenario under
scenario31/ … scenario34/ at the repo root (already .gitignored). export_deepsense_for_python.m
regenerates python_baseline/data/*.csv locally from your own copy of the raw dataset (also
.gitignored) — those derived files are not redistributed here either, since they remain a substantial
extraction of a license-restricted third-party dataset. Every synthetic result (C1–C6, C8, C10, C13, C15,
C16) is fully self-contained and requires no external data.
- GNU Octave ≥ 11.3 (or MATLAB) — no Statistics/proprietary toolboxes required for any core script.
- Python 3 + PyTorch (CPU) — only for the optional
python_baseline/C14 satellite comparison; the training-free system itself has zero Python dependency.
This is an independent research project, not affiliated with 3GPP, DeepSense6G, or any vendor. If it's useful to you, please cite the repository directly; see RESULTS.md for citations to the specific published work each contribution is positioned against (SCAN-BEST, Gibbs & Candès ACI, Larew & Love UKF beam tracking, DeepSense6G).
All rights reserved — see LICENSE. This work may not be republished, redistributed, or represented as your own, in whole or in part, without written permission.