Skip to content

Release OrdinaryDiffEqCore 4.18.0 - #4590

Merged
ChrisRackauckas merged 2 commits into
masterfrom
release-ordinarydiffeqcore-4.18.0
Sep 22, 2026
Merged

ChrisRackauckas merged 2 commits into
masterfrom
release-ordinarydiffeqcore-4.18.0

Conversation

@ChrisRackauckas

Copy link
Copy Markdown
Member

🚧 UNREVIEWED — ignore until reviewed by @ChrisRackauckas. Opened by an AI agent running as @ChrisRackauckas; Chris has not reviewed this release.
Harness: Claude Code 2.1.278 · Model: claude-opus-5[1m]
Conversation: https://claude.ai/code/session_01Wt79fZeNaZxiwQ3LagMYXH

Do not merge yet — #4589 is a regression in one of the two commits this would release. Everything else is ready; the decision this PR needs is whether that finding blocks the release.

Bumps OrdinaryDiffEqCore 4.17.4 → 4.18.0 and raises its DiffEqBase floor to 7.21.2.

Why this release exists

OrdinaryDiffEqCore has not been registered since 4.17.4 (2026-09-14). Two commits are unreleased in lib/OrdinaryDiffEqCore:

#4376's DiffEqBase and DelayDiffEq halves are already out (DiffEqBase 7.21.2, DelayDiffEq 6.4.1), so OrdinaryDiffEqCore is the only package still holding callback despecialization back from the registry.

Why minor rather than patch

#4376 changes what the integrator stores: at AutoSpecialize, AutoDespecialize and NoSpecialize, integrator.opts.callback becomes vector-backed with FunctionWrappersWrapper-wrapped condition/affect functions rather than tuple-backed with the user's own closures. Anything reading those fields sees different types — lib/DelayDiffEq/src/solve.jl needed a one-line update in the same commit — so a patch bump understates it.

The compat floor, and why it is in this PR rather than its own

Core's new code calls two methods that exist only from DiffEqBase 7.21.2, both added by #4376's DiffEqBase half in lib/DiffEqBase/src/callbacks.jl:

  • DiffEqBase.find_first_continuous_callback(integrator, callbacks::AbstractVector)
  • DiffEqBase.apply_discrete_callback!(integrator, callbacks::AbstractVector)

The floor was DiffEqBase = "7.19". The monorepo's [sources] points DiffEqBase at lib/DiffEqBase, so CI always resolves the in-tree copy and never exercises the floor.

It does not error on an older DiffEqBase — the erasure itself happens in DiffEqBase.get_concrete_problem, so the callback simply is never erased, the vector methods are never reached, and the feature silently does nothing. Registering 4.18.0 with the old floor would therefore publish a version whose headline feature is absent on any resolve that picks DiffEqBase < 7.21.2, which is why the floor raise cannot be split into a PR that merges afterwards.

Measured on the same dev'd OrdinaryDiffEqCore (this branch), changing only the registered DiffEqBase version. Tsit5, ODEProblem{true, AutoDespecialize}, compile seconds charged to solve per new DiscreteCallback closure type:

DiffEqBase discrete_callbacks storage affect! type compile per new closure type
7.21.1 (allowed by the old "7.19" floor) Tuple user closure 2.82 / 2.68 / 2.52 / 2.59 s
7.21.2 Array FunctionWrappersWrapper 0.95 / 0.60 / 0.59 / 0.64 s

What the release delivers

Registered 4.17.4 versus this branch, compile seconds per new callback closure type, mean of closure types 2–6 (a fixed f, u0, p, tspan and Tsit5 — only the callback type varies):

level callback 4.17.4 this branch
AutoSpecialize discrete 2.40 0.57
AutoSpecialize continuous 5.71 0.97
AutoDespecialize discrete 2.29 0.36
AutoDespecialize continuous 6.05 0.63
FullSpecialize discrete / continuous 2.48 / 5.37 2.73 / 4.12
NoSpecialize discrete / continuous 3.72 / 5.63 0.37 / 0.89

FullSpecialize is unchanged, as intended.

Verification

julia 1.12.6, aarch64-linux, --startup-file=no, this branch:

  • GROUP=InterfaceIIpassed. Despecialized Parameters 92/92, AutoSparse Detection 4/4, Get du 34/34, Testing OrdinaryDiffEq tests passed.
  • GROUP=Integrators_I7 failures, all in test/Integrators_I/ode_event_tests.jl (lines 166, 168, 171, 198, 200, 203, 398). Events Tests | 50 pass, 7 fail.

The failures are not caused by this PR's two lines: they reproduce with an unmodified checkout at #4376's own merge commit, and disappear with the registered 4.17.4 in the same environment. Cause and a standalone reproducer are in #4589 — at AutoSpecialize the wrapped condition moves the located event time by ~17 ULP (3.192754284070527 vs 3.1927542840705194), and those assertions compare event times exactly.

Not verified: x86-64 — Integrators_I (julia 1, ubuntu-latest) was green on #4376, so the event-time shift may be aarch64-only and I cannot check that here. No other test group was run locally; no downstream package (SciMLSensitivity, StochasticDiffEq, DiffEqCallbacks beyond what Integrators_I covers) was tested against this branch.

After merging

Registration is a commit comment on the merge commit, as for 4.17.4:

@JuliaRegistrator register subdir=lib/OrdinaryDiffEqCore

🤖 Posted by an AI agent — harness: Claude Code 2.1.278 · model: claude-opus-5[1m]
Conversation: https://claude.ai/code/session_01Wt79fZeNaZxiwQ3LagMYXH

ChrisRackauckas and others added 2 commits September 20, 2026 00:18
The despecialized callback paths call
`DiffEqBase.find_first_continuous_callback(integrator, ::AbstractVector)` and
`DiffEqBase.apply_discrete_callback!(integrator, ::AbstractVector)`, both added
alongside them in #4376 and first released in DiffEqBase 7.21.2. The monorepo
sources DiffEqBase from `lib/DiffEqBase`, so CI never resolves the floor: with
7.19-7.21.1 the callback is never erased and callback despecialization silently
does nothing.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Agent-Harness: Claude Code 2.1.278
Agent-Model: claude-opus-5[1m]
Agent-Session: https://claude.ai/code/session_01Wt79fZeNaZxiwQ3LagMYXH
Claude-Session: https://claude.ai/code/session_01Wt79fZeNaZxiwQ3LagMYXH
Version bump only; no code changes in this commit.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Agent-Harness: Claude Code 2.1.278
Agent-Model: claude-opus-5[1m]
Agent-Session: https://claude.ai/code/session_01Wt79fZeNaZxiwQ3LagMYXH
Claude-Session: https://claude.ai/code/session_01Wt79fZeNaZxiwQ3LagMYXH
@JuliaRegistrator

Copy link
Copy Markdown

Comments on pull requests will not trigger Registrator, as it is disabled. Please try commenting on a commit or issue.

@ChrisRackauckas ChrisRackauckas added the bot-generated Opened by an AI agent label Sep 20, 2026
@ChrisRackauckas
ChrisRackauckas marked this pull request as ready for review September 22, 2026 22:58
@ChrisRackauckas
ChrisRackauckas merged commit 2e410f3 into master Sep 22, 2026
249 of 264 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bot-generated Opened by an AI agent

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants