handoverlab 2.2.0__tar.gz → 2.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {handoverlab-2.2.0 → handoverlab-2.4.0}/CHANGELOG.md +133 -1
- {handoverlab-2.2.0 → handoverlab-2.4.0}/CITATION.cff +1 -1
- {handoverlab-2.2.0 → handoverlab-2.4.0}/PKG-INFO +18 -10
- {handoverlab-2.2.0 → handoverlab-2.4.0}/README.md +17 -9
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/calibration-3gpp.md +56 -2
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/calibration.md +32 -5
- handoverlab-2.4.0/docs/comparison.md +199 -0
- handoverlab-2.4.0/docs/guides/ai-mobility.md +182 -0
- handoverlab-2.4.0/docs/guides/buffers.md +117 -0
- handoverlab-2.4.0/docs/guides/dual-connectivity.md +114 -0
- handoverlab-2.4.0/docs/guides/high-speed-train.md +102 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/scheduler.md +5 -3
- handoverlab-2.4.0/docs/guides/suburban-o2i.md +98 -0
- handoverlab-2.4.0/docs/guides/ue-beams.md +93 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/performance.md +41 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/cli.md +1 -1
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/metrics.md +25 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/highway-tr37885-30ghz.md +6 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/highway-tr37885-4ghz.md +6 -0
- handoverlab-2.4.0/docs/scenarios/hst-fr2-28ghz.md +161 -0
- handoverlab-2.4.0/docs/scenarios/hst-fr2-28ghz.svg +18 -0
- handoverlab-2.4.0/docs/scenarios/suburban-sma-7ghz.md +107 -0
- handoverlab-2.4.0/docs/scenarios/suburban-sma-7ghz.svg +15 -0
- handoverlab-2.4.0/docs/scenarios/urban-macro-tr37885-4ghz.md +110 -0
- handoverlab-2.4.0/docs/scenarios/urban-macro-tr37885-4ghz.svg +48 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/standard-compliance.md +106 -3
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/user_guide.md +11 -4
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/verification.md +3 -1
- {handoverlab-2.2.0 → handoverlab-2.4.0}/mkdocs.yml +10 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/pyproject.toml +1 -1
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/__init__.py +1 -1
- handoverlab-2.4.0/src/handoverlab/channel/antenna.py +122 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/extended.py +116 -6
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/pathloss.py +142 -14
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/radiomap.py +9 -5
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/source.py +15 -5
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/config.py +221 -9
- handoverlab-2.4.0/src/handoverlab/engine/_kernels.py +238 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/batch.py +2 -1
- handoverlab-2.4.0/src/handoverlab/engine/buffers.py +313 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/core.py +58 -5
- handoverlab-2.4.0/src/handoverlab/engine/dual.py +335 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/extended.py +60 -5
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/metrics.py +51 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/scheduler.py +148 -2
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/mobility.py +12 -7
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/rules/__init__.py +6 -4
- handoverlab-2.4.0/src/handoverlab/rules/predict.py +588 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/__init__.py +18 -1
- handoverlab-2.4.0/src/handoverlab/scenarios/cards/hst-fr2-28ghz.yaml +97 -0
- handoverlab-2.4.0/src/handoverlab/scenarios/cards/suburban-sma-7ghz.yaml +63 -0
- handoverlab-2.4.0/src/handoverlab/scenarios/cards/urban-macro-tr37885-4ghz.yaml +70 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/seeds.py +13 -10
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/simulate.py +2 -1
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/standard.py +1 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/__init__.py +12 -4
- handoverlab-2.4.0/src/handoverlab/verify/aimobility.py +56 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/calibration.py +171 -14
- handoverlab-2.4.0/src/handoverlab/verify/data/r1_2506406.csv +607 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/learning.py +5 -0
- handoverlab-2.4.0/src/handoverlab/verify/scenarios.py +343 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/world.py +6 -3
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/PKG-INFO +18 -10
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/SOURCES.txt +28 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/data/public_api.json +38 -0
- handoverlab-2.4.0/tests/test_ai_mobility.py +123 -0
- handoverlab-2.4.0/tests/test_buffers.py +206 -0
- handoverlab-2.4.0/tests/test_calibration.py +167 -0
- handoverlab-2.4.0/tests/test_hst_dc.py +191 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_indoor_rural.py +1 -1
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_pathloss.py +2 -2
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_scenarios.py +3 -2
- handoverlab-2.4.0/tests/test_scenarios_230.py +195 -0
- handoverlab-2.4.0/tests/test_sched_kernel.py +130 -0
- handoverlab-2.4.0/tests/test_ue_beams.py +162 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_verify.py +1 -1
- handoverlab-2.2.0/src/handoverlab/channel/antenna.py +0 -72
- handoverlab-2.2.0/src/handoverlab/engine/_kernels.py +0 -78
- handoverlab-2.2.0/tests/test_calibration.py +0 -81
- {handoverlab-2.2.0 → handoverlab-2.4.0}/.zenodo.json +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/CODE_OF_CONDUCT.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/CONTRIBUTING.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/LICENSE +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/MANIFEST.in +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/SECURITY.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/RELEASING.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/add-scenario.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/beams-layers.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/daps-ltm.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/dashboard.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/export-event-logs.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/fading.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/highway.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/indoor-rural.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/learning-rule.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/many-cores.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/mro.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/ntn.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/radio-maps.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/reproduce.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/upper-mid-band.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/calibration_38901.png +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/dashboard-charts.png +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/dashboard-compare.png +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/dashboard-where.png +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/dashboard.png +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/ntn-beams.png +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/radio-map.png +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/report-comparison.png +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/report-tuning.png +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/ssb-beams.png +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/index.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/migration-2.0.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/config.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/engine.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/eventlog.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/gui.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/index.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/mapfile.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/ntn.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/rules.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/scenarios.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/simulate.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/stability.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/stats.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/studies.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/testing.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/verify.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference-study.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/dense-urban-2layer.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/dense-urban-2layer.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/fr3-urban-15ghz.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/fr3-urban-15ghz.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/highway-tr37885-30ghz.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/highway-tr37885-4ghz.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/indoor-office-4ghz.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/indoor-office-4ghz.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/ns3-urban-3.5ghz.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/ns3-urban-3.5ghz.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/ntn-leo600-2ghz.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/ntn-leo600-2ghz.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/open-area-10ghz.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/open-area-10ghz.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/rural-700mhz.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/rural-700mhz.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/smoke.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/smoke.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/urban-grid-10ghz.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/urban-grid-10ghz.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/urban-grid-28ghz-beams.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/urban-grid-28ghz-beams.svg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/stability.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/time-step.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/tutorials/first-run.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/tutorials/own-rule.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/tutorials/reading-the-report.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/tutorials/tuning-study.md +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/compare_a3_cho.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/open_area.toml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/radio_map.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/smoke.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/speed_rule.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/street_grid.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/study_reference.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/study_reference_explore.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/study_smoke.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/traffic_models.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/setup.cfg +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/__main__.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/__init__.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/fading.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/l2s.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/ntn.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/cli.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/__init__.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/invariants.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/procedures.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/eventlog.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/gui/__init__.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/gui/app.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/gui/logic.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/io.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/layout.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/linklevel.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/mapfile.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/measurement.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/py.typed +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/requirements.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/rules/base.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/rules/builtin.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/rules/dqn.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/rules/mro.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/dense-urban-2layer.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/fr3-urban-15ghz.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/highway-tr37885-30ghz.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/highway-tr37885-4ghz.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/indoor-office-4ghz.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/ns3-urban-3.5ghz.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/ntn-leo600-2ghz.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/open-area-10ghz.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/rural-700mhz.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/smoke.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/urban-grid-10ghz.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/urban-grid-28ghz-beams.yaml +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/stability.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/stats.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/__init__.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/config.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/report.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/runner.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/status.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/store.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/study.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/tuning.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/testing.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/traffic.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/data/golden.json +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/data/golden_1x.json +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/data/ns3_urban_a3.json +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/data/r1_165974.csv +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/engine_checks.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/extended.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/fading.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/golden.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/highway.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/ns3.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/ntn.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/radio.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/report.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/stored.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/values.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/dependency_links.txt +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/entry_points.txt +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/requires.txt +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/top_level.txt +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/conftest.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/data/bh6_reference.json +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/data/bh6_wide.json +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/data/make_bh6_reference.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/data/make_bh6_wide.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/helpers.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_batch.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_beams_layers.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_channel_detail.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_cltm.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_config_cli.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_contract.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_determinism.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_dqn.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_engine_triggers.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_eventlog.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_fading.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_gui.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_highway.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_highway_tr37885.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_invariants.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_levels_status_extend.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_lm_model.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_mapfile.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_measurement.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_mro.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_ntn.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_protocol_3gpp.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_readme_boundaries.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_regression_bh6.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_regression_bh6_wide.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_rrc_detail.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_rules_rc2.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_scheduler.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_signalling_energy.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_stability.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_stats.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_study.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_tools.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_traffic.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_tuning.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_v111.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/compare_fingerprints.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/make_beam_figure.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/make_calibration_figure.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/make_ntn_figure.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/make_radiomap_figure.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/make_readme_images.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/mkdocs_hooks.py +0 -0
- {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/release_check.py +0 -0
|
@@ -7,6 +7,136 @@ All notable changes to this project are documented in this file. The format foll
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.4.0] - 2026-10-22
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- 7 GHz large-scale calibration (TR 38.901 V19.5.0 clause 7.8.1, Table 7.8-1A) in the `verify` group
|
|
15
|
+
`calibration`: UMa and UMi at 7 GHz, UMa and UMi at 6 GHz with the updated model, and SMa with ISD 1299 m and
|
|
16
|
+
1732 m (35 m sites with a mechanical downtilt of 95 / 92 deg through Eqs. 7.1-7 and 7.1-8, 20 % of the users
|
|
17
|
+
in cars with the car penetration loss, 80 % in residential and commercial buildings over their floors with the
|
|
18
|
+
low-loss A model), compared with the companies of 3GPP R1-2506406 (RAN1 #122; mean and range in
|
|
19
|
+
`verify/data/r1_2506406.csv`). Pre-registered result (30 000 users, seed 1): every percentile 5-95 % lies
|
|
20
|
+
inside the company range (18 of 18 case-metric pairs pass, 342 of 342 percentiles); the largest distance from
|
|
21
|
+
the company mean is 1.65-2.88 dB, so the second criterion (at most 1.5 dB) fails for all six cases. It is
|
|
22
|
+
reported as a note. The checks against R1-165974 are unchanged. `simulate_drops` takes the IRR-glass loss of
|
|
23
|
+
the case's reference when `irr_glass` is not given (unchanged for the old cases).
|
|
24
|
+
- Compiled slot scheduler: with `run.backend: numba` (`pip install handoverlab[fast]`) the slots of
|
|
25
|
+
`protocol.scheduler` are played by a compiled loop (`handoverlab.engine._kernels.sched_slots`). The MCS
|
|
26
|
+
look-ups, logarithms and block error probabilities still come from the NumPy functions of the reference loop
|
|
27
|
+
(per-interval tables), and the loop uses only basic arithmetic in the reference order, so every result is
|
|
28
|
+
bit-identical to the NumPy loop (`tests/test_sched_kernel.py`, which also runs the loop's logic as plain Python
|
|
29
|
+
without Numba). On the ns-3 card the engine time with the scheduler drops by a factor of 8 to 60 (case and machine load) (about 3 times the rate model instead of 50-80 times; see `docs/performance.md`). The NumPy loop stays the reference and the default and runs in debug mode.
|
|
30
|
+
- UE receive beams as an option of the beam model (`radio.beams.ue_panels` 1, 2 or 4, off by default): UE panels
|
|
31
|
+
of TR 38.802 V14.2.0 Table A.2.1-4 (Config 1: two panels 180 deg apart, Config 2: four at 90 deg; `ue_panel`
|
|
32
|
+
[M, N] = [2, 4] at half a wavelength, one polarisation) with the element of Table A.2.1-8 (model 1, 5 dBi;
|
|
33
|
+
= ITU-R M.2412-0 Table 11), `ue_beams` DFT receive beams per panel over `ue_beam_span_deg`, bearing uniform
|
|
34
|
+
per UE (`ue_orientation: random`) or along the direction of travel (`heading`). Measurements use the best
|
|
35
|
+
receive beam of the best panel (`ue_rx: best`; TS 38.215 5.1.1 receiver branches) or a sweep over the beams,
|
|
36
|
+
one per L1 instant, with the highest of the last samples reported (`sweep`); data, RLM, beam failure
|
|
37
|
+
detection and recovery and the interference use the serving receive beam. The FR2 time scaling of the sweep
|
|
38
|
+
was already in `protocol.meas_periods: ts38133` (Mmeas_period_w/o_gaps = 24, TS 38.133 V19.6.0 9.2.5.1) and is
|
|
39
|
+
not applied twice; `sweep` is refused with `ts38133`. New random stream `ue_beams`. Not combined with
|
|
40
|
+
`protocol.dc`. With the option off every result is unchanged. Guide: `docs/guides/ue-beams.md`.
|
|
41
|
+
- AI/ML-based mobility after 3GPP TR 38.744 V19.0.1 (Release 19) as an optional rule, `a3_pred` (NumPy only, off
|
|
42
|
+
unless a run names it): prediction of the L3 cell-level RSRP of a cell from its own past L3 results (RRM
|
|
43
|
+
sub-use case 2), in case A (prediction window ahead; handover on the predicted Event A3, handover model
|
|
44
|
+
option 2 with the preparation started at the report) and case B (measurement skipping with MRRT =
|
|
45
|
+
skip / (skip + 1), L3 filtering options 1-3, Event A3 on the measured-and-predicted series, option 3).
|
|
46
|
+
Predictors: sample and hold (the non-AI baseline of TR 38.744 clause 5.1) and a ridge-regression
|
|
47
|
+
autoregressive model trained on runs of training seeds (`handoverlab.rules.predict.fit_predictor`,
|
|
48
|
+
`collect`, JSON weights), or a user object. Statistics after a run (`PredA3.stats`, `Recorder`): prediction
|
|
49
|
+
accuracy per horizon against the fully measured L3 result, MRRT, and the counters n1, n2, n3 and F1 score of
|
|
50
|
+
the indirect A3 event prediction (clause 5.3.1). With `act: false` and in case B without skipping the rule
|
|
51
|
+
gives the event log of `a3`. `handoverlab verify --only learning` gained four checks (P1-P4). Guide
|
|
52
|
+
`docs/guides/ai-mobility.md` with the evaluation against TR 38.744 and what is not modelled (RLF
|
|
53
|
+
prediction, frequency- and spatial-domain prediction, beam-level prediction, option 1, LCM); compliance rows
|
|
54
|
+
in `docs/standard-compliance.md`. Pre-registered evaluation (FR1 case B, FR2 case A): ridge more accurate
|
|
55
|
+
than sample and hold, errors rising with speed, PW and MRRT as TR 38.744 observes; MRRT 50 % costs
|
|
56
|
+
+0.7-0.9 percentage points of HOF rate; option 2 cuts the HOF rate from 2.4 % to 0.3 % but with 55 % more
|
|
57
|
+
attempts and three times the ping-pongs, and sample and hold does the same; generalization criterion G2
|
|
58
|
+
failed. Every existing result is unchanged.
|
|
59
|
+
|
|
60
|
+
### Documentation
|
|
61
|
+
|
|
62
|
+
- `docs/comparison.md`: HandoverLab next to ns-3 with 5G-LENA and the mmWave module, Simu5G, the Vienna 5G System
|
|
63
|
+
Level Simulator, the MATLAB 5G Toolbox, OpenAirInterface and Sionna on the points that matter for handover
|
|
64
|
+
studies (A3, CHO, DAPS, LTM, radio-link failure, dual connectivity, NTN, beams, fast fading and link-to-system
|
|
65
|
+
mapping, scheduler, speed and scale, licence, language, last release, validation against 3GPP). Every cell
|
|
66
|
+
about another tool cites its official documentation, repository or paper (accessed 2026-10-22); facts not
|
|
67
|
+
found are marked "not stated"; a section lists where the other tools are stronger.
|
|
68
|
+
|
|
69
|
+
## [2.3.0] - 2026-10-22
|
|
70
|
+
|
|
71
|
+
### Added
|
|
72
|
+
|
|
73
|
+
- User-plane buffers at handover as an option (`protocol.buffers`: `am` or `um`, off by default): one downlink
|
|
74
|
+
bearer per user whose PDCP data wait in a FIFO at the gNB, data forwarding over Xn (`protocol.forwarding`,
|
|
75
|
+
`protocol.xn_delay_s`) for baseline handover, CHO and LTM / CLTM (late forwarding after HANDOVER SUCCESS unless
|
|
76
|
+
`protocol.early_forwarding`) and DAPS (the source keeps sending, copies to the target), re-establishment with
|
|
77
|
+
and without forwarding, the PDCP discard timer of TS 38.331 (`protocol.discard_timer_s`), and with the slot
|
|
78
|
+
scheduler the HARQ data at a MAC reset (lost with RLC UM, re-sent with AM) and TBs lost after the last HARQ
|
|
79
|
+
transmission. Sources: TS 38.300 V19.4.0 9.2.3.1-9.2.3.7, TS 38.322 V19.2.0 4.4 / 5.1.2, TS 38.323 V19.1.0
|
|
80
|
+
5.1.2 / 5.3 / 5.5. New metrics `pdcp_delivered_kbyte_pm`, `pdcp_lost_*`, `pdcp_forwarded_*`, `pdcp_delay_ms`,
|
|
81
|
+
`pdcp_delay_p95_ms`, `pdcp_delay_forwarded_ms` (0 without the option). Base engine only. With the option off
|
|
82
|
+
every result is unchanged. Guide: `docs/guides/buffers.md`.
|
|
83
|
+
- Suburban macro (SMa) of TR 38.901 V19.5.0 (`radio.pathloss: sma`, 0.5-37 GHz): the LOS and NLOS path loss of
|
|
84
|
+
Table 7.4.1-1 (h = 10 m, W = 10 m; the NLOS row is used as printed, without a max() with the LOS loss, so for a
|
|
85
|
+
UT high up close to a site NLOS can lie below LOS) and the LOS probability of Table 7.4.2-1 with the vegetation
|
|
86
|
+
density `radio.vegetation` (0, 0.1, 0.2); heights checked against the applicability ranges (25-35 m, 1-14 m).
|
|
87
|
+
- O2I building penetration loss of indoor users (TR 38.901 clause 7.4.3.1): a speed group with `indoor: true`
|
|
88
|
+
marks indoor users; each gets PL_tw + 0.5 d2D-in + N(0, sigma_P^2) on all its links, drawn once
|
|
89
|
+
(`radio.o2i_model`: `low`, `high`, `low_a` for SMa, or `mixed`; `radio.o2i_d_in_max_m`; SMa residential /
|
|
90
|
+
commercial buildings 90 % / 10 %), from its own random stream; an indoor user gets no car penetration loss.
|
|
91
|
+
The LOS state and the shadowing of an indoor user stay those of its position (stated abstraction, measured by
|
|
92
|
+
`verify`).
|
|
93
|
+
- `radio.building_los: false` on the street grid: sites above the rooftops, the LOS state from the LOS probability
|
|
94
|
+
alone (TR 37.885 clause 6.2.1); `radio.env_height_m`: one effective environment height for the UMa / UMi
|
|
95
|
+
breakpoint (TR 37.885: 0.25 m).
|
|
96
|
+
- Scenario cards `urban-macro-tr37885-4ghz` (the TR 37.885 urban grid below 6 GHz with 500 m macro sites on the
|
|
97
|
+
hexagonal layout of TR 36.885 Figure A.1.3-1, UMa at 4 GHz, h_E 0.25 m, vehicles at 60 km/h; the wrap-around is
|
|
98
|
+
replaced by the lattice sites within 1000 m of the grid) and `suburban-sma-7ghz` (11 SMa sites at 1299 m,
|
|
99
|
+
7 GHz, 80 % indoor users with the low-loss A model, 20 % in cars). Guide: `docs/guides/suburban-o2i.md`.
|
|
100
|
+
- Optional `verify` group `scenarios` (`--only scenarios`; criteria fixed before the first run), reported as it
|
|
101
|
+
came: 7 pass, 3 fail. The urban macro coupling gain lies 0.3-1.2 dB below an independent computation around
|
|
102
|
+
the median in every block of seeds (cause open; the LOS share close to the sites is a little low); the check
|
|
103
|
+
of the outdoor SMa users fails on sampling noise (40 seeds pooled: within 0.54 dB); a TR-exact treatment of
|
|
104
|
+
indoor users (LOS at d2D-out, O2I shadowing 8 dB) gives a 2.0 dB wider upper tail (95 % point) than the
|
|
105
|
+
simulator's abstraction, with the median within 0.1 dB.
|
|
106
|
+
- Scenario card `hst-fr2-28ghz`: the FR2 high-speed train of TR 38.854 V18.0.0 as its system-level mobility
|
|
107
|
+
study sets it up (Table 6.3.8.1-1): one train with one roof-mounted CPE at 350 km/h on a straight track, an RRH
|
|
108
|
+
every 700 m on one side, 10 m from the track (Scenario-A), one panel of 8 x 8 elements with one SSB beam per RRH
|
|
109
|
+
pointing along the track at the next RRH, every RRH its own cell (L3 handover, no DPS), 28 GHz, 50 MHz,
|
|
110
|
+
120 kHz, 31 dBm, TR 38.901 RMa LOS only, no inter-cell interference, N310 = N311 = 2 and the TS 38.133
|
|
111
|
+
measurement periods of the legacy requirements (480 ms). Guide: `docs/guides/high-speed-train.md`, with the
|
|
112
|
+
pre-registered comparison against the TR's results.
|
|
113
|
+
- `radio.beams.am_db`: A_m of the TR 38.901 Table 7.3-1 element pattern (default 30 dB, unchanged results); a
|
|
114
|
+
larger value lowers the back lobe, as the antenna "without back lobe" of the TR 38.854 mobility study.
|
|
115
|
+
- Dual connectivity as an option (`protocol.dc`, off by default): NR-DC of TS 37.340 V19.3.0 with the master cell
|
|
116
|
+
group on the scenario's other carriers and a secondary cell group (one PSCell) on the cells of one layer of
|
|
117
|
+
`radio.layers`: SN addition on event A4 (clause 10.2), PSCell change on event A3 (clauses 10.5, 10.6) and SN
|
|
118
|
+
release (clause 10.4), each prepared between the nodes and sent over the MCG, random access on the PSCell under
|
|
119
|
+
T304; separate radio-link monitoring and SCG radio-link failure (TS 38.331 5.3.10.3); SCG failures reported to
|
|
120
|
+
the MN, which releases the SCG (clause 7.7); an MCG failure releases the SCG (TS 38.331 5.3.7.2); at an MCG
|
|
121
|
+
handover the SN is kept or released (`on_mcg_ho`, clause 10.7). The MCG behaves exactly as without the SCG.
|
|
122
|
+
New metrics `sn_additions_pm`, `sn_addition_failures_pm`, `pscell_changes_pm`, `pscell_change_failures_pm`,
|
|
123
|
+
`sn_releases_pm`, `scg_rlf_pm`, `scg_failures_pm`, `scg_released_by_mcg_pm`, `scg_time_share`,
|
|
124
|
+
`scg_rate_mbps`, `pscell_change_interruption_s_pm`, `dc_rrc_messages_pm` (zero without the option). Guide:
|
|
125
|
+
`docs/guides/dual-connectivity.md`, with what is left out.
|
|
126
|
+
|
|
127
|
+
### Documentation
|
|
128
|
+
|
|
129
|
+
- Fresh held-out check N3 of the failure model on 40 new ns-3 runs, limits fixed before the runs: a fixed
|
|
130
|
+
link-monitoring interferer load (`protocol.lm_load` 0.15, chosen on the earlier runs) raises the failure level
|
|
131
|
+
from 0.16 to 0.47 of ns-3's and the failure order from 0.78 to 0.95; the level check (0.67-1.5) fails, so the
|
|
132
|
+
setting is reported, not adopted. The recovery time after a failure is set against the bounds of TS 38.133
|
|
133
|
+
clause 6.2.1.2.1 (about 0.28-1.55 s), which the default 1.0 s meets. `docs/calibration.md`.
|
|
134
|
+
|
|
135
|
+
### Not done
|
|
136
|
+
|
|
137
|
+
- The 7 GHz large-scale calibration of TR 38.901 clause 7.8.1 (Table 7.8-1A): the TR gives the results only by
|
|
138
|
+
reference to R1-2506406, which this release does not include.
|
|
139
|
+
|
|
10
140
|
## [2.2.0] - 2026-10-22
|
|
11
141
|
|
|
12
142
|
### Added
|
|
@@ -934,7 +1064,9 @@ First alpha release (stage 1: the core simulator).
|
|
|
934
1064
|
- Documentation: README, user guide, contribution guide, citation file; CI on Linux, Windows and
|
|
935
1065
|
macOS with Python 3.9-3.12.
|
|
936
1066
|
|
|
937
|
-
[Unreleased]: https://github.com/mjs19971997/handoverlab/compare/v2.
|
|
1067
|
+
[Unreleased]: https://github.com/mjs19971997/handoverlab/compare/v2.4.0...HEAD
|
|
1068
|
+
[2.4.0]: https://github.com/mjs19971997/handoverlab/compare/v2.3.0...v2.4.0
|
|
1069
|
+
[2.3.0]: https://github.com/mjs19971997/handoverlab/compare/v2.2.0...v2.3.0
|
|
938
1070
|
[2.2.0]: https://github.com/mjs19971997/handoverlab/compare/v2.1.0...v2.2.0
|
|
939
1071
|
[2.1.0]: https://github.com/mjs19971997/handoverlab/compare/v2.0.0...v2.1.0
|
|
940
1072
|
[2.0.0]: https://github.com/mjs19971997/handoverlab/compare/v1.12.0...v2.0.0
|
|
@@ -11,7 +11,7 @@ abstract: >-
|
|
|
11
11
|
measurement chain, a radio-link failure model, an outcome label for every handover attempt,
|
|
12
12
|
a plug-in interface for handover rules, equal-budget tuning studies with paired statistics,
|
|
13
13
|
and verification against hand-computed values, golden event-log fingerprints and ns-3 / 5G-LENA.
|
|
14
|
-
version: "2.
|
|
14
|
+
version: "2.4.0"
|
|
15
15
|
doi: 10.5281/zenodo.23409131
|
|
16
16
|
identifiers:
|
|
17
17
|
- type: doi
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: handoverlab
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.0
|
|
4
4
|
Summary: System-level handover simulator for 5G-Advanced and beyond-5G research
|
|
5
5
|
Author: Mostafa Jalili Sanjarani, Yasser Elmi Sola
|
|
6
6
|
License-Expression: MIT
|
|
@@ -142,10 +142,12 @@ event D2 of Release 18:
|
|
|
142
142
|
- **Scenarios**: the TR 37.885 urban street grid (configurable number of blocks; 433 m x 250 m
|
|
143
143
|
pitch, 20 m streets) with sites on the pavement, an open area with a hexagonal site grid, the
|
|
144
144
|
TR 37.885 highway (since 1.11.0 with wrap-around, LOS-only links and both site layouts of
|
|
145
|
-
TR 36.885, below and above 6 GHz), the TR
|
|
145
|
+
TR 36.885, below and above 6 GHz), the TR 37.885 urban grid with 500 m macro sites (since 2.3.0), the
|
|
146
|
+
TR 38.901 indoor office, rural and suburban (SMa, since 2.3.0) macro cells, a LEO satellite with
|
|
146
147
|
earth-moving beams (since 2.0.0, TR 38.811 and TR 38.821), explicit site lists, and built-in scenario
|
|
147
148
|
cards (`handoverlab scenarios`).
|
|
148
|
-
- **Channel**: TR 38.901 UMi street canyon, UMa, RMa and InH-Office path loss (LOS/NLOS);
|
|
149
|
+
- **Channel**: TR 38.901 UMi street canyon, UMa, RMa, SMa (since 2.3.0) and InH-Office path loss (LOS/NLOS); O2I
|
|
150
|
+
building penetration loss of indoor users (since 2.3.0); line of sight from the
|
|
149
151
|
building geometry plus the spatially consistent LOS state, hard or soft; spatially correlated shadowing; a
|
|
150
152
|
time-varying component; L1 measurement error; beam gain and load-coupled interference;
|
|
151
153
|
optionally a penetration loss per user (in-car loss of TR 38.901); or, since 1.12.0, your own radio
|
|
@@ -189,19 +191,20 @@ the clause-by-clause detail is in [standard compliance](https://github.com/mjs19
|
|
|
189
191
|
|
|
190
192
|
| Part | Modelled | Abstracted | Not modelled |
|
|
191
193
|
|---|---|---|---|
|
|
192
|
-
| Layouts | `street_grid` (TR 37.885 urban grid), `open_area`, `highway` (TR 37.885 / TR 36.885, wrap-around), `indoor` (TR 38.901 office), `ntn` (one LEO satellite, TR 38.821); explicit site lists | sites on the pavement with small cells (urban cards)
|
|
193
|
-
| Channel | TR 38.901 path loss and LOS (UMi, UMa, RMa, InH), LOS from buildings, spatially consistent LOS and shadowing, penetration loss, radio maps from a file (clause 8), TR 38.811 for the satellite | received power per site and step with a slow time-varying component; optional TDL fast fading with effective SINRs (clause 7.7.2, since 2.2.0) | CDL and the full fast-fading model of clause 7.5, MIMO |
|
|
194
|
-
| Beams and carriers | SSB beams per sector, cell quality from beams, beam failure detection and recovery, several carriers with gaps and Event A5 | the TR 38.901 antenna element and DFT beams; isotropic UE
|
|
195
|
-
| Mobility | street-following vehicles (60 km/h, two lanes), highway lanes at 70/140 km/h, random waypoints, pedestrians | constant speed per user | handheld rotation and body blockage |
|
|
194
|
+
| Layouts | `street_grid` (TR 37.885 urban grid), `open_area`, `highway` (TR 37.885 / TR 36.885, wrap-around), `indoor` (TR 38.901 office), `ntn` (one LEO satellite, TR 38.821); explicit site lists | sites on the pavement with small cells (urban cards); the TR 37.885 urban macro grid without wrap-around (`urban-macro-tr37885-4ghz`) | several satellites |
|
|
195
|
+
| Channel | TR 38.901 path loss and LOS (UMi, UMa, RMa, SMa, InH), LOS from buildings, spatially consistent LOS and shadowing, car and O2I building penetration loss, radio maps from a file (clause 8), TR 38.811 for the satellite | received power per site and step with a slow time-varying component; indoor users keep the LOS state and shadowing of their position; optional TDL fast fading with effective SINRs (clause 7.7.2, since 2.2.0) | CDL and the full fast-fading model of clause 7.5, MIMO |
|
|
196
|
+
| Beams and carriers | SSB beams per sector, cell quality from beams, beam failure detection and recovery, several carriers with gaps and Event A5; dual connectivity (NR-DC: SN addition, PSCell change, SN release, SCG failure; option since 2.3.0) | the TR 38.901 antenna element and DFT beams; isotropic UE unless UE receive panels are set (option since 2.4.0); the SCG as one PSCell with a full-buffer share | UE transmit beams and polarisation, conditional PSCell change, fast MCG recovery |
|
|
197
|
+
| Mobility | street-following vehicles (60 km/h, two lanes), highway lanes at 70/140 km/h, a train at 350 km/h (TR 38.854), random waypoints, pedestrians | constant speed per user | handheld rotation and body blockage |
|
|
196
198
|
| Traffic and load | constant rates per 5QI, full buffer, periodic, FTP model 3; cell load drives interference | rate from SINR (Shannon-type mapping), no scheduler | slot scheduler, HARQ, RLC/PDCP, TCP and applications |
|
|
197
199
|
| Measurements | L1 samples with error, TS 38.331 L3 filter, TS 38.133 measurement periods and gaps (option) | wideband RSRP; SS-RSRP per resource element with beams/carriers | RSRQ, CSI reporting |
|
|
198
|
-
| Procedures | baseline (A3), CHO, DAPS, LTM, conditional LTM, CHO with D1/D2 for satellites, A3/A5 between carriers; rules `a3`, `a3a5`, `a3_mro`, `a3_bandit`, `dqn`, `cho`, `cho_d2`, `daps`, `ltm`, `cltm` | fixed preparation, command and execution delays; re-establishment always succeeds after a fixed outage | condEventT1, RACH-less NTN handover, Xn signalling in detail |
|
|
200
|
+
| Procedures | baseline (A3), CHO, DAPS, LTM, conditional LTM, CHO with D1/D2 for satellites, A3/A5 between carriers; rules `a3`, `a3a5`, `a3_mro`, `a3_bandit`, `dqn`, `a3_pred`, `cho`, `cho_d2`, `daps`, `ltm`, `cltm` | fixed preparation, command and execution delays; re-establishment always succeeds after a fixed outage | condEventT1, RACH-less NTN handover, Xn signalling in detail |
|
|
199
201
|
| Failure model | Qout/Qin with windows, N310/N311/T310, T304, command received during T310, re-establishment, link-monitoring restart | Qout/Qin as SINR thresholds (TR 36.839 values) instead of the BLER of a hypothetical PDCCH | BLER-based link monitoring; absolute failure rates are not calibrated: compare rules with each other |
|
|
200
202
|
| Time | 10 ms step by default (`protocol.step_s`); the effect of the step is measured in [time step](https://github.com/mjs19971997/handoverlab/blob/main/docs/time-step.md) | events rounded to the step | sub-slot timing |
|
|
201
203
|
|
|
202
204
|
Built-in cards: `smoke`, `urban-grid-10ghz`, `fr3-urban-15ghz`, `urban-grid-28ghz-beams`, `dense-urban-2layer`,
|
|
203
205
|
`open-area-10ghz`, `ns3-urban-3.5ghz`, `highway-tr37885-4ghz`, `highway-tr37885-30ghz`, `indoor-office-4ghz`,
|
|
204
|
-
`rural-700mhz`, `ntn-leo600-2ghz
|
|
206
|
+
`rural-700mhz`, `ntn-leo600-2ghz`, `urban-macro-tr37885-4ghz`, `suburban-sma-7ghz`, `hst-fr2-28ghz`; each
|
|
207
|
+
names the source of every value and its own limitations.
|
|
205
208
|
|
|
206
209
|
## Scope: 5G-Advanced and beyond 5G
|
|
207
210
|
|
|
@@ -215,7 +218,8 @@ networks with small cells 50-300 m apart. Three paths lead beyond 5G:
|
|
|
215
218
|
- **Non-terrestrial networks**: a LEO satellite with earth-moving beams (TR 38.811, TR 38.821) and conditional
|
|
216
219
|
handover with condEventD2 (TS 38.331 Release 18).
|
|
217
220
|
- **Learning-based mobility**: the rule interface gives a rule every measurement and the outcome of every
|
|
218
|
-
attempt; `a3_bandit` and `dqn` are examples, `a3_mro` the fair tuned baseline
|
|
221
|
+
attempt; `a3_bandit` and `dqn` are examples, `a3_mro` the fair tuned baseline, and `a3_pred` follows the
|
|
222
|
+
RRM measurement prediction of TR 38.744 (Release 19).
|
|
219
223
|
|
|
220
224
|
6G itself is at the stage of requirements: TR 38.914 V20.1.0 (Release 20, last changed at RAN #113 in September
|
|
221
225
|
2026) sets scenarios and key performance requirements but specifies no handover procedure, timer or measurement
|
|
@@ -431,6 +435,10 @@ the pages are plain Markdown in [docs/](https://github.com/mjs19971997/handoverl
|
|
|
431
435
|
- [Scenario cards](https://github.com/mjs19971997/handoverlab/tree/main/docs/scenarios): the built-in scenarios with the source of every parameter.
|
|
432
436
|
- [Verification](https://github.com/mjs19971997/handoverlab/blob/main/docs/verification.md), [failure-model calibration](https://github.com/mjs19971997/handoverlab/blob/main/docs/calibration.md) and
|
|
433
437
|
[performance](https://github.com/mjs19971997/handoverlab/blob/main/docs/performance.md).
|
|
438
|
+
- [Comparison with other simulators](https://github.com/mjs19971997/handoverlab/blob/main/docs/comparison.md): ns-3 with 5G-LENA
|
|
439
|
+
and the mmWave module, Simu5G, the Vienna 5G System Level Simulator, the MATLAB 5G Toolbox, OpenAirInterface
|
|
440
|
+
and Sionna on handover procedures, failure model, NTN, beams, PHY abstraction, scheduler, scale and validation,
|
|
441
|
+
each cell with its source, including where the other tools are stronger.
|
|
434
442
|
- [Changelog](https://github.com/mjs19971997/handoverlab/blob/main/CHANGELOG.md), [contribution guide](https://github.com/mjs19971997/handoverlab/blob/main/CONTRIBUTING.md) and [releasing](https://github.com/mjs19971997/handoverlab/blob/main/docs/RELEASING.md).
|
|
435
443
|
|
|
436
444
|
## Roadmap
|
|
@@ -84,10 +84,12 @@ event D2 of Release 18:
|
|
|
84
84
|
- **Scenarios**: the TR 37.885 urban street grid (configurable number of blocks; 433 m x 250 m
|
|
85
85
|
pitch, 20 m streets) with sites on the pavement, an open area with a hexagonal site grid, the
|
|
86
86
|
TR 37.885 highway (since 1.11.0 with wrap-around, LOS-only links and both site layouts of
|
|
87
|
-
TR 36.885, below and above 6 GHz), the TR
|
|
87
|
+
TR 36.885, below and above 6 GHz), the TR 37.885 urban grid with 500 m macro sites (since 2.3.0), the
|
|
88
|
+
TR 38.901 indoor office, rural and suburban (SMa, since 2.3.0) macro cells, a LEO satellite with
|
|
88
89
|
earth-moving beams (since 2.0.0, TR 38.811 and TR 38.821), explicit site lists, and built-in scenario
|
|
89
90
|
cards (`handoverlab scenarios`).
|
|
90
|
-
- **Channel**: TR 38.901 UMi street canyon, UMa, RMa and InH-Office path loss (LOS/NLOS);
|
|
91
|
+
- **Channel**: TR 38.901 UMi street canyon, UMa, RMa, SMa (since 2.3.0) and InH-Office path loss (LOS/NLOS); O2I
|
|
92
|
+
building penetration loss of indoor users (since 2.3.0); line of sight from the
|
|
91
93
|
building geometry plus the spatially consistent LOS state, hard or soft; spatially correlated shadowing; a
|
|
92
94
|
time-varying component; L1 measurement error; beam gain and load-coupled interference;
|
|
93
95
|
optionally a penetration loss per user (in-car loss of TR 38.901); or, since 1.12.0, your own radio
|
|
@@ -131,19 +133,20 @@ the clause-by-clause detail is in [standard compliance](https://github.com/mjs19
|
|
|
131
133
|
|
|
132
134
|
| Part | Modelled | Abstracted | Not modelled |
|
|
133
135
|
|---|---|---|---|
|
|
134
|
-
| Layouts | `street_grid` (TR 37.885 urban grid), `open_area`, `highway` (TR 37.885 / TR 36.885, wrap-around), `indoor` (TR 38.901 office), `ntn` (one LEO satellite, TR 38.821); explicit site lists | sites on the pavement with small cells (urban cards)
|
|
135
|
-
| Channel | TR 38.901 path loss and LOS (UMi, UMa, RMa, InH), LOS from buildings, spatially consistent LOS and shadowing, penetration loss, radio maps from a file (clause 8), TR 38.811 for the satellite | received power per site and step with a slow time-varying component; optional TDL fast fading with effective SINRs (clause 7.7.2, since 2.2.0) | CDL and the full fast-fading model of clause 7.5, MIMO |
|
|
136
|
-
| Beams and carriers | SSB beams per sector, cell quality from beams, beam failure detection and recovery, several carriers with gaps and Event A5 | the TR 38.901 antenna element and DFT beams; isotropic UE
|
|
137
|
-
| Mobility | street-following vehicles (60 km/h, two lanes), highway lanes at 70/140 km/h, random waypoints, pedestrians | constant speed per user | handheld rotation and body blockage |
|
|
136
|
+
| Layouts | `street_grid` (TR 37.885 urban grid), `open_area`, `highway` (TR 37.885 / TR 36.885, wrap-around), `indoor` (TR 38.901 office), `ntn` (one LEO satellite, TR 38.821); explicit site lists | sites on the pavement with small cells (urban cards); the TR 37.885 urban macro grid without wrap-around (`urban-macro-tr37885-4ghz`) | several satellites |
|
|
137
|
+
| Channel | TR 38.901 path loss and LOS (UMi, UMa, RMa, SMa, InH), LOS from buildings, spatially consistent LOS and shadowing, car and O2I building penetration loss, radio maps from a file (clause 8), TR 38.811 for the satellite | received power per site and step with a slow time-varying component; indoor users keep the LOS state and shadowing of their position; optional TDL fast fading with effective SINRs (clause 7.7.2, since 2.2.0) | CDL and the full fast-fading model of clause 7.5, MIMO |
|
|
138
|
+
| Beams and carriers | SSB beams per sector, cell quality from beams, beam failure detection and recovery, several carriers with gaps and Event A5; dual connectivity (NR-DC: SN addition, PSCell change, SN release, SCG failure; option since 2.3.0) | the TR 38.901 antenna element and DFT beams; isotropic UE unless UE receive panels are set (option since 2.4.0); the SCG as one PSCell with a full-buffer share | UE transmit beams and polarisation, conditional PSCell change, fast MCG recovery |
|
|
139
|
+
| Mobility | street-following vehicles (60 km/h, two lanes), highway lanes at 70/140 km/h, a train at 350 km/h (TR 38.854), random waypoints, pedestrians | constant speed per user | handheld rotation and body blockage |
|
|
138
140
|
| Traffic and load | constant rates per 5QI, full buffer, periodic, FTP model 3; cell load drives interference | rate from SINR (Shannon-type mapping), no scheduler | slot scheduler, HARQ, RLC/PDCP, TCP and applications |
|
|
139
141
|
| Measurements | L1 samples with error, TS 38.331 L3 filter, TS 38.133 measurement periods and gaps (option) | wideband RSRP; SS-RSRP per resource element with beams/carriers | RSRQ, CSI reporting |
|
|
140
|
-
| Procedures | baseline (A3), CHO, DAPS, LTM, conditional LTM, CHO with D1/D2 for satellites, A3/A5 between carriers; rules `a3`, `a3a5`, `a3_mro`, `a3_bandit`, `dqn`, `cho`, `cho_d2`, `daps`, `ltm`, `cltm` | fixed preparation, command and execution delays; re-establishment always succeeds after a fixed outage | condEventT1, RACH-less NTN handover, Xn signalling in detail |
|
|
142
|
+
| Procedures | baseline (A3), CHO, DAPS, LTM, conditional LTM, CHO with D1/D2 for satellites, A3/A5 between carriers; rules `a3`, `a3a5`, `a3_mro`, `a3_bandit`, `dqn`, `a3_pred`, `cho`, `cho_d2`, `daps`, `ltm`, `cltm` | fixed preparation, command and execution delays; re-establishment always succeeds after a fixed outage | condEventT1, RACH-less NTN handover, Xn signalling in detail |
|
|
141
143
|
| Failure model | Qout/Qin with windows, N310/N311/T310, T304, command received during T310, re-establishment, link-monitoring restart | Qout/Qin as SINR thresholds (TR 36.839 values) instead of the BLER of a hypothetical PDCCH | BLER-based link monitoring; absolute failure rates are not calibrated: compare rules with each other |
|
|
142
144
|
| Time | 10 ms step by default (`protocol.step_s`); the effect of the step is measured in [time step](https://github.com/mjs19971997/handoverlab/blob/main/docs/time-step.md) | events rounded to the step | sub-slot timing |
|
|
143
145
|
|
|
144
146
|
Built-in cards: `smoke`, `urban-grid-10ghz`, `fr3-urban-15ghz`, `urban-grid-28ghz-beams`, `dense-urban-2layer`,
|
|
145
147
|
`open-area-10ghz`, `ns3-urban-3.5ghz`, `highway-tr37885-4ghz`, `highway-tr37885-30ghz`, `indoor-office-4ghz`,
|
|
146
|
-
`rural-700mhz`, `ntn-leo600-2ghz
|
|
148
|
+
`rural-700mhz`, `ntn-leo600-2ghz`, `urban-macro-tr37885-4ghz`, `suburban-sma-7ghz`, `hst-fr2-28ghz`; each
|
|
149
|
+
names the source of every value and its own limitations.
|
|
147
150
|
|
|
148
151
|
## Scope: 5G-Advanced and beyond 5G
|
|
149
152
|
|
|
@@ -157,7 +160,8 @@ networks with small cells 50-300 m apart. Three paths lead beyond 5G:
|
|
|
157
160
|
- **Non-terrestrial networks**: a LEO satellite with earth-moving beams (TR 38.811, TR 38.821) and conditional
|
|
158
161
|
handover with condEventD2 (TS 38.331 Release 18).
|
|
159
162
|
- **Learning-based mobility**: the rule interface gives a rule every measurement and the outcome of every
|
|
160
|
-
attempt; `a3_bandit` and `dqn` are examples, `a3_mro` the fair tuned baseline
|
|
163
|
+
attempt; `a3_bandit` and `dqn` are examples, `a3_mro` the fair tuned baseline, and `a3_pred` follows the
|
|
164
|
+
RRM measurement prediction of TR 38.744 (Release 19).
|
|
161
165
|
|
|
162
166
|
6G itself is at the stage of requirements: TR 38.914 V20.1.0 (Release 20, last changed at RAN #113 in September
|
|
163
167
|
2026) sets scenarios and key performance requirements but specifies no handover procedure, timer or measurement
|
|
@@ -373,6 +377,10 @@ the pages are plain Markdown in [docs/](https://github.com/mjs19971997/handoverl
|
|
|
373
377
|
- [Scenario cards](https://github.com/mjs19971997/handoverlab/tree/main/docs/scenarios): the built-in scenarios with the source of every parameter.
|
|
374
378
|
- [Verification](https://github.com/mjs19971997/handoverlab/blob/main/docs/verification.md), [failure-model calibration](https://github.com/mjs19971997/handoverlab/blob/main/docs/calibration.md) and
|
|
375
379
|
[performance](https://github.com/mjs19971997/handoverlab/blob/main/docs/performance.md).
|
|
380
|
+
- [Comparison with other simulators](https://github.com/mjs19971997/handoverlab/blob/main/docs/comparison.md): ns-3 with 5G-LENA
|
|
381
|
+
and the mmWave module, Simu5G, the Vienna 5G System Level Simulator, the MATLAB 5G Toolbox, OpenAirInterface
|
|
382
|
+
and Sionna on handover procedures, failure model, NTN, beams, PHY abstraction, scheduler, scale and validation,
|
|
383
|
+
each cell with its source, including where the other tools are stronger.
|
|
376
384
|
- [Changelog](https://github.com/mjs19971997/handoverlab/blob/main/CHANGELOG.md), [contribution guide](https://github.com/mjs19971997/handoverlab/blob/main/CONTRIBUTING.md) and [releasing](https://github.com/mjs19971997/handoverlab/blob/main/docs/RELEASING.md).
|
|
377
385
|
|
|
378
386
|
## Roadmap
|
|
@@ -81,6 +81,58 @@ distribution, at most 0.12 dB below the smallest company value: the SIR of Hando
|
|
|
81
81
|
0.5 dB below the industry mean there, which is on the conservative side. `handoverlab verify`
|
|
82
82
|
passes a case when every percentile lies inside the company range widened by 0.5 dB.
|
|
83
83
|
|
|
84
|
+
## 7 GHz: Table 7.8-1A against R1-2506406 (since 2.4.0)
|
|
85
|
+
|
|
86
|
+
**Summary.** TR 38.901 V19.5.0 adds Table 7.8-1A to clause 7.8.1: UMa, UMi-Street Canyon and suburban macro
|
|
87
|
+
(SMa, ISD 1299 m and 1732 m) at 7 GHz, plus UMa and UMi at 6 GHz again "with updated channel modeling". The
|
|
88
|
+
companies reported their CDFs in the 3GPP contribution **R1-2506406** (RAN1 #122, Bengaluru, August 2025,
|
|
89
|
+
InterDigital and ZTE, "Calibration Results for 7 - 24 GHz SI";
|
|
90
|
+
[3GPP server](https://www.3gpp.org/ftp/tsg_ran/WG1_RL1/TSGR1_122/Docs/R1-2506406.zip); large-scale workbook
|
|
91
|
+
`Calibration_LS_v35`, based on TR 38.901 V19.0.0). The criteria were fixed before the first run: every
|
|
92
|
+
percentile 5-95 % inside the company range widened by 0.5 dB (C1, the rule of the cases above), and the
|
|
93
|
+
largest distance from the company mean at most 1.5 dB per case (C2). Result, 30 000 users per case, seed 1:
|
|
94
|
+
**C1 passes for all 18 case-metric pairs (342 of 342 percentiles strictly inside the range); C2 fails for all
|
|
95
|
+
six cases (largest distance 1.65-2.88 dB).** `handoverlab verify` runs C1 as checks and C2 as notes in the
|
|
96
|
+
group `calibration`.
|
|
97
|
+
|
|
98
|
+
**The reference.** `src/handoverlab/verify/data/r1_2506406.csv` keeps, in the format of `r1_165974.csv`, the
|
|
99
|
+
mean, the smallest and the largest company value and the number of companies per case, metric and percentile;
|
|
100
|
+
the mean equals the workbook's own mean column. Companies with complete columns: 16 (coupling loss) / 15
|
|
101
|
+
(SINR, SIR) at 6 GHz; 17 / 16 for UMa and UMi at 7 GHz (Huawei, InterDigital, Samsung, ZTE, CATT, Lenovo,
|
|
102
|
+
Apple, Nokia, Ericsson, OPPO, MediaTek, Intel, Sharp, Spreadtrum, LGE, ETRI, Xiaomi; Spreadtrum gave the
|
|
103
|
+
coupling loss only); 17 / 16 for SMa 1299 m (with vivo, without ETRI); 13 / 12 for SMa 1732 m.
|
|
104
|
+
|
|
105
|
+
**The drop.** UMa and UMi as above (Table 7.8-1), with the IRR-glass loss of V19.5.0 (25.4 + 0.11 f dB) because
|
|
106
|
+
the companies worked with Release 19; at 7 GHz 49 dBm (UMa) and 44 dBm (UMi) with 20 MHz, the 6 GHz values of
|
|
107
|
+
Table 7.8-1, which Table 7.8-1A leaves unchanged for these two scenarios. SMa:
|
|
108
|
+
|
|
109
|
+
| Item | Setting | Source |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| Layout | 19 sites, 3 sectors, ISD 1299 m or 1732 m, BS 35 m, geographical wrap-around, minimum 2D distance 35 m (to d2D-out) | Tables 7.2-5, 7.8-1A |
|
|
112
|
+
| Antenna | element of Table 7.3-1 and 10 vertical elements (one port) without electrical tilt, the panel tilted mechanically to 95 deg (ISD 1299 m) or 92 deg (ISD 1732 m): the angles are taken into the antenna's local coordinates with Eqs. 7.1-7 and 7.1-8 | Tables 7.3-1, 7.8-1A; clause 7.1.3 |
|
|
113
|
+
| Users | 20 % outdoors (in cars, 1.5 m) with the car penetration loss N(9 dB, 5 dB) of non-metallic windows; 80 % indoors, 90 % of them in residential buildings (1.5 or 4.5 m), 10 % in commercial buildings (1.5 ... 13.5 m), uniform over the floors | Tables 7.2-5, 7.8-1A; clause 7.4.3.2 |
|
|
114
|
+
| O2I loss | low-loss A model (30 % glass, 70 % plywood, sigma_P 4.4 dB); d2D-in = minimum of two uniform variables up to 10 m (residential) or 25 m (commercial) | clause 7.4.3.1, Tables 7.4.3-1, 7.4.3-2 |
|
|
115
|
+
| Path loss, LOS, shadowing | the SMa models of `handoverlab.channel.pathloss` (Table 7.4.1-1; LOS probability of Table 7.4.2-1 without vegetation); shadowing 4 dB (LOS below d_BP), 6 dB (LOS beyond), 8 dB (NLOS), 8 dB for indoor users | Tables 7.4.1-1, 7.4.2-1, 7.5-6 Part-4 |
|
|
116
|
+
| Link budget | 49 dBm, 20 MHz, UT noise figure 9 dB, isotropic UT, attachment to the highest coupling gain | Tables 7.8-1, 7.8-1A |
|
|
117
|
+
|
|
118
|
+
Results (median HandoverLab / company mean; percentiles 5-95 % strictly inside the range; largest distance
|
|
119
|
+
from the mean):
|
|
120
|
+
|
|
121
|
+
| Case | Coupling loss [dB] | SINR [dB] | SIR [dB] | C1 | C2 (largest distance) |
|
|
122
|
+
|---|---|---|---|---|---|
|
|
123
|
+
| UMa-6 GHz | 119.9 / 121.0; 19/19; 1.65 | 5.5 / 5.6; 19/19; 1.34 | 8.0 / 8.0; 19/19; 0.17 | pass | fail (1.65) |
|
|
124
|
+
| UMi-6 GHz | 111.9 / 112.1; 19/19; 2.88 | 5.1 / 5.2; 19/19; 1.35 | 6.8 / 6.6; 19/19; 0.53 | pass | fail (2.88) |
|
|
125
|
+
| UMa-7 GHz | 121.7 / 122.4; 19/19; 1.78 | 5.0 / 5.0; 19/19; 0.90 | 7.9 / 7.9; 19/19; 0.29 | pass | fail (1.78) |
|
|
126
|
+
| UMi-7 GHz | 113.8 / 113.3; 19/19; 2.43 | 4.7 / 4.8; 19/19; 1.63 | 6.7 / 6.6; 19/19; 0.30 | pass | fail (2.43) |
|
|
127
|
+
| SMa-7 GHz, ISD 1299 m | 103.5 / 104.3; 19/19; 1.31 | 5.9 / 5.7; 19/19; 1.69 | 5.9 / 5.9; 19/19; 1.57 | pass | fail (1.69) |
|
|
128
|
+
| SMa-7 GHz, ISD 1732 m | 109.2 / 111.3; 19/19; 2.24 | 6.3 / 5.9; 19/19; 1.07 | 6.4 / 6.6; 19/19; 0.32 | pass | fail (2.24) |
|
|
129
|
+
|
|
130
|
+
Where the distance comes from: for UMa and UMi the coupling loss of the best users (75-95 %, close to a site)
|
|
131
|
+
is 1.6-2.9 dB lower than the company mean, and at UMi 7 GHz also at 5-10 %; the medians are within 1.1 dB.
|
|
132
|
+
For SMa 1732 m the coupling loss is about 2.1 dB lower than the mean over most of the distribution. The
|
|
133
|
+
company spread is large here (at the median, from 106.5 dB to 129.4 dB for SMa 1732 m), so the mean is a soft
|
|
134
|
+
target, but C2 was fixed before the run and is reported as it came. No parameter was changed after the run.
|
|
135
|
+
|
|
84
136
|
## What this calibration covers, and what it does not
|
|
85
137
|
|
|
86
138
|
- It covers the **radio model**: the path-loss formulas, the LOS probabilities, the shadowing, the
|
|
@@ -98,8 +150,8 @@ passes a case when every percentile lies inside the company range widened by 0.5
|
|
|
98
150
|
## Repeat it
|
|
99
151
|
|
|
100
152
|
```bash
|
|
101
|
-
handoverlab verify --only calibration # 10 000 users per case, a
|
|
102
|
-
handoverlab verify --only calibration --full # 30 000 users per case, the
|
|
153
|
+
handoverlab verify --only calibration # 10 000 users per case, under a minute
|
|
154
|
+
handoverlab verify --only calibration --full # 30 000 users per case, the tables above
|
|
103
155
|
python tools/make_calibration_figure.py # docs/images/calibration_38901.png
|
|
104
156
|
```
|
|
105
157
|
|
|
@@ -110,4 +162,6 @@ case = cal.CalScenario("UMa", 6.0)
|
|
|
110
162
|
res = cal.simulate_drops(case, n_users=30000, seed=1)
|
|
111
163
|
for c in cal.compare(case, res):
|
|
112
164
|
print(c.metric, c.inside.sum(), "of", len(c.percentiles), "inside, largest distance", c.max_dev_db)
|
|
165
|
+
|
|
166
|
+
case = cal.CalScenario("SMa", 7.0, isd_m=1299.0, reference="R1-2506406") # compared with R1-2506406
|
|
113
167
|
```
|
|
@@ -22,11 +22,38 @@ registered (2.1.0 defaults gave the same verdicts):
|
|
|
22
22
|
| Recovery: time without connection per failure | 0.09 s | 1.0 s (`reest_s`) | ratio 0.67-1.5 | fails |
|
|
23
23
|
| Execution failures | none in any cell | 0-5 % | needs 10 in ns-3 | not measurable |
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
ns-3's full traffic is an overload too (more than a cell can carry), so both simulators fill the
|
|
26
|
+
cells; the difference is what link monitoring sees. In ns-3 its SINR hardly moves with the data
|
|
27
|
+
load; in HandoverLab it follows the data load by default (ns-3 has fewer failures at full traffic,
|
|
28
|
+
90 to 34 and 13 to 3; HandoverLab many more, 18 to 521 and 4 to 175). TS 38.133 V19.6.0 clause 8.1
|
|
29
|
+
evaluates the link on a hypothetical PDCCH, and the neighbours' control channels and reference
|
|
30
|
+
signals are sent whatever the data load; `protocol.lm_load` gives link monitoring such a fixed
|
|
31
|
+
interferer load.
|
|
32
|
+
|
|
33
|
+
On recovery, the standard does not fix one value: TS 38.133 V19.6.0 clause 6.2.1.2.1 bounds the
|
|
34
|
+
re-establishment delay by 50 ms + T_identify_intra_NR (known FR1 cell: max(200 ms, 5 T_SMTC), Table
|
|
35
|
+
6.2.1.2.1-1) + T_SI-NR + T_PRACH (at most the SSB-to-PRACH association period + 10 ms, TS 38.213
|
|
36
|
+
Table 8.1-1), followed by RRCReestablishment processing of 10 ms (TS 38.331 V19.4.0 Table 12.1-1).
|
|
37
|
+
That is about 0.28 s when the system information is already held and about 1.55 s with the T_SI of
|
|
38
|
+
1280 ms of the test case A.6.3.2.1.1.2. HandoverLab's `reest_s` of 1.0 s lies inside; ns-3 (ideal
|
|
39
|
+
RRC) takes 0.09 s, below both. The recovery time was therefore not changed towards ns-3.
|
|
40
|
+
|
|
41
|
+
**Fresh held-out check N3 (2.3.0).** One setting was chosen on the light-traffic N2 cells above
|
|
42
|
+
(`protocol.lm_load` 0.15, with `protocol.exec_can_fail` false, as ns-3 has ideal execution) and
|
|
43
|
+
tested on 40 new ns-3 runs (seeds 301-305, ISD 200 / 400 m, 12 / 24 m/s, TTT 100 / 640 ms, light
|
|
44
|
+
traffic), with limits fixed before the runs:
|
|
45
|
+
|
|
46
|
+
| Check | Limit | Fixed link-monitoring load 0.15 | Default link monitoring |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| Failure level, sum HandoverLab / sum ns-3 | 0.67-1.5 | 0.47, fails | 0.16, fails |
|
|
49
|
+
| Failure order over the 8 cells (Spearman) | at least 0.8 | 0.95, passes | 0.78, fails |
|
|
50
|
+
| Handover rate, median ratio | 0.8-1.25 | 0.93, passes | 0.96, passes |
|
|
51
|
+
| Direction of the TTT effect on failures | 3 of 4 | 4, passes | 4, passes |
|
|
52
|
+
|
|
53
|
+
At TTT 100 ms the fixed load gives ns-3's failure counts (17 against 14, 11 against 10); at
|
|
54
|
+
TTT 640 ms it gives about half of them (84 against 180, 68 against 193), the known effect of ns-3's
|
|
55
|
+
slow out-of-sync detection (below). As fixed in advance, the setting is not adopted because the
|
|
56
|
+
level check fails; it is reported here, and no further tuning was done on these runs.
|
|
30
57
|
|
|
31
58
|
**Summary (1.5.0).** Handover and unnecessary-handover rates of HandoverLab agree with ns-3 /
|
|
32
59
|
5G-LENA. For failure rates, the order of settings and conditions agrees on part A and on both
|