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
SingleToDoublePrecisionPerfRatioto 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5094a5215afdaa7ab254d0f2b2e9c7b865ea95f991d2714ebbabccbb1ec06d3e
|
|
| MD5 |
e6c89639e29874093c48eea38706d8ae
|
|
| BLAKE2b-256 |
58da7172856c4d9dac269485617c8507fadc447018b072154215395f6386072c
|
Provenance
The following attestation bundles were made for vibeproj-0.1.0.tar.gz:
Publisher:
publish.yml on jarmak-personal/vibeProj
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vibeproj-0.1.0.tar.gz -
Subject digest:
5094a5215afdaa7ab254d0f2b2e9c7b865ea95f991d2714ebbabccbb1ec06d3e - Sigstore transparency entry: 1114593985
- Sigstore integration time:
-
Permalink:
jarmak-personal/vibeProj@72649ad46566a8ec04182103ed2eff6e014a0142 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/jarmak-personal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@72649ad46566a8ec04182103ed2eff6e014a0142 -
Trigger Event:
release
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4fe0fa7b6709d3f20dc553d6f6c261307c3d06d574726993bb6d46f80ad10d9a
|
|
| MD5 |
cc22829ba3730947ebf1efb17ea9b3d3
|
|
| BLAKE2b-256 |
d4c680d765022df635ba08c1d4e574251771f87066791cfb4ff7c28606f17e2f
|
Provenance
The following attestation bundles were made for vibeproj-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on jarmak-personal/vibeProj
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vibeproj-0.1.0-py3-none-any.whl -
Subject digest:
4fe0fa7b6709d3f20dc553d6f6c261307c3d06d574726993bb6d46f80ad10d9a - Sigstore transparency entry: 1114593986
- Sigstore integration time:
-
Permalink:
jarmak-personal/vibeProj@72649ad46566a8ec04182103ed2eff6e014a0142 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/jarmak-personal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@72649ad46566a8ec04182103ed2eff6e014a0142 -
Trigger Event:
release
-
Statement type: