Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
422f685
first commit
Aug 19, 2026
2fc6e25
Scaffold the package: setuptools build, src layout and docs
scollis Aug 19, 2026
ef73233
Merge pull request #1 from scollis/scaffold-packaging
scollis Aug 19, 2026
fee6723
Create ci.yml
scollis Aug 19, 2026
6cd27f8
Reconstruct acquisition times for interpolated volumes
scollis Aug 19, 2026
476b068
Accept and return both Py-ART and xradar object flavours
scollis Aug 19, 2026
a1a2a68
Merge pull request #2 from scollis/advection-timing
scollis Aug 19, 2026
375a3a2
Declare direct dependencies, document the version fallback, raise the…
scollis Aug 19, 2026
d7d488e
Merge pull request #3 from scollis/advection-timing
scollis Aug 19, 2026
c392a9e
Update ci.yml
scollis Aug 19, 2026
789054b
Port 4/3-earth geometry and sweep geometry census
scollis Aug 19, 2026
b6eae0a
Merge pull request #4 from scollis/spectral-geometry-census
scollis Aug 19, 2026
8b93cf8
Port the sweep spectral evaluator, NUFFT operators and dBZ guard
scollis Aug 19, 2026
40bc0a3
Merge pull request #5 from scollis/spectral-evaluator
scollis Aug 19, 2026
6225994
Port the advection interpolation operator
scollis Aug 20, 2026
12b45da
Merge pull request #6 from scollis/advection-operator
scollis Aug 20, 2026
20c3779
Port cone geometry and vertical assembly
scollis Aug 20, 2026
0b31ffa
Merge pull request #7 from scollis/vertical-assembly
scollis Aug 20, 2026
2dcffbf
Wire the spectral operator behind grid_volume
scollis Aug 20, 2026
c938fe9
Merge pull request #8 from scollis/spectral-gridder-wiring
scollis Aug 20, 2026
d4c1910
Stop requiring equal ray counts to interpolate ray times
scollis Aug 20, 2026
924ab48
Collapse repeated azimuths before sampling a sweep
scollis Aug 21, 2026
52ee4ba
Warp several fields through one motion field
scollis Aug 22, 2026
aa3a2bf
Record the advection fixes and carry_fields in the CHANGELOG
scollis Aug 22, 2026
16faf9c
Accept a naive or cftime target_time
scollis Aug 22, 2026
040c2c2
Merge pull request #9 from scollis/ray-count-guard
scollis Aug 22, 2026
d2f3fad
Correct the claim that distance weighting degrades gracefully
scollis Aug 23, 2026
e66a876
Merge pull request #10 from scollis/document-roi-tradeoff
scollis Aug 23, 2026
45c355c
Add pluggable NUFFT engines and a direct solver for the azimuth operator
scollis Aug 24, 2026
1289443
Correct the ducc0 slowdown range to the measured 1.5-4.1x
scollis Aug 24, 2026
d2c9b63
Correct the dense/finufft crossover: it is a band, not a threshold
scollis Aug 24, 2026
c3defab
Validate on real reflectivity; ridge defaults to 'auto'
scollis Aug 24, 2026
522c475
Correct the SPOL margin: 1.10 dB, not ~0.15
scollis Aug 24, 2026
c99e04e
Validate on a full BNF C-SAPR2 volume; stratify by echo
scollis Aug 24, 2026
e8d4d01
Wire az_engine/az_solver/az_ridge through grid_volume
scollis Aug 24, 2026
d156439
Grid tilts concurrently, capped by memory rather than cores
scollis Aug 24, 2026
08d182b
Fix nested thread oversubscription in the parallel tilt path
scollis Aug 24, 2026
38c3e5b
Warn when a gridded field leaves physical reflectivity range
scollis Aug 24, 2026
17a2dd3
Default to dense/direct; warn on finufft under the thread pool
scollis Aug 24, 2026
4424d3e
Measure the GPU path and finufft properly; correct two claims
scollis Aug 24, 2026
1e27c19
Fix non-reproducible split-cut selection in the sweep census
Aug 25, 2026
d368236
Merge pull request #12 from scollis/spectral-nufft-engines
scollis Aug 25, 2026
ffd0e1b
Merge remote-tracking branch 'digr-remote/main' into arm_doe_branch
zssherman Aug 25, 2026
0479b77
FIX: Remove adding redundunt line.
zssherman Aug 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
## What this changes

<!-- One paragraph. What capability moves, and why. -->

## How it was validated

<!-- Which ground truth (analytic field from radar_palette.testing, or a
held-out real volume), which baseline it was compared against, and the
numbers. "Tests pass" is not validation for a new operator. -->

## Checklist

- [ ] `ruff check .` and `ruff format --check .` clean
- [ ] `pytest` passes
- [ ] New public names exported via the subpackage's `__all__`
- [ ] Docstrings are numpydoc and state units
- [ ] Optional dependencies guarded at the call site and gated in tests
- [ ] `CHANGELOG.md` updated under `[Unreleased]`
- [ ] Commits carry `Co-authored-by` trailers for all contributors

Co-authored-by: Scott Collis <scollis.acrf@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
96 changes: 96 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
name: CI

on:
push:
branches: [main]
pull_request:
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
lint:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: "3.12"
- name: Install ruff
run: python -m pip install --upgrade "ruff>=0.6"
- run: ruff check --output-format=github .
- run: ruff format --check --diff .

test:
name: test (py${{ matrix.python-version }}, ${{ matrix.deps }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.11", "3.12", "3.13"]
deps: [full]
include:
# Guard the optional-dependency skip paths: a minimal install must
# still collect and pass the suite.
- python-version: "3.12"
deps: minimal
steps:
- uses: actions/checkout@v7
with:
# setuptools-scm needs history and tags to derive a version.
fetch-depth: 0

- uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python-version }}
cache: pip

- name: Install (full)
if: matrix.deps == 'full'
run: |
python -m pip install --upgrade pip
python -m pip install -e ".[all,test]"

- name: Install (minimal)
if: matrix.deps == 'minimal'
run: |
python -m pip install --upgrade pip
python -m pip install -e ".[test]"

- name: Show environment
run: |
python -c "import radar_palette; print('radar-palette', radar_palette.__version__)"
python -m pip list

- name: Run tests
run: pytest -ra --cov=radar_palette --cov-report=term-missing

build:
name: build and check metadata
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: actions/setup-python@v7
with:
python-version: "3.12"
- name: Build sdist and wheel
run: |
python -m pip install --upgrade pip build twine
python -m build
- name: Validate metadata
run: twine check --strict dist/*
- name: Install the built wheel in a clean environment
run: |
python -m venv /tmp/check
/tmp/check/bin/python -m pip install --upgrade pip
/tmp/check/bin/python -m pip install dist/*.whl
/tmp/check/bin/python -c "import radar_palette; print(radar_palette.__version__)"
- uses: actions/upload-artifact@v7
with:
name: dist
path: dist/
170 changes: 28 additions & 142 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,160 +1,46 @@
# Byte-compiled / optimized / DLL files
# Byte-compiled / cache
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt
.eggs/
src/radar_palette/_version.py

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
# Test / coverage
.pytest_cache/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy
htmlcov/
.ruff_cache/
.mypy_cache/

# Sphinx documentation
# Docs
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock

# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py
docs/generated/
docs/jupyter_execute/

# Environments
.env
.venv
env/
.venv/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/
env/

# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
# Editors / OS
.vscode/
.idea/
.DS_Store

# Notebooks
.ipynb_checkpoints/

# Local data (radar volumes are large; keep them out of the repo)
*.nc
*.cdf
*.mdv
*.mdv.tar
*.h5
data/
22 changes: 22 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
ci:
autoupdate_schedule: monthly

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
- id: check-added-large-files
args: ["--maxkb=512"]
- id: check-merge-conflict
- id: check-toml
- id: check-yaml
- id: end-of-file-fixer
- id: mixed-line-ending
- id: trailing-whitespace

- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.16.3
hooks:
- id: ruff-check
args: ["--fix"]
- id: ruff-format
Loading
Loading