docs / stdlib / nucleo

Stdlib index
  1. Overview
  1. Captured-borrow migration worklist (3.3.3)
  2. Owned-bind migration worklist (8.2.7)
  3. Return-side title audit — the ride-through enumeration
  4. stdlib ownership audit
  5. stdlib ownership dispositions (plan 1.3.1 / 4.3.1)

codec

  1. Base64

codec / csv

  1. Csv

codec / json

  1. Json

collection

  1. ArrayList
  2. BPlusTree
  3. Cache
  4. Collectors
  5. HashMap
  6. HashSet
  7. Heap
  8. ImmutableList
  9. ImmutableMap
  10. ImmutableSet
  11. LinkedList
  12. RedBlackTree
  13. Sort

collection / ltm

  1. LtmBPlusTree

concurrent

  1. AtomicInt32
  2. AtomicInt64
  3. Channel
  4. FiberLocal
  5. Lock
  6. Mutex
  7. RwLock
  8. Semaphore
  9. Tasks

error

  1. Exception
  2. NoOptionalValueException
  3. RecoverableException
  4. Throwable
  5. UnrecoverableException

gfx

  1. Sampler
  2. Texture2D

hash

  1. Blake3
  2. DefaultHasher
  3. Hash
  4. MD5
  5. Sha1
  6. Sha256
  7. SipHash
  8. XXHash3

ifx

  1. BackendRegistry
  2. Window

io

  1. Buffer

io / file

  1. File
  2. FileInfo
  3. FileReader
  4. FileWriter
  5. Path
  6. Watcher

io / net

  1. IpAddress
  2. Server
  3. ServerBuilder
  4. SocketAddress
  5. TcpListener
  6. TcpStream
  7. UdpSocket

io / net / dns

  1. Dns

io / net / tls

  1. TlsConnection
  2. TlsListener

io / net / uri

  1. Uri
  2. UriBuilder

lang

  1. Guid
  2. Math
  3. Optional
  4. Pair
  5. Slice
  6. String
  7. StringBuilder

lang / stream

  1. ArrayStream
  2. Stream

math

  1. Camera
  2. Color
  3. DType
  4. Ray
  5. Rotation
  6. Tensor
  7. Transform

math / fft

  1. Fft

math / linalg

  1. LinAlg

math / npio

  1. Npy

math / poly

  1. Poly

math / random

  1. Generator

math / stats

  1. Stats

nucleo

  1. Columns — the Arrow-laid-out substrate
  2. Fused tensor expressions — Fuse
  3. Table — the lazy, typed dataframe
  4. Tape — define-by-run autograd
  5. Transform intrinsics — Grad, Vmap, Jit

process

  1. Command
  2. Process

reflect

  1. Class

search / distance

  1. Distance

search / fuzzy

  1. Matcher

search / ngram

  1. Index

session

  1. PackageInstallException
  2. Packages

time

  1. Clock
  2. DateTimeFormatter
  3. Duration
  4. Instant
  5. LocalDate
  6. LocalDateTime
  7. LocalTime
  8. Period
  9. ZonedDateTime
  10. ZoneId
  11. ZoneOffset

wire

  1. Compressor
  2. Decompressor
  3. Encoder
  4. Schema
  5. SchemaEncoder

xpu

  1. Device
  2. KernelBuffer
  3. KernelStream

xpu / mesh

  1. MeshSimplifier

Columns — the Arrow-laid-out substrate

cajeta.nucleo.column — typed, contiguous, Arrow-conformant columnar buffers: the physical substrate a dataframe column, a tensor backing, and an interop buffer all share. The load-bearing invariant: a non-null numeric Column<T> is bit-identical to a tensor buffer — same bytes, no marshalling. Interop is by matching the frozen Arrow C ABI (two structs) — no libarrow anywhere.

The package is lazy: programs that never touch columns don’t parse it (or cajeta.math, which it pulls).

Column<T> — non-null, tensor-bit-identical

import cajeta.nucleo.column.Column;

float32[] fa = { 1.5f, 2.5f, 3.5f };
Column<float32> c #= Column.of<float32>(fa);
Tensor<float32> t #= c.asTensor();     // ZERO-COPY view — shared bytes
Column<float32> back #= Column.fromTensor<float32>(t);   // zero-copy inverse

Owned buffers start 64-byte aligned (an aligned start offset inside an over-allocated backing). No validity bitmap exists on this type and get carries no validity branch. v1 dtypes: int8..int64, uint8..uint64, float16..float64; boolean (Arrow bit-packs bools) and 128-bit types are named refusals (ColumnTypeException).

NullableColumn<T> — the separable validity bitmap

Nullability is a type distinction (Column<T?> in the spec’s notation):

boolean[] ok = { true, false, true };
NullableColumn<float32> n #= NullableColumn.of<float32>(vals, ok);
n.isValid(1);              // false — a real absence, never NaN-as-missing
Column<float32> d1 #= n.fillNulls(0.0f);   // dense, nulls replaced
Column<float32> d2 #= n.dropNulls();       // dense, order kept

There is deliberately no asTensor() here — the dense tensor substrate is reached only through the explicit materializations above.

StringColumn — variable-length utf8 (format “u”)

Offsets (int32, length+1) over one contiguous utf8 data buffer:

String[] vs = { "hola", "x", "columnas" };
StringColumn s #= StringColumn.of(vs);
String v #= s.get(2);       // fresh owned copy of the element's bytes

The C Data Interface — zero-copy interchange

exportArrow() (on all column types and on contiguous tensors) returns the address of a bundle whose head is { ArrowSchema, ArrowArray } over the column’s live buffers — a zero-copy borrow. The consumer’s release frees the struct shells only, exactly once; the column must outlive the consumer’s reads (round-trip promptly, the TensorProtocol discipline).

Import wraps a producer’s structs zero-copy as a foreign-backed column:

Column<?> w #= Column.importArrow(schemaAddr, arrayAddr);
if (w instanceof Column<float32>) {
    Column<float32> c = (Column<float32>) w;   // reified capture
    Column<float32> mine #= c.materialize();    // the explicit compute crossing
}

Foreign columns are read-only borrows: set/asTensor are named errors directing to materialize(). The producer’s releases fire exactly once, when the imported column drops. null_count > 0 admits only through NullableColumn.importArrow — the type reflects the physical reality. Column.importAsTensor(...) is the one-step import-and-materialize for tensor consumers (it lives column-side; cajeta.math cannot import this package).

MX extension types — cajeta.mxfp4

MxColumn carries MX micro-scaling formats as Arrow extension types: a logical name (cajeta.mxfp4, block size in ARROW:extension:metadata) over physical packed uint8 bytes — a view, never a re-encode. A consumer that knows the extension reconstructs the logical type; one that doesn’t still moves the bytes. Scales buffers and MX kernels ride the autograd/xpu lanes.

Deferred (recorded)

Storage native mode (zero-copy tensor over foreign memory), boolean columns, 64-bit offsets (“U”), nested layouts, null-carrying utf8 import, in-place nullable→non-null narrowing, the live pyarrow/Polars/DuckDB probe (needs the embedding seam; the C-ABI conformance is consumer-tested in-tree), codec readers materializing into columns, and the device-side story.

Source: docs/stdlib/nucleo/Column.md · 2 min read · 408 words