phased-array-systems 0.1.0__tar.gz → 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/.gitignore +1 -0
  2. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/PKG-INFO +1 -1
  3. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/__about__.py +1 -1
  4. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/models/antenna/metrics.py +2 -1
  5. phased_array_systems-0.1.0/package_design_and_requirements.txt +0 -531
  6. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/.github/workflows/ci.yml +0 -0
  7. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/.github/workflows/publish.yml +0 -0
  8. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/CLAUDE.md +0 -0
  9. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/LICENSE +0 -0
  10. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/README.md +0 -0
  11. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/examples/01_comms_single_case.py +0 -0
  12. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/examples/02_comms_doe_trade.py +0 -0
  13. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/examples/configs/comms_basic.yaml +0 -0
  14. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/examples/configs/comms_doe.yaml +0 -0
  15. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/notebooks/tutorial_phased_array_trade_study.ipynb +0 -0
  16. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/pyproject.toml +0 -0
  17. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/ruff.toml +0 -0
  18. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/__init__.py +0 -0
  19. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/architecture/__init__.py +0 -0
  20. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/architecture/config.py +0 -0
  21. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/cli.py +0 -0
  22. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/constants.py +0 -0
  23. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/evaluate.py +0 -0
  24. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/io/__init__.py +0 -0
  25. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/io/config_loader.py +0 -0
  26. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/io/exporters.py +0 -0
  27. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/io/schema.py +0 -0
  28. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/models/__init__.py +0 -0
  29. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/models/antenna/__init__.py +0 -0
  30. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/models/antenna/adapter.py +0 -0
  31. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/models/base.py +0 -0
  32. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/models/comms/__init__.py +0 -0
  33. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/models/comms/link_budget.py +0 -0
  34. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/models/comms/propagation.py +0 -0
  35. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/models/swapc/__init__.py +0 -0
  36. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/models/swapc/cost.py +0 -0
  37. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/models/swapc/power.py +0 -0
  38. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/requirements/__init__.py +0 -0
  39. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/requirements/core.py +0 -0
  40. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/scenarios/__init__.py +0 -0
  41. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/scenarios/base.py +0 -0
  42. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/scenarios/comms.py +0 -0
  43. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/scenarios/radar.py +0 -0
  44. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/trades/__init__.py +0 -0
  45. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/trades/design_space.py +0 -0
  46. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/trades/doe.py +0 -0
  47. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/trades/pareto.py +0 -0
  48. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/trades/runner.py +0 -0
  49. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/types.py +0 -0
  50. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/utils/__init__.py +0 -0
  51. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/utils/hashing.py +0 -0
  52. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/viz/__init__.py +0 -0
  53. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/src/phased_array_systems/viz/plots.py +0 -0
  54. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/tests/__init__.py +0 -0
  55. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/tests/test_antenna_adapter.py +0 -0
  56. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/tests/test_architecture.py +0 -0
  57. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/tests/test_comms_link_budget.py +0 -0
  58. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/tests/test_doe.py +0 -0
  59. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/tests/test_evaluate.py +0 -0
  60. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/tests/test_pareto.py +0 -0
  61. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/tests/test_requirements.py +0 -0
  62. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/tests/test_runner.py +0 -0
  63. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/tests/test_swapc.py +0 -0
  64. {phased_array_systems-0.1.0 → phased_array_systems-0.1.2}/tests/test_viz.py +0 -0
@@ -144,3 +144,4 @@ results/
144
144
  *.parquet
145
145
  *.csv
146
146
  !examples/configs/*.yaml
147
+ package_design_and_requirements.txt
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: phased-array-systems
3
- Version: 0.1.0
3
+ Version: 0.1.2
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://github.com/jman4162/phased-array-systems#readme
@@ -1,4 +1,4 @@
1
1
  """Version and metadata for phased-array-systems."""
2
2
 
3
- __version__ = "0.1.0"
3
+ __version__ = "0.1.2"
4
4
  __author__ = "phased-array-systems contributors"
@@ -119,7 +119,8 @@ def compute_scan_loss(scan_angle_deg: float, model: str = "cosine") -> float:
119
119
  if loss_linear <= 0:
120
120
  return float("inf")
121
121
 
122
- return -10 * math.log10(loss_linear)
122
+ loss_db = -10 * math.log10(loss_linear)
123
+ return abs(loss_db) if abs(loss_db) < 1e-10 else loss_db # Avoid -0.0 display
123
124
 
124
125
 
125
126
  def compute_array_gain(n_elements: int, element_gain_db: float = 0.0) -> float:
@@ -1,531 +0,0 @@
1
- ```markdown
2
- # Phased Array Systems — Software Design Document (SDD) & Requirements
3
- **Package name (working):** `phased-array-systems`
4
- **Purpose:** Open-source Python package for phased array antenna **system design**, **optimization**, and **performance visualization** for advanced **wireless communications** and **radar** applications.
5
- **Core dependency:** [`phased-array-modeling`](https://pypi.org/project/phased-array-modeling/) / [`Phased-Array-Antenna-Model`](https://github.com/jman4162/Phased-Array-Antenna-Model)
6
-
7
- ---
8
-
9
- ## Table of Contents
10
- 1. Purpose and Scope
11
- 2. Design Principles (MBSE/MDAO Inspired)
12
- 3. Users and Primary Use Cases
13
- 4. Non-Goals
14
- 5. System Overview and Architecture
15
- - 5.1 High-level Architecture
16
- - 5.2 Package Structure (Completed)
17
- 6. Operating Concept and End-to-End Flows
18
- 7. External Dependencies and Versioning
19
- 8. System Boundary and Interfaces
20
- 9. Key Design Decisions
21
- 10. Canonical Metrics Dictionary Contract
22
- 11. Error Handling, Logging, and Diagnostics
23
- 12. Security, Licensing, and Compliance
24
- 13. Testing, Documentation, and Release Engineering
25
- 14. Detailed Component Specifications
26
- 15. Trade Study and Optimization Engine Design
27
- 16. Visualization and Reporting
28
- 17. Configuration Schema (YAML/JSON)
29
- 18. Caching, Performance, and Scaling
30
- 19. Plugin Architecture (Extensibility)
31
- 20. Repository Deliverables and Acceptance Criteria
32
- 21. Build Plan (Agent-Ready Work Breakdown)
33
- 22. Appendices (Templates, Examples, Future Work)
34
-
35
- ---
36
-
37
- ## 1) Purpose and Scope
38
- Build a Python package that supports:
39
- - **Antenna + beamforming modeling** via `phased-array-modeling`
40
- - **System-level performance modeling** (comms link budget, radar detection)
41
- - **SWaP-C + cost modeling** (parametric)
42
- - **Trade studies** (DOE, sensitivity, Pareto)
43
- - **Optimization** (constrained, multi-objective optional)
44
- - **Performance visualization** and **report generation**
45
- - **Requirements capture & verification** (lightweight MBSE traceability)
46
-
47
- This package is meant to encapsulate your model-based engineering / MDAO workflow: connect requirements → architecture → analytical models → trade studies → Pareto selection → reporting.
48
-
49
- ---
50
-
51
- ## 2) Design Principles (MBSE/MDAO Inspired)
52
- 1. **Traceability:** Requirements are first-class objects; every run produces pass/fail + margins.
53
- 2. **Composability:** Performance = integrated blocks (antenna + RF + propagation + radar/comms + SWaP-C).
54
- 3. **Trade-space first:** DOE + constraint filtering + Pareto > single-point “best” design.
55
- 4. **Fidelity growth:** Start fast with analytical models; optionally import “installed patterns” later.
56
- 5. **Reproducibility:** Config-driven runs; stable case IDs; seed control; version stamping.
57
-
58
- ---
59
-
60
- ## 3) Users and Primary Use Cases
61
- ### Personas
62
- - Phased array systems engineer (architecture trades)
63
- - Radar engineer (detection / search performance)
64
- - Wireless comms engineer (link margin, EIRP, multi-beam trades)
65
- - Researcher/educator (reproducible notebooks)
66
-
67
- ### Use Cases
68
- - Comms link feasibility & power–aperture trades
69
- - Radar detection margin vs range/RCS vs aperture
70
- - Architecture comparison (element/tile/subarray choices vs requirements)
71
- - Sensitivity analysis (scatter matrices, correlation, optional Sobol)
72
- - Constrained optimization (min cost/weight/power while meeting margins)
73
-
74
- ---
75
-
76
- ## 4) Non-Goals
77
- - Not a full-wave EM solver (HFSS/CST/FEKO replacement).
78
- - Not a SysML authoring environment.
79
- - Not a real-time DSP radar tracker; this is a design-time trade tool.
80
-
81
- ---
82
-
83
- ## 5) System Overview and Architecture
84
-
85
- ### 5.1 High-level Architecture
86
-
87
- **Layer 0 — Antenna modeling dependency**
88
- - `phased-array-modeling`: geometry + weights + impairments + pattern + visualization primitives.
89
-
90
- **Layer 1 — System models (this package)**
91
- - Requirements & verification
92
- - Architecture description (array + RF + SWaP-C + cost)
93
- - Comms / radar performance models
94
- - Trade study + optimization engine
95
- - Visualization + reporting
96
-
97
- **Layer 2 — Interfaces**
98
- - Python API + CLI
99
- - Config IO (YAML/JSON)
100
- - Results export (CSV/Parquet/JSON)
101
- - Optional installed-pattern import adapters
102
-
103
- ---
104
-
105
- ### 5.2 Package Structure (Completed)
106
-
107
- #### A) Top-level repository structure
108
- ```
109
-
110
- phased-array-systems/
111
- ├─ README.md
112
- ├─ LICENSE
113
- ├─ CHANGELOG.md
114
- ├─ CITATION.cff
115
- ├─ pyproject.toml
116
- ├─ ruff.toml
117
- ├─ .gitignore
118
- ├─ .github/
119
- │ └─ workflows/
120
- │ ├─ ci.yml # lint + test + build
121
- │ └─ publish.yml # publish to PyPI on tag
122
- ├─ docs/
123
- │ ├─ index.md
124
- │ ├─ quickstart.md
125
- │ ├─ tutorials/
126
- │ │ ├─ comms_trade_study.md
127
- │ │ ├─ radar_detection.md
128
- │ │ ├─ doe_pareto.md
129
- │ │ └─ impairments_sensitivity.md
130
- │ └─ sdd.md # this document
131
- ├─ examples/
132
- │ ├─ 01_comms_trade_study.py
133
- │ ├─ 02_radar_detection_trade.py
134
- │ ├─ 03_multiobjective_pareto.py
135
- │ ├─ 04_impairments_sensitivity.py
136
- │ └─ configs/
137
- │ ├─ comms_trade.yaml
138
- │ └─ radar_trade.yaml
139
- ├─ src/
140
- │ └─ phased_array_systems/
141
- │ ├─ **init**.py
142
- │ ├─ **about**.py # version, metadata
143
- │ ├─ cli.py # pasys entrypoint
144
- │ ├─ constants.py # physical constants, defaults
145
- │ ├─ types.py # shared type aliases / protocols
146
- │ ├─ requirements/
147
- │ │ ├─ **init**.py
148
- │ │ ├─ core.py # Requirement, RequirementSet, VerificationReport
149
- │ │ └─ expressions.py # declarative ops, safe expression helpers
150
- │ ├─ architecture/
151
- │ │ ├─ **init**.py
152
- │ │ ├─ config.py # Architecture, ArrayConfig, RFChainConfig, etc.
153
- │ │ └─ variants.py # baseline + override support
154
- │ ├─ scenarios/
155
- │ │ ├─ **init**.py
156
- │ │ ├─ base.py # Scenario protocol/base
157
- │ │ ├─ comms.py # CommsLinkScenario schema
158
- │ │ └─ radar.py # RadarDetectionScenario schema
159
- │ ├─ models/
160
- │ │ ├─ **init**.py
161
- │ │ ├─ base.py # ModelBlock protocol (evaluate contract)
162
- │ │ ├─ antenna/
163
- │ │ │ ├─ **init**.py
164
- │ │ │ ├─ adapter.py # wraps phased-array-modeling
165
- │ │ │ ├─ metrics.py # beamwidth/SLL/scan loss extraction
166
- │ │ │ └─ installed.py # optional installed-pattern override interface
167
- │ │ ├─ comms/
168
- │ │ │ ├─ **init**.py
169
- │ │ │ ├─ link_budget.py # SNR, margin, EIRP, noise
170
- │ │ │ └─ propagation.py # FSPL default, hooks for ITU-R
171
- │ │ ├─ radar/
172
- │ │ │ ├─ **init**.py
173
- │ │ │ ├─ radar_eq.py # radar equation utilities
174
- │ │ │ └─ detection.py # PD/PFA threshold helpers + integration gains
175
- │ │ ├─ swapc/
176
- │ │ │ ├─ **init**.py
177
- │ │ │ ├─ power.py # prime power, PA efficiency, beam split
178
- │ │ │ ├─ thermal.py # simple thermal models (optional early)
179
- │ │ │ └─ cost.py # parametric cost models
180
- │ │ └─ mission/
181
- │ │ ├─ **init**.py
182
- │ │ └─ scoring.py # optional mission-level scoring functions
183
- │ ├─ trades/
184
- │ │ ├─ **init**.py
185
- │ │ ├─ design_space.py # variable definitions, bounds, categorical vars
186
- │ │ ├─ doe.py # sampling (grid, random, LHS, Sobol optional)
187
- │ │ ├─ runner.py # batch eval, parallelism, resume
188
- │ │ ├─ pareto.py # pareto extraction, knee points, ranking
189
- │ │ ├─ optimize.py # constrained optimization wrappers
190
- │ │ └─ sensitivity.py # correlation, scatter-matrix helpers
191
- │ ├─ viz/
192
- │ │ ├─ **init**.py
193
- │ │ ├─ plots.py # pareto, scatter, constraint shading
194
- │ │ ├─ dashboards.py # optional interactive plotly dashboards
195
- │ │ └─ reports.py # HTML/Markdown report generation
196
- │ ├─ io/
197
- │ │ ├─ **init**.py
198
- │ │ ├─ schema.py # pydantic schemas: config + results
199
- │ │ ├─ config_loader.py # YAML/JSON load/validate + overrides
200
- │ │ ├─ exporters.py # CSV/JSON/Parquet
201
- │ │ └─ importers.py # requirements import, installed pattern import
202
- │ └─ utils/
203
- │ ├─ **init**.py
204
- │ ├─ cache.py # LRU + disk cache
205
- │ ├─ hashing.py # stable case IDs
206
- │ └─ logging.py # logging setup
207
- └─ tests/
208
- ├─ test_requirements.py
209
- ├─ test_comms_link_budget.py
210
- ├─ test_radar_equation.py
211
- ├─ test_antenna_adapter_small.py
212
- ├─ test_doe_runner_resume.py
213
- └─ data/
214
- ├─ golden_case_config.yaml
215
- └─ golden_case_results.json
216
-
217
- ````
218
-
219
- #### B) Key internal contracts (cross-module)
220
- - **Metrics dictionary** is the universal exchange format.
221
- - **ModelBlock** interface: `evaluate(arch, scenario, context) -> metrics`.
222
- - **RequirementSet** verifies metrics and produces `VerificationReport`.
223
- - **Runner** orchestrates evaluation pipelines and records metadata, errors, and timing.
224
-
225
- ---
226
-
227
- ## 6) Operating Concept and End-to-End Flows
228
-
229
- ### 6.1 Single design evaluation (“Design Report”)
230
- 1. Load/validate config
231
- 2. Build `Architecture` + `Scenario` + `RequirementSet`
232
- 3. Antenna adapter computes pattern metrics
233
- 4. Comms/radar model computes performance metrics
234
- 5. SWaP-C + cost models compute non-performance metrics
235
- 6. Verify requirements
236
- 7. Produce report + exports
237
-
238
- ### 6.2 DOE trade study flow
239
- 1. Create DOE cases from `DesignSpace`
240
- 2. Evaluate each case (parallel + cached)
241
- 3. Filter infeasible designs
242
- 4. Extract Pareto front + knee point(s)
243
- 5. Plot + report
244
-
245
- ### 6.3 Optimization flow
246
- 1. Choose solver (scipy baseline; multiobjective optional)
247
- 2. Iterate evaluate → verify → score
248
- 3. Return best design + traceability artifact
249
-
250
- ---
251
-
252
- ## 7) External Dependencies and Versioning
253
-
254
- ### Runtime deps (baseline)
255
- - `phased-array-modeling>=1.2.0`
256
- - `numpy`, `scipy`
257
- - `pydantic`
258
- - `matplotlib`
259
- - `pandas` *or* `polars` (choose one initially)
260
-
261
- ### Optional extras
262
- - `plotly`, `kaleido` (interactive/export)
263
- - `joblib` (disk cache)
264
- - `pint` (units)
265
- - `pymoo` / `nevergrad` (mixed multiobjective)
266
-
267
- ### Versioning
268
- - SemVer
269
- - Outputs always store: package version, dependency versions, seed, and (if available) git SHA.
270
-
271
- ---
272
-
273
- ## 8) System Boundary and Interfaces
274
- ### In-scope
275
- - Python API
276
- - CLI (`pasys`)
277
- - Config IO (YAML/JSON)
278
- - Results export (CSV/Parquet/JSON)
279
- - HTML/Markdown reporting
280
-
281
- ### Out-of-scope (v0.1)
282
- - GUI application
283
- - Direct SysML tool integration (only import/export mappings)
284
-
285
- ---
286
-
287
- ## 9) Key Design Decisions
288
- 1. Delegate array pattern generation to `phased-array-modeling`.
289
- 2. Use a flat, stable **metrics dictionary** for all model interchange.
290
- 3. Treat requirements as data (declarative ops) with safe extension hooks.
291
- 4. Make DOE+Pareto pipeline first-class and reproducible (case IDs + seeds).
292
-
293
- ---
294
-
295
- ## 10) Canonical Metrics Dictionary Contract (Keys + Units)
296
-
297
- ### Antenna
298
- - `g_peak_db` (dBi-like proxy)
299
- - `beamwidth_az_deg`, `beamwidth_el_deg`
300
- - `sll_db`
301
- - `scan_angle_deg`
302
- - `scan_loss_db`
303
-
304
- ### Comms
305
- - `eirp_dbw`
306
- - `path_loss_db`
307
- - `rx_power_dbw`
308
- - `noise_power_dbw`
309
- - `snr_rx_db`
310
- - `required_snr_db`
311
- - `link_margin_db`
312
-
313
- ### Radar
314
- - `snr_single_pulse_db`
315
- - `snr_required_db`
316
- - `snr_margin_db`
317
- - `pd`, `pfa`
318
- - `rcs_m2`, `range_m`
319
-
320
- ### SWaP-C
321
- - `prime_power_w`
322
- - `dc_power_w`
323
- - `weight_kg`
324
- - `cost_usd`
325
- - `power_density_w_per_kg` (optional)
326
-
327
- ### Metadata (namespaced)
328
- - `meta.case_id`
329
- - `meta.runtime_s`
330
- - `meta.seed`
331
- - `meta.error`
332
- - `meta.error_type`
333
- - `meta.phased_array_modeling_version`
334
- - `meta.phased_array_systems_version`
335
-
336
- ---
337
-
338
- ## 11) Error Handling, Logging, and Diagnostics
339
- - Single-case runs: raise structured exceptions with context.
340
- - DOE runs: never crash the whole job for one case; record per-case error fields.
341
- - Store “failed cases” subset and export minimal reproducer config.
342
-
343
- ---
344
-
345
- ## 12) Security, Licensing, and Compliance
346
- - Configs are data-only (no `eval()`).
347
- - Recommend MIT or BSD-3 (ensure compatible with dependency).
348
- - Include LICENSE, optional CITATION.cff.
349
-
350
- ---
351
-
352
- ## 13) Testing, Documentation, and Release Engineering
353
- ### Testing
354
- - Unit tests: requirements, comms link budget sanity, radar equation sanity, antenna adapter metrics.
355
- - Regression: golden-case snapshots (config + results).
356
- - Batch runner test: resume behavior.
357
-
358
- ### Docs
359
- - Quickstart
360
- - Tutorials for comms, radar, DOE+Pareto, impairments sensitivity
361
-
362
- ### Release
363
- - GitHub Actions: lint + tests + build
364
- - Publish to PyPI on version tags
365
-
366
- ---
367
-
368
- ## 14) Detailed Component Specifications
369
-
370
- ### 14.1 Requirements (`requirements/`)
371
- - `Requirement` supports declarative constraints or safe callables for complex logic.
372
- - `RequirementSet.verify(metrics)` returns pass/fail + per-requirement margins.
373
-
374
- ### 14.2 Architecture (`architecture/`)
375
- - `Architecture` contains `ArrayConfig`, `RFChainConfig`, `PowerThermalConfig`, `CostConfig`.
376
- - Support variants/overrides for trade studies (baseline + deltas).
377
-
378
- ### 14.3 Antenna adapter (`models/antenna/`)
379
- - Wrap `phased-array-modeling` to compute patterns and extract consistent metrics.
380
- - Provide pattern caching keyed by config + angle grid hash.
381
-
382
- ### 14.4 Comms models (`models/comms/`)
383
- - Link budget produces SNR + margin and exposes propagation model hooks.
384
-
385
- ### 14.5 Radar models (`models/radar/`)
386
- - Radar equation utilities + detection threshold helpers (PD/PFA) with user override option.
387
-
388
- ### 14.6 SWaP-C + Cost (`models/swapc/`)
389
- - Parametric power, cost, and (optional early) thermal models; extendable by plugins.
390
-
391
- ---
392
-
393
- ## 15) Trade Study and Optimization Engine (`trades/`)
394
-
395
- ### DOE
396
- - Methods: grid/random/LHS (Sobol optional)
397
- - Deterministic seeds; stable `case_id`
398
-
399
- ### Batch runner
400
- - Parallel evaluation, case-level resume, exception capture
401
-
402
- ### Pareto
403
- - Feasibility filter → Pareto front → ranking + knee points
404
-
405
- ### Optimization
406
- - Start: `scipy.optimize` (SLSQP/COBYLA)
407
- - Optional: multiobjective mixed-variable solver extras
408
-
409
- ---
410
-
411
- ## 16) Visualization and Reporting (`viz/`)
412
- - Pareto plots, 3D scatter (optional), scatter-matrix, constraint margin histograms
413
- - Report generator: HTML/Markdown with reproducibility footer
414
-
415
- ---
416
-
417
- ## 17) Configuration Schema (YAML/JSON)
418
-
419
- ### Example config (abbreviated)
420
- ```yaml
421
- study:
422
- name: power_aperture_trade
423
- seed: 123
424
- scenario:
425
- type: comms_link
426
- freq_hz: 1.0e10
427
- bandwidth_hz: 1.0e8
428
- range_m: 200000
429
- required_snr_db: 14
430
- requirements:
431
- - id: REQ_LINK_MARGIN
432
- metric_key: link_margin_db
433
- op: ">="
434
- value: 3
435
- design_space:
436
- variables:
437
- nx: {type: int, low: 8, high: 64}
438
- ny: {type: int, low: 8, high: 64}
439
- tx_power_w_per_elem: {type: float, low: 0.5, high: 10.0}
440
- doe:
441
- method: lhs
442
- n_samples: 2000
443
- objectives:
444
- - metric_key: eirp_dbw
445
- direction: maximize
446
- - metric_key: cost_usd
447
- direction: minimize
448
- ````
449
-
450
- ---
451
-
452
- ## 18) Caching, Performance, and Scaling
453
-
454
- * Multi-layer caching: pattern cache + case cache
455
- * Fidelity presets: `fast`, `balanced`, `fidelity`
456
- * Resume and disk caching recommended for large DOE runs
457
-
458
- ---
459
-
460
- ## 19) Plugin Architecture (Extensibility)
461
-
462
- * Define `ModelBlock` protocol and allow registry of:
463
-
464
- * propagation models
465
- * cost models
466
- * thermal models
467
- * mission scoring models
468
- * Optional: setuptools entrypoints for plugin discovery
469
-
470
- ---
471
-
472
- ## 20) Deliverables and Acceptance Criteria (v0.1)
473
-
474
- * `pip install phased-array-systems`
475
- * One comms DOE example: results + Pareto + report
476
- * One radar detection example: margin report
477
- * CI passing
478
- * Docs + tutorials
479
-
480
- ---
481
-
482
- ## 21) Build Plan (Agent-Ready Work Breakdown)
483
-
484
- ### Phase 1: Core scaffolding (MVP)
485
-
486
- * schemas + config loader
487
- * requirements verification
488
- * antenna adapter wrapper
489
- * comms link budget model + SWaP-C placeholders
490
- * single-case report
491
-
492
- ### Phase 2: Trade + viz
493
-
494
- * DOE generator + batch runner + resume
495
- * Pareto extraction + plots
496
- * Parquet export
497
-
498
- ### Phase 3: Radar
499
-
500
- * radar equation + detection threshold helpers
501
- * radar trade example + plots
502
-
503
- ### Phase 4: CLI + reporting
504
-
505
- * `pasys run`, `pasys doe`, `pasys pareto`
506
- * publish-ready packaging
507
-
508
- ---
509
-
510
- ## 22) Appendices
511
-
512
- ### A) Trade Study Templates
513
-
514
- * Power–aperture comms trade: maximize EIRP / margin vs minimize power/cost
515
- * EIRP vs cost vs prime power 3D Pareto exploration
516
- * Radar detection margin vs range/RCS with integration knobs
517
-
518
- ### B) Future Work
519
-
520
- * Installed-pattern importers for common EM tool exports
521
- * Beam scheduling/time-sharing models
522
- * Thermal derating models
523
- * Calibration / error budgets for radar & comms chains
524
-
525
- ---
526
-
527
- **End of document**
528
-
529
- ```
530
- ::contentReference[oaicite:0]{index=0}
531
- ```