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.
Files changed (285) hide show
  1. {handoverlab-2.2.0 → handoverlab-2.4.0}/CHANGELOG.md +133 -1
  2. {handoverlab-2.2.0 → handoverlab-2.4.0}/CITATION.cff +1 -1
  3. {handoverlab-2.2.0 → handoverlab-2.4.0}/PKG-INFO +18 -10
  4. {handoverlab-2.2.0 → handoverlab-2.4.0}/README.md +17 -9
  5. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/calibration-3gpp.md +56 -2
  6. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/calibration.md +32 -5
  7. handoverlab-2.4.0/docs/comparison.md +199 -0
  8. handoverlab-2.4.0/docs/guides/ai-mobility.md +182 -0
  9. handoverlab-2.4.0/docs/guides/buffers.md +117 -0
  10. handoverlab-2.4.0/docs/guides/dual-connectivity.md +114 -0
  11. handoverlab-2.4.0/docs/guides/high-speed-train.md +102 -0
  12. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/scheduler.md +5 -3
  13. handoverlab-2.4.0/docs/guides/suburban-o2i.md +98 -0
  14. handoverlab-2.4.0/docs/guides/ue-beams.md +93 -0
  15. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/performance.md +41 -0
  16. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/cli.md +1 -1
  17. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/metrics.md +25 -0
  18. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/highway-tr37885-30ghz.md +6 -0
  19. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/highway-tr37885-4ghz.md +6 -0
  20. handoverlab-2.4.0/docs/scenarios/hst-fr2-28ghz.md +161 -0
  21. handoverlab-2.4.0/docs/scenarios/hst-fr2-28ghz.svg +18 -0
  22. handoverlab-2.4.0/docs/scenarios/suburban-sma-7ghz.md +107 -0
  23. handoverlab-2.4.0/docs/scenarios/suburban-sma-7ghz.svg +15 -0
  24. handoverlab-2.4.0/docs/scenarios/urban-macro-tr37885-4ghz.md +110 -0
  25. handoverlab-2.4.0/docs/scenarios/urban-macro-tr37885-4ghz.svg +48 -0
  26. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/standard-compliance.md +106 -3
  27. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/user_guide.md +11 -4
  28. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/verification.md +3 -1
  29. {handoverlab-2.2.0 → handoverlab-2.4.0}/mkdocs.yml +10 -0
  30. {handoverlab-2.2.0 → handoverlab-2.4.0}/pyproject.toml +1 -1
  31. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/__init__.py +1 -1
  32. handoverlab-2.4.0/src/handoverlab/channel/antenna.py +122 -0
  33. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/extended.py +116 -6
  34. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/pathloss.py +142 -14
  35. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/radiomap.py +9 -5
  36. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/source.py +15 -5
  37. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/config.py +221 -9
  38. handoverlab-2.4.0/src/handoverlab/engine/_kernels.py +238 -0
  39. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/batch.py +2 -1
  40. handoverlab-2.4.0/src/handoverlab/engine/buffers.py +313 -0
  41. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/core.py +58 -5
  42. handoverlab-2.4.0/src/handoverlab/engine/dual.py +335 -0
  43. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/extended.py +60 -5
  44. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/metrics.py +51 -0
  45. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/scheduler.py +148 -2
  46. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/mobility.py +12 -7
  47. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/rules/__init__.py +6 -4
  48. handoverlab-2.4.0/src/handoverlab/rules/predict.py +588 -0
  49. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/__init__.py +18 -1
  50. handoverlab-2.4.0/src/handoverlab/scenarios/cards/hst-fr2-28ghz.yaml +97 -0
  51. handoverlab-2.4.0/src/handoverlab/scenarios/cards/suburban-sma-7ghz.yaml +63 -0
  52. handoverlab-2.4.0/src/handoverlab/scenarios/cards/urban-macro-tr37885-4ghz.yaml +70 -0
  53. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/seeds.py +13 -10
  54. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/simulate.py +2 -1
  55. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/standard.py +1 -0
  56. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/__init__.py +12 -4
  57. handoverlab-2.4.0/src/handoverlab/verify/aimobility.py +56 -0
  58. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/calibration.py +171 -14
  59. handoverlab-2.4.0/src/handoverlab/verify/data/r1_2506406.csv +607 -0
  60. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/learning.py +5 -0
  61. handoverlab-2.4.0/src/handoverlab/verify/scenarios.py +343 -0
  62. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/world.py +6 -3
  63. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/PKG-INFO +18 -10
  64. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/SOURCES.txt +28 -0
  65. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/data/public_api.json +38 -0
  66. handoverlab-2.4.0/tests/test_ai_mobility.py +123 -0
  67. handoverlab-2.4.0/tests/test_buffers.py +206 -0
  68. handoverlab-2.4.0/tests/test_calibration.py +167 -0
  69. handoverlab-2.4.0/tests/test_hst_dc.py +191 -0
  70. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_indoor_rural.py +1 -1
  71. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_pathloss.py +2 -2
  72. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_scenarios.py +3 -2
  73. handoverlab-2.4.0/tests/test_scenarios_230.py +195 -0
  74. handoverlab-2.4.0/tests/test_sched_kernel.py +130 -0
  75. handoverlab-2.4.0/tests/test_ue_beams.py +162 -0
  76. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_verify.py +1 -1
  77. handoverlab-2.2.0/src/handoverlab/channel/antenna.py +0 -72
  78. handoverlab-2.2.0/src/handoverlab/engine/_kernels.py +0 -78
  79. handoverlab-2.2.0/tests/test_calibration.py +0 -81
  80. {handoverlab-2.2.0 → handoverlab-2.4.0}/.zenodo.json +0 -0
  81. {handoverlab-2.2.0 → handoverlab-2.4.0}/CODE_OF_CONDUCT.md +0 -0
  82. {handoverlab-2.2.0 → handoverlab-2.4.0}/CONTRIBUTING.md +0 -0
  83. {handoverlab-2.2.0 → handoverlab-2.4.0}/LICENSE +0 -0
  84. {handoverlab-2.2.0 → handoverlab-2.4.0}/MANIFEST.in +0 -0
  85. {handoverlab-2.2.0 → handoverlab-2.4.0}/SECURITY.md +0 -0
  86. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/RELEASING.md +0 -0
  87. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/add-scenario.md +0 -0
  88. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/beams-layers.md +0 -0
  89. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/daps-ltm.md +0 -0
  90. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/dashboard.md +0 -0
  91. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/export-event-logs.md +0 -0
  92. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/fading.md +0 -0
  93. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/highway.md +0 -0
  94. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/indoor-rural.md +0 -0
  95. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/learning-rule.md +0 -0
  96. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/many-cores.md +0 -0
  97. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/mro.md +0 -0
  98. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/ntn.md +0 -0
  99. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/radio-maps.md +0 -0
  100. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/reproduce.md +0 -0
  101. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/guides/upper-mid-band.md +0 -0
  102. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/calibration_38901.png +0 -0
  103. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/dashboard-charts.png +0 -0
  104. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/dashboard-compare.png +0 -0
  105. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/dashboard-where.png +0 -0
  106. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/dashboard.png +0 -0
  107. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/ntn-beams.png +0 -0
  108. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/radio-map.png +0 -0
  109. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/report-comparison.png +0 -0
  110. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/report-tuning.png +0 -0
  111. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/images/ssb-beams.png +0 -0
  112. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/index.md +0 -0
  113. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/migration-2.0.md +0 -0
  114. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/config.md +0 -0
  115. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/engine.md +0 -0
  116. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/eventlog.md +0 -0
  117. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/gui.md +0 -0
  118. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/index.md +0 -0
  119. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/mapfile.md +0 -0
  120. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/ntn.md +0 -0
  121. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/rules.md +0 -0
  122. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/scenarios.md +0 -0
  123. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/simulate.md +0 -0
  124. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/stability.md +0 -0
  125. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/stats.md +0 -0
  126. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/studies.md +0 -0
  127. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/testing.md +0 -0
  128. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference/api/verify.md +0 -0
  129. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/reference-study.md +0 -0
  130. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/dense-urban-2layer.md +0 -0
  131. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/dense-urban-2layer.svg +0 -0
  132. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/fr3-urban-15ghz.md +0 -0
  133. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/fr3-urban-15ghz.svg +0 -0
  134. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/highway-tr37885-30ghz.svg +0 -0
  135. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/highway-tr37885-4ghz.svg +0 -0
  136. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/indoor-office-4ghz.md +0 -0
  137. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/indoor-office-4ghz.svg +0 -0
  138. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/ns3-urban-3.5ghz.md +0 -0
  139. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/ns3-urban-3.5ghz.svg +0 -0
  140. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/ntn-leo600-2ghz.md +0 -0
  141. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/ntn-leo600-2ghz.svg +0 -0
  142. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/open-area-10ghz.md +0 -0
  143. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/open-area-10ghz.svg +0 -0
  144. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/rural-700mhz.md +0 -0
  145. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/rural-700mhz.svg +0 -0
  146. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/smoke.md +0 -0
  147. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/smoke.svg +0 -0
  148. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/urban-grid-10ghz.md +0 -0
  149. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/urban-grid-10ghz.svg +0 -0
  150. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/urban-grid-28ghz-beams.md +0 -0
  151. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/scenarios/urban-grid-28ghz-beams.svg +0 -0
  152. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/stability.md +0 -0
  153. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/time-step.md +0 -0
  154. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/tutorials/first-run.md +0 -0
  155. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/tutorials/own-rule.md +0 -0
  156. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/tutorials/reading-the-report.md +0 -0
  157. {handoverlab-2.2.0 → handoverlab-2.4.0}/docs/tutorials/tuning-study.md +0 -0
  158. {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/compare_a3_cho.py +0 -0
  159. {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/open_area.toml +0 -0
  160. {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/radio_map.py +0 -0
  161. {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/smoke.yaml +0 -0
  162. {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/speed_rule.py +0 -0
  163. {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/street_grid.yaml +0 -0
  164. {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/study_reference.yaml +0 -0
  165. {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/study_reference_explore.yaml +0 -0
  166. {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/study_smoke.yaml +0 -0
  167. {handoverlab-2.2.0 → handoverlab-2.4.0}/examples/traffic_models.py +0 -0
  168. {handoverlab-2.2.0 → handoverlab-2.4.0}/setup.cfg +0 -0
  169. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/__main__.py +0 -0
  170. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/__init__.py +0 -0
  171. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/fading.py +0 -0
  172. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/l2s.py +0 -0
  173. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/channel/ntn.py +0 -0
  174. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/cli.py +0 -0
  175. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/__init__.py +0 -0
  176. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/invariants.py +0 -0
  177. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/engine/procedures.py +0 -0
  178. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/eventlog.py +0 -0
  179. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/gui/__init__.py +0 -0
  180. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/gui/app.py +0 -0
  181. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/gui/logic.py +0 -0
  182. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/io.py +0 -0
  183. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/layout.py +0 -0
  184. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/linklevel.py +0 -0
  185. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/mapfile.py +0 -0
  186. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/measurement.py +0 -0
  187. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/py.typed +0 -0
  188. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/requirements.py +0 -0
  189. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/rules/base.py +0 -0
  190. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/rules/builtin.py +0 -0
  191. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/rules/dqn.py +0 -0
  192. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/rules/mro.py +0 -0
  193. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/dense-urban-2layer.yaml +0 -0
  194. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/fr3-urban-15ghz.yaml +0 -0
  195. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/highway-tr37885-30ghz.yaml +0 -0
  196. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/highway-tr37885-4ghz.yaml +0 -0
  197. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/indoor-office-4ghz.yaml +0 -0
  198. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/ns3-urban-3.5ghz.yaml +0 -0
  199. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/ntn-leo600-2ghz.yaml +0 -0
  200. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/open-area-10ghz.yaml +0 -0
  201. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/rural-700mhz.yaml +0 -0
  202. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/smoke.yaml +0 -0
  203. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/urban-grid-10ghz.yaml +0 -0
  204. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/scenarios/cards/urban-grid-28ghz-beams.yaml +0 -0
  205. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/stability.py +0 -0
  206. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/stats.py +0 -0
  207. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/__init__.py +0 -0
  208. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/config.py +0 -0
  209. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/report.py +0 -0
  210. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/runner.py +0 -0
  211. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/status.py +0 -0
  212. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/store.py +0 -0
  213. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/study.py +0 -0
  214. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/studies/tuning.py +0 -0
  215. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/testing.py +0 -0
  216. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/traffic.py +0 -0
  217. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/data/golden.json +0 -0
  218. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/data/golden_1x.json +0 -0
  219. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/data/ns3_urban_a3.json +0 -0
  220. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/data/r1_165974.csv +0 -0
  221. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/engine_checks.py +0 -0
  222. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/extended.py +0 -0
  223. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/fading.py +0 -0
  224. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/golden.py +0 -0
  225. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/highway.py +0 -0
  226. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/ns3.py +0 -0
  227. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/ntn.py +0 -0
  228. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/radio.py +0 -0
  229. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/report.py +0 -0
  230. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/stored.py +0 -0
  231. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab/verify/values.py +0 -0
  232. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/dependency_links.txt +0 -0
  233. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/entry_points.txt +0 -0
  234. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/requires.txt +0 -0
  235. {handoverlab-2.2.0 → handoverlab-2.4.0}/src/handoverlab.egg-info/top_level.txt +0 -0
  236. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/conftest.py +0 -0
  237. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/data/bh6_reference.json +0 -0
  238. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/data/bh6_wide.json +0 -0
  239. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/data/make_bh6_reference.py +0 -0
  240. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/data/make_bh6_wide.py +0 -0
  241. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/helpers.py +0 -0
  242. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_batch.py +0 -0
  243. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_beams_layers.py +0 -0
  244. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_channel_detail.py +0 -0
  245. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_cltm.py +0 -0
  246. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_config_cli.py +0 -0
  247. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_contract.py +0 -0
  248. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_determinism.py +0 -0
  249. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_dqn.py +0 -0
  250. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_engine_triggers.py +0 -0
  251. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_eventlog.py +0 -0
  252. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_fading.py +0 -0
  253. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_gui.py +0 -0
  254. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_highway.py +0 -0
  255. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_highway_tr37885.py +0 -0
  256. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_invariants.py +0 -0
  257. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_levels_status_extend.py +0 -0
  258. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_lm_model.py +0 -0
  259. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_mapfile.py +0 -0
  260. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_measurement.py +0 -0
  261. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_mro.py +0 -0
  262. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_ntn.py +0 -0
  263. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_protocol_3gpp.py +0 -0
  264. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_readme_boundaries.py +0 -0
  265. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_regression_bh6.py +0 -0
  266. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_regression_bh6_wide.py +0 -0
  267. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_rrc_detail.py +0 -0
  268. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_rules_rc2.py +0 -0
  269. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_scheduler.py +0 -0
  270. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_signalling_energy.py +0 -0
  271. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_stability.py +0 -0
  272. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_stats.py +0 -0
  273. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_study.py +0 -0
  274. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_tools.py +0 -0
  275. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_traffic.py +0 -0
  276. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_tuning.py +0 -0
  277. {handoverlab-2.2.0 → handoverlab-2.4.0}/tests/test_v111.py +0 -0
  278. {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/compare_fingerprints.py +0 -0
  279. {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/make_beam_figure.py +0 -0
  280. {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/make_calibration_figure.py +0 -0
  281. {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/make_ntn_figure.py +0 -0
  282. {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/make_radiomap_figure.py +0 -0
  283. {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/make_readme_images.py +0 -0
  284. {handoverlab-2.2.0 → handoverlab-2.4.0}/tools/mkdocs_hooks.py +0 -0
  285. {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.2.0...HEAD
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.2.0"
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.2.0
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 38.901 indoor office, rural macro cells, a LEO satellite with
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); line of sight from the
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) | the 500 m macro grid of the TR 37.885 urban scenario, several satellites |
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 | UE-side beamforming, dual connectivity and PSCell change |
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`; each names the source of every value and its own limitations.
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 38.901 indoor office, rural macro cells, a LEO satellite with
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); line of sight from the
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) | the 500 m macro grid of the TR 37.885 urban scenario, several satellites |
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 | UE-side beamforming, dual connectivity and PSCell change |
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`; each names the source of every value and its own limitations.
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 few seconds
102
- handoverlab verify --only calibration --full # 30 000 users per case, the table above
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
- The two failing parts explain much of the failure gap: HandoverLab's full-buffer load always fills
26
- every cell, so interference is far higher than with ns-3's offered traffic (ns-3 has fewer failures
27
- at full traffic, 90 to 34 and 13 to 3; HandoverLab many more, 18 to 521 and 4 to 175), and a
28
- re-establishment takes a fixed second. A traffic-driven load and a recovery time from the standard
29
- texts are the next steps; they need new ns-3 runs to be judged, as these runs have now been seen.
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