|
2 | 2 |
|
3 | 3 | ## [Unreleased] |
4 | 4 |
|
| 5 | +## [0.33.0] - 2026-06-29 |
| 6 | + |
| 7 | +### Added |
| 8 | + |
| 9 | +- **GRU layer (`sk.ainet.lang.nn.Gru`).** SKaiNET's first recurrent layer (issue #217): single-layer, |
| 10 | + unidirectional, batch-first `[B, S, D] -> [B, S, H]`, PyTorch gate order (reset, update, new). Built |
| 11 | + by composing existing primitives (matmul/add/sigmoid/tanh/narrow/concat) **unrolled over the static |
| 12 | + sequence length at trace time** — StableHLO has no loop construct, so any recurrence must unroll. It |
| 13 | + runs eagerly, is trainable through the standard tape, and exports to StableHLO with no dedicated |
| 14 | + converter. Also adds a `gru(hiddenSize) { … }` network-DSL builder. (PR #772) |
| 15 | +- **`upsample2d` Bilinear + StableHLO export.** Adds the Bilinear forward (PyTorch coord map, 4-neighbour |
| 16 | + blend) and its autodiff backward, and a traceable StableHLO lowering for **both** Nearest and Bilinear |
| 17 | + (scale is static at trace time, so everything lowers to fixed reshape/broadcast/`dot_general` — no |
| 18 | + runtime index math, no `custom_call`). Unblocks export of resize/FPN-style paths. (PR #771) |
| 19 | +- **Seven newly-differentiable ops.** `cos`, `sin`, `tril`, `gather`, `indexSelect`, `unfold`, |
| 20 | + `convTranspose1d` now carry `@Diff` and have backward rules (with finite-difference parity tests): |
| 21 | + trig for RoPE, `gather` for embedding lookup, `tril` for causal masks, the rest structural. (PR #774) |
| 22 | +- **KSP-generated autodiff-coverage guard.** The tracing-wrapper processor now emits |
| 23 | + `DifferentiableTensorOpsRules.ruleNames` (the authoritative `@Diff` op set); a unit test asserts the |
| 24 | + execution tape's dispatch covers it, so a differentiable op can no longer ship with a backward rule |
| 25 | + that is never wired. `operators.json` now records `isDifferentiable` (+ optional `diffRuleName`), |
| 26 | + schema-validated. (PR #774) |
| 27 | + |
| 28 | +### Fixed |
| 29 | + |
| 30 | +- **Silent gradient drop for `elu`, `leakyRelu`, `permute`.** These were `@Diff` and had correct |
| 31 | + backward formulas, but had no arm in the execution tape's trace dispatch, so their gradients fell |
| 32 | + through to `null` and were silently discarded. Now wired (and guarded by the coverage test above); |
| 33 | + `permuteBackward` also fixed to decode its `axes` attribute as the traced `List<Int>`. (PR #774) |
| 34 | +- **`layerNorm` / `rmsNorm` / `batchNorm` lower to real `stablehlo.reduce`.** The norm converters |
| 35 | + previously emitted non-compilable `reduce_mean` / `reduce_variance` `custom_call`s (export-only); they |
| 36 | + now decompose to real `stablehlo.reduce`, so all three compile and run on stock IREE (llvm-cpu). (PR #769) |
| 37 | + |
| 38 | +### Changed |
| 39 | + |
| 40 | +- **BREAKING: `TensorOps.sin`, `TensorOps.cos`, `TensorOps.convTranspose1d` are now abstract.** They |
| 41 | + previously had default `throw NotImplementedError(...)` bodies; they are abstract so the tracing |
| 42 | + wrapper records them (and they become differentiable/exportable). Any type implementing `TensorOps` |
| 43 | + directly must now override them — both bundled backends (`DefaultCpuOpsBase`, `VoidTensorOps`) already |
| 44 | + do. (PR #774) |
| 45 | + |
5 | 46 | ## [0.32.4] - 2026-06-26 |
6 | 47 |
|
7 | 48 | ### Fixed |
|
0 commit comments