Skip to main content

tf_tree

A transform tree engine: store time-stamped rigid-body transforms between named coordinate frames and answer "where was frame A relative to frame B at time t?" — fast enough to sit inside a control loop, with diagnostics good enough to debug at 3 a.m.

Linux-first. The single-process engine is portable Rust and much of it compiles elsewhere; everything that maps memory — attaching to a live arena, the frozen .tft backend, tf_tree freeze — is Linux-only and behind a default-off shm feature. That sentence is here rather than in SUPPORT.md alone because nobody should meet it as a build error.

Start where you change nothing

Point it at a recording you already have. No node joins anyone's launch file, no robot is redeployed, and doctor --from-bag needs no features at all:

git clone https://github.com/NoeFontana/tf_tree && cd tf_tree
cargo install --path crates/tf_tree_cli --features shm   # shm: `freeze` maps memory

tf_tree doctor --from-bag drive.mcap                # what is wrong with this /tf traffic
tf_tree freeze --from-bag drive.mcap -o drive.tft   # keep the answer

drive.tft is a frozen transform index, and it is the arena itself written to disk. There are no pointers anywhere in the arena — every internal reference is an offset — so opening one is an mmap, with no parsing, no deserialization and no fixups (PHASE5 §2.1). Sixteen dataloader workers map the same file, the kernel charges the shared clean pages exactly once and the untouched ones not at all (measured basis: PHASE2 §3.8), and each worker queries in its own address space: no IPC, and no ROS node inside the training loop.

import numpy as np, tf_tree

# Open per worker, after the fork/spawn — docs/PHASE5.md §4.3 says why.
tree   = tf_tree.open_file("drive.tft")
plan   = tree.plan("base_link", "lidar_top")           # compile the route once
stamps = np.asarray(batch_stamps_ns, dtype=np.int64)   # integer nanoseconds
poses  = plan.at(stamps, layout="quat_twist")          # (N, 13) float64

The whole batch is one call into Rust. layout="quat_twist" appends the body twist to each pose, in the plan's source frame: it is the analytic derivative of the same interpolation the pose came from, not a finite difference between two lookups.

docs/PHASE5.md §2.2 is where that argument is made in the project's own words. A perception dataloader today does one of three bad things — re-parses the bag in every worker, precomputes poses into a pickle and loses the ability to query at arbitrary times, or runs a ROS node to serve transforms during training. This replaces all three and asks nobody to migrate anything, which is also why it is the part that shipped first.

Numbers belong where they can be reproduced, not in this section. just bench-report measures your host and writes report/{results.json,index.html}; the standing figures and their caveats are in docs/benchmarks/. Benchmarks, and what they are worth below explains why a row there may legitimately read UNAVAILABLE.

Status

On crates.io from 0.0.1; on PyPI from 0.0.2. The five engine crates are published — cargo add tf_tree. The Python wheel starts at 0.0.2, because the 0.0.1 commit did not compile off Linux and no wheel for it exists or can; see CHANGELOG.md. 0.0.x promises nothing between releases — cargo treats every one as incompatible with every other, so pin exactly.

Phase What it is Status
1 Single-process engine: arena, seqlock buffers, plans, SE(3) math Implemented
2 Shared memory: rendezvous, fd passing, claims as leases, reaping Implemented, except the daemon/recorder surface (§9–§10) and §11.3's fault injection. §3.5's ownership migration has the protocol and not the trigger: kill the arena's owner and lookups keep being served, but no new process can join
3 Python bindings (PyO3, zero intermediate allocation) Implemented
4 C ABI, C++ wrapper, ROS 2 ingest bridge, derivatives Done, except §5.9's affinity knobs and §6.3's replay rows. at_with_derivatives, both headers, the header-only C++ wrapper with its CMake package, and both halves of the ingest bridge — the rclcpp package in ros/tf_tree_ros included. §7's benchmark gate is partial
5 Frozen .tft arena, bag ingestion, diagnostics, tf_tree top Mostly done. FORMAT_VERSION = 3, the frozen arena (§2), the offline Python API (§4), the §5 counters and tf_tree top — terminal and --web (§7) — all landed. Ingestion is MCAP only (§3); the TFT001TFT019 catalogue reports all nineteen ids, of which sixteen can detect (§6). §8 is deliberately not built. §9's benchmark artifact and §10's release readiness are partial
6–8 Multi-host, tf2 compatibility shim, replication Not started; Phase 7 is gated by D21 and none of its four gates is met

The per-phase §0.0 tables in docs/ are the source of truth, not this one — PHASE2.md, PHASE4.md, PHASE5.md. If this table and one of those disagree, the phase document is right and this is stale.

CI runs again as of 2026-08-16, after a gap since 2026-07-23 that ended when this repository was made public. A green check is evidence once more — of what the jobs cover. Gate locally with just first; CI is the second opinion.

First five minutes, with no data at all

The block above assumes you have a recording. This one assumes only the clone:

just quickstart        # uv-managed interpreter + venv, with the extension installed into it
.venv/bin/python
import tf_tree

tree = tf_tree.build([("map", "base"), ("base", "cam")])
# stamp in integer nanoseconds; pose is [qw, qx, qy, qz, x, y, z]
tf_tree.push(tree, "base", "map", 1_000, [1.0, 0.0, 0.0, 0.0, 1.0, 2.0, 3.0])
tf_tree.push(tree, "base", "map", 2_000, [1.0, 0.0, 0.0, 0.0, 3.0, 4.0, 5.0])

print(tree.plan("map", "base").at(1_500)[:3, 3])   # -> [2. 3. 4.]

That is a real result and not a toy: the query lands halfway between two samples, so the printed translation is their interpolated midpoint, and plan() is the object you keep — compiling the route once and evaluating it many times is the whole shape of the fast path.

Two things surprise people, both deliberate:

  • Stamps are integer nanoseconds. There is no float-seconds overload. At a 2026 epoch the ULP of float64 seconds is 238 ns, so every interval in a 1 kHz stream is wrong after a round trip.
  • Nothing returns a view into shared memory. An edge's samples are a ring another process is overwriting, and correct reads go through a seqlock. "Zero copy" here means no intermediate allocation — use Plan.at_into to supply the destination.

Rust is cargo add tf_tree; Python is pip install transform_tree — the distribution name differs from the import name, because PyPI refuses tf_tree as too close to the existing tftree (0008 records the measurement). import tf_tree either way. just alone lists everything the repository can do.

Is this a tf2 replacement?

It is not tf2, not a fork of it, and not affiliated with ROS. It is an independent engine that solves the same problem with a different data structure, and it is deliberately named so that people looking for a tf2 alternative can find it (0008 records that decision).

There is no drop-in tf2_ros::Buffer shim, and building one is not scheduled. That is Phase 7, gated by D21 on operating evidence this project has not yet produced; docs/PHASE7.md is what such a shim would have to be — including the places it would deliberately refuse to reproduce tf2's behaviour — and its §0.0 lists four gates, none of them met. What exists today instead is the ingest bridge (docs/PHASE4.md §5): a node that subscribes to /tf and fills an arena, which is a one-way seam and not a compatibility layer.

Two things worth stating precisely, because the loose versions of both are wrong:

  • The documented tf2 cost is listener and buffer CPU, per node — not /tf bandwidth. Autoware's ManagedTransformBuffer (in autoware_universe) reports taking a LiDAR sensing pipeline from 13 TF listener nodes to 0 — four per-sensor legs at 3 each plus the concatenation node (autowarefoundation/autoware#5385; the upstream discussion about moving it into tf2 is ros2/geometry2#758). That is a third-party report about their own stack, not a tf_tree measurement, and it is cited for the shape of the problem this engine's process model addresses. No claim is made about /tf bandwidth: no quantified public source for one exists.
  • Errors are Copy identifiers a program can branch on, with the prose in a separate layer (docs/API.md R5) — a lookup failure names the offending edge as data, not as a formatted string. That is a durable API-shape difference and deliberately not a claim about any particular tf2 defect; the misattributed-extrapolation one people cite (ros2/geometry2#832) was fixed by PR #896, merged 2026-03-18 and backported to Kilted, Jazzy and Humble (#897–#899). Marketing against a bug somebody already fixed is how a README goes stale in public.

Shared memory IPC is not a sandbox

Processes sharing a tf_tree arena are mutually trusting, same-user, cooperating processes. A read-write participant can corrupt any part of the arena, and no checksum would change that — it holds a writable mapping of the same pages (PHASE2.md §3.10). Do not attach a process you would not run as yourself. SECURITY.md draws the line between this and an actual vulnerability.

Three things the design does guarantee, and they are the ones that matter on a robot:

  • A read-only participant cannot corrupt anything, enforced by the MMU, not by convention. It is the default for consumers (D18), and it converts a class of whole-system failures into a single-process fault.
  • A participant that crashes, at any instruction, cannot corrupt the arena or wedge anyone else. A killed writer's edge is reclaimed; a killed interner's entry is recoverable; a killed mutator does not leave a permanently locked topology.
  • A participant that hangs cannot be mistaken for a crashed one. Liveness is the kernel's answer about a file lock, not a heartbeat timeout, so a SIGSTOPped publisher keeps its claims and a stalled one is never reaped out from under itself.

fork() is the sharp edge worth knowing about up front: the arena is mapped MADV_DONTFORK, so a child has no mapping and every inherited handle reports ChildDetached. Python's multiprocessing defaults to fork on Linux — open inside the worker, or use the spawn start method. A frozen .tft is the deliberate exception: it is a private read-only mapping, a child inherits it intact, and poisoning it would break multiprocessing for offline users to defend against a hazard they do not have (docs/PHASE5.md §4.3).

Workspace

crates/
├── tf_tree_math/    no_std SE(3)/SO(3) + dual quaternions; #![forbid(unsafe_code)]
├── tf_tree_arena/   no_std+alloc pointer-free arena + layout math
├── tf_tree_core/    no_std+alloc engine: interning, topology, seqlock buffers, plans
├── tf_tree/         std facade: builder, plan-cached lookup, Display errors
├── tf_tree_ipc/     zero-config rendezvous: runtime dir, OFD lock file, attach protocol
├── tf_tree_c/       C ABI + header-only C++ wrapper
├── tf_tree_bridge/  the ROS-independent half of the /tf ingest bridge
├── tf_tree_ingest/  MCAP -> arena: the two passes behind `ingest` and `freeze --from-bag`
├── tf_tree_py/      PyO3 bindings — binds the Rust core directly, not the C ABI
├── tf_tree_bench/   criterion benches, tf2 differential harness, the §9 report
├── tf_tree_tf2_sys/ the tf2 side of that differential harness — needs a ROS 2 install
└── tf_tree_cli/     binary `tf_tree` (alias `tft`): tree / echo / doctor / top /
                     ingest / freeze / topology / participants / bench
ros/                 ament_cmake packages: the §5 rclcpp bridge, and the DDS comparison
xtask/               loom, miri, and bench-gate runners
docs/                PROJECT.md, API.md, PHASE1–5.md, RUNBOOK.md, benchmarks/, decisions/

tf_tree_py and tf_tree_tf2_sys are outside the cargo --workspace build on purpose — they link libpython and a ROS 2 install respectively, neither of which a clean checkout can assume. ros/ is outside it for the same reason and is not cargo at all. Each has just recipes of its own (just py-*, just ros-build / just ros-test, just tf2-check), which is what "gate locally" means for them.

Five crates are intended for crates.io: tf_tree, tf_tree_core, tf_tree_math, tf_tree_arena, tf_tree_ipc. The rest carry publish = false with the reason in their manifest.

Commands

just quickstart     # clean clone -> a Python REPL with the extension installed
just build          # cargo build --workspace --all-targets
just test           # nextest + doctests
just lint           # fmt --check + clippy -D warnings
just loom           # concurrency model checking
just miri           # UB checking (arena + core + the facade's one unsafe)
just bench          # benchmark suite + go/no-go gate
just bench-report   # the PHASE5 §9 artifact -> report/{results.json,index.html}
just bench-check    # the same artifact against the committed baseline
just shm-torture    # PHASE2 §11.4's multi-process soak (30 min; nightly)

just --list for everything.

Benchmarks, and what they are worth

just bench-report emits report/results.json and report/index.html with a full provenance header. It is built so it cannot print a number it has no right to: it probes the host, and a row it cannot measure fairly comes out UNAVAILABLE with the reason and the command that produces it on a host that can. On a 4-core development machine that means most rows are gaps — which is the correct output, not a broken tool. docs/PHASE5.md §9.3 is the rule it enforces, and it includes a "where tf_tree is worse" section, in the same table.

just bench-check re-runs it and compares against the committed baseline in crates/tf_tree_bench/baseline/results.json, failing if a claim was withdrawn, a row was dropped, the arena layout changed, or a directional number moved past the slack the baseline itself records. It compares claims, not hosts: CPU model, core count, kernel, governor, load and every reason string are ignored, so the gate means the same thing on any machine. just bench-baseline-update regenerates the baseline; that diff belongs in the commit that causes it.

Standing numbers and their caveats live in docs/benchmarks/.

Reading order

  1. docs/PROJECT.md — overview, architecture, roadmap, and the decision log D1–D22 in §5.
  2. docs/API.md — the cross-cutting contract: six rules (§1) every binding obeys, and the §7 checklist a new surface passes. It is not a phase and authorizes nothing on its own.
  3. The phase spec you care about: PHASE1PHASE5. Each opens with its own status table.
  4. docs/decisions/ — the records for things the phase specs do not cover.

Contributing and support

CONTRIBUTING.md · SUPPORT.md (response expectations, platform support, MSRV policy) · SECURITY.md · CODE_OF_CONDUCT.md

MSRV is 1.87. just msrv reads the number out of [workspace.package] rust-version, builds --locked on exactly that toolchain, and checks that every hand-written rust-version — and this line — still agrees with it.

Licence

Dual MIT / Apache-2.0, at your option. See NOTICE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

transform_tree-0.0.3.tar.gz (654.0 kB view details)

Uploaded Source

Built Distributions

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

transform_tree-0.0.3-cp314-cp314t-win_amd64.whl (314.8 kB view details)

Uploaded CPython 3.14tWindows x86-64

transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl (467.1 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ x86-64

transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl (444.3 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

transform_tree-0.0.3-cp314-cp314t-macosx_11_0_arm64.whl (359.7 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

transform_tree-0.0.3-cp39-abi3-win_amd64.whl (328.7 kB view details)

Uploaded CPython 3.9+Windows x86-64

transform_tree-0.0.3-cp39-abi3-musllinux_1_2_x86_64.whl (692.3 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ x86-64

transform_tree-0.0.3-cp39-abi3-musllinux_1_2_aarch64.whl (631.2 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ ARM64

transform_tree-0.0.3-cp39-abi3-manylinux_2_28_x86_64.whl (478.0 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64

transform_tree-0.0.3-cp39-abi3-manylinux_2_28_aarch64.whl (453.2 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

transform_tree-0.0.3-cp39-abi3-macosx_11_0_arm64.whl (371.4 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

transform_tree-0.0.3-cp39-abi3-macosx_10_12_x86_64.whl (389.1 kB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file transform_tree-0.0.3.tar.gz.

File metadata

  • Download URL: transform_tree-0.0.3.tar.gz
  • Upload date:
  • Size: 654.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for transform_tree-0.0.3.tar.gz
Algorithm Hash digest
SHA256 c07f4029240677a15a24c681ccccb72a8e64a976bc4a9bd733b28d82cf095e14
MD5 9ffd379faa83ce3b799aba28439bd961
BLAKE2b-256 8cbe92167733738687939e7892f154ca98613c699b1f62f9f177e67af8c0deb6

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3.tar.gz:

Publisher: wheels.yml on NoeFontana/tf_tree

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

File details

Details for the file transform_tree-0.0.3-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for transform_tree-0.0.3-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 0dd17203dda2e50f46ff11c90aa74bdefdb28142f5b4beebe56b5819c279f749
MD5 5717a8e4b9a8ab0c58c443b04054d2c2
BLAKE2b-256 4e7839af33a7b94d832a6fbf346609a40afcaab3ec3a7c8e8be513d9c1001588

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3-cp314-cp314t-win_amd64.whl:

Publisher: wheels.yml on NoeFontana/tf_tree

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

File details

Details for the file transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2143e1a0bb35751a3ef8b534baacb68a7a7203b9d11460f051321fcb38f6e5b6
MD5 d5c0b82332948fb1bcb5e00dc1c55558
BLAKE2b-256 6f9e87b94465ea7b8ce62e9d292db590028968e69025f85776b0e227fd704f56

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on NoeFontana/tf_tree

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

File details

Details for the file transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ecc019bb407ee62b747b5ccff4b11edddc51d7a7ab7d1c7112b70168160ddf75
MD5 2a1dff8a500a5b1b82db4f42ae7d621a
BLAKE2b-256 2ee7f7a163679e82aae7c4195d507b4eae84ff584f10ba57dce584a4423a0c8c

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on NoeFontana/tf_tree

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

File details

Details for the file transform_tree-0.0.3-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for transform_tree-0.0.3-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8181187de7e843c240a9968fcf956ead567e9766cd72f908a1c7b85d1ade5f53
MD5 2c325b1a2bfa6890fa8f2d6c7764df99
BLAKE2b-256 e7211dedaf2ad0461b1ef6867eb4a8298e82fcecca5ec2b0ae2d0e2ce058b559

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3-cp314-cp314t-macosx_11_0_arm64.whl:

Publisher: wheels.yml on NoeFontana/tf_tree

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

File details

Details for the file transform_tree-0.0.3-cp39-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for transform_tree-0.0.3-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 2c46bbb8592b9cfe4dde705d7f78560cbe4674060f358820ff46bcfdad8c984d
MD5 061f7b978d0d69199a77845097a3c590
BLAKE2b-256 7f571c5e7d1e94b19c1cc9a0b775066af8f17b4c10d3ef781cd62f130fbc7753

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-win_amd64.whl:

Publisher: wheels.yml on NoeFontana/tf_tree

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

File details

Details for the file transform_tree-0.0.3-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for transform_tree-0.0.3-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 cbac1d0e6383c3de1eb49b0b5990ae6658c9512224b4dd6e5d97dfd31cd1b82c
MD5 5bf3f4c3e8ba92937fb0aae449ebacef
BLAKE2b-256 05cb218050a18e0aed1c9967e6c7b41e0c230481f0a90dad49b3ffdc7289055c

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-musllinux_1_2_x86_64.whl:

Publisher: wheels.yml on NoeFontana/tf_tree

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

File details

Details for the file transform_tree-0.0.3-cp39-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for transform_tree-0.0.3-cp39-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 85ddd787fc68b334511ca1d164b2cf887212bc86e811f33d6c24471514d817c5
MD5 65ac8cffd21be95938479883b5392b1d
BLAKE2b-256 06e0dcba2d37993b6817254c0c656107bc46bb9914f7e07e8716cb6556bf9bae

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-musllinux_1_2_aarch64.whl:

Publisher: wheels.yml on NoeFontana/tf_tree

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

File details

Details for the file transform_tree-0.0.3-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for transform_tree-0.0.3-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 11b5cdf55327c6a647e28339188962b51b2705415d7b511e7532fae17b9a6b80
MD5 bb249ed99af6cd53fd134b24a21faeb7
BLAKE2b-256 532281212c6e7f68d0ba4288f69f8f98524a461df68627e70c9dd5bb8222b4eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on NoeFontana/tf_tree

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

File details

Details for the file transform_tree-0.0.3-cp39-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for transform_tree-0.0.3-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ceaf69d6f06739320acfd14df1763d42fa53784453e22456fa84ac324f333dec
MD5 cb276cbd0c6e0bd12d07207b227de756
BLAKE2b-256 b5f1c5418ae7245efc0846de552f8dad18eb7833d5d8d2ffe8799b969458f2b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on NoeFontana/tf_tree

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

File details

Details for the file transform_tree-0.0.3-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for transform_tree-0.0.3-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d21a96f05be632475c66eb89c857ac4e76454d170fc4b31ac77f8e59fb9b10bb
MD5 8409f72e14cece61fa4ad3881c71ff83
BLAKE2b-256 9fdeb38e5edf2cd036af4506926bf66485609f1d980210a061fdf1ddf389a529

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-macosx_11_0_arm64.whl:

Publisher: wheels.yml on NoeFontana/tf_tree

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

File details

Details for the file transform_tree-0.0.3-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for transform_tree-0.0.3-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a37262ddfc7d76497a937c97860035b886afd4b87965d21022cbcbfc888ed029
MD5 42c62aa8f2d554e333750e379b02d6f9
BLAKE2b-256 a11725f65a47a2a6f8fd2e2340b374b39601af7d76cc98ee99ebc1a028a7a128

See more details on using hashes here.

Provenance

The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-macosx_10_12_x86_64.whl:

Publisher: wheels.yml on NoeFontana/tf_tree

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

Release history Release notifications | RSS feed

0.0.5

12 files

0.0.4

12 files

This release

0.0.3 This release

12 files

0.0.2

11 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page