commkit 3.6.0__tar.gz → 3.6.1__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 (307) hide show
  1. {commkit-3.6.0 → commkit-3.6.1}/CHANGELOG.md +8 -1
  2. {commkit-3.6.0 → commkit-3.6.1}/PKG-INFO +1 -1
  3. {commkit-3.6.0 → commkit-3.6.1}/commkit/__init__.py +1 -1
  4. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/analysis.py +24 -1
  5. {commkit-3.6.0 → commkit-3.6.1}/pyproject.toml +2 -2
  6. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_analysis.py +11 -0
  7. {commkit-3.6.0 → commkit-3.6.1}/uv.lock +1 -1
  8. {commkit-3.6.0 → commkit-3.6.1}/.gitattributes +0 -0
  9. {commkit-3.6.0 → commkit-3.6.1}/.github/icon.svg +0 -0
  10. {commkit-3.6.0 → commkit-3.6.1}/.github/logo.svg +0 -0
  11. {commkit-3.6.0 → commkit-3.6.1}/.github/workflows/ci.yml +0 -0
  12. {commkit-3.6.0 → commkit-3.6.1}/.github/workflows/publish.yml +0 -0
  13. {commkit-3.6.0 → commkit-3.6.1}/.gitignore +0 -0
  14. {commkit-3.6.0 → commkit-3.6.1}/.python-version +0 -0
  15. {commkit-3.6.0 → commkit-3.6.1}/AGENTS.md +0 -0
  16. {commkit-3.6.0 → commkit-3.6.1}/LICENSE +0 -0
  17. {commkit-3.6.0 → commkit-3.6.1}/README.md +0 -0
  18. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/baselines/Linux-CPython-3.14-64bit/0002_pre_v2.json +0 -0
  19. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/baselines/Linux-CPython-3.14-64bit/0003_v2_0.json +0 -0
  20. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/baselines/Linux-CPython-3.14-64bit/0004_fiber_dbp.json +0 -0
  21. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/baselines/Linux-CPython-3.14-64bit/0005_gpu_decoder_path.json +0 -0
  22. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/baselines/Linux-CPython-3.14-64bit/0006_perf_cleanup.json +0 -0
  23. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/baselines/Linux-CPython-3.14-64bit/0007_v3_0.json +0 -0
  24. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/baselines/Linux-CPython-3.14-64bit/0008_v3_1.json +0 -0
  25. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_block_blind.py +0 -0
  26. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_block_lms.py +0 -0
  27. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_bps.py +0 -0
  28. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_coding.py +0 -0
  29. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_equalizers.py +0 -0
  30. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_fiber.py +0 -0
  31. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_filters.py +0 -0
  32. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_import.py +0 -0
  33. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_llr.py +0 -0
  34. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_mapping.py +0 -0
  35. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_signal_pipeline.py +0 -0
  36. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/bench_sync_misc.py +0 -0
  37. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/benchutils.py +0 -0
  38. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/conftest.py +0 -0
  39. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/record_baseline.py +0 -0
  40. {commkit-3.6.0 → commkit-3.6.1}/benchmarks/workloads.py +0 -0
  41. {commkit-3.6.0 → commkit-3.6.1}/commkit/_array.py +0 -0
  42. {commkit-3.6.0 → commkit-3.6.1}/commkit/_circular.py +0 -0
  43. {commkit-3.6.0 → commkit-3.6.1}/commkit/_constants.py +0 -0
  44. {commkit-3.6.0 → commkit-3.6.1}/commkit/_cuda/__init__.py +0 -0
  45. {commkit-3.6.0 → commkit-3.6.1}/commkit/_cuda/compiler.py +0 -0
  46. {commkit-3.6.0 → commkit-3.6.1}/commkit/_cuda/graphs.py +0 -0
  47. {commkit-3.6.0 → commkit-3.6.1}/commkit/_cuda/src/algebraic.cu +0 -0
  48. {commkit-3.6.0 → commkit-3.6.1}/commkit/_cuda/src/bps_anchor.cu +0 -0
  49. {commkit-3.6.0 → commkit-3.6.1}/commkit/_cuda/src/bps_min_d2.cu +0 -0
  50. {commkit-3.6.0 → commkit-3.6.1}/commkit/_cuda/src/cs_block.cu +0 -0
  51. {commkit-3.6.0 → commkit-3.6.1}/commkit/_cuda/src/iir.cu +0 -0
  52. {commkit-3.6.0 → commkit-3.6.1}/commkit/_cuda/src/ldpc.cu +0 -0
  53. {commkit-3.6.0 → commkit-3.6.1}/commkit/_cuda/src/llr.cu +0 -0
  54. {commkit-3.6.0 → commkit-3.6.1}/commkit/_cuda/src/selftest.cu +0 -0
  55. {commkit-3.6.0 → commkit-3.6.1}/commkit/_dispersion.py +0 -0
  56. {commkit-3.6.0 → commkit-3.6.1}/commkit/_fft.py +0 -0
  57. {commkit-3.6.0 → commkit-3.6.1}/commkit/_fiber.py +0 -0
  58. {commkit-3.6.0 → commkit-3.6.1}/commkit/_overlap_save.py +0 -0
  59. {commkit-3.6.0 → commkit-3.6.1}/commkit/_random.py +0 -0
  60. {commkit-3.6.0 → commkit-3.6.1}/commkit/_sequences.py +0 -0
  61. {commkit-3.6.0 → commkit-3.6.1}/commkit/analysis/__init__.py +0 -0
  62. {commkit-3.6.0 → commkit-3.6.1}/commkit/analysis/_common.py +0 -0
  63. {commkit-3.6.0 → commkit-3.6.1}/commkit/analysis/allan.py +0 -0
  64. {commkit-3.6.0 → commkit-3.6.1}/commkit/analysis/drift.py +0 -0
  65. {commkit-3.6.0 → commkit-3.6.1}/commkit/analysis/fm_noise.py +0 -0
  66. {commkit-3.6.0 → commkit-3.6.1}/commkit/analysis/interferometry.py +0 -0
  67. {commkit-3.6.0 → commkit-3.6.1}/commkit/analysis/linewidth/__init__.py +0 -0
  68. {commkit-3.6.0 → commkit-3.6.1}/commkit/analysis/linewidth/dsh.py +0 -0
  69. {commkit-3.6.0 → commkit-3.6.1}/commkit/analysis/linewidth/phase.py +0 -0
  70. {commkit-3.6.0 → commkit-3.6.1}/commkit/analysis/linewidth/result.py +0 -0
  71. {commkit-3.6.0 → commkit-3.6.1}/commkit/analysis/trajectory.py +0 -0
  72. {commkit-3.6.0 → commkit-3.6.1}/commkit/backend.py +0 -0
  73. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/__init__.py +0 -0
  74. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/_galois.py +0 -0
  75. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/_gf2.py +0 -0
  76. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/_ldpc_tables.py +0 -0
  77. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/_numba_loops.py +0 -0
  78. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/algebraic.py +0 -0
  79. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/base.py +0 -0
  80. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/convolutional.py +0 -0
  81. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/crc.py +0 -0
  82. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/exit.py +0 -0
  83. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/interleaving.py +0 -0
  84. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/ldpc.py +0 -0
  85. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/linear.py +0 -0
  86. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/performance.py +0 -0
  87. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/polar.py +0 -0
  88. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/product.py +0 -0
  89. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/ratematch.py +0 -0
  90. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/shaping.py +0 -0
  91. {commkit-3.6.0 → commkit-3.6.1}/commkit/coding/turbo.py +0 -0
  92. {commkit-3.6.0 → commkit-3.6.1}/commkit/core/__init__.py +0 -0
  93. {commkit-3.6.0 → commkit-3.6.1}/commkit/core/_signal_adapter.py +0 -0
  94. {commkit-3.6.0 → commkit-3.6.1}/commkit/core/frame.py +0 -0
  95. {commkit-3.6.0 → commkit-3.6.1}/commkit/core/generation.py +0 -0
  96. {commkit-3.6.0 → commkit-3.6.1}/commkit/core/preamble.py +0 -0
  97. {commkit-3.6.0 → commkit-3.6.1}/commkit/core/signal.py +0 -0
  98. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/__init__.py +0 -0
  99. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/_block/__init__.py +0 -0
  100. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/_block/_blind.py +0 -0
  101. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/_block/_dd.py +0 -0
  102. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/_block/_engine.py +0 -0
  103. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/_common.py +0 -0
  104. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/_numba_loops.py +0 -0
  105. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/_sequential/__init__.py +0 -0
  106. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/_sequential/_blind.py +0 -0
  107. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/_sequential/_dd.py +0 -0
  108. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/_sequential/_setup.py +0 -0
  109. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/linear.py +0 -0
  110. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/pilots.py +0 -0
  111. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/polarization.py +0 -0
  112. {commkit-3.6.0 → commkit-3.6.1}/commkit/equalization/result.py +0 -0
  113. {commkit-3.6.0 → commkit-3.6.1}/commkit/filtering/__init__.py +0 -0
  114. {commkit-3.6.0 → commkit-3.6.1}/commkit/filtering/fiber.py +0 -0
  115. {commkit-3.6.0 → commkit-3.6.1}/commkit/filtering/linear.py +0 -0
  116. {commkit-3.6.0 → commkit-3.6.1}/commkit/filtering/pulses.py +0 -0
  117. {commkit-3.6.0 → commkit-3.6.1}/commkit/filtering/response.py +0 -0
  118. {commkit-3.6.0 → commkit-3.6.1}/commkit/frequency.py +0 -0
  119. {commkit-3.6.0 → commkit-3.6.1}/commkit/impairments/__init__.py +0 -0
  120. {commkit-3.6.0 → commkit-3.6.1}/commkit/impairments/fiber_channel.py +0 -0
  121. {commkit-3.6.0 → commkit-3.6.1}/commkit/impairments/frontend.py +0 -0
  122. {commkit-3.6.0 → commkit-3.6.1}/commkit/impairments/noise.py +0 -0
  123. {commkit-3.6.0 → commkit-3.6.1}/commkit/impairments/source.py +0 -0
  124. {commkit-3.6.0 → commkit-3.6.1}/commkit/io.py +0 -0
  125. {commkit-3.6.0 → commkit-3.6.1}/commkit/logger.py +0 -0
  126. {commkit-3.6.0 → commkit-3.6.1}/commkit/mapping/__init__.py +0 -0
  127. {commkit-3.6.0 → commkit-3.6.1}/commkit/mapping/_numba_llr.py +0 -0
  128. {commkit-3.6.0 → commkit-3.6.1}/commkit/mapping/bits.py +0 -0
  129. {commkit-3.6.0 → commkit-3.6.1}/commkit/mapping/constellation.py +0 -0
  130. {commkit-3.6.0 → commkit-3.6.1}/commkit/mapping/gray.py +0 -0
  131. {commkit-3.6.0 → commkit-3.6.1}/commkit/mapping/llr.py +0 -0
  132. {commkit-3.6.0 → commkit-3.6.1}/commkit/mapping/shaping.py +0 -0
  133. {commkit-3.6.0 → commkit-3.6.1}/commkit/math.py +0 -0
  134. {commkit-3.6.0 → commkit-3.6.1}/commkit/metrics/__init__.py +0 -0
  135. {commkit-3.6.0 → commkit-3.6.1}/commkit/metrics/_common.py +0 -0
  136. {commkit-3.6.0 → commkit-3.6.1}/commkit/metrics/error_rates.py +0 -0
  137. {commkit-3.6.0 → commkit-3.6.1}/commkit/metrics/information.py +0 -0
  138. {commkit-3.6.0 → commkit-3.6.1}/commkit/metrics/quality.py +0 -0
  139. {commkit-3.6.0 → commkit-3.6.1}/commkit/multirate.py +0 -0
  140. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/__init__.py +0 -0
  141. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/coding.py +0 -0
  142. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/constellation.py +0 -0
  143. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/equalizer.py +0 -0
  144. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/eye.py +0 -0
  145. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/filter_response.py +0 -0
  146. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/frequency.py +0 -0
  147. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/recovery.py +0 -0
  148. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/spectral.py +0 -0
  149. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/theme.py +0 -0
  150. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/timing.py +0 -0
  151. {commkit-3.6.0 → commkit-3.6.1}/commkit/plotting/waveform.py +0 -0
  152. {commkit-3.6.0 → commkit-3.6.1}/commkit/py.typed +0 -0
  153. {commkit-3.6.0 → commkit-3.6.1}/commkit/recovery/__init__.py +0 -0
  154. {commkit-3.6.0 → commkit-3.6.1}/commkit/recovery/_common.py +0 -0
  155. {commkit-3.6.0 → commkit-3.6.1}/commkit/recovery/bps.py +0 -0
  156. {commkit-3.6.0 → commkit-3.6.1}/commkit/recovery/carrier_phase.py +0 -0
  157. {commkit-3.6.0 → commkit-3.6.1}/commkit/recovery/corrections.py +0 -0
  158. {commkit-3.6.0 → commkit-3.6.1}/commkit/recovery/pilots.py +0 -0
  159. {commkit-3.6.0 → commkit-3.6.1}/commkit/recovery/pll.py +0 -0
  160. {commkit-3.6.0 → commkit-3.6.1}/commkit/recovery/tikhonov.py +0 -0
  161. {commkit-3.6.0 → commkit-3.6.1}/commkit/recovery/viterbi_viterbi.py +0 -0
  162. {commkit-3.6.0 → commkit-3.6.1}/commkit/smoothing.py +0 -0
  163. {commkit-3.6.0 → commkit-3.6.1}/commkit/spectral.py +0 -0
  164. {commkit-3.6.0 → commkit-3.6.1}/commkit/timing.py +0 -0
  165. {commkit-3.6.0 → commkit-3.6.1}/examples/00-getting-started.ipynb +0 -0
  166. {commkit-3.6.0 → commkit-3.6.1}/examples/01-constellations-and-bit-mapping.ipynb +0 -0
  167. {commkit-3.6.0 → commkit-3.6.1}/examples/02-spectral-analysis.ipynb +0 -0
  168. {commkit-3.6.0 → commkit-3.6.1}/examples/03-digital-filters.ipynb +0 -0
  169. {commkit-3.6.0 → commkit-3.6.1}/examples/04-pulse-shaping-and-matched-filtering.ipynb +0 -0
  170. {commkit-3.6.0 → commkit-3.6.1}/examples/05-multirate-and-resampling.ipynb +0 -0
  171. {commkit-3.6.0 → commkit-3.6.1}/examples/06-awgn-and-performance-metrics.ipynb +0 -0
  172. {commkit-3.6.0 → commkit-3.6.1}/examples/07-channel-coding.ipynb +0 -0
  173. {commkit-3.6.0 → commkit-3.6.1}/examples/08-probabilistic-shaping-and-coded-modulation.ipynb +0 -0
  174. {commkit-3.6.0 → commkit-3.6.1}/examples/09-laser-phase-noise.ipynb +0 -0
  175. {commkit-3.6.0 → commkit-3.6.1}/examples/10-front-end-impairments.ipynb +0 -0
  176. {commkit-3.6.0 → commkit-3.6.1}/examples/11-frame-synchronization-and-timing.ipynb +0 -0
  177. {commkit-3.6.0 → commkit-3.6.1}/examples/12-frequency-offset-estimation.ipynb +0 -0
  178. {commkit-3.6.0 → commkit-3.6.1}/examples/13-blind-carrier-phase-recovery.ipynb +0 -0
  179. {commkit-3.6.0 → commkit-3.6.1}/examples/14-pilot-aided-carrier-recovery.ipynb +0 -0
  180. {commkit-3.6.0 → commkit-3.6.1}/examples/15-linear-channel-equalization.ipynb +0 -0
  181. {commkit-3.6.0 → commkit-3.6.1}/examples/16-adaptive-equalization.ipynb +0 -0
  182. {commkit-3.6.0 → commkit-3.6.1}/examples/17-blind-equalization.ipynb +0 -0
  183. {commkit-3.6.0 → commkit-3.6.1}/examples/18-polarization-multiplexing.ipynb +0 -0
  184. {commkit-3.6.0 → commkit-3.6.1}/examples/19-chromatic-dispersion.ipynb +0 -0
  185. {commkit-3.6.0 → commkit-3.6.1}/examples/20-nonlinear-fiber-and-backpropagation.ipynb +0 -0
  186. {commkit-3.6.0 → commkit-3.6.1}/examples/21-fec-in-optical-standards.ipynb +0 -0
  187. {commkit-3.6.0 → commkit-3.6.1}/examples/22-coherent-transceiver-end-to-end.ipynb +0 -0
  188. {commkit-3.6.0 → commkit-3.6.1}/examples/23-carrier-phase-characterization.ipynb +0 -0
  189. {commkit-3.6.0 → commkit-3.6.1}/examples/24-laser-linewidth-self-heterodyne.ipynb +0 -0
  190. {commkit-3.6.0 → commkit-3.6.1}/examples/25-laser-linewidth-short-delay-and-flicker.ipynb +0 -0
  191. {commkit-3.6.0 → commkit-3.6.1}/examples/26-laser-linewidth-self-homodyne-iq.ipynb +0 -0
  192. {commkit-3.6.0 → commkit-3.6.1}/examples/27-measurement-template-self-heterodyne.ipynb +0 -0
  193. {commkit-3.6.0 → commkit-3.6.1}/examples/28-measurement-template-self-homodyne-iq.ipynb +0 -0
  194. {commkit-3.6.0 → commkit-3.6.1}/examples/README.md +0 -0
  195. {commkit-3.6.0 → commkit-3.6.1}/scripts/sanitize.sh +0 -0
  196. {commkit-3.6.0 → commkit-3.6.1}/tests/analysis/test_allan.py +0 -0
  197. {commkit-3.6.0 → commkit-3.6.1}/tests/analysis/test_drift.py +0 -0
  198. {commkit-3.6.0 → commkit-3.6.1}/tests/analysis/test_fm_noise.py +0 -0
  199. {commkit-3.6.0 → commkit-3.6.1}/tests/analysis/test_interferometry.py +0 -0
  200. {commkit-3.6.0 → commkit-3.6.1}/tests/analysis/test_linewidth.py +0 -0
  201. {commkit-3.6.0 → commkit-3.6.1}/tests/analysis/test_trajectory.py +0 -0
  202. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_algebraic.py +0 -0
  203. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_coding_base.py +0 -0
  204. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_convolutional.py +0 -0
  205. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_crc.py +0 -0
  206. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_exit.py +0 -0
  207. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_gf2.py +0 -0
  208. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_interleaving.py +0 -0
  209. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_ldpc.py +0 -0
  210. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_ldpc_exit.py +0 -0
  211. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_ldpc_kernel.py +0 -0
  212. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_ldpc_tables.py +0 -0
  213. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_linear_codes.py +0 -0
  214. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_performance.py +0 -0
  215. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_polar.py +0 -0
  216. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_product.py +0 -0
  217. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_ratematch.py +0 -0
  218. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_shaping.py +0 -0
  219. {commkit-3.6.0 → commkit-3.6.1}/tests/coding/test_turbo.py +0 -0
  220. {commkit-3.6.0 → commkit-3.6.1}/tests/common/__init__.py +0 -0
  221. {commkit-3.6.0 → commkit-3.6.1}/tests/common/coding.py +0 -0
  222. {commkit-3.6.0 → commkit-3.6.1}/tests/common/conversions.py +0 -0
  223. {commkit-3.6.0 → commkit-3.6.1}/tests/common/kernel_utils.py +0 -0
  224. {commkit-3.6.0 → commkit-3.6.1}/tests/common/memory.py +0 -0
  225. {commkit-3.6.0 → commkit-3.6.1}/tests/common/metrics.py +0 -0
  226. {commkit-3.6.0 → commkit-3.6.1}/tests/common/periodic.py +0 -0
  227. {commkit-3.6.0 → commkit-3.6.1}/tests/common/reference_impl.py +0 -0
  228. {commkit-3.6.0 → commkit-3.6.1}/tests/common/scoring.py +0 -0
  229. {commkit-3.6.0 → commkit-3.6.1}/tests/common/signals.py +0 -0
  230. {commkit-3.6.0 → commkit-3.6.1}/tests/common/theory.py +0 -0
  231. {commkit-3.6.0 → commkit-3.6.1}/tests/conftest.py +0 -0
  232. {commkit-3.6.0 → commkit-3.6.1}/tests/core/test_frame.py +0 -0
  233. {commkit-3.6.0 → commkit-3.6.1}/tests/core/test_generation.py +0 -0
  234. {commkit-3.6.0 → commkit-3.6.1}/tests/core/test_preamble.py +0 -0
  235. {commkit-3.6.0 → commkit-3.6.1}/tests/core/test_psqam.py +0 -0
  236. {commkit-3.6.0 → commkit-3.6.1}/tests/core/test_signal.py +0 -0
  237. {commkit-3.6.0 → commkit-3.6.1}/tests/core/test_signal_adapter.py +0 -0
  238. {commkit-3.6.0 → commkit-3.6.1}/tests/core/test_signal_mimo.py +0 -0
  239. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_blind.py +0 -0
  240. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_block.py +0 -0
  241. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_bps_kernel.py +0 -0
  242. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_cpr.py +0 -0
  243. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_cs_kernel.py +0 -0
  244. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_equalizer_oracles.py +0 -0
  245. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_linear.py +0 -0
  246. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_mimo.py +0 -0
  247. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_polarization.py +0 -0
  248. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_sequential.py +0 -0
  249. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_state.py +0 -0
  250. {commkit-3.6.0 → commkit-3.6.1}/tests/equalization/test_winit.py +0 -0
  251. {commkit-3.6.0 → commkit-3.6.1}/tests/impairments/test_fiber_channel_linear.py +0 -0
  252. {commkit-3.6.0 → commkit-3.6.1}/tests/impairments/test_fiber_channel_nonlinear.py +0 -0
  253. {commkit-3.6.0 → commkit-3.6.1}/tests/impairments/test_frontend.py +0 -0
  254. {commkit-3.6.0 → commkit-3.6.1}/tests/impairments/test_noise.py +0 -0
  255. {commkit-3.6.0 → commkit-3.6.1}/tests/impairments/test_source.py +0 -0
  256. {commkit-3.6.0 → commkit-3.6.1}/tests/mapping/test_bits.py +0 -0
  257. {commkit-3.6.0 → commkit-3.6.1}/tests/mapping/test_constellation.py +0 -0
  258. {commkit-3.6.0 → commkit-3.6.1}/tests/mapping/test_gray.py +0 -0
  259. {commkit-3.6.0 → commkit-3.6.1}/tests/mapping/test_llr.py +0 -0
  260. {commkit-3.6.0 → commkit-3.6.1}/tests/metrics/test_common.py +0 -0
  261. {commkit-3.6.0 → commkit-3.6.1}/tests/metrics/test_error_rates.py +0 -0
  262. {commkit-3.6.0 → commkit-3.6.1}/tests/metrics/test_information.py +0 -0
  263. {commkit-3.6.0 → commkit-3.6.1}/tests/metrics/test_quality.py +0 -0
  264. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_coding.py +0 -0
  265. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_constellation.py +0 -0
  266. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_equalizer.py +0 -0
  267. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_eye.py +0 -0
  268. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_filter_response.py +0 -0
  269. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_frequency.py +0 -0
  270. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_recovery.py +0 -0
  271. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_spectral.py +0 -0
  272. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_theme.py +0 -0
  273. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_timing.py +0 -0
  274. {commkit-3.6.0 → commkit-3.6.1}/tests/plotting/test_plot_waveform.py +0 -0
  275. {commkit-3.6.0 → commkit-3.6.1}/tests/plugins/__init__.py +0 -0
  276. {commkit-3.6.0 → commkit-3.6.1}/tests/plugins/precision_trace.py +0 -0
  277. {commkit-3.6.0 → commkit-3.6.1}/tests/plugins/transfer_trace.py +0 -0
  278. {commkit-3.6.0 → commkit-3.6.1}/tests/recovery/test_bps.py +0 -0
  279. {commkit-3.6.0 → commkit-3.6.1}/tests/recovery/test_corrections.py +0 -0
  280. {commkit-3.6.0 → commkit-3.6.1}/tests/recovery/test_joint.py +0 -0
  281. {commkit-3.6.0 → commkit-3.6.1}/tests/recovery/test_pilots.py +0 -0
  282. {commkit-3.6.0 → commkit-3.6.1}/tests/recovery/test_pll.py +0 -0
  283. {commkit-3.6.0 → commkit-3.6.1}/tests/recovery/test_recovery_oracles.py +0 -0
  284. {commkit-3.6.0 → commkit-3.6.1}/tests/recovery/test_tikhonov.py +0 -0
  285. {commkit-3.6.0 → commkit-3.6.1}/tests/recovery/test_viterbi_viterbi.py +0 -0
  286. {commkit-3.6.0 → commkit-3.6.1}/tests/test_api_contracts.py +0 -0
  287. {commkit-3.6.0 → commkit-3.6.1}/tests/test_array.py +0 -0
  288. {commkit-3.6.0 → commkit-3.6.1}/tests/test_backend.py +0 -0
  289. {commkit-3.6.0 → commkit-3.6.1}/tests/test_cuda_infra.py +0 -0
  290. {commkit-3.6.0 → commkit-3.6.1}/tests/test_dispersion.py +0 -0
  291. {commkit-3.6.0 → commkit-3.6.1}/tests/test_examples.py +0 -0
  292. {commkit-3.6.0 → commkit-3.6.1}/tests/test_fiber.py +0 -0
  293. {commkit-3.6.0 → commkit-3.6.1}/tests/test_filter_response.py +0 -0
  294. {commkit-3.6.0 → commkit-3.6.1}/tests/test_filtering.py +0 -0
  295. {commkit-3.6.0 → commkit-3.6.1}/tests/test_frequency.py +0 -0
  296. {commkit-3.6.0 → commkit-3.6.1}/tests/test_import_hygiene.py +0 -0
  297. {commkit-3.6.0 → commkit-3.6.1}/tests/test_io.py +0 -0
  298. {commkit-3.6.0 → commkit-3.6.1}/tests/test_logger.py +0 -0
  299. {commkit-3.6.0 → commkit-3.6.1}/tests/test_math.py +0 -0
  300. {commkit-3.6.0 → commkit-3.6.1}/tests/test_multirate.py +0 -0
  301. {commkit-3.6.0 → commkit-3.6.1}/tests/test_pulse_shaping.py +0 -0
  302. {commkit-3.6.0 → commkit-3.6.1}/tests/test_receiver_chain.py +0 -0
  303. {commkit-3.6.0 → commkit-3.6.1}/tests/test_signal_pipeline.py +0 -0
  304. {commkit-3.6.0 → commkit-3.6.1}/tests/test_smoothing.py +0 -0
  305. {commkit-3.6.0 → commkit-3.6.1}/tests/test_spectral.py +0 -0
  306. {commkit-3.6.0 → commkit-3.6.1}/tests/test_timing.py +0 -0
  307. {commkit-3.6.0 → commkit-3.6.1}/tests/test_working_memory.py +0 -0
@@ -4,6 +4,12 @@ Notable changes to CommKit, newest first. Performance figures are from the refer
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [3.6.1] - 2026-11-05
8
+
9
+ ### Added
10
+
11
+ - `plot_frequency_noise_psd` shades the white-FM plateau: the fit bins where the fitted model stays within 10 % of the floor `Δν/π`, where white FM dominates and pins the linewidth down. It is a visual check only; `Δν` still comes from the model fitted over every bin in `used`, not from an average over the plateau.
12
+
7
13
  ## [3.6.0] - 2026-11-05
8
14
 
9
15
  Chromatic dispersion for real captures. The compensation takes the link's accumulated dispersion and works as a receiver does, an FIR filter (or overlap-save blocks for backpropagation) in bounded memory, with the exact whole-record path as an option that is valid on captures too; three estimators measure an unknown dispersion, blind or from known symbols. The laser-characterization chain and its notebooks were corrected wherever a plot or a number did not mean what it said, method names that were generic now say what they do, and plot axes carry their SI prefix in the label.
@@ -461,7 +467,8 @@ See the [GitHub release](https://github.com/lokgar/commkit/releases/tag/v1.1.0)
461
467
 
462
468
  First release. See the [GitHub release](https://github.com/lokgar/commkit/releases/tag/v1.0.0).
463
469
 
464
- [Unreleased]: https://github.com/lokgar/commkit/compare/v3.6.0...HEAD
470
+ [Unreleased]: https://github.com/lokgar/commkit/compare/v3.6.1...HEAD
471
+ [3.6.1]: https://github.com/lokgar/commkit/compare/v3.6.0...v3.6.1
465
472
  [3.6.0]: https://github.com/lokgar/commkit/compare/v3.5.0...v3.6.0
466
473
  [3.5.0]: https://github.com/lokgar/commkit/compare/v3.4.0...v3.5.0
467
474
  [3.4.0]: https://github.com/lokgar/commkit/compare/v3.3.0...v3.4.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: commkit
3
- Version: 3.6.0
3
+ Version: 3.6.1
4
4
  Summary: A Python library for high-performance digital communications research.
5
5
  Project-URL: Homepage, https://github.com/lokgar/commkit
6
6
  Project-URL: Repository, https://github.com/lokgar/commkit
@@ -31,7 +31,7 @@ Matplotlib, change warning filters, or touch the GPU.
31
31
  import importlib
32
32
  from typing import Any
33
33
 
34
- __version__ = "3.6.0"
34
+ __version__ = "3.6.1"
35
35
 
36
36
  from .backend import PrecisionWarning
37
37
  from .core import (
@@ -251,7 +251,11 @@ def plot_frequency_noise_psd(
251
251
  masks (400 bins or fewer) are drawn as markers on the PSD, dense ones
252
252
  as a highlighted log-binned median curve.
253
253
  * ``fm_psd_model``: the fitted model of white FM, flicker FM and
254
- detection noise, drawn over the PSD.
254
+ detection noise, drawn over the PSD. The white-FM plateau, the fit
255
+ bins where the model stays within 10 % of ``Δν/π``, is shaded. It
256
+ shows where the floor is pinned down; ``Δν`` itself comes from the
257
+ model fitted over all of ``used``, not from an average over the
258
+ plateau.
255
259
 
256
260
  Dense spectra are drawn faint with a log-binned median trace on top, and
257
261
  the model through the same reduction (a model divided by the response
@@ -346,6 +350,7 @@ def plot_frequency_noise_psd(
346
350
  )
347
351
 
348
352
  model = getattr(estimate, "fm_psd_model", None)
353
+ m_i = None
349
354
  if model is not None:
350
355
  m_c = _as_channels(model)
351
356
  m_i = m_c[0, pos]
@@ -385,6 +390,24 @@ def plot_frequency_noise_psd(
385
390
  ls=":",
386
391
  label=r"White-FM floor $\Delta\nu/\pi$",
387
392
  )
393
+ if m_i is not None:
394
+ # Δν is the white term of a model fitted over the whole fit
395
+ # region, not a plateau average. Shade where the model stays
396
+ # within 10 % of that term (flicker and the angle-noise tail
397
+ # negligible): the plateau that pins the floor down.
398
+ white = float(floors[0]) / np.pi
399
+ dom = np.isfinite(m_i) & (m_i <= 1.1 * white)
400
+ if used is not None:
401
+ dom &= u_c[pos]
402
+ if dom.any():
403
+ axi.axvspan(
404
+ float(fp[dom].min()),
405
+ float(fp[dom].max()),
406
+ color="#ffd166",
407
+ alpha=0.18,
408
+ lw=0,
409
+ label="Plateau (model within 10 % of floor)",
410
+ )
388
411
 
389
412
  if band is not None:
390
413
  lo = max(float(band[0]), float(fp[0])) if fp.size else float(band[0])
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "commkit"
3
- version = "3.6.0"
3
+ version = "3.6.1"
4
4
  description = "A Python library for high-performance digital communications research."
5
5
  readme = "README.md"
6
6
  authors = [{ name = "Denis Fatkhiev" }]
@@ -88,7 +88,7 @@ markers = [
88
88
  ]
89
89
 
90
90
  [tool.bumpversion]
91
- current_version = "3.6.0"
91
+ current_version = "3.6.1"
92
92
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
93
93
  serialize = ["{major}.{minor}.{patch}"]
94
94
  search = "{current_version}"
@@ -19,6 +19,7 @@ from commkit.analysis import (
19
19
  IncrementSlope,
20
20
  IncrementSubtract,
21
21
  )
22
+ from commkit.backend import to_device
22
23
  from commkit.plotting.analysis import (
23
24
  plot_allan_deviation,
24
25
  plot_carrier_phase_characterization,
@@ -113,6 +114,16 @@ class TestPlotAnalysis:
113
114
  fig, ax = plot_frequency_noise_psd(est, title="DSH")
114
115
  floor = [ln for ln in ax.lines if "White-FM" in ln.get_label()][0]
115
116
  assert floor.get_ydata()[0] == pytest.approx(est.value / np.pi)
117
+ # The plateau span covers fit bins where the model is within 10 %
118
+ # of the floor, and none where it is not.
119
+ span = [p for p in ax.patches if "Plateau" in p.get_label()][0]
120
+ x0, x1 = span.get_x(), span.get_x() + span.get_width()
121
+ f = np.asarray(to_device(est.frequencies, "cpu"))
122
+ model = np.asarray(to_device(est.fm_psd_model, "cpu"))
123
+ used = np.asarray(to_device(est.used, "cpu"))
124
+ flat = used & (f > 0) & (model <= 1.1 * est.value / np.pi)
125
+ assert x0 == pytest.approx(f[flat].min())
126
+ assert x1 == pytest.approx(f[flat].max())
116
127
 
117
128
  @pytest.mark.parametrize("dsh", [False, True])
118
129
  def test_increment_variance(self, xp: Any, dsh: bool) -> None:
@@ -418,7 +418,7 @@ wheels = [
418
418
 
419
419
  [[package]]
420
420
  name = "commkit"
421
- version = "3.6.0"
421
+ version = "3.6.1"
422
422
  source = { editable = "." }
423
423
  dependencies = [
424
424
  { name = "matplotlib" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes