Skip to main content

Ultra-high-performance medical imaging I/O for deep learning

Project description

medrs

High-performance medical imaging I/O and processing library for Rust and Python.

Crates.io PyPI License

Overview

medrs is designed for throughput-critical medical imaging workflows, particularly deep learning pipelines that process large 3D volumes. It provides:

  • Fast NIfTI I/O: Memory-mapped reading, crop-first loading (read sub-volumes without loading entire files)
  • Transform Pipeline: Lazy evaluation that fuses consecutive axis-aligned resamples and trailing intensity operations (z-normalize, scaling, clamping) into a single pass, with portable SIMD acceleration
  • Mixed Precision: Native f16/bf16 support for 50% storage savings
  • Volumetric Compression: Optional .jvol codec (vendored from jvol-rust) for lossy wavelet compression of floating-point volumes
  • Random Augmentation: Reproducible, GPU-friendly augmentations for ML training
  • Python Bindings: Zero-copy numpy views, direct PyTorch/JAX tensor creation, GIL released around heavy operations
  • MONAI Integration: Drop-in replacements for MONAI transforms

Why medrs?

medrs memory-maps uncompressed .nii files, so opening a volume and materializing it to a numpy array is comparable to nibabel (which also memory-maps) and roughly 10-25x faster than MONAI and TorchIO, whose default loaders eagerly read the data and build a tensor. For gzipped .nii.gz, load time is bounded by the decompressor; medrs is competitive with nibabel and MONAI, and the parallel Mgzip format is the fast path for compressed data. All numbers below are reproducible with the scripts in benchmarks/ (see "Reproducing benchmarks").

Single File Loading

Load plus full materialization to a numpy array (median of repeated runs, so every library does the same work). Multiples are relative to medrs.

Volume Format medrs nibabel MONAI TorchIO SimpleITK
128³ .nii 1.3 ms 1.4x 14x 9x 4x
256³ .nii 17 ms 1.4x 23x 13x 4x
128³ .nii.gz 82 ms 0.6x 1.2x 0.2x 0.3x
256³ .nii.gz 370 ms 1.8x 2.5x 0.5x 0.1x

Measured on Apple Silicon with benchmarks/bench_load_comparison.py (float32, structured data). For uncompressed volumes medrs and nibabel both memory-map, so they are close; the large multiples are against loaders that materialize eagerly. For gzipped volumes SimpleITK and TorchIO decompress faster than medrs's single-threaded path, which is why medrs also offers the parallel Mgzip format.

Compressed Storage

Optional lossy .jvol (wavelet codec, see the Compression Formats section) gives large storage and bandwidth savings on floating-point volumes. Measured on a 256³ float32 volume:

Format Size vs raw Decode
raw .nii 67 MB 1x fastest (mmap)
.nii.gz 61 MB 1.1x baseline
jvol q80 3.1 MB 22x smaller about gzip speed
jvol q60 0.1-3 MB 20-600x smaller about gzip speed

jvol decode is roughly gzip speed, so its benefit is storage and bandwidth, not decode CPU. Mixed-precision bf16/f16 saves a fixed 50% of f32 with no codec.

Training Throughput (FastLoader)

The FastLoader prefetches patches across parallel worker threads with the GIL released. On 64³ random crops from gzipped volumes it delivers roughly 4x the throughput of a naive sequential load-and-crop loop (measured: 191 vs 49 patches/sec, 4 workers). Run your own with python benchmarks/bench_fastloader.py.

Key Advantages

  1. Crop-First Loading: Read only the cropped region from disk instead of loading the full volume, which matters most as volume size grows relative to patch size
  2. FastLoader: Parallel patch prefetching with the GIL released, roughly 4x a naive sequential loader
  3. Mixed Precision: Save in bf16/f16 for 50% smaller files, or lossy .jvol for 20-600x smaller
  4. MONAI Drop-in: Replace MONAI I/O transforms with one import change
  5. Zero-Copy: Direct tensor creation without intermediate numpy allocations

Reproducing benchmarks

The numbers above are illustrative snapshots; benchmarks/results/ is not checked into the repo (it's regenerated, not reproducible from git history alone). Regenerate them on your own hardware with:

pip install -e ".[examples]"

# Individual suites
python benchmarks/bench_medrs.py
python benchmarks/bench_nibabel.py
python benchmarks/bench_monai.py
python benchmarks/bench_torchio.py
python benchmarks/bench_mgzip.py
python benchmarks/bench_fastloader.py

# Or via cargo for the Rust-side microbenchmarks
cargo bench

# Plots and a combined comparison report
python benchmarks/compare_all.py
python benchmarks/plot_results.py

See benchmarks/BENCHMARK_PLAN.md for the full benchmark matrix (libraries, volume sizes, dtypes, formats).

Installation

Python

pip install medrs

Rust

[dependencies]
medrs = "0.1"

Development

git clone https://github.com/liamchalcroft/med-rs.git
cd med-rs
pip install -e ".[dev]"
maturin develop --features python

Quick Start

Python:

import medrs
import torch

# Load a NIfTI image
img = medrs.load("brain.nii.gz")
print(f"Shape: {img.shape}, Spacing: {img.spacing}")

# Method chaining for transforms
processed = img.resample([1.0, 1.0, 1.0]).z_normalize().clamp(-1, 1)
processed.save("output.nii.gz")

# Load directly to PyTorch tensor (most efficient)
tensor = medrs.load_to_torch("brain.nii.gz", dtype=torch.float16, device="cuda")

For training pipelines that repeatedly access the same files, use load_cached() for faster subsequent loads (caches decompressed data for .nii.gz files).

Rust:

use medrs::nifti;
use medrs::transforms::{resample_to_spacing, Interpolation};

fn main() -> medrs::Result<()> {
    let img = nifti::load("brain.nii.gz")?;
    println!("Shape: {:?}, Spacing: {:?}", img.shape(), img.spacing());

    let resampled = resample_to_spacing(&img, [1.0, 1.0, 1.0], Interpolation::Trilinear)?;
    nifti::save(&resampled, "output.nii.gz")?;
    Ok(())
}

Transform Pipeline

Build composable transform pipelines with lazy evaluation and automatic optimization:

Python:

import medrs

# Create a reusable pipeline
pipeline = medrs.TransformPipeline()
pipeline.z_normalize()
pipeline.clamp(-1.0, 1.0)
pipeline.resample_to_shape([64, 64, 64])

# Apply to multiple images
for path in image_paths:
    img = medrs.load(path)
    processed = pipeline.apply(img)

Rust:

use medrs::pipeline::compose::TransformPipeline;

let pipeline = TransformPipeline::new()
    .z_normalize()
    .clamp(-1.0, 1.0)
    .resample_to_shape([64, 64, 64]);

let processed = pipeline.apply(&img);

Random Augmentation

Reproducible augmentations for ML training with optional seeding:

Python:

import medrs

img = medrs.load("brain.nii.gz")

# Individual augmentations
flipped = medrs.random_flip(img, axes=[0, 1, 2], prob=0.5, seed=42)
noisy = medrs.random_gaussian_noise(img, std=0.1, seed=42)
scaled = medrs.random_intensity_scale(img, scale_range=0.1, seed=42)
shifted = medrs.random_intensity_shift(img, shift_range=0.1, seed=42)
rotated = medrs.random_rotate_90(img, axes=(0, 1), seed=42)
gamma = medrs.random_gamma(img, gamma_range=(0.7, 1.5), seed=42)

# Combined augmentation (flip + noise + scale + shift)
augmented = medrs.random_augment(img, seed=42)

Rust:

use medrs::transforms::{random_flip, random_gaussian_noise, random_augment};

// Individual augmentations
let flipped = random_flip(&img, &[0, 1, 2], Some(0.5), Some(42))?;
let noisy = random_gaussian_noise(&img, Some(0.1), Some(42))?;

// Combined augmentation
let augmented = random_augment(&img, Some(42))?;

Mgzip: Parallel Compressed Loading

For .nii.gz files, medrs supports the Mgzip (multi-member gzip) format for parallel decompression. Mgzip files are backwards-compatible with standard gzip; at 8 threads, decompression is 2-3x faster than medrs's own single-threaded libdeflate baseline. Single-threaded Mgzip is slightly slower than that baseline (channel and buffer overhead dominate below 2-3 threads), so it only pays off once you have a few cores to spare.

Performance (256³ volume)

Method Time vs nibabel
nibabel 173ms
medrs.load() 126ms 1.4×
medrs.load_mgzip(8 threads) 47ms 3.7×

Usage

import medrs

# Convert existing .nii.gz to Mgzip format (one-time)
medrs.convert_to_mgzip("brain.nii.gz", "brain.mgz.nii.gz", num_threads=8)

# Load with parallel decompression
img = medrs.load_mgzip("brain.mgz.nii.gz", num_threads=8)

# Save directly in Mgzip format
medrs.save_mgzip(img, "output.mgz.nii.gz", num_threads=8)

# Check if file is Mgzip format
if medrs.is_mgzip("file.nii.gz"):
    img = medrs.load_mgzip("file.nii.gz")

Batch Conversion CLI

Convert entire datasets with the included CLI tool:

# Convert all .nii.gz files in a directory (recursive)
python -m medrs.cli convert-mgzip data/*.nii.gz -r -w 8 -v

# Options:
#   -r, --recursive    Search subdirectories
#   -w, --workers N    Parallel conversion threads (default: CPU count)
#   -v, --verbose      Show progress
#   --suffix .mgz      Output suffix (default: replaces .nii.gz with .mgz.nii.gz)

When to Use Mgzip

  • Large compressed datasets (100+ files, 256³+ volumes)
  • Multi-core systems (4+ cores)
  • Repeated access (training pipelines that load same files across epochs)

Mgzip files are ~1% larger than standard gzip but provide significant speedups. Standard gzip readers (nibabel, etc.) can still read Mgzip files.

Crop-First Loading

Load only the data you need - essential for training pipelines:

import medrs
import torch

# Load a 64^3 patch starting at position (32, 32, 32)
patch = medrs.load_cropped("volume.nii", [32, 32, 32], [64, 64, 64])

# Load with resampling and reorientation in one step
patch = medrs.load_resampled(
    "volume.nii",
    output_shape=[64, 64, 64],
    target_spacing=[1.0, 1.0, 1.0],
    target_orientation="RAS"
)

# Load directly to GPU tensor
tensor = medrs.load_cropped_to_torch(
    "volume.nii",
    output_shape=[64, 64, 64],
    target_spacing=[1.0, 1.0, 1.0],
    dtype=torch.float16,
    device="cuda"
)

Training Data Loaders

TrainingDataLoader

LRU-cached patch extraction with prefetching:

import medrs

loader = medrs.TrainingDataLoader(
    volumes=["vol1.nii", "vol2.nii", "vol3.nii"],
    patch_size=[64, 64, 64],
    patches_per_volume=4,
    patch_overlap=[0, 0, 0],
    randomize=True,
    cache_size=1000
)

for patch in loader:
    tensor = patch.to_torch()

FastLoader

Parallel prefetching loader for large .nii.gz datasets (100k+ files):

import glob
import medrs

loader = medrs.FastLoader(
    volumes=glob.glob("data/*.nii.gz"),
    patch_shape=[64, 64, 64],
    prefetch=16,
    workers=4,
    shuffle=True,
    seed=42
)

for patch in loader:
    tensor = patch.to_torch()

Available Transforms

Intensity Transforms

  • z_normalize() / z_normalization() - Zero mean, unit variance
  • rescale() / rescale_intensity() - Scale to [min, max] range
  • clamp() - Clamp values to range

Spatial Transforms

  • resample() - Resample to target spacing (also TransformPipeline.resample_to_spacing(); the Rust API exposes the same function as resample_to_spacing)
  • resample_to_shape() - Resample to target shape
  • reorient() - Reorient to standard orientation (RAS, LPS, etc.)
  • crop_or_pad() - Crop or pad to target shape
  • flip() - Flip along specified axes

Random Augmentation

  • random_flip() - Random axis flipping
  • random_gaussian_noise() - Additive Gaussian noise
  • random_intensity_scale() - Random intensity scaling
  • random_intensity_shift() - Random intensity offset
  • random_rotate_90() - Random 90-degree rotations
  • random_gamma() - Random gamma correction
  • random_augment() - Combined augmentation pipeline

Performance

medrs uses several optimization strategies:

  • SIMD: Hot loops use portable SIMD (wide::f32x8), which lowers to two SSE registers on the x86-64 baseline and a single AVX2 register only when built with -C target-feature=+avx2 or -C target-cpu=native (see make build-native; the distributed wheels use the SSE2 baseline)
  • Parallel Processing: Rayon-based parallelism for large volumes
  • Lazy Evaluation: Transform pipelines fuse consecutive axis-aligned resamples and trailing intensity operations into a single pass before execution
  • Memory Mapping: Large files are memory-mapped to avoid full loads
  • Parallel Decompression: Mgzip format enables multi-threaded gzip decompression

Compression Formats

Format Type Best for
.nii Uncompressed Fastest load (memory-mapped), byte-exact crop-first reads
.nii.gz gzip Standard interchange; use load_mgzip/Mgzip for parallel decode
.jvol Wavelet + Rice coding (optional jvol feature) Storage- and bandwidth-bound workflows on floating-point volumes

.jvol is an optional volumetric codec, vendored from jvol-rust by Fernando Pérez-García (MIT licensed; see Credits). It supports two modes:

  • Lossy (quality=1..100): wavelet compression tuned for floating-point intensity volumes, typically 10x to 500x smaller than the source depending on quality. This is the mode .jvol is designed for.
  • Lossless: exact round-trip, but only roughly gzip-parity in file size, and decode is more CPU-intensive than gzip or Mgzip. Prefer .nii.gz / .nii.mgz when load speed matters more than storage.

Lossy encoding is rejected outright for integer/label data (medrs returns an error) since wavelet quantization would silently corrupt segmentation values; use lossless mode for labels.

import medrs

img = medrs.load("brain.nii.gz")

# Lossy, tuned for floating-point intensity volumes
medrs.save_jvol(img, "brain.jvol", quality=60)

# Lossless (required for label/segmentation volumes)
medrs.save_jvol(seg, "seg.jvol", lossless=True)

# .jvol loads transparently through the normal load() entry point
restored = medrs.load("brain.jvol")

# Convert an existing file directly
medrs.convert_to_jvol("brain.nii.gz", "brain.jvol", quality=60)
use medrs::jvol::{self, JvolOptions};

let img = medrs::nifti::load("brain.nii.gz")?;
jvol::save(&img, "brain.jvol", JvolOptions::lossy(60))?;
let restored = jvol::load("brain.jvol")?;

Build with the jvol cargo feature (cargo build --features jvol); the python feature enables it automatically, so the published Python wheel includes .jvol support. See docs/guides/compression.rst for the full format writeup.

Examples

See the examples/ directory for:

  • basic/ - Loading, transforms, and saving
  • integrations/ - PyTorch, MONAI, JAX integration
  • advanced/ - Async pipelines, custom transforms

Testing

# Rust tests
cargo test
cargo test --features jvol

# Python tests
pytest tests/

# Benchmarks (see "Reproducing benchmarks" above)
python benchmarks/bench_medrs.py --quick
python benchmarks/bench_monai.py --quick
python benchmarks/bench_torchio.py --quick

# Generate benchmark plots
python benchmarks/plot_results.py

License

medrs is dual-licensed under MIT and Apache-2.0. See LICENSE for details. The vendored .jvol codec (src/jvol/codec/) is MIT-licensed separately; see LICENSE-jvol and Credits.

Credits

The .jvol volumetric compression codec (src/jvol/codec/) is vendored from jvol-rust by Fernando Pérez-García, MIT licensed. Only the codec modules (wavelet lifting, entropy coding, subband management, type definitions) are vendored; medrs's own NIfTI I/O front-end and Python bindings wrap it. Full license text: LICENSE-jvol.

Contributing

See CONTRIBUTING.md for guidelines.

Maintainer

Liam Chalcroft (liam.chalcroft.20@ucl.ac.uk)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

medrs-0.2.0.tar.gz (334.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

medrs-0.2.0-cp313-cp313-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.13Windows x86-64

medrs-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

medrs-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

medrs-0.2.0-cp313-cp313-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

medrs-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

medrs-0.2.0-cp312-cp312-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.12Windows x86-64

medrs-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

medrs-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

medrs-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

medrs-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

medrs-0.2.0-cp311-cp311-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.11Windows x86-64

medrs-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

medrs-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

medrs-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

medrs-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

medrs-0.2.0-cp310-cp310-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.10Windows x86-64

medrs-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

medrs-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

medrs-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

medrs-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

File details

Details for the file medrs-0.2.0.tar.gz.

File metadata

  • Download URL: medrs-0.2.0.tar.gz
  • Upload date:
  • Size: 334.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for medrs-0.2.0.tar.gz
Algorithm Hash digest
SHA256 3a73ed73a456232395d93979b9736a7ef31225e555341cb907d340158b433d74
MD5 25b9577710dcf0c51e8ef88bd0d9fc99
BLAKE2b-256 91029b18f8fcd8e008557feb02d867bb96ab79807c59d0476ad6fa9709ee0ea8

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0.tar.gz:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: medrs-0.2.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for medrs-0.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 25320365a50704b96372210dd071cdd38b3c43254281f135a21a5ebff21305c1
MD5 27141bd6b108735c5d897f5af4e49f3f
BLAKE2b-256 3d4d85425d5a25ab8ec0dada9baf9a30d7ffa04e068b123a16364669ec1488bc

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bf54dc1cf05f91f0db5be51f3fa15792d394a618bceee85b69888ccbd72822e3
MD5 af97d481dce3a23dc41ba0b2363fb6e3
BLAKE2b-256 715fe3ec040e2d48321147d918ccfdaf7892a1212dbb9aa3c93cf83284e4f29b

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 23de050b242c21a302cc6c2344cb9dd08a5eac7be5e6ecdb14043403bd97ecf3
MD5 988a95d862c24c975f6cfd33b4cdb444
BLAKE2b-256 9d08f78fe5107f0e853ad49e167aa2b6e3eb58581508d4a00a81f426df75799f

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7df32c260dda1573026ac0073b5b38ba3697a9309ac4d2e47377cde4c45251fa
MD5 ded657bde9d9c0d037c55fd52baf148c
BLAKE2b-256 d0a4ac97290b003ee52f542c54600792dbe96779441f376a4d2716cef26ebc0e

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8545d7ec6635301415f38a03a0fb25ac5aa91e08696f72141cdbb2cb6c84a15e
MD5 e2b71c86bffcce171a449b204327f3cf
BLAKE2b-256 4e94428043b29d171edb09364c6a81b6bfd5ff4596fa863f7148ef692540275f

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: medrs-0.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for medrs-0.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 54f307e12e2128f9a1fd329f4a9789eb5ac67b414628478e96b18487b70c9845
MD5 a23f6b865df942c119149650daa75372
BLAKE2b-256 7560cde7dcd915b41a53bd764d27f33e111d4926e4758e8db5e5655b1a0701ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b653bf360961d143ebb43dfbd94a3e9138f3fe8b779f901c107cad3b04eb96eb
MD5 754f27152fce3c851003320e55435897
BLAKE2b-256 62cc6ff92d6714fe6664f3a33b4c350bf3c430b28695f5ea429bf56b943c8ec2

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 709d41924045e2336729be9b92ce0421fdc108c760f1a820ade4bc6a873eab93
MD5 5a7bb02a77813286e311ca7bd21ccffc
BLAKE2b-256 a0bec55c85f7849e1e84e5864a3ed5a375d88e1ff534901b8b34af3732592fe6

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3d0b059536c6b247a40fc8782445718fdc582254daf080195a4f9625c13d5574
MD5 ddfde486522cdb3f0168a236686164a0
BLAKE2b-256 57720b07bdf78b0b70ab58b926883d69ef4e73d7b82000aba92e8801a992e1e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7b13d71bae9873345e3f89cebda4d0653becd24a8adc4e85d77411dd3e9e9022
MD5 be2e560e5b720961fb8622e8651deb78
BLAKE2b-256 04cb8c4fe2c5bb409482bb1ba390157bf64c36b0e19826454cfc6d9a25a880fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: medrs-0.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for medrs-0.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 832e9b49d8f9b21f6d744f96056b13fe08355bedeffbc4d3862a2ba2e4c422f6
MD5 822a6efa427453665e8b482d6259a194
BLAKE2b-256 90dd86472dd17f0a7cc5cce6a2097de74caf5269ef7375ddfdcb1aa4cc7d9ed2

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6cb30c6f6042b8ec36dc61721044837759e8ce20fe20ec0e76e26f95517c245f
MD5 ee63a9d030cada27f97100760fda0efb
BLAKE2b-256 95e237222071f8a94b0260b40e9b8cec58552d8138594cb2ef3a712876296c0e

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6388f9d09bbf05269fb58cbee53aae8097873e89e08628d7a78721760061082e
MD5 510727e7a91793a3f59f482f3064babe
BLAKE2b-256 fd8dc5ef08ec093f422bf577f4b32783b6e32f8c26f4625b10f8f60763bf6504

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dc20d669b4900a0dfda1e621e2299fb94e4b13bb017368bfed25d77853c92846
MD5 a35b25690e9f32342420fa5d527677f2
BLAKE2b-256 f8d1de0e491054ba11d6b55cda98f8bf01397ad714c8544d0c0c5fa141bdddbb

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 05bbb7c60838b6f1697db7e518b08e401488b2ea284b9e248d24940df1f279ce
MD5 7b98fba8fb64c26bc4175a698134711b
BLAKE2b-256 3be2d42897473800623457322a481d3b977bfec481db659f974c2e7dcfdc7b12

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: medrs-0.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for medrs-0.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 92f285fac529297442e8439acb6a23ddd13ccb4a2accd234b433dbffda759988
MD5 62f3c821243a359aecc139cb8e695301
BLAKE2b-256 7526a86ef87b2fd9ce6ede3d8927c1629c92eb87c76e53262e710ac9f7a21bd4

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp310-cp310-win_amd64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8a163f26b02d808aef4cb345a285866641465bf892fa78f7964010c1ac010b66
MD5 33ae1419dda48e153c566fef3426f24c
BLAKE2b-256 33f98f701463a8c4ab67967cfb21c2e6236232d46e8efc2c4121369128ae11d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f51b20c34a0bcec2c45b5c1305b8b66d77cbb966a6935735a146a5d2c5a42486
MD5 70d5348bfa1254a3794fa17cd436d824
BLAKE2b-256 dcbb27f0e837d0906f5dd7e4932742cc9791805ad32e658ba8b99f536dd2a666

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7a12c7d3573061e6152c5f6e6d4e2fa736b914c47c527746d090fcd571b5e631
MD5 c8f72d9c354ab9479c7eda1d8633a648
BLAKE2b-256 953897312f2bc124bfc15c58b5b869c99574cc052216492549436f8dd25e1d01

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file medrs-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for medrs-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ea06c5198949f38c05de112b11cd8a32ecd9363dabfeb41eccefdf8bd26782b7
MD5 6240551da4ceff9146f2c97f3b13071a
BLAKE2b-256 f829ce505cfcca9423c0a2df7df9d43fb2bbf78a79f39c2132a243129ffc6829

See more details on using hashes here.

Provenance

The following attestation bundles were made for medrs-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl:

Publisher: publish.yml on liamchalcroft/med-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page