This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
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.
Core dependency: phased-array-modeling>=1.2.0 (provides array geometries, steering, tapering, impairments, and pattern visualization)
Project status: v0.6.0 - All 4 implementation phases complete plus optimization solvers. See package_design_and_requirements.txt for the original SDD.
All GitHub commits and attributions for this repository should be attributed to:
- Name: John Hodge
- GitHub: jman4162
- Email: jah70@vt.edu
# Installation
pip install -e . # Editable install
pip install -e ".[dev]" # Development deps (pytest, ruff, mypy)
pip install -e ".[plotting]" # Visualization (plotly, kaleido)
# Testing
pytest tests/ # Run all tests
pytest tests/test_comms_link_budget.py -v # Run specific test file
pytest tests/ --cov=phased_array_systems # With coverage
# Linting & Formatting
ruff check .
ruff format .
mypy src/phased_array_systems
# CLI
pasys run config.yaml # Single case evaluation
pasys doe config.yaml # DOE batch study
pasys optimize config.yaml --objective eirp_dbw --sense maximize # Optimization
pasys pareto results.parquet --x cost_usd --y eirp_dbw # Pareto analysis
pasys report results.parquet -o report.html # Generate HTML report- Layer 0:
phased-array-modeling(external) - EM/pattern computations - Layer 1: This package - system models, trade studies, optimization
- Layer 2: Interfaces - Python API, CLI, config I/O
requirements/- Constraint/objective definitions, verification reportsarchitecture/- ArrayConfig, RFChainConfig, CostConfig, DigitalConfig, ReliabilityConfigmodels/antenna/- Adapter wrappingphased-array-modeling, pattern metrics extractionmodels/comms/- Link budget (SNR, margin, EIRP), propagation modelsmodels/radar/- Radar equation, PD/PFA threshold helpers, integration gainsmodels/swapc/- Power, thermal, and cost modelsmodels/rf/- RF cascade analysis (Friis NF, IIP3, SFDR), TRM reliability modelsmodels/digital/- ADC/DAC converters, beamformer bandwidth/ops, schedulingtrades/- DOE generation, batch runner, Pareto extraction, optimization solversviz/- Plots (Pareto, scatter-matrix), HTML/Markdown report generationio/- Config loading (YAML/JSON), results export (Parquet/CSV)cli.py-pasyscommand entrypoint
ModelBlock Protocol:
class ModelBlock(Protocol):
name: str
def evaluate(self, arch: Architecture, scenario: Scenario, context: dict) -> dict:
"""Returns flat metrics dict"""Canonical Metrics Dictionary (universal exchange format):
- Antenna:
g_peak_db,beamwidth_az_deg,beamwidth_el_deg,sll_db,scan_loss_db - Comms:
eirp_dbw,path_loss_db,snr_rx_db,link_margin_db - Radar:
snr_single_pulse_db,snr_required_db,snr_margin_db,pd,pfa - RF Cascade:
cascade_nf_db,cascade_gain_db,cascade_iip3_dbm,cascade_oip3_dbm,cascade_sfdr_db,cascade_mds_dbm - Digital:
adc_enob,adc_snr_db,bf_data_rate_gbps,bf_compute_gops,processing_margin_db,fpga_utilization_pct - Reliability:
trm_mtbf_hours,array_mtbf_hours,expected_failed_elements,array_availability - SWaP-C:
prime_power_w,weight_kg,cost_usd - Metadata:
meta.case_id,meta.runtime_s,meta.seed,meta.error
Config (YAML/JSON) → Pydantic validation → [Architecture + Scenario + RequirementSet]
→ DOE case generation → Batch evaluation (parallel, cached)
→ Requirement verification → Pareto extraction → Optimization → Visualization/Reports
- Requirements as first-class objects - Every run produces pass/fail + margins with traceability
- Trade-space first - DOE + Pareto over single-point designs; grey-out infeasible cases
- Flat metrics dictionary - All models return consistent
dict[str, float]for interchange - Config-driven reproducibility - Stable case IDs, seed control, version stamping
- Safe configs - No
eval(), data-driven configs only - Case-level error handling - DOE runs never crash for single-case failures
All phases are complete as of v0.4.0, with v0.5.0 adding digital/RF models and v0.6.0 adding optimization:
-
Phase 1 (MVP): ✅ Complete
- Pydantic schemas for Architecture, Scenario, RequirementSet
- YAML/JSON config loader with validation
- Requirements verification with pass/fail and margin reporting
- Antenna adapter wrapping
phased-array-modeling - Comms link budget model (EIRP, path loss, SNR, margins)
-
Phase 2: ✅ Complete
- DOE generator with full-factorial and Latin hypercube sampling
- Batch runner with parallel execution and resume capability
- Pareto extraction for multi-objective optimization
- Interactive plots (Pareto fronts, scatter matrices)
- Parquet/CSV export for results
-
Phase 3: ✅ Complete
- Radar equation model (SNR, detection range)
- Detection threshold helpers (PD/PFA calculations)
- Integration gain for pulse integration
- Radar trade study examples
-
Phase 4: ✅ Complete
pasysCLI with run, doe, pareto, and report commands- HTML and Markdown report generation
- Ready for PyPI publish
-
Phase 5 (v0.5.0): ✅ Complete
- RF cascade analysis (Friis NF, IIP3, SFDR, MDS)
- TRM reliability and graceful degradation models
- Digital beamformer models (ADC/DAC, bandwidth, scheduling)
- DigitalConfig and ReliabilityConfig in Architecture
-
Phase 6 (v0.6.0): ✅ Complete
- Design optimization via scipy solvers (DE, dual annealing, L-BFGS-B)
- Weighted multi-objective scalarization with constraint penalties
pasys optimizeCLI command- Unit tests for RF cascade and digital models
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.