Skip to content

Release v4.0.0: scikit-build-core packaging, CI gate, accuracy suites - #9

Merged
ericwait merged 40 commits into
mainfrom
conda-forge
Jul 9, 2026
Merged

Release v4.0.0: scikit-build-core packaging, CI gate, accuracy suites#9
ericwait merged 40 commits into
mainfrom
conda-forge

Conversation

@ericwait

@ericwait ericwait commented Jul 9, 2026

Copy link
Copy Markdown
Owner

Fast-forwards main to the conda-forge branch for the v4.0.0 release.

Highlights

  • Build: single pip install . via scikit-build-core builds the CUDA extension and installs hydra_image_processor (+ HIP/Hydra shims); version single-sourced in pyproject.toml; in-repo conda recipe removed (distribution via conda-forge).
  • CI: Windows + Linux build-gate installing CUDA from conda-forge; tag-driven release workflow with a version guard.
  • Tests: repaired the C++ accuracy tests; added the Python TIFF accuracy suite (src/Python/Test/test_accuracy.py) that gates releases.
  • Fixes: make_ellipsoid_mask off-center bug; explicit <cstdint> includes for newer toolchains.

Verification

  • CI green on both platforms at the branch tip.
  • GPU accuracy suites (C++ + Python TIFF, 15 ops) pass on Windows (CUDA 13.3) and Linux/WSL (CUDA 13.3), built via the same pip path.
  • Feedstock rattler-build dry-run of the win_64 CUDA 12.9 variant passes from a local source tarball with no recipe patches; linux_64 verification in progress.

🤖 Generated with Claude Code

ericwait and others added 30 commits October 3, 2025 15:47
…es and invalid kernel/copy cases; use cudaDeviceSynchronize in debug check
…thon module output and remove libomp DLL copy
…tion backlog

Reorder the roadmap around the agreed sequence: (1) conda/mamba/pixi/uv
packaging, (2) vcpkg/conan, (3) CPU fallback with warning + strict flag,
(4) vRAM-resident filter pipelining with host-memory taps, (5) prioritized
operation backlog. Document the develop-branch PR workflow and parallel
lanes. Move C ABI/C#/NuGet, non-NVIDIA GPU, and GPU-direct I/O to later
phases. Seed BACKLOG.md with a re-arrangeable priority table covering
compositions, local kernels, the FFT track, and global ops with their
chunking caveats.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Unify the Python build on scikit-build-core so a single `pip install .` drives
CMake, compiles the Hydra CUDA extension into the hydra_image_processor package,
and installs it. This is the same path used locally, by CI, and by the
conda-forge feedstock, which lets the feedstock drop its source patches.

- Move pyproject.toml to the repo root; version 4.0.0 is the single source of
  truth, and __version__ is read from installed metadata.
- CMake: raise CUDA_STANDARD to 17, drop the hardcoded GPU architectures in
  favor of CMAKE_CUDA_ARCHITECTURES (default all-major), add a HYDRA_BUILD_TESTS
  option, and add package-relative install rules for the extension and shims.
- Ship top-level HIP/Hydra compatibility shims so legacy `import HIP` /
  `import Hydra` keep working.
- Remove the superseded in-repo conda-build recipe and MANIFEST.in; ignore
  build artifacts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the Windows-only conda-build workflow (which uploaded to a separate
anaconda.org channel) with two workflows:

- ci.yml: build and import the package on Windows and Linux for PRs and pushes,
  catching breakage before it reaches the conda-forge feedstock. Runners have no
  GPU, so GPU tests auto-skip; this only verifies the package builds and imports.
- release.yml: on a `v*` tag, verify the tag matches pyproject's version and
  create a GitHub Release, which the conda-forge autotick bot picks up to open a
  feedstock version-bump PR.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- README: conda/mamba/pixi install, the NVIDIA GPU requirement, the unsupported
  pip/uv path, and the import convention.
- Rewrite the Python package README for the new hydra_image_processor API and
  the HIP/Hydra back-compat shims.
- Add CHANGELOG.md (4.0.0) and a build + release checklist in CONTRIBUTING.md.
- Refresh GEMINI.md to reflect scikit-build-core and conda-forge distribution.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A standing pre-release verification checklist (TESTING.md) covering the local
build, GPU accuracy suite, CI gate, feedstock dry-run, and release rehearsal.
The GPU correctness steps must be run locally since CI is build-only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The coordinate grid was shifted by vol_size/2 + 0.5, putting the
ellipsoid center one voxel off (e.g. -6..+4 instead of -5..+5 for
radius 5). Every morphological op using the mask diverged from the
C++ createEllipsoidKernel / MATLAB results. With the fix, all eight
ellipsoid-kernel ops match the MATLAB-generated ground truth exactly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ericwait and others added 10 commits July 8, 2026 18:55
test_accuracy.cpp never compiled: it called a nonexistent
ImageOwner::getLinearAddress and passed a float[3] where the generated
CudaCall_Gaussian::run stub takes Vec<double> plus an lvalue
ImageView for the output. The Gaussian energy-preservation check also
assumed a volume too shallow for its sigma; the filter renormalizes
truncated kernels at borders, so the impulse support must stay
interior for the sum to be preserved.

enable_testing() now runs at the top level so `ctest --test-dir
build` actually finds CppAccuracyTest.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Port of src/MATLAB/+Test/AccuracyTest.m: 15 operations compared
against the ground-truth TIFFs in test_data/ (integer results within
1 LSB, float within 1e-4, EntropyFilter as a soft check since its
ground truth was saved min-max scaled). Documents the numpy<->Hydra
axis convention: arrays pass as tifffile loads them (chan, z, y, x)
with vector parameters in (z, y, x) order.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The pinned Jimver/cuda-toolkit network install of 12.6.2 broke as the
runner images moved (apt failure on ubuntu-latest). Pull cuda-nvcc +
cudart from conda-forge in the existing miniforge env instead - the
same channel the feedstock builds against, and one less third-party
action. Linux additionally gets conda-forge c/cxx compilers as the
nvcc host compiler.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The setup-miniconda-created 'test' env resolves fine right after
creation but later steps on windows-latest fail activation with
EnvironmentNameNotFound (seen across two runs). Installing the
toolchain, python included, into base sidesteps named-env activation
entirely.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Without a generator override, CMake on windows-latest picks Visual
Studio, whose CUDA support needs the VS-integration files that only a
system CUDA toolkit install provides - the conda-forge cuda-nvcc
package does not ship them, so configure fails on the runner.
Verified locally: Ninja + conda-forge nvcc 12.9 + MSVC 19.44 builds
the wheel end to end.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Job logs need authentication to read, but annotations are public;
on failure the build step now emits the toolchain locations and the
first error lines from the pip log as ::error:: annotations.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
windows-latest now ships Visual Studio 2026 (MSVC 14.51) and CUDA
12.9 nvcc refuses it outright (C1189: unsupported Microsoft Visual
Studio version). nvcc 13.x supports current MSVC. The 12.x pairing
stays covered by the conda-forge feedstock CI, which pins VS 2022,
and was verified locally against MSVC 19.44.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The command framework headers relied on transitive <cstdint>
includes, which newer libstdc++ (pulled in by the CUDA 13 / gcc
toolchain on CI) no longer provides - uint8_t and friends came up
undefined in ScriptioMaps.h. Include it explicitly in every header
and TU that names the fixed-width types.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 9, 2026 01:06

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @ericwait, your pull request is larger than the review limit of 150000 diff characters

@coderabbitai

coderabbitai Bot commented Jul 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 163 files, which is 13 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 12911f36-0dad-4cd1-81e3-d3e853bfeda6

📥 Commits

Reviewing files that changed from the base of the PR and between 2d06033 and 9e29b49.

⛔ Files ignored due to path filters (31)
  • docs/images/Closure_c1_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/Closure_c2_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/ElementWiseDifference_c1_reverse_brightMIP.png is excluded by !**/*.png
  • docs/images/ElementWiseDifference_c2_reverse_brightMIP.png is excluded by !**/*.png
  • docs/images/EntropyFilter_c1_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/EntropyFilter_c2_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/Gaussian_c1_19-19-9_brightMIP.png is excluded by !**/*.png
  • docs/images/Gaussian_c2_19-19-9_brightMIP.png is excluded by !**/*.png
  • docs/images/HighPassFilter_c1_19-19-9_brightMIP.png is excluded by !**/*.png
  • docs/images/HighPassFilter_c2_19-19-9_brightMIP.png is excluded by !**/*.png
  • docs/images/LoG_c1_4-4-2_brightMIP.png is excluded by !**/*.png
  • docs/images/LoG_c2_4-4-2_brightMIP.png is excluded by !**/*.png
  • docs/images/MaxFilter_c1_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/MaxFilter_c2_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/MeanFilter_c1_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/MeanFilter_c2_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/MedianFilter_c1_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/MedianFilter_c2_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/MinFilter_c1_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/MinFilter_c2_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/MultiplySum_c1_15-15-6_brightMIP.png is excluded by !**/*.png
  • docs/images/MultiplySum_c2_15-15-6_brightMIP.png is excluded by !**/*.png
  • docs/images/Opener_c1_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/Opener_c2_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/StdFilter_c1_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/StdFilter_c2_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/VarFilter_c1_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/VarFilter_c2_5-5-2_brightMIP.png is excluded by !**/*.png
  • docs/images/test_c1__brightMIP.png is excluded by !**/*.png
  • docs/images/test_c2__brightMIP.png is excluded by !**/*.png
  • src/Python/HIP.so is excluded by !**/*.so
📒 Files selected for processing (163)
  • .condaignore
  • .gitattributes
  • .github/PULL_REQUEST_TEMPLATE.md
  • .github/workflows/ci.yml
  • .github/workflows/matlab-multibuild.yml
  • .github/workflows/release.yml
  • .gitignore
  • BACKLOG.md
  • CHANGELOG.md
  • CLAUDE.md
  • CMakeLists.txt
  • CMakePresets.json
  • CODE_OF_CONDUCT.md
  • CONTRIBUTING.md
  • GEMINI.md
  • ROADMAP.md
  • SECURITY.md
  • TESTING.md
  • build-linux/build.md
  • build-win32/build.bat
  • build-win32/build.md
  • check_dll_deps.ps1
  • ci-readme.md
  • pyproject.toml
  • readme.md
  • src/MATLAB/+Hydra/@Cuda/CheckConfig.m
  • src/MATLAB/+Hydra/@Cuda/Closure.m
  • src/MATLAB/+Hydra/@Cuda/Cuda.m
  • src/MATLAB/+Hydra/@Cuda/DeviceCount.m
  • src/MATLAB/+Hydra/@Cuda/DeviceStats.m
  • src/MATLAB/+Hydra/@Cuda/ElementWiseDifference.m
  • src/MATLAB/+Hydra/@Cuda/EntropyFilter.m
  • src/MATLAB/+Hydra/@Cuda/Gaussian.m
  • src/MATLAB/+Hydra/@Cuda/GetMinMax.m
  • src/MATLAB/+Hydra/@Cuda/Help.m
  • src/MATLAB/+Hydra/@Cuda/HighPassFilter.m
  • src/MATLAB/+Hydra/@Cuda/Hydra.mexw64
  • src/MATLAB/+Hydra/@Cuda/IdentityFilter.m
  • src/MATLAB/+Hydra/@Cuda/Info.m
  • src/MATLAB/+Hydra/@Cuda/LoG.m
  • src/MATLAB/+Hydra/@Cuda/MaxFilter.m
  • src/MATLAB/+Hydra/@Cuda/MeanFilter.m
  • src/MATLAB/+Hydra/@Cuda/MedianFilter.m
  • src/MATLAB/+Hydra/@Cuda/MinFilter.m
  • src/MATLAB/+Hydra/@Cuda/MultiplySum.m
  • src/MATLAB/+Hydra/@Cuda/NLMeans.m
  • src/MATLAB/+Hydra/@Cuda/Opener.m
  • src/MATLAB/+Hydra/@Cuda/StdFilter.m
  • src/MATLAB/+Hydra/@Cuda/Sum.m
  • src/MATLAB/+Hydra/@Cuda/VarFilter.m
  • src/MATLAB/+Hydra/@Cuda/WienerFilter.m
  • src/MATLAB/+Hydra/CheckConfig.m
  • src/MATLAB/+Hydra/Closure.m
  • src/MATLAB/+Hydra/ElementWiseDifference.m
  • src/MATLAB/+Hydra/EntropyFilter.m
  • src/MATLAB/+Hydra/Gaussian.m
  • src/MATLAB/+Hydra/GetMinMax.m
  • src/MATLAB/+Hydra/Help.m
  • src/MATLAB/+Hydra/HighPassFilter.m
  • src/MATLAB/+Hydra/IdentityFilter.m
  • src/MATLAB/+Hydra/Info.m
  • src/MATLAB/+Hydra/LoG.m
  • src/MATLAB/+Hydra/MaxFilter.m
  • src/MATLAB/+Hydra/MeanFilter.m
  • src/MATLAB/+Hydra/MedianFilter.m
  • src/MATLAB/+Hydra/MinFilter.m
  • src/MATLAB/+Hydra/MultiplySum.m
  • src/MATLAB/+Hydra/NLMeans.m
  • src/MATLAB/+Hydra/Opener.m
  • src/MATLAB/+Hydra/StdFilter.m
  • src/MATLAB/+Hydra/Sum.m
  • src/MATLAB/+Hydra/VarFilter.m
  • src/MATLAB/+Hydra/WienerFilter.m
  • src/MATLAB/+Test/AccuracyTest.m
  • src/Python/HIP.py
  • src/Python/Hydra.py
  • src/Python/README.md
  • src/Python/Test/test_accuracy.py
  • src/Python/download-script.py
  • src/Python/environment.yml
  • src/Python/example_usage.py
  • src/Python/hydra_image_processor/README.md
  • src/Python/hydra_image_processor/__init__.py
  • src/Python/hydra_image_processor/core.py
  • src/Python/hydra_image_processor/cuda/__init__.py
  • src/Python/hydra_image_processor/cuda/core.py
  • src/Python/hydra_image_processor/local/__init__.py
  • src/Python/hydra_image_processor/local/core.py
  • src/Python/hydra_image_processor/utils/__init__.py
  • src/Python/hydra_image_processor/utils/masks.py
  • src/Python/test-hydra.py
  • src/Python/test_import.py
  • src/Python/test_nonchunking.py
  • src/Python/test_package.py
  • src/c/Cuda/CMakeLists.txt
  • src/c/Cuda/CudaAddTwoImages.cuh
  • src/c/Cuda/CudaClosure.cuh
  • src/c/Cuda/CudaElementWiseDifference.cuh
  • src/c/Cuda/CudaEntropyFilter.cuh
  • src/c/Cuda/CudaGaussian.cuh
  • src/c/Cuda/CudaHighPassFilter.cuh
  • src/c/Cuda/CudaIdentityFilter.cuh
  • src/c/Cuda/CudaLoG.cuh
  • src/c/Cuda/CudaMaxFilter.cuh
  • src/c/Cuda/CudaMeanAndVariance.cuh
  • src/c/Cuda/CudaMeanFilter.cuh
  • src/c/Cuda/CudaMedianFilter.cuh
  • src/c/Cuda/CudaMinFilter.cuh
  • src/c/Cuda/CudaMinMax.cuh
  • src/c/Cuda/CudaMultiplySum.cuh
  • src/c/Cuda/CudaNLMeans.cuh
  • src/c/Cuda/CudaOpener.cuh
  • src/c/Cuda/CudaStdFilter.cuh
  • src/c/Cuda/CudaSum.cuh
  • src/c/Cuda/CudaUtilities.h
  • src/c/Cuda/CudaVarFilter.cuh
  • src/c/Cuda/CudaWienerFilter.cuh
  • src/c/Cuda/ImageChunk.h
  • src/c/Cuda/Kernel.cu
  • src/c/Cuda/_TemplateKernel.cuh
  • src/c/Python/CMakeLists.txt
  • src/c/Python/HydraPyModule.cpp
  • src/c/Python/PyArgConverter.h
  • src/c/Python/PyIncludes.h
  • src/c/ScriptCmds/Commands/ScrCmdDeviceCount.h
  • src/c/ScriptCmds/GenCommands.h
  • src/c/ScriptCmds/ScriptCommandImpl.h
  • src/c/ScriptCmds/ScriptioMaps.h
  • src/c/test_back/CMakeLists.txt
  • src/c/test_back/test.cpp
  • src/c/test_back/test_accuracy.cpp
  • test_data/Closure_c1_5-5-2.tif
  • test_data/Closure_c2_5-5-2.tif
  • test_data/ElementWiseDifference_c1_reverse.tif
  • test_data/ElementWiseDifference_c2_reverse.tif
  • test_data/EntropyFilter_c1_5-5-2.tif
  • test_data/EntropyFilter_c2_5-5-2.tif
  • test_data/Gaussian_c1_19-19-9.tif
  • test_data/Gaussian_c2_19-19-9.tif
  • test_data/HighPassFilter_c1_19-19-9.tif
  • test_data/HighPassFilter_c2_19-19-9.tif
  • test_data/LoG_c1_4-4-2.tif
  • test_data/LoG_c2_4-4-2.tif
  • test_data/MaxFilter_c1_5-5-2.tif
  • test_data/MaxFilter_c2_5-5-2.tif
  • test_data/MeanFilter_c1_5-5-2.tif
  • test_data/MeanFilter_c2_5-5-2.tif
  • test_data/MedianFilter_c1_5-5-2.tif
  • test_data/MedianFilter_c2_5-5-2.tif
  • test_data/MinFilter_c1_5-5-2.tif
  • test_data/MinFilter_c2_5-5-2.tif
  • test_data/MultiplySum_c1_15-15-6.tif
  • test_data/MultiplySum_c2_15-15-6.tif
  • test_data/Opener_c1_5-5-2.tif
  • test_data/Opener_c2_5-5-2.tif
  • test_data/StdFilter_c1_5-5-2.tif
  • test_data/StdFilter_c2_5-5-2.tif
  • test_data/VarFilter_c1_5-5-2.tif
  • test_data/VarFilter_c2_5-5-2.tif
  • test_data/test_c0.tif
  • test_data/test_c1.tif
  • test_data/test_c1_.tif
  • test_data/test_c2_.tif

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch conda-forge

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fast-forwards main to a conda-forge-oriented v4.0.0 release state, centered on scikit-build-core packaging for the CUDA Python extension, CI/release gating, and restored/added GPU accuracy suites (C++ + Python TIFF) backed by Git LFS test assets.

Changes:

  • Reworks the Python build/install path around pyproject.toml + scikit-build-core, installing the compiled Hydra extension into the hydra_image_processor package and adding HIP/Hydra legacy import shims.
  • Adds CI build+import gates (Linux/Windows) and a tag-driven release workflow that enforces tag/version parity.
  • Adds/repairs accuracy test coverage and associated LFS-tracked ground-truth TIFFs + documentation for release testing.

Reviewed changes

Copilot reviewed 193 out of 194 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
TESTING.md Adds a release testing checklist, including local GPU accuracy gating steps.
test_data/VarFilter_c2_5-5-2.tif Adds LFS-tracked ground-truth TIFF for Python/MATLAB accuracy suite.
test_data/VarFilter_c1_5-5-2.tif Adds LFS-tracked ground-truth TIFF for Python/MATLAB accuracy suite.
test_data/test_c2_.tif Adds LFS-tracked input TIFF (test volume channel).
test_data/test_c1.tif Adds LFS-tracked input TIFF (test volume channel).
test_data/test_c1_.tif Adds LFS-tracked input TIFF (test volume channel variant).
test_data/test_c0.tif Adds LFS-tracked input TIFF (test volume channel).
test_data/StdFilter_c2_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/StdFilter_c1_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/Opener_c2_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/Opener_c1_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/MultiplySum_c2_15-15-6.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/MultiplySum_c1_15-15-6.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/MinFilter_c2_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/MinFilter_c1_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/MedianFilter_c2_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/MedianFilter_c1_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/MeanFilter_c2_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/MeanFilter_c1_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/MaxFilter_c2_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/MaxFilter_c1_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/LoG_c2_4-4-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/LoG_c1_4-4-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/HighPassFilter_c2_19-19-9.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/HighPassFilter_c1_19-19-9.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/Gaussian_c2_19-19-9.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/Gaussian_c1_19-19-9.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/EntropyFilter_c2_5-5-2.tif Adds LFS-tracked reference TIFF for EntropyFilter soft-check.
test_data/EntropyFilter_c1_5-5-2.tif Adds LFS-tracked reference TIFF for EntropyFilter soft-check.
test_data/ElementWiseDifference_c2_reverse.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/ElementWiseDifference_c1_reverse.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/Closure_c2_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
test_data/Closure_c1_5-5-2.tif Adds LFS-tracked ground-truth TIFF for accuracy suite.
src/Python/Test/test_accuracy.py Adds a Python TIFF-based GPU accuracy gate mirroring the MATLAB suite.
src/Python/test-hydra.py Adds a standalone smoke-test script for the legacy Hydra module import and basic calls.
src/Python/test_package.py Adds a standalone smoke-test script for the Pythonic hydra_image_processor API.
src/Python/test_nonchunking.py Updates a dev script to import Hydra (legacy shim) instead of HIP.
src/Python/test_import.py Adds a script to validate portable import with bundled OpenMP DLL on Windows.
src/Python/README.md Documents conda-forge installation, usage, and source builds for Python.
src/Python/Hydra.py Adds legacy top-level Hydra import shim to re-export hydra_image_processor.Hydra.
src/Python/hydra_image_processor/utils/masks.py Adds mask/structuring-element helpers (ball/ellipsoid) used by Python API/tests.
src/Python/hydra_image_processor/utils/init.py Exposes mask helpers as part of the public utilities module.
src/Python/hydra_image_processor/README.md Adds package-level README describing the Python wrapper architecture.
src/Python/hydra_image_processor/local/init.py Adds CPU “local” layer API surface (currently placeholder stubs).
src/Python/hydra_image_processor/cuda/init.py Adds CUDA wrapper layer exports for the Python package.
src/Python/hydra_image_processor/core.py Adds GPU-first wrapper functions with fallback plumbing.
src/Python/hydra_image_processor/init.py Adds package public API + metadata version sourcing from installed package metadata.
src/Python/HIP.so Removes legacy LFS-tracked binary extension artifact from the repo.
src/Python/HIP.py Adds legacy top-level HIP import shim to re-export hydra_image_processor.Hydra.
src/Python/example_usage.py Adds an example script demonstrating the Pythonic API and utilities.
src/Python/environment.yml Updates a conda environment definition for Python build/dev tooling.
src/Python/download-script.py Adds a helper script to download GitHub Actions artifacts for local testing.
src/MATLAB/+Test/AccuracyTest.m Adds/repairs MATLAB accuracy test suite aligned with test_data ground truth.
src/MATLAB/+Hydra/WienerFilter.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/VarFilter.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/Sum.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/StdFilter.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/Opener.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/NLMeans.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/MultiplySum.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/MinFilter.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/MedianFilter.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/MeanFilter.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/MaxFilter.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/LoG.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/Info.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/IdentityFilter.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/HighPassFilter.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/Help.m Adds MATLAB help wrapper for command help.
src/MATLAB/+Hydra/GetMinMax.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/Gaussian.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/EntropyFilter.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/ElementWiseDifference.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/Closure.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/CheckConfig.m Adds/updates MATLAB wrapper using CUDA-first with local fallback.
src/MATLAB/+Hydra/@Cuda/WienerFilter.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/VarFilter.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/Sum.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/StdFilter.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/Opener.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/NLMeans.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/MultiplySum.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/MinFilter.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/MedianFilter.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/MeanFilter.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/MaxFilter.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/LoG.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/Info.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/IdentityFilter.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/Hydra.mexw64 Adds LFS-tracked MATLAB mex binary for Windows.
src/MATLAB/+Hydra/@Cuda/HighPassFilter.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/Help.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/GetMinMax.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/Gaussian.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/EntropyFilter.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/ElementWiseDifference.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/DeviceStats.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/DeviceCount.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/Cuda.m Adds/updates MATLAB class interface listing CUDA entrypoints.
src/MATLAB/+Hydra/@Cuda/Closure.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/MATLAB/+Hydra/@Cuda/CheckConfig.m Adds/updates generated MATLAB CUDA wrapper calling the mex dispatcher.
src/c/test_back/test.cpp Adds missing <cstdint> include for newer toolchains.
src/c/test_back/test_accuracy.cpp Adds a minimal C++ accuracy test executable (skips if no CUDA device).
src/c/test_back/CMakeLists.txt Adds test_accuracy target and registers it with CTest.
src/c/ScriptCmds/ScriptioMaps.h Adds explicit <cstdint> include to avoid relying on transitive headers.
src/c/ScriptCmds/ScriptCommandImpl.h Adds explicit <cstdint> include to avoid relying on transitive headers.
src/c/ScriptCmds/GenCommands.h Adds explicit <cstdint> include to avoid relying on transitive headers.
src/c/ScriptCmds/Commands/ScrCmdDeviceCount.h Adds explicit <cstdint> include to avoid relying on transitive headers.
src/c/Python/PyIncludes.h Renames NumPy unique symbol to match the Hydra module naming.
src/c/Python/PyArgConverter.h Updates compile-time error strings from HIP to Hydra naming.
src/c/Python/HydraPyModule.cpp Renames Python extension module from HIP to Hydra.
src/c/Python/CMakeLists.txt Switches to Python3 targets, installs extension into package, installs shims.
src/c/Cuda/Kernel.cu Fixes missing throw when creating offset kernel out of bounds.
src/c/Cuda/ImageChunk.h Fixes missing throw in unsupported copy direction branch.
src/c/Cuda/CudaWienerFilter.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaVarFilter.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaUtilities.h Updates debug sync macro from deprecated cudaThreadSynchronize to cudaDeviceSynchronize.
src/c/Cuda/CudaSum.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaStdFilter.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaOpener.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaNLMeans.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaMultiplySum.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaMinMax.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaMinFilter.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaMedianFilter.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaMeanFilter.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaMeanAndVariance.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaMaxFilter.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaLoG.cuh Fixes missing throw on sendROI failure across LoG stages.
src/c/Cuda/CudaIdentityFilter.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaHighPassFilter.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaGaussian.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaEntropyFilter.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaElementWiseDifference.cuh Fixes missing throw on sendROI failure for either input ROI.
src/c/Cuda/CudaClosure.cuh Fixes missing throw on sendROI failure.
src/c/Cuda/CudaAddTwoImages.cuh Fixes missing throw on sendROI failure for either input ROI.
src/c/Cuda/_TemplateKernel.cuh Fixes missing throw in template kernel example.
src/c/Cuda/CMakeLists.txt Removes hardcoded architectures, adjusts OpenMP flagging, bumps CUDA standard to 17.
SECURITY.md Adds a security policy document.
readme.md Updates top-level README with conda-forge install, usage, and source build guidance.
pyproject.toml Adds scikit-build-core-based Python packaging metadata and build configuration.
GEMINI.md Adds repository guidance/overview document.
docs/images/VarFilter_c2_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/VarFilter_c1_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/test_c2__brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/test_c1__brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/StdFilter_c2_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/StdFilter_c1_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/Opener_c2_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/Opener_c1_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/MultiplySum_c2_15-15-6_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/MultiplySum_c1_15-15-6_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/MinFilter_c2_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/MinFilter_c1_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/MedianFilter_c2_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/MedianFilter_c1_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/MeanFilter_c2_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/MeanFilter_c1_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/MaxFilter_c2_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/MaxFilter_c1_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/LoG_c2_4-4-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/LoG_c1_4-4-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/HighPassFilter_c2_19-19-9_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/HighPassFilter_c1_19-19-9_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/Gaussian_c2_19-19-9_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/Gaussian_c1_19-19-9_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/EntropyFilter_c2_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/EntropyFilter_c1_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/ElementWiseDifference_c2_reverse_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/ElementWiseDifference_c1_reverse_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/Closure_c2_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
docs/images/Closure_c1_5-5-2_brightMIP.png Adds LFS-tracked documentation image asset.
CONTRIBUTING.md Updates contribution guide and adds local build/test + release process notes.
CODE_OF_CONDUCT.md Adds Contributor Covenant code of conduct.
CMakePresets.json Adds a Visual Studio preset for Windows builds.
CMakeLists.txt Updates minimum CMake version, default CUDA arch handling, Python3 discovery, test toggles.
CLAUDE.md Adds repository build/test/architecture guidance document.
ci-readme.md Adds CI/CD process documentation (appears to be historical guidance).
check_dll_deps.ps1 Adds a PowerShell helper for inspecting Windows DLL dependencies.
CHANGELOG.md Adds a v4.0.0 changelog with packaging/CI/test changes.
build-win32/build.md Removes outdated Windows build instructions file.
build-win32/build.bat Removes outdated Windows build batch script.
build-linux/build.md Removes outdated Linux build instructions file.
BACKLOG.md Adds a prioritized backlog/roadmap of operations.
.gitignore Updates ignore rules for build artifacts and compiled extensions.
.github/workflows/release.yml Adds a tag-driven release workflow with tag/version guard.
.github/workflows/matlab-multibuild.yml Adds multi-platform MATLAB toolbox build workflow.
.github/workflows/ci.yml Adds Windows/Linux build+import CI gate using conda-forge CUDA.
.github/PULL_REQUEST_TEMPLATE.md Adds a PR template.
.gitattributes Updates Git LFS tracking rules (adds *.tif).
.condaignore Adds conda-build ignore list to reduce source tarball noise.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +16 to +19
- pip:
- e==1.4.5
- hydra-image-processor==0.1.0
- pefile==2024.8.26
Comment on lines +4 to +7

Usage:
python scripts/download_artifacts.py --run-id <RUN_ID>
"""
import sys
import zipfile
from pathlib import Path
from urllib.request import urlretrieve, urlopen
Comment on lines +23 to +28
headers = {}
if token:
headers["Authorization"] = f"token {token}"

req = urlopen(url)
data = json.loads(req.read())
Comment on lines +41 to +50
# Use gh CLI if available for authenticated downloads
if token or subprocess.run(["gh", "--version"], capture_output=True).returncode == 0:
subprocess.run([
"gh", "api", url,
"-H", "Accept: application/vnd.github+json",
"-H", "X-GitHub-Api-Version: 2022-11-28",
"--output", str(output_path)
])
else:
urlretrieve(url, output_path)
Comment on lines +9 to +12
```bash
cd src/Python
pip install -e .
```
Comment on lines +1 to +4
# Hydra Image Processor - Python Package

A Pythonic wrapper for the Hydra Image Processor C++/CUDA library, providing GPU-accelerated image processing operations with automatic CPU fallback.

Comment thread SECURITY.md
Comment on lines +7 to +10
| Version | Supported |
| ------- | ------------------ |
| 3.x | :white_check_mark: |
| < 3.0 | :x: |
add_executable(test_back test.cpp)

target_link_libraries(test_back PRIVATE HydraCudaStatic)
target_include_directories(test_back PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}../Cuda)

target_link_libraries(test_accuracy PRIVATE HydraCudaStatic)

target_include_directories(test_accuracy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}../Cuda)
@ericwait
ericwait merged commit efa986d into main Jul 9, 2026
7 checks passed
@ericwait
ericwait deleted the conda-forge branch July 9, 2026 01:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants