phased-array-systems 0.4.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 (201) hide show
  1. phased_array_systems-0.9.0/.claude/settings.local 2.json +45 -0
  2. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/.github/workflows/ci.yml +6 -1
  3. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/.gitignore +3 -0
  4. phased_array_systems-0.9.0/CHANGELOG.md +216 -0
  5. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/CLAUDE.md +34 -5
  6. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/PKG-INFO +109 -31
  7. phased_array_systems-0.9.0/README.md +274 -0
  8. phased_array_systems-0.9.0/app/pages/1_Single_Case.py +407 -0
  9. phased_array_systems-0.9.0/app/pages/2_Trade_Study.py +423 -0
  10. phased_array_systems-0.9.0/app/pages/3_RF_Cascade.py +494 -0
  11. phased_array_systems-0.9.0/app/pages/4_Radar_Detection.py +526 -0
  12. phased_array_systems-0.9.0/app/requirements.txt +10 -0
  13. phased_array_systems-0.9.0/app/streamlit_app.py +156 -0
  14. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/index.md +4 -0
  15. phased_array_systems-0.9.0/docs/api/models/digital.md +286 -0
  16. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/models/index.md +2 -0
  17. phased_array_systems-0.9.0/docs/api/models/rf.md +281 -0
  18. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/models/swapc.md +1 -4
  19. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/trades.md +8 -0
  20. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/viz.md +8 -0
  21. phased_array_systems-0.9.0/docs/changelog.md +85 -0
  22. phased_array_systems-0.9.0/docs/cli/optimize.md +68 -0
  23. phased_array_systems-0.9.0/docs/cli/sensitivity.md +58 -0
  24. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/getting-started/installation.md +1 -0
  25. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/index.md +2 -2
  26. phased_array_systems-0.9.0/docs/theory/validation.md +48 -0
  27. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/tutorials/index.md +5 -1
  28. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/index.md +1 -0
  29. phased_array_systems-0.9.0/docs/user-guide/mdao.md +122 -0
  30. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/examples/01_comms_single_case.py +7 -3
  31. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/examples/02_comms_doe_trade.py +4 -2
  32. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/examples/03_radar_detection_trade.py +5 -7
  33. phased_array_systems-0.9.0/examples/04_taper_trade_study.py +117 -0
  34. phased_array_systems-0.9.0/examples/05_optimization.py +122 -0
  35. phased_array_systems-0.9.0/examples/06_dbf_architecture_trade.py +144 -0
  36. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/examples/configs/comms_basic.yaml +23 -1
  37. phased_array_systems-0.9.0/examples/configs/dbf_architecture_doe.yaml +105 -0
  38. phased_array_systems-0.9.0/examples/configs/radar_basic.yaml +72 -0
  39. phased_array_systems-0.9.0/examples/configs/radar_doe.yaml +76 -0
  40. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/mkdocs.yml +6 -0
  41. phased_array_systems-0.9.0/notebooks/tutorial_dbf_architecture_trade.ipynb +694 -0
  42. phased_array_systems-0.9.0/notebooks/tutorial_mdao_workflow.ipynb +523 -0
  43. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/notebooks/tutorial_phased_array_trade_study.ipynb +84 -50
  44. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/pyproject.toml +10 -3
  45. phased_array_systems-0.9.0/scripts/slopcheck.sh +101 -0
  46. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/__about__.py +1 -1
  47. phased_array_systems-0.9.0/src/phased_array_systems/__init__.py +88 -0
  48. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/architecture/__init__.py +4 -0
  49. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/architecture/config.py +142 -11
  50. phased_array_systems-0.9.0/src/phased_array_systems/cli.py +820 -0
  51. phased_array_systems-0.9.0/src/phased_array_systems/evaluate.py +344 -0
  52. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/exporters.py +7 -3
  53. phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/__init__.py +58 -0
  54. phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/adapter.py +380 -0
  55. phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/errors.py +182 -0
  56. phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/grating.py +35 -0
  57. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/antenna/metrics.py +15 -11
  58. phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/taper.py +374 -0
  59. phased_array_systems-0.9.0/src/phased_array_systems/models/comms/__init__.py +19 -0
  60. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/comms/link_budget.py +65 -17
  61. phased_array_systems-0.9.0/src/phased_array_systems/models/comms/propagation.py +212 -0
  62. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/digital/bandwidth.py +3 -26
  63. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/digital/converters.py +66 -36
  64. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/digital/scheduling.py +30 -48
  65. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/__init__.py +38 -0
  66. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p676.py +186 -0
  67. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p676_data.py +96 -0
  68. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p838.py +90 -0
  69. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p838_data.py +57 -0
  70. phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/path.py +79 -0
  71. phased_array_systems-0.9.0/src/phased_array_systems/models/radar/__init__.py +87 -0
  72. phased_array_systems-0.9.0/src/phased_array_systems/models/radar/cfar.py +308 -0
  73. phased_array_systems-0.9.0/src/phased_array_systems/models/radar/clutter.py +360 -0
  74. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/radar/detection.py +42 -106
  75. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/radar/equation.py +186 -26
  76. phased_array_systems-0.9.0/src/phased_array_systems/models/radar/propagation.py +312 -0
  77. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/rf/__init__.py +29 -0
  78. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/rf/cascade.py +21 -67
  79. phased_array_systems-0.9.0/src/phased_array_systems/models/rf/reliability.py +602 -0
  80. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/swapc/cost.py +0 -17
  81. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/swapc/power.py +49 -8
  82. phased_array_systems-0.9.0/src/phased_array_systems/py.typed +0 -0
  83. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/html.py +109 -12
  84. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/markdown.py +51 -11
  85. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/scenarios/comms.py +15 -6
  86. phased_array_systems-0.9.0/src/phased_array_systems/scenarios/radar.py +140 -0
  87. phased_array_systems-0.9.0/src/phased_array_systems/trades/__init__.py +30 -0
  88. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/design_space.py +87 -5
  89. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/doe.py +62 -11
  90. phased_array_systems-0.9.0/src/phased_array_systems/trades/moo.py +188 -0
  91. phased_array_systems-0.9.0/src/phased_array_systems/trades/optimization.py +298 -0
  92. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/pareto.py +11 -11
  93. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/runner.py +9 -7
  94. phased_array_systems-0.9.0/src/phased_array_systems/trades/sensitivity.py +292 -0
  95. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/types.py +1 -1
  96. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/viz/__init__.py +4 -0
  97. phased_array_systems-0.9.0/src/phased_array_systems/viz/interactive.py +231 -0
  98. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/viz/plots.py +94 -15
  99. phased_array_systems-0.9.0/tests/conftest.py +120 -0
  100. phased_array_systems-0.9.0/tests/data/golden_dbf_case.json +77 -0
  101. phased_array_systems-0.9.0/tests/test_antenna_adapter.py +575 -0
  102. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_architecture.py +7 -10
  103. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_cli.py +218 -1
  104. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_comms_link_budget.py +154 -5
  105. phased_array_systems-0.9.0/tests/test_digital.py +399 -0
  106. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_doe.py +73 -0
  107. phased_array_systems-0.9.0/tests/test_evaluate.py +637 -0
  108. phased_array_systems-0.9.0/tests/test_golden_case.py +114 -0
  109. phased_array_systems-0.9.0/tests/test_interactive_viz.py +75 -0
  110. phased_array_systems-0.9.0/tests/test_io.py +306 -0
  111. phased_array_systems-0.9.0/tests/test_moo.py +129 -0
  112. phased_array_systems-0.9.0/tests/test_optimization.py +299 -0
  113. phased_array_systems-0.9.0/tests/test_radar.py +908 -0
  114. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_reports.py +14 -12
  115. phased_array_systems-0.9.0/tests/test_rf_cascade.py +222 -0
  116. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_runner.py +105 -0
  117. phased_array_systems-0.9.0/tests/test_sensitivity.py +156 -0
  118. phased_array_systems-0.9.0/tests/test_sobol.py +83 -0
  119. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_swapc.py +93 -5
  120. phased_array_systems-0.9.0/tests/test_validation.py +377 -0
  121. phased_array_systems-0.4.0/CHANGELOG.md +0 -77
  122. phased_array_systems-0.4.0/README.md +0 -200
  123. phased_array_systems-0.4.0/docs/changelog.md +0 -29
  124. phased_array_systems-0.4.0/src/phased_array_systems/__init__.py +0 -10
  125. phased_array_systems-0.4.0/src/phased_array_systems/cli.py +0 -376
  126. phased_array_systems-0.4.0/src/phased_array_systems/evaluate.py +0 -138
  127. phased_array_systems-0.4.0/src/phased_array_systems/models/antenna/__init__.py +0 -15
  128. phased_array_systems-0.4.0/src/phased_array_systems/models/antenna/adapter.py +0 -190
  129. phased_array_systems-0.4.0/src/phased_array_systems/models/comms/__init__.py +0 -9
  130. phased_array_systems-0.4.0/src/phased_array_systems/models/comms/propagation.py +0 -84
  131. phased_array_systems-0.4.0/src/phased_array_systems/models/radar/__init__.py +0 -25
  132. phased_array_systems-0.4.0/src/phased_array_systems/scenarios/radar.py +0 -61
  133. phased_array_systems-0.4.0/src/phased_array_systems/trades/__init__.py +0 -16
  134. phased_array_systems-0.4.0/tests/test_antenna_adapter.py +0 -179
  135. phased_array_systems-0.4.0/tests/test_evaluate.py +0 -219
  136. phased_array_systems-0.4.0/tests/test_radar.py +0 -365
  137. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/.github/workflows/docs.yml +0 -0
  138. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/.github/workflows/publish.yml +0 -0
  139. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/CONTRIBUTING.md +0 -0
  140. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/LICENSE +0 -0
  141. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/architecture.md +0 -0
  142. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/io.md +0 -0
  143. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/models/antenna.md +0 -0
  144. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/models/comms.md +0 -0
  145. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/models/radar.md +0 -0
  146. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/reports.md +0 -0
  147. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/requirements.md +0 -0
  148. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/scenarios.md +0 -0
  149. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/cli/doe.md +0 -0
  150. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/cli/index.md +0 -0
  151. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/cli/pareto.md +0 -0
  152. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/cli/report.md +0 -0
  153. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/cli/run.md +0 -0
  154. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/contributing.md +0 -0
  155. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/faq.md +0 -0
  156. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/getting-started/concepts.md +0 -0
  157. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/getting-started/index.md +0 -0
  158. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/getting-started/quickstart.md +0 -0
  159. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/javascripts/mathjax.js +0 -0
  160. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/stylesheets/extra.css +0 -0
  161. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/theory/index.md +0 -0
  162. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/theory/link-budget-equations.md +0 -0
  163. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/theory/pareto-optimization.md +0 -0
  164. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/theory/phased-arrays.md +0 -0
  165. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/theory/radar-equation.md +0 -0
  166. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/tutorials/comms-trade-study.md +0 -0
  167. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/tutorials/config-driven-workflow.md +0 -0
  168. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/tutorials/radar-detection-trade.md +0 -0
  169. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/tutorials/sensitivity-analysis.md +0 -0
  170. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/architecture.md +0 -0
  171. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/link-budget.md +0 -0
  172. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/pareto-analysis.md +0 -0
  173. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/radar-detection.md +0 -0
  174. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/reports.md +0 -0
  175. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/requirements.md +0 -0
  176. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/scenarios.md +0 -0
  177. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/trade-studies.md +0 -0
  178. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/visualization.md +0 -0
  179. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/examples/configs/comms_doe.yaml +0 -0
  180. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/ruff.toml +0 -0
  181. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/constants.py +0 -0
  182. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/__init__.py +0 -0
  183. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/config_loader.py +0 -0
  184. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/schema.py +0 -0
  185. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/__init__.py +0 -0
  186. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/base.py +0 -0
  187. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/digital/__init__.py +0 -0
  188. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/radar/integration.py +0 -0
  189. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/swapc/__init__.py +0 -0
  190. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/__init__.py +0 -0
  191. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/generator.py +0 -0
  192. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/requirements/__init__.py +0 -0
  193. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/requirements/core.py +0 -0
  194. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/scenarios/__init__.py +0 -0
  195. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/scenarios/base.py +0 -0
  196. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/utils/__init__.py +0 -0
  197. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/utils/hashing.py +0 -0
  198. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/__init__.py +0 -0
  199. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_pareto.py +0 -0
  200. {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_requirements.py +0 -0
  201. {phased_array_systems-0.4.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
@@ -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
@@ -8,7 +8,18 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
8
8
 
9
9
  **Core dependency:** `phased-array-modeling>=1.2.0` (provides array geometries, steering, tapering, impairments, and pattern visualization)
10
10
 
11
- **Project status:** v0.4.0 - All 4 implementation phases complete. See `package_design_and_requirements.txt` for the original SDD.
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.
12
23
 
13
24
  ## Build & Development Commands
14
25
 
@@ -31,6 +42,7 @@ mypy src/phased_array_systems
31
42
  # CLI
32
43
  pasys run config.yaml # Single case evaluation
33
44
  pasys doe config.yaml # DOE batch study
45
+ pasys optimize config.yaml --objective eirp_dbw --sense maximize # Optimization
34
46
  pasys pareto results.parquet --x cost_usd --y eirp_dbw # Pareto analysis
35
47
  pasys report results.parquet -o report.html # Generate HTML report
36
48
  ```
@@ -44,12 +56,14 @@ pasys report results.parquet -o report.html # Generate HTML report
44
56
 
45
57
  ### Package Layout (`src/phased_array_systems/`)
46
58
  - `requirements/` - Constraint/objective definitions, verification reports
47
- - `architecture/` - ArrayConfig, RFChainConfig, PowerThermalConfig, CostConfig
59
+ - `architecture/` - ArrayConfig, RFChainConfig, CostConfig, DigitalConfig, ReliabilityConfig
48
60
  - `models/antenna/` - Adapter wrapping `phased-array-modeling`, pattern metrics extraction
49
61
  - `models/comms/` - Link budget (SNR, margin, EIRP), propagation models
50
62
  - `models/radar/` - Radar equation, PD/PFA threshold helpers, integration gains
51
63
  - `models/swapc/` - Power, thermal, and cost models
52
- - `trades/` - DOE generation, batch runner, Pareto extraction, optimization
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
53
67
  - `viz/` - Plots (Pareto, scatter-matrix), HTML/Markdown report generation
54
68
  - `io/` - Config loading (YAML/JSON), results export (Parquet/CSV)
55
69
  - `cli.py` - `pasys` command entrypoint
@@ -68,6 +82,9 @@ class ModelBlock(Protocol):
68
82
  - Antenna: `g_peak_db`, `beamwidth_az_deg`, `beamwidth_el_deg`, `sll_db`, `scan_loss_db`
69
83
  - Comms: `eirp_dbw`, `path_loss_db`, `snr_rx_db`, `link_margin_db`
70
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`
71
88
  - SWaP-C: `prime_power_w`, `weight_kg`, `cost_usd`
72
89
  - Metadata: `meta.case_id`, `meta.runtime_s`, `meta.seed`, `meta.error`
73
90
 
@@ -75,7 +92,7 @@ class ModelBlock(Protocol):
75
92
  ```
76
93
  Config (YAML/JSON) → Pydantic validation → [Architecture + Scenario + RequirementSet]
77
94
  → DOE case generation → Batch evaluation (parallel, cached)
78
- → Requirement verification → Pareto extraction → Visualization/Reports
95
+ → Requirement verification → Pareto extraction → Optimization → Visualization/Reports
79
96
  ```
80
97
 
81
98
  ## Design Principles
@@ -89,7 +106,7 @@ Config (YAML/JSON) → Pydantic validation → [Architecture + Scenario + Requir
89
106
 
90
107
  ## Implementation Phases
91
108
 
92
- All phases are complete as of v0.4.0:
109
+ All phases are complete as of v0.4.0, with v0.5.0 adding digital/RF models and v0.6.0 adding optimization:
93
110
 
94
111
  1. **Phase 1 (MVP):** ✅ Complete
95
112
  - Pydantic schemas for Architecture, Scenario, RequirementSet
@@ -116,6 +133,18 @@ All phases are complete as of v0.4.0:
116
133
  - HTML and Markdown report generation
117
134
  - Ready for PyPI publish
118
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
+
119
148
  ## Future Goals
120
149
 
121
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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: phased-array-systems
3
- Version: 0.4.0
3
+ Version: 0.9.0
4
4
  Summary: Phased array antenna system design, optimization, and performance visualization
5
5
  Project-URL: Homepage, https://github.com/jman4162/phased-array-systems
6
6
  Project-URL: Documentation, https://jman4162.github.io/phased-array-systems
@@ -11,7 +11,7 @@ Author: phased-array-systems contributors
11
11
  License-Expression: MIT
12
12
  License-File: LICENSE
13
13
  Keywords: RF,antenna,communications,optimization,phased array,radar,system design,trade study
14
- Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Development Status :: 4 - Beta
15
15
  Classifier: Intended Audience :: Developers
16
16
  Classifier: Intended Audience :: Science/Research
17
17
  Classifier: License :: OSI Approved :: MIT License
@@ -26,7 +26,7 @@ Requires-Python: >=3.10
26
26
  Requires-Dist: matplotlib>=3.7.0
27
27
  Requires-Dist: numpy>=1.24.0
28
28
  Requires-Dist: pandas>=2.0.0
29
- Requires-Dist: phased-array-modeling>=1.2.0
29
+ Requires-Dist: phased-array-modeling>=1.3.0
30
30
  Requires-Dist: pydantic>=2.0
31
31
  Requires-Dist: pyyaml>=6.0
32
32
  Requires-Dist: scipy>=1.10.0
@@ -36,6 +36,7 @@ Requires-Dist: pandas-stubs>=2.0; extra == 'dev'
36
36
  Requires-Dist: pytest-cov>=4.0; extra == 'dev'
37
37
  Requires-Dist: pytest>=7.0; extra == 'dev'
38
38
  Requires-Dist: ruff>=0.1.0; extra == 'dev'
39
+ Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
39
40
  Provides-Extra: docs
40
41
  Requires-Dist: mkdocs-gen-files>=0.5; extra == 'docs'
41
42
  Requires-Dist: mkdocs-jupyter>=0.24; extra == 'docs'
@@ -44,6 +45,9 @@ Requires-Dist: mkdocs-material>=9.4; extra == 'docs'
44
45
  Requires-Dist: mkdocs-section-index>=0.3; extra == 'docs'
45
46
  Requires-Dist: mkdocs>=1.5; extra == 'docs'
46
47
  Requires-Dist: mkdocstrings[python]>=0.24; extra == 'docs'
48
+ Provides-Extra: mdao
49
+ Requires-Dist: pymoo>=0.6; extra == 'mdao'
50
+ Requires-Dist: salib>=1.4; extra == 'mdao'
47
51
  Provides-Extra: plotting
48
52
  Requires-Dist: kaleido>=0.2; extra == 'plotting'
49
53
  Requires-Dist: plotly>=5.0; extra == 'plotting'
@@ -53,13 +57,16 @@ Description-Content-Type: text/markdown
53
57
 
54
58
  [![CI](https://github.com/jman4162/phased-array-systems/actions/workflows/ci.yml/badge.svg)](https://github.com/jman4162/phased-array-systems/actions/workflows/ci.yml)
55
59
  [![Documentation](https://img.shields.io/badge/docs-mkdocs-blue.svg)](https://jman4162.github.io/phased-array-systems)
60
+ [![Streamlit App](https://img.shields.io/badge/Streamlit-Live_Demo-FF4B4B?logo=streamlit)](https://phased-array-systems.streamlit.app)
56
61
  [![PyPI version](https://badge.fury.io/py/phased-array-systems.svg)](https://badge.fury.io/py/phased-array-systems)
62
+ [![Downloads](https://img.shields.io/pypi/dm/phased-array-systems)](https://pypi.org/project/phased-array-systems/)
57
63
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
58
64
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
59
65
 
60
66
  Phased array antenna system design, optimization, and performance visualization for wireless communications and radar applications.
61
67
 
62
68
  **[Documentation](https://jman4162.github.io/phased-array-systems)** |
69
+ **[Live Demo](https://phased-array-systems.streamlit.app)** |
63
70
  **[Getting Started](https://jman4162.github.io/phased-array-systems/getting-started/quickstart/)** |
64
71
  **[API Reference](https://jman4162.github.io/phased-array-systems/api/)**
65
72
 
@@ -67,9 +74,12 @@ Phased array antenna system design, optimization, and performance visualization
67
74
 
68
75
  - **Model-Based Workflow**: MBSE/MDAO approach from requirements through optimized designs
69
76
  - **Requirements-Driven**: Every evaluation produces pass/fail with margins and traceability
70
- - **Trade-Space Exploration**: DOE generation and Pareto analysis for systematic design exploration
71
- - **Dual Application**: Supports both communications link budgets and radar detection scenarios
72
- - **Reproducible**: Config-driven workflow with seed control and version stamping
77
+ - **Trade-Space Exploration**: constraint-aware DOE generation and Pareto analysis
78
+ - **Multi-Objective Optimization**: NSGA-II Pareto fronts (pymoo) plus scipy scalarized solvers
79
+ - **Validated Physics**: ITU-R P.676/P.838 propagation, NRL sea clutter, exact Swerling detection statistics, each tested against its published source
80
+ - **Digital Beamforming Trades**: element vs subarray vs analog digitization drives ADC count, data rate, compute, and power
81
+ - **System Models**: comms link budget, radar detection + search timeline, RF cascade, digital beamformer, thermal-coupled reliability
82
+ - **Reproducible**: config-driven workflow with seed control, provenance stamps, and checkpoint/resume
73
83
 
74
84
  ## Workflow
75
85
 
@@ -78,28 +88,39 @@ Config (YAML/JSON) → Architecture + Scenario → DOE Generation → Batch Eval
78
88
  ↓ ↓
79
89
  Requirements ───────────────────────────────────────────→ Verification
80
90
  ↓
81
- Reports ← Visualization ← Pareto Extraction ←──┘
91
+ Pareto Extraction
92
+ ↓
93
+ Reports ← Visualization ← Optimization ←────────────┘
82
94
  ```
83
95
 
84
96
  ## Features
85
97
 
86
- - **Requirements as first-class objects**: Every run produces pass/fail + margins with traceability
87
- - **Trade-space exploration**: DOE + Pareto optimization over single-point designs
88
- - **Communications & Radar**: Link budget analysis and radar detection modeling
89
- - **Flat metrics dictionary**: All models return consistent `dict[str, float]` for interchange
90
- - **Config-driven reproducibility**: Stable case IDs, seed control, version stamping
91
- - **CLI and Python API**: Use from command line or integrate into scripts
98
+ - **Requirements as first-class objects**: every run produces pass/fail + margins with traceability
99
+ - **Trade-space exploration**: DOE (grid/random/LHS) with rejection sampling against architecture constraints, plus Pareto extraction, TOPSIS ranking, and hypervolume
100
+ - **Multi-objective optimization**: NSGA-II returns the nondominated set directly; scipy solvers (DE, dual annealing, L-BFGS-B) with normalized constraint penalties remain for scalarized runs
101
+ - **Global sensitivity**: Sobol S1/ST indices (SALib) alongside one-at-a-time sweeps
102
+ - **Communications & Radar**: link budgets with ITU-R P.676-13 line-by-line gaseous and P.838-3 rain attenuation; radar detection with exact Swerling 0-4 statistics, NRL sea clutter, analytic CFAR loss, and search-timeline revisit metrics
103
+ - **Digital beamforming**: digitization level (element/subarray/analog), jitter-aware ADC SNR, system dynamic range with array processing gain, beamformer data-rate and compute budgets
104
+ - **RF cascade analysis**: Friis noise figure, IIP3, SFDR, MDS for cascaded receiver chains
105
+ - **TRM reliability**: MTBF with Arrhenius derating driven by estimated junction temperature, availability, graceful degradation
106
+ - **Validation suite**: models checked against published references in CI (see the docs' validation table)
107
+ - **Flat metrics dictionary**: all models return a consistent flat dict for interchange
108
+ - **Interactive reports**: self-contained HTML with embedded plotly trade plots
109
+ - **CLI and Python API**: use from the command line or integrate into scripts
92
110
 
93
111
  ## Installation
94
112
 
95
113
  ```bash
96
114
  pip install phased-array-systems
97
115
 
98
- # Development dependencies
99
- pip install phased-array-systems[dev]
116
+ # Multi-objective optimization + Sobol sensitivity (pymoo, SALib)
117
+ pip install "phased-array-systems[mdao]"
100
118
 
101
- # Visualization extras
102
- pip install phased-array-systems[plotting]
119
+ # Interactive plots and report embeds (plotly)
120
+ pip install "phased-array-systems[plotting]"
121
+
122
+ # Development dependencies
123
+ pip install "phased-array-systems[dev]"
103
124
  ```
104
125
 
105
126
  ## Quick Start
@@ -107,9 +128,8 @@ pip install phased-array-systems[plotting]
107
128
  ### Single Case Evaluation
108
129
 
109
130
  ```python
110
- from phased_array_systems.architecture import Architecture, ArrayConfig, RFChainConfig
111
- from phased_array_systems.scenarios import CommsLinkScenario
112
- from phased_array_systems.evaluate import evaluate_case
131
+ from phased_array_systems import Architecture, ArrayConfig, RFChainConfig
132
+ from phased_array_systems import CommsLinkScenario, evaluate_case
113
133
 
114
134
  # Define architecture
115
135
  arch = Architecture(
@@ -134,7 +154,7 @@ print(f"Link Margin: {metrics['link_margin_db']:.1f} dB")
134
154
  ### DOE Trade Study
135
155
 
136
156
  ```python
137
- from phased_array_systems.trades import DesignSpace, generate_doe, BatchRunner, extract_pareto
157
+ from phased_array_systems import DesignSpace, generate_doe, BatchRunner, extract_pareto
138
158
 
139
159
  # Define design space
140
160
  space = (
@@ -158,17 +178,45 @@ pareto = extract_pareto(results, [
158
178
  ])
159
179
  ```
160
180
 
181
+ ### Design Optimization
182
+
183
+ ```python
184
+ from phased_array_systems import optimize_design, DesignSpace, CommsLinkScenario
185
+
186
+ scenario = CommsLinkScenario(
187
+ freq_hz=10e9, bandwidth_hz=10e6, range_m=100e3, required_snr_db=10.0,
188
+ )
189
+ space = (
190
+ DesignSpace()
191
+ .add_variable("array.nx", "categorical", values=[4, 8, 16])
192
+ .add_variable("array.ny", "categorical", values=[4, 8, 16])
193
+ .add_variable("rf.tx_power_w_per_elem", "float", low=0.5, high=3.0)
194
+ )
195
+
196
+ result = optimize_design(
197
+ space=space, scenario=scenario,
198
+ objective="eirp_dbw", sense="maximize", method="de", seed=42,
199
+ )
200
+ print(f"Best EIRP: {result.best_metrics['eirp_dbw']:.1f} dBW")
201
+ ```
202
+
161
203
  ## Examples
162
204
 
163
205
  See the `examples/` directory:
164
206
  - `01_comms_single_case.py` - Single case evaluation
165
207
  - `02_comms_doe_trade.py` - Full DOE trade study workflow
208
+ - `03_radar_detection_trade.py` - Radar detection analysis and trade study
209
+ - `04_taper_trade_study.py` - Amplitude taper comparison (SLL vs gain)
210
+ - `05_optimization.py` - Design optimization with constraint handling
211
+ - `06_dbf_architecture_trade.py` - Digital beamforming architecture trade (element vs subarray vs analog digitization)
166
212
 
167
- ### Tutorial Notebook
213
+ ### Tutorial Notebooks
168
214
 
169
- [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jman4162/phased-array-systems/blob/main/notebooks/tutorial_phased_array_trade_study.ipynb)
215
+ Try the interactive tutorials in Google Colab:
170
216
 
171
- Try the interactive tutorial in Google Colab!
217
+ - Trade study basics: [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jman4162/phased-array-systems/blob/main/notebooks/tutorial_phased_array_trade_study.ipynb)
218
+ - DBF architecture trade: [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jman4162/phased-array-systems/blob/main/notebooks/tutorial_dbf_architecture_trade.ipynb)
219
+ - MDAO workflow (NSGA-II + Sobol): [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jman4162/phased-array-systems/blob/main/notebooks/tutorial_mdao_workflow.ipynb)
172
220
 
173
221
  ## Package Structure
174
222
 
@@ -180,6 +228,9 @@ phased_array_systems/
180
228
  ├── models/
181
229
  │ ├── antenna/ # Phased array adapter and metrics
182
230
  │ ├── comms/ # Link budget, propagation models
231
+ │ ├── radar/ # Radar equation, detection, integration
232
+ │ ├── rf/ # Cascaded RF chain analysis (NF, IIP3, SFDR)
233
+ │ ├── digital/ # ADC/DAC, bandwidth, scheduling models
183
234
  │ └── swapc/ # Power and cost models
184
235
  ├── trades/ # DOE, batch runner, Pareto analysis
185
236
  ├── viz/ # Plotting utilities
@@ -209,14 +260,24 @@ ruff check .
209
260
  # Single case evaluation
210
261
  pasys run config.yaml
211
262
 
212
- # DOE batch study
213
- pasys doe config.yaml -n 100 --method lhs
263
+ # DOE batch study (checkpoint every 10 cases; resume after interruption)
264
+ pasys doe config.yaml -n 100 --method lhs --cache results/cache.parquet --resume
214
265
 
215
- # Generate report
216
- pasys report results.parquet --format html
266
+ # Scalarized optimization (differential evolution)
267
+ pasys optimize config.yaml --objective eirp_dbw --sense maximize
217
268
 
218
- # Extract Pareto frontier
269
+ # Multi-objective Pareto front (NSGA-II; needs the [mdao] extra)
270
+ pasys optimize config.yaml --objective eirp_dbw --method nsga2 \
271
+ --objective2 cost_usd:minimize -o pareto.parquet
272
+
273
+ # Sensitivity: one-at-a-time or Sobol global indices
274
+ pasys sensitivity config.yaml --sens-method sobol --samples 256
275
+
276
+ # Extract Pareto frontier from DOE results
219
277
  pasys pareto results.parquet -x cost_usd -y eirp_dbw --plot
278
+
279
+ # Generate report
280
+ pasys report results.parquet --format html
220
281
  ```
221
282
 
222
283
  ## Documentation
@@ -229,6 +290,23 @@ Full documentation is available at **[jman4162.github.io/phased-array-systems](h
229
290
  - [API Reference](https://jman4162.github.io/phased-array-systems/api/) - Complete API documentation
230
291
  - [Theory](https://jman4162.github.io/phased-array-systems/theory/) - Background equations and theory
231
292
 
293
+ ## Interactive Demo
294
+
295
+ [![Streamlit App](https://img.shields.io/badge/Streamlit-Demo-FF4B4B?logo=streamlit)](https://phased-array-systems.streamlit.app)
296
+
297
+ Try the interactive Streamlit demo app featuring:
298
+ - **Single Case Calculator**: Evaluate array configurations with real-time metrics
299
+ - **Trade Study**: DOE generation with Pareto optimization
300
+ - **RF Cascade Analyzer**: Cascaded noise figure, gain, and linearity analysis
301
+ - **Radar Detection**: SNR calculation and detection probability curves
302
+
303
+ Run locally:
304
+ ```bash
305
+ cd app
306
+ pip install -r requirements.txt
307
+ streamlit run streamlit_app.py
308
+ ```
309
+
232
310
  ## Citation
233
311
 
234
312
  If you use phased-array-systems in academic work, please cite:
@@ -236,8 +314,8 @@ If you use phased-array-systems in academic work, please cite:
236
314
  ```bibtex
237
315
  @software{phased_array_systems,
238
316
  title = {phased-array-systems: Phased Array Antenna System Design and Optimization},
239
- author = {{phased-array-systems contributors}},
240
- year = {2024},
317
+ author = {John Hodge},
318
+ year = {2026},
241
319
  url = {https://github.com/jman4162/phased-array-systems}
242
320
  }
243
321
  ```