phased-array-systems 0.3.0__tar.gz → 0.9.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 (202) hide show
  1. phased_array_systems-0.9.0/.claude/settings.local 2.json +45 -0
  2. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/.github/workflows/ci.yml +6 -1
  3. phased_array_systems-0.9.0/.github/workflows/docs.yml +45 -0
  4. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/.gitignore +3 -0
  5. phased_array_systems-0.9.0/CHANGELOG.md +216 -0
  6. phased_array_systems-0.9.0/CLAUDE.md +150 -0
  7. phased_array_systems-0.9.0/CONTRIBUTING.md +210 -0
  8. phased_array_systems-0.9.0/PKG-INFO +329 -0
  9. phased_array_systems-0.9.0/README.md +274 -0
  10. phased_array_systems-0.9.0/app/pages/1_Single_Case.py +407 -0
  11. phased_array_systems-0.9.0/app/pages/2_Trade_Study.py +423 -0
  12. phased_array_systems-0.9.0/app/pages/3_RF_Cascade.py +494 -0
  13. phased_array_systems-0.9.0/app/pages/4_Radar_Detection.py +526 -0
  14. phased_array_systems-0.9.0/app/requirements.txt +10 -0
  15. phased_array_systems-0.9.0/app/streamlit_app.py +156 -0
  16. phased_array_systems-0.9.0/docs/api/architecture.md +102 -0
  17. phased_array_systems-0.9.0/docs/api/index.md +116 -0
  18. phased_array_systems-0.9.0/docs/api/io.md +250 -0
  19. phased_array_systems-0.9.0/docs/api/models/antenna.md +103 -0
  20. phased_array_systems-0.9.0/docs/api/models/comms.md +142 -0
  21. phased_array_systems-0.9.0/docs/api/models/digital.md +286 -0
  22. phased_array_systems-0.9.0/docs/api/models/index.md +105 -0
  23. phased_array_systems-0.9.0/docs/api/models/radar.md +161 -0
  24. phased_array_systems-0.9.0/docs/api/models/rf.md +281 -0
  25. phased_array_systems-0.9.0/docs/api/models/swapc.md +154 -0
  26. phased_array_systems-0.9.0/docs/api/reports.md +163 -0
  27. phased_array_systems-0.9.0/docs/api/requirements.md +128 -0
  28. phased_array_systems-0.9.0/docs/api/scenarios.md +92 -0
  29. phased_array_systems-0.9.0/docs/api/trades.md +187 -0
  30. phased_array_systems-0.9.0/docs/api/viz.md +187 -0
  31. phased_array_systems-0.9.0/docs/changelog.md +85 -0
  32. phased_array_systems-0.9.0/docs/cli/doe.md +213 -0
  33. phased_array_systems-0.9.0/docs/cli/index.md +143 -0
  34. phased_array_systems-0.9.0/docs/cli/optimize.md +68 -0
  35. phased_array_systems-0.9.0/docs/cli/pareto.md +178 -0
  36. phased_array_systems-0.9.0/docs/cli/report.md +215 -0
  37. phased_array_systems-0.9.0/docs/cli/run.md +182 -0
  38. phased_array_systems-0.9.0/docs/cli/sensitivity.md +58 -0
  39. phased_array_systems-0.9.0/docs/contributing.md +42 -0
  40. phased_array_systems-0.9.0/docs/faq.md +251 -0
  41. phased_array_systems-0.9.0/docs/getting-started/concepts.md +421 -0
  42. phased_array_systems-0.9.0/docs/getting-started/index.md +55 -0
  43. phased_array_systems-0.9.0/docs/getting-started/installation.md +233 -0
  44. phased_array_systems-0.9.0/docs/getting-started/quickstart.md +299 -0
  45. phased_array_systems-0.9.0/docs/index.md +166 -0
  46. phased_array_systems-0.9.0/docs/javascripts/mathjax.js +23 -0
  47. phased_array_systems-0.9.0/docs/stylesheets/extra.css +131 -0
  48. phased_array_systems-0.9.0/docs/theory/index.md +68 -0
  49. phased_array_systems-0.9.0/docs/theory/link-budget-equations.md +247 -0
  50. phased_array_systems-0.9.0/docs/theory/pareto-optimization.md +269 -0
  51. phased_array_systems-0.9.0/docs/theory/phased-arrays.md +255 -0
  52. phased_array_systems-0.9.0/docs/theory/radar-equation.md +237 -0
  53. phased_array_systems-0.9.0/docs/theory/validation.md +48 -0
  54. phased_array_systems-0.9.0/docs/tutorials/comms-trade-study.md +319 -0
  55. phased_array_systems-0.9.0/docs/tutorials/config-driven-workflow.md +393 -0
  56. phased_array_systems-0.9.0/docs/tutorials/index.md +71 -0
  57. phased_array_systems-0.9.0/docs/tutorials/radar-detection-trade.md +371 -0
  58. phased_array_systems-0.9.0/docs/tutorials/sensitivity-analysis.md +365 -0
  59. phased_array_systems-0.9.0/docs/user-guide/architecture.md +333 -0
  60. phased_array_systems-0.9.0/docs/user-guide/index.md +133 -0
  61. phased_array_systems-0.9.0/docs/user-guide/link-budget.md +343 -0
  62. phased_array_systems-0.9.0/docs/user-guide/mdao.md +122 -0
  63. phased_array_systems-0.9.0/docs/user-guide/pareto-analysis.md +385 -0
  64. phased_array_systems-0.9.0/docs/user-guide/radar-detection.md +348 -0
  65. phased_array_systems-0.9.0/docs/user-guide/reports.md +386 -0
  66. phased_array_systems-0.9.0/docs/user-guide/requirements.md +340 -0
  67. phased_array_systems-0.9.0/docs/user-guide/scenarios.md +268 -0
  68. phased_array_systems-0.9.0/docs/user-guide/trade-studies.md +409 -0
  69. phased_array_systems-0.9.0/docs/user-guide/visualization.md +470 -0
  70. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/examples/01_comms_single_case.py +7 -3
  71. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/examples/02_comms_doe_trade.py +4 -2
  72. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/examples/03_radar_detection_trade.py +5 -7
  73. phased_array_systems-0.9.0/examples/04_taper_trade_study.py +117 -0
  74. phased_array_systems-0.9.0/examples/05_optimization.py +122 -0
  75. phased_array_systems-0.9.0/examples/06_dbf_architecture_trade.py +144 -0
  76. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/examples/configs/comms_basic.yaml +23 -1
  77. phased_array_systems-0.9.0/examples/configs/dbf_architecture_doe.yaml +105 -0
  78. phased_array_systems-0.9.0/examples/configs/radar_basic.yaml +72 -0
  79. phased_array_systems-0.9.0/examples/configs/radar_doe.yaml +76 -0
  80. phased_array_systems-0.9.0/mkdocs.yml +173 -0
  81. phased_array_systems-0.9.0/notebooks/tutorial_dbf_architecture_trade.ipynb +694 -0
  82. phased_array_systems-0.9.0/notebooks/tutorial_mdao_workflow.ipynb +523 -0
  83. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/notebooks/tutorial_phased_array_trade_study.ipynb +86 -88
  84. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/pyproject.toml +21 -4
  85. phased_array_systems-0.9.0/scripts/slopcheck.sh +101 -0
  86. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/__about__.py +1 -1
  87. phased_array_systems-0.9.0/src/phased_array_systems/__init__.py +88 -0
  88. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/architecture/__init__.py +4 -0
  89. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/architecture/config.py +142 -11
  90. phased_array_systems-0.9.0/src/phased_array_systems/cli.py +820 -0
  91. phased_array_systems-0.9.0/src/phased_array_systems/evaluate.py +344 -0
  92. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/exporters.py +7 -3
  93. phased_array_systems-0.9.0/src/phased_array_systems/models/__init__.py +85 -0
  94. phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/__init__.py +58 -0
  95. phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/adapter.py +380 -0
  96. phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/errors.py +182 -0
  97. phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/grating.py +35 -0
  98. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/antenna/metrics.py +15 -11
  99. phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/taper.py +374 -0
  100. phased_array_systems-0.9.0/src/phased_array_systems/models/comms/__init__.py +19 -0
  101. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/comms/link_budget.py +65 -17
  102. phased_array_systems-0.9.0/src/phased_array_systems/models/comms/propagation.py +212 -0
  103. phased_array_systems-0.9.0/src/phased_array_systems/models/digital/__init__.py +58 -0
  104. phased_array_systems-0.9.0/src/phased_array_systems/models/digital/bandwidth.py +238 -0
  105. phased_array_systems-0.9.0/src/phased_array_systems/models/digital/converters.py +303 -0
  106. phased_array_systems-0.9.0/src/phased_array_systems/models/digital/scheduling.py +323 -0
  107. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/__init__.py +38 -0
  108. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p676.py +186 -0
  109. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p676_data.py +96 -0
  110. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p838.py +90 -0
  111. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p838_data.py +57 -0
  112. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/path.py +79 -0
  113. phased_array_systems-0.9.0/src/phased_array_systems/models/radar/__init__.py +87 -0
  114. phased_array_systems-0.9.0/src/phased_array_systems/models/radar/cfar.py +308 -0
  115. phased_array_systems-0.9.0/src/phased_array_systems/models/radar/clutter.py +360 -0
  116. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/radar/detection.py +42 -106
  117. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/radar/equation.py +186 -26
  118. phased_array_systems-0.9.0/src/phased_array_systems/models/radar/propagation.py +312 -0
  119. phased_array_systems-0.9.0/src/phased_array_systems/models/rf/__init__.py +66 -0
  120. phased_array_systems-0.9.0/src/phased_array_systems/models/rf/cascade.py +492 -0
  121. phased_array_systems-0.9.0/src/phased_array_systems/models/rf/reliability.py +602 -0
  122. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/swapc/cost.py +0 -17
  123. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/swapc/power.py +49 -8
  124. phased_array_systems-0.9.0/src/phased_array_systems/py.typed +0 -0
  125. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/html.py +109 -12
  126. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/markdown.py +51 -11
  127. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/scenarios/comms.py +15 -6
  128. phased_array_systems-0.9.0/src/phased_array_systems/scenarios/radar.py +140 -0
  129. phased_array_systems-0.9.0/src/phased_array_systems/trades/__init__.py +30 -0
  130. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/design_space.py +87 -5
  131. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/doe.py +62 -11
  132. phased_array_systems-0.9.0/src/phased_array_systems/trades/moo.py +188 -0
  133. phased_array_systems-0.9.0/src/phased_array_systems/trades/optimization.py +298 -0
  134. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/pareto.py +11 -11
  135. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/runner.py +9 -7
  136. phased_array_systems-0.9.0/src/phased_array_systems/trades/sensitivity.py +292 -0
  137. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/types.py +1 -1
  138. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/viz/__init__.py +4 -0
  139. phased_array_systems-0.9.0/src/phased_array_systems/viz/interactive.py +231 -0
  140. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/viz/plots.py +94 -15
  141. phased_array_systems-0.9.0/tests/conftest.py +120 -0
  142. phased_array_systems-0.9.0/tests/data/golden_dbf_case.json +77 -0
  143. phased_array_systems-0.9.0/tests/test_antenna_adapter.py +575 -0
  144. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/tests/test_architecture.py +7 -10
  145. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/tests/test_cli.py +218 -1
  146. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/tests/test_comms_link_budget.py +154 -5
  147. phased_array_systems-0.9.0/tests/test_digital.py +399 -0
  148. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/tests/test_doe.py +73 -0
  149. phased_array_systems-0.9.0/tests/test_evaluate.py +637 -0
  150. phased_array_systems-0.9.0/tests/test_golden_case.py +114 -0
  151. phased_array_systems-0.9.0/tests/test_interactive_viz.py +75 -0
  152. phased_array_systems-0.9.0/tests/test_io.py +306 -0
  153. phased_array_systems-0.9.0/tests/test_moo.py +129 -0
  154. phased_array_systems-0.9.0/tests/test_optimization.py +299 -0
  155. phased_array_systems-0.9.0/tests/test_radar.py +908 -0
  156. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/tests/test_reports.py +14 -12
  157. phased_array_systems-0.9.0/tests/test_rf_cascade.py +222 -0
  158. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/tests/test_runner.py +105 -0
  159. phased_array_systems-0.9.0/tests/test_sensitivity.py +156 -0
  160. phased_array_systems-0.9.0/tests/test_sobol.py +83 -0
  161. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/tests/test_swapc.py +93 -5
  162. phased_array_systems-0.9.0/tests/test_validation.py +377 -0
  163. phased_array_systems-0.3.0/CLAUDE.md +0 -98
  164. phased_array_systems-0.3.0/PKG-INFO +0 -174
  165. phased_array_systems-0.3.0/README.md +0 -132
  166. phased_array_systems-0.3.0/src/phased_array_systems/__init__.py +0 -10
  167. phased_array_systems-0.3.0/src/phased_array_systems/cli.py +0 -376
  168. phased_array_systems-0.3.0/src/phased_array_systems/evaluate.py +0 -138
  169. phased_array_systems-0.3.0/src/phased_array_systems/models/__init__.py +0 -5
  170. phased_array_systems-0.3.0/src/phased_array_systems/models/antenna/__init__.py +0 -15
  171. phased_array_systems-0.3.0/src/phased_array_systems/models/antenna/adapter.py +0 -190
  172. phased_array_systems-0.3.0/src/phased_array_systems/models/comms/__init__.py +0 -9
  173. phased_array_systems-0.3.0/src/phased_array_systems/models/comms/propagation.py +0 -84
  174. phased_array_systems-0.3.0/src/phased_array_systems/models/radar/__init__.py +0 -25
  175. phased_array_systems-0.3.0/src/phased_array_systems/scenarios/radar.py +0 -61
  176. phased_array_systems-0.3.0/src/phased_array_systems/trades/__init__.py +0 -16
  177. phased_array_systems-0.3.0/tests/test_antenna_adapter.py +0 -179
  178. phased_array_systems-0.3.0/tests/test_evaluate.py +0 -219
  179. phased_array_systems-0.3.0/tests/test_radar.py +0 -365
  180. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/.github/workflows/publish.yml +0 -0
  181. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/LICENSE +0 -0
  182. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/examples/configs/comms_doe.yaml +0 -0
  183. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/ruff.toml +0 -0
  184. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/constants.py +0 -0
  185. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/__init__.py +0 -0
  186. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/config_loader.py +0 -0
  187. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/schema.py +0 -0
  188. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/base.py +0 -0
  189. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/radar/integration.py +0 -0
  190. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/swapc/__init__.py +0 -0
  191. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/__init__.py +0 -0
  192. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/generator.py +0 -0
  193. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/requirements/__init__.py +0 -0
  194. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/requirements/core.py +0 -0
  195. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/scenarios/__init__.py +0 -0
  196. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/scenarios/base.py +0 -0
  197. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/utils/__init__.py +0 -0
  198. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/src/phased_array_systems/utils/hashing.py +0 -0
  199. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/tests/__init__.py +0 -0
  200. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/tests/test_pareto.py +0 -0
  201. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/tests/test_requirements.py +0 -0
  202. {phased_array_systems-0.3.0 → phased_array_systems-0.9.0}/tests/test_viz.py +0 -0
@@ -0,0 +1,45 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(python3 -m pip install:*)",
5
+ "Bash(pyenv versions:*)",
6
+ "Bash(pyenv local:*)",
7
+ "Bash(python3 -m pytest:*)",
8
+ "Bash(python3 -m ruff check:*)",
9
+ "Bash(python3:*)",
10
+ "Bash(git init:*)",
11
+ "Bash(git add:*)",
12
+ "Bash(git commit:*)",
13
+ "Bash(ruff check:*)",
14
+ "Bash(pytest:*)",
15
+ "Bash(gh run:*)",
16
+ "Bash(gh release create v0.1.0 --title \"v0.1.0 - Initial Release\" --notes \"$\\(cat <<''EOF''\n## phased-array-systems v0.1.0\n\nInitial release of the phased array antenna system design and optimization package.\n\n### Features\n\n- **Architecture Configuration**: Pydantic models for array, RF chain, and cost configurations\n- **Communications Link Budget**: EIRP, path loss, SNR, and link margin calculations\n- **Requirements Verification**: Define and verify system requirements with pass/fail margins\n- **DOE Trade Studies**: Latin Hypercube Sampling, grid, and random sampling methods\n- **Pareto Analysis**: Extract and rank Pareto-optimal designs\n- **Batch Evaluation**: Parallel evaluation with caching and progress tracking\n- **Visualization**: Pareto plots and scatter matrices\n- **Config I/O**: YAML/JSON configuration loading and results export \\(Parquet, CSV\\)\n\n### Installation\n\n```bash\npip install phased-array-systems\n```\n\n### Documentation\n\nSee the [README]\\(https://github.com/jman4162/phased-array-systems#readme\\) and example scripts in the `examples/` directory.\nEOF\n\\)\")",
17
+ "Bash(gh release create:*)",
18
+ "Bash(pip install:*)",
19
+ "Bash(python -c:*)",
20
+ "Bash(python:*)",
21
+ "Bash(pasys --help:*)",
22
+ "Bash(wc:*)",
23
+ "Bash(mkdocs serve:*)",
24
+ "Bash(pkill:*)",
25
+ "Bash(gh api:*)",
26
+ "Bash(perl -i -pe:*)",
27
+ "Bash(mkdocs build:*)",
28
+ "Bash(curl:*)",
29
+ "Bash(grep:*)",
30
+ "Bash(perl -i -p0e:*)",
31
+ "Bash(ls:*)",
32
+ "Bash(find:*)",
33
+ "Bash(git remote add:*)",
34
+ "Bash(done)",
35
+ "Bash(gh release view:*)",
36
+ "Bash(gh release list:*)",
37
+ "Bash(gh issue close:*)",
38
+ "Bash(pip index:*)",
39
+ "WebFetch(domain:jman4162.github.io)",
40
+ "Bash(ruff format:*)",
41
+ "Bash(pip list:*)",
42
+ "Bash(awk -F: '{s+=$2} END{print s}')"
43
+ ]
44
+ }
45
+ }
@@ -25,13 +25,18 @@ jobs:
25
25
  - name: Install dependencies
26
26
  run: |
27
27
  python -m pip install --upgrade pip
28
- pip install -e ".[dev]"
28
+ pip install -e ".[dev,mdao,plotting]"
29
29
  pip install pyarrow # For parquet tests
30
30
 
31
31
  - name: Run linting with Ruff
32
32
  run: |
33
33
  ruff check . --output-format=github
34
34
 
35
+ - name: Run type checking with mypy
36
+ if: matrix.python-version == '3.12'
37
+ run: |
38
+ mypy src/phased_array_systems
39
+
35
40
  - name: Run tests with pytest
36
41
  run: |
37
42
  pytest tests/ -v --tb=short --cov=phased_array_systems --cov-report=xml
@@ -0,0 +1,45 @@
1
+ name: Deploy Documentation
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ release:
7
+ types: [published]
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: write
12
+ pages: write
13
+ id-token: write
14
+
15
+ concurrency:
16
+ group: deploy-docs
17
+ cancel-in-progress: true
18
+
19
+ jobs:
20
+ deploy:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - name: Checkout repository
24
+ uses: actions/checkout@v4
25
+ with:
26
+ fetch-depth: 0
27
+
28
+ - name: Set up Python
29
+ uses: actions/setup-python@v5
30
+ with:
31
+ python-version: '3.11'
32
+ cache: 'pip'
33
+
34
+ - name: Install dependencies
35
+ run: |
36
+ python -m pip install --upgrade pip
37
+ pip install -e ".[docs]"
38
+
39
+ - name: Configure Git
40
+ run: |
41
+ git config --global user.name "github-actions[bot]"
42
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
43
+
44
+ - name: Deploy to GitHub Pages
45
+ run: mkdocs gh-deploy --force
@@ -145,3 +145,6 @@ results/
145
145
  *.csv
146
146
  !examples/configs/*.yaml
147
147
  package_design_and_requirements.txt
148
+
149
+ # slopcheck virtualenv
150
+ scripts/.slopvenv/
@@ -0,0 +1,216 @@
1
+ # Changelog
2
+
3
+ All notable changes to phased-array-systems will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.9.0] - 2026-07-22
11
+
12
+ ### Added
13
+ - True multi-objective optimization: `optimize_pareto()` (trades/moo.py)
14
+ runs mixed-variable NSGA-II via pymoo and returns the nondominated set
15
+ with full metrics; must-severity requirements become normalized
16
+ inequality constraints. CLI: `pasys optimize --method nsga2`
17
+ - Optional `[mdao]` extra (pymoo, SALib); core install unchanged
18
+ - Constraint-aware DOE: `generate_doe(validate="architecture")` rejection-
19
+ samples against Architecture construction with adaptive oversampling,
20
+ eliminating per-case construction errors from batch studies
21
+ - Sobol global sensitivity: `sobol_sensitivity()` with S1/ST indices and
22
+ confidence intervals; `pasys sensitivity --sens-method sobol`
23
+ - Search timeline metrics: radar scenarios accept prf_hz, search extents,
24
+ beam overhead, and frame budget; antenna beamwidths and n_pulses/PRF
25
+ dwell time drive dwell_time_ms, n_beam_positions, search_frame_time_s,
26
+ search_update_rate_hz, timeline_occupancy
27
+ - Thermal-reliability coupling: `reliability.thermal_resistance_c_per_w`
28
+ + `ambient_temp_c` estimate junction temperature from dissipated power
29
+ and feed the Arrhenius MTBF derating (new junction_temp_c metric)
30
+ - Interactive plotly plots (`viz/interactive.py`, [plotting] extra) and
31
+ self-contained interactive Pareto embeds in HTML reports
32
+
33
+ ### Changed
34
+ - Weighted-sum optimizer penalty normalizes margins by requirement scale
35
+ (mixed-unit requirements previously biased the penalty)
36
+ - `interleaved_timeline` uses deterministic priority-weighted round-robin
37
+ instead of the placeholder priority sort
38
+ - mypy analysis target is 3.12 (numpy 2.2+ stubs); runtime 3.10 support
39
+ unchanged, still tested in CI
40
+
41
+ ## [0.8.0] - 2026-07-22
42
+
43
+ ### Added
44
+ - `models/propagation/` package: full ITU-R P.676-13 Annex 1 line-by-line
45
+ gaseous attenuation (44 O2 + 35 H2O vendored spectroscopic lines) and
46
+ ITU-R P.838-3 rain k/alpha for H and V polarization; ITU-R P.530
47
+ effective rain path length; all coefficient data vendored, no new
48
+ dependencies
49
+ - NRL sea clutter model (Gregers-Hansen & Mittal 2012, fitted to the
50
+ Nathanson tables) and Barton constant-gamma ground clutter
51
+ - `swerling` field on `RadarDetectionScenario`; required SNR, integration
52
+ gain, and achieved Pd all use the exact detection statistics
53
+ - `models/antenna/errors.py`: Ruze gain loss, phase-quantization RMS and
54
+ loss, average sidelobe floor, beam-pointing estimate; wired into both
55
+ antenna adapter paths so `phase_bits` and taper affect metrics in
56
+ analytic mode
57
+ - `generate_taper_weights()` from scipy window functions; taper losses
58
+ computed from real windows
59
+ - Reproducibility: `evaluate_case(seed=...)` threads the element-failure
60
+ RNG seed; `meta.seed`, `meta.package_version`, `meta.pam_version`
61
+ stamped per case; batch results sorted by case_id; `pasys doe --cache
62
+ PATH --resume`
63
+ - Validation suite (`tests/test_validation.py`, 35 tests) asserting
64
+ models against their published sources; `docs/theory/validation.md`
65
+ documents every reference and tolerance
66
+ - mypy at zero errors, enforced as a blocking CI step
67
+
68
+ ### Changed (numeric results shift)
69
+ - Atmospheric and rain losses now come from the real ITU models (the
70
+ previous 2-line/polynomial fits were hand-set approximations);
71
+ elevation handling uses equivalent-height slant columns (the previous
72
+ scale factor always evaluated to 1)
73
+ - Required radar SNR uses the exact Marcum-Q inversion instead of
74
+ Albersheim (golden case: 13.115 -> 13.183 dB, margin -0.24 dB)
75
+ - One noise convention: `rx_noise_temp_k` is antenna temperature and
76
+ T_sys = T_ant + 290*(F-1); identical at 290 K, corrects low-sky-temp
77
+ satcom cases; the radar equation now honors cascaded NF like the comms
78
+ path (golden case: +1.16 dB SNR with its 1.84 dB cascade)
79
+ - CA-CFAR loss follows the analytic universal curve, so Pfa now matters
80
+ (N=16 at 1e-6: 2.0 dB, unchanged; other Pfa values shift)
81
+ - Clutter sigma0 values shift to the published models
82
+ - `friis_noise_figure` reports `stage_contribution_pct` (sums to 100)
83
+ and `stage_nf_delta_db` instead of per-stage dB values that did not
84
+ sum; `cascade_analysis` key renamed to `stage_nf_contribution_pct`
85
+
86
+ ### Removed
87
+ - `compute_cost_per_db` (USD per dB is not a meaningful ratio)
88
+ - `swerling_snr_adjustment` and `cfar_required_snr_adjustment` empirical
89
+ step tables (superseded by exact statistics and the universal curve)
90
+ - Hand-fit taper-loss polynomials, GIT-style clutter constants, and the
91
+ fabricated rain-cell extent model
92
+
93
+ ## [0.7.0] - 2026-07-22
94
+
95
+ ### Added
96
+ - `digitization_level` (element / subarray / analog) on `DigitalConfig`; ADC count, beamformer data rate, compute, and power now follow the digitized channel count (`Architecture.n_digital_channels`) instead of assuming one ADC per element
97
+ - ADC aperture-jitter model: `adc_effective_snr()` combines quantization and jitter noise; new `adc_jitter_ps_rms` and `adc_input_freq_hz` config fields and `adc_enob_effective` metric
98
+ - System dynamic range metric `dynamic_range_system_db` including the 10*log10(N_channels) array processing gain
99
+ - Digital section power in the DC budget: ADC power from the Walden figure of merit (`adc_fom_fj`) and beamformer power from `dsp_efficiency_gops_per_w`
100
+ - Receive chain power per element (`rf.rx_power_w_per_elem`) and radar transmit `duty_cycle` in the power model; new metrics `rf_avg_power_w`, `pa_dc_power_w`, `rx_dc_power_w`, `adc_power_w`, `dsp_power_w`
101
+ - Exact Swerling 1-4 detection probabilities via gamma-mixture of the noncentral chi-square detector statistics
102
+ - Example `06_dbf_architecture_trade.py` and config `dbf_architecture_doe.yaml`: digitization-level trade study with Pareto extraction
103
+ - Golden-case regression test (`tests/test_golden_case.py` + `tests/data/golden_dbf_case.json`)
104
+
105
+ ### Fixed
106
+ - `default_architecture_builder` silently dropped `digital.*` and `reliability.*` DOE variables, so batch studies could not vary digital or reliability parameters
107
+ - `augment_doe` reused the caller's seed and duplicated the original samples instead of drawing new points
108
+ - Swerling 0 Pd used a Gaussian-tail approximation with identical dead-code branches; replaced with the exact Marcum Q (noncentral chi-square survival function)
109
+ - Radar equation double-counted pulse integration: an empirical n^0.8 gain was added on top of Albersheim's own n-pulse law; required SNR and integration gain now come from a single consistent law
110
+
111
+ ## [0.6.0] - 2026-03-21
112
+
113
+ ### Added
114
+ - Design optimization module (`trades/optimization.py`) with `optimize_design()` using scipy solvers
115
+ - `OptimizationResult` dataclass with best architecture, metrics, convergence info, and optional history
116
+ - Three solver backends: `differential_evolution`, `dual_annealing`, `minimize` (L-BFGS-B)
117
+ - Weighted multi-objective scalarization and requirement-based constraint penalties
118
+ - CLI `pasys optimize` command with `--objective`, `--sense`, `--method`, `--max-iter` options
119
+ - Unit tests for RF cascade models (`test_rf_cascade.py`): Friis NF, IIP3/OIP3, SFDR, MDS, cascade analysis
120
+ - Unit tests for digital models (`test_digital.py`): converters, bandwidth, beamformer ops, scheduling
121
+ - Optimization tests (`test_optimization.py`): single/multi-objective, constraints, integer vars, CLI E2E
122
+ - Example script `05_optimization.py`: DOE baseline vs optimizer comparison
123
+
124
+ ## [0.5.0] - 2026-03-21
125
+
126
+ ### Added
127
+ - Digital beamformer integration: `DigitalConfig` for ADC ENOB, data rate, and FPGA processing margin
128
+ - Radar YAML configs: `radar_basic.yaml` and `radar_doe.yaml` examples
129
+ - CLI end-to-end tests for run, doe, report, pareto, and sensitivity commands
130
+ - I/O round-trip tests for Parquet, CSV, and JSON export/import
131
+ - Digital metrics in reports (HTML and Markdown): `adc_enob`, `bf_data_rate_gbps`, `processing_margin_db`
132
+
133
+ ### Fixed
134
+ - CLI `pasys doe` command: was reading nonexistent `config.design_space` instead of `config.doe`
135
+ - CLI `pasys sensitivity` command: same `design_space` bug, now reads DOE variables correctly
136
+
137
+ ## [0.4.0] - 2026-02-01
138
+
139
+ ### Added
140
+ - Digital array model for digital beamforming calculations
141
+ - RF cascade model for noise figure and gain cascade analysis
142
+ - Documentation site with MkDocs Material
143
+ - API reference with mkdocstrings
144
+ - User guides for all major features
145
+ - Tutorials for communications and radar trade studies
146
+ - Theory documentation for phased arrays and link budgets
147
+
148
+ ### Fixed
149
+ - Ruff linting errors in models module
150
+ - MathJax rendering in documentation
151
+ - Markdown list formatting in documentation
152
+
153
+ ## [0.3.0] - 2024-01-15
154
+
155
+ ### Added
156
+ - Radar detection model with pulse integration
157
+ - `RadarDetectionScenario` for radar trade studies
158
+ - Radar equation calculator with Swerling models
159
+ - Detection probability and false alarm rate computations
160
+ - CLI commands: `pasys run`, `pasys doe`, `pasys report`, `pasys pareto`
161
+ - HTML and Markdown report generation
162
+ - Example: `03_radar_detection_trade.py`
163
+
164
+ ### Changed
165
+ - Improved Pareto extraction algorithm efficiency
166
+ - Enhanced visualization with 3D trade space plots
167
+
168
+ ### Fixed
169
+ - Hypervolume calculation for 3+ objectives
170
+
171
+ ## [0.2.0] - 2024-01-01
172
+
173
+ ### Added
174
+ - Design of Experiments (DOE) generation with LHS, random, and grid methods
175
+ - `BatchRunner` for parallel evaluation with progress tracking
176
+ - Pareto frontier extraction and ranking (weighted sum, TOPSIS)
177
+ - Scatter matrix visualization
178
+ - Parquet and CSV export functionality
179
+ - Requirements verification with pass/fail and margins
180
+ - `DesignSpace` for defining variable bounds and types
181
+
182
+ ### Changed
183
+ - Refactored architecture configuration to use Pydantic v2
184
+ - Improved error handling for batch evaluation
185
+
186
+ ### Fixed
187
+ - Array gain calculation for non-square arrays
188
+ - Case ID generation collision in augmented DOE
189
+
190
+ ## [0.1.0] - 2023-12-15
191
+
192
+ ### Added
193
+ - Initial release
194
+ - `Architecture` configuration: `ArrayConfig`, `RFChainConfig`, `CostConfig`
195
+ - `CommsLinkScenario` for communications link analysis
196
+ - Communications link budget model (`CommsLinkModel`)
197
+ - Free space path loss propagation model
198
+ - Power and cost models for SWaP-C analysis
199
+ - `Requirement` and `RequirementSet` for requirements management
200
+ - Pareto plot visualization
201
+ - YAML/JSON configuration loading
202
+ - Example: `01_comms_single_case.py`
203
+ - Example: `02_comms_doe_trade.py`
204
+ - Tutorial Jupyter notebook
205
+
206
+ ### Dependencies
207
+ - Requires `phased-array-modeling>=1.2.0`
208
+ - Python 3.10+
209
+
210
+ [Unreleased]: https://github.com/jman4162/phased-array-systems/compare/v0.6.0...HEAD
211
+ [0.6.0]: https://github.com/jman4162/phased-array-systems/compare/v0.5.0...v0.6.0
212
+ [0.5.0]: https://github.com/jman4162/phased-array-systems/compare/v0.4.0...v0.5.0
213
+ [0.4.0]: https://github.com/jman4162/phased-array-systems/compare/v0.3.0...v0.4.0
214
+ [0.3.0]: https://github.com/jman4162/phased-array-systems/compare/v0.2.0...v0.3.0
215
+ [0.2.0]: https://github.com/jman4162/phased-array-systems/compare/v0.1.0...v0.2.0
216
+ [0.1.0]: https://github.com/jman4162/phased-array-systems/releases/tag/v0.1.0
@@ -0,0 +1,150 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ `phased-array-systems` is an open-source Python package for phased array antenna system design, optimization, and performance visualization for wireless communications and radar applications. It implements an MBSE/MDAO workflow: requirements → architecture → analytical models → trade studies → Pareto selection → reporting.
8
+
9
+ **Core dependency:** `phased-array-modeling>=1.2.0` (provides array geometries, steering, tapering, impairments, and pattern visualization)
10
+
11
+ **Project status:** v0.9.0 - MDAO capability complete (NSGA-II, Sobol, constraint-aware DOE, timeline and thermal coupling) on top of the validated reference models. See `package_design_and_requirements.txt` for the original SDD and `CHANGELOG.md` for release history.
12
+
13
+ ## Git Attribution
14
+
15
+ All GitHub commits and attributions for this repository should be attributed to:
16
+
17
+ - **Name:** John Hodge
18
+ - **GitHub:** jman4162
19
+ - **Email:** jhodge007@gmail.com
20
+
21
+ Do NOT commit as jah70@vt.edu: GitHub maps that email to the account
22
+ @jman41, which wrongly appears as a separate contributor.
23
+
24
+ ## Build & Development Commands
25
+
26
+ ```bash
27
+ # Installation
28
+ pip install -e . # Editable install
29
+ pip install -e ".[dev]" # Development deps (pytest, ruff, mypy)
30
+ pip install -e ".[plotting]" # Visualization (plotly, kaleido)
31
+
32
+ # Testing
33
+ pytest tests/ # Run all tests
34
+ pytest tests/test_comms_link_budget.py -v # Run specific test file
35
+ pytest tests/ --cov=phased_array_systems # With coverage
36
+
37
+ # Linting & Formatting
38
+ ruff check .
39
+ ruff format .
40
+ mypy src/phased_array_systems
41
+
42
+ # CLI
43
+ pasys run config.yaml # Single case evaluation
44
+ pasys doe config.yaml # DOE batch study
45
+ pasys optimize config.yaml --objective eirp_dbw --sense maximize # Optimization
46
+ pasys pareto results.parquet --x cost_usd --y eirp_dbw # Pareto analysis
47
+ pasys report results.parquet -o report.html # Generate HTML report
48
+ ```
49
+
50
+ ## Architecture
51
+
52
+ ### Layer Structure
53
+ - **Layer 0:** `phased-array-modeling` (external) - EM/pattern computations
54
+ - **Layer 1:** This package - system models, trade studies, optimization
55
+ - **Layer 2:** Interfaces - Python API, CLI, config I/O
56
+
57
+ ### Package Layout (`src/phased_array_systems/`)
58
+ - `requirements/` - Constraint/objective definitions, verification reports
59
+ - `architecture/` - ArrayConfig, RFChainConfig, CostConfig, DigitalConfig, ReliabilityConfig
60
+ - `models/antenna/` - Adapter wrapping `phased-array-modeling`, pattern metrics extraction
61
+ - `models/comms/` - Link budget (SNR, margin, EIRP), propagation models
62
+ - `models/radar/` - Radar equation, PD/PFA threshold helpers, integration gains
63
+ - `models/swapc/` - Power, thermal, and cost models
64
+ - `models/rf/` - RF cascade analysis (Friis NF, IIP3, SFDR), TRM reliability models
65
+ - `models/digital/` - ADC/DAC converters, beamformer bandwidth/ops, scheduling
66
+ - `trades/` - DOE generation, batch runner, Pareto extraction, optimization solvers
67
+ - `viz/` - Plots (Pareto, scatter-matrix), HTML/Markdown report generation
68
+ - `io/` - Config loading (YAML/JSON), results export (Parquet/CSV)
69
+ - `cli.py` - `pasys` command entrypoint
70
+
71
+ ### Core Contracts
72
+
73
+ **ModelBlock Protocol:**
74
+ ```python
75
+ class ModelBlock(Protocol):
76
+ name: str
77
+ def evaluate(self, arch: Architecture, scenario: Scenario, context: dict) -> dict:
78
+ """Returns flat metrics dict"""
79
+ ```
80
+
81
+ **Canonical Metrics Dictionary** (universal exchange format):
82
+ - Antenna: `g_peak_db`, `beamwidth_az_deg`, `beamwidth_el_deg`, `sll_db`, `scan_loss_db`
83
+ - Comms: `eirp_dbw`, `path_loss_db`, `snr_rx_db`, `link_margin_db`
84
+ - Radar: `snr_single_pulse_db`, `snr_required_db`, `snr_margin_db`, `pd`, `pfa`
85
+ - RF Cascade: `cascade_nf_db`, `cascade_gain_db`, `cascade_iip3_dbm`, `cascade_oip3_dbm`, `cascade_sfdr_db`, `cascade_mds_dbm`
86
+ - Digital: `adc_enob`, `adc_snr_db`, `bf_data_rate_gbps`, `bf_compute_gops`, `processing_margin_db`, `fpga_utilization_pct`
87
+ - Reliability: `trm_mtbf_hours`, `array_mtbf_hours`, `expected_failed_elements`, `array_availability`
88
+ - SWaP-C: `prime_power_w`, `weight_kg`, `cost_usd`
89
+ - Metadata: `meta.case_id`, `meta.runtime_s`, `meta.seed`, `meta.error`
90
+
91
+ ### Data Flow
92
+ ```
93
+ Config (YAML/JSON) → Pydantic validation → [Architecture + Scenario + RequirementSet]
94
+ → DOE case generation → Batch evaluation (parallel, cached)
95
+ → Requirement verification → Pareto extraction → Optimization → Visualization/Reports
96
+ ```
97
+
98
+ ## Design Principles
99
+
100
+ 1. **Requirements as first-class objects** - Every run produces pass/fail + margins with traceability
101
+ 2. **Trade-space first** - DOE + Pareto over single-point designs; grey-out infeasible cases
102
+ 3. **Flat metrics dictionary** - All models return consistent `dict[str, float]` for interchange
103
+ 4. **Config-driven reproducibility** - Stable case IDs, seed control, version stamping
104
+ 5. **Safe configs** - No `eval()`, data-driven configs only
105
+ 6. **Case-level error handling** - DOE runs never crash for single-case failures
106
+
107
+ ## Implementation Phases
108
+
109
+ All phases are complete as of v0.4.0, with v0.5.0 adding digital/RF models and v0.6.0 adding optimization:
110
+
111
+ 1. **Phase 1 (MVP):** ✅ Complete
112
+ - Pydantic schemas for Architecture, Scenario, RequirementSet
113
+ - YAML/JSON config loader with validation
114
+ - Requirements verification with pass/fail and margin reporting
115
+ - Antenna adapter wrapping `phased-array-modeling`
116
+ - Comms link budget model (EIRP, path loss, SNR, margins)
117
+
118
+ 2. **Phase 2:** ✅ Complete
119
+ - DOE generator with full-factorial and Latin hypercube sampling
120
+ - Batch runner with parallel execution and resume capability
121
+ - Pareto extraction for multi-objective optimization
122
+ - Interactive plots (Pareto fronts, scatter matrices)
123
+ - Parquet/CSV export for results
124
+
125
+ 3. **Phase 3:** ✅ Complete
126
+ - Radar equation model (SNR, detection range)
127
+ - Detection threshold helpers (PD/PFA calculations)
128
+ - Integration gain for pulse integration
129
+ - Radar trade study examples
130
+
131
+ 4. **Phase 4:** ✅ Complete
132
+ - `pasys` CLI with run, doe, pareto, and report commands
133
+ - HTML and Markdown report generation
134
+ - Ready for PyPI publish
135
+
136
+ 5. **Phase 5 (v0.5.0):** ✅ Complete
137
+ - RF cascade analysis (Friis NF, IIP3, SFDR, MDS)
138
+ - TRM reliability and graceful degradation models
139
+ - Digital beamformer models (ADC/DAC, bandwidth, scheduling)
140
+ - DigitalConfig and ReliabilityConfig in Architecture
141
+
142
+ 6. **Phase 6 (v0.6.0):** ✅ Complete
143
+ - Design optimization via scipy solvers (DE, dual annealing, L-BFGS-B)
144
+ - Weighted multi-objective scalarization with constraint penalties
145
+ - `pasys optimize` CLI command
146
+ - Unit tests for RF cascade and digital models
147
+
148
+ ## Future Goals
149
+
150
+ **Interactive Web Application:** The package is designed to eventually power an interactive Streamlit or Vercel webapp for browser-based trade studies and visualization. Keep the core logic decoupled from CLI/reporting concerns to facilitate web integration.