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