petekTools
Scattered-data gridding & geostatistics kernels for Rust — the numerics layer the ecosystem is missing.
Rust has excellent crates for linear algebra (faer), statistics and
distributions (statrs, rand_distr), FFT (rustfft), and spatial indexing
(kiddo, rstar). What it has lacked is a production-grade way to turn
scattered (x, y, z) observations into a regular grid — minimum-curvature
surfaces, inverse-distance weighting, nearest-neighbour fills. petekTools
fills exactly that gap, and curates the rest behind one small front-door.
If you have points and need a surface — a depth grid from well picks, a property map from samples, any scattered field on a regular lattice — this is the crate.
Documentation
The canonical docs for the whole petek family live on the petekSuite site — petekTools' pages there:
- Library guide — the petekTools guide.
- Tutorials — Synthetic data & testing · Visualization (the viewer unit ships in this wheel).
- Notebooks — executed examples: geostat tour · synthetic-data tour.
Why reach for it
- Real gridding methods, not toys. Briggs minimum-curvature (biharmonic SOR), inverse-distance weighting, and nearest-neighbour — the workhorses, with their defaults and tolerances stated and tested, not hand-waved.
- Warm-start / incremental re-gridding. Editing a surface point-by-point?
Re-solving from scratch each time is wasteful. Seed the solver from the prior
field and it converges in a fraction of the iterations — ~4–7× faster on a
typical structural edit, rising to ~114× in the near-converged incremental
limit (measured: 1.55 ms → 13.6 µs, 64 points → 40×40), converging to the same
field. A stateful [
ConvergentGridder] makes interactive, one-control-at-a-time refinement cheap. - Type-agnostic by design. Kernels speak a plain [
Lattice] +[[f64; 3]]rows and returnndarray::Array2<f64>— never a domain type. Any regular, rotatable areal lattice (the IRAP/RMS model) maps on field-for-field, so adoption is a conversion at the call site, not a rewrite. - Deterministic and honest. No RNG, no silent clamping; named, cited constants. Analytic cases are asserted as tests — a linear trend is the exact minimum-curvature solution, IDW is exact at coincident samples.
- A pure leaf. Depends only on general-purpose numeric crates. No I/O, no domain model, no heavy framework to adopt — drop it in.
- Small formula engine. Parse assignment strings, bind scalar
$params, order intra-block dependencies, and evaluate vectorized expressions over named arrays without pulling in any static-model semantics. - Shared 1-D interpolation.
interp1dcovers log-style resampling with nearest/step/linear methods and a natural cubic spline implemented in Rust. - One Rust/Python surface. Owned inputs and no public kernel lifetimes keep the native API binding-friendly; the shipped abi3 PyO3 wheel is a thin layer over that same implementation and includes the standalone bundle viewer.
Install
cargo add petektools
pip install petektools
Quick start
use petektools::{grid, GridMethod, Lattice};
// A 100×80 grid, 25 m spacing, origin at (1000, 2000).
let lattice = Lattice::regular(1000.0, 2000.0, 25.0, 25.0, 100, 80);
// Scattered observations: [x, y, z] rows.
let points = [
[1010.0, 2008.0, 12.5],
[1240.0, 2300.0, 18.1],
[1880.0, 3100.0, 9.4],
];
// Interpolate onto the grid → an (ncol × nrow) Array2<f64>;
// undefined nodes are NaN.
let surface = grid(&points, &lattice, GridMethod::MinimumCurvature).unwrap();
Methods
GridMethod |
What it does |
|---|---|
Nearest |
Each node takes its areally-closest sample's z (blocky, exact at data). |
InverseDistance |
Global IDW, p = 2; exact at coincident samples. |
MinimumCurvature |
Briggs biharmonic SOR — smooth, honours the samples. |
Warm-start an incremental re-grid
use petektools::{grid, grid_min_curvature_seeded, GridMethod, Lattice};
let lattice = Lattice::regular(0.0, 0.0, 1.0, 1.0, 64, 64);
let points = [[1.0, 1.0, 10.0], [60.0, 60.0, 40.0]];
let cold = grid(&points, &lattice, GridMethod::MinimumCurvature).unwrap();
// Later, after nudging the data: relax from the prior field instead of
// cold-starting. A None / wrong-shape seed falls back to a cold solve.
let warm = grid_min_curvature_seeded(&points, &lattice, Some(&cold)).unwrap();
Interactive refinement with ConvergentGridder
use petektools::{ConvergentGridder, Lattice};
let lattice = Lattice::regular(0.0, 0.0, 1.0, 1.0, 64, 64);
let points = [[1.0, 1.0, 10.0], [60.0, 60.0, 40.0]];
let mut gridder = ConvergentGridder::new(&points, &lattice).unwrap();
// Pin node (32, 40) to 25.0 as a hard constraint and re-solve incrementally.
let field = gridder.add_control(32, 40, 25.0); // warm — cheap
// … add more controls; each call returns the updated field.
Geometry: Lattice
A regular, rotatable areal lattice (the IRAP/RMS model): origin, spacing,
node counts, CCW rotation, and an optional y-flip. It carries the forward map
node_xy(i, j) and its inverse xy_to_ij(x, y), plus a bbox() — everything a
kernel needs to place a sample on the grid.
Design
- One job. Scattered-data gridding / geostatistics — the gap. Everything else (linear algebra, stats, neighbour search) is curated from mature crates, never reimplemented.
- Type-agnostic kernels.
Lattice+[[f64; 3]]in,ndarrayout. No domain types, no I/O. - Numerical honesty. Deterministic, documented to a stated tolerance, with analytic tests as the safety net.
See SPEC.md for the design constitution and API.md for
the locked public contract.
Status & roadmap
The public contract — Lattice, GridMethod, grid, the warm-start entries —
is locked and analytically tested. Also shipped: ordinary kriging behind a
Gridder trait, the curated stats / sampling front-doors over statrs /
rand_distr, the units / container / formula modules, the PyO3 wheel, the
generic viewer unit, and the wheel-only synthetic asset writer/composer. On the
roadmap: RBF backends if a need appears.
License
Metadata
Release files for petektools 0.2.15
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| petektools-0.2.15.tar.gz | 1.3 MB | With provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| petektools-0.2.15-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| petektools-0.2.15-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| petektools-0.2.15-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| petektools-0.2.15-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64, macOS 11.0+ ARM64, macOS 10.12+ universal2 (ARM64, x86-64) | Details |
Total release size: 6.3 MB
Release files / petektools-0.2.15.tar.gz
| Download URL | petektools-0.2.15.tar.gz |
|---|---|
| Size | 1.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cd8c0820487ca589974765a788785cfa397a997c63694a64bb553b19bb1367f6
|
|
BLAKE2b-256 checksum How to use checksums |
27bb061327d6e22f406efba1df1dedc760c02d85ce9cf8e0407a7765a794c036
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency logRelease files / petektools-0.2.15-cp310-abi3-win_amd64.whl
| Download URL | petektools-0.2.15-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
b0f8a02ed59ff23c373fd609694ee62cc837413b6987e404a6775270e4a881c1
|
|
BLAKE2b-256 checksum How to use checksums |
c7d6d2affe5745dcae1e6d64216b92951b8d688a7055177aed08813744b3eb7c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency logRelease files / petektools-0.2.15-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | petektools-0.2.15-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
2eeb0942fe5d55bcad5d2a8375d6294abdb029c609925c3cf55bbefa9da2b1cd
|
|
BLAKE2b-256 checksum How to use checksums |
9c1ef635237e6fa6d3135e332864df9d22e6647b0b009ecfaa285698a98358e1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency logRelease files / petektools-0.2.15-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | petektools-0.2.15-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
7f3a32643af489ab35056288c55098b6ee840ca9df8aaf7838a917e914fc422a
|
|
BLAKE2b-256 checksum How to use checksums |
00bf32ed9915cc6a38fd9a4b9b6b86904e905f42cc2541f541f519e0dbbac2b0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency logRelease files / petektools-0.2.15-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
| Download URL | petektools-0.2.15-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
eac8ddf5ae4142089f8c76c0a975281ff13ddd07871f0db8a6b95929f0c85b59
|
|
BLAKE2b-256 checksum How to use checksums |
4b35ae003adac0d0edb4c1c6a8d7c44ad140ce14a1aa94a959f349591191d1a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency logSecurity for petektools 0.2.15
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 5 files in this release have been uploaded with provenance metadata.
Attestation for petektools-0.2.15.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.