rfmeasurement 0.1.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.
- rfmeasurement-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +36 -0
- rfmeasurement-0.1.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- rfmeasurement-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +27 -0
- rfmeasurement-0.1.0/.github/ISSUE_TEMPLATE/scientific_question.yml +22 -0
- rfmeasurement-0.1.0/.github/dependabot.yml +10 -0
- rfmeasurement-0.1.0/.github/workflows/ci.yml +82 -0
- rfmeasurement-0.1.0/.github/workflows/release.yml +50 -0
- rfmeasurement-0.1.0/.gitignore +16 -0
- rfmeasurement-0.1.0/.readthedocs.yaml +17 -0
- rfmeasurement-0.1.0/CHANGELOG.md +46 -0
- rfmeasurement-0.1.0/CITATION.cff +12 -0
- rfmeasurement-0.1.0/CODE_OF_CONDUCT.md +64 -0
- rfmeasurement-0.1.0/CONTRIBUTING.md +74 -0
- rfmeasurement-0.1.0/LICENSE +29 -0
- rfmeasurement-0.1.0/PKG-INFO +154 -0
- rfmeasurement-0.1.0/README.md +92 -0
- rfmeasurement-0.1.0/SECURITY.md +24 -0
- rfmeasurement-0.1.0/benchmarks/.gitkeep +0 -0
- rfmeasurement-0.1.0/docs/MANIFEST.md +20 -0
- rfmeasurement-0.1.0/docs/README.md +16 -0
- rfmeasurement-0.1.0/docs/adr/0001-build-on-scikit-rf.md +44 -0
- rfmeasurement-0.1.0/docs/adr/0002-src-layout-and-module-boundaries.md +43 -0
- rfmeasurement-0.1.0/docs/adr/0003-bsd-3-clause-license.md +38 -0
- rfmeasurement-0.1.0/docs/adr/0004-supported-python-versions.md +42 -0
- rfmeasurement-0.1.0/docs/adr/README.md +16 -0
- rfmeasurement-0.1.0/docs/adr/template.md +24 -0
- rfmeasurement-0.1.0/docs/api-specification.md +1436 -0
- rfmeasurement-0.1.0/docs/architecture.md +105 -0
- rfmeasurement-0.1.0/docs/contributing.md +87 -0
- rfmeasurement-0.1.0/docs/domain-model.md +123 -0
- rfmeasurement-0.1.0/docs/governance.md +87 -0
- rfmeasurement-0.1.0/docs/index.md +87 -0
- rfmeasurement-0.1.0/docs/joss-strategy.md +133 -0
- rfmeasurement-0.1.0/docs/measurement-quality.md +124 -0
- rfmeasurement-0.1.0/docs/repository-organization.md +147 -0
- rfmeasurement-0.1.0/docs/reproducibility.md +122 -0
- rfmeasurement-0.1.0/docs/requirements.md +113 -0
- rfmeasurement-0.1.0/docs/research-plan.md +143 -0
- rfmeasurement-0.1.0/docs/roadmap.md +124 -0
- rfmeasurement-0.1.0/docs/scope.md +119 -0
- rfmeasurement-0.1.0/docs/sphinx/Makefile +15 -0
- rfmeasurement-0.1.0/docs/sphinx/_static/.gitkeep +0 -0
- rfmeasurement-0.1.0/docs/sphinx/api/index.md +42 -0
- rfmeasurement-0.1.0/docs/sphinx/conf.py +44 -0
- rfmeasurement-0.1.0/docs/sphinx/contributing.md +41 -0
- rfmeasurement-0.1.0/docs/sphinx/index.md +29 -0
- rfmeasurement-0.1.0/docs/sphinx/installation.md +17 -0
- rfmeasurement-0.1.0/docs/sphinx/license.md +14 -0
- rfmeasurement-0.1.0/docs/sphinx/publications.md +13 -0
- rfmeasurement-0.1.0/docs/testing-validation.md +122 -0
- rfmeasurement-0.1.0/docs/uncertainty.md +163 -0
- rfmeasurement-0.1.0/docs/vision.md +72 -0
- rfmeasurement-0.1.0/examples/.gitkeep +0 -0
- rfmeasurement-0.1.0/examples/01_validate_measurement.py +91 -0
- rfmeasurement-0.1.0/examples/02_propagate_uncertainty.py +157 -0
- rfmeasurement-0.1.0/pyproject.toml +64 -0
- rfmeasurement-0.1.0/src/rfmeasurement/__init__.py +3 -0
- rfmeasurement-0.1.0/src/rfmeasurement/analysis/__init__.py +0 -0
- rfmeasurement-0.1.0/src/rfmeasurement/domain/__init__.py +38 -0
- rfmeasurement-0.1.0/src/rfmeasurement/domain/analysis.py +32 -0
- rfmeasurement-0.1.0/src/rfmeasurement/domain/budget.py +44 -0
- rfmeasurement-0.1.0/src/rfmeasurement/domain/context.py +35 -0
- rfmeasurement-0.1.0/src/rfmeasurement/domain/enums.py +41 -0
- rfmeasurement-0.1.0/src/rfmeasurement/domain/measurand.py +19 -0
- rfmeasurement-0.1.0/src/rfmeasurement/domain/measurement.py +29 -0
- rfmeasurement-0.1.0/src/rfmeasurement/domain/provenance.py +23 -0
- rfmeasurement-0.1.0/src/rfmeasurement/domain/uncertainty.py +30 -0
- rfmeasurement-0.1.0/src/rfmeasurement/domain/uncertainty_model.py +29 -0
- rfmeasurement-0.1.0/src/rfmeasurement/domain/validation.py +50 -0
- rfmeasurement-0.1.0/src/rfmeasurement/integrations/__init__.py +0 -0
- rfmeasurement-0.1.0/src/rfmeasurement/io/__init__.py +0 -0
- rfmeasurement-0.1.0/src/rfmeasurement/provenance/__init__.py +0 -0
- rfmeasurement-0.1.0/src/rfmeasurement/reporting/__init__.py +0 -0
- rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/__init__.py +34 -0
- rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/budget.py +44 -0
- rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/covariance.py +47 -0
- rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/coverage.py +53 -0
- rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/distributions.py +68 -0
- rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/linear.py +90 -0
- rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/monte_carlo.py +112 -0
- rfmeasurement-0.1.0/src/rfmeasurement/validation/__init__.py +26 -0
- rfmeasurement-0.1.0/src/rfmeasurement/validation/base.py +39 -0
- rfmeasurement-0.1.0/src/rfmeasurement/validation/engine.py +39 -0
- rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/__init__.py +18 -0
- rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/continuity.py +59 -0
- rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/data_integrity.py +48 -0
- rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/dynamic_range.py +54 -0
- rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/finite_values.py +41 -0
- rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/frequency_grid.py +55 -0
- rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/physical_consistency.py +73 -0
- rfmeasurement-0.1.0/tests/data/.gitkeep +0 -0
- rfmeasurement-0.1.0/tests/integration/.gitkeep +0 -0
- rfmeasurement-0.1.0/tests/regression/.gitkeep +0 -0
- rfmeasurement-0.1.0/tests/scientific/.gitkeep +0 -0
- rfmeasurement-0.1.0/tests/unit/domain/test_analysis.py +28 -0
- rfmeasurement-0.1.0/tests/unit/domain/test_budget.py +37 -0
- rfmeasurement-0.1.0/tests/unit/domain/test_context.py +22 -0
- rfmeasurement-0.1.0/tests/unit/domain/test_enums.py +37 -0
- rfmeasurement-0.1.0/tests/unit/domain/test_measurand.py +17 -0
- rfmeasurement-0.1.0/tests/unit/domain/test_measurement.py +25 -0
- rfmeasurement-0.1.0/tests/unit/domain/test_provenance.py +23 -0
- rfmeasurement-0.1.0/tests/unit/domain/test_uncertainty.py +28 -0
- rfmeasurement-0.1.0/tests/unit/domain/test_uncertainty_model.py +25 -0
- rfmeasurement-0.1.0/tests/unit/domain/test_validation.py +31 -0
- rfmeasurement-0.1.0/tests/unit/test_package.py +6 -0
- rfmeasurement-0.1.0/tests/unit/uncertainty/_helpers.py +26 -0
- rfmeasurement-0.1.0/tests/unit/uncertainty/test_build_budget.py +38 -0
- rfmeasurement-0.1.0/tests/unit/uncertainty/test_covariance.py +43 -0
- rfmeasurement-0.1.0/tests/unit/uncertainty/test_coverage.py +44 -0
- rfmeasurement-0.1.0/tests/unit/uncertainty/test_distributions.py +67 -0
- rfmeasurement-0.1.0/tests/unit/uncertainty/test_linear.py +116 -0
- rfmeasurement-0.1.0/tests/unit/uncertainty/test_monte_carlo.py +115 -0
- rfmeasurement-0.1.0/tests/unit/validation/_synthetic.py +61 -0
- rfmeasurement-0.1.0/tests/unit/validation/test_base.py +23 -0
- rfmeasurement-0.1.0/tests/unit/validation/test_continuity.py +18 -0
- rfmeasurement-0.1.0/tests/unit/validation/test_data_integrity.py +18 -0
- rfmeasurement-0.1.0/tests/unit/validation/test_dynamic_range.py +20 -0
- rfmeasurement-0.1.0/tests/unit/validation/test_engine.py +37 -0
- rfmeasurement-0.1.0/tests/unit/validation/test_finite_values.py +17 -0
- rfmeasurement-0.1.0/tests/unit/validation/test_frequency_grid.py +21 -0
- rfmeasurement-0.1.0/tests/unit/validation/test_physical_consistency.py +30 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report incorrect or unexpected behavior in rfmeasurement.
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: description
|
|
7
|
+
attributes:
|
|
8
|
+
label: Description
|
|
9
|
+
description: What happened, and what did you expect instead?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: reproduction
|
|
14
|
+
attributes:
|
|
15
|
+
label: Minimal reproducible example
|
|
16
|
+
description: A minimal, self-contained code snippet that reproduces the issue.
|
|
17
|
+
render: python
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
- type: input
|
|
21
|
+
id: version
|
|
22
|
+
attributes:
|
|
23
|
+
label: rfmeasurement version
|
|
24
|
+
validations:
|
|
25
|
+
required: true
|
|
26
|
+
- type: input
|
|
27
|
+
id: python-version
|
|
28
|
+
attributes:
|
|
29
|
+
label: Python version
|
|
30
|
+
validations:
|
|
31
|
+
required: true
|
|
32
|
+
- type: textarea
|
|
33
|
+
id: environment
|
|
34
|
+
attributes:
|
|
35
|
+
label: Environment
|
|
36
|
+
description: OS, relevant dependency versions (scikit-rf, numpy, ...).
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Propose new functionality for rfmeasurement.
|
|
3
|
+
labels: ["enhancement"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: motivation
|
|
7
|
+
attributes:
|
|
8
|
+
label: Motivation
|
|
9
|
+
description: What problem does this solve? Reference docs/scope.md if relevant.
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: proposal
|
|
14
|
+
attributes:
|
|
15
|
+
label: Proposed solution
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: alternatives
|
|
20
|
+
attributes:
|
|
21
|
+
label: Alternatives considered
|
|
22
|
+
- type: checkboxes
|
|
23
|
+
id: scope-check
|
|
24
|
+
attributes:
|
|
25
|
+
label: Scope
|
|
26
|
+
options:
|
|
27
|
+
- label: I have checked docs/scope.md and believe this is in scope for the core package.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: Scientific question or concern
|
|
2
|
+
description: Question about a validation rule, uncertainty method, or scientific assumption.
|
|
3
|
+
labels: ["scientific-review"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: topic
|
|
7
|
+
attributes:
|
|
8
|
+
label: Method or module in question
|
|
9
|
+
description: Which validation rule, uncertainty model, or algorithm does this concern?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: concern
|
|
14
|
+
attributes:
|
|
15
|
+
label: Question or concern
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: references
|
|
20
|
+
attributes:
|
|
21
|
+
label: References
|
|
22
|
+
description: Standards, papers, or textbooks relevant to this question.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
name: test (py${{ matrix.python-version }})
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
strategy:
|
|
13
|
+
fail-fast: false
|
|
14
|
+
matrix:
|
|
15
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
20
|
+
uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: ${{ matrix.python-version }}
|
|
23
|
+
|
|
24
|
+
- name: Install package
|
|
25
|
+
run: python -m pip install -e ".[dev]"
|
|
26
|
+
|
|
27
|
+
- name: Lint
|
|
28
|
+
run: ruff check .
|
|
29
|
+
|
|
30
|
+
- name: Type check
|
|
31
|
+
run: mypy src/rfmeasurement
|
|
32
|
+
|
|
33
|
+
- name: Run tests
|
|
34
|
+
run: pytest --cov=rfmeasurement --cov-report=term-missing
|
|
35
|
+
|
|
36
|
+
docs:
|
|
37
|
+
name: docs-check
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/checkout@v4
|
|
41
|
+
- name: Check for broken relative links in docs
|
|
42
|
+
run: |
|
|
43
|
+
python - <<'EOF'
|
|
44
|
+
import pathlib
|
|
45
|
+
import re
|
|
46
|
+
import sys
|
|
47
|
+
|
|
48
|
+
root = pathlib.Path(".")
|
|
49
|
+
docs = list(root.glob("docs/**/*.md")) + [root / "README.md"]
|
|
50
|
+
link_re = re.compile(r"\]\(([^)]+)\)")
|
|
51
|
+
missing = []
|
|
52
|
+
for doc in docs:
|
|
53
|
+
text = doc.read_text(encoding="utf-8")
|
|
54
|
+
for target in link_re.findall(text):
|
|
55
|
+
if target.startswith(("http://", "https://", "#", "mailto:")):
|
|
56
|
+
continue
|
|
57
|
+
target_path = (doc.parent / target.split("#")[0]).resolve()
|
|
58
|
+
if not target_path.exists():
|
|
59
|
+
missing.append(f"{doc}: {target}")
|
|
60
|
+
if missing:
|
|
61
|
+
print("Broken relative links found:")
|
|
62
|
+
for m in missing:
|
|
63
|
+
print(f" {m}")
|
|
64
|
+
sys.exit(1)
|
|
65
|
+
EOF
|
|
66
|
+
|
|
67
|
+
sphinx-docs:
|
|
68
|
+
name: sphinx-build
|
|
69
|
+
runs-on: ubuntu-latest
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/checkout@v4
|
|
72
|
+
|
|
73
|
+
- name: Set up Python
|
|
74
|
+
uses: actions/setup-python@v5
|
|
75
|
+
with:
|
|
76
|
+
python-version: "3.12"
|
|
77
|
+
|
|
78
|
+
- name: Install package with docs extras
|
|
79
|
+
run: python -m pip install -e ".[docs]"
|
|
80
|
+
|
|
81
|
+
- name: Build Sphinx docs (warnings as errors)
|
|
82
|
+
run: sphinx-build -b html -W docs/sphinx docs/sphinx/_build/html
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
name: Build sdist and wheel
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
|
|
15
|
+
- name: Set up Python
|
|
16
|
+
uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.12"
|
|
19
|
+
|
|
20
|
+
- name: Install build backend
|
|
21
|
+
run: python -m pip install build
|
|
22
|
+
|
|
23
|
+
- name: Build distributions
|
|
24
|
+
run: python -m build
|
|
25
|
+
|
|
26
|
+
- name: Check distributions
|
|
27
|
+
run: python -m pip install twine && twine check dist/*
|
|
28
|
+
|
|
29
|
+
- uses: actions/upload-artifact@v4
|
|
30
|
+
with:
|
|
31
|
+
name: dist
|
|
32
|
+
path: dist/
|
|
33
|
+
|
|
34
|
+
publish:
|
|
35
|
+
name: Publish to PyPI
|
|
36
|
+
needs: build
|
|
37
|
+
runs-on: ubuntu-latest
|
|
38
|
+
environment:
|
|
39
|
+
name: pypi
|
|
40
|
+
url: https://pypi.org/project/rfmeasurement/
|
|
41
|
+
permissions:
|
|
42
|
+
id-token: write
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/download-artifact@v4
|
|
45
|
+
with:
|
|
46
|
+
name: dist
|
|
47
|
+
path: dist/
|
|
48
|
+
|
|
49
|
+
- name: Publish to PyPI
|
|
50
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project 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/)
|
|
7
|
+
once a stable API is released.
|
|
8
|
+
|
|
9
|
+
## [Unreleased]
|
|
10
|
+
|
|
11
|
+
## [0.1.0] - 2026-08-22
|
|
12
|
+
|
|
13
|
+
First tagged release. The public API is not yet stable (pre-1.0 semantic
|
|
14
|
+
versioning): expect breaking changes in `0.x` releases. See
|
|
15
|
+
[docs/roadmap.md](docs/roadmap.md) for what is and is not implemented yet --
|
|
16
|
+
notably, there is no dedicated I/O/adapter layer, provenance persistence, or
|
|
17
|
+
reporting output beyond the in-memory domain objects.
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- **Project foundation** (Phase 0): BSD-3-Clause license, code of conduct,
|
|
22
|
+
contributing guide, issue templates, CI (tests, lint, type checks, docs
|
|
23
|
+
build), `src/` package layout, and initial Architecture Decision Records.
|
|
24
|
+
- **Domain model** (Phase 1): `Measurement`, `MeasurementContext`,
|
|
25
|
+
`Measurand`, `ProvenanceRecord`, `AnalysisResult`, `ValidationResult` /
|
|
26
|
+
`ValidationReport`, and `UncertaintySource`, wrapping `skrf.Network` rather
|
|
27
|
+
than reimplementing RF network mathematics.
|
|
28
|
+
- **Measurement-quality validation engine** (Phase 2): a composable
|
|
29
|
+
`ValidationRule` interface and seven rules (structural integrity, finite
|
|
30
|
+
values, frequency-grid consistency, passivity, reciprocity, continuity,
|
|
31
|
+
dynamic-range indicator), producing a structured `ValidationReport`.
|
|
32
|
+
- **Uncertainty quantification engine** (Phase 3): `UncertaintyModel` and
|
|
33
|
+
`UncertaintyBudget` domain objects; Type A/B distribution sampling;
|
|
34
|
+
covariance-aware linear (GUM) propagation; Monte Carlo propagation with
|
|
35
|
+
correlated-normal sampling; ranked uncertainty budgets; and coverage
|
|
36
|
+
intervals (Gaussian and empirical).
|
|
37
|
+
- Published documentation on Read the Docs
|
|
38
|
+
(<https://rfmeasurement.readthedocs.io/en/latest/>), built with Sphinx +
|
|
39
|
+
MyST from docstrings, alongside the project design specification in
|
|
40
|
+
`docs/`.
|
|
41
|
+
- Two runnable examples: validating a synthetic measurement
|
|
42
|
+
(`examples/01_validate_measurement.py`) and propagating uncertainty
|
|
43
|
+
through a nonlinear dB conversion (`examples/02_propagate_uncertainty.py`).
|
|
44
|
+
|
|
45
|
+
[Unreleased]: https://github.com/telmomm/rfmeasurement/compare/v0.1.0...HEAD
|
|
46
|
+
[0.1.0]: https://github.com/telmomm/rfmeasurement/releases/tag/v0.1.0
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use this software, please cite it as below."
|
|
3
|
+
title: "rfmeasurement: an open-source framework for uncertainty-aware validation and reproducible analysis of RF measurements"
|
|
4
|
+
type: software
|
|
5
|
+
authors:
|
|
6
|
+
- family-names: "Miguel-Medina"
|
|
7
|
+
given-names: "Telmo"
|
|
8
|
+
orcid: "https://orcid.org/0009-0004-0654-6650"
|
|
9
|
+
repository-code: "https://github.com/telmomm/rfmeasurement"
|
|
10
|
+
license: BSD-3-Clause
|
|
11
|
+
version: 0.1.0
|
|
12
|
+
date-released: "2026-08-22"
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
We as members, contributors, and leaders pledge to make participation in
|
|
6
|
+
our community a harassment-free experience for everyone, regardless of
|
|
7
|
+
age, body size, visible or invisible disability, ethnicity, sex
|
|
8
|
+
characteristics, gender identity and expression, level of experience,
|
|
9
|
+
education, socio-economic status, nationality, personal appearance, race,
|
|
10
|
+
religion, or sexual identity and orientation.
|
|
11
|
+
|
|
12
|
+
We pledge to act and interact in ways that contribute to an open,
|
|
13
|
+
welcoming, diverse, inclusive, and healthy community.
|
|
14
|
+
|
|
15
|
+
## Our Standards
|
|
16
|
+
|
|
17
|
+
Examples of behavior that contributes to a positive environment:
|
|
18
|
+
|
|
19
|
+
- demonstrating empathy and kindness toward other people;
|
|
20
|
+
- being respectful of differing opinions, viewpoints, and experiences;
|
|
21
|
+
- giving and gracefully accepting constructive feedback;
|
|
22
|
+
- accepting responsibility and apologizing for mistakes, and learning
|
|
23
|
+
from the experience;
|
|
24
|
+
- focusing on what is best not just for us as individuals, but for the
|
|
25
|
+
overall community and the scientific integrity of the project.
|
|
26
|
+
|
|
27
|
+
Examples of unacceptable behavior:
|
|
28
|
+
|
|
29
|
+
- the use of sexualized language or imagery, and sexual attention or
|
|
30
|
+
advances of any kind;
|
|
31
|
+
- trolling, insulting or derogatory comments, and personal or political
|
|
32
|
+
attacks;
|
|
33
|
+
- public or private harassment;
|
|
34
|
+
- publishing others' private information without explicit permission;
|
|
35
|
+
- other conduct which could reasonably be considered inappropriate in a
|
|
36
|
+
professional setting.
|
|
37
|
+
|
|
38
|
+
## Enforcement Responsibilities
|
|
39
|
+
|
|
40
|
+
Project maintainers are responsible for clarifying and enforcing our
|
|
41
|
+
standards of acceptable behavior and will take appropriate and fair
|
|
42
|
+
corrective action in response to any behavior that they deem
|
|
43
|
+
inappropriate, threatening, offensive, or harmful.
|
|
44
|
+
|
|
45
|
+
## Scope
|
|
46
|
+
|
|
47
|
+
This Code of Conduct applies within all community spaces (issues, pull
|
|
48
|
+
requests, discussions) and also applies when an individual is officially
|
|
49
|
+
representing the project in public spaces.
|
|
50
|
+
|
|
51
|
+
## Enforcement
|
|
52
|
+
|
|
53
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may
|
|
54
|
+
be reported to the maintainers by opening a confidential issue or
|
|
55
|
+
contacting them directly. All complaints will be reviewed and
|
|
56
|
+
investigated promptly and fairly.
|
|
57
|
+
|
|
58
|
+
## Attribution
|
|
59
|
+
|
|
60
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
|
61
|
+
version 2.1, available at
|
|
62
|
+
<https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.
|
|
63
|
+
|
|
64
|
+
[homepage]: https://www.contributor-covenant.org
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Contributing to rfmeasurement
|
|
2
|
+
|
|
3
|
+
Thank you for considering a contribution. The project is developed in the
|
|
4
|
+
open from its earliest stages; the full contribution philosophy is
|
|
5
|
+
documented in [docs/contributing.md](docs/contributing.md) and the
|
|
6
|
+
[governance model](docs/governance.md). This file gives the practical
|
|
7
|
+
mechanics.
|
|
8
|
+
|
|
9
|
+
## Getting started
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
git clone https://github.com/telmomm/rfmeasurement.git
|
|
13
|
+
cd rfmeasurement
|
|
14
|
+
python -m pip install -e ".[dev]"
|
|
15
|
+
pytest
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Before opening a pull request
|
|
19
|
+
|
|
20
|
+
1. Search existing issues to avoid duplicate work.
|
|
21
|
+
2. Explain the motivation, ideally by referencing or opening an issue.
|
|
22
|
+
3. Keep changes focused on a single concern.
|
|
23
|
+
4. Add or update tests (see [docs/testing-validation.md](docs/testing-validation.md)
|
|
24
|
+
for the test pyramid: unit, integration, scientific, regression).
|
|
25
|
+
5. Update documentation, including docstrings and relevant files under `docs/`.
|
|
26
|
+
6. Describe any scientific assumptions made.
|
|
27
|
+
7. Update `CHANGELOG.md` when the change is user-visible.
|
|
28
|
+
|
|
29
|
+
## Scientific contributions
|
|
30
|
+
|
|
31
|
+
A pull request implementing a scientific method (validation rule,
|
|
32
|
+
uncertainty model, propagation algorithm, etc.) should additionally
|
|
33
|
+
include:
|
|
34
|
+
|
|
35
|
+
- references to the method (standard, paper, or textbook);
|
|
36
|
+
- the mathematical definition;
|
|
37
|
+
- assumptions and limitations;
|
|
38
|
+
- a validation strategy (analytical reference, independently verified
|
|
39
|
+
example, or comparison with an established implementation);
|
|
40
|
+
- comparison with existing implementations where possible.
|
|
41
|
+
|
|
42
|
+
Experimental or heuristic algorithms must be clearly labeled as such and
|
|
43
|
+
must not be presented as validated metrology methods without evidence.
|
|
44
|
+
|
|
45
|
+
## API changes
|
|
46
|
+
|
|
47
|
+
Public API changes should be discussed in an issue or discussion before
|
|
48
|
+
implementation. Breaking changes require explicit justification and
|
|
49
|
+
should be called out prominently in `CHANGELOG.md`.
|
|
50
|
+
|
|
51
|
+
## Code review
|
|
52
|
+
|
|
53
|
+
Reviewers assess correctness, tests, API clarity, documentation,
|
|
54
|
+
numerical stability, scientific validity, and maintainability.
|
|
55
|
+
|
|
56
|
+
## Code style
|
|
57
|
+
|
|
58
|
+
- Format and lint with `ruff`.
|
|
59
|
+
- Type-check with `mypy` where annotations are present.
|
|
60
|
+
- Follow the `src/` layout described in
|
|
61
|
+
[docs/repository-organization.md](docs/repository-organization.md).
|
|
62
|
+
|
|
63
|
+
## Reporting bugs and asking questions
|
|
64
|
+
|
|
65
|
+
Use the GitHub issue templates for bug reports, feature requests, and
|
|
66
|
+
scientific questions. A bug report should include a minimal reproducible
|
|
67
|
+
example whenever possible. Use GitHub Discussions for open-ended
|
|
68
|
+
architectural or scientific-direction questions.
|
|
69
|
+
|
|
70
|
+
## Attribution
|
|
71
|
+
|
|
72
|
+
Contributors receive appropriate credit. When a contribution is
|
|
73
|
+
substantial to the scientific software, authorship or formal
|
|
74
|
+
acknowledgement will be discussed transparently with the contributor.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, rfmeasurement contributors
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
22
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
23
|
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
24
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
25
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
26
|
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
27
|
+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
28
|
+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
29
|
+
POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: rfmeasurement
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: An open-source framework for uncertainty-aware validation and reproducible analysis of RF measurements.
|
|
5
|
+
Project-URL: Homepage, https://github.com/telmomm/rfmeasurement
|
|
6
|
+
Project-URL: Documentation, https://rfmeasurement.readthedocs.io/en/latest/
|
|
7
|
+
Project-URL: Issues, https://github.com/telmomm/rfmeasurement/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/telmomm/rfmeasurement/blob/main/CHANGELOG.md
|
|
9
|
+
Author: rfmeasurement contributors
|
|
10
|
+
License: BSD 3-Clause License
|
|
11
|
+
|
|
12
|
+
Copyright (c) 2026, rfmeasurement contributors
|
|
13
|
+
|
|
14
|
+
Redistribution and use in source and binary forms, with or without
|
|
15
|
+
modification, are permitted provided that the following conditions are met:
|
|
16
|
+
|
|
17
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
18
|
+
list of conditions and the following disclaimer.
|
|
19
|
+
|
|
20
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
21
|
+
this list of conditions and the following disclaimer in the documentation
|
|
22
|
+
and/or other materials provided with the distribution.
|
|
23
|
+
|
|
24
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
25
|
+
contributors may be used to endorse or promote products derived from
|
|
26
|
+
this software without specific prior written permission.
|
|
27
|
+
|
|
28
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
29
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
30
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
31
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
32
|
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
33
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
34
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
35
|
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
36
|
+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
37
|
+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
38
|
+
POSSIBILITY OF SUCH DAMAGE.
|
|
39
|
+
License-File: LICENSE
|
|
40
|
+
Classifier: Development Status :: 3 - Alpha
|
|
41
|
+
Classifier: Intended Audience :: Science/Research
|
|
42
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
43
|
+
Classifier: Programming Language :: Python :: 3
|
|
44
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
45
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
46
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
47
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
48
|
+
Classifier: Topic :: Scientific/Engineering
|
|
49
|
+
Requires-Python: >=3.10
|
|
50
|
+
Requires-Dist: numpy>=1.24
|
|
51
|
+
Requires-Dist: scikit-rf>=1.0
|
|
52
|
+
Provides-Extra: dev
|
|
53
|
+
Requires-Dist: mypy; extra == 'dev'
|
|
54
|
+
Requires-Dist: pytest-cov; extra == 'dev'
|
|
55
|
+
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
56
|
+
Requires-Dist: ruff; extra == 'dev'
|
|
57
|
+
Provides-Extra: docs
|
|
58
|
+
Requires-Dist: myst-parser>=2.0; extra == 'docs'
|
|
59
|
+
Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'docs'
|
|
60
|
+
Requires-Dist: sphinx>=7.0; extra == 'docs'
|
|
61
|
+
Description-Content-Type: text/markdown
|
|
62
|
+
|
|
63
|
+
# rfmeasurement
|
|
64
|
+
|
|
65
|
+
[](https://rfmeasurement.readthedocs.io/en/latest/?badge=latest)
|
|
66
|
+
|
|
67
|
+
An open-source Python framework for uncertainty-aware validation and
|
|
68
|
+
reproducible analysis of RF measurements.
|
|
69
|
+
|
|
70
|
+
> **Status: early alpha (`0.1.0`).** The public API is not yet stable and
|
|
71
|
+
> may change without notice between `0.x` releases. See the
|
|
72
|
+
> [roadmap](docs/roadmap.md) for current progress and the
|
|
73
|
+
> [changelog](CHANGELOG.md) for release notes.
|
|
74
|
+
|
|
75
|
+
**Documentation:** <https://rfmeasurement.readthedocs.io/en/latest/>
|
|
76
|
+
|
|
77
|
+
## Statement of need
|
|
78
|
+
|
|
79
|
+
RF measurement data (S-parameters and related quantities) is commonly
|
|
80
|
+
analyzed without a structured record of measurement quality, uncertainty,
|
|
81
|
+
or provenance. `rfmeasurement` adds a layer on top of established RF
|
|
82
|
+
network-analysis tooling to turn raw measurement data into **validated,
|
|
83
|
+
uncertainty-aware, reproducible scientific results**.
|
|
84
|
+
|
|
85
|
+
> Do not only report an RF result. Report how the result was obtained,
|
|
86
|
+
> how trustworthy the measurement is, and what uncertainty contributes to
|
|
87
|
+
> the final value.
|
|
88
|
+
|
|
89
|
+
`rfmeasurement` does not replace [scikit-rf](https://scikit-rf.readthedocs.io/);
|
|
90
|
+
it builds on it, focusing on measurement provenance, measurement-quality
|
|
91
|
+
assessment, uncertainty modelling and propagation, and reproducible
|
|
92
|
+
reporting. See [docs/scope.md](docs/scope.md) for the boundary between the
|
|
93
|
+
two projects.
|
|
94
|
+
|
|
95
|
+
## Documentation
|
|
96
|
+
|
|
97
|
+
The published documentation (installation, API reference, contributing,
|
|
98
|
+
license) is at <https://rfmeasurement.readthedocs.io/en/latest/>.
|
|
99
|
+
|
|
100
|
+
The full design and development specification lives in [docs/](docs/index.md):
|
|
101
|
+
|
|
102
|
+
- [Vision](docs/vision.md)
|
|
103
|
+
- [Scope](docs/scope.md)
|
|
104
|
+
- [Requirements](docs/requirements.md)
|
|
105
|
+
- [Architecture](docs/architecture.md)
|
|
106
|
+
- [Domain model](docs/domain-model.md)
|
|
107
|
+
- [API specification](docs/api-specification.md)
|
|
108
|
+
- [Uncertainty](docs/uncertainty.md)
|
|
109
|
+
- [Measurement quality](docs/measurement-quality.md)
|
|
110
|
+
- [Reproducibility](docs/reproducibility.md)
|
|
111
|
+
- [Roadmap](docs/roadmap.md)
|
|
112
|
+
- [Repository organisation](docs/repository-organization.md)
|
|
113
|
+
- [Testing and validation](docs/testing-validation.md)
|
|
114
|
+
- [Architecture Decision Records](docs/adr/)
|
|
115
|
+
|
|
116
|
+
## Installation
|
|
117
|
+
|
|
118
|
+
Not yet published to PyPI. Install from a tagged release or from source:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
pip install "rfmeasurement @ git+https://github.com/telmomm/rfmeasurement.git@v0.1.0"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
For development:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
git clone https://github.com/telmomm/rfmeasurement.git
|
|
128
|
+
cd rfmeasurement
|
|
129
|
+
python -m pip install -e ".[dev]"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Supported Python versions: 3.10, 3.11, 3.12, 3.13.
|
|
133
|
+
|
|
134
|
+
## Development
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
pytest
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for how to propose changes,
|
|
141
|
+
including scientific contributions.
|
|
142
|
+
|
|
143
|
+
## Citation
|
|
144
|
+
|
|
145
|
+
If you use `rfmeasurement` in research, please cite it using the metadata
|
|
146
|
+
in [CITATION.cff](CITATION.cff).
|
|
147
|
+
|
|
148
|
+
## License
|
|
149
|
+
|
|
150
|
+
BSD 3-Clause License. See [LICENSE](LICENSE).
|
|
151
|
+
|
|
152
|
+
## Code of conduct
|
|
153
|
+
|
|
154
|
+
This project follows the [Contributor Covenant](CODE_OF_CONDUCT.md).
|