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.
Files changed (117) hide show
  1. blue_pebble-0.1.0/.devcontainer/devcontainer.json +45 -0
  2. blue_pebble-0.1.0/.gitattributes +1 -0
  3. blue_pebble-0.1.0/.github/pull_request_template.md +25 -0
  4. blue_pebble-0.1.0/.github/release.yml +17 -0
  5. blue_pebble-0.1.0/.github/workflows/ci.yml +70 -0
  6. blue_pebble-0.1.0/.github/workflows/publish.yml +46 -0
  7. blue_pebble-0.1.0/.gitignore +47 -0
  8. blue_pebble-0.1.0/.readthedocs.yaml +16 -0
  9. blue_pebble-0.1.0/CITATION.cff +53 -0
  10. blue_pebble-0.1.0/CONTRIBUTING.md +95 -0
  11. blue_pebble-0.1.0/Dockerfile +27 -0
  12. blue_pebble-0.1.0/LICENSE +22 -0
  13. blue_pebble-0.1.0/NOTICE.md +40 -0
  14. blue_pebble-0.1.0/PKG-INFO +258 -0
  15. blue_pebble-0.1.0/README.md +206 -0
  16. blue_pebble-0.1.0/blue_pebble.egg-info/PKG-INFO +258 -0
  17. blue_pebble-0.1.0/blue_pebble.egg-info/SOURCES.txt +115 -0
  18. blue_pebble-0.1.0/blue_pebble.egg-info/dependency_links.txt +1 -0
  19. blue_pebble-0.1.0/blue_pebble.egg-info/entry_points.txt +2 -0
  20. blue_pebble-0.1.0/blue_pebble.egg-info/requires.txt +29 -0
  21. blue_pebble-0.1.0/blue_pebble.egg-info/scm_file_list.json +111 -0
  22. blue_pebble-0.1.0/blue_pebble.egg-info/scm_version.json +8 -0
  23. blue_pebble-0.1.0/blue_pebble.egg-info/top_level.txt +2 -0
  24. blue_pebble-0.1.0/bluepebble/__init__.py +52 -0
  25. blue_pebble-0.1.0/bluepebble/_seed.py +81 -0
  26. blue_pebble-0.1.0/bluepebble/detector/__init__.py +22 -0
  27. blue_pebble-0.1.0/bluepebble/detector/algorithms.py +321 -0
  28. blue_pebble-0.1.0/bluepebble/detector/metrics.py +555 -0
  29. blue_pebble-0.1.0/bluepebble/detector/passive.py +217 -0
  30. blue_pebble-0.1.0/bluepebble/models/__init__.py +5 -0
  31. blue_pebble-0.1.0/bluepebble/models/environment/__init__.py +33 -0
  32. blue_pebble-0.1.0/bluepebble/models/environment/bathymetry.py +474 -0
  33. blue_pebble-0.1.0/bluepebble/models/environment/sound_speed_profile.py +698 -0
  34. blue_pebble-0.1.0/bluepebble/models/propagation/__init__.py +17 -0
  35. blue_pebble-0.1.0/bluepebble/models/propagation/acoustic.py +963 -0
  36. blue_pebble-0.1.0/bluepebble/platform/__init__.py +5 -0
  37. blue_pebble-0.1.0/bluepebble/platform/towedarray.py +562 -0
  38. blue_pebble-0.1.0/bluepebble/plotter.py +1956 -0
  39. blue_pebble-0.1.0/bluepebble/signal/__init__.py +26 -0
  40. blue_pebble-0.1.0/bluepebble/signal/anthropogenic.py +811 -0
  41. blue_pebble-0.1.0/bluepebble/signal/base.py +76 -0
  42. blue_pebble-0.1.0/bluepebble/signal/biological.py +1246 -0
  43. blue_pebble-0.1.0/bluepebble/signal/effects.py +97 -0
  44. blue_pebble-0.1.0/bluepebble/signal/random.py +205 -0
  45. blue_pebble-0.1.0/bluepebble/signal/utils.py +252 -0
  46. blue_pebble-0.1.0/bluepebble/sigproc/__init__.py +15 -0
  47. blue_pebble-0.1.0/bluepebble/sigproc/beamformer.py +767 -0
  48. blue_pebble-0.1.0/bluepebble/simulator/__init__.py +17 -0
  49. blue_pebble-0.1.0/bluepebble/simulator/base.py +265 -0
  50. blue_pebble-0.1.0/bluepebble/simulator/continuous.py +1044 -0
  51. blue_pebble-0.1.0/bluepebble/simulator/discrete.py +274 -0
  52. blue_pebble-0.1.0/bluepebble/types/__init__.py +7 -0
  53. blue_pebble-0.1.0/bluepebble/types/sensordata.py +28 -0
  54. blue_pebble-0.1.0/docs/Makefile +15 -0
  55. blue_pebble-0.1.0/docs/examples/FUSION2026_multitarget_example.py +1217 -0
  56. blue_pebble-0.1.0/docs/examples/FUSION2026_singletarget_example.py +900 -0
  57. blue_pebble-0.1.0/docs/examples/GALLERY_HEADER.rst +4 -0
  58. blue_pebble-0.1.0/docs/examples/comparing_bathymetry.py +593 -0
  59. blue_pebble-0.1.0/docs/examples/comparing_simulators.py +465 -0
  60. blue_pebble-0.1.0/docs/examples/designing_narrowband_beamformers.py +656 -0
  61. blue_pebble-0.1.0/docs/examples/evaluating_detector_metrics.py +511 -0
  62. blue_pebble-0.1.0/docs/examples/modelling_acoustic_sources.py +551 -0
  63. blue_pebble-0.1.0/docs/examples/simulating_ownship_noise.py +578 -0
  64. blue_pebble-0.1.0/docs/examples/using_measured_data.py +580 -0
  65. blue_pebble-0.1.0/docs/make.bat +34 -0
  66. blue_pebble-0.1.0/docs/scripts/generate_modelling_acoustic_sources_figs.py +41 -0
  67. blue_pebble-0.1.0/docs/scripts/generate_using_measured_data_figs.py +43 -0
  68. blue_pebble-0.1.0/docs/sg_execution_times.rst +58 -0
  69. blue_pebble-0.1.0/docs/source/_extra/index.html +10 -0
  70. blue_pebble-0.1.0/docs/source/_plotly_scraper.py +110 -0
  71. blue_pebble-0.1.0/docs/source/_sgscript.py +122 -0
  72. blue_pebble-0.1.0/docs/source/api/bluepebble.md +7 -0
  73. blue_pebble-0.1.0/docs/source/api/detector.md +8 -0
  74. blue_pebble-0.1.0/docs/source/api/index.md +17 -0
  75. blue_pebble-0.1.0/docs/source/api/models.md +14 -0
  76. blue_pebble-0.1.0/docs/source/api/models_environment.md +8 -0
  77. blue_pebble-0.1.0/docs/source/api/models_propagation.md +8 -0
  78. blue_pebble-0.1.0/docs/source/api/platform.md +8 -0
  79. blue_pebble-0.1.0/docs/source/api/plotter.md +8 -0
  80. blue_pebble-0.1.0/docs/source/api/signal.md +17 -0
  81. blue_pebble-0.1.0/docs/source/api/sigproc.md +8 -0
  82. blue_pebble-0.1.0/docs/source/api/simulator.md +18 -0
  83. blue_pebble-0.1.0/docs/source/api/types.md +8 -0
  84. blue_pebble-0.1.0/docs/source/citation.md +26 -0
  85. blue_pebble-0.1.0/docs/source/conf.py +246 -0
  86. blue_pebble-0.1.0/docs/source/development.md +66 -0
  87. blue_pebble-0.1.0/docs/source/examples/modelling_acoustic_sources.rst +29 -0
  88. blue_pebble-0.1.0/docs/source/examples/using_measured_data.rst +29 -0
  89. blue_pebble-0.1.0/docs/source/index.md +73 -0
  90. blue_pebble-0.1.0/docs/source/installation.md +44 -0
  91. blue_pebble-0.1.0/docs/source/roadmap.md +28 -0
  92. blue_pebble-0.1.0/docs/source/testing.md +185 -0
  93. blue_pebble-0.1.0/docs/tutorials/GALLERY_HEADER.rst +4 -0
  94. blue_pebble-0.1.0/docs/tutorials/multi_target_tutorial.py +520 -0
  95. blue_pebble-0.1.0/docs/tutorials/single_target_tutorial.py +528 -0
  96. blue_pebble-0.1.0/pyproject.toml +167 -0
  97. blue_pebble-0.1.0/setup.cfg +4 -0
  98. blue_pebble-0.1.0/tests/__init__.py +1 -0
  99. blue_pebble-0.1.0/tests/support.py +153 -0
  100. blue_pebble-0.1.0/tests/test_beamformer.py +313 -0
  101. blue_pebble-0.1.0/tests/test_detector_algorithms.py +216 -0
  102. blue_pebble-0.1.0/tests/test_detector_metrics.py +212 -0
  103. blue_pebble-0.1.0/tests/test_detector_passive.py +546 -0
  104. blue_pebble-0.1.0/tests/test_environment_models.py +94 -0
  105. blue_pebble-0.1.0/tests/test_package_api.py +46 -0
  106. blue_pebble-0.1.0/tests/test_plotter.py +636 -0
  107. blue_pebble-0.1.0/tests/test_propagation_models.py +472 -0
  108. blue_pebble-0.1.0/tests/test_seed.py +409 -0
  109. blue_pebble-0.1.0/tests/test_signal_anthropogenic.py +370 -0
  110. blue_pebble-0.1.0/tests/test_signal_base.py +260 -0
  111. blue_pebble-0.1.0/tests/test_signal_biological.py +575 -0
  112. blue_pebble-0.1.0/tests/test_signal_models.py +202 -0
  113. blue_pebble-0.1.0/tests/test_signal_utils.py +78 -0
  114. blue_pebble-0.1.0/tests/test_simulator_acoustic.py +854 -0
  115. blue_pebble-0.1.0/tests/test_simulator_modules.py +897 -0
  116. blue_pebble-0.1.0/tests/test_towedarray_models.py +785 -0
  117. 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,16 @@
1
+ version: 2
2
+
3
+ build:
4
+ os: ubuntu-lts-latest
5
+ tools:
6
+ python: "3.12"
7
+
8
+ sphinx:
9
+ configuration: docs/source/conf.py
10
+
11
+ python:
12
+ install:
13
+ - method: pip
14
+ path: .
15
+ extra_requirements:
16
+ - docs
@@ -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.