blue-pebble 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.
- blue_pebble-0.1.0/.devcontainer/devcontainer.json +45 -0
- blue_pebble-0.1.0/.gitattributes +1 -0
- blue_pebble-0.1.0/.github/pull_request_template.md +25 -0
- blue_pebble-0.1.0/.github/release.yml +17 -0
- blue_pebble-0.1.0/.github/workflows/ci.yml +70 -0
- blue_pebble-0.1.0/.github/workflows/publish.yml +46 -0
- blue_pebble-0.1.0/.gitignore +47 -0
- blue_pebble-0.1.0/.readthedocs.yaml +16 -0
- blue_pebble-0.1.0/CITATION.cff +53 -0
- blue_pebble-0.1.0/CONTRIBUTING.md +95 -0
- blue_pebble-0.1.0/Dockerfile +27 -0
- blue_pebble-0.1.0/LICENSE +22 -0
- blue_pebble-0.1.0/NOTICE.md +40 -0
- blue_pebble-0.1.0/PKG-INFO +258 -0
- blue_pebble-0.1.0/README.md +206 -0
- blue_pebble-0.1.0/blue_pebble.egg-info/PKG-INFO +258 -0
- blue_pebble-0.1.0/blue_pebble.egg-info/SOURCES.txt +115 -0
- blue_pebble-0.1.0/blue_pebble.egg-info/dependency_links.txt +1 -0
- blue_pebble-0.1.0/blue_pebble.egg-info/entry_points.txt +2 -0
- blue_pebble-0.1.0/blue_pebble.egg-info/requires.txt +29 -0
- blue_pebble-0.1.0/blue_pebble.egg-info/scm_file_list.json +111 -0
- blue_pebble-0.1.0/blue_pebble.egg-info/scm_version.json +8 -0
- blue_pebble-0.1.0/blue_pebble.egg-info/top_level.txt +2 -0
- blue_pebble-0.1.0/bluepebble/__init__.py +52 -0
- blue_pebble-0.1.0/bluepebble/_seed.py +81 -0
- blue_pebble-0.1.0/bluepebble/detector/__init__.py +22 -0
- blue_pebble-0.1.0/bluepebble/detector/algorithms.py +321 -0
- blue_pebble-0.1.0/bluepebble/detector/metrics.py +555 -0
- blue_pebble-0.1.0/bluepebble/detector/passive.py +217 -0
- blue_pebble-0.1.0/bluepebble/models/__init__.py +5 -0
- blue_pebble-0.1.0/bluepebble/models/environment/__init__.py +33 -0
- blue_pebble-0.1.0/bluepebble/models/environment/bathymetry.py +474 -0
- blue_pebble-0.1.0/bluepebble/models/environment/sound_speed_profile.py +698 -0
- blue_pebble-0.1.0/bluepebble/models/propagation/__init__.py +17 -0
- blue_pebble-0.1.0/bluepebble/models/propagation/acoustic.py +963 -0
- blue_pebble-0.1.0/bluepebble/platform/__init__.py +5 -0
- blue_pebble-0.1.0/bluepebble/platform/towedarray.py +562 -0
- blue_pebble-0.1.0/bluepebble/plotter.py +1956 -0
- blue_pebble-0.1.0/bluepebble/signal/__init__.py +26 -0
- blue_pebble-0.1.0/bluepebble/signal/anthropogenic.py +811 -0
- blue_pebble-0.1.0/bluepebble/signal/base.py +76 -0
- blue_pebble-0.1.0/bluepebble/signal/biological.py +1246 -0
- blue_pebble-0.1.0/bluepebble/signal/effects.py +97 -0
- blue_pebble-0.1.0/bluepebble/signal/random.py +205 -0
- blue_pebble-0.1.0/bluepebble/signal/utils.py +252 -0
- blue_pebble-0.1.0/bluepebble/sigproc/__init__.py +15 -0
- blue_pebble-0.1.0/bluepebble/sigproc/beamformer.py +767 -0
- blue_pebble-0.1.0/bluepebble/simulator/__init__.py +17 -0
- blue_pebble-0.1.0/bluepebble/simulator/base.py +265 -0
- blue_pebble-0.1.0/bluepebble/simulator/continuous.py +1044 -0
- blue_pebble-0.1.0/bluepebble/simulator/discrete.py +274 -0
- blue_pebble-0.1.0/bluepebble/types/__init__.py +7 -0
- blue_pebble-0.1.0/bluepebble/types/sensordata.py +28 -0
- blue_pebble-0.1.0/docs/Makefile +15 -0
- blue_pebble-0.1.0/docs/examples/FUSION2026_multitarget_example.py +1217 -0
- blue_pebble-0.1.0/docs/examples/FUSION2026_singletarget_example.py +900 -0
- blue_pebble-0.1.0/docs/examples/GALLERY_HEADER.rst +4 -0
- blue_pebble-0.1.0/docs/examples/comparing_bathymetry.py +593 -0
- blue_pebble-0.1.0/docs/examples/comparing_simulators.py +465 -0
- blue_pebble-0.1.0/docs/examples/designing_narrowband_beamformers.py +656 -0
- blue_pebble-0.1.0/docs/examples/evaluating_detector_metrics.py +511 -0
- blue_pebble-0.1.0/docs/examples/modelling_acoustic_sources.py +551 -0
- blue_pebble-0.1.0/docs/examples/simulating_ownship_noise.py +578 -0
- blue_pebble-0.1.0/docs/examples/using_measured_data.py +580 -0
- blue_pebble-0.1.0/docs/make.bat +34 -0
- blue_pebble-0.1.0/docs/scripts/generate_modelling_acoustic_sources_figs.py +41 -0
- blue_pebble-0.1.0/docs/scripts/generate_using_measured_data_figs.py +43 -0
- blue_pebble-0.1.0/docs/sg_execution_times.rst +58 -0
- blue_pebble-0.1.0/docs/source/_extra/index.html +10 -0
- blue_pebble-0.1.0/docs/source/_plotly_scraper.py +110 -0
- blue_pebble-0.1.0/docs/source/_sgscript.py +122 -0
- blue_pebble-0.1.0/docs/source/api/bluepebble.md +7 -0
- blue_pebble-0.1.0/docs/source/api/detector.md +8 -0
- blue_pebble-0.1.0/docs/source/api/index.md +17 -0
- blue_pebble-0.1.0/docs/source/api/models.md +14 -0
- blue_pebble-0.1.0/docs/source/api/models_environment.md +8 -0
- blue_pebble-0.1.0/docs/source/api/models_propagation.md +8 -0
- blue_pebble-0.1.0/docs/source/api/platform.md +8 -0
- blue_pebble-0.1.0/docs/source/api/plotter.md +8 -0
- blue_pebble-0.1.0/docs/source/api/signal.md +17 -0
- blue_pebble-0.1.0/docs/source/api/sigproc.md +8 -0
- blue_pebble-0.1.0/docs/source/api/simulator.md +18 -0
- blue_pebble-0.1.0/docs/source/api/types.md +8 -0
- blue_pebble-0.1.0/docs/source/citation.md +26 -0
- blue_pebble-0.1.0/docs/source/conf.py +246 -0
- blue_pebble-0.1.0/docs/source/development.md +66 -0
- blue_pebble-0.1.0/docs/source/examples/modelling_acoustic_sources.rst +29 -0
- blue_pebble-0.1.0/docs/source/examples/using_measured_data.rst +29 -0
- blue_pebble-0.1.0/docs/source/index.md +73 -0
- blue_pebble-0.1.0/docs/source/installation.md +44 -0
- blue_pebble-0.1.0/docs/source/roadmap.md +28 -0
- blue_pebble-0.1.0/docs/source/testing.md +185 -0
- blue_pebble-0.1.0/docs/tutorials/GALLERY_HEADER.rst +4 -0
- blue_pebble-0.1.0/docs/tutorials/multi_target_tutorial.py +520 -0
- blue_pebble-0.1.0/docs/tutorials/single_target_tutorial.py +528 -0
- blue_pebble-0.1.0/pyproject.toml +167 -0
- blue_pebble-0.1.0/setup.cfg +4 -0
- blue_pebble-0.1.0/tests/__init__.py +1 -0
- blue_pebble-0.1.0/tests/support.py +153 -0
- blue_pebble-0.1.0/tests/test_beamformer.py +313 -0
- blue_pebble-0.1.0/tests/test_detector_algorithms.py +216 -0
- blue_pebble-0.1.0/tests/test_detector_metrics.py +212 -0
- blue_pebble-0.1.0/tests/test_detector_passive.py +546 -0
- blue_pebble-0.1.0/tests/test_environment_models.py +94 -0
- blue_pebble-0.1.0/tests/test_package_api.py +46 -0
- blue_pebble-0.1.0/tests/test_plotter.py +636 -0
- blue_pebble-0.1.0/tests/test_propagation_models.py +472 -0
- blue_pebble-0.1.0/tests/test_seed.py +409 -0
- blue_pebble-0.1.0/tests/test_signal_anthropogenic.py +370 -0
- blue_pebble-0.1.0/tests/test_signal_base.py +260 -0
- blue_pebble-0.1.0/tests/test_signal_biological.py +575 -0
- blue_pebble-0.1.0/tests/test_signal_models.py +202 -0
- blue_pebble-0.1.0/tests/test_signal_utils.py +78 -0
- blue_pebble-0.1.0/tests/test_simulator_acoustic.py +854 -0
- blue_pebble-0.1.0/tests/test_simulator_modules.py +897 -0
- blue_pebble-0.1.0/tests/test_towedarray_models.py +785 -0
- blue_pebble-0.1.0/tests/test_types_sensordata.py +73 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Blue Pebble Development",
|
|
3
|
+
"build": {
|
|
4
|
+
"dockerfile": "../Dockerfile",
|
|
5
|
+
"context": "..",
|
|
6
|
+
"args": {
|
|
7
|
+
"RTRS_URL": "${localEnv:RTRS_URL}"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
|
|
11
|
+
"features": {
|
|
12
|
+
"ghcr.io/devcontainers/features/github-cli:1": {}
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
// Mount the entire project folder into the container
|
|
16
|
+
"workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/${localWorkspaceFolderBasename},type=bind",
|
|
17
|
+
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
|
|
18
|
+
|
|
19
|
+
// Forward the Jupyter port
|
|
20
|
+
"forwardPorts": [8888],
|
|
21
|
+
|
|
22
|
+
// Run commands after the container is created
|
|
23
|
+
"postCreateCommand": "pip install --no-cache-dir -e '.[dev,docs,examples]'",
|
|
24
|
+
|
|
25
|
+
// Start a Jupyter server automatically
|
|
26
|
+
"postStartCommand": "jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.disable_check_xsrf=True",
|
|
27
|
+
|
|
28
|
+
// Configure VS Code settings and extensions for the container
|
|
29
|
+
"customizations": {
|
|
30
|
+
"vscode": {
|
|
31
|
+
"settings": {
|
|
32
|
+
"python.defaultInterpreterPath": "/usr/local/bin/python"
|
|
33
|
+
},
|
|
34
|
+
"extensions": [
|
|
35
|
+
"ms-python.python",
|
|
36
|
+
"ms-toolsai.jupyter",
|
|
37
|
+
"charliermarsh.ruff",
|
|
38
|
+
"ritwickdey.live"
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
// Keep the container running even when the VS Code window is closed
|
|
44
|
+
"shutdownAction": "none"
|
|
45
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* text=auto eol=lf
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Pull Request
|
|
2
|
+
|
|
3
|
+
PR title format: `type(scope): summary`
|
|
4
|
+
|
|
5
|
+
Examples:
|
|
6
|
+
- `ci: add pytest step to workflow`
|
|
7
|
+
- `fix(plotter): handle empty detections`
|
|
8
|
+
- `docs(api): clarify rtrs installation`
|
|
9
|
+
|
|
10
|
+
Scope is encouraged but not required.
|
|
11
|
+
|
|
12
|
+
## Summary
|
|
13
|
+
|
|
14
|
+
- What changed?
|
|
15
|
+
- Why did it change?
|
|
16
|
+
|
|
17
|
+
## Validation
|
|
18
|
+
|
|
19
|
+
- `ruff check .`
|
|
20
|
+
- `pytest`
|
|
21
|
+
- `make -C docs html`
|
|
22
|
+
|
|
23
|
+
## Compatibility
|
|
24
|
+
|
|
25
|
+
- Any public API, behavioural, or documentation impact?
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
changelog:
|
|
2
|
+
categories:
|
|
3
|
+
- title: Breaking changes
|
|
4
|
+
labels:
|
|
5
|
+
- breaking
|
|
6
|
+
- title: Implemented enhancements
|
|
7
|
+
labels:
|
|
8
|
+
- enhancement
|
|
9
|
+
- title: Fixed bugs
|
|
10
|
+
labels:
|
|
11
|
+
- bug
|
|
12
|
+
- title: Documentation updates
|
|
13
|
+
labels:
|
|
14
|
+
- documentation
|
|
15
|
+
- title: Other changes
|
|
16
|
+
labels:
|
|
17
|
+
- "*"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
pr-title:
|
|
11
|
+
if: github.event_name == 'pull_request'
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- name: Validate PR title
|
|
15
|
+
env:
|
|
16
|
+
PR_TITLE: ${{ github.event.pull_request.title }}
|
|
17
|
+
run: |
|
|
18
|
+
printf 'PR_TITLE=<%s>\n' "$PR_TITLE"
|
|
19
|
+
pattern='^(feat|fix|docs|style|refactor|perf|test|build|ci|chore)(\([^)]+\))?(!)?: .+$'
|
|
20
|
+
if printf '%s' "$PR_TITLE" | grep -Eq "$pattern"; then
|
|
21
|
+
echo "PR title is a valid Conventional Commit: $PR_TITLE"
|
|
22
|
+
else
|
|
23
|
+
echo "PR title must follow Conventional Commits."
|
|
24
|
+
echo "Use: type(scope): summary"
|
|
25
|
+
echo "Scope is encouraged but not required."
|
|
26
|
+
echo "Examples:"
|
|
27
|
+
echo " ci: add pytest step to workflow"
|
|
28
|
+
echo " fix(plotter): handle empty detections"
|
|
29
|
+
exit 0
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
core:
|
|
33
|
+
runs-on: ubuntu-latest
|
|
34
|
+
strategy:
|
|
35
|
+
fail-fast: false
|
|
36
|
+
matrix:
|
|
37
|
+
python-version: ["3.11", "3.12", "3.13", "3.14"]
|
|
38
|
+
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/checkout@v4
|
|
41
|
+
|
|
42
|
+
- uses: actions/setup-python@v5
|
|
43
|
+
with:
|
|
44
|
+
python-version: ${{ matrix.python-version }}
|
|
45
|
+
|
|
46
|
+
- name: Install (core)
|
|
47
|
+
run: |
|
|
48
|
+
python -m pip install --upgrade pip
|
|
49
|
+
pip install -e ".[dev]"
|
|
50
|
+
|
|
51
|
+
- name: Lint (Ruff)
|
|
52
|
+
run: |
|
|
53
|
+
ruff check .
|
|
54
|
+
|
|
55
|
+
- name: Tests (Pytest)
|
|
56
|
+
run: |
|
|
57
|
+
if [[ "${{ matrix.python-version }}" == "3.12" ]]; then
|
|
58
|
+
pytest --cov=bluepebble --cov-report=term-missing --cov-report=xml --cov-fail-under=55
|
|
59
|
+
else
|
|
60
|
+
pytest
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
- name: Smoke import
|
|
64
|
+
run: |
|
|
65
|
+
python -c "import bluepebble; print(getattr(bluepebble, '__version__', 'no __version__'))"
|
|
66
|
+
|
|
67
|
+
- name: Build (sdist/wheel)
|
|
68
|
+
run: |
|
|
69
|
+
python -m build --sdist --wheel
|
|
70
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
build:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
steps:
|
|
11
|
+
- uses: actions/checkout@v4
|
|
12
|
+
with:
|
|
13
|
+
fetch-depth: 0 # required for setuptools_scm to resolve version from git tags
|
|
14
|
+
|
|
15
|
+
- uses: actions/setup-python@v5
|
|
16
|
+
with:
|
|
17
|
+
python-version: "3.11"
|
|
18
|
+
|
|
19
|
+
- name: Install build
|
|
20
|
+
run: pip install build
|
|
21
|
+
|
|
22
|
+
- name: Build sdist and wheel
|
|
23
|
+
run: python -m build
|
|
24
|
+
|
|
25
|
+
- uses: actions/upload-artifact@v4
|
|
26
|
+
with:
|
|
27
|
+
name: dist
|
|
28
|
+
path: dist/
|
|
29
|
+
|
|
30
|
+
publish:
|
|
31
|
+
needs: build
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
environment:
|
|
34
|
+
name: pypi
|
|
35
|
+
url: https://pypi.org/p/blue-pebble
|
|
36
|
+
permissions:
|
|
37
|
+
id-token: write # required for OIDC trusted publishing
|
|
38
|
+
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/download-artifact@v4
|
|
41
|
+
with:
|
|
42
|
+
name: dist
|
|
43
|
+
path: dist/
|
|
44
|
+
|
|
45
|
+
- name: Publish to PyPI
|
|
46
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# General Python
|
|
2
|
+
build/
|
|
3
|
+
dist/
|
|
4
|
+
*.egg-info
|
|
5
|
+
__pycache__/
|
|
6
|
+
|
|
7
|
+
# Virtual environment
|
|
8
|
+
.venv/
|
|
9
|
+
|
|
10
|
+
# Sphinx documentation
|
|
11
|
+
/docs/build/
|
|
12
|
+
/docs/_build/
|
|
13
|
+
/docs/source/auto*
|
|
14
|
+
/docs/source/sg_execution_times.rst
|
|
15
|
+
/docs/sg_execution_times.rst
|
|
16
|
+
|
|
17
|
+
# coverage
|
|
18
|
+
.coverage
|
|
19
|
+
coverage.xml
|
|
20
|
+
htmlcov/
|
|
21
|
+
|
|
22
|
+
# pytest
|
|
23
|
+
.pytest_cache/
|
|
24
|
+
|
|
25
|
+
# Ruff
|
|
26
|
+
.ruff_cache/
|
|
27
|
+
|
|
28
|
+
# Jupyter
|
|
29
|
+
.ipynb_checkpoints/
|
|
30
|
+
|
|
31
|
+
# Operating system / editor
|
|
32
|
+
.DS_Store
|
|
33
|
+
.vscode/
|
|
34
|
+
|
|
35
|
+
# Claude Code — local only
|
|
36
|
+
CLAUDE.md
|
|
37
|
+
.claude/
|
|
38
|
+
|
|
39
|
+
# Measured data
|
|
40
|
+
docs/examples/measured_data
|
|
41
|
+
|
|
42
|
+
# Generated PDF figures
|
|
43
|
+
*.pdf
|
|
44
|
+
|
|
45
|
+
# Generated Sphinx-Gallery figures (large, rebuilt during docs build)
|
|
46
|
+
docs/source/_static/acoustic_source_figs/
|
|
47
|
+
docs/source/_static/measured_data_figs/
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: >
|
|
3
|
+
If you use this software, please cite both the article and the software itself.
|
|
4
|
+
title: "Blue Pebble: A Passive Sonar Simulation Framework for Tracking Research"
|
|
5
|
+
type: software
|
|
6
|
+
authors:
|
|
7
|
+
- family-names: Wakefield
|
|
8
|
+
given-names: Joshua J.
|
|
9
|
+
orcid: "https://orcid.org/0009-0008-7574-5484"
|
|
10
|
+
- family-names: Boulton
|
|
11
|
+
given-names: Finley
|
|
12
|
+
- family-names: Colquitt
|
|
13
|
+
given-names: Daniel J.
|
|
14
|
+
- family-names: Ralph
|
|
15
|
+
given-names: Jason F.
|
|
16
|
+
- family-names: Williams
|
|
17
|
+
given-names: Duncan P.
|
|
18
|
+
|
|
19
|
+
repository-code: "https://github.com/UoL-SignalProcessingGroup/blue-pebble"
|
|
20
|
+
url: "https://github.com/UoL-SignalProcessingGroup/blue-pebble"
|
|
21
|
+
|
|
22
|
+
license: "MIT"
|
|
23
|
+
|
|
24
|
+
keywords:
|
|
25
|
+
- passive sonar
|
|
26
|
+
- underwater acoustics
|
|
27
|
+
- beamforming
|
|
28
|
+
- acoustic propagation
|
|
29
|
+
- ray tracing
|
|
30
|
+
- towed arrays
|
|
31
|
+
- multi-target tracking
|
|
32
|
+
- detection theory
|
|
33
|
+
- simulation framework
|
|
34
|
+
|
|
35
|
+
preferred-citation:
|
|
36
|
+
type: paper-conference
|
|
37
|
+
title: "A Sonar Signal Processing Plugin for Stone Soup"
|
|
38
|
+
authors:
|
|
39
|
+
- family-names: Wakefield
|
|
40
|
+
given-names: Joshua J.
|
|
41
|
+
- family-names: Boulton
|
|
42
|
+
given-names: Finley
|
|
43
|
+
- family-names: Colquitt
|
|
44
|
+
given-names: Daniel J.
|
|
45
|
+
- family-names: Ralph
|
|
46
|
+
given-names: Jason F.
|
|
47
|
+
- family-names: Williams
|
|
48
|
+
given-names: Duncan P.
|
|
49
|
+
year: 2026
|
|
50
|
+
conference:
|
|
51
|
+
name: "29th International Conference on Information Fusion (FUSION)"
|
|
52
|
+
publisher: IEEE
|
|
53
|
+
status: forthcoming
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Contributing to Blue Pebble
|
|
2
|
+
|
|
3
|
+
Blue Pebble follows Stone Soup-style contribution practices, adapted for this plugin and toolchain.
|
|
4
|
+
|
|
5
|
+
## Development Setup
|
|
6
|
+
|
|
7
|
+
1. Clone the repository and enter it.
|
|
8
|
+
2. Create and activate a Python 3.11+ virtual environment.
|
|
9
|
+
3. Install development dependencies:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
python3 -m pip install -U pip
|
|
13
|
+
python3 -m pip install -e ".[dev]"
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
4. If working on docs/examples, also install:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
python3 -m pip install -e ".[docs,examples]"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Code Style
|
|
23
|
+
|
|
24
|
+
- Use clear, descriptive names (prefer domain clarity over shorthand).
|
|
25
|
+
- Use standard Python exceptions/warnings and validate inputs explicitly.
|
|
26
|
+
- Prefer a deprecation period of at least one release cycle before removing/changing public interfaces.
|
|
27
|
+
- Keep components modular with one primary responsibility each.
|
|
28
|
+
- Follow PEP 8 and project linting rules.
|
|
29
|
+
- Lint with `ruff` (this project uses `ruff`, not `flake8`):
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
ruff check .
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Documentation
|
|
36
|
+
|
|
37
|
+
- Use NumPy-style docstrings for public APIs.
|
|
38
|
+
- Add or update docs for behavior/API changes.
|
|
39
|
+
- For significant new capability, include a minimal reproducible example in `docs/examples/` or `docs/tutorials/`.
|
|
40
|
+
- Where relevant, include references to equations, assumptions, or papers.
|
|
41
|
+
- `.ipynb` files under `docs/tutorials/` and `docs/examples/` are the canonical published sources for notebook-based documentation.
|
|
42
|
+
- Published notebooks are rendered from the committed outputs; the docs build does not execute notebooks.
|
|
43
|
+
- When notebook content changes, refresh the outputs locally before committing so the hosted documentation remains coherent.
|
|
44
|
+
|
|
45
|
+
Build the docs locally with:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
make -C docs html
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Tests
|
|
52
|
+
|
|
53
|
+
- Use `pytest`.
|
|
54
|
+
- Add tests for new behavior and regressions.
|
|
55
|
+
- Add tests for expected failures/exceptions where relevant.
|
|
56
|
+
- For numerical methods, use deterministic checks and appropriate tolerances (`rtol`, `atol`).
|
|
57
|
+
|
|
58
|
+
Run local checks before opening a PR:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
ruff check .
|
|
62
|
+
pytest
|
|
63
|
+
make -C docs html
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## License
|
|
67
|
+
|
|
68
|
+
By contributing, you agree your contribution is under the repository license (MIT), unless explicitly stated otherwise in the pull request.
|
|
69
|
+
|
|
70
|
+
## External Dependencies
|
|
71
|
+
|
|
72
|
+
- Prefer Python standard library or existing well-maintained libraries.
|
|
73
|
+
- New dependencies should have permissive or weak-copyleft licensing and a clear maintenance story.
|
|
74
|
+
- Add dependencies to `pyproject.toml` with appropriate version constraints.
|
|
75
|
+
|
|
76
|
+
## Pull Requests
|
|
77
|
+
|
|
78
|
+
- Use feature branches (for example `feat/<topic>` or `fix/<topic>`).
|
|
79
|
+
- Keep PRs focused and reviewable.
|
|
80
|
+
- Use a Conventional Commit-formatted PR title, for example `ci: add pytest step to workflow`.
|
|
81
|
+
- Prefer the form `type(scope): summary`; scope is encouraged when it adds clarity, but it is not required.
|
|
82
|
+
- Prefer squash merging so the PR title becomes the commit message on `main`.
|
|
83
|
+
- In the PR description, include:
|
|
84
|
+
- what changed
|
|
85
|
+
- why it changed
|
|
86
|
+
- how you validated it (tests, docs build, example output)
|
|
87
|
+
- any compatibility impact
|
|
88
|
+
|
|
89
|
+
## Versioning and Releases
|
|
90
|
+
|
|
91
|
+
This project uses dynamic versioning via `setuptools_scm`.
|
|
92
|
+
|
|
93
|
+
- Do not manually set `project.version` in `pyproject.toml`.
|
|
94
|
+
- Versions are resolved from Git tags.
|
|
95
|
+
- Use semantic tags for releases, for example `v3.0.0`, `v3.1.0`, `v3.1.1`, or pre-release tags such as `v3.0.0rc1`.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
FROM python:3.12-slim
|
|
2
|
+
|
|
3
|
+
# Install runtime tools required for devcontainer workflows
|
|
4
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
5
|
+
git \
|
|
6
|
+
make \
|
|
7
|
+
build-essential \
|
|
8
|
+
curl \
|
|
9
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
10
|
+
|
|
11
|
+
# Set the working directory
|
|
12
|
+
WORKDIR /app
|
|
13
|
+
|
|
14
|
+
# Optional: install rtrs ray-tracing backend.
|
|
15
|
+
# Pass a pip-installable URL at build time, e.g.:
|
|
16
|
+
# docker build --build-arg RTRS_URL=https://<token>@github.com/fincb/rtrs.git .
|
|
17
|
+
# Once rtrs is public this can be replaced with a plain pip install.
|
|
18
|
+
ARG RTRS_URL=""
|
|
19
|
+
RUN if [ -n "$RTRS_URL" ]; then \
|
|
20
|
+
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal \
|
|
21
|
+
&& export PATH="/root/.cargo/bin:$PATH" \
|
|
22
|
+
&& pip install --no-cache-dir git+"$RTRS_URL"; \
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# The devcontainer will mount the source code and install dependencies.
|
|
26
|
+
# The CMD is also handled by the devcontainer configuration.
|
|
27
|
+
# For a production build, re-enable the COPY and RUN pip install lines.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Joshua Wakefield
|
|
4
|
+
Copyright (c) 2026 Finley Boulton
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Attribution and Project Origin
|
|
2
|
+
|
|
3
|
+
This project is a plugin for the open-source framework [Stone Soup](https://stonesoup.rtfd.io/).
|
|
4
|
+
|
|
5
|
+
The architecture and class structure in this repository inherit from Stone Soup's existing implementations.
|
|
6
|
+
|
|
7
|
+
## Original License and Copyright
|
|
8
|
+
|
|
9
|
+
As an extension to the original work, this project is bound by the terms of the original MIT License under which Stone Soup is distributed. The full, original copyright notice and the license text are included below.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
**The MIT License (MIT)**
|
|
14
|
+
|
|
15
|
+
**© Crown Copyright 2017-2025 Defence Science and Technology Laboratory UK**
|
|
16
|
+
**© Crown Copyright 2018-2025 Defence Research and Development Canada / Recherche et développement pour la défense Canada**
|
|
17
|
+
**© Copyright 2018-2025 University of Liverpool UK**
|
|
18
|
+
**© Copyright 2020-2025 Fraunhofer FKIE**
|
|
19
|
+
**© Copyright 2020-2025 John Hiles**
|
|
20
|
+
**© Copyright 2020-2025 Riskaware Ltd**
|
|
21
|
+
**© Copyright 2021-2025 Roke Manor Research Ltd UK**
|
|
22
|
+
**© Copyright 2023-2025 Loughborough University UK**
|
|
23
|
+
|
|
24
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
25
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
26
|
+
in the Software without restriction, including without limitation the rights
|
|
27
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
28
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
29
|
+
furnished to do so, subject to the following conditions:
|
|
30
|
+
|
|
31
|
+
The above copyright notice and this permission notice shall be included in all
|
|
32
|
+
copies or substantial portions of the Software.
|
|
33
|
+
|
|
34
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
35
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
36
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
37
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
38
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
39
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
40
|
+
SOFTWARE.
|