Skip to content

New version: Piste v0.4.0 - #175453

Merged
JuliaTagBot merged 1 commit into
masterfrom
registrator-piste-f69a1a94-v0.4.0-ae78937010
Nov 9, 2026
Merged

JuliaTagBot merged 1 commit into
masterfrom
registrator-piste-f69a1a94-v0.4.0-ae78937010

Conversation

@JuliaRegistrator

Copy link
Copy Markdown
Contributor
This is the first registered release since v0.1.0. The v0.2.0 and v0.3.0 registrations lapsed, so these notes cover everything since v0.1.0.

## Breaking changes

- `eltype(Dual{N,T})` is now `Dual{N,T}` and `eltype(TapedReal)` is `TapedReal`, as for any `Number` type. They used to return the float type, which broke broadcasting with a scalar dual (e.g. `[1, 2] .* d`). Code that relied on `eltype` to get the underlying float type should use `typeof(value(d))` instead.
- `TapedReal` is now an isbits value that refers to its tape through a slot index, instead of holding a reference to the `Tape`. Only code that constructed `TapedReal`s or read their fields directly is affected. The public functions (`track!`, `backward!`, `rev_gradient!`, ...) are unchanged.

## New

- Reverse mode: `TapedReal`, `Tape`, `ReverseWorkspace`, `track!`, `backward!`, `reset!`, `rev_gradient!` and `rev_value_and_gradient!`.
- `rev_value_and_pullback!` and `rev_value_and_pullback` compute vector-Jacobian products for array- or scalar-valued functions. They are the basis of the upcoming DifferentiationInterface backend.
- `GradientWorkspace` and `pickchunk`, so that `gradient!` and `value_and_gradient!` can reuse their buffers across calls.
- `Float32` support, and the float-introspection methods on `Dual` that Distributions.jl's `logpdf` paths need.
- `PisteLogExpFunctionsExt`: one-node `log1pexp`, `logistic`, `logit`, `log1mexp`, `logexpm1` and `log1psq`.

## Fixes

- Reverse mode: two cases that silently returned wrong gradients, both now fixed. One was a peephole fusion that reused tape slots the caller still held. The other was a matrix-vector product whose operand was itself computed, which gave a zero gradient.
- A `Float32` data matrix is no longer copied on every reverse-mode gradient call.

## Performance

Reverse mode is 1.2-2.2x faster on normal regression models, and `sum(x)` and `sum(abs2, x)` over tracked arrays now record a single node. See the README for benchmarks.

UUID: f69a1a94-130c-4fa4-b8d2-e36d656cbe66
Repo: https://github.com/EvoArt/Piste.jl.git
Tree: 382867c0c7f694ae4d7f395375508d034c08f165

Registrator tree SHA: 50f504d641745716a5b3eabaf681d3a4937d2ae3
JuliaRegistrator referenced this pull request in EvoArt/Piste.jl Nov 9, 2026
…eal; v0.4.0

- `rev_value_and_pullback!(dx, f, x, dy[, ws])` and `rev_value_and_pullback(f, x::Real, dy[, ws])`
  compute a vector-Jacobian product for array- or scalar-valued `f`, one recording per call.
  They claim and release the tape slot themselves, so repeated calls cannot leak slots.
  This is what the DifferentiationInterface extension builds on.
- `backward!` is split into `_zero_adjoints!` and `_reverse_sweep!` so the pullback can seed
  several outputs before sweeping.
- Remove `eltype(::Type{Dual{N,T}}) = T` and `eltype(::Type{TapedReal}) = Float64`. The
  `eltype` of a Number type is the type itself; with the overrides, broadcasting
  `[1, 2] .* d` allocated a Float64 array and failed to store the Dual. Found by
  DifferentiationInterfaceTest's default scenarios.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

Hello, I am an automated registration bot. I help manage the registration process by checking your registration against a set of AutoMerge guidelines. If all these guidelines are met, this pull request will be merged automatically, completing your registration. It is strongly recommended to follow the guidelines, since otherwise the pull request needs to be manually reviewed and merged by a human.

1. AutoMerge Guidelines are all met! ✅

Your new version registration met all of the guidelines for auto-merging and is scheduled to be merged in the next round (~20 minutes).

2. Code changes since last version

Code changes from v0.1.0:

❯ git diff-tree --shortstat 12a280e314be2968f90847f62120f145797e8763 382867c0c7f694ae4d7f395375508d034c08f165
 19 files changed, 7966 insertions(+), 57 deletions(-)

Full diff has 295918 characters (over limit of 50k), so is omitted here.
View full patch diff on GitHub

3. To pause or stop registration

If you want to prevent this pull request from being auto-merged, simply leave a comment. If you want to post a comment without blocking auto-merging, you must include the text [noblock] in your comment.

Tip: You can edit blocking comments to add [noblock] in order to unblock auto-merging. Auto-merge runs periodically. After unblocking a comment you may have to wait up to 15 minutes.

@EvoArt

EvoArt commented Nov 9, 2026

Copy link
Copy Markdown

[merge approved]

The skip is intentional. v0.2.0 (#168302) and v0.3.0 (#168430) were tagged on GitHub but their registrations lapsed for missing release notes, so v0.4.0 is the first registration since v0.1.0. The release notes cover everything since v0.1.0. A DifferentiationInterface backend (JuliaDiff/DifferentiationInterface.jl#1089) depends on this version.

@JuliaTagBot
JuliaTagBot merged commit 9f6b36d into master Nov 9, 2026
52 of 54 checks passed
@JuliaTagBot
JuliaTagBot deleted the registrator-piste-f69a1a94-v0.4.0-ae78937010 branch November 9, 2026 14:01

This branch was previously deployed

1 inactive deployment
stopwatch — f9a4532f Deployed Nov 9, 2026 by JuliaTagBot via AutoMerge-stopwatch #13503
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants