Tetration
STILL IN DEVELOPMENT — layout v1 and query JSON/TOML may change before 1.0.
HDF5-shaped persistence (many large arrays in one durable file), Zarr-shaped chunking (regular grid, per-chunk compression, parallel I/O)—in a single mmap-friendly .tet file`, not a directory of shard blobs.
What it does today (v1)
- On-disk layout — superblock, dataset directory, chunk index, raw or zstd payloads (
docs/layout_v1.md). - Mmap + read planning — logical slices → chunk coordinates →
ReadPlan. - JSON / TOML query + execute — flat query documents (paired examples in
fixtures/queries/), streaming reductions, tier-C stats, spill export,transform(zscore, minmax, l1/l2, center, scale, log1p, sqrt, softmax) andnan_mean/nan_std; named axes, coord label selection, QC counts (nan_count,null_count,inf_count,any_inf), covariance / correlation (docs/query_engine.md). - Import / export —
tet convertfrom HDF5, NetCDF, Zarr v3;tet exportback to Zarr v3 (stored chunk bytes, nested groups). - File health —
tet verify(quick scan;--deepdecodes every chunk),tet repair(plan /--applysafe fixes). - CLI —
tet info,tet verify,tet repair,tet query,tet qhist,tet convert,tet export. - Optional GPU (Phase 10, experimental) —
execution.device/tet query --devicefor tier-A/Bf32(andf16on device); Metal (tetration-metal, macOS), CUDA (tetration-gpu), streaming fold + multi-GPU when host RAM does not fit a dense buffer. CPU streaming fold remains the default for large selections. - C ABI — feature
tetration-ffi,include/tetration.h,docs/ffi.md.
Wire dtypes (tags 1–10, row-major chunks): f32, f64, i32, i64, u8, u16, i16, u32, f16, u64. Booleans import as u8. See docs/layout_v1.md.
Quick start
macOS — Homebrew (recommended)
One-time tap (this repo ships Formula/tetration.rb; pulls in HDF5 and NetCDF for tet convert):
Upgrade later: brew upgrade tetration.
From a local clone (no tap): brew install --build-from-source Formula/tetration.rb
cargo install
Default features need system HDF5 and NetCDF dev libraries (.h5 / .nc convert; Zarr v3 is Rust + bundled zstd):
| Platform | Typical packages |
|---|---|
| Debian / Ubuntu | libhdf5-dev, libnetcdf-dev, pkg-config, build-essential |
| macOS (Homebrew) | brew install hdf5 netcdf pkg-config |
| Windows | OpenSSL + NetCDF/HDF5 (e.g. vcpkg or conda-forge); see .github/scripts/ for CI hints |
Without HDF5/NetCDF libs: cargo install tetration --no-default-features — tet info / tet query on .tet files and Zarr import still work.
Build from source
# or: alias tet="$PWD/target/release/tet"
First commands
Daily driver: plan + execute with readable stdout:
Query documents are flat JSON or TOML (e.g. "mean": [] / mean = [], "spill": "slice.bin"); nested "operation" objects are rejected. Details: query document.
tet commands
docs/cli.md — tet info, tet verify, tet repair, tet query, tet qhist, tet convert, tet export (flags and subcommands). Live help: tet -h and tet <command> -h.
Documentation map
| Doc | Contents |
|---|---|
docs/cli.md |
tet commands: flags and subcommands (info, verify, repair, query, qhist, convert, export) |
docs/layout_v1.md |
On-disk layout v1: superblock, dataset catalog, chunk index, codecs, footer metadata/history, concurrency |
docs/query_engine.md |
Query JSON/TOML wire, planning, fold/spill execution, optional GPU, JSON security |
docs/ffi.md |
C ABI (tetration-ffi): include/tetration.h, linking, examples/ffi_query.c, release archives |
docs.rs / tetration |
Rust crate API (prelude, TetFile, execute_query_json, convert, verify, …) |
Design stance (short)
Partial I/O is the default case — mmap payload regions, touch only chunks that intersect the selection, parallel decode across disjoint tiles. Full-array loads into RAM are not required for planning or tier-A/B aggregates.
JSON/TOML is the control plane, not the storage encoding: hosts validate input, cap size, and enforce spill path policy (security notes).
Concurrency and scale
Read-many / write-once is the supported scale model for v1:
| Role | Contract |
|---|---|
| Writer | One process (or coordinated TetWriterSession / tet convert) finishes the file before readers rely on it. v1 defines no file locking or live append protocol. |
| Reader | Any number of processes or hosts may mmap read-only the same sealed .tet and run independent queries. The OS shares cold pages via the page cache; each query touches only chunks in its ReadPlan. |
| Per query | Tier-A/B folds merge chunk-local partials (parallel Rayon when in-core; linear scan when out-of-core). Temp spills use unique paths (pid + timestamp); export spill paths must differ per worker. |
Not supported without extra coordination: multiple writers on one file, read-while-write, or two workers writing the same export spill path.
CPU workers: scale out with N processes × independent queries (or datasets), not by sharding one query inside the engine today. Phase 10 GPU uses the same chunk-parallel shape: dense materialize when RAM allows, else streaming device fold (gpu/streaming_fold.rs); cuda:multi / rocm:multi shard chunks across devices — see query engine — scalability.
Wire details: docs/layout_v1.md — Concurrency.
Non-goals (v1): SQL-on-files, arbitrary codec plugins, GPU codecs in the file format. Optional GPU: docs/query_engine.md.
Library use
[]
= "0.1.7"
use *;
// TetWriterSession, TetFile, parse_query_json, parse_query_toml, execute_query_json, verify_tet_file, …
Embedder flow
- Write —
TetWriterSession::create→push_dataset→commit()(orcommit_with_fillfor streaming). - Read / aggregate —
TetFile::open→execute_query_json→QueryResponse.
Query input: JSON or TOML
Flat JSON and TOML profiles compile to the same QueryDocument. tet query accepts .json / .toml paths, inline text, or stdin; leading { selects JSON, otherwise TOML (extension overrides).
= "temperature"
= [] # scalar reduction
Library: parse_query_json, parse_query_toml, parse_query_text (auto-detect).
See Documentation map above for layout, query engine, FFI, fixtures, and docs.rs.
To do
- Python wrapper — separate repository (TBA); will pin crates.io
tetration - docs.rs examples — match on-disk guarantees when the format stabilizes