Skip to main content

GPU-accelerated coordinate projection library

Project description

vibeProj

GPU-accelerated coordinate projection library. Extracted from RAPIDS cuProj, re-engineered as a pure Python + CuPy package, and expanded from 1 to 20 projections — each with a fused NVRTC kernel that runs the full transform pipeline in a single GPU kernel launch.

Performance

On an RTX 4090 vs i9-13900k, 1M coordinates: (Note: datacenter GPUs will see far higher speedups due to better double precision performance)

Projection GPU vs CPU
Transverse Mercator / UTM 0.50 ms 260x
Lambert Conformal Conic 0.54 ms 82x
Albers Equal Area 0.28 ms 114x
Web Mercator 0.15 ms 95x
Equal Earth 0.21 ms 139x
Plate Carrée 0.04 ms 169x

All 20 projections run sub-millisecond at 1M coordinates. See full benchmark in the repo.

Supported Projections

Projection Internal Name EPSG Examples
Transverse Mercator / UTM tmerc 32601–32760, 27700
Web Mercator webmerc 3857
Mercator (ellipsoidal) merc 3395
Lambert Conformal Conic lcc 2154
Albers Equal Area aea 5070
Polar Stereographic stere 3031, 3413
Lambert Azimuthal Equal Area laea 3035
Oblique Stereographic sterea 28992
Plate Carrée eqc 4087
Sinusoidal sinu
Equal Earth eqearth 8857
Cylindrical Equal Area cea 6933
Orthographic ortho
Gnomonic gnom
Mollweide moll
Robinson robin
Winkel Tripel wintri
Natural Earth natearth
Azimuthal Equidistant aeqd
Geostationary Satellite geos

Install

pip install vibeproj          # CPU-only (NumPy fallback)
pip install vibeproj[gpu]     # with CuPy for GPU acceleration

For development:

uv sync               # CPU-only
uv sync --group gpu   # with CuPy

Usage

from vibeproj import Transformer

# Default: native CRS axis order (matches pyproj)
t = Transformer.from_crs("EPSG:4326", "EPSG:32631")
x, y = t.transform(49.0, 2.0)           # (lat, lon) in, (easting, northing) out

# always_xy=True: (lon, lat) order — matches shapely/geopandas
t = Transformer.from_crs("EPSG:4326", "EPSG:32631", always_xy=True)
x, y = t.transform(2.0, 49.0)           # (lon, lat) in, (easting, northing) out

vibeSpatial Integration (zero-copy GPU)

# Pre-allocated output, no intermediate allocations, stays on GPU
t = Transformer.from_crs(src_crs, dst_crs, always_xy=True)
new_x = cp.empty_like(buf.x)
new_y = cp.empty_like(buf.y)
t.transform_buffers(buf.x, buf.y, out_x=new_x, out_y=new_y)

transform_buffers() accepts pre-allocated CuPy output arrays, writes results directly into them, and returns the same objects. No host round-trip, no intermediate allocation. Designed for vibeSpatial's OwnedGeometryArray coordinate buffers.

Architecture

  • Pure Python + CuPy — no compiled extensions, no CMake
  • Fused NVRTC kernels — each projection's full pipeline (axis swap, deg/rad, central meridian, projection math, scale/offset) runs in a single CUDA kernel launch via CuPy RawKernel
  • NumPy fallback — all projections work on CPU when CuPy is unavailable
  • pyproj for CRS metadata — EPSG codes resolved via pyproj, transform math is ours
  • fp64 I/O — input/output arrays always double precision (ADR-0002 compliant)
  • Auto GPU detection — queries SingleToDoublePrecisionPerfRatio to classify consumer vs datacenter GPU

Test

uv run pytest                    # all tests (85 total)
uv run pytest tests/test_fused_kernels.py  # GPU kernel tests (requires CuPy)

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

vibeproj-0.1.0.tar.gz (73.6 kB view details)

Uploaded Source

Built Distribution

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

vibeproj-0.1.0-py3-none-any.whl (57.4 kB view details)

Uploaded Python 3

File details

Details for the file vibeproj-0.1.0.tar.gz.

File metadata

  • Download URL: vibeproj-0.1.0.tar.gz
  • Upload date:
  • Size: 73.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for vibeproj-0.1.0.tar.gz
Algorithm Hash digest
SHA256 5094a5215afdaa7ab254d0f2b2e9c7b865ea95f991d2714ebbabccbb1ec06d3e
MD5 e6c89639e29874093c48eea38706d8ae
BLAKE2b-256 58da7172856c4d9dac269485617c8507fadc447018b072154215395f6386072c

See more details on using hashes here.

Provenance

The following attestation bundles were made for vibeproj-0.1.0.tar.gz:

Publisher: publish.yml on jarmak-personal/vibeProj

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

File details

Details for the file vibeproj-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: vibeproj-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 57.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for vibeproj-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4fe0fa7b6709d3f20dc553d6f6c261307c3d06d574726993bb6d46f80ad10d9a
MD5 cc22829ba3730947ebf1efb17ea9b3d3
BLAKE2b-256 d4c680d765022df635ba08c1d4e574251771f87066791cfb4ff7c28606f17e2f

See more details on using hashes here.

Provenance

The following attestation bundles were made for vibeproj-0.1.0-py3-none-any.whl:

Publisher: publish.yml on jarmak-personal/vibeProj

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