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.
  • Shared 1-D interpolation. interp1d covers 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, 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.15.tar.gz (1.3 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.15-cp310-abi3-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10+Windows x86-64

petektools-0.2.15-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

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

petektools-0.2.15-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

petektools-0.2.15-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.6 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.15.tar.gz.

File metadata

  • Download URL: petektools-0.2.15.tar.gz
  • Upload date:
  • Size: 1.3 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.15.tar.gz
Algorithm Hash digest
SHA256 cd8c0820487ca589974765a788785cfa397a997c63694a64bb553b19bb1367f6
MD5 f5c79421c48bee388eb6974d81d17b2f
BLAKE2b-256 27bb061327d6e22f406efba1df1dedc760c02d85ce9cf8e0407a7765a794c036

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: petektools-0.2.15-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • 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.15-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 b0f8a02ed59ff23c373fd609694ee62cc837413b6987e404a6775270e4a881c1
MD5 9a7ad58ef253e7767a7e70ef5756ef50
BLAKE2b-256 c7d6d2affe5745dcae1e6d64216b92951b8d688a7055177aed08813744b3eb7c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for petektools-0.2.15-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2eeb0942fe5d55bcad5d2a8375d6294abdb029c609925c3cf55bbefa9da2b1cd
MD5 2a49b9d6787f1c6108e98e1938ee597d
BLAKE2b-256 9c1ef635237e6fa6d3135e332864df9d22e6647b0b009ecfaa285698a98358e1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for petektools-0.2.15-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7f3a32643af489ab35056288c55098b6ee840ca9df8aaf7838a917e914fc422a
MD5 b2fb86360252b44f03a8e61f1e17569c
BLAKE2b-256 00bf32ed9915cc6a38fd9a4b9b6b86904e905f42cc2541f541f519e0dbbac2b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for petektools-0.2.15-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.15-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.15-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 eac8ddf5ae4142089f8c76c0a975281ff13ddd07871f0db8a6b95929f0c85b59
MD5 ef3d2d5499a4dd4fd40b7cc0f0d7a725
BLAKE2b-256 4b35ae003adac0d0edb4c1c6a8d7c44ad140ce14a1aa94a959f349591191d1a1

See more details on using hashes here.

Provenance

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