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.
- phased_array_systems-0.9.0/.claude/settings.local 2.json +45 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/.github/workflows/ci.yml +6 -1
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/.gitignore +3 -0
- phased_array_systems-0.9.0/CHANGELOG.md +216 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/CLAUDE.md +34 -5
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/PKG-INFO +109 -31
- phased_array_systems-0.9.0/README.md +274 -0
- phased_array_systems-0.9.0/app/pages/1_Single_Case.py +407 -0
- phased_array_systems-0.9.0/app/pages/2_Trade_Study.py +423 -0
- phased_array_systems-0.9.0/app/pages/3_RF_Cascade.py +494 -0
- phased_array_systems-0.9.0/app/pages/4_Radar_Detection.py +526 -0
- phased_array_systems-0.9.0/app/requirements.txt +10 -0
- phased_array_systems-0.9.0/app/streamlit_app.py +156 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/index.md +4 -0
- phased_array_systems-0.9.0/docs/api/models/digital.md +286 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/models/index.md +2 -0
- phased_array_systems-0.9.0/docs/api/models/rf.md +281 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/models/swapc.md +1 -4
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/trades.md +8 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/viz.md +8 -0
- phased_array_systems-0.9.0/docs/changelog.md +85 -0
- phased_array_systems-0.9.0/docs/cli/optimize.md +68 -0
- phased_array_systems-0.9.0/docs/cli/sensitivity.md +58 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/getting-started/installation.md +1 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/index.md +2 -2
- phased_array_systems-0.9.0/docs/theory/validation.md +48 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/tutorials/index.md +5 -1
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/index.md +1 -0
- phased_array_systems-0.9.0/docs/user-guide/mdao.md +122 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/examples/01_comms_single_case.py +7 -3
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/examples/02_comms_doe_trade.py +4 -2
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/examples/03_radar_detection_trade.py +5 -7
- phased_array_systems-0.9.0/examples/04_taper_trade_study.py +117 -0
- phased_array_systems-0.9.0/examples/05_optimization.py +122 -0
- phased_array_systems-0.9.0/examples/06_dbf_architecture_trade.py +144 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/examples/configs/comms_basic.yaml +23 -1
- phased_array_systems-0.9.0/examples/configs/dbf_architecture_doe.yaml +105 -0
- phased_array_systems-0.9.0/examples/configs/radar_basic.yaml +72 -0
- phased_array_systems-0.9.0/examples/configs/radar_doe.yaml +76 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/mkdocs.yml +6 -0
- phased_array_systems-0.9.0/notebooks/tutorial_dbf_architecture_trade.ipynb +694 -0
- phased_array_systems-0.9.0/notebooks/tutorial_mdao_workflow.ipynb +523 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/notebooks/tutorial_phased_array_trade_study.ipynb +84 -50
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/pyproject.toml +10 -3
- phased_array_systems-0.9.0/scripts/slopcheck.sh +101 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/__about__.py +1 -1
- phased_array_systems-0.9.0/src/phased_array_systems/__init__.py +88 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/architecture/__init__.py +4 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/architecture/config.py +142 -11
- phased_array_systems-0.9.0/src/phased_array_systems/cli.py +820 -0
- phased_array_systems-0.9.0/src/phased_array_systems/evaluate.py +344 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/exporters.py +7 -3
- phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/__init__.py +58 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/adapter.py +380 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/errors.py +182 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/grating.py +35 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/antenna/metrics.py +15 -11
- phased_array_systems-0.9.0/src/phased_array_systems/models/antenna/taper.py +374 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/comms/__init__.py +19 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/comms/link_budget.py +65 -17
- phased_array_systems-0.9.0/src/phased_array_systems/models/comms/propagation.py +212 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/digital/bandwidth.py +3 -26
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/digital/converters.py +66 -36
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/digital/scheduling.py +30 -48
- phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/__init__.py +38 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p676.py +186 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p676_data.py +96 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p838.py +90 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/itu_p838_data.py +57 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/propagation/path.py +79 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/radar/__init__.py +87 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/radar/cfar.py +308 -0
- phased_array_systems-0.9.0/src/phased_array_systems/models/radar/clutter.py +360 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/radar/detection.py +42 -106
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/radar/equation.py +186 -26
- phased_array_systems-0.9.0/src/phased_array_systems/models/radar/propagation.py +312 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/rf/__init__.py +29 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/rf/cascade.py +21 -67
- phased_array_systems-0.9.0/src/phased_array_systems/models/rf/reliability.py +602 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/swapc/cost.py +0 -17
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/swapc/power.py +49 -8
- phased_array_systems-0.9.0/src/phased_array_systems/py.typed +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/html.py +109 -12
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/markdown.py +51 -11
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/scenarios/comms.py +15 -6
- phased_array_systems-0.9.0/src/phased_array_systems/scenarios/radar.py +140 -0
- phased_array_systems-0.9.0/src/phased_array_systems/trades/__init__.py +30 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/design_space.py +87 -5
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/doe.py +62 -11
- phased_array_systems-0.9.0/src/phased_array_systems/trades/moo.py +188 -0
- phased_array_systems-0.9.0/src/phased_array_systems/trades/optimization.py +298 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/pareto.py +11 -11
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/trades/runner.py +9 -7
- phased_array_systems-0.9.0/src/phased_array_systems/trades/sensitivity.py +292 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/types.py +1 -1
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/viz/__init__.py +4 -0
- phased_array_systems-0.9.0/src/phased_array_systems/viz/interactive.py +231 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/viz/plots.py +94 -15
- phased_array_systems-0.9.0/tests/conftest.py +120 -0
- phased_array_systems-0.9.0/tests/data/golden_dbf_case.json +77 -0
- phased_array_systems-0.9.0/tests/test_antenna_adapter.py +575 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_architecture.py +7 -10
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_cli.py +218 -1
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_comms_link_budget.py +154 -5
- phased_array_systems-0.9.0/tests/test_digital.py +399 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_doe.py +73 -0
- phased_array_systems-0.9.0/tests/test_evaluate.py +637 -0
- phased_array_systems-0.9.0/tests/test_golden_case.py +114 -0
- phased_array_systems-0.9.0/tests/test_interactive_viz.py +75 -0
- phased_array_systems-0.9.0/tests/test_io.py +306 -0
- phased_array_systems-0.9.0/tests/test_moo.py +129 -0
- phased_array_systems-0.9.0/tests/test_optimization.py +299 -0
- phased_array_systems-0.9.0/tests/test_radar.py +908 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_reports.py +14 -12
- phased_array_systems-0.9.0/tests/test_rf_cascade.py +222 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_runner.py +105 -0
- phased_array_systems-0.9.0/tests/test_sensitivity.py +156 -0
- phased_array_systems-0.9.0/tests/test_sobol.py +83 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_swapc.py +93 -5
- phased_array_systems-0.9.0/tests/test_validation.py +377 -0
- phased_array_systems-0.4.0/CHANGELOG.md +0 -77
- phased_array_systems-0.4.0/README.md +0 -200
- phased_array_systems-0.4.0/docs/changelog.md +0 -29
- phased_array_systems-0.4.0/src/phased_array_systems/__init__.py +0 -10
- phased_array_systems-0.4.0/src/phased_array_systems/cli.py +0 -376
- phased_array_systems-0.4.0/src/phased_array_systems/evaluate.py +0 -138
- phased_array_systems-0.4.0/src/phased_array_systems/models/antenna/__init__.py +0 -15
- phased_array_systems-0.4.0/src/phased_array_systems/models/antenna/adapter.py +0 -190
- phased_array_systems-0.4.0/src/phased_array_systems/models/comms/__init__.py +0 -9
- phased_array_systems-0.4.0/src/phased_array_systems/models/comms/propagation.py +0 -84
- phased_array_systems-0.4.0/src/phased_array_systems/models/radar/__init__.py +0 -25
- phased_array_systems-0.4.0/src/phased_array_systems/scenarios/radar.py +0 -61
- phased_array_systems-0.4.0/src/phased_array_systems/trades/__init__.py +0 -16
- phased_array_systems-0.4.0/tests/test_antenna_adapter.py +0 -179
- phased_array_systems-0.4.0/tests/test_evaluate.py +0 -219
- phased_array_systems-0.4.0/tests/test_radar.py +0 -365
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/.github/workflows/docs.yml +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/.github/workflows/publish.yml +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/CONTRIBUTING.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/LICENSE +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/architecture.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/io.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/models/antenna.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/models/comms.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/models/radar.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/reports.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/requirements.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/api/scenarios.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/cli/doe.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/cli/index.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/cli/pareto.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/cli/report.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/cli/run.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/contributing.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/faq.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/getting-started/concepts.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/getting-started/index.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/getting-started/quickstart.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/javascripts/mathjax.js +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/stylesheets/extra.css +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/theory/index.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/theory/link-budget-equations.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/theory/pareto-optimization.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/theory/phased-arrays.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/theory/radar-equation.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/tutorials/comms-trade-study.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/tutorials/config-driven-workflow.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/tutorials/radar-detection-trade.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/tutorials/sensitivity-analysis.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/architecture.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/link-budget.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/pareto-analysis.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/radar-detection.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/reports.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/requirements.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/scenarios.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/trade-studies.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/docs/user-guide/visualization.md +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/examples/configs/comms_doe.yaml +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/ruff.toml +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/constants.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/__init__.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/config_loader.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/io/schema.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/__init__.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/base.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/digital/__init__.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/radar/integration.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/models/swapc/__init__.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/__init__.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/reports/generator.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/requirements/__init__.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/requirements/core.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/scenarios/__init__.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/scenarios/base.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/utils/__init__.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/src/phased_array_systems/utils/hashing.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/__init__.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_pareto.py +0 -0
- {phased_array_systems-0.4.0 → phased_array_systems-0.9.0}/tests/test_requirements.py +0 -0
- {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
|
|
@@ -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.
|
|
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,
|
|
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
|
-
- `
|
|
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.
|
|
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 ::
|
|
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.
|
|
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
|
[](https://github.com/jman4162/phased-array-systems/actions/workflows/ci.yml)
|
|
55
59
|
[](https://jman4162.github.io/phased-array-systems)
|
|
60
|
+
[](https://phased-array-systems.streamlit.app)
|
|
56
61
|
[](https://badge.fury.io/py/phased-array-systems)
|
|
62
|
+
[](https://pypi.org/project/phased-array-systems/)
|
|
57
63
|
[](https://www.python.org/downloads/)
|
|
58
64
|
[](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
|
|
71
|
-
- **
|
|
72
|
-
- **
|
|
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
|
-
|
|
91
|
+
Pareto Extraction
|
|
92
|
+
↓
|
|
93
|
+
Reports ← Visualization ← Optimization ←────────────┘
|
|
82
94
|
```
|
|
83
95
|
|
|
84
96
|
## Features
|
|
85
97
|
|
|
86
|
-
- **Requirements as first-class objects**:
|
|
87
|
-
- **Trade-space exploration**: DOE
|
|
88
|
-
- **
|
|
89
|
-
- **
|
|
90
|
-
- **
|
|
91
|
-
- **
|
|
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
|
-
#
|
|
99
|
-
pip install phased-array-systems[
|
|
116
|
+
# Multi-objective optimization + Sobol sensitivity (pymoo, SALib)
|
|
117
|
+
pip install "phased-array-systems[mdao]"
|
|
100
118
|
|
|
101
|
-
#
|
|
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
|
|
111
|
-
from phased_array_systems
|
|
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
|
|
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
|
|
213
|
+
### Tutorial Notebooks
|
|
168
214
|
|
|
169
|
-
|
|
215
|
+
Try the interactive tutorials in Google Colab:
|
|
170
216
|
|
|
171
|
-
|
|
217
|
+
- Trade study basics: [](https://colab.research.google.com/github/jman4162/phased-array-systems/blob/main/notebooks/tutorial_phased_array_trade_study.ipynb)
|
|
218
|
+
- DBF architecture trade: [](https://colab.research.google.com/github/jman4162/phased-array-systems/blob/main/notebooks/tutorial_dbf_architecture_trade.ipynb)
|
|
219
|
+
- MDAO workflow (NSGA-II + Sobol): [](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
|
-
#
|
|
216
|
-
pasys
|
|
266
|
+
# Scalarized optimization (differential evolution)
|
|
267
|
+
pasys optimize config.yaml --objective eirp_dbw --sense maximize
|
|
217
268
|
|
|
218
|
-
#
|
|
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
|
+
[](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 = {
|
|
240
|
-
year = {
|
|
317
|
+
author = {John Hodge},
|
|
318
|
+
year = {2026},
|
|
241
319
|
url = {https://github.com/jman4162/phased-array-systems}
|
|
242
320
|
}
|
|
243
321
|
```
|