Skip to content

GlobalDiffEq: add GlobalErrorTransport global error estimation and control#3956

Draft
ChrisRackauckas-Claude wants to merge 5 commits into
SciML:masterfrom
ChrisRackauckas-Claude:globaldiffeq-transport
Draft

GlobalDiffEq: add GlobalErrorTransport global error estimation and control#3956
ChrisRackauckas-Claude wants to merge 5 commits into
SciML:masterfrom
ChrisRackauckas-Claude:globaldiffeq-transport

Conversation

@ChrisRackauckas-Claude

Copy link
Copy Markdown
Member

Important

Ignore this PR until it has been reviewed by @ChrisRackauckas.

Stacked on #, which is stacked on #, #, and #3929. Only the top commit is new here; review that commit. Merge the base PRs first.

Summary

Adds GlobalErrorTransport — global error estimation and gtol-based control by the linearized error-transport (first variational) equation, addressing SciML/GlobalDiffEq.jl#5 (Berzins' Jacobian-based estimators; also Shampine 1986 and the defect-driven form summarized by Lang and Verwer 2007).

  • After a dense forward solve with interpolant P(t), the companion linear ODE ε' = J(P(t))ε + d(t) with the dense-output defect d(t) = f(P(t)) − P'(t) is integrated from ε(t₀) = 0; ‖ε(T)‖₂ estimates the endpoint global error.
  • The Jacobian is applied matrix-free through Jacobian-vector products via DifferentiationInterface; the autodiff keyword accepts any ADTypes backend (default AutoForwardDiff()). New deps: ADTypes, DifferentiationInterface, ForwardDiff.
  • With gtol, solve(prob, GlobalErrorTransport(Tsit5(); gtol = ...)) tightens local tolerances until the estimate meets the requested global tolerance — the same control loop contract as GlobalAdjoint.
  • The standalone estimator is the new global_error_estimate(prob, alg; abstol, reltol, ...) method; for API uniformity global_error_estimate(prob, ::GlobalAdjoint) is also added as an alias of adjoint_error_estimate.
  • The shared companion machinery (problem validation, dense-solve kwargs, out-of-place RHS view, gtol refinement loop, companion endpoint solve) lands in src/companion.jl and is reused by the next PR in the stack.

Version 1.6.0.

Validation (run locally)

  • ODEDIFFEQ_TEST_GROUP=Core julia --project=lib/GlobalDiffEq -e 'using Pkg; Pkg.test()': pass — Basic 1/1, traits 3/3, Adjoint 14/14, GLEE 37/37, Companion estimators 14/14, BigFloat 2/2
  • ODEDIFFEQ_TEST_GROUP=QA julia --project=lib/GlobalDiffEq -e 'using Pkg; Pkg.test()': pass — 22 passed, 1 pre-existing declared broken
  • On Lotka–Volterra against a 1e-13 reference: estimate/true-error ratios within 10% at tolerances 1e-4 and 1e-6 (measured 0.995–0.999), in-place and out-of-place; gtol = 1e-7 control delivered a true endpoint error of 9.8e-9; argument-validation paths tested.

🤖 Generated with Claude Code

https://claude.ai/code/session_01MfUh8tgp3iBmMv9nkBqoyY

Repo transfer of SciML/GlobalDiffEq.jl (GlobalRichardson), keeping its
name, UUID, and version lineage. The umbrella OrdinaryDiffEq dependency
is replaced by OrdinaryDiffEqTsit5 (precompile workload and tests only),
path sources point at the sibling sublibraries, tests read
ODEDIFFEQ_TEST_GROUP, and the rendered-API-docs QA check points at the
monorepo docs with reexported DiffEqBase names excluded. Adds the
Global Error Control docs section and the docs env wiring.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Carries SciML/GlobalDiffEq.jl#56 (GlobalAdjoint, adjoint_error_estimate;
Cao and Petzold 2004, closes SciML/GlobalDiffEq.jl#4) into the
monorepo, restructured as the package extension
GlobalDiffEqSciMLSensitivityExt on SciMLSensitivity + QuadGK weakdeps.
sensealg defaults to nothing and resolves to
QuadratureAdjoint(autojacvec = true) when the extension loads; solving
without the extension raises an instructive error. Public API and
semantics otherwise match the original PR.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Implements the explicit general linear methods with built-in global
error estimation from Constantinescu (2016), SIAM J. Numer. Anal. 54(6)
(arXiv:1503.05166; PETSc's TSGLEE23/TSGLEE24/TSGLEE35), addressing
SciML/GlobalDiffEq.jl#6 and SciML/GlobalDiffEq.jl#22, as proper
OrdinaryDiffEqCore algorithms. The methods propagate the partitioned
state (y, ε) where ε is an asymptotically correct global error
estimate; solve/init on plain ODEProblems transparently extend to the
ArrayPartition form and global_error_estimate(sol) extracts the
estimates. The per-step ε increment is an asymptotically correct local
error estimate driving standard step-size adaptivity. The paper's
method A4 is defective as printed (violates b·c = 1/2, converges at
order 1, absent from PETSc) and is deliberately not implemented.

Verified locally on the unstable Prince42 problem: solution orders
2/2/3, estimate accuracy orders 3/3/4, est/true-error ratio 1.00.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Adds the DOPRI5-based order-5 scheme with cheap global error estimation
of Makazaga and Murua (BIT 43, 2003) as another tableau in the GLEE
general linear framework (SciML/GlobalDiffEq.jl#6, the coefficient-
complete published representative of the Dormand-Duckers-Prince RK
triple family). Stages 1-7 are the standard DOPRI5 stages, three extra
stages propagate an order-6 companion solution, and a generic
solution-stage FSAL detection reuses stage 7's evaluation for fsallast,
giving exactly 9 function evaluations per step (verified by an nf
accounting test). The tableau was verified with exact rational
arithmetic against the order and independency conditions.

Verified locally on the unstable Prince42 problem: solution order 5,
estimate accuracy order 6, est/true-error ratio 1.04, 9.01 f-evals/step.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Implements the linearized error-transport estimator
(SciML/GlobalDiffEq.jl#5; Shampine 1986 / Berzins 1988 / Lang-Verwer
2007): after a dense forward solve, the companion linear ODE
ε' = Jε + d(t) driven by the dense-output defect d(t) = f(P(t)) - P'(t)
is integrated for the endpoint global error, with matrix-free
Jacobian-vector products through DifferentiationInterface (autodiff
accepts any ADTypes backend, default AutoForwardDiff). gtol-controlled
solves tighten local tolerances via the shared refinement loop in
companion.jl, mirroring GlobalAdjoint. global_error_estimate(prob, alg)
is the standalone estimator, also added for GlobalAdjoint as an alias
of adjoint_error_estimate.

Verified locally on Lotka-Volterra vs a 1e-13 reference: estimate to
true-error ratios 0.995-0.999 at tolerances 1e-4/1e-6, and gtol=1e-7
control yields 9.8e-9 final error.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants