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.
Files changed (121) hide show
  1. rfmeasurement-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +36 -0
  2. rfmeasurement-0.1.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. rfmeasurement-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +27 -0
  4. rfmeasurement-0.1.0/.github/ISSUE_TEMPLATE/scientific_question.yml +22 -0
  5. rfmeasurement-0.1.0/.github/dependabot.yml +10 -0
  6. rfmeasurement-0.1.0/.github/workflows/ci.yml +82 -0
  7. rfmeasurement-0.1.0/.github/workflows/release.yml +50 -0
  8. rfmeasurement-0.1.0/.gitignore +16 -0
  9. rfmeasurement-0.1.0/.readthedocs.yaml +17 -0
  10. rfmeasurement-0.1.0/CHANGELOG.md +46 -0
  11. rfmeasurement-0.1.0/CITATION.cff +12 -0
  12. rfmeasurement-0.1.0/CODE_OF_CONDUCT.md +64 -0
  13. rfmeasurement-0.1.0/CONTRIBUTING.md +74 -0
  14. rfmeasurement-0.1.0/LICENSE +29 -0
  15. rfmeasurement-0.1.0/PKG-INFO +154 -0
  16. rfmeasurement-0.1.0/README.md +92 -0
  17. rfmeasurement-0.1.0/SECURITY.md +24 -0
  18. rfmeasurement-0.1.0/benchmarks/.gitkeep +0 -0
  19. rfmeasurement-0.1.0/docs/MANIFEST.md +20 -0
  20. rfmeasurement-0.1.0/docs/README.md +16 -0
  21. rfmeasurement-0.1.0/docs/adr/0001-build-on-scikit-rf.md +44 -0
  22. rfmeasurement-0.1.0/docs/adr/0002-src-layout-and-module-boundaries.md +43 -0
  23. rfmeasurement-0.1.0/docs/adr/0003-bsd-3-clause-license.md +38 -0
  24. rfmeasurement-0.1.0/docs/adr/0004-supported-python-versions.md +42 -0
  25. rfmeasurement-0.1.0/docs/adr/README.md +16 -0
  26. rfmeasurement-0.1.0/docs/adr/template.md +24 -0
  27. rfmeasurement-0.1.0/docs/api-specification.md +1436 -0
  28. rfmeasurement-0.1.0/docs/architecture.md +105 -0
  29. rfmeasurement-0.1.0/docs/contributing.md +87 -0
  30. rfmeasurement-0.1.0/docs/domain-model.md +123 -0
  31. rfmeasurement-0.1.0/docs/governance.md +87 -0
  32. rfmeasurement-0.1.0/docs/index.md +87 -0
  33. rfmeasurement-0.1.0/docs/joss-strategy.md +133 -0
  34. rfmeasurement-0.1.0/docs/measurement-quality.md +124 -0
  35. rfmeasurement-0.1.0/docs/repository-organization.md +147 -0
  36. rfmeasurement-0.1.0/docs/reproducibility.md +122 -0
  37. rfmeasurement-0.1.0/docs/requirements.md +113 -0
  38. rfmeasurement-0.1.0/docs/research-plan.md +143 -0
  39. rfmeasurement-0.1.0/docs/roadmap.md +124 -0
  40. rfmeasurement-0.1.0/docs/scope.md +119 -0
  41. rfmeasurement-0.1.0/docs/sphinx/Makefile +15 -0
  42. rfmeasurement-0.1.0/docs/sphinx/_static/.gitkeep +0 -0
  43. rfmeasurement-0.1.0/docs/sphinx/api/index.md +42 -0
  44. rfmeasurement-0.1.0/docs/sphinx/conf.py +44 -0
  45. rfmeasurement-0.1.0/docs/sphinx/contributing.md +41 -0
  46. rfmeasurement-0.1.0/docs/sphinx/index.md +29 -0
  47. rfmeasurement-0.1.0/docs/sphinx/installation.md +17 -0
  48. rfmeasurement-0.1.0/docs/sphinx/license.md +14 -0
  49. rfmeasurement-0.1.0/docs/sphinx/publications.md +13 -0
  50. rfmeasurement-0.1.0/docs/testing-validation.md +122 -0
  51. rfmeasurement-0.1.0/docs/uncertainty.md +163 -0
  52. rfmeasurement-0.1.0/docs/vision.md +72 -0
  53. rfmeasurement-0.1.0/examples/.gitkeep +0 -0
  54. rfmeasurement-0.1.0/examples/01_validate_measurement.py +91 -0
  55. rfmeasurement-0.1.0/examples/02_propagate_uncertainty.py +157 -0
  56. rfmeasurement-0.1.0/pyproject.toml +64 -0
  57. rfmeasurement-0.1.0/src/rfmeasurement/__init__.py +3 -0
  58. rfmeasurement-0.1.0/src/rfmeasurement/analysis/__init__.py +0 -0
  59. rfmeasurement-0.1.0/src/rfmeasurement/domain/__init__.py +38 -0
  60. rfmeasurement-0.1.0/src/rfmeasurement/domain/analysis.py +32 -0
  61. rfmeasurement-0.1.0/src/rfmeasurement/domain/budget.py +44 -0
  62. rfmeasurement-0.1.0/src/rfmeasurement/domain/context.py +35 -0
  63. rfmeasurement-0.1.0/src/rfmeasurement/domain/enums.py +41 -0
  64. rfmeasurement-0.1.0/src/rfmeasurement/domain/measurand.py +19 -0
  65. rfmeasurement-0.1.0/src/rfmeasurement/domain/measurement.py +29 -0
  66. rfmeasurement-0.1.0/src/rfmeasurement/domain/provenance.py +23 -0
  67. rfmeasurement-0.1.0/src/rfmeasurement/domain/uncertainty.py +30 -0
  68. rfmeasurement-0.1.0/src/rfmeasurement/domain/uncertainty_model.py +29 -0
  69. rfmeasurement-0.1.0/src/rfmeasurement/domain/validation.py +50 -0
  70. rfmeasurement-0.1.0/src/rfmeasurement/integrations/__init__.py +0 -0
  71. rfmeasurement-0.1.0/src/rfmeasurement/io/__init__.py +0 -0
  72. rfmeasurement-0.1.0/src/rfmeasurement/provenance/__init__.py +0 -0
  73. rfmeasurement-0.1.0/src/rfmeasurement/reporting/__init__.py +0 -0
  74. rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/__init__.py +34 -0
  75. rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/budget.py +44 -0
  76. rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/covariance.py +47 -0
  77. rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/coverage.py +53 -0
  78. rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/distributions.py +68 -0
  79. rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/linear.py +90 -0
  80. rfmeasurement-0.1.0/src/rfmeasurement/uncertainty/monte_carlo.py +112 -0
  81. rfmeasurement-0.1.0/src/rfmeasurement/validation/__init__.py +26 -0
  82. rfmeasurement-0.1.0/src/rfmeasurement/validation/base.py +39 -0
  83. rfmeasurement-0.1.0/src/rfmeasurement/validation/engine.py +39 -0
  84. rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/__init__.py +18 -0
  85. rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/continuity.py +59 -0
  86. rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/data_integrity.py +48 -0
  87. rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/dynamic_range.py +54 -0
  88. rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/finite_values.py +41 -0
  89. rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/frequency_grid.py +55 -0
  90. rfmeasurement-0.1.0/src/rfmeasurement/validation/rules/physical_consistency.py +73 -0
  91. rfmeasurement-0.1.0/tests/data/.gitkeep +0 -0
  92. rfmeasurement-0.1.0/tests/integration/.gitkeep +0 -0
  93. rfmeasurement-0.1.0/tests/regression/.gitkeep +0 -0
  94. rfmeasurement-0.1.0/tests/scientific/.gitkeep +0 -0
  95. rfmeasurement-0.1.0/tests/unit/domain/test_analysis.py +28 -0
  96. rfmeasurement-0.1.0/tests/unit/domain/test_budget.py +37 -0
  97. rfmeasurement-0.1.0/tests/unit/domain/test_context.py +22 -0
  98. rfmeasurement-0.1.0/tests/unit/domain/test_enums.py +37 -0
  99. rfmeasurement-0.1.0/tests/unit/domain/test_measurand.py +17 -0
  100. rfmeasurement-0.1.0/tests/unit/domain/test_measurement.py +25 -0
  101. rfmeasurement-0.1.0/tests/unit/domain/test_provenance.py +23 -0
  102. rfmeasurement-0.1.0/tests/unit/domain/test_uncertainty.py +28 -0
  103. rfmeasurement-0.1.0/tests/unit/domain/test_uncertainty_model.py +25 -0
  104. rfmeasurement-0.1.0/tests/unit/domain/test_validation.py +31 -0
  105. rfmeasurement-0.1.0/tests/unit/test_package.py +6 -0
  106. rfmeasurement-0.1.0/tests/unit/uncertainty/_helpers.py +26 -0
  107. rfmeasurement-0.1.0/tests/unit/uncertainty/test_build_budget.py +38 -0
  108. rfmeasurement-0.1.0/tests/unit/uncertainty/test_covariance.py +43 -0
  109. rfmeasurement-0.1.0/tests/unit/uncertainty/test_coverage.py +44 -0
  110. rfmeasurement-0.1.0/tests/unit/uncertainty/test_distributions.py +67 -0
  111. rfmeasurement-0.1.0/tests/unit/uncertainty/test_linear.py +116 -0
  112. rfmeasurement-0.1.0/tests/unit/uncertainty/test_monte_carlo.py +115 -0
  113. rfmeasurement-0.1.0/tests/unit/validation/_synthetic.py +61 -0
  114. rfmeasurement-0.1.0/tests/unit/validation/test_base.py +23 -0
  115. rfmeasurement-0.1.0/tests/unit/validation/test_continuity.py +18 -0
  116. rfmeasurement-0.1.0/tests/unit/validation/test_data_integrity.py +18 -0
  117. rfmeasurement-0.1.0/tests/unit/validation/test_dynamic_range.py +20 -0
  118. rfmeasurement-0.1.0/tests/unit/validation/test_engine.py +37 -0
  119. rfmeasurement-0.1.0/tests/unit/validation/test_finite_values.py +17 -0
  120. rfmeasurement-0.1.0/tests/unit/validation/test_frequency_grid.py +21 -0
  121. 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,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Discussions
4
+ url: https://github.com/telmomm/rfmeasurement/discussions
5
+ about: Architectural questions, proposed scientific directions, and roadmap proposals.
@@ -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,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "pip"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ - package-ecosystem: "github-actions"
8
+ directory: "/"
9
+ schedule:
10
+ interval: "weekly"
@@ -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,16 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ .eggs/
5
+ build/
6
+ dist/
7
+ .venv/
8
+ venv/
9
+ .pytest_cache/
10
+ .mypy_cache/
11
+ .ruff_cache/
12
+ .coverage
13
+ htmlcov/
14
+ .DS_Store
15
+ docs/sphinx/_build/
16
+ docs/sphinx/api/generated/
@@ -0,0 +1,17 @@
1
+ version: 2
2
+
3
+ build:
4
+ os: ubuntu-24.04
5
+ tools:
6
+ python: "3.12"
7
+
8
+ sphinx:
9
+ configuration: docs/sphinx/conf.py
10
+ fail_on_warning: true
11
+
12
+ python:
13
+ install:
14
+ - method: pip
15
+ path: .
16
+ extra_requirements:
17
+ - docs
@@ -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
+ [![Documentation Status](https://readthedocs.org/projects/rfmeasurement/badge/?version=latest)](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).