Skip to main content

Standalone numerics & geostatistics kernels: reproducible sampling, curated descriptive/weighted statistics, realization-set aggregation, and a geostatistics front-door (experimental variogram, fit, local kriging, sequential Gaussian simulation).

Project description

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:

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 return ndarray::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.
  • Binding-friendly. Owned inputs, no public lifetimes on kernels; PyO3 bindings are a planned thin layer over this same surface.

Install

cargo add 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, ndarray out. 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

Apache-2.0 — see LICENSE and NOTICE.

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

petektools-0.2.3.tar.gz (1.1 MB view details)

Uploaded Source

Built Distributions

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

petektools-0.2.3-cp310-abi3-win_amd64.whl (902.9 kB view details)

Uploaded CPython 3.10+Windows x86-64

petektools-0.2.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (977.6 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

petektools-0.2.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (956.1 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

petektools-0.2.3-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.4 MB view details)

Uploaded CPython 3.10+macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file petektools-0.2.3.tar.gz.

File metadata

  • Download URL: petektools-0.2.3.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for petektools-0.2.3.tar.gz
Algorithm Hash digest
SHA256 066983563bb7fcaf5c982bb97c2d9bd2de8ad81fc7624ba5c8ba73de4584d691
MD5 b83455f68d46ab9352e0b9d190bcb051
BLAKE2b-256 2e9409b65f3ce31a16e08281945931e5c0722e2aebf070a353a5fc979403f429

See more details on using hashes here.

Provenance

The following attestation bundles were made for petektools-0.2.3.tar.gz:

Publisher: release.yml on kkollsga/petektools

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

File details

Details for the file petektools-0.2.3-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: petektools-0.2.3-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 902.9 kB
  • 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 petektools-0.2.3-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 15a7f13d13f50b0ef2334ee525e9e140d23ffcf6191b1ad0070203d6be11587b
MD5 5b9be982a5a9de905f564b25529b720d
BLAKE2b-256 7b496cba36a243e94f3f4209e590c0b37a850bea735d31d1d3080b9f1bc5caeb

See more details on using hashes here.

Provenance

The following attestation bundles were made for petektools-0.2.3-cp310-abi3-win_amd64.whl:

Publisher: release.yml on kkollsga/petektools

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

File details

Details for the file petektools-0.2.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for petektools-0.2.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 23d9627cace83a51082785fa537a150ecca77c409af2e3578edf8610636cbbb3
MD5 0cca537fe70b76a884ff953942f733d3
BLAKE2b-256 074bbcf0e5071cd19c0ad11041b8437f94f044043b985bdd6b34c63db35312b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for petektools-0.2.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on kkollsga/petektools

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

File details

Details for the file petektools-0.2.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for petektools-0.2.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 883e79f4e5ca83f968deb1c0faaeb549a5b200641443cc903e417c25b6abfcaa
MD5 e9191a0f99cb9a494e972b1c4dbcb66c
BLAKE2b-256 0991ca2c6e365dc1d49336a2b7ef7929fac49ea6edb879c8ec4d3fb78d5b4e94

See more details on using hashes here.

Provenance

The following attestation bundles were made for petektools-0.2.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on kkollsga/petektools

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

File details

Details for the file petektools-0.2.3-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for petektools-0.2.3-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 aa82f9c75171f0554809a987cadbe68b56d56ee87471a55cb066428dc634d80d
MD5 224b54a315d6263731ba345cdc4071d2
BLAKE2b-256 7db43fb2cc474bca4caaaa3121f717062dc985ab7ecd21e1eb0b61871bc0864f

See more details on using hashes here.

Provenance

The following attestation bundles were made for petektools-0.2.3-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on kkollsga/petektools

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