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.
  • 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 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.2.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.2-cp310-abi3-win_amd64.whl (834.0 kB view details)

Uploaded CPython 3.10+Windows x86-64

petektools-0.2.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (903.5 kB view details)

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

petektools-0.2.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (883.6 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

petektools-0.2.2-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.3 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.2.tar.gz.

File metadata

  • Download URL: petektools-0.2.2.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.2.tar.gz
Algorithm Hash digest
SHA256 d41c8bfa3bb439da5844b3f37b00e942baa1effd12b6f538b7ca9b63bd91716a
MD5 ea71520f64ed5d192bd1d3cabe533b22
BLAKE2b-256 1ccf7c59d8ce1384365e6bc90e3526c15c09366d5f863129d5e0db4e3eb299e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for petektools-0.2.2.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.2-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: petektools-0.2.2-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 834.0 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.2-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 e27ee5c3040109d4db9209b187649a852cac02573b62e0b9c60f525fc8cb3126
MD5 22645bada9a901b8107901118f36e766
BLAKE2b-256 2eea546b78cdfa9fc18ea0c30f0c5536b617e761ca609299634667ec030d94dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for petektools-0.2.2-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.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for petektools-0.2.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f34aa3e2e50bcf01d7be918e7779a6a58353d779b7bcabfbb47b7fb32ef82ccc
MD5 455ee12cb3197e5488fde6ef8b1a0d82
BLAKE2b-256 d18081ec99e7bb693e43c28305c671a67b3109824cd4e1b1a0f663625b899bc6

See more details on using hashes here.

Provenance

The following attestation bundles were made for petektools-0.2.2-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.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for petektools-0.2.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 801f435554e346eb4206e434d9dc83615ae587c2d2b7eb8e092cc4e02bde3f47
MD5 6d1b76560faaf60b29543499fd4b29bd
BLAKE2b-256 5df7e4aeaf1aac6176c23be53db4ee46643c4b1b76fa705ab056484da8e337fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for petektools-0.2.2-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.2-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.2-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 4cb58e2f45491916f7c6bf795a4d272fcd1f829aa925c45ad178dfab86c27bad
MD5 acda8557a3a661cbd9b76baf21007615
BLAKE2b-256 666bdfbeebb1615d4823e99649a00973f0529e6800ec9d5b47ae3022bef3d6fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for petektools-0.2.2-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