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

Tape — define-by-run autograd

cajeta.nucleo.autograd — the runtime eager tape: ops compute their forward value as they execute and record a node; backward(out) replays the recorded graph in reverse and accumulates gradients. This is the dynamic-control-flow driver — a loop whose trip count arrives at runtime differentiates here, where the compiled Grad (which must specialize statically) cannot. Both drivers apply the same differentiation rules and agree wherever both can express a function.

A Var is a stack-copied handle to one node; its value and gradient live on the tape that created it.

package snip.tape;

import cajeta.nucleo.autograd.Tape;
import cajeta.nucleo.autograd.Var;

public final class Demo {
    public static float32 run() {
        Tape t = heap Tape();
        Var x = t.var(3.0f);
        Var y = t.mul(x, x);
        t.backward(y);
        return t.valueOf(y) * 100.0f + t.grad(x);   // 9*100 + 6 = 906
    }
}

The op set

OpRecords
t.var(v)a differentiated input leaf
t.add(a,b) t.sub(a,b) t.mul(a,b) t.div(a,b)binary arithmetic
t.neg(a) t.exp(a) t.log(a) t.sqrt(a)unary
t.stopGrad(a)value passes, gradient does not (the @NoGrad analog)

Readback: t.valueOf(v), t.grad(v) (after backward), t.count().

Dynamic control flow — the tape’s territory

public static float32 dPow(float32 xv, int32 n) {   // d/dx x^n, n known at RUNTIME
    Tape t = heap Tape();
    Var x = t.var(xv);
    Var y = x;
    int32 i = 1;
    while (i < n) {
        y = t.mul(y, x);
        i = i + 1;
    }
    t.backward(y);
    return t.grad(x);                                // n * x^(n-1)
}

The compiled Grad rejects this function (non-specializable); the tape records whichever path actually ran. Use the compiled path for static, hot functions (it fuses; per-op dispatch never appears), and the tape for dynamic models, prototyping, and step-by-step gradient debugging.

Discipline

  • One backward per tape. A second backward throws — there is no silent re-accumulation into stale gradients. Record a fresh tape per step.
  • Fan-out accumulates: an input feeding several ops receives the sum of its cotangents, as it should.
  • Tapes are independent — no global state; two tapes never interact.
  • stopGrad is the disciplined .detach(): statically visible in the recorded graph, with no version-counter machinery.

Source: docs/stdlib/nucleo/Tape.md · 1 min read · 264 words