From 92eb6ea264829fd7f18207367b44cb6a81584179 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 25 Jun 2026 13:41:43 -0400 Subject: [PATCH 001/108] QA: run_qa v1.6 form + ExplicitImports (root + sublibs) Convert every QA environment in the monorepo to SciMLTesting 1.6 `run_qa` and enable the ExplicitImports checks. - root test/qa/qa_tests.jl -> run_qa(OrdinaryDiffEq; aqua = false, explicit_imports = true, ...); preserves the umbrella's EI-only scope and adds a small all_explicit_imports_are_public ignore-list. SciMLTesting compat -> "1.6", ExplicitImports dropped (transitive). - 47 sublibrary test/qa/qa.jl -> run_qa(; ...). Aqua sub-check disables preserved as aqua_kwargs. StochasticDiffEq*/`*Tableaus` keep JET inline via `using JET` + jet_kwargs = (; target_defined_modules = true); solver sublibs keep their separate jet.jl. explicit_imports = true on every env, with internal-API findings recorded as ei_broken (0 hard EI failures; tracked in #3776; auto-flags once upstream make-public lands). - DelayDiffEq test/qa/qa_tests.jl -> run_qa preserving its treat_as_own piracy and recursive=false ambiguities config and EI ignore-lists. - Each test/qa/Project.toml gains SciMLTesting = "1.6"; [sources]/develop wiring untouched. Fixes folded in (FIX > IGNORE > BROKEN): - StochasticDiffEqLevyArea: drop stale `using Random: Xoshiro`. - OrdinaryDiffEqCore: drop unused DataStructures dep (replaced by BinaryHeaps in #3407, left in [deps]/[compat]); Aqua stale_deps now passes. Verified locally vs released SciMLTesting 1.6.0: root 6/6 pass; StochasticDiffEqLevyArea 18/18 pass; OrdinaryDiffEqTsit5 13 pass/4 broken; OrdinaryDiffEqCore 9 pass/6 broken; all 0 hard fail. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- Project.toml | 2 +- lib/DelayDiffEq/Project.toml | 6 +- lib/DelayDiffEq/test/qa/qa_tests.jl | 68 +++++++++---------- lib/DiffEqDevTools/test/qa/Project.toml | 2 + lib/DiffEqDevTools/test/qa/qa.jl | 21 +++--- .../test/qa/Project.toml | 2 + lib/ImplicitDiscreteSolve/test/qa/qa.jl | 15 ++-- .../test/qa/Project.toml | 2 + .../test/qa/qa.jl | 13 ++-- lib/OrdinaryDiffEqBDF/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqBDF/test/qa/qa.jl | 13 ++-- lib/OrdinaryDiffEqCore/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqCore/test/qa/qa.jl | 17 ++--- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqDefault/test/qa/qa.jl | 15 ++-- .../test/qa/Project.toml | 2 + .../test/qa/qa.jl | 16 ++--- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + .../test/qa/qa.jl | 17 ++--- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl | 13 ++-- lib/OrdinaryDiffEqFIRK/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqFIRK/test/qa/qa.jl | 13 ++-- lib/OrdinaryDiffEqFeagin/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqFeagin/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl | 15 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + .../test/qa/qa.jl | 17 ++--- lib/OrdinaryDiffEqLinear/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqLinear/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + .../test/qa/qa.jl | 15 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl | 13 ++-- lib/OrdinaryDiffEqPDIRK/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl | 13 ++-- lib/OrdinaryDiffEqPRK/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqPRK/test/qa/qa.jl | 13 ++-- lib/OrdinaryDiffEqQPRK/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqQPRK/test/qa/qa.jl | 13 ++-- lib/OrdinaryDiffEqRKN/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqRKN/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + .../test/qa/qa.jl | 16 ++--- lib/OrdinaryDiffEqSDIRK/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl | 13 ++-- lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl | 13 ++-- .../test/qa/Project.toml | 2 + lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl | 21 +++--- lib/OrdinaryDiffEqTsit5/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqTsit5/test/qa/qa.jl | 13 ++-- lib/OrdinaryDiffEqVerner/test/qa/Project.toml | 2 + lib/OrdinaryDiffEqVerner/test/qa/qa.jl | 13 ++-- lib/StochasticDiffEqCore/test/qa/Project.toml | 2 + lib/StochasticDiffEqCore/test/qa/qa.jl | 17 ++--- .../test/qa/Project.toml | 2 + lib/StochasticDiffEqHighOrder/test/qa/qa.jl | 17 ++--- lib/StochasticDiffEqIIF/test/qa/Project.toml | 2 + lib/StochasticDiffEqIIF/test/qa/qa.jl | 17 ++--- .../test/qa/Project.toml | 2 + lib/StochasticDiffEqImplicit/test/qa/qa.jl | 17 ++--- .../test/qa/Project.toml | 2 + lib/StochasticDiffEqLeaping/test/qa/qa.jl | 17 ++--- .../src/StochasticDiffEqLevyArea.jl | 1 - .../test/qa/Project.toml | 2 + lib/StochasticDiffEqLevyArea/test/qa/qa.jl | 16 ++--- .../test/qa/Project.toml | 2 + lib/StochasticDiffEqLowOrder/test/qa/qa.jl | 17 ++--- .../test/qa/Project.toml | 2 + lib/StochasticDiffEqMilstein/test/qa/qa.jl | 17 ++--- lib/StochasticDiffEqROCK/test/qa/Project.toml | 2 + lib/StochasticDiffEqROCK/test/qa/qa.jl | 17 ++--- lib/StochasticDiffEqRODE/test/qa/Project.toml | 2 + lib/StochasticDiffEqRODE/test/qa/qa.jl | 17 ++--- lib/StochasticDiffEqWeak/test/qa/Project.toml | 2 + lib/StochasticDiffEqWeak/test/qa/qa.jl | 17 ++--- test/qa/qa_tests.jl | 26 ++++--- 99 files changed, 453 insertions(+), 440 deletions(-) diff --git a/Project.toml b/Project.toml index f17c5faa21d..2ee3021cb04 100644 --- a/Project.toml +++ b/Project.toml @@ -65,7 +65,7 @@ OrdinaryDiffEqVerner = "2" RecursiveArrayTools = "4.2.0" SciMLBase = "3" SciMLLogging = "2.0.0" -SciMLTesting = "1" +SciMLTesting = "1.6" julia = "1.10" [extras] diff --git a/lib/DelayDiffEq/Project.toml b/lib/DelayDiffEq/Project.toml index 932e1241122..790a0a9b674 100644 --- a/lib/DelayDiffEq/Project.toml +++ b/lib/DelayDiffEq/Project.toml @@ -66,7 +66,6 @@ DiffEqBase = "7" DiffEqCallbacks = "4.17.0" DiffEqDevTools = "3" DiffEqNoiseProcess = "5.30.0" -ExplicitImports = "1.13.1" FastBroadcast = "1.3" FiniteDiff = "2.27" ForwardDiff = "1.3.3" @@ -93,6 +92,7 @@ RecursiveArrayTools = "4.2.0" Reexport = "1.2.2" SafeTestsets = "0.1.0" SciMLBase = "3.10.0" +SciMLTesting = "1.6" SparseArrays = "<0.0.1, 1, 2" StochasticDiffEqCore = "2" StochasticDiffEqHighOrder = "2" @@ -119,7 +119,6 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DDEProblemLibrary = "f42792ee-6ffc-4e2a-ae83-8ee2f22de800" DiffEqCallbacks = "459566f4-90b8-5000-8ac3-15dfb0a30def" DiffEqDevTools = "f3b72e0c-5b89-59e1-b016-84e28bfd966d" -ExplicitImports = "7d51a73a-1435-4ff3-83d9-f097790105c7" FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" OrdinaryDiffEqBDF = "6ad6398a-0878-4a85-9266-38940aa047c8" @@ -134,8 +133,9 @@ OrdinaryDiffEqVerner = "79d7bb75-1356-48c1-b8c0-6832512096c2" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [targets] -test = ["ADTypes", "Aqua", "DDEProblemLibrary", "DiffEqCallbacks", "DiffEqDevTools", "ExplicitImports", "FiniteDiff", "LinearSolve", "OrdinaryDiffEqBDF", "OrdinaryDiffEqFeagin", "OrdinaryDiffEqHighOrderRK", "OrdinaryDiffEqLowOrderRK", "OrdinaryDiffEqLowStorageRK", "OrdinaryDiffEqSDIRK", "OrdinaryDiffEqSSPRK", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "Random", "RecursiveArrayTools", "SafeTestsets", "SparseArrays", "StochasticDiffEqCore", "StochasticDiffEqHighOrder", "StochasticDiffEqImplicit", "StochasticDiffEqLowOrder", "StochasticDiffEqROCK", "Test", "Unitful"] +test = ["ADTypes", "Aqua", "DDEProblemLibrary", "DiffEqCallbacks", "DiffEqDevTools", "FiniteDiff", "LinearSolve", "OrdinaryDiffEqBDF", "OrdinaryDiffEqFeagin", "OrdinaryDiffEqHighOrderRK", "OrdinaryDiffEqLowOrderRK", "OrdinaryDiffEqLowStorageRK", "OrdinaryDiffEqSDIRK", "OrdinaryDiffEqSSPRK", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "Random", "RecursiveArrayTools", "SafeTestsets", "SciMLTesting", "SparseArrays", "StochasticDiffEqCore", "StochasticDiffEqHighOrder", "StochasticDiffEqImplicit", "StochasticDiffEqLowOrder", "StochasticDiffEqROCK", "Test", "Unitful"] diff --git a/lib/DelayDiffEq/test/qa/qa_tests.jl b/lib/DelayDiffEq/test/qa/qa_tests.jl index 9022866e2a4..bd4632cc403 100644 --- a/lib/DelayDiffEq/test/qa/qa_tests.jl +++ b/lib/DelayDiffEq/test/qa/qa_tests.jl @@ -1,38 +1,34 @@ -using DelayDiffEq, Test +using SciMLTesting, DelayDiffEq, Test import SciMLBase +using OrdinaryDiffEqCore: OrdinaryDiffEqAlgorithm, StochasticDiffEqAlgorithm, + StochasticDiffEqRODEAlgorithm, + StochasticDiffEqConstantCache, StochasticDiffEqMutableCache -@testset "Aqua Tests" begin - using Aqua - - Aqua.test_all( - DelayDiffEq; ambiguities = false, piracies = false, - stale_deps = false, deps_compat = false - ) - Aqua.test_ambiguities(DelayDiffEq; recursive = false) - Aqua.test_stale_deps(DelayDiffEq) - Aqua.test_deps_compat(DelayDiffEq) - # Allow piracy for the default solver methods and SDE integration - using OrdinaryDiffEqCore: OrdinaryDiffEqAlgorithm, StochasticDiffEqAlgorithm, - StochasticDiffEqRODEAlgorithm, - StochasticDiffEqConstantCache, StochasticDiffEqMutableCache - Aqua.test_piracies( - DelayDiffEq; - treat_as_own = [ - SciMLBase.DDEProblem, - OrdinaryDiffEqAlgorithm, - StochasticDiffEqAlgorithm, - StochasticDiffEqRODEAlgorithm, - StochasticDiffEqConstantCache, - StochasticDiffEqMutableCache, - ] - ) -end - -@testset "Explicit Imports Tests" begin - using ExplicitImports - - @test check_no_implicit_imports(DelayDiffEq; skip = (Base, Core), ignore = (Symbol("@reexport"),)) === - nothing - @test check_no_stale_explicit_imports(DelayDiffEq, ignore = (:AbstractVerbositySpecifier, :Standard)) === nothing - @test check_all_qualified_accesses_via_owners(DelayDiffEq) === nothing -end +run_qa( + DelayDiffEq; + aqua_kwargs = (; + ambiguities = (; recursive = false), + # piracy is allowed for the default solver methods and SDE integration + piracies = (; + treat_as_own = [ + SciMLBase.DDEProblem, + OrdinaryDiffEqAlgorithm, + StochasticDiffEqAlgorithm, + StochasticDiffEqRODEAlgorithm, + StochasticDiffEqConstantCache, + StochasticDiffEqMutableCache, + ], + ), + ), + explicit_imports = true, + ei_kwargs = (; + no_implicit_imports = (; skip = (Base, Core), ignore = (Symbol("@reexport"),)), + no_stale_explicit_imports = (; ignore = (:AbstractVerbositySpecifier, :Standard)), + ), + # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_broken = ( + :all_explicit_imports_via_owners, + :all_qualified_accesses_are_public, + :all_explicit_imports_are_public, + ), +) diff --git a/lib/DiffEqDevTools/test/qa/Project.toml b/lib/DiffEqDevTools/test/qa/Project.toml index e33dfe9e6f1..aebeaf19e67 100644 --- a/lib/DiffEqDevTools/test/qa/Project.toml +++ b/lib/DiffEqDevTools/test/qa/Project.toml @@ -1,6 +1,7 @@ [deps] Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DiffEqDevTools = "f3b72e0c-5b89-59e1-b016-84e28bfd966d" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.DiffEqDevTools] @@ -9,4 +10,5 @@ path = "../.." [compat] Aqua = "0.8.11" DiffEqDevTools = "3" +SciMLTesting = "1.6" julia = "1.10" diff --git a/lib/DiffEqDevTools/test/qa/qa.jl b/lib/DiffEqDevTools/test/qa/qa.jl index a62cf98b168..307a12727c9 100644 --- a/lib/DiffEqDevTools/test/qa/qa.jl +++ b/lib/DiffEqDevTools/test/qa/qa.jl @@ -1,14 +1,11 @@ -using DiffEqDevTools -using Aqua -using Test +using SciMLTesting, DiffEqDevTools, Test -@testset "Aqua" begin - Aqua.test_all( - DiffEqDevTools; - ambiguities = false, - piracies = false, - unbound_args = false, - stale_deps = false, +run_qa( + DiffEqDevTools; + aqua_kwargs = (; + ambiguities = false, piracies = false, unbound_args = false, stale_deps = false, deps_compat = (; check_extras = false), - ) -end + ), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/ImplicitDiscreteSolve/test/qa/Project.toml b/lib/ImplicitDiscreteSolve/test/qa/Project.toml index 28e1ab0775c..c3ec6f8bbc5 100644 --- a/lib/ImplicitDiscreteSolve/test/qa/Project.toml +++ b/lib/ImplicitDiscreteSolve/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" ImplicitDiscreteSolve = "3263718b-31ed-49cf-8a0f-35a466e8af96" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.ImplicitDiscreteSolve] @@ -16,4 +17,5 @@ Aqua = "0.8.11" ImplicitDiscreteSolve = "2" JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" +SciMLTesting = "1.6" julia = "1.10" diff --git a/lib/ImplicitDiscreteSolve/test/qa/qa.jl b/lib/ImplicitDiscreteSolve/test/qa/qa.jl index cc4d2e2ba1f..fc2ccb33812 100644 --- a/lib/ImplicitDiscreteSolve/test/qa/qa.jl +++ b/lib/ImplicitDiscreteSolve/test/qa/qa.jl @@ -1,9 +1,8 @@ -using ImplicitDiscreteSolve -using Aqua +using SciMLTesting, ImplicitDiscreteSolve, Test -@testset "Aqua" begin - Aqua.test_all( - ImplicitDiscreteSolve; - piracies = false - ) -end +run_qa( + ImplicitDiscreteSolve; + aqua_kwargs = (; piracies = false), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/Project.toml b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/Project.toml index 87079fb5ab7..9bd1fecc9b7 100644 --- a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqAdamsBashforthMoulton = "89bda076-bce5-4f1c-845f-551c83cdda9a" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqAdamsBashforthMoulton] @@ -17,6 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqAdamsBashforthMoulton = "2" OrdinaryDiffEqCore = "4" diff --git a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl index 5a1ce46d44d..e1f9b5b96a5 100644 --- a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqAdamsBashforthMoulton -using Aqua +using SciMLTesting, OrdinaryDiffEqAdamsBashforthMoulton, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqAdamsBashforthMoulton - ) -end +run_qa( + OrdinaryDiffEqAdamsBashforthMoulton; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqBDF/test/qa/Project.toml b/lib/OrdinaryDiffEqBDF/test/qa/Project.toml index 52b08f00079..95017b9df62 100644 --- a/lib/OrdinaryDiffEqBDF/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqBDF/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqBDF = "6ad6398a-0878-4a85-9266-38940aa047c8" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqBDF] @@ -17,6 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqBDF = "2" OrdinaryDiffEqCore = "4" diff --git a/lib/OrdinaryDiffEqBDF/test/qa/qa.jl b/lib/OrdinaryDiffEqBDF/test/qa/qa.jl index 7f2b04a54d1..d0d82553098 100644 --- a/lib/OrdinaryDiffEqBDF/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqBDF/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqBDF -using Aqua +using SciMLTesting, OrdinaryDiffEqBDF, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqBDF - ) -end +run_qa( + OrdinaryDiffEqBDF; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqCore/test/qa/Project.toml b/lib/OrdinaryDiffEqCore/test/qa/Project.toml index ef0cd1c61ff..da1d1be5c0b 100644 --- a/lib/OrdinaryDiffEqCore/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqCore/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -16,4 +17,5 @@ Aqua = "0.8.11" DiffEqBase = "7" JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" +SciMLTesting = "1.6" julia = "1.10" diff --git a/lib/OrdinaryDiffEqCore/test/qa/qa.jl b/lib/OrdinaryDiffEqCore/test/qa/qa.jl index b06c50545fb..5dab2c4ae10 100644 --- a/lib/OrdinaryDiffEqCore/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqCore/test/qa/qa.jl @@ -1,11 +1,8 @@ -using OrdinaryDiffEqCore -using Aqua -using Test +using SciMLTesting, OrdinaryDiffEqCore, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqCore; - piracies = false, - unbound_args = false - ) -end +run_qa( + OrdinaryDiffEqCore; + aqua_kwargs = (; piracies = false, unbound_args = false), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqDefault/test/qa/Project.toml b/lib/OrdinaryDiffEqDefault/test/qa/Project.toml index 292ddc0cb31..5de6643f1b1 100644 --- a/lib/OrdinaryDiffEqDefault/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqDefault/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqDefault = "50262376-6c5a-4cf5-baba-aaf4f84d72d7" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -16,4 +17,5 @@ Aqua = "0.8.11" JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqDefault = "2" +SciMLTesting = "1.6" julia = "1.10" diff --git a/lib/OrdinaryDiffEqDefault/test/qa/qa.jl b/lib/OrdinaryDiffEqDefault/test/qa/qa.jl index da05ddc9cee..58d1d553d1b 100644 --- a/lib/OrdinaryDiffEqDefault/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqDefault/test/qa/qa.jl @@ -1,9 +1,8 @@ -using OrdinaryDiffEqDefault -using Aqua +using SciMLTesting, OrdinaryDiffEqDefault, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqDefault; - piracies = false - ) -end +run_qa( + OrdinaryDiffEqDefault; + aqua_kwargs = (; piracies = false), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml b/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml index 21801030488..f06cb4e40fc 100644 --- a/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqDifferentiation = "4302a76b-040a-498a-8c04-15b101fed76b" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -16,4 +17,5 @@ Aqua = "0.8.11" JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqDifferentiation = "3" +SciMLTesting = "1.6" julia = "1.10" diff --git a/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl b/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl index 35a110b433d..251f8bac902 100644 --- a/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl @@ -1,10 +1,8 @@ -using OrdinaryDiffEqDifferentiation -using Aqua +using SciMLTesting, OrdinaryDiffEqDifferentiation, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqDifferentiation; - piracies = false, - ambiguities = false - ) -end +run_qa( + OrdinaryDiffEqDifferentiation; + aqua_kwargs = (; piracies = false, ambiguities = false), + explicit_imports = true, + ei_broken = (:no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml b/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml index dfcd43e19df..ac62a707a4c 100644 --- a/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqExplicitRK = "9286f039-9fbf-40e8-bf65-aa933bdc4db0" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqExplicitRK] @@ -17,6 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqExplicitRK = "2" diff --git a/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl b/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl index b4c63ca2d70..9d1739ffe5f 100644 --- a/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqExplicitRK -using Aqua +using SciMLTesting, OrdinaryDiffEqExplicitRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqExplicitRK - ) -end +run_qa( + OrdinaryDiffEqExplicitRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqExplicitTableaus/test/qa/Project.toml b/lib/OrdinaryDiffEqExplicitTableaus/test/qa/Project.toml index ed0ce48e713..74ad66998cc 100644 --- a/lib/OrdinaryDiffEqExplicitTableaus/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqExplicitTableaus/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqExplicitTableaus = "3278f1b1-0f5c-4cde-98e0-ba5eb00db955" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.DiffEqBase] @@ -16,5 +17,6 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqExplicitTableaus = "2" +SciMLTesting = "1.6" Test = "1" julia = "1.10" diff --git a/lib/OrdinaryDiffEqExplicitTableaus/test/qa/qa.jl b/lib/OrdinaryDiffEqExplicitTableaus/test/qa/qa.jl index 8b907941026..bc739b4f74a 100644 --- a/lib/OrdinaryDiffEqExplicitTableaus/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExplicitTableaus/test/qa/qa.jl @@ -1,12 +1,9 @@ -using OrdinaryDiffEqExplicitTableaus -using Aqua +using SciMLTesting, OrdinaryDiffEqExplicitTableaus, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(OrdinaryDiffEqExplicitTableaus) -end - -@testset "JET" begin - JET.test_package(OrdinaryDiffEqExplicitTableaus; target_defined_modules = true) -end +run_qa( + OrdinaryDiffEqExplicitTableaus; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:all_qualified_accesses_are_public,), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml b/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml index 4c8b01a682a..fd6dd0a03d4 100644 --- a/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqExponentialRK = "e0540318-69ee-4070-8777-9e2de6de23de" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqExponentialRK] @@ -17,6 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqExponentialRK = "2" diff --git a/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl b/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl index 7697d47cb5a..98201407afe 100644 --- a/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqExponentialRK -using Aqua +using SciMLTesting, OrdinaryDiffEqExponentialRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqExponentialRK - ) -end +run_qa( + OrdinaryDiffEqExponentialRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqExtrapolation/test/qa/Project.toml b/lib/OrdinaryDiffEqExtrapolation/test/qa/Project.toml index ff76759238d..f430ccddac4 100644 --- a/lib/OrdinaryDiffEqExtrapolation/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqExtrapolation/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqExtrapolation = "becaefa8-8ca2-5cf9-886d-c06f3d2bd2c4" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqExtrapolation] @@ -17,6 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqExtrapolation = "2" diff --git a/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl b/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl index b2f09dee0bf..81942e405f7 100644 --- a/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqExtrapolation -using Aqua +using SciMLTesting, OrdinaryDiffEqExtrapolation, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqExtrapolation - ) -end +run_qa( + OrdinaryDiffEqExtrapolation; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqFIRK/test/qa/Project.toml b/lib/OrdinaryDiffEqFIRK/test/qa/Project.toml index afa4cd0c969..db39f5a990d 100644 --- a/lib/OrdinaryDiffEqFIRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqFIRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqFIRK = "5960d6e9-dd7a-4743-88e7-cf307b64f125" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqFIRK] @@ -17,6 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqFIRK = "2" diff --git a/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl index c5183342538..b0cabb6693f 100644 --- a/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqFIRK -using Aqua +using SciMLTesting, OrdinaryDiffEqFIRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqFIRK - ) -end +run_qa( + OrdinaryDiffEqFIRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml b/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml index 4ea99a92378..50528bce6b7 100644 --- a/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqFeagin = "101fe9f7-ebb6-4678-b671-3a81e7194747" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqFeagin = "2" diff --git a/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl b/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl index 1676c92185f..2ba8bd1f994 100644 --- a/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqFeagin -using Aqua +using SciMLTesting, OrdinaryDiffEqFeagin, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqFeagin - ) -end +run_qa( + OrdinaryDiffEqFeagin; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqFunctionMap/test/qa/Project.toml b/lib/OrdinaryDiffEqFunctionMap/test/qa/Project.toml index d186da2b614..2d6e5bd2aa1 100644 --- a/lib/OrdinaryDiffEqFunctionMap/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqFunctionMap/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqFunctionMap = "d3585ca7-f5d3-4ba6-8057-292ed1abd90f" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqFunctionMap = "2" diff --git a/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl b/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl index 9c7f1076f31..1dc4b5cf8d1 100644 --- a/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl @@ -1,9 +1,8 @@ -using OrdinaryDiffEqFunctionMap -using Aqua +using SciMLTesting, OrdinaryDiffEqFunctionMap, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqFunctionMap; - piracies = false # Piracy is necessary for default algorithm dispatch - ) -end +run_qa( + OrdinaryDiffEqFunctionMap; + aqua_kwargs = (; piracies = false), # piracy is needed for default-algorithm dispatch + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml b/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml index 2e5fad54188..c77f8d90bc3 100644 --- a/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqHighOrderRK = "d28bc4f8-55e1-4f49-af69-84c1a99f0f58" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqHighOrderRK = "2" diff --git a/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl b/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl index 1e7b55be83e..5370c0b872a 100644 --- a/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqHighOrderRK -using Aqua +using SciMLTesting, OrdinaryDiffEqHighOrderRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqHighOrderRK - ) -end +run_qa( + OrdinaryDiffEqHighOrderRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml index 01f5176f2f2..1c342b35835 100644 --- a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqIMEXMultistep = "9f002381-b378-40b7-97a6-27a27c83f129" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqIMEXMultistep = "2" diff --git a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl index 0448efc483c..b41ab4bf30e 100644 --- a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqIMEXMultistep -using Aqua +using SciMLTesting, OrdinaryDiffEqIMEXMultistep, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqIMEXMultistep - ) -end +run_qa( + OrdinaryDiffEqIMEXMultistep; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqImplicitTableaus/test/qa/Project.toml b/lib/OrdinaryDiffEqImplicitTableaus/test/qa/Project.toml index 015ac946172..7f024b7d47e 100644 --- a/lib/OrdinaryDiffEqImplicitTableaus/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqImplicitTableaus/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqImplicitTableaus = "75f66a49-58fc-43e3-9173-2340726368f7" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.DiffEqBase] @@ -16,5 +17,6 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqImplicitTableaus = "2" +SciMLTesting = "1.6" Test = "1" julia = "1.10" diff --git a/lib/OrdinaryDiffEqImplicitTableaus/test/qa/qa.jl b/lib/OrdinaryDiffEqImplicitTableaus/test/qa/qa.jl index 0f531741bd5..56065ee5308 100644 --- a/lib/OrdinaryDiffEqImplicitTableaus/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqImplicitTableaus/test/qa/qa.jl @@ -1,12 +1,9 @@ -using OrdinaryDiffEqImplicitTableaus -using Aqua +using SciMLTesting, OrdinaryDiffEqImplicitTableaus, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(OrdinaryDiffEqImplicitTableaus) -end - -@testset "JET" begin - JET.test_package(OrdinaryDiffEqImplicitTableaus; target_defined_modules = true) -end +run_qa( + OrdinaryDiffEqImplicitTableaus; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:all_qualified_accesses_are_public,), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqLinear/test/qa/Project.toml b/lib/OrdinaryDiffEqLinear/test/qa/Project.toml index cea60e4f6cd..64e6ff030d1 100644 --- a/lib/OrdinaryDiffEqLinear/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqLinear/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqLinear = "521117fe-8c41-49f8-b3b6-30780b3f0fb5" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqLinear = "2" diff --git a/lib/OrdinaryDiffEqLinear/test/qa/qa.jl b/lib/OrdinaryDiffEqLinear/test/qa/qa.jl index 223770117fc..1d49dacb6b8 100644 --- a/lib/OrdinaryDiffEqLinear/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqLinear/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqLinear -using Aqua +using SciMLTesting, OrdinaryDiffEqLinear, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqLinear - ) -end +run_qa( + OrdinaryDiffEqLinear; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqLowOrderRK/test/qa/Project.toml b/lib/OrdinaryDiffEqLowOrderRK/test/qa/Project.toml index a0f327c0f1e..8fe0f5d9eb5 100644 --- a/lib/OrdinaryDiffEqLowOrderRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqLowOrderRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqLowOrderRK = "1344f307-1e59-4825-a18e-ace9aa3fa4c6" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqLowOrderRK = "2" diff --git a/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl b/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl index d4e8d474cc4..c9adf169e40 100644 --- a/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqLowOrderRK -using Aqua +using SciMLTesting, OrdinaryDiffEqLowOrderRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqLowOrderRK - ) -end +run_qa( + OrdinaryDiffEqLowOrderRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqLowStorageRK/test/qa/Project.toml b/lib/OrdinaryDiffEqLowStorageRK/test/qa/Project.toml index 833271b5e7b..5829043e0df 100644 --- a/lib/OrdinaryDiffEqLowStorageRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqLowStorageRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqLowStorageRK = "b0944070-b475-4768-8dec-fb6eb410534d" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqLowStorageRK = "3" diff --git a/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl b/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl index 1c6ae493bf4..87861c5cbd5 100644 --- a/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqLowStorageRK -using Aqua +using SciMLTesting, OrdinaryDiffEqLowStorageRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqLowStorageRK - ) -end +run_qa( + OrdinaryDiffEqLowStorageRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/Project.toml b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/Project.toml index 4d16af19249..14d40102004 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/Project.toml @@ -7,6 +7,7 @@ OrdinaryDiffEqBDF = "6ad6398a-0878-4a85-9266-38940aa047c8" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqNonlinearSolve = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8" OrdinaryDiffEqRosenbrock = "43230ef6-c299-4910-a778-202eb28ce4ce" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -29,4 +30,5 @@ OrdinaryDiffEqBDF = "2" OrdinaryDiffEqCore = "4" OrdinaryDiffEqNonlinearSolve = "2" OrdinaryDiffEqRosenbrock = "2" +SciMLTesting = "1.6" julia = "1.10" diff --git a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl index d4e7ff9d2a5..20cbf618205 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl @@ -1,9 +1,8 @@ -using OrdinaryDiffEqNonlinearSolve -using Aqua +using SciMLTesting, OrdinaryDiffEqNonlinearSolve, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqNonlinearSolve; - piracies = false - ) -end +run_qa( + OrdinaryDiffEqNonlinearSolve; + aqua_kwargs = (; piracies = false), + explicit_imports = true, + ei_broken = (:no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqNordsieck/test/qa/Project.toml b/lib/OrdinaryDiffEqNordsieck/test/qa/Project.toml index be6682b9685..6fe3ae5df3f 100644 --- a/lib/OrdinaryDiffEqNordsieck/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqNordsieck/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqNordsieck = "c9986a66-5c92-4813-8696-a7ec84c806c8" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqNordsieck = "2" diff --git a/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl b/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl index 2e713c847a1..5c13e2f0744 100644 --- a/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqNordsieck -using Aqua +using SciMLTesting, OrdinaryDiffEqNordsieck, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqNordsieck - ) -end +run_qa( + OrdinaryDiffEqNordsieck; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqPDIRK/test/qa/Project.toml b/lib/OrdinaryDiffEqPDIRK/test/qa/Project.toml index 09b727af69a..a4ca5838623 100644 --- a/lib/OrdinaryDiffEqPDIRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqPDIRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqPDIRK = "5dd0a6cf-3d4b-4314-aa06-06d4e299bc89" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqPDIRK = "2" diff --git a/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl index 588e4c58b8f..0bfa13f5788 100644 --- a/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqPDIRK -using Aqua +using SciMLTesting, OrdinaryDiffEqPDIRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqPDIRK - ) -end +run_qa( + OrdinaryDiffEqPDIRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqPRK/test/qa/Project.toml b/lib/OrdinaryDiffEqPRK/test/qa/Project.toml index 46327273f97..7d6bb935de0 100644 --- a/lib/OrdinaryDiffEqPRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqPRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqPRK = "5b33eab2-c0f1-4480-b2c3-94bc1e80bda1" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqPRK = "2" diff --git a/lib/OrdinaryDiffEqPRK/test/qa/qa.jl b/lib/OrdinaryDiffEqPRK/test/qa/qa.jl index ce2afd1e8b5..f4200af3fe4 100644 --- a/lib/OrdinaryDiffEqPRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqPRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqPRK -using Aqua +using SciMLTesting, OrdinaryDiffEqPRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqPRK - ) -end +run_qa( + OrdinaryDiffEqPRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqQPRK/test/qa/Project.toml b/lib/OrdinaryDiffEqQPRK/test/qa/Project.toml index 04f6e75b42d..975ae3c4919 100644 --- a/lib/OrdinaryDiffEqQPRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqQPRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqQPRK = "04162be5-8125-4266-98ed-640baecc6514" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqQPRK = "2" diff --git a/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl b/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl index 79f03b7c4c8..8a2ab83ee4c 100644 --- a/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqQPRK -using Aqua +using SciMLTesting, OrdinaryDiffEqQPRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqQPRK - ) -end +run_qa( + OrdinaryDiffEqQPRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqRKN/test/qa/Project.toml b/lib/OrdinaryDiffEqRKN/test/qa/Project.toml index 353fbe7f5d4..2650db7cd48 100644 --- a/lib/OrdinaryDiffEqRKN/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqRKN/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqRKN = "af6ede74-add8-4cfd-b1df-9a4dbb109d7a" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqRKN = "2" diff --git a/lib/OrdinaryDiffEqRKN/test/qa/qa.jl b/lib/OrdinaryDiffEqRKN/test/qa/qa.jl index 8ef2c300957..1a36d11c50e 100644 --- a/lib/OrdinaryDiffEqRKN/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqRKN/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqRKN -using Aqua +using SciMLTesting, OrdinaryDiffEqRKN, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqRKN - ) -end +run_qa( + OrdinaryDiffEqRKN; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqRosenbrock/test/qa/Project.toml b/lib/OrdinaryDiffEqRosenbrock/test/qa/Project.toml index 75be151e8d7..217ffab1a1c 100644 --- a/lib/OrdinaryDiffEqRosenbrock/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqRosenbrock/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqRosenbrock = "43230ef6-c299-4910-a778-202eb28ce4ce" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -20,4 +21,5 @@ JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqRosenbrock = "2" SciMLBase = "3" +SciMLTesting = "1.6" julia = "1.10" diff --git a/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl b/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl index c9e65b9ee89..513189baadc 100644 --- a/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqRosenbrock -using Aqua +using SciMLTesting, OrdinaryDiffEqRosenbrock, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqRosenbrock - ) -end +run_qa( + OrdinaryDiffEqRosenbrock; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/Project.toml b/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/Project.toml index 0dc400d082b..17ef062fbaa 100644 --- a/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/Project.toml @@ -2,6 +2,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqRosenbrockTableaus = "b4bd8bb3-f80f-41d2-9b21-73a655b304b9" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqRosenbrockTableaus] @@ -11,5 +12,6 @@ path = "../.." Aqua = "0.8" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqRosenbrockTableaus = "2" +SciMLTesting = "1.6" Test = "1" julia = "1.10" diff --git a/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/qa.jl b/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/qa.jl index b807f6dcb1a..fa05cbabc6c 100644 --- a/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/qa.jl @@ -1,12 +1,8 @@ -using OrdinaryDiffEqRosenbrockTableaus -using Aqua +using SciMLTesting, OrdinaryDiffEqRosenbrockTableaus, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(OrdinaryDiffEqRosenbrockTableaus) -end - -@testset "JET" begin - JET.test_package(OrdinaryDiffEqRosenbrockTableaus; target_defined_modules = true) -end +run_qa( + OrdinaryDiffEqRosenbrockTableaus; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, +) diff --git a/lib/OrdinaryDiffEqSDIRK/test/qa/Project.toml b/lib/OrdinaryDiffEqSDIRK/test/qa/Project.toml index 31ef56b1c1b..044c5d5597f 100644 --- a/lib/OrdinaryDiffEqSDIRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqSDIRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqSDIRK = "2d112036-d095-4a1e-ab9a-08536f3ecdbf" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqSDIRK = "2" diff --git a/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl index ab500f0ccc4..3e170f4ea79 100644 --- a/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqSDIRK -using Aqua +using SciMLTesting, OrdinaryDiffEqSDIRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqSDIRK - ) -end +run_qa( + OrdinaryDiffEqSDIRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml b/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml index 2889633c0ad..5aad444d308 100644 --- a/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqSSPRK = "669c94d9-1f4b-4b64-b377-1aa079aa2388" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqSSPRK = "2" diff --git a/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl b/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl index 96363e95add..93c40b050bf 100644 --- a/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqSSPRK -using Aqua +using SciMLTesting, OrdinaryDiffEqSSPRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqSSPRK - ) -end +run_qa( + OrdinaryDiffEqSSPRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/Project.toml b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/Project.toml index fa35525e5e8..040ef7ad09d 100644 --- a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqStabilizedIRK = "e3e12d00-db14-5390-b879-ac3dd2ef6296" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqStabilizedIRK = "2" diff --git a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl index 7f59882a009..e48c1acb1f6 100644 --- a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqStabilizedIRK -using Aqua +using SciMLTesting, OrdinaryDiffEqStabilizedIRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqStabilizedIRK - ) -end +run_qa( + OrdinaryDiffEqStabilizedIRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqStabilizedRK/test/qa/Project.toml b/lib/OrdinaryDiffEqStabilizedRK/test/qa/Project.toml index ff71ba764a5..3734ca4df8d 100644 --- a/lib/OrdinaryDiffEqStabilizedRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqStabilizedRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqStabilizedRK = "358294b1-0aab-51c3-aafe-ad5ab194a2ad" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources] @@ -18,4 +19,5 @@ JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqStabilizedRK = "2" SciMLBase = "3" +SciMLTesting = "1.6" julia = "1.10" diff --git a/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl b/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl index 2dd5f2ac23a..fe026790d6c 100644 --- a/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqStabilizedRK -using Aqua +using SciMLTesting, OrdinaryDiffEqStabilizedRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqStabilizedRK - ) -end +run_qa( + OrdinaryDiffEqStabilizedRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqSymplecticRK/test/qa/Project.toml b/lib/OrdinaryDiffEqSymplecticRK/test/qa/Project.toml index 0b88d6a81ef..a48af55ace0 100644 --- a/lib/OrdinaryDiffEqSymplecticRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqSymplecticRK/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqSymplecticRK = "fa646aed-7ef9-47eb-84c4-9443fc8cbfa8" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqSymplecticRK = "2" diff --git a/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl b/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl index eba4d7280d9..092d6e594d8 100644 --- a/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqSymplecticRK -using Aqua +using SciMLTesting, OrdinaryDiffEqSymplecticRK, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqSymplecticRK - ) -end +run_qa( + OrdinaryDiffEqSymplecticRK; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqTaylorSeries/test/qa/Project.toml b/lib/OrdinaryDiffEqTaylorSeries/test/qa/Project.toml index 23394d2b02a..c08fa7d5357 100644 --- a/lib/OrdinaryDiffEqTaylorSeries/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqTaylorSeries/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqTaylorSeries = "9c7f1690-dd92-42a3-8318-297ee24d8d39" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqTaylorSeries = "2" diff --git a/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl b/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl index 7e82446cd60..80ff9e9cb67 100644 --- a/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl @@ -1,12 +1,11 @@ -using OrdinaryDiffEqTaylorSeries -using Aqua +using SciMLTesting, OrdinaryDiffEqTaylorSeries, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqTaylorSeries; - unbound_args = false, - undefined_exports = false, - stale_deps = false, - ambiguities = false - ) -end +run_qa( + OrdinaryDiffEqTaylorSeries; + aqua_kwargs = (; + unbound_args = false, undefined_exports = false, stale_deps = false, + ambiguities = false, + ), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqTsit5/test/qa/Project.toml b/lib/OrdinaryDiffEqTsit5/test/qa/Project.toml index bfe4497ebd3..2e316b340ce 100644 --- a/lib/OrdinaryDiffEqTsit5/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqTsit5/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqTsit5 = "b1df2697-797e-41e3-8120-5422d3b24e4a" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources] @@ -18,4 +19,5 @@ JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqTsit5 = "2" SciMLBase = "3" +SciMLTesting = "1.6" julia = "1.10" diff --git a/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl b/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl index eaf4ebf9fd0..8a44e3e7b8d 100644 --- a/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqTsit5 -using Aqua +using SciMLTesting, OrdinaryDiffEqTsit5, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqTsit5 - ) -end +run_qa( + OrdinaryDiffEqTsit5; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/OrdinaryDiffEqVerner/test/qa/Project.toml b/lib/OrdinaryDiffEqVerner/test/qa/Project.toml index 8b57d67b960..790294ae6c3 100644 --- a/lib/OrdinaryDiffEqVerner/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqVerner/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqVerner = "79d7bb75-1356-48c1-b8c0-6832512096c2" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources.OrdinaryDiffEqCore] @@ -17,6 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" +SciMLTesting = "1.6" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqVerner = "2" diff --git a/lib/OrdinaryDiffEqVerner/test/qa/qa.jl b/lib/OrdinaryDiffEqVerner/test/qa/qa.jl index 6a2b8d6f6e1..0c16eeda483 100644 --- a/lib/OrdinaryDiffEqVerner/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqVerner/test/qa/qa.jl @@ -1,8 +1,7 @@ -using OrdinaryDiffEqVerner -using Aqua +using SciMLTesting, OrdinaryDiffEqVerner, Test -@testset "Aqua" begin - Aqua.test_all( - OrdinaryDiffEqVerner - ) -end +run_qa( + OrdinaryDiffEqVerner; + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/StochasticDiffEqCore/test/qa/Project.toml b/lib/StochasticDiffEqCore/test/qa/Project.toml index 8952219ac2d..022df6fddeb 100644 --- a/lib/StochasticDiffEqCore/test/qa/Project.toml +++ b/lib/StochasticDiffEqCore/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" StochasticDiffEqLevyArea = "90dbc90e-856a-4131-af2c-e8c5aa0f35b5" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -24,6 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" +SciMLTesting = "1.6" StochasticDiffEqCore = "2" StochasticDiffEqLevyArea = "2" Test = "1" diff --git a/lib/StochasticDiffEqCore/test/qa/qa.jl b/lib/StochasticDiffEqCore/test/qa/qa.jl index 27a4e9c7d28..ea9a3f1382c 100644 --- a/lib/StochasticDiffEqCore/test/qa/qa.jl +++ b/lib/StochasticDiffEqCore/test/qa/qa.jl @@ -1,12 +1,9 @@ -using StochasticDiffEqCore -using Aqua +using SciMLTesting, StochasticDiffEqCore, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(StochasticDiffEqCore) -end - -@testset "JET" begin - JET.test_package(StochasticDiffEqCore; target_defined_modules = true) -end +run_qa( + StochasticDiffEqCore; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/StochasticDiffEqHighOrder/test/qa/Project.toml b/lib/StochasticDiffEqHighOrder/test/qa/Project.toml index 35dae9c83a3..5cf0c243325 100644 --- a/lib/StochasticDiffEqHighOrder/test/qa/Project.toml +++ b/lib/StochasticDiffEqHighOrder/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" StochasticDiffEqHighOrder = "0520c28c-50fd-4d16-9c96-902fc80b3bab" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -24,6 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" +SciMLTesting = "1.6" StochasticDiffEqCore = "2" StochasticDiffEqHighOrder = "2" Test = "1" diff --git a/lib/StochasticDiffEqHighOrder/test/qa/qa.jl b/lib/StochasticDiffEqHighOrder/test/qa/qa.jl index 27332e2dd44..53077c70744 100644 --- a/lib/StochasticDiffEqHighOrder/test/qa/qa.jl +++ b/lib/StochasticDiffEqHighOrder/test/qa/qa.jl @@ -1,12 +1,9 @@ -using StochasticDiffEqHighOrder -using Aqua +using SciMLTesting, StochasticDiffEqHighOrder, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(StochasticDiffEqHighOrder) -end - -@testset "JET" begin - JET.test_package(StochasticDiffEqHighOrder; target_defined_modules = true) -end +run_qa( + StochasticDiffEqHighOrder; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/StochasticDiffEqIIF/test/qa/Project.toml b/lib/StochasticDiffEqIIF/test/qa/Project.toml index 2e9395c433a..f88c5f5a2b4 100644 --- a/lib/StochasticDiffEqIIF/test/qa/Project.toml +++ b/lib/StochasticDiffEqIIF/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" StochasticDiffEqIIF = "ebf54054-c36b-4494-9aba-657e36df524f" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -24,6 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" +SciMLTesting = "1.6" StochasticDiffEqCore = "2" StochasticDiffEqIIF = "2" Test = "1" diff --git a/lib/StochasticDiffEqIIF/test/qa/qa.jl b/lib/StochasticDiffEqIIF/test/qa/qa.jl index aea967cf763..2d66e222feb 100644 --- a/lib/StochasticDiffEqIIF/test/qa/qa.jl +++ b/lib/StochasticDiffEqIIF/test/qa/qa.jl @@ -1,12 +1,9 @@ -using StochasticDiffEqIIF -using Aqua +using SciMLTesting, StochasticDiffEqIIF, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(StochasticDiffEqIIF) -end - -@testset "JET" begin - JET.test_package(StochasticDiffEqIIF; target_defined_modules = true) -end +run_qa( + StochasticDiffEqIIF; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/StochasticDiffEqImplicit/test/qa/Project.toml b/lib/StochasticDiffEqImplicit/test/qa/Project.toml index f23d469984a..442990fb290 100644 --- a/lib/StochasticDiffEqImplicit/test/qa/Project.toml +++ b/lib/StochasticDiffEqImplicit/test/qa/Project.toml @@ -5,6 +5,7 @@ JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqDifferentiation = "4302a76b-040a-498a-8c04-15b101fed76b" OrdinaryDiffEqNonlinearSolve = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" StochasticDiffEqImplicit = "5080b986-4c76-4669-b5dc-373a41579d5b" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -34,6 +35,7 @@ JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqDifferentiation = "3" OrdinaryDiffEqNonlinearSolve = "2" +SciMLTesting = "1.6" StochasticDiffEqCore = "2" StochasticDiffEqImplicit = "2" Test = "1" diff --git a/lib/StochasticDiffEqImplicit/test/qa/qa.jl b/lib/StochasticDiffEqImplicit/test/qa/qa.jl index cc44170166e..df755963ff6 100644 --- a/lib/StochasticDiffEqImplicit/test/qa/qa.jl +++ b/lib/StochasticDiffEqImplicit/test/qa/qa.jl @@ -1,12 +1,9 @@ -using StochasticDiffEqImplicit -using Aqua +using SciMLTesting, StochasticDiffEqImplicit, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(StochasticDiffEqImplicit) -end - -@testset "JET" begin - JET.test_package(StochasticDiffEqImplicit; target_defined_modules = true) -end +run_qa( + StochasticDiffEqImplicit; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/StochasticDiffEqLeaping/test/qa/Project.toml b/lib/StochasticDiffEqLeaping/test/qa/Project.toml index 45dc8154793..f67e3cef19d 100644 --- a/lib/StochasticDiffEqLeaping/test/qa/Project.toml +++ b/lib/StochasticDiffEqLeaping/test/qa/Project.toml @@ -4,6 +4,7 @@ DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqNonlinearSolve = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" StochasticDiffEqLeaping = "aefaaa88-39f2-4e89-b162-d61b7e8cc81b" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -29,6 +30,7 @@ DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqNonlinearSolve = "2" +SciMLTesting = "1.6" StochasticDiffEqCore = "2" StochasticDiffEqLeaping = "2" Test = "1" diff --git a/lib/StochasticDiffEqLeaping/test/qa/qa.jl b/lib/StochasticDiffEqLeaping/test/qa/qa.jl index c3d11e2b00a..371e69d96e1 100644 --- a/lib/StochasticDiffEqLeaping/test/qa/qa.jl +++ b/lib/StochasticDiffEqLeaping/test/qa/qa.jl @@ -1,12 +1,9 @@ -using StochasticDiffEqLeaping -using Aqua +using SciMLTesting, StochasticDiffEqLeaping, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(StochasticDiffEqLeaping) -end - -@testset "JET" begin - JET.test_package(StochasticDiffEqLeaping; target_defined_modules = true) -end +run_qa( + StochasticDiffEqLeaping; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/StochasticDiffEqLevyArea/src/StochasticDiffEqLevyArea.jl b/lib/StochasticDiffEqLevyArea/src/StochasticDiffEqLevyArea.jl index 5be2102e012..69cdaa372f4 100644 --- a/lib/StochasticDiffEqLevyArea/src/StochasticDiffEqLevyArea.jl +++ b/lib/StochasticDiffEqLevyArea/src/StochasticDiffEqLevyArea.jl @@ -2,7 +2,6 @@ module StochasticDiffEqLevyArea import LinearAlgebra: mul! import Random: randn!, default_rng, AbstractRNG -using Random: Xoshiro import SpecialFunctions: trigamma """ diff --git a/lib/StochasticDiffEqLevyArea/test/qa/Project.toml b/lib/StochasticDiffEqLevyArea/test/qa/Project.toml index 8d1584cef6d..d1da7d1a7af 100644 --- a/lib/StochasticDiffEqLevyArea/test/qa/Project.toml +++ b/lib/StochasticDiffEqLevyArea/test/qa/Project.toml @@ -1,6 +1,7 @@ [deps] Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StochasticDiffEqLevyArea = "90dbc90e-856a-4131-af2c-e8c5aa0f35b5" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -10,6 +11,7 @@ path = "../.." [compat] Aqua = "0.8" JET = "0.9, 0.10, 0.11" +SciMLTesting = "1.6" StochasticDiffEqLevyArea = "2" Test = "1" julia = "1.10" diff --git a/lib/StochasticDiffEqLevyArea/test/qa/qa.jl b/lib/StochasticDiffEqLevyArea/test/qa/qa.jl index 4e1ab152e02..8c317d38d29 100644 --- a/lib/StochasticDiffEqLevyArea/test/qa/qa.jl +++ b/lib/StochasticDiffEqLevyArea/test/qa/qa.jl @@ -1,12 +1,8 @@ -using StochasticDiffEqLevyArea -using Aqua +using SciMLTesting, StochasticDiffEqLevyArea, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(StochasticDiffEqLevyArea) -end - -@testset "JET" begin - JET.test_package(StochasticDiffEqLevyArea; target_defined_modules = true) -end +run_qa( + StochasticDiffEqLevyArea; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, +) diff --git a/lib/StochasticDiffEqLowOrder/test/qa/Project.toml b/lib/StochasticDiffEqLowOrder/test/qa/Project.toml index be4b1cf67c8..ab0bb6c1d6a 100644 --- a/lib/StochasticDiffEqLowOrder/test/qa/Project.toml +++ b/lib/StochasticDiffEqLowOrder/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" StochasticDiffEqLowOrder = "d15fe365-ce7f-450a-828a-7985bd5b681b" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -24,6 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" +SciMLTesting = "1.6" StochasticDiffEqCore = "2" StochasticDiffEqLowOrder = "2" Test = "1" diff --git a/lib/StochasticDiffEqLowOrder/test/qa/qa.jl b/lib/StochasticDiffEqLowOrder/test/qa/qa.jl index 5db61f34a74..820e50c3ef0 100644 --- a/lib/StochasticDiffEqLowOrder/test/qa/qa.jl +++ b/lib/StochasticDiffEqLowOrder/test/qa/qa.jl @@ -1,12 +1,9 @@ -using StochasticDiffEqLowOrder -using Aqua +using SciMLTesting, StochasticDiffEqLowOrder, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(StochasticDiffEqLowOrder) -end - -@testset "JET" begin - JET.test_package(StochasticDiffEqLowOrder; target_defined_modules = true) -end +run_qa( + StochasticDiffEqLowOrder; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/StochasticDiffEqMilstein/test/qa/Project.toml b/lib/StochasticDiffEqMilstein/test/qa/Project.toml index f242dc2dc15..07c1b635e47 100644 --- a/lib/StochasticDiffEqMilstein/test/qa/Project.toml +++ b/lib/StochasticDiffEqMilstein/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" StochasticDiffEqLevyArea = "90dbc90e-856a-4131-af2c-e8c5aa0f35b5" StochasticDiffEqMilstein = "8c95a807-c8e7-4581-8419-890d001af53e" @@ -28,6 +29,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" +SciMLTesting = "1.6" StochasticDiffEqCore = "2" StochasticDiffEqLevyArea = "2" StochasticDiffEqMilstein = "2" diff --git a/lib/StochasticDiffEqMilstein/test/qa/qa.jl b/lib/StochasticDiffEqMilstein/test/qa/qa.jl index 15bcaf8ebbd..5cce5c4868c 100644 --- a/lib/StochasticDiffEqMilstein/test/qa/qa.jl +++ b/lib/StochasticDiffEqMilstein/test/qa/qa.jl @@ -1,12 +1,9 @@ -using StochasticDiffEqMilstein -using Aqua +using SciMLTesting, StochasticDiffEqMilstein, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(StochasticDiffEqMilstein) -end - -@testset "JET" begin - JET.test_package(StochasticDiffEqMilstein; target_defined_modules = true) -end +run_qa( + StochasticDiffEqMilstein; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/StochasticDiffEqROCK/test/qa/Project.toml b/lib/StochasticDiffEqROCK/test/qa/Project.toml index 719e43299d9..1a29cc9b78a 100644 --- a/lib/StochasticDiffEqROCK/test/qa/Project.toml +++ b/lib/StochasticDiffEqROCK/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" StochasticDiffEqROCK = "db241ea8-0e6b-4abc-8f2d-1adff2294fd9" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -24,6 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" +SciMLTesting = "1.6" StochasticDiffEqCore = "2" StochasticDiffEqROCK = "2" Test = "1" diff --git a/lib/StochasticDiffEqROCK/test/qa/qa.jl b/lib/StochasticDiffEqROCK/test/qa/qa.jl index ba5ac3109cf..ddebf0c783f 100644 --- a/lib/StochasticDiffEqROCK/test/qa/qa.jl +++ b/lib/StochasticDiffEqROCK/test/qa/qa.jl @@ -1,12 +1,9 @@ -using StochasticDiffEqROCK -using Aqua +using SciMLTesting, StochasticDiffEqROCK, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(StochasticDiffEqROCK) -end - -@testset "JET" begin - JET.test_package(StochasticDiffEqROCK; target_defined_modules = true) -end +run_qa( + StochasticDiffEqROCK; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/StochasticDiffEqRODE/test/qa/Project.toml b/lib/StochasticDiffEqRODE/test/qa/Project.toml index 233f49c63df..42dda000e44 100644 --- a/lib/StochasticDiffEqRODE/test/qa/Project.toml +++ b/lib/StochasticDiffEqRODE/test/qa/Project.toml @@ -3,6 +3,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" StochasticDiffEqRODE = "49714585-0aa1-4f53-b1e6-a9b8c0d5e03f" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -24,6 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" +SciMLTesting = "1.6" StochasticDiffEqCore = "2" StochasticDiffEqRODE = "2" Test = "1" diff --git a/lib/StochasticDiffEqRODE/test/qa/qa.jl b/lib/StochasticDiffEqRODE/test/qa/qa.jl index 2dd9a18f6fa..8f820768b49 100644 --- a/lib/StochasticDiffEqRODE/test/qa/qa.jl +++ b/lib/StochasticDiffEqRODE/test/qa/qa.jl @@ -1,12 +1,9 @@ -using StochasticDiffEqRODE -using Aqua +using SciMLTesting, StochasticDiffEqRODE, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(StochasticDiffEqRODE) -end - -@testset "JET" begin - JET.test_package(StochasticDiffEqRODE; target_defined_modules = true) -end +run_qa( + StochasticDiffEqRODE; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/lib/StochasticDiffEqWeak/test/qa/Project.toml b/lib/StochasticDiffEqWeak/test/qa/Project.toml index e3a0dbe09e5..4c47b3a0123 100644 --- a/lib/StochasticDiffEqWeak/test/qa/Project.toml +++ b/lib/StochasticDiffEqWeak/test/qa/Project.toml @@ -4,6 +4,7 @@ DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqNonlinearSolve = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" StochasticDiffEqWeak = "af2a2fcd-1c36-4cbe-a6d0-5afda784a085" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -29,6 +30,7 @@ DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqNonlinearSolve = "2" +SciMLTesting = "1.6" StochasticDiffEqCore = "2" StochasticDiffEqWeak = "2" Test = "1" diff --git a/lib/StochasticDiffEqWeak/test/qa/qa.jl b/lib/StochasticDiffEqWeak/test/qa/qa.jl index a13d55997dd..0c222062d63 100644 --- a/lib/StochasticDiffEqWeak/test/qa/qa.jl +++ b/lib/StochasticDiffEqWeak/test/qa/qa.jl @@ -1,12 +1,9 @@ -using StochasticDiffEqWeak -using Aqua +using SciMLTesting, StochasticDiffEqWeak, Test using JET -using Test -@testset "Aqua" begin - Aqua.test_all(StochasticDiffEqWeak) -end - -@testset "JET" begin - JET.test_package(StochasticDiffEqWeak; target_defined_modules = true) -end +run_qa( + StochasticDiffEqWeak; + jet_kwargs = (; target_defined_modules = true), + explicit_imports = true, + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 +) diff --git a/test/qa/qa_tests.jl b/test/qa/qa_tests.jl index 055a8e6a1a9..ee33c82f108 100644 --- a/test/qa/qa_tests.jl +++ b/test/qa/qa_tests.jl @@ -1,12 +1,18 @@ -using ExplicitImports, OrdinaryDiffEq, SciMLBase +using SciMLTesting, OrdinaryDiffEq, SciMLBase using Test -@testset "ExplicitImports" begin - @test check_no_implicit_imports( - OrdinaryDiffEq; skip = (Base, Core, SciMLBase) - ) === nothing - - @test check_no_stale_explicit_imports(OrdinaryDiffEq) === nothing - - @test check_all_qualified_accesses_via_owners(OrdinaryDiffEq) === nothing -end +# The umbrella package's QA lane historically ran only the ExplicitImports checks +# (no Aqua/JET), so keep `aqua = false` to preserve that scope. +run_qa( + OrdinaryDiffEq; + aqua = false, + explicit_imports = true, + ei_kwargs = (; + no_implicit_imports = (; skip = (Base, Core, SciMLBase)), + # init/solve/solve!/step! (CommonSolve) and successful_retcode (SciMLBase) + # are not declared public by their owners; OrdinaryDiffEq re-exports them. + all_explicit_imports_are_public = (; + ignore = (:init, :solve, :solve!, :step!, :successful_retcode), + ), + ), +) From 3dbc8c47d9edd038dd95c9c777d89a3cc8e77835 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Fri, 26 Jun 2026 16:19:21 -0400 Subject: [PATCH 002/108] QA: drop now-redundant umbrella public-API EI ignore-list SciMLTesting 1.7.0 runs the two public-API ExplicitImports checks (check_all_qualified_accesses_are_public, check_all_explicit_imports_are_public) only on Julia >= 1.11, and the base-lib make-public releases (CommonSolve 0.2.9 made init/solve/solve!/ step! public; SciMLBase 3.24.0 made successful_retcode public) now declare the umbrella's re-exported entrypoints public. With both, the umbrella OrdinaryDiffEq passes all_explicit_imports_are_public with an empty ignore-list, so the per-name ignore list is dead weight. Verified against the registered releases (no dev) on Julia 1.12: the umbrella passes both public-API checks. On 1.10 the public-API checks are skipped by SciMLTesting 1.7, so the emptied list is inert there. The per-sublib ei_broken public-API markers are NOT redundant and are left untouched: every OrdinaryDiffEq/StochasticDiffEq sublib still imports non-public internals from OrdinaryDiffEqCore / sibling sublibs / DiffEqBase / SciMLBase / NonlinearSolveBase (verified: all 45 sublib QA envs still fail the public-API check(s) they mark broken on 1.12 against registered releases), tracked under #3776. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- test/qa/qa_tests.jl | 5 ----- 1 file changed, 5 deletions(-) diff --git a/test/qa/qa_tests.jl b/test/qa/qa_tests.jl index ee33c82f108..f0b726a854f 100644 --- a/test/qa/qa_tests.jl +++ b/test/qa/qa_tests.jl @@ -9,10 +9,5 @@ run_qa( explicit_imports = true, ei_kwargs = (; no_implicit_imports = (; skip = (Base, Core, SciMLBase)), - # init/solve/solve!/step! (CommonSolve) and successful_retcode (SciMLBase) - # are not declared public by their owners; OrdinaryDiffEq re-exports them. - all_explicit_imports_are_public = (; - ignore = (:init, :solve, :solve!, :step!, :successful_retcode), - ), ), ) From 7b07cdfd820dc3a4126d2fb078d21c205f65bf9b Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Sat, 27 Jun 2026 01:17:10 -0400 Subject: [PATCH 003/108] QA: finish public-API EI cleanup for released SciMLBase 3.27 / DiffEqBase make-public MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that SciMLBase 3.27.0 and the lib/DiffEqBase make-public work (#3785) are in place, complete the ExplicitImports public-API cleanup on top of the run_qa conversion: - Caller migration: rewrite `DiffEqBase.X` -> `SciMLBase.X` for the SciMLBase-owned, now-public names accessed qualified in sublibrary source: * `AbstractSDEProblem` across the StochasticDiffEq* solver sublibs (alg_utils/solve), * `build_solution` in DiffEqDevTools (add `import SciMLBase`), * `isinplace` in DelayDiffEq. `AbstractRODEProblem` is NOT public in SciMLBase 3.27, so it correctly stays `DiffEqBase.AbstractRODEProblem`. - Declare DiffEqBase-owned `ImplicitRKTableau` public (sibling of the already-public `ExplicitRKTableau` from #3785; documented API used downstream via `DiffEqBase.ImplicitRKTableau`). - Reconcile every sublibrary `ei_broken` against the actual ExplicitImports result on Julia 1.12 with the released versions (0 unexpected passes, 0 hard failures): * OrdinaryDiffEqExplicitTableaus / OrdinaryDiffEqImplicitTableaus now pass all six checks (drop `ei_broken` entirely), * StochasticDiffEqRODE / StochasticDiffEqIIF: `all_qualified_accesses_are_public` now passes after the AbstractSDEProblem migration (drop it), * StochasticDiffEqHighOrder/LowOrder/Milstein/ROCK/Weak: `all_qualified_accesses_via_owners` now passes after the migration (drop it). The remaining `ei_broken` entries are genuine not-yet-public OrdinaryDiffEqCore / StochasticDiffEqCore / DiffEqBase-internal survivors (e.g. `@cache`, `perform_step!`, `is_diagonal_noise`), tracked in #3776 — left as known-broken, not silenced. - Bump `SciMLTesting` compat `"1.6"` -> `"1.7"` in every QA env + root + DelayDiffEq: 1.7 gates the two public-API checks to Julia >= 1.11 so the LTS lane skips them. Verified locally against the registered releases: root QA 6/6 on 1.12; DelayDiffEq 14 pass / 3 broken / 0 fail on 1.12; Tableaus 16/16 on 1.10; all sublibrary ei_broken sets match the live ExplicitImports result on 1.12. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- Project.toml | 2 +- lib/DelayDiffEq/Project.toml | 2 +- lib/DelayDiffEq/src/solve.jl | 2 +- lib/DiffEqBase/src/DiffEqBase.jl | 2 +- lib/DiffEqDevTools/src/DiffEqDevTools.jl | 1 + lib/DiffEqDevTools/src/test_solution.jl | 4 +- lib/DiffEqDevTools/test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqBDF/test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqCore/test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/qa.jl | 1 - .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqFIRK/test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqFeagin/test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/qa.jl | 1 - lib/OrdinaryDiffEqLinear/test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqPDIRK/test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqPRK/test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqQPRK/test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqRKN/test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqSDIRK/test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqTsit5/test/qa/Project.toml | 2 +- lib/OrdinaryDiffEqVerner/test/qa/Project.toml | 12 ++--- lib/StochasticDiffEq/src/default_sde_alg.jl | 6 +-- lib/StochasticDiffEqCore/src/alg_utils.jl | 4 +- lib/StochasticDiffEqCore/src/solve.jl | 4 +- lib/StochasticDiffEqCore/test/qa/Project.toml | 2 +- .../src/alg_utils.jl | 22 ++++----- .../test/qa/Project.toml | 2 +- lib/StochasticDiffEqHighOrder/test/qa/qa.jl | 2 +- lib/StochasticDiffEqIIF/src/alg_utils.jl | 6 +-- lib/StochasticDiffEqIIF/test/qa/Project.toml | 2 +- lib/StochasticDiffEqIIF/test/qa/qa.jl | 2 +- lib/StochasticDiffEqImplicit/src/alg_utils.jl | 12 ++--- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- .../test/qa/Project.toml | 2 +- lib/StochasticDiffEqLowOrder/src/alg_utils.jl | 18 ++++---- .../test/qa/Project.toml | 2 +- lib/StochasticDiffEqLowOrder/test/qa/qa.jl | 2 +- lib/StochasticDiffEqMilstein/src/alg_utils.jl | 14 +++--- .../test/qa/Project.toml | 2 +- lib/StochasticDiffEqMilstein/test/qa/qa.jl | 2 +- lib/StochasticDiffEqROCK/src/alg_utils.jl | 14 +++--- lib/StochasticDiffEqROCK/test/qa/Project.toml | 2 +- lib/StochasticDiffEqROCK/test/qa/qa.jl | 2 +- lib/StochasticDiffEqRODE/src/alg_utils.jl | 2 +- lib/StochasticDiffEqRODE/test/qa/Project.toml | 2 +- lib/StochasticDiffEqRODE/test/qa/qa.jl | 2 +- lib/StochasticDiffEqWeak/src/alg_utils.jl | 46 +++++++++---------- lib/StochasticDiffEqWeak/test/qa/Project.toml | 2 +- lib/StochasticDiffEqWeak/test/qa/qa.jl | 2 +- 73 files changed, 139 insertions(+), 142 deletions(-) diff --git a/Project.toml b/Project.toml index 2ee3021cb04..cca78d2fcb5 100644 --- a/Project.toml +++ b/Project.toml @@ -65,7 +65,7 @@ OrdinaryDiffEqVerner = "2" RecursiveArrayTools = "4.2.0" SciMLBase = "3" SciMLLogging = "2.0.0" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" [extras] diff --git a/lib/DelayDiffEq/Project.toml b/lib/DelayDiffEq/Project.toml index 790a0a9b674..9724383a810 100644 --- a/lib/DelayDiffEq/Project.toml +++ b/lib/DelayDiffEq/Project.toml @@ -92,7 +92,7 @@ RecursiveArrayTools = "4.2.0" Reexport = "1.2.2" SafeTestsets = "0.1.0" SciMLBase = "3.10.0" -SciMLTesting = "1.6" +SciMLTesting = "1.7" SparseArrays = "<0.0.1, 1, 2" StochasticDiffEqCore = "2" StochasticDiffEqHighOrder = "2" diff --git a/lib/DelayDiffEq/src/solve.jl b/lib/DelayDiffEq/src/solve.jl index 03d8b72a4bb..c6fbe370eae 100644 --- a/lib/DelayDiffEq/src/solve.jl +++ b/lib/DelayDiffEq/src/solve.jl @@ -682,7 +682,7 @@ struct DDEDefaultInit <: SciMLBase.DAEInitializationAlgorithm end function SciMLBase.initialize_dae!(integrator::DDEIntegrator, initializealg = integrator.initializealg) return OrdinaryDiffEqCore._initialize_dae!( integrator, integrator.sol.prob, initializealg, - Val(DiffEqBase.isinplace(integrator.sol.prob)) + Val(SciMLBase.isinplace(integrator.sol.prob)) ) end diff --git a/lib/DiffEqBase/src/DiffEqBase.jl b/lib/DiffEqBase/src/DiffEqBase.jl index 86dfb0d792c..d4d96804055 100644 --- a/lib/DiffEqBase/src/DiffEqBase.jl +++ b/lib/DiffEqBase/src/DiffEqBase.jl @@ -188,7 +188,7 @@ export SensitivityADPassThrough Expr( :public, :get_tstops, :get_tstops_array, :get_tstops_max, - :ExplicitRKTableau, :DECostFunction, :merge_problem_kwargs, + :ExplicitRKTableau, :ImplicitRKTableau, :DECostFunction, :merge_problem_kwargs, # Callback API (DiffEqBase-owned shared functionality used by downstream solvers) :apply_callback!, :apply_discrete_callback!, :CallbackCache, :find_first_continuous_callback, :find_callback_time, diff --git a/lib/DiffEqDevTools/src/DiffEqDevTools.jl b/lib/DiffEqDevTools/src/DiffEqDevTools.jl index 17038d955d6..551e0d79ca1 100644 --- a/lib/DiffEqDevTools/src/DiffEqDevTools.jl +++ b/lib/DiffEqDevTools/src/DiffEqDevTools.jl @@ -2,6 +2,7 @@ module DiffEqDevTools using DiffEqBase: AbstractODEAlgorithm using DiffEqBase, RecipesBase, RecursiveArrayTools, DiffEqNoiseProcess, StructArrays +import SciMLBase using SimpleNonlinearSolve, LinearAlgebra, RootedTrees using LinearAlgebra, Distributed diff --git a/lib/DiffEqDevTools/src/test_solution.jl b/lib/DiffEqDevTools/src/test_solution.jl index d1e4f9cccb3..42a805bdee1 100644 --- a/lib/DiffEqDevTools/src/test_solution.jl +++ b/lib/DiffEqDevTools/src/test_solution.jl @@ -105,7 +105,7 @@ function appxtrue(sol::AbstractODESolution, sol2::TestSolution) ) end end - return DiffEqBase.build_solution(sol, timeseries_analytic, errors) + return SciMLBase.build_solution(sol, timeseries_analytic, errors) end """ @@ -168,7 +168,7 @@ function appxtrue( ) end end - return DiffEqBase.build_solution(sol, timeseries_analytic, errors) + return SciMLBase.build_solution(sol, timeseries_analytic, errors) end function appxtrue(sim::EnsembleSolution, appx_setup; kwargs...) diff --git a/lib/DiffEqDevTools/test/qa/Project.toml b/lib/DiffEqDevTools/test/qa/Project.toml index aebeaf19e67..956e3a97f66 100644 --- a/lib/DiffEqDevTools/test/qa/Project.toml +++ b/lib/DiffEqDevTools/test/qa/Project.toml @@ -10,5 +10,5 @@ path = "../.." [compat] Aqua = "0.8.11" DiffEqDevTools = "3" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" diff --git a/lib/ImplicitDiscreteSolve/test/qa/Project.toml b/lib/ImplicitDiscreteSolve/test/qa/Project.toml index c3ec6f8bbc5..418b8536c71 100644 --- a/lib/ImplicitDiscreteSolve/test/qa/Project.toml +++ b/lib/ImplicitDiscreteSolve/test/qa/Project.toml @@ -17,5 +17,5 @@ Aqua = "0.8.11" ImplicitDiscreteSolve = "2" JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" diff --git a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/Project.toml b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/Project.toml index 9bd1fecc9b7..177fc10bcd4 100644 --- a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqAdamsBashforthMoulton = "2" OrdinaryDiffEqCore = "4" diff --git a/lib/OrdinaryDiffEqBDF/test/qa/Project.toml b/lib/OrdinaryDiffEqBDF/test/qa/Project.toml index 95017b9df62..e89a6e76600 100644 --- a/lib/OrdinaryDiffEqBDF/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqBDF/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqBDF = "2" OrdinaryDiffEqCore = "4" diff --git a/lib/OrdinaryDiffEqCore/test/qa/Project.toml b/lib/OrdinaryDiffEqCore/test/qa/Project.toml index da1d1be5c0b..beec6f9c9e6 100644 --- a/lib/OrdinaryDiffEqCore/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqCore/test/qa/Project.toml @@ -17,5 +17,5 @@ Aqua = "0.8.11" DiffEqBase = "7" JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" diff --git a/lib/OrdinaryDiffEqDefault/test/qa/Project.toml b/lib/OrdinaryDiffEqDefault/test/qa/Project.toml index 5de6643f1b1..ef03a9cce22 100644 --- a/lib/OrdinaryDiffEqDefault/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqDefault/test/qa/Project.toml @@ -17,5 +17,5 @@ Aqua = "0.8.11" JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqDefault = "2" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" diff --git a/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml b/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml index f06cb4e40fc..63d8b9c3328 100644 --- a/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml @@ -17,5 +17,5 @@ Aqua = "0.8.11" JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqDifferentiation = "3" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" diff --git a/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml b/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml index ac62a707a4c..45d610e28ef 100644 --- a/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqExplicitRK = "2" diff --git a/lib/OrdinaryDiffEqExplicitTableaus/test/qa/Project.toml b/lib/OrdinaryDiffEqExplicitTableaus/test/qa/Project.toml index 74ad66998cc..d9c87ad9373 100644 --- a/lib/OrdinaryDiffEqExplicitTableaus/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqExplicitTableaus/test/qa/Project.toml @@ -17,6 +17,6 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqExplicitTableaus = "2" -SciMLTesting = "1.6" +SciMLTesting = "1.7" Test = "1" julia = "1.10" diff --git a/lib/OrdinaryDiffEqExplicitTableaus/test/qa/qa.jl b/lib/OrdinaryDiffEqExplicitTableaus/test/qa/qa.jl index bc739b4f74a..0b7933835ba 100644 --- a/lib/OrdinaryDiffEqExplicitTableaus/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExplicitTableaus/test/qa/qa.jl @@ -5,5 +5,4 @@ run_qa( OrdinaryDiffEqExplicitTableaus; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:all_qualified_accesses_are_public,), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 ) diff --git a/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml b/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml index fd6dd0a03d4..fdde9ed9932 100644 --- a/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqExponentialRK = "2" diff --git a/lib/OrdinaryDiffEqExtrapolation/test/qa/Project.toml b/lib/OrdinaryDiffEqExtrapolation/test/qa/Project.toml index f430ccddac4..4cc1c7c5546 100644 --- a/lib/OrdinaryDiffEqExtrapolation/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqExtrapolation/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqExtrapolation = "2" diff --git a/lib/OrdinaryDiffEqFIRK/test/qa/Project.toml b/lib/OrdinaryDiffEqFIRK/test/qa/Project.toml index db39f5a990d..751a7063442 100644 --- a/lib/OrdinaryDiffEqFIRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqFIRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../../OrdinaryDiffEqCore" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqFIRK = "2" diff --git a/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml b/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml index 50528bce6b7..a84e3092b0c 100644 --- a/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqFeagin = "2" diff --git a/lib/OrdinaryDiffEqFunctionMap/test/qa/Project.toml b/lib/OrdinaryDiffEqFunctionMap/test/qa/Project.toml index 2d6e5bd2aa1..8f15ba89e18 100644 --- a/lib/OrdinaryDiffEqFunctionMap/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqFunctionMap/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqFunctionMap = "2" diff --git a/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml b/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml index c77f8d90bc3..bd9ba59346c 100644 --- a/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqHighOrderRK = "2" diff --git a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml index 1c342b35835..f24526a853a 100644 --- a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqIMEXMultistep = "2" diff --git a/lib/OrdinaryDiffEqImplicitTableaus/test/qa/Project.toml b/lib/OrdinaryDiffEqImplicitTableaus/test/qa/Project.toml index 7f024b7d47e..e1313ac9b97 100644 --- a/lib/OrdinaryDiffEqImplicitTableaus/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqImplicitTableaus/test/qa/Project.toml @@ -17,6 +17,6 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqImplicitTableaus = "2" -SciMLTesting = "1.6" +SciMLTesting = "1.7" Test = "1" julia = "1.10" diff --git a/lib/OrdinaryDiffEqImplicitTableaus/test/qa/qa.jl b/lib/OrdinaryDiffEqImplicitTableaus/test/qa/qa.jl index 56065ee5308..2b0e61c8ee8 100644 --- a/lib/OrdinaryDiffEqImplicitTableaus/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqImplicitTableaus/test/qa/qa.jl @@ -5,5 +5,4 @@ run_qa( OrdinaryDiffEqImplicitTableaus; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:all_qualified_accesses_are_public,), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 ) diff --git a/lib/OrdinaryDiffEqLinear/test/qa/Project.toml b/lib/OrdinaryDiffEqLinear/test/qa/Project.toml index 64e6ff030d1..39582102a95 100644 --- a/lib/OrdinaryDiffEqLinear/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqLinear/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqLinear = "2" diff --git a/lib/OrdinaryDiffEqLowOrderRK/test/qa/Project.toml b/lib/OrdinaryDiffEqLowOrderRK/test/qa/Project.toml index 8fe0f5d9eb5..f93678b0c8a 100644 --- a/lib/OrdinaryDiffEqLowOrderRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqLowOrderRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqLowOrderRK = "2" diff --git a/lib/OrdinaryDiffEqLowStorageRK/test/qa/Project.toml b/lib/OrdinaryDiffEqLowStorageRK/test/qa/Project.toml index 5829043e0df..383aa417289 100644 --- a/lib/OrdinaryDiffEqLowStorageRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqLowStorageRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqLowStorageRK = "3" diff --git a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/Project.toml b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/Project.toml index 14d40102004..45d6b71e87d 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/Project.toml @@ -30,5 +30,5 @@ OrdinaryDiffEqBDF = "2" OrdinaryDiffEqCore = "4" OrdinaryDiffEqNonlinearSolve = "2" OrdinaryDiffEqRosenbrock = "2" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" diff --git a/lib/OrdinaryDiffEqNordsieck/test/qa/Project.toml b/lib/OrdinaryDiffEqNordsieck/test/qa/Project.toml index 6fe3ae5df3f..ebd006275e8 100644 --- a/lib/OrdinaryDiffEqNordsieck/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqNordsieck/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqNordsieck = "2" diff --git a/lib/OrdinaryDiffEqPDIRK/test/qa/Project.toml b/lib/OrdinaryDiffEqPDIRK/test/qa/Project.toml index a4ca5838623..4e7f797566a 100644 --- a/lib/OrdinaryDiffEqPDIRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqPDIRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqPDIRK = "2" diff --git a/lib/OrdinaryDiffEqPRK/test/qa/Project.toml b/lib/OrdinaryDiffEqPRK/test/qa/Project.toml index 7d6bb935de0..08e02d7332c 100644 --- a/lib/OrdinaryDiffEqPRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqPRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqPRK = "2" diff --git a/lib/OrdinaryDiffEqQPRK/test/qa/Project.toml b/lib/OrdinaryDiffEqQPRK/test/qa/Project.toml index 975ae3c4919..5ce32b38bef 100644 --- a/lib/OrdinaryDiffEqQPRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqQPRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqQPRK = "2" diff --git a/lib/OrdinaryDiffEqRKN/test/qa/Project.toml b/lib/OrdinaryDiffEqRKN/test/qa/Project.toml index 2650db7cd48..420e1b60e20 100644 --- a/lib/OrdinaryDiffEqRKN/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqRKN/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqRKN = "2" diff --git a/lib/OrdinaryDiffEqRosenbrock/test/qa/Project.toml b/lib/OrdinaryDiffEqRosenbrock/test/qa/Project.toml index 217ffab1a1c..0f9c800a15c 100644 --- a/lib/OrdinaryDiffEqRosenbrock/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqRosenbrock/test/qa/Project.toml @@ -21,5 +21,5 @@ JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqRosenbrock = "2" SciMLBase = "3" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" diff --git a/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/Project.toml b/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/Project.toml index 17ef062fbaa..91145d9787a 100644 --- a/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqRosenbrockTableaus/test/qa/Project.toml @@ -12,6 +12,6 @@ path = "../.." Aqua = "0.8" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqRosenbrockTableaus = "2" -SciMLTesting = "1.6" +SciMLTesting = "1.7" Test = "1" julia = "1.10" diff --git a/lib/OrdinaryDiffEqSDIRK/test/qa/Project.toml b/lib/OrdinaryDiffEqSDIRK/test/qa/Project.toml index 044c5d5597f..5d39d039d92 100644 --- a/lib/OrdinaryDiffEqSDIRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqSDIRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqSDIRK = "2" diff --git a/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml b/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml index 5aad444d308..62450e6c9b3 100644 --- a/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqSSPRK = "2" diff --git a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/Project.toml b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/Project.toml index 040ef7ad09d..17cd0ecd12a 100644 --- a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqStabilizedIRK = "2" diff --git a/lib/OrdinaryDiffEqStabilizedRK/test/qa/Project.toml b/lib/OrdinaryDiffEqStabilizedRK/test/qa/Project.toml index 3734ca4df8d..6b2b50712f9 100644 --- a/lib/OrdinaryDiffEqStabilizedRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqStabilizedRK/test/qa/Project.toml @@ -19,5 +19,5 @@ JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqStabilizedRK = "2" SciMLBase = "3" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" diff --git a/lib/OrdinaryDiffEqSymplecticRK/test/qa/Project.toml b/lib/OrdinaryDiffEqSymplecticRK/test/qa/Project.toml index a48af55ace0..97b5055ae44 100644 --- a/lib/OrdinaryDiffEqSymplecticRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqSymplecticRK/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqSymplecticRK = "2" diff --git a/lib/OrdinaryDiffEqTaylorSeries/test/qa/Project.toml b/lib/OrdinaryDiffEqTaylorSeries/test/qa/Project.toml index c08fa7d5357..a25359aba85 100644 --- a/lib/OrdinaryDiffEqTaylorSeries/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqTaylorSeries/test/qa/Project.toml @@ -18,7 +18,7 @@ path = "../../" AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqTaylorSeries = "2" diff --git a/lib/OrdinaryDiffEqTsit5/test/qa/Project.toml b/lib/OrdinaryDiffEqTsit5/test/qa/Project.toml index 2e316b340ce..5f403b412ca 100644 --- a/lib/OrdinaryDiffEqTsit5/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqTsit5/test/qa/Project.toml @@ -19,5 +19,5 @@ JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqTsit5 = "2" SciMLBase = "3" -SciMLTesting = "1.6" +SciMLTesting = "1.7" julia = "1.10" diff --git a/lib/OrdinaryDiffEqVerner/test/qa/Project.toml b/lib/OrdinaryDiffEqVerner/test/qa/Project.toml index 790294ae6c3..84315c36b3e 100644 --- a/lib/OrdinaryDiffEqVerner/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqVerner/test/qa/Project.toml @@ -8,18 +8,16 @@ SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -[sources.OrdinaryDiffEqCore] -path = "../../../OrdinaryDiffEqCore" - -[sources.OrdinaryDiffEqVerner] -path = "../../" +[sources] +OrdinaryDiffEqCore = {path = "../../../OrdinaryDiffEqCore"} +OrdinaryDiffEqVerner = {path = "../.."} [compat] AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.6" -julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqVerner = "2" SciMLBase = "3" +SciMLTesting = "1.7" +julia = "1.10" diff --git a/lib/StochasticDiffEq/src/default_sde_alg.jl b/lib/StochasticDiffEq/src/default_sde_alg.jl index 38ff75c777d..d6e8ec06089 100644 --- a/lib/StochasticDiffEq/src/default_sde_alg.jl +++ b/lib/StochasticDiffEq/src/default_sde_alg.jl @@ -10,7 +10,7 @@ function get_alg_hints(o) end function default_algorithm( - prob::DiffEqBase.AbstractSDEProblem{uType, tType, isinplace, ND}; + prob::SciMLBase.AbstractSDEProblem{uType, tType, isinplace, ND}; kwargs... ) where {uType, tType, isinplace, ND} o = Dict{Symbol, Any}(kwargs) @@ -70,7 +70,7 @@ SciMLBase.supports_solve_rng(::SciMLBase.AbstractSDEProblem, ::Nothing) = true # Dispatch for __init with Nothing algorithm - use default function DiffEqBase.__init( - prob::DiffEqBase.AbstractSDEProblem, ::Nothing, args...; kwargs... + prob::SciMLBase.AbstractSDEProblem, ::Nothing, args...; kwargs... ) alg = default_algorithm(prob; kwargs...) return DiffEqBase.__init(prob, alg, args...; kwargs...) @@ -78,7 +78,7 @@ end # Dispatch for __solve with Nothing algorithm - use default function DiffEqBase.__solve( - prob::DiffEqBase.AbstractSDEProblem, ::Nothing, args...; kwargs... + prob::SciMLBase.AbstractSDEProblem, ::Nothing, args...; kwargs... ) alg = default_algorithm(prob; kwargs...) return DiffEqBase.__solve(prob, alg, args...; kwargs...) diff --git a/lib/StochasticDiffEqCore/src/alg_utils.jl b/lib/StochasticDiffEqCore/src/alg_utils.jl index bc81f9defbb..e0d9b9164a2 100644 --- a/lib/StochasticDiffEqCore/src/alg_utils.jl +++ b/lib/StochasticDiffEqCore/src/alg_utils.jl @@ -198,7 +198,7 @@ end alg_compatible(prob, alg::StochasticDiffEqAlgorithm) = false function alg_compatible( - prob::DiffEqBase.AbstractSDEProblem, + prob::SciMLBase.AbstractSDEProblem, alg::Union{ StochasticDiffEqCompositeAlgorithm, StochasticDiffEqRODECompositeAlgorithm, } @@ -214,7 +214,7 @@ supports_regular_jumps(alg) = false function alg_compatible(prob::JumpProblem, alg::StochasticDiffEqAlgorithm) return alg_compatible(prob.prob, alg) && (supports_regular_jumps(alg) || prob.regular_jump === nothing) && - prob.prob isa DiffEqBase.AbstractSDEProblem + prob.prob isa SciMLBase.AbstractSDEProblem end function alg_compatible( diff --git a/lib/StochasticDiffEqCore/src/solve.jl b/lib/StochasticDiffEqCore/src/solve.jl index 1505e44ef52..8647307aa57 100644 --- a/lib/StochasticDiffEqCore/src/solve.jl +++ b/lib/StochasticDiffEqCore/src/solve.jl @@ -327,7 +327,7 @@ function _sde_init( elseif is_diagonal_noise(prob) noise_rate_prototype = rate_prototype elseif prob isa DiffEqBase.AbstractRODEProblem - if prob isa DiffEqBase.AbstractSDEProblem + if prob isa SciMLBase.AbstractSDEProblem noise_rate_prototype = copy(prob.noise_rate_prototype) else noise_rate_prototype = copy(prob.rand_prototype) @@ -352,7 +352,7 @@ function _sde_init( else rand_prototype = (u .- u) ./ sqrt(oneunit(t)) end - elseif prob isa DiffEqBase.AbstractSDEProblem + elseif prob isa SciMLBase.AbstractSDEProblem if issparse(u) rand_prototype = adapt( DiffEqBase.parameterless_type(u), zeros(randElType, size(noise_rate_prototype, 2)) diff --git a/lib/StochasticDiffEqCore/test/qa/Project.toml b/lib/StochasticDiffEqCore/test/qa/Project.toml index 022df6fddeb..042d1a96741 100644 --- a/lib/StochasticDiffEqCore/test/qa/Project.toml +++ b/lib/StochasticDiffEqCore/test/qa/Project.toml @@ -25,7 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" -SciMLTesting = "1.6" +SciMLTesting = "1.7" StochasticDiffEqCore = "2" StochasticDiffEqLevyArea = "2" Test = "1" diff --git a/lib/StochasticDiffEqHighOrder/src/alg_utils.jl b/lib/StochasticDiffEqHighOrder/src/alg_utils.jl index 5ea9d071883..c5e3ada1790 100644 --- a/lib/StochasticDiffEqHighOrder/src/alg_utils.jl +++ b/lib/StochasticDiffEqHighOrder/src/alg_utils.jl @@ -15,17 +15,17 @@ alg_order(alg::SOSRA2) = 2 // 1 delta_default(alg::SRIW1) = 1 // 6 ## alg_compatible -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SRI) = is_diagonal_noise(prob) -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SRIW1) = is_diagonal_noise(prob) -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SRIW2) = is_diagonal_noise(prob) -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SOSRI) = is_diagonal_noise(prob) -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SOSRI2) = is_diagonal_noise(prob) -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SRA) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SRA1) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SRA2) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SRA3) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SOSRA) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SOSRA2) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SRI) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SRIW1) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SRIW2) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SOSRI) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SOSRI2) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SRA) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SRA1) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SRA2) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SRA3) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SOSRA) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SOSRA2) = true ## alg_needs_extra_process alg_needs_extra_process(alg::SRI) = true diff --git a/lib/StochasticDiffEqHighOrder/test/qa/Project.toml b/lib/StochasticDiffEqHighOrder/test/qa/Project.toml index 5cf0c243325..2e83c8192b9 100644 --- a/lib/StochasticDiffEqHighOrder/test/qa/Project.toml +++ b/lib/StochasticDiffEqHighOrder/test/qa/Project.toml @@ -25,7 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" -SciMLTesting = "1.6" +SciMLTesting = "1.7" StochasticDiffEqCore = "2" StochasticDiffEqHighOrder = "2" Test = "1" diff --git a/lib/StochasticDiffEqHighOrder/test/qa/qa.jl b/lib/StochasticDiffEqHighOrder/test/qa/qa.jl index 53077c70744..e72ae93263e 100644 --- a/lib/StochasticDiffEqHighOrder/test/qa/qa.jl +++ b/lib/StochasticDiffEqHighOrder/test/qa/qa.jl @@ -5,5 +5,5 @@ run_qa( StochasticDiffEqHighOrder; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 ) diff --git a/lib/StochasticDiffEqIIF/src/alg_utils.jl b/lib/StochasticDiffEqIIF/src/alg_utils.jl index b8f5c99f368..031ba6a70c7 100644 --- a/lib/StochasticDiffEqIIF/src/alg_utils.jl +++ b/lib/StochasticDiffEqIIF/src/alg_utils.jl @@ -2,6 +2,6 @@ alg_order(alg::IIF1M) = 1 // 2 alg_order(alg::IIF2M) = 1 // 2 alg_order(alg::IIF1Mil) = 1 // 1 -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::IIF1M) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::IIF2M) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::IIF1Mil) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::IIF1M) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::IIF2M) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::IIF1Mil) = true diff --git a/lib/StochasticDiffEqIIF/test/qa/Project.toml b/lib/StochasticDiffEqIIF/test/qa/Project.toml index f88c5f5a2b4..5e10734a81b 100644 --- a/lib/StochasticDiffEqIIF/test/qa/Project.toml +++ b/lib/StochasticDiffEqIIF/test/qa/Project.toml @@ -25,7 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" -SciMLTesting = "1.6" +SciMLTesting = "1.7" StochasticDiffEqCore = "2" StochasticDiffEqIIF = "2" Test = "1" diff --git a/lib/StochasticDiffEqIIF/test/qa/qa.jl b/lib/StochasticDiffEqIIF/test/qa/qa.jl index 2d66e222feb..192271adc53 100644 --- a/lib/StochasticDiffEqIIF/test/qa/qa.jl +++ b/lib/StochasticDiffEqIIF/test/qa/qa.jl @@ -5,5 +5,5 @@ run_qa( StochasticDiffEqIIF; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 ) diff --git a/lib/StochasticDiffEqImplicit/src/alg_utils.jl b/lib/StochasticDiffEqImplicit/src/alg_utils.jl index 7e5f37d42db..13e4f668b20 100644 --- a/lib/StochasticDiffEqImplicit/src/alg_utils.jl +++ b/lib/StochasticDiffEqImplicit/src/alg_utils.jl @@ -14,12 +14,12 @@ default_controller(QT, alg::SKenCarp) = PIController(QT, alg) supports_regular_jumps(::ImplicitEM) = true isadaptive(prob::JumpProblem, alg::ImplicitEM) = false -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::ImplicitEM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::ImplicitEulerHeun) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::ISSEM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::ISSEulerHeun) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SKenCarp) = true -function alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::ImplicitRKMil) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::ImplicitEM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::ImplicitEulerHeun) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::ISSEM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::ISSEulerHeun) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SKenCarp) = true +function alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::ImplicitRKMil) return is_diagonal_noise(prob) end diff --git a/lib/StochasticDiffEqImplicit/test/qa/Project.toml b/lib/StochasticDiffEqImplicit/test/qa/Project.toml index 442990fb290..af8623bca60 100644 --- a/lib/StochasticDiffEqImplicit/test/qa/Project.toml +++ b/lib/StochasticDiffEqImplicit/test/qa/Project.toml @@ -35,7 +35,7 @@ JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqDifferentiation = "3" OrdinaryDiffEqNonlinearSolve = "2" -SciMLTesting = "1.6" +SciMLTesting = "1.7" StochasticDiffEqCore = "2" StochasticDiffEqImplicit = "2" Test = "1" diff --git a/lib/StochasticDiffEqLeaping/test/qa/Project.toml b/lib/StochasticDiffEqLeaping/test/qa/Project.toml index f67e3cef19d..4faf7d074b6 100644 --- a/lib/StochasticDiffEqLeaping/test/qa/Project.toml +++ b/lib/StochasticDiffEqLeaping/test/qa/Project.toml @@ -30,7 +30,7 @@ DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqNonlinearSolve = "2" -SciMLTesting = "1.6" +SciMLTesting = "1.7" StochasticDiffEqCore = "2" StochasticDiffEqLeaping = "2" Test = "1" diff --git a/lib/StochasticDiffEqLevyArea/test/qa/Project.toml b/lib/StochasticDiffEqLevyArea/test/qa/Project.toml index d1da7d1a7af..1e471bafa4e 100644 --- a/lib/StochasticDiffEqLevyArea/test/qa/Project.toml +++ b/lib/StochasticDiffEqLevyArea/test/qa/Project.toml @@ -11,7 +11,7 @@ path = "../.." [compat] Aqua = "0.8" JET = "0.9, 0.10, 0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" StochasticDiffEqLevyArea = "2" Test = "1" julia = "1.10" diff --git a/lib/StochasticDiffEqLowOrder/src/alg_utils.jl b/lib/StochasticDiffEqLowOrder/src/alg_utils.jl index 9e5f851e66c..2a3d4b45b70 100644 --- a/lib/StochasticDiffEqLowOrder/src/alg_utils.jl +++ b/lib/StochasticDiffEqLowOrder/src/alg_utils.jl @@ -20,15 +20,15 @@ end SciMLBase.alg_interpretation(alg::RKMilCommute) = alg.interpretation supports_regular_jumps(::EM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::EM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::LambaEM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::EulerHeun) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::LambaEulerHeun) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SplitEM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::PCEuler) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SimplifiedEM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RKMil) = is_diagonal_noise(prob) -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RKMilCommute) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::EM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::LambaEM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::EulerHeun) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::LambaEulerHeun) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SplitEM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::PCEuler) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SimplifiedEM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RKMil) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RKMilCommute) = true is_split_step(::EM{split}) where {split} = split is_split_step(::LambaEM{split}) where {split} = split diff --git a/lib/StochasticDiffEqLowOrder/test/qa/Project.toml b/lib/StochasticDiffEqLowOrder/test/qa/Project.toml index ab0bb6c1d6a..1ad73f0b371 100644 --- a/lib/StochasticDiffEqLowOrder/test/qa/Project.toml +++ b/lib/StochasticDiffEqLowOrder/test/qa/Project.toml @@ -25,7 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" -SciMLTesting = "1.6" +SciMLTesting = "1.7" StochasticDiffEqCore = "2" StochasticDiffEqLowOrder = "2" Test = "1" diff --git a/lib/StochasticDiffEqLowOrder/test/qa/qa.jl b/lib/StochasticDiffEqLowOrder/test/qa/qa.jl index 820e50c3ef0..10dea34594e 100644 --- a/lib/StochasticDiffEqLowOrder/test/qa/qa.jl +++ b/lib/StochasticDiffEqLowOrder/test/qa/qa.jl @@ -5,5 +5,5 @@ run_qa( StochasticDiffEqLowOrder; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 ) diff --git a/lib/StochasticDiffEqMilstein/src/alg_utils.jl b/lib/StochasticDiffEqMilstein/src/alg_utils.jl index e2ebd1c854f..15073916fe0 100644 --- a/lib/StochasticDiffEqMilstein/src/alg_utils.jl +++ b/lib/StochasticDiffEqMilstein/src/alg_utils.jl @@ -8,13 +8,13 @@ alg_order(alg::WangLi3SMil_F) = 1 // 1 SciMLBase.alg_interpretation(alg::RKMilGeneral) = alg.interpretation -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RKMilGeneral) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::WangLi3SMil_A) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::WangLi3SMil_B) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::WangLi3SMil_C) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::WangLi3SMil_D) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::WangLi3SMil_E) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::WangLi3SMil_F) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RKMilGeneral) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::WangLi3SMil_A) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::WangLi3SMil_B) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::WangLi3SMil_C) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::WangLi3SMil_D) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::WangLi3SMil_E) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::WangLi3SMil_F) = true alg_needs_extra_process(alg::RKMilGeneral) = true diff --git a/lib/StochasticDiffEqMilstein/test/qa/Project.toml b/lib/StochasticDiffEqMilstein/test/qa/Project.toml index 07c1b635e47..a7741685600 100644 --- a/lib/StochasticDiffEqMilstein/test/qa/Project.toml +++ b/lib/StochasticDiffEqMilstein/test/qa/Project.toml @@ -29,7 +29,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" -SciMLTesting = "1.6" +SciMLTesting = "1.7" StochasticDiffEqCore = "2" StochasticDiffEqLevyArea = "2" StochasticDiffEqMilstein = "2" diff --git a/lib/StochasticDiffEqMilstein/test/qa/qa.jl b/lib/StochasticDiffEqMilstein/test/qa/qa.jl index 5cce5c4868c..61cd986fb30 100644 --- a/lib/StochasticDiffEqMilstein/test/qa/qa.jl +++ b/lib/StochasticDiffEqMilstein/test/qa/qa.jl @@ -5,5 +5,5 @@ run_qa( StochasticDiffEqMilstein; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 ) diff --git a/lib/StochasticDiffEqROCK/src/alg_utils.jl b/lib/StochasticDiffEqROCK/src/alg_utils.jl index f3f6086917e..bcff33686ff 100644 --- a/lib/StochasticDiffEqROCK/src/alg_utils.jl +++ b/lib/StochasticDiffEqROCK/src/alg_utils.jl @@ -22,10 +22,10 @@ function SciMLBase.alg_interpretation( return interpretation end -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SROCK1) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SROCK2) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::KomBurSROCK2) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SROCKC2) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SROCKEM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SKSROCK) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::TangXiaoSROCK2) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SROCK1) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SROCK2) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::KomBurSROCK2) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SROCKC2) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SROCKEM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SKSROCK) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::TangXiaoSROCK2) = true diff --git a/lib/StochasticDiffEqROCK/test/qa/Project.toml b/lib/StochasticDiffEqROCK/test/qa/Project.toml index 1a29cc9b78a..41914fc495e 100644 --- a/lib/StochasticDiffEqROCK/test/qa/Project.toml +++ b/lib/StochasticDiffEqROCK/test/qa/Project.toml @@ -25,7 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" -SciMLTesting = "1.6" +SciMLTesting = "1.7" StochasticDiffEqCore = "2" StochasticDiffEqROCK = "2" Test = "1" diff --git a/lib/StochasticDiffEqROCK/test/qa/qa.jl b/lib/StochasticDiffEqROCK/test/qa/qa.jl index ddebf0c783f..7eb3eb3f4e6 100644 --- a/lib/StochasticDiffEqROCK/test/qa/qa.jl +++ b/lib/StochasticDiffEqROCK/test/qa/qa.jl @@ -5,5 +5,5 @@ run_qa( StochasticDiffEqROCK; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 ) diff --git a/lib/StochasticDiffEqRODE/src/alg_utils.jl b/lib/StochasticDiffEqRODE/src/alg_utils.jl index 41538c350d2..e2a09bd9644 100644 --- a/lib/StochasticDiffEqRODE/src/alg_utils.jl +++ b/lib/StochasticDiffEqRODE/src/alg_utils.jl @@ -3,4 +3,4 @@ alg_order(alg::RandomHeun) = 1 // 2 alg_order(alg::RandomTamedEM) = 1 // 2 alg_order(alg::BAOAB) = 1 // 1 -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::BAOAB) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::BAOAB) = is_diagonal_noise(prob) diff --git a/lib/StochasticDiffEqRODE/test/qa/Project.toml b/lib/StochasticDiffEqRODE/test/qa/Project.toml index 42dda000e44..ea38056d069 100644 --- a/lib/StochasticDiffEqRODE/test/qa/Project.toml +++ b/lib/StochasticDiffEqRODE/test/qa/Project.toml @@ -25,7 +25,7 @@ Aqua = "0.8" DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" -SciMLTesting = "1.6" +SciMLTesting = "1.7" StochasticDiffEqCore = "2" StochasticDiffEqRODE = "2" Test = "1" diff --git a/lib/StochasticDiffEqRODE/test/qa/qa.jl b/lib/StochasticDiffEqRODE/test/qa/qa.jl index 8f820768b49..f79f70c3484 100644 --- a/lib/StochasticDiffEqRODE/test/qa/qa.jl +++ b/lib/StochasticDiffEqRODE/test/qa/qa.jl @@ -5,5 +5,5 @@ run_qa( StochasticDiffEqRODE; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 ) diff --git a/lib/StochasticDiffEqWeak/src/alg_utils.jl b/lib/StochasticDiffEqWeak/src/alg_utils.jl index 8c80d07db16..1ea296b4f72 100644 --- a/lib/StochasticDiffEqWeak/src/alg_utils.jl +++ b/lib/StochasticDiffEqWeak/src/alg_utils.jl @@ -42,29 +42,29 @@ SciMLBase.alg_interpretation(alg::NON2) = SciMLBase.AlgorithmInterpretation.Stra ## alg_compatible -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::DRI1) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::DRI1NM) = is_diagonal_noise(prob) -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RI1) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RI3) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RI5) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RI6) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RDI1WM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RDI2WM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RDI3WM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RDI4WM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::W2Ito1) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RS1) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::RS2) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::PL1WM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::PL1WMA) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::NON) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::COM) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::NON2) = true -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SIEA) = is_diagonal_noise(prob) -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SMEA) = is_diagonal_noise(prob) -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SIEB) = is_diagonal_noise(prob) -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::SMEB) = is_diagonal_noise(prob) -alg_compatible(prob::DiffEqBase.AbstractSDEProblem, alg::IRI1) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::DRI1) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::DRI1NM) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RI1) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RI3) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RI5) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RI6) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RDI1WM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RDI2WM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RDI3WM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RDI4WM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::W2Ito1) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RS1) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::RS2) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::PL1WM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::PL1WMA) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::NON) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::COM) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::NON2) = true +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SIEA) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SMEA) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SIEB) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::SMEB) = is_diagonal_noise(prob) +alg_compatible(prob::SciMLBase.AbstractSDEProblem, alg::IRI1) = true ## alg_needs_extra_process diff --git a/lib/StochasticDiffEqWeak/test/qa/Project.toml b/lib/StochasticDiffEqWeak/test/qa/Project.toml index 4c47b3a0123..f6314d2281b 100644 --- a/lib/StochasticDiffEqWeak/test/qa/Project.toml +++ b/lib/StochasticDiffEqWeak/test/qa/Project.toml @@ -30,7 +30,7 @@ DiffEqBase = "7" JET = "0.9, 0.10, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqNonlinearSolve = "2" -SciMLTesting = "1.6" +SciMLTesting = "1.7" StochasticDiffEqCore = "2" StochasticDiffEqWeak = "2" Test = "1" diff --git a/lib/StochasticDiffEqWeak/test/qa/qa.jl b/lib/StochasticDiffEqWeak/test/qa/qa.jl index 0c222062d63..8769784e8bb 100644 --- a/lib/StochasticDiffEqWeak/test/qa/qa.jl +++ b/lib/StochasticDiffEqWeak/test/qa/qa.jl @@ -5,5 +5,5 @@ run_qa( StochasticDiffEqWeak; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 ) From df3c3928f6d5f9d80af547518e5b37af78b8d200 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:00:00 -0400 Subject: [PATCH 004/108] DiffEqDevTools QA: replace blanket EI ei_broken with tight ignores Migrate the DiffEqDevTools module imports to their public owners and convert the run_qa explicit-imports blanket `ei_broken` (all 6 checks) into narrow, documented `ei_kwargs` ignore lists. - Make implicit imports explicit (SciMLBase/CommonSolve/RootedTrees/Statistics/ RecipesBase/RecursiveArrayTools/StructArrays/DiffEqNoiseProcess/NLsolve). - Import SciMLBase-owned abstract types and `has_analytic` from SciMLBase (their owner; public in SciMLBase 3.30), fixing the via_owners checks; qualify `allowedkeywords`/`calculate_ensemble_errors`/`has_analytic` through SciMLBase. - Drop stale `AbstractDDEProblem` import; import `residual_order_condition` explicitly from RootedTrees (re-exported + extended here). - Add CommonSolve dep (init/solve/step!), bump SciMLBase compat floor to 3.30. 4 of 6 EI checks now pass with zero exceptions. The 2 residual ignore lists cover only names that are still non-public upstream: SciMLBase-owned allowedkeywords/calculate_ensemble_errors and the AbstractDDEAlgorithm/ AbstractODESolution/AbstractRODEProblem/AbstractSDDEProblem/AbstractBVProblem/ @def abstracts, plus DiffEqBase-only ConvergenceSetup/ODERKTableau. Co-Authored-By: Chris Rackauckas --- lib/DiffEqDevTools/Project.toml | 4 ++- lib/DiffEqDevTools/src/DiffEqDevTools.jl | 44 ++++++++++++++++-------- lib/DiffEqDevTools/src/benchmark.jl | 26 +++++++------- lib/DiffEqDevTools/src/convergence.jl | 4 +-- lib/DiffEqDevTools/test/qa/qa.jl | 18 +++++++++- 5 files changed, 65 insertions(+), 31 deletions(-) diff --git a/lib/DiffEqDevTools/Project.toml b/lib/DiffEqDevTools/Project.toml index dca177021fe..e93e0a6148f 100644 --- a/lib/DiffEqDevTools/Project.toml +++ b/lib/DiffEqDevTools/Project.toml @@ -4,6 +4,7 @@ authors = ["Chris Rackauckas "] version = "3.1.2" [deps] +CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" DiffEqNoiseProcess = "77a26b50-5914-5dd7-bc55-306e6241c503" Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b" @@ -48,6 +49,7 @@ StochasticDiffEqWeak = {path = "../StochasticDiffEqWeak"} [compat] BVProblemLibrary = "0.1" BoundaryValueDiffEq = "5" +CommonSolve = "0.2.4" DDEProblemLibrary = "0.1" DelayDiffEq = "6" DiffEqBase = "7" @@ -74,7 +76,7 @@ RecipesBase = "1.3.4" RecursiveArrayTools = "4.2.0" RootedTrees = "2" SDEProblemLibrary = "1" -SciMLBase = "3.10.0" +SciMLBase = "3.30" SciMLLogging = "2" SimpleNonlinearSolve = "2" Statistics = "1.10.0" diff --git a/lib/DiffEqDevTools/src/DiffEqDevTools.jl b/lib/DiffEqDevTools/src/DiffEqDevTools.jl index 551e0d79ca1..c5bc309b721 100644 --- a/lib/DiffEqDevTools/src/DiffEqDevTools.jl +++ b/lib/DiffEqDevTools/src/DiffEqDevTools.jl @@ -1,23 +1,39 @@ module DiffEqDevTools -using DiffEqBase: AbstractODEAlgorithm -using DiffEqBase, RecipesBase, RecursiveArrayTools, DiffEqNoiseProcess, StructArrays +import DiffEqBase +using DiffEqBase: ExplicitRKTableau, ImplicitRKTableau +import RecipesBase +using RecipesBase: @recipe, @series +import RecursiveArrayTools +using RecursiveArrayTools: recursive_mean, vecvecapply +using DiffEqNoiseProcess: NoiseGrid, NoiseWrapper +import StructArrays +using StructArrays: StructArray import SciMLBase -using SimpleNonlinearSolve, LinearAlgebra, RootedTrees - -using LinearAlgebra, Distributed - -using Statistics +using SciMLBase: AbstractODEAlgorithm, AbstractODEProblem, + AbstractSDEProblem, AbstractEnsembleProblem, AbstractDAEProblem, + AbstractDEAlgorithm, AbstractTimeseriesSolution, + DAEProblem, EnsembleProblem, EnsembleSolution, EnsembleThreads, + NonlinearProblem, ODEProblem, ReturnCode, SDDEProblem, SDEProblem, remake +using CommonSolve: init, solve, step! +import SimpleNonlinearSolve +using SimpleNonlinearSolve: SimpleTrustRegion, AutoFiniteDiff +import LinearAlgebra +import RootedTrees +using RootedTrees: RootedTreeIterator, RungeKuttaMethod, residual_order_condition +import Distributed +import Statistics +using Statistics: mean, std import Base: length -import DiffEqBase: AbstractODEProblem, AbstractDDEProblem, AbstractDDEAlgorithm, - AbstractODESolution, AbstractRODEProblem, AbstractSDEProblem, - AbstractSDDEProblem, AbstractEnsembleProblem, - AbstractDAEProblem, AbstractBVProblem, @def, ConvergenceSetup, - AbstractDEAlgorithm, - ODERKTableau, AbstractTimeseriesSolution, ExplicitRKTableau, - ImplicitRKTableau +# These problem/solution/algorithm abstracts and `@def` are owned by SciMLBase but +# not yet declared `public` there; accessed via SciMLBase (their owner). +using SciMLBase: AbstractDDEAlgorithm, AbstractODESolution, AbstractRODEProblem, + AbstractSDDEProblem, AbstractBVProblem, @def +# `ConvergenceSetup` and `ODERKTableau` are defined and owned only in DiffEqBase +# (not re-exported by SciMLBase) and are not declared `public` there. +using DiffEqBase: ConvergenceSetup, ODERKTableau import LinearAlgebra: norm, I diff --git a/lib/DiffEqDevTools/src/benchmark.jl b/lib/DiffEqDevTools/src/benchmark.jl index bd529dc213e..b167d1a7781 100644 --- a/lib/DiffEqDevTools/src/benchmark.jl +++ b/lib/DiffEqDevTools/src/benchmark.jl @@ -531,7 +531,7 @@ function WorkPrecisionSet( _abstols = get(setups[i], :abstols, abstols) _reltols = get(setups[i], :reltols, reltols) _dts = get(setups[i], :dts, nothing) - filtered_setup = filter(p -> p.first in DiffEqBase.allowedkeywords, setups[i]) + filtered_setup = filter(p -> p.first in SciMLBase.allowedkeywords, setups[i]) wps[i] = WorkPrecision( prob, setups[i][:alg], _abstols, _reltols, _dts; @@ -547,7 +547,7 @@ function WorkPrecisionSet( end @def error_calculation begin - if !DiffEqBase.has_analytic(prob.f) + if !SciMLBase.has_analytic(prob.f) t = prob.tspan[1]:test_dt:prob.tspan[2] brownian_values = cumsum( [ @@ -578,7 +578,7 @@ end _abstols = get(setups[1], :abstols, abstols) _reltols = get(setups[1], :reltols, reltols) _dts = get(setups[1], :dts, zeros(length(_abstols))) - filtered_setup = filter(p -> p.first in DiffEqBase.allowedkeywords, setups[1]) + filtered_setup = filter(p -> p.first in SciMLBase.allowedkeywords, setups[1]) sol = solve( _prob, setups[1][:alg]; @@ -592,7 +592,7 @@ end _abstols = get(setups[k], :abstols, abstols) _reltols = get(setups[k], :reltols, reltols) _dts = get(setups[k], :dts, zeros(length(_abstols))) - filtered_setup = filter(p -> p.first in DiffEqBase.allowedkeywords, setups[k]) + filtered_setup = filter(p -> p.first in SciMLBase.allowedkeywords, setups[k]) sol = solve( _prob, setups[k][:alg]; @@ -601,7 +601,7 @@ end timeseries_errors = timeseries_errors, dense_errors = dense_errors ) - DiffEqBase.has_analytic(prob.f) ? err_sol = sol : err_sol = appxtrue(sol, true_sol) + SciMLBase.has_analytic(prob.f) ? err_sol = sol : err_sol = appxtrue(sol, true_sol) tmp_solutions[i, j, k] = err_sol end end @@ -615,11 +615,11 @@ function WorkPrecisionSet( kwargs... ) @assert names === nothing || length(setups) == length(names) - timeseries_errors = DiffEqBase.has_analytic(prob.f) && + timeseries_errors = SciMLBase.has_analytic(prob.f) && error_estimate ∈ TIMESERIES_ERRORS weak_timeseries_errors = error_estimate ∈ WEAK_TIMESERIES_ERRORS weak_dense_errors = error_estimate ∈ WEAK_DENSE_ERRORS - dense_errors = DiffEqBase.has_analytic(prob.f) && error_estimate ∈ DENSE_ERRORS + dense_errors = SciMLBase.has_analytic(prob.f) && error_estimate ∈ DENSE_ERRORS N = length(setups) M = length(abstols) times = Array{Float64}(undef, M, N) @@ -647,7 +647,7 @@ function WorkPrecisionSet( ] solutions = [ [ - DiffEqBase.calculate_ensemble_errors( + SciMLBase.calculate_ensemble_errors( sim; weak_timeseries_errors = weak_timeseries_errors, weak_dense_errors = weak_dense_errors @@ -670,7 +670,7 @@ function WorkPrecisionSet( for k in 1:N # precompile GC.gc() - filtered_setup = filter(p -> p.first in DiffEqBase.allowedkeywords, setups[k]) + filtered_setup = filter(p -> p.first in SciMLBase.allowedkeywords, setups[k]) _sol = solve( prob, setups[k][:alg]; @@ -740,7 +740,7 @@ function WorkPrecisionSet( _reltols = [get(setups[k], :reltols, reltols) for k in 1:N] _dts = [get(setups[k], :dts, zeros(length(_abstols))) for k in 1:N] for k in 1:N - filtered_setup = filter(p -> p.first in DiffEqBase.allowedkeywords, setups[k]) + filtered_setup = filter(p -> p.first in SciMLBase.allowedkeywords, setups[k]) for j in 1:M sol = solve( @@ -810,7 +810,7 @@ function WorkPrecisionSet( for k in 1:N # precompile GC.gc() - filtered_setup = filter(p -> p.first in DiffEqBase.allowedkeywords, setups[k]) + filtered_setup = filter(p -> p.first in SciMLBase.allowedkeywords, setups[k]) _sol = solve( prob, setups[k][:alg], ensemblealg; @@ -874,7 +874,7 @@ function WorkPrecisionSet( _abstols = get(setups[i], :abstols, abstols) _reltols = get(setups[i], :reltols, reltols) _dts = get(setups[i], :dts, nothing) - filtered_setup = filter(p -> p.first in DiffEqBase.allowedkeywords, setups[i]) + filtered_setup = filter(p -> p.first in SciMLBase.allowedkeywords, setups[i]) wps[i] = WorkPrecision( prob, setups[i][:alg], _abstols, _reltols, _dts; @@ -922,7 +922,7 @@ function get_sample_errors( tmp_solutions = vec(tmp_solutions) end - if DiffEqBase.has_analytic(prob.f) + if SciMLBase.has_analytic(prob.f) analytical_mean_end = mean(1:sample_error_runs) do i _dt = prob.tspan[2] - prob.tspan[1] if prob.u0 isa Number diff --git a/lib/DiffEqDevTools/src/convergence.jl b/lib/DiffEqDevTools/src/convergence.jl index cdf05ccc2c6..a194bc0a2f8 100644 --- a/lib/DiffEqDevTools/src/convergence.jl +++ b/lib/DiffEqDevTools/src/convergence.jl @@ -81,7 +81,7 @@ function test_convergence( if expected_value == nothing solutions = [ - DiffEqBase.calculate_ensemble_errors( + SciMLBase.calculate_ensemble_errors( sim; weak_timeseries_errors = weak_timeseries_errors, weak_dense_errors = weak_dense_errors @@ -239,7 +239,7 @@ function analyticless_test_convergence( end _solutions = [EnsembleSolution(tmp_solutions[:, i], 0.0, true) for i in 1:length(dts)] solutions = [ - DiffEqBase.calculate_ensemble_errors( + SciMLBase.calculate_ensemble_errors( sim; weak_timeseries_errors = weak_timeseries_errors, weak_dense_errors = weak_dense_errors diff --git a/lib/DiffEqDevTools/test/qa/qa.jl b/lib/DiffEqDevTools/test/qa/qa.jl index 307a12727c9..858928d820a 100644 --- a/lib/DiffEqDevTools/test/qa/qa.jl +++ b/lib/DiffEqDevTools/test/qa/qa.jl @@ -7,5 +7,21 @@ run_qa( deps_compat = (; check_extras = false), ), explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # SciMLBase-owned solver-interface predicates that are accessed via SciMLBase + # (their owner) but not yet declared `public` there. + all_qualified_accesses_are_public = (; + ignore = (:allowedkeywords, :calculate_ensemble_errors), + ), + # Abstract problem/solution/algorithm types + `@def` are owned by SciMLBase but + # not yet `public` there; `ConvergenceSetup`/`ODERKTableau` live only in DiffEqBase + # (not re-exported by SciMLBase) and are likewise not `public`. + all_explicit_imports_are_public = (; + ignore = ( + :AbstractDDEAlgorithm, :AbstractODESolution, :AbstractRODEProblem, + :AbstractSDDEProblem, :AbstractBVProblem, Symbol("@def"), + :ConvergenceSetup, :ODERKTableau, + ), + ), + ), ) From da84540c3f5a70da97772752abe04fc418c0bf85 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:00:05 -0400 Subject: [PATCH 005/108] QA: minimize EI exceptions for OrdinaryDiffEqHighOrderRK Replace the blanket ei_broken=(5 checks) with tight, documented per-name ignore lists, and clean up the module imports: - Import alg_order from its owner SciMLBase (now public). - Import calculate_residuals/calculate_residuals!/initialize! from their owner DiffEqBase (initialize! is public) and copyat_or_push! from its owner RecursiveArrayTools (public) instead of routing through OrdinaryDiffEqCore (fixes all_explicit_imports_via_owners / all_qualified_accesses_via_owners). - Drop the bare `using DiffEqBase` and the stale `@def`/`uses_uprev` imports; make the remaining DiffEqBase imports explicit. Residual ignores are limited to genuinely non-public upstream names (OrdinaryDiffEqCore solver-extension API + DiffEqBase residual helpers, tracked in SciML/OrdinaryDiffEq.jl#3776), the unavoidable `@reexport using SciMLBase` implicit bindings, and the ExplicitImports macro-blindness false stale for @tight_loop_macros. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqHighOrderRK.jl | 15 ++++----- lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl | 31 ++++++++++++++++++- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/lib/OrdinaryDiffEqHighOrderRK/src/OrdinaryDiffEqHighOrderRK.jl b/lib/OrdinaryDiffEqHighOrderRK/src/OrdinaryDiffEqHighOrderRK.jl index b99588f5bde..c249fcf96d3 100644 --- a/lib/OrdinaryDiffEqHighOrderRK/src/OrdinaryDiffEqHighOrderRK.jl +++ b/lib/OrdinaryDiffEqHighOrderRK/src/OrdinaryDiffEqHighOrderRK.jl @@ -1,23 +1,24 @@ module OrdinaryDiffEqHighOrderRK -import OrdinaryDiffEqCore: alg_order, qmax_default, qmin_default, beta2_default, +import OrdinaryDiffEqCore: qmax_default, qmin_default, beta2_default, beta1_default, explicit_rk_docstring, OrdinaryDiffEqAdaptiveAlgorithm, trivial_limiter!, _ode_addsteps!, @cache, OrdinaryDiffEqMutableCache, constvalue, - alg_cache, uses_uprev, initialize!, perform_step!, + alg_cache, perform_step!, OrdinaryDiffEqConstantCache, - calculate_residuals!, calculate_residuals, CompiledFloats, - copyat_or_push!, get_fsalfirstlast, + CompiledFloats, + get_fsalfirstlast, unwrap_alg, _ode_interpolant, _ode_interpolant!, DerivativeOrderNotPossibleError, full_cache, isdp8 using FastBroadcast: Serial import MuladdMacro: @muladd -using DiffEqBase import FastBroadcast: @.. -import RecursiveArrayTools: recursivefill! -using DiffEqBase: @def, @tight_loop_macros +import RecursiveArrayTools: recursivefill!, copyat_or_push! +import DiffEqBase: @tight_loop_macros, calculate_residuals, calculate_residuals!, + initialize! +import SciMLBase: alg_order import OrdinaryDiffEqCore using Reexport diff --git a/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl b/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl index 5370c0b872a..f0ba06c1ca1 100644 --- a/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl @@ -3,5 +3,34 @@ using SciMLTesting, OrdinaryDiffEqHighOrderRK, Test run_qa( OrdinaryDiffEqHighOrderRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + # `@reexport using SciMLBase` is the intended public-API reexport; it + # necessarily brings the `SciMLBase`/`Reexport`/`@reexport` bindings in + # implicitly, which there is no way to make explicit. + no_implicit_imports = (ignore = (:SciMLBase, :Reexport, Symbol("@reexport")),), + # `@tight_loop_macros` is used throughout the perform_step/addsteps loops + # but ExplicitImports cannot see macro invocations nested inside the + # `@muladd`-expanded function bodies, so it is a false stale positive. + no_stale_explicit_imports = (ignore = (Symbol("@tight_loop_macros"),),), + # OrdinaryDiffEqCore-internal solver-statistics accessors; not yet + # declared public upstream (SciML/OrdinaryDiffEq.jl#3776). + all_qualified_accesses_are_public = ( + ignore = (:get_EEst, :increment_nf!, :set_EEst!), + ), + # Internal solver-extension API of OrdinaryDiffEqCore (and the + # `calculate_residuals`/`@tight_loop_macros` helpers of DiffEqBase) that + # is not yet declared public upstream (SciML/OrdinaryDiffEq.jl#3776). + all_explicit_imports_are_public = ( + ignore = ( + Symbol("@cache"), Symbol("@tight_loop_macros"), :CompiledFloats, + :DerivativeOrderNotPossibleError, :OrdinaryDiffEqAdaptiveAlgorithm, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, :alg_cache, + :beta1_default, :beta2_default, :calculate_residuals, + :calculate_residuals!, :constvalue, :explicit_rk_docstring, + :get_fsalfirstlast, :isdp8, :perform_step!, :qmax_default, + :qmin_default, :trivial_limiter!, :unwrap_alg, + ), + ), + ), ) From 595f2338034f68346d47e87ca4e431c9c575e66c Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:00:21 -0400 Subject: [PATCH 006/108] OrdinaryDiffEqAdamsBashforthMoulton: minimize EI exceptions Migrate now-public/owned names to their owners and remove blanket ei_broken: - alg_order: import from SciMLBase (owner, public) - initialize!: import from DiffEqBase (owner, public) - calculate_residuals/calculate_residuals!: import from DiffEqBase (owner) - make @muladd / @.. / @reexport / SciMLBase explicit (no_implicit_imports) - remove stale imports @SciMLMessage / _ad_chunksize_int / _ad_fdtype / _fixup_ad 4 of 5 previously ei_broken checks now pass. The residual non-public names (OrdinaryDiffEqCore solver-interface internals, DiffEqBase residual helpers, OrdinaryDiffEqLowOrderRK starter caches) are narrowed to tight documented ignores in qa.jl instead of a blanket ei_broken. See SciML/OrdinaryDiffEq.jl#3776. Co-Authored-By: Chris Rackauckas --- .../OrdinaryDiffEqAdamsBashforthMoulton.jl | 15 ++++++----- .../test/qa/qa.jl | 26 ++++++++++++++++++- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/lib/OrdinaryDiffEqAdamsBashforthMoulton/src/OrdinaryDiffEqAdamsBashforthMoulton.jl b/lib/OrdinaryDiffEqAdamsBashforthMoulton/src/OrdinaryDiffEqAdamsBashforthMoulton.jl index daebb467b57..970415acd9a 100644 --- a/lib/OrdinaryDiffEqAdamsBashforthMoulton/src/OrdinaryDiffEqAdamsBashforthMoulton.jl +++ b/lib/OrdinaryDiffEqAdamsBashforthMoulton/src/OrdinaryDiffEqAdamsBashforthMoulton.jl @@ -2,22 +2,25 @@ module OrdinaryDiffEqAdamsBashforthMoulton import OrdinaryDiffEqCore: OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, @cache, alg_cache, - initialize!, perform_step!, alg_order, default_controller, IController, + perform_step!, default_controller, IController, OrdinaryDiffEqAlgorithm, OrdinaryDiffEqAdaptiveAlgorithm, OrdinaryDiffEqAdamsVarOrderVarStepAlgorithm, - constvalue, calculate_residuals, calculate_residuals!, + constvalue, trivial_limiter!, get_fsalfirstlast, generic_solver_docstring, - full_cache, - _ad_chunksize_int, _ad_fdtype, _fixup_ad, @SciMLMessage + full_cache +import SciMLBase: alg_order +import DiffEqBase: initialize!, calculate_residuals, calculate_residuals! import OrdinaryDiffEqLowOrderRK: BS3ConstantCache, BS3Cache, RK4ConstantCache, RK4Cache import RecursiveArrayTools: recursivefill! -using MuladdMacro, FastBroadcast +using MuladdMacro: @muladd +import FastBroadcast: @.. using FastBroadcast: Serial import OrdinaryDiffEqCore -using Reexport +using Reexport: @reexport +import SciMLBase @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl index e1f9b5b96a5..4aa09810661 100644 --- a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl @@ -3,5 +3,29 @@ using SciMLTesting, OrdinaryDiffEqAdamsBashforthMoulton, Test run_qa( OrdinaryDiffEqAdamsBashforthMoulton; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + # All residual names below are non-public internals of their owning + # package (OrdinaryDiffEqCore / DiffEqBase / OrdinaryDiffEqLowOrderRK). + # They are imported from their true owner; the only thing left is that + # those owners have not yet declared them `public`. See SciML/OrdinaryDiffEq.jl#3776. + all_qualified_accesses_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internal stats/error-estimate accessors + :get_EEst, :set_EEst!, :increment_nf!, + )), + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore solver-interface internals + Symbol("@cache"), :alg_cache, :perform_step!, :constvalue, + :trivial_limiter!, :get_fsalfirstlast, :generic_solver_docstring, + :default_controller, :IController, + :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqAdaptiveAlgorithm, + :OrdinaryDiffEqAdamsVarOrderVarStepAlgorithm, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + # DiffEqBase residual-calculation internals + :calculate_residuals, :calculate_residuals!, + # OrdinaryDiffEqLowOrderRK starter-cache types + :BS3Cache, :BS3ConstantCache, :RK4Cache, :RK4ConstantCache, + )), + ), ) From 2068238d0b7152d71db80223b934656d93d1b089 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 29 Jun 2026 12:01:38 -0400 Subject: [PATCH 007/108] Minimize EI exceptions for OrdinaryDiffEqFeagin Convert the blanket ei_broken (5 checks) to migration + tight ignores: - Migrate now-public names to public owners: alg_order -> SciMLBase, initialize! -> DiffEqBase. - Route owner-correct DiffEqBase names through DiffEqBase: calculate_residuals, calculate_residuals!. - Make exported-name implicit imports explicit: @.. (FastBroadcast), @muladd (MuladdMacro), recursivefill! (RecursiveArrayTools), @reexport (Reexport). - Drop stale imports: OrdinaryDiffEqAlgorithm, Serial, unwrap_alg, uses_uprev, isfsal, _vec, _reshape, _unwrap_val, @def, _ode_interpolant!, _ode_addsteps!. Remaining exceptions are tight, documented ignores for genuinely non-public internals: - no_implicit_imports: SciMLBase (deliberate @reexport surface). - all_qualified_accesses_are_public: increment_nf!, set_EEst! (OrdinaryDiffEqCore solver-interface internals). - all_explicit_imports_are_public: OrdinaryDiffEqCore solver internals (@cache, CompiledFloats, OrdinaryDiffEqAdaptiveAlgorithm, OrdinaryDiffEqConstantCache, OrdinaryDiffEqMutableCache, alg_cache, constvalue, generic_solver_docstring, get_fsalfirstlast, perform_step!, trivial_limiter!) plus DiffEqBase internals (@tight_loop_macros, calculate_residuals, calculate_residuals!). QA EI green on Julia 1.12 (17/17). Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqFeagin.jl | 25 +++++++++---------- lib/OrdinaryDiffEqFeagin/test/qa/qa.jl | 20 ++++++++++++++- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/lib/OrdinaryDiffEqFeagin/src/OrdinaryDiffEqFeagin.jl b/lib/OrdinaryDiffEqFeagin/src/OrdinaryDiffEqFeagin.jl index e1ed9f5c528..8c247a96498 100644 --- a/lib/OrdinaryDiffEqFeagin/src/OrdinaryDiffEqFeagin.jl +++ b/lib/OrdinaryDiffEqFeagin/src/OrdinaryDiffEqFeagin.jl @@ -1,21 +1,20 @@ module OrdinaryDiffEqFeagin -import OrdinaryDiffEqCore: alg_order, calculate_residuals!, - initialize!, perform_step!, unwrap_alg, - calculate_residuals, - OrdinaryDiffEqAlgorithm, +import OrdinaryDiffEqCore: perform_step!, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, - OrdinaryDiffEqAdaptiveAlgorithm, CompiledFloats, uses_uprev, - alg_cache, _vec, _reshape, @cache, isfsal, full_cache, - constvalue, _unwrap_val, get_fsalfirstlast, - generic_solver_docstring, trivial_limiter!, - _ode_interpolant!, _ode_addsteps! -using FastBroadcast, MuladdMacro, RecursiveArrayTools -using DiffEqBase: @def, @tight_loop_macros -using FastBroadcast: Serial + OrdinaryDiffEqAdaptiveAlgorithm, CompiledFloats, + alg_cache, @cache, full_cache, + constvalue, get_fsalfirstlast, + generic_solver_docstring, trivial_limiter! +import SciMLBase: alg_order +import DiffEqBase: initialize!, calculate_residuals, calculate_residuals! +import FastBroadcast: @.. +import MuladdMacro: @muladd +import RecursiveArrayTools: recursivefill! +using DiffEqBase: @tight_loop_macros import OrdinaryDiffEqCore -using Reexport +using Reexport: @reexport @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl b/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl index 2ba8bd1f994..1e05b39aa81 100644 --- a/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl @@ -3,5 +3,23 @@ using SciMLTesting, OrdinaryDiffEqFeagin, Test run_qa( OrdinaryDiffEqFeagin; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # `@reexport using SciMLBase` deliberately re-exports SciMLBase's API + # as part of this solver package's public surface. + no_implicit_imports = (; ignore = (:SciMLBase,)), + # OrdinaryDiffEqCore solver-interface internals not declared `public`. + all_qualified_accesses_are_public = (; + ignore = (:increment_nf!, :set_EEst!)), + # Non-public solver-interface internals (OrdinaryDiffEqCore) and + # DiffEqBase residual/loop internals; not declared `public` upstream. + all_explicit_imports_are_public = (; + ignore = ( + Symbol("@cache"), Symbol("@tight_loop_macros"), + :CompiledFloats, :OrdinaryDiffEqAdaptiveAlgorithm, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + :alg_cache, :calculate_residuals, :calculate_residuals!, + :constvalue, :generic_solver_docstring, :get_fsalfirstlast, + :perform_step!, :trivial_limiter!, + )), + ), ) From 1692d1037c0f2bed28b01c91ad4d178f51401e37 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:08:07 -0400 Subject: [PATCH 008/108] Minimize EI exceptions for OrdinaryDiffEqFunctionMap Drop the blanket ei_broken tuple and instead fix the underlying ExplicitImports findings on SciMLBase 3.30 / OrdinaryDiffEqCore 4.4: - make implicit imports explicit (DiffEqBase, SciMLBase, Reexport) - remove stale FastBroadcast.Serial import - import alg_order from its owner SciMLBase (now public) and initialize! from its owner DiffEqBase (now public) - access DISCRETE_{IN,OUT}OFPLACE_DEFAULT via owner SciMLBase Remaining residue is genuinely OrdinaryDiffEqCore/DiffEqBase/SciMLBase internal (non-public) solver hooks with no public alternative; these are narrowed to tight documented ignore lists in qa.jl rather than a blanket broken-check. See SciML/OrdinaryDiffEq.jl#3776. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqFunctionMap.jl | 12 +++++----- .../src/fixed_timestep_perform_step.jl | 8 +++---- lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl | 22 ++++++++++++++++++- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/OrdinaryDiffEqFunctionMap/src/OrdinaryDiffEqFunctionMap.jl b/lib/OrdinaryDiffEqFunctionMap/src/OrdinaryDiffEqFunctionMap.jl index 5217b73d8a0..eefdd5c73ce 100644 --- a/lib/OrdinaryDiffEqFunctionMap/src/OrdinaryDiffEqFunctionMap.jl +++ b/lib/OrdinaryDiffEqFunctionMap/src/OrdinaryDiffEqFunctionMap.jl @@ -1,20 +1,22 @@ module OrdinaryDiffEqFunctionMap import OrdinaryDiffEqCore: isfsal, beta2_default, beta1_default, OrdinaryDiffEqAlgorithm, - initialize!, perform_step!, unwrap_alg, + perform_step!, unwrap_alg, OrdinaryDiffEqMutableCache, alg_cache, @cache, _ode_addsteps!, _ode_interpolant!, _ode_interpolant, get_fsalfirstlast, - alg_order, OrdinaryDiffEqConstantCache, dt_required, + OrdinaryDiffEqConstantCache, dt_required, isdiscretecache, isdiscretealg, full_cache -using DiffEqBase +using DiffEqBase: DiffEqBase +import DiffEqBase: initialize! import RecursiveArrayTools: recursivecopy! import FastBroadcast: @.. import MuladdMacro: @muladd -using FastBroadcast: Serial import OrdinaryDiffEqCore -using Reexport +using Reexport: Reexport, @reexport +using SciMLBase: SciMLBase +import SciMLBase: alg_order @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqFunctionMap/src/fixed_timestep_perform_step.jl b/lib/OrdinaryDiffEqFunctionMap/src/fixed_timestep_perform_step.jl index 4e5fee9313b..b6bc0210c8a 100644 --- a/lib/OrdinaryDiffEqFunctionMap/src/fixed_timestep_perform_step.jl +++ b/lib/OrdinaryDiffEqFunctionMap/src/fixed_timestep_perform_step.jl @@ -7,10 +7,10 @@ function perform_step!(integrator, cache::FunctionMapCache, repeat_step = false) (; u, uprev, dt, t, f, p) = integrator alg = unwrap_alg(integrator, nothing) (; tmp) = cache - return if integrator.f != DiffEqBase.DISCRETE_INPLACE_DEFAULT && + return if integrator.f != SciMLBase.DISCRETE_INPLACE_DEFAULT && !( integrator.f isa DiffEqBase.EvalFunc && - integrator.f.f === DiffEqBase.DISCRETE_INPLACE_DEFAULT + integrator.f.f === SciMLBase.DISCRETE_INPLACE_DEFAULT ) if FunctionMap_scale_by_time(alg) f(tmp, uprev, p, t + dt) @@ -25,10 +25,10 @@ end function perform_step!(integrator, cache::FunctionMapConstantCache, repeat_step = false) (; uprev, dt, t, f, p) = integrator alg = unwrap_alg(integrator, nothing) - return if integrator.f != DiffEqBase.DISCRETE_OUTOFPLACE_DEFAULT && + return if integrator.f != SciMLBase.DISCRETE_OUTOFPLACE_DEFAULT && !( integrator.f isa DiffEqBase.EvalFunc && - integrator.f.f === DiffEqBase.DISCRETE_OUTOFPLACE_DEFAULT + integrator.f.f === SciMLBase.DISCRETE_OUTOFPLACE_DEFAULT ) if FunctionMap_scale_by_time(alg) tmp = f(uprev, p, t + dt) diff --git a/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl b/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl index 1dc4b5cf8d1..1d5b85da69b 100644 --- a/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl @@ -4,5 +4,25 @@ run_qa( OrdinaryDiffEqFunctionMap; aqua_kwargs = (; piracies = false), # piracy is needed for default-algorithm dispatch explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # Internal (non-public) names extended/dispatched from OrdinaryDiffEqCore. + # No public API exists for these solver-internal hooks; see SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqMutableCache, + :OrdinaryDiffEqConstantCache, :perform_step!, :unwrap_alg, + :alg_cache, Symbol("@cache"), :_ode_addsteps!, :_ode_interpolant, + :_ode_interpolant!, :get_fsalfirstlast, :isfsal, :beta1_default, + :beta2_default, :dt_required, :isdiscretecache, :isdiscretealg, + ), + ), + # increment_nf! is OrdinaryDiffEqCore-internal; EvalFunc is DiffEqBase-internal; + # DISCRETE_{IN,OUT}OFPLACE_DEFAULT are SciMLBase-owned but non-public. + all_qualified_accesses_are_public = (; + ignore = ( + :increment_nf!, :EvalFunc, + :DISCRETE_INPLACE_DEFAULT, :DISCRETE_OUTOFPLACE_DEFAULT, + ), + ), + ), ) From 6e77bd1d22e9ba93048658f264156149284ef4f3 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:11:00 -0400 Subject: [PATCH 009/108] Minimize EI exceptions for OrdinaryDiffEqLowOrderRK Replace the blanket ei_broken=(5 checks) in test/qa/qa.jl with tight, documented ignore lists for only the genuinely-non-public names. src changes (eliminate, not suppress): - Make implicit imports explicit (SciMLBase, Reexport/@reexport). - Remove stale import uses_uprev. - Re-route owner-mismatched names to their owner module: alg_order/@def/ _unwrap_val -> SciMLBase; copyat_or_push! -> RecursiveArrayTools; initialize!/calculate_residuals/calculate_residuals! -> DiffEqBase. alg_order, copyat_or_push! and initialize! are public on their owners, so this also clears them from the public-API checks. Now-green: no_implicit_imports, no_stale_explicit_imports, all_explicit_imports_via_owners. The two public-API checks retain tight ignores for OrdinaryDiffEqCore/DiffEqBase/SciMLBase solver internals with no public alternative (tracked for make-public in #3776). Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqLowOrderRK.jl | 23 +++++----- lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl | 42 ++++++++++++++++++- 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/lib/OrdinaryDiffEqLowOrderRK/src/OrdinaryDiffEqLowOrderRK.jl b/lib/OrdinaryDiffEqLowOrderRK/src/OrdinaryDiffEqLowOrderRK.jl index c68f6134b78..c6c26631687 100644 --- a/lib/OrdinaryDiffEqLowOrderRK/src/OrdinaryDiffEqLowOrderRK.jl +++ b/lib/OrdinaryDiffEqLowOrderRK/src/OrdinaryDiffEqLowOrderRK.jl @@ -1,33 +1,34 @@ module OrdinaryDiffEqLowOrderRK -import OrdinaryDiffEqCore: alg_order, isfsal, beta2_default, beta1_default, +import OrdinaryDiffEqCore: isfsal, beta2_default, beta1_default, alg_stability_size, ssp_coefficient, OrdinaryDiffEqAlgorithm, OrdinaryDiffEqExponentialAlgorithm, explicit_rk_docstring, generic_solver_docstring, trivial_limiter!, OrdinaryDiffEqAdaptiveAlgorithm, - unwrap_alg, initialize!, perform_step!, - calculate_residuals, - calculate_residuals!, _ode_addsteps!, @OnDemandTableauExtract, + unwrap_alg, perform_step!, + _ode_addsteps!, @OnDemandTableauExtract, constvalue, - OrdinaryDiffEqMutableCache, uses_uprev, + OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, @fold, @cache, CompiledFloats, alg_cache, CompositeAlgorithm, AutoAlgSwitch, _ode_interpolant, _ode_interpolant!, full_cache, accept_step_controller, DerivativeOrderNotPossibleError, - du_cache, u_cache, get_fsalfirstlast, copyat_or_push!, _unwrap_val -using SciMLBase + du_cache, u_cache, get_fsalfirstlast +using SciMLBase: SciMLBase +import SciMLBase: alg_order, @def, _unwrap_val import MuladdMacro: @muladd import FastBroadcast: @.. import LinearAlgebra: norm -import RecursiveArrayTools: recursivefill!, recursive_unitless_bottom_eltype +import RecursiveArrayTools: recursivefill!, recursive_unitless_bottom_eltype, + copyat_or_push! using FastBroadcast: Serial -using DiffEqBase: @def, @tight_loop_macros -import DiffEqBase: prepare_alg +using DiffEqBase: @tight_loop_macros, calculate_residuals, calculate_residuals! +import DiffEqBase: prepare_alg, initialize! import OrdinaryDiffEqCore -using Reexport +using Reexport: Reexport, @reexport @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl b/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl index c9adf169e40..43a3d011a49 100644 --- a/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl @@ -3,5 +3,45 @@ using SciMLTesting, OrdinaryDiffEqLowOrderRK, Test run_qa( OrdinaryDiffEqLowOrderRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # Solver-internal names with no public alternative: OrdinaryDiffEqCore's + # increment_nf!/set_EEst! step-statistics mutators and SciMLBase's + # has_lazy_interpolation interpolation trait. Accessed via qualified + # owner module; none are public on the registered releases. + all_qualified_accesses_are_public = (; + ignore = ( + :has_lazy_interpolation, # SciMLBase + :increment_nf!, # OrdinaryDiffEqCore + :set_EEst!, # OrdinaryDiffEqCore + ), + ), + # Core solver-interface names that are imported from their owner module + # but not yet declared `public`. These are the OrdinaryDiffEq internal + # extension/dispatch API (OrdinaryDiffEqCore), plus DiffEqBase residual + # helpers and SciMLBase internals (@def/_unwrap_val). No public + # alternative exists; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore + :accept_step_controller, :alg_cache, :alg_stability_size, + :AutoAlgSwitch, :beta1_default, :beta2_default, + Symbol("@cache"), :CompiledFloats, :CompositeAlgorithm, + :constvalue, :DerivativeOrderNotPossibleError, + :explicit_rk_docstring, Symbol("@fold"), + :generic_solver_docstring, :get_fsalfirstlast, :isfsal, + :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, + Symbol("@OnDemandTableauExtract"), + :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqAlgorithm, + :OrdinaryDiffEqConstantCache, + :OrdinaryDiffEqExponentialAlgorithm, + :OrdinaryDiffEqMutableCache, :perform_step!, :ssp_coefficient, + :trivial_limiter!, :unwrap_alg, + # DiffEqBase + :calculate_residuals, :calculate_residuals!, :prepare_alg, + Symbol("@tight_loop_macros"), + # SciMLBase + Symbol("@def"), :_unwrap_val, + ), + ), + ), ) From 2e9940ac946bec9ce8451f9d56489685a6303cf9 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:11:26 -0400 Subject: [PATCH 010/108] OrdinaryDiffEqExplicitRK: minimize EI exceptions (drop blanket ei_broken) Replace the 4 blanket ei_broken checks with real import fixes plus tight, documented per-name ignores of only genuinely-internal names. Fixed (no longer suppressed): - no_implicit_imports: explicit `using`/`import` of @.., @muladd, recursivefill!, @reexport, and the SciMLBase/DiffEqBase module names used in qualified accesses. - all_explicit_imports_via_owners: import alg_order from SciMLBase (now public), initialize! + calculate_residuals(!) from DiffEqBase (their Base.which owner), copyat_or_push! from RecursiveArrayTools (now public). - no_stale_explicit_imports: removed unused `full_cache` import. Residual ignores are exactly the OrdinaryDiffEqCore/DiffEqBase/Base-internal extension points with no public alternative (tracked for make-public in #3776). Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqExplicitRK.jl | 22 +++++++++----- lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl | 30 ++++++++++++++++++- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/lib/OrdinaryDiffEqExplicitRK/src/OrdinaryDiffEqExplicitRK.jl b/lib/OrdinaryDiffEqExplicitRK/src/OrdinaryDiffEqExplicitRK.jl index 9c9aa385a3f..bfd6eb685eb 100644 --- a/lib/OrdinaryDiffEqExplicitRK/src/OrdinaryDiffEqExplicitRK.jl +++ b/lib/OrdinaryDiffEqExplicitRK/src/OrdinaryDiffEqExplicitRK.jl @@ -1,21 +1,27 @@ module OrdinaryDiffEqExplicitRK -import OrdinaryDiffEqCore: alg_order, alg_adaptive_order, alg_stability_size, +import OrdinaryDiffEqCore: alg_adaptive_order, alg_stability_size, OrdinaryDiffEqAdaptiveAlgorithm, @cache, alg_cache, OrdinaryDiffEqConstantCache, unwrap_alg, - OrdinaryDiffEqMutableCache, initialize!, perform_step!, isfsal, - CompositeAlgorithm, calculate_residuals!, calculate_residuals, - full_cache, get_fsalfirstlast, + OrdinaryDiffEqMutableCache, perform_step!, isfsal, + CompositeAlgorithm, + get_fsalfirstlast, _ode_interpolant, _ode_interpolant!, - _ode_addsteps!, copyat_or_push!, + _ode_addsteps!, DerivativeOrderNotPossibleError -using TruncatedStacktraces: @truncate_stacktrace -using RecursiveArrayTools, FastBroadcast, MuladdMacro, DiffEqBase +import SciMLBase: alg_order +import DiffEqBase: calculate_residuals, calculate_residuals!, initialize! +using TruncatedStacktraces: TruncatedStacktraces, @truncate_stacktrace +using RecursiveArrayTools: RecursiveArrayTools, copyat_or_push!, recursivefill! +using FastBroadcast: FastBroadcast, @.. +using MuladdMacro: MuladdMacro, @muladd +using DiffEqBase: DiffEqBase import LinearAlgebra: norm import OrdinaryDiffEqCore +using SciMLBase: SciMLBase -using Reexport +using Reexport: Reexport, @reexport @reexport using SciMLBase include("algorithms.jl") include("alg_utils.jl") diff --git a/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl b/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl index 9d1739ffe5f..ceaf2a66f52 100644 --- a/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl @@ -3,5 +3,33 @@ using SciMLTesting, OrdinaryDiffEqExplicitRK, Test run_qa( OrdinaryDiffEqExplicitRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # Names imported from OrdinaryDiffEqCore/DiffEqBase/TruncatedStacktraces that are + # genuinely internal (not exported, not `public`) in their owner module. These are + # the solver-internal extension points OrdinaryDiffEqExplicitRK must hook into; + # there is no public alternative. Tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + :alg_adaptive_order, :alg_stability_size, :alg_cache, :unwrap_alg, + :isfsal, :perform_step!, :get_fsalfirstlast, + :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqConstantCache, + :OrdinaryDiffEqMutableCache, :CompositeAlgorithm, + :DerivativeOrderNotPossibleError, + :_ode_interpolant, :_ode_interpolant!, :_ode_addsteps!, + Symbol("@cache"), + :calculate_residuals, :calculate_residuals!, + Symbol("@truncate_stacktrace"), + ), + ), + # Qualified accesses of solver-internal OrdinaryDiffEqCore names plus the Base + # cartesian-loop macros. None are public; no public alternative exists. + all_qualified_accesses_are_public = (; + ignore = ( + :increment_nf!, :set_EEst!, + :hermite_interpolant, :hermite_interpolant!, + :interpolation_differential_vars, + Symbol("@nexprs"), Symbol("@nif"), + ), + ), + ), ) From 14d802d2a5020bf93410ea8505564900534d3672 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:12:19 -0400 Subject: [PATCH 011/108] OrdinaryDiffEqLowStorageRK: minimize EI exceptions Drop blanket ei_broken (5 checks) for tight documented ignore lists. Make implicit imports explicit, remove stale imports, and import now-public names from their true public owners (alg_order<-SciMLBase, initialize!<-DiffEqBase). Residual ignores are non-public internals of OrdinaryDiffEqCore/DiffEqBase/Base only (see #3776). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqLowStorageRK/Project.toml | 2 ++ .../src/OrdinaryDiffEqLowStorageRK.jl | 33 ++++++++++--------- lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl | 28 +++++++++++++++- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/lib/OrdinaryDiffEqLowStorageRK/Project.toml b/lib/OrdinaryDiffEqLowStorageRK/Project.toml index d1ba47fdc6c..b8ec27ddd85 100644 --- a/lib/OrdinaryDiffEqLowStorageRK/Project.toml +++ b/lib/OrdinaryDiffEqLowStorageRK/Project.toml @@ -4,6 +4,7 @@ authors = ["ParamThakkar123 "] version = "3.1.1" [deps] +CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" MuladdMacro = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a" @@ -30,6 +31,7 @@ DiffEqBase = {path = "../DiffEqBase"} DiffEqDevTools = {path = "../DiffEqDevTools"} [compat] +CommonSolve = "0.2.4" Pkg = "1" Test = "<0.0.1, 1" FastBroadcast = "1.3" diff --git a/lib/OrdinaryDiffEqLowStorageRK/src/OrdinaryDiffEqLowStorageRK.jl b/lib/OrdinaryDiffEqLowStorageRK/src/OrdinaryDiffEqLowStorageRK.jl index 82d338344b2..001684119da 100644 --- a/lib/OrdinaryDiffEqLowStorageRK/src/OrdinaryDiffEqLowStorageRK.jl +++ b/lib/OrdinaryDiffEqLowStorageRK/src/OrdinaryDiffEqLowStorageRK.jl @@ -1,26 +1,29 @@ module OrdinaryDiffEqLowStorageRK -import OrdinaryDiffEqCore: alg_order, alg_adaptive_order, calculate_residuals!, - beta2_default, beta1_default, gamma_default, - initialize!, perform_step!, unwrap_alg, - calculate_residuals, ssp_coefficient, +import OrdinaryDiffEqCore: perform_step!, OrdinaryDiffEqAlgorithm, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, OrdinaryDiffEqAdaptiveAlgorithm, uses_uprev, PIDController, - alg_cache, _vec, _reshape, @cache, isfsal, full_cache, - constvalue, _unwrap_val, - trivial_limiter!, perform_step!, initialize!, - explicit_rk_docstring, get_fsalfirstlast -using FastBroadcast, MuladdMacro, RecursiveArrayTools, Adapt -using FastBroadcast: Serial -import RecursiveArrayTools: recursive_unitless_bottom_eltype + alg_cache, @cache, isfsal, full_cache, + constvalue, + trivial_limiter!, + explicit_rk_docstring, get_fsalfirstlast, + default_controller import OrdinaryDiffEqCore - -import OrdinaryDiffEqCore: default_controller - -using Reexport +# `alg_order` is owned by and public in SciMLBase; `initialize!` is owned by and +# public in DiffEqBase. Import from the true public owners (not re-exporters). +import SciMLBase: alg_order +import DiffEqBase: initialize!, calculate_residuals, calculate_residuals! +using FastBroadcast: FastBroadcast, @.., Serial +using MuladdMacro: MuladdMacro, @muladd +using RecursiveArrayTools: RecursiveArrayTools, recursivefill! +using Adapt: Adapt, adapt +using CommonSolve: solve + +using Reexport: Reexport, @reexport @reexport using SciMLBase +using SciMLBase: SciMLBase, ODEProblem include("arrayfuse.jl") include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl b/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl index 87861c5cbd5..ebabf7a97eb 100644 --- a/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl @@ -3,5 +3,31 @@ using SciMLTesting, OrdinaryDiffEqLowStorageRK, Test run_qa( OrdinaryDiffEqLowStorageRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + # All residual names below are non-public internals of their owning + # package. They are imported/accessed from their true owner; the only + # thing left is that those owners have not yet declared them `public`. + # See SciML/OrdinaryDiffEq.jl#3776. + all_qualified_accesses_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internal stats accessors / precompile probes + :increment_nf!, :set_EEst!, :lorenz, :lorenz_oop, + # SciMLBase specialization markers (used in @compile_workload) + :FunctionWrapperSpecialize, :NoSpecialize, + # Base.Broadcast internals used in ArrayFuse copyto!/materialize! + :Broadcasted, :materialize!, + )), + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore solver-interface internals + Symbol("@cache"), :alg_cache, :perform_step!, :constvalue, + :trivial_limiter!, :get_fsalfirstlast, :explicit_rk_docstring, + :default_controller, :PIDController, :isfsal, :uses_uprev, + :full_cache, + :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqAdaptiveAlgorithm, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + # DiffEqBase residual-calculation internals + :calculate_residuals, :calculate_residuals!, + )), + ), ) From 22e2c69a54ca11f7ee399730e51d1f1f5a4c5a8c Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:12:11 -0400 Subject: [PATCH 012/108] ImplicitDiscreteSolve: minimize EI exceptions (drop blanket ei_broken) Replace the blanket 5-check `ei_broken` in lib/ImplicitDiscreteSolve QA with real EI fixes plus tight, documented per-name ignore lists for the residual non-public internals. - Import public names from their owners: SciMLBase (alg_order, isadaptive, OverrideInit, problem/function types, ReturnCode, isinplace), DiffEqBase (DefaultInit, initialize!), CommonSolve (init, solve, step!), NonlinearSolveFirstOrder (NewtonRaphson). Make formerly-implicit exported names explicit; drop stale imports (@.., @muladd, BrownFullBasicInit, OrdinaryDiffEqConstantCache, _unwrap_val, parameter_symbols). - Add CommonSolve as a direct dep (init/solve/step! owner). - Remaining ignores are genuine OrdinaryDiffEqCore solver-interface internals (alg_cache/perform_step!/controller generics/abstract cache+controller types) and NonlinearSolveBase/SciMLBase non-public accessors, tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. All 6 ExplicitImports checks now pass; QA group 16/16 on Julia 1.12 against released SciMLTesting 1.7.0 / SciMLBase 3.30.0. Co-Authored-By: Chris Rackauckas --- lib/ImplicitDiscreteSolve/Project.toml | 2 ++ .../src/ImplicitDiscreteSolve.jl | 28 ++++++++++--------- lib/ImplicitDiscreteSolve/test/qa/qa.jl | 28 ++++++++++++++++++- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/lib/ImplicitDiscreteSolve/Project.toml b/lib/ImplicitDiscreteSolve/Project.toml index 0ae69fd8d28..d53a7e823f5 100644 --- a/lib/ImplicitDiscreteSolve/Project.toml +++ b/lib/ImplicitDiscreteSolve/Project.toml @@ -4,6 +4,7 @@ authors = ["vyudu "] version = "2.1.2" [deps] +CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" NonlinearSolveBase = "be0214bd-f91f-a760-ac4e-3421ce2b2da0" NonlinearSolveFirstOrder = "5959db7a-ea39-4486-b5fe-2dd0bf03d60d" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" @@ -23,6 +24,7 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" DiffEqBase = {path = "../DiffEqBase"} [compat] +CommonSolve = "0.2.4" Pkg = "1" Test = "1.10.0" NonlinearSolveBase = "2.23.0" diff --git a/lib/ImplicitDiscreteSolve/src/ImplicitDiscreteSolve.jl b/lib/ImplicitDiscreteSolve/src/ImplicitDiscreteSolve.jl index 3df38212c69..bf619dda139 100644 --- a/lib/ImplicitDiscreteSolve/src/ImplicitDiscreteSolve.jl +++ b/lib/ImplicitDiscreteSolve/src/ImplicitDiscreteSolve.jl @@ -1,19 +1,21 @@ module ImplicitDiscreteSolve -using SciMLBase -using NonlinearSolveBase -using NonlinearSolveFirstOrder -using SymbolicIndexingInterface: parameter_symbols -import OrdinaryDiffEqCore: OrdinaryDiffEqAlgorithm, alg_cache, OrdinaryDiffEqMutableCache, - OrdinaryDiffEqConstantCache, get_fsalfirstlast, isfsal, - initialize!, perform_step!, isdiscretecache, isdiscretealg, - alg_order, beta2_default, beta1_default, dt_required, - _initialize_dae!, DefaultInit, BrownFullBasicInit, OverrideInit, - @muladd, @.., _unwrap_val, OrdinaryDiffEqCore, isadaptive, - allows_null_u0, - AbstractController, AbstractControllerCache +using SciMLBase: SciMLBase, ImplicitDiscreteProblem, NonlinearFunction, + NonlinearLeastSquaresProblem, NonlinearProblem, ReturnCode, isinplace, + OverrideInit +import SciMLBase: alg_order, isadaptive +using NonlinearSolveBase: NonlinearSolveBase +using NonlinearSolveFirstOrder: NewtonRaphson +using CommonSolve: init, solve, step! +using DiffEqBase: DefaultInit +import DiffEqBase: initialize! +using OrdinaryDiffEqCore: OrdinaryDiffEqCore, OrdinaryDiffEqAlgorithm, + OrdinaryDiffEqMutableCache, AbstractController, AbstractControllerCache +import OrdinaryDiffEqCore: alg_cache, get_fsalfirstlast, isfsal, perform_step!, + isdiscretecache, isdiscretealg, beta2_default, beta1_default, dt_required, + _initialize_dae!, allows_null_u0 -using Reexport +using Reexport: Reexport, @reexport @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/ImplicitDiscreteSolve/test/qa/qa.jl b/lib/ImplicitDiscreteSolve/test/qa/qa.jl index fc2ccb33812..1c3c8127cd9 100644 --- a/lib/ImplicitDiscreteSolve/test/qa/qa.jl +++ b/lib/ImplicitDiscreteSolve/test/qa/qa.jl @@ -4,5 +4,31 @@ run_qa( ImplicitDiscreteSolve; aqua_kwargs = (; piracies = false), explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # Non-public OrdinaryDiffEqCore internals we extend/dispatch on. These are + # the solver-interface generics and abstract types that OrdinaryDiffEqCore + # has not (yet) marked `public`; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqMutableCache, :alg_cache, + :get_fsalfirstlast, :isfsal, :perform_step!, :isdiscretecache, + :isdiscretealg, :beta2_default, :beta1_default, :dt_required, + :_initialize_dae!, :allows_null_u0, :AbstractController, + :AbstractControllerCache, + ), + ), + # Non-public names accessed by qualification: the OrdinaryDiffEqCore + # controller interface, NonlinearSolveBase solver internals, and + # SciMLBase.has_initializeprob. Same make-public tracking as above. + all_qualified_accesses_are_public = (; + ignore = ( + :CommonControllerOptions, :_resolved_QT, :accept_step_controller, + :default_controller, :resolve_basic, :setup_controller_cache, + :step_accept_controller!, :step_reject_controller!, + :stepsize_controller!, :sync_controllers!, + :get_fu, :get_u, :not_terminated, :update_from_termination_cache!, + :update_trace!, :has_initializeprob, + ), + ), + ), ) From 5a9cc218a0dde92fff195843473ec8fb2067f837 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:12:35 -0400 Subject: [PATCH 013/108] Minimize EI exceptions for OrdinaryDiffEqLinear Convert blanket ei_broken (5 checks) to targeted source fixes plus tight documented ignore lists: - Import alg_order from SciMLBase and initialize! from DiffEqBase (now public in their owner modules) instead of OrdinaryDiffEqCore re-exports. - Import _vec from SciMLBase and calculate_residuals! from DiffEqBase (their owners) to satisfy all_explicit_imports_via_owners. - Remove stale OrdinaryDiffEqExponentialAlgorithm import. - Make implicit imports explicit (ExponentialUtilities, RecursiveArrayTools, SciMLOperators update_coefficients(!), SciMLBase SplitFunction, Reexport). - Residual non-public upstream internals are tightly listed in all_explicit_imports_are_public / all_qualified_accesses_are_public ignore lists with per-name documentation (no blanket ei_broken). QA EI green on Julia 1.12 (17/17), package still solves (LieEuler, MagnusGauss4 -> Success). Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqLinear.jl | 22 ++++++++------ lib/OrdinaryDiffEqLinear/test/qa/qa.jl | 30 ++++++++++++++++++- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/lib/OrdinaryDiffEqLinear/src/OrdinaryDiffEqLinear.jl b/lib/OrdinaryDiffEqLinear/src/OrdinaryDiffEqLinear.jl index 986c0ef4ddc..44d6f1f7086 100644 --- a/lib/OrdinaryDiffEqLinear/src/OrdinaryDiffEqLinear.jl +++ b/lib/OrdinaryDiffEqLinear/src/OrdinaryDiffEqLinear.jl @@ -1,24 +1,28 @@ module OrdinaryDiffEqLinear -import OrdinaryDiffEqCore: alg_order, alg_extrapolates, dt_required, +import OrdinaryDiffEqCore: alg_extrapolates, dt_required, OrdinaryDiffEqLinearExponentialAlgorithm, OrdinaryDiffEqAdaptiveAlgorithm, OrdinaryDiffEqAlgorithm, - OrdinaryDiffEqExponentialAlgorithm, OrdinaryDiffEqMutableCache, @cache, alg_cache, OrdinaryDiffEqConstantCache, - initialize!, perform_step!, unwrap_alg, - calculate_residuals!, get_fsalfirstlast, - _vec, isdtchangeable, full_cache, + perform_step!, unwrap_alg, + get_fsalfirstlast, + isdtchangeable, full_cache, generic_solver_docstring using LinearAlgebra: mul!, I -using SciMLOperators: AbstractSciMLOperator -using ExponentialUtilities -using RecursiveArrayTools +using SciMLOperators: AbstractSciMLOperator, update_coefficients, update_coefficients! +using ExponentialUtilities: ExponentialUtilities, ExpMethodGeneric, ExpvCache, + KrylovSubspace, PhivCache, arnoldi!, exponential!, + expv, expv!, expv_timestep, expv_timestep! +using RecursiveArrayTools: recursivefill! import OrdinaryDiffEqCore import DiffEqBase +import DiffEqBase: calculate_residuals!, initialize! +import SciMLBase: alg_order, _vec -using Reexport +using Reexport: Reexport, @reexport @reexport using SciMLBase +using SciMLBase: SciMLBase, SciMLOperators, SplitFunction include("algorithms.jl") include("alg_utils.jl") diff --git a/lib/OrdinaryDiffEqLinear/test/qa/qa.jl b/lib/OrdinaryDiffEqLinear/test/qa/qa.jl index 1d49dacb6b8..3077bbd8fe4 100644 --- a/lib/OrdinaryDiffEqLinear/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqLinear/test/qa/qa.jl @@ -3,5 +3,33 @@ using SciMLTesting, OrdinaryDiffEqLinear, Test run_qa( OrdinaryDiffEqLinear; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # All residual names below are non-public internals of upstream packages + # that have no public-API replacement yet; they are tightly listed (not + # blanket ei_broken) and feed the next make-public round (see SciML/OrdinaryDiffEq.jl#3776). + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internal solver-interface API (no public surface yet) + Symbol("@cache"), :OrdinaryDiffEqAdaptiveAlgorithm, + :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqConstantCache, + :OrdinaryDiffEqLinearExponentialAlgorithm, :OrdinaryDiffEqMutableCache, + :alg_cache, :alg_extrapolates, :dt_required, :generic_solver_docstring, + :get_fsalfirstlast, :isdtchangeable, :perform_step!, :unwrap_alg, + # DiffEqBase internal (owner of calculate_residuals!), non-public + :calculate_residuals!, + # SciMLBase internal (owner of _vec), non-public + :_vec, + # SciMLOperators internal abstract type, non-public + :AbstractSciMLOperator, + ), + ), + all_qualified_accesses_are_public = (; + ignore = ( + :alloc_mem, # ExponentialUtilities internal cache allocator + :increment_nf!, # OrdinaryDiffEqCore internal stats mutator + :set_EEst!, # OrdinaryDiffEqCore internal error-estimate setter + :prepare_alg, # DiffEqBase internal algorithm-preparation hook + ), + ), + ), ) From 75de87e512388aa756aa4aa24572f61be3584044 Mon Sep 17 00:00:00 2001 From: Chris Rackauckas Date: Mon, 29 Jun 2026 12:17:07 -0400 Subject: [PATCH 014/108] Minimize EI exceptions for OrdinaryDiffEqIMEXMultistep Replace the blanket 5-check ei_broken with targeted fixes plus tight, documented per-check ignore lists for genuinely-internal non-public names: - Import alg_order and _unwrap_val from their owner SciMLBase (alg_order is public there); import initialize! from its owner DiffEqBase (public). - Drop stale imports: @SciMLMessage, _ad_chunksize_int, _ad_fdtype (ADTypes AbstractADType), and dolinsolve (OrdinaryDiffEqDifferentiation). - Make FastBroadcast (@..) and Reexport (@reexport) explicit imports. - Ignore only SciMLBase (intended @reexport implicit), increment_nf! (OrdinaryDiffEqCore-internal), and the OrdinaryDiffEqCore / OrdinaryDiffEqNonlinearSolve / SciMLBase internal solver building blocks that are not yet declared public. Verified GROUP=QA run_qa on Julia 1.12: Quality Assurance 17/17 pass. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqIMEXMultistep.jl | 17 +++++++------- lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl | 22 ++++++++++++++++++- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/lib/OrdinaryDiffEqIMEXMultistep/src/OrdinaryDiffEqIMEXMultistep.jl b/lib/OrdinaryDiffEqIMEXMultistep/src/OrdinaryDiffEqIMEXMultistep.jl index 4704424e650..381f53f329f 100644 --- a/lib/OrdinaryDiffEqIMEXMultistep/src/OrdinaryDiffEqIMEXMultistep.jl +++ b/lib/OrdinaryDiffEqIMEXMultistep/src/OrdinaryDiffEqIMEXMultistep.jl @@ -1,20 +1,21 @@ module OrdinaryDiffEqIMEXMultistep -import OrdinaryDiffEqCore: alg_order, issplit, OrdinaryDiffEqNewtonAlgorithm, _unwrap_val, +import OrdinaryDiffEqCore: issplit, OrdinaryDiffEqNewtonAlgorithm, OrdinaryDiffEqConstantCache, OrdinaryDiffEqMutableCache, - @cache, alg_cache, initialize!, perform_step!, - full_cache, get_fsalfirstlast, @SciMLMessage, - generic_solver_docstring, _ad_chunksize_int, _ad_fdtype, _fixup_ad + @cache, alg_cache, perform_step!, + full_cache, get_fsalfirstlast, + generic_solver_docstring, _fixup_ad +import SciMLBase: alg_order, _unwrap_val +import DiffEqBase: initialize! -using FastBroadcast +using FastBroadcast: @.. import OrdinaryDiffEqCore -using OrdinaryDiffEqDifferentiation: dolinsolve using OrdinaryDiffEqNonlinearSolve: NLNewton, build_nlsolver, markfirststage!, nlsolve!, nlsolvefail, du_alias_or_new -import ADTypes: AutoForwardDiff, AbstractADType +import ADTypes: AutoForwardDiff -using Reexport +using Reexport: @reexport @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl index b41ab4bf30e..519f3bfe72b 100644 --- a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl @@ -3,5 +3,25 @@ using SciMLTesting, OrdinaryDiffEqIMEXMultistep, Test run_qa( OrdinaryDiffEqIMEXMultistep; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # `@reexport using SciMLBase` brings the `SciMLBase` module name into scope + # implicitly; this is the intended SciML re-export pattern, not a stray import. + no_implicit_imports = (; ignore = (:SciMLBase,)), + # `OrdinaryDiffEqCore.increment_nf!` is a solver-internal stats helper that is + # not (yet) declared public in OrdinaryDiffEqCore. + all_qualified_accesses_are_public = (; ignore = (:increment_nf!,)), + # Solver-internal building blocks imported from their owning packages but not + # (yet) declared public there: OrdinaryDiffEqCore cache/algorithm/dispatch + # internals, OrdinaryDiffEqNonlinearSolve nlsolver internals, and the + # SciMLBase-internal `_unwrap_val`. + all_explicit_imports_are_public = (; + ignore = ( + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + :OrdinaryDiffEqNewtonAlgorithm, Symbol("@cache"), :alg_cache, + :perform_step!, :get_fsalfirstlast, :generic_solver_docstring, + :issplit, :_fixup_ad, :_unwrap_val, + :NLNewton, :build_nlsolver, :markfirststage!, :nlsolve!, + :nlsolvefail, :du_alias_or_new, + )), + ), ) From 1f230dff72bdf9715606aaabb71d31736c046912 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:17:20 -0400 Subject: [PATCH 015/108] Minimize EI exceptions for OrdinaryDiffEqExtrapolation Drop the blanket 5-entry `ei_broken` in lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl. All four non-public checks besides the two public-API ones now pass cleanly: - no_implicit_imports: make implicit imports explicit (FastBroadcast/@.., MuladdMacro/@muladd, RecursiveArrayTools/recursivefill!, LinearSolve/RFLUFactorization, Reexport/@reexport, SciMLBase/LinearProblem+init, SciMLOperators/WOperator, SciMLLogging/@SciMLMessage). - no_stale_explicit_imports: remove unused imports (AbstractADType, BaseThreads, Minimal, Sequential, _ad_chunksize_int, _ad_fdtype, _digest_beta1_beta2, isadaptive, qmax_default). - all_explicit_imports_via_owners: import names from their true owner module (alg_order/_unwrap_val/_reshape/_vec/the Time*/U*Wrapper types from SciMLBase; initialize!/calculate_residuals[!]/timedepentdtmin from DiffEqBase; WOperator from SciMLOperators; @SciMLMessage from SciMLLogging). Add SciMLLogging and SciMLOperators as direct deps + compat. The remaining exceptions are genuinely-internal (non-`public`) upstream names with no public replacement yet, narrowed to two tight documented `ignore` lists on the public-API checks only. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqExtrapolation/Project.toml | 4 ++ .../src/OrdinaryDiffEqExtrapolation.jl | 51 +++++++++++-------- lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl | 44 +++++++++++++++- 3 files changed, 78 insertions(+), 21 deletions(-) diff --git a/lib/OrdinaryDiffEqExtrapolation/Project.toml b/lib/OrdinaryDiffEqExtrapolation/Project.toml index 92bcfdee0ab..3c3b80405b5 100644 --- a/lib/OrdinaryDiffEqExtrapolation/Project.toml +++ b/lib/OrdinaryDiffEqExtrapolation/Project.toml @@ -15,6 +15,8 @@ RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" FastPower = "a4df4552-cc26-4903-aec0-212e50a0e84b" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" +SciMLLogging = "a6db7da4-7206-11f0-1eab-35f2a5dbe1d1" +SciMLOperators = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" [extras] Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" @@ -49,6 +51,8 @@ DiffEqBase = "7" Polyester = "0.7" Reexport = "1.2.2" SafeTestsets = "0.1.0" +SciMLLogging = "2" +SciMLOperators = "1" [targets] test = ["DiffEqDevTools", "Polyester", "Random", "RecursiveFactorization", "SafeTestsets", "Test", "Pkg"] diff --git a/lib/OrdinaryDiffEqExtrapolation/src/OrdinaryDiffEqExtrapolation.jl b/lib/OrdinaryDiffEqExtrapolation/src/OrdinaryDiffEqExtrapolation.jl index 461afd780bd..805e48c926f 100644 --- a/lib/OrdinaryDiffEqExtrapolation/src/OrdinaryDiffEqExtrapolation.jl +++ b/lib/OrdinaryDiffEqExtrapolation/src/OrdinaryDiffEqExtrapolation.jl @@ -1,39 +1,50 @@ module OrdinaryDiffEqExtrapolation -import OrdinaryDiffEqCore: alg_order, alg_maximum_order, get_current_adaptive_order, - get_current_alg_order, calculate_residuals!, +import OrdinaryDiffEqCore: alg_maximum_order, get_current_adaptive_order, + get_current_alg_order, accept_step_controller, beta2_default, beta1_default, gamma_default, - initialize!, perform_step!, @cache, unwrap_alg, - isthreaded, isadaptive, PIController, - step_accept_controller!, calculate_residuals, + perform_step!, @cache, unwrap_alg, + isthreaded, PIController, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, reset_alg_dependent_opts!, AbstractController, step_accept_controller!, step_reject_controller!, OrdinaryDiffEqAdaptiveAlgorithm, OrdinaryDiffEqAdaptiveImplicitAlgorithm, alg_cache, CompiledFloats, @threaded, stepsize_controller!, - full_cache, qmin_default, qmax_default, - constvalue, PolyesterThreads, Sequential, BaseThreads, - _digest_beta1_beta2, timedepentdtmin, _unwrap_val, - _reshape, _vec, get_fsalfirstlast, generic_solver_docstring, - differentiation_rk_docstring, _ad_chunksize_int, _ad_fdtype, _fixup_ad, - LinearAliasSpecifier, @SciMLMessage, Minimal - -using FastBroadcast, MuladdMacro, RecursiveArrayTools, LinearSolve + full_cache, qmin_default, + constvalue, PolyesterThreads, + _fixup_ad, + get_fsalfirstlast, generic_solver_docstring, + differentiation_rk_docstring, + LinearAliasSpecifier +import OrdinaryDiffEqCore: default_controller, AbstractControllerCache, setup_controller_cache, + get_qmin, get_qmax import OrdinaryDiffEqCore + +# Owned by SciMLBase / DiffEqBase / SciMLOperators, re-exported through +# OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation — import from the owners directly so +# ExplicitImports' owner check is satisfied. +import SciMLBase: alg_order, _unwrap_val, _reshape, _vec, + TimeDerivativeWrapper, UDerivativeWrapper, + TimeGradientWrapper, UJacobianWrapper +import DiffEqBase: initialize!, calculate_residuals, calculate_residuals!, timedepentdtmin + +using FastBroadcast: FastBroadcast, @.. +using MuladdMacro: MuladdMacro, @muladd +using RecursiveArrayTools: RecursiveArrayTools, recursivefill! +using LinearSolve: LinearSolve, RFLUFactorization import FastPower -import OrdinaryDiffEqDifferentiation: TimeDerivativeWrapper, UDerivativeWrapper, calc_J, - WOperator, TimeGradientWrapper, UJacobianWrapper, +using SciMLOperators: SciMLOperators, WOperator +import SciMLLogging: @SciMLMessage +import OrdinaryDiffEqDifferentiation: calc_J, build_grad_config, build_jac_config, calc_J!, jacobian2W!, dolinsolve -import ADTypes: AutoForwardDiff, AbstractADType - -import OrdinaryDiffEqCore: default_controller, AbstractControllerCache, setup_controller_cache, - get_qmin, get_qmax +import ADTypes: AutoForwardDiff -using Reexport +using Reexport: Reexport, @reexport @reexport using SciMLBase +using SciMLBase: SciMLBase, LinearProblem, init include("algorithms.jl") include("alg_utils.jl") diff --git a/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl b/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl index 81942e405f7..32bdd518cc6 100644 --- a/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl @@ -1,7 +1,49 @@ using SciMLTesting, OrdinaryDiffEqExtrapolation, Test +# The only remaining ExplicitImports exceptions are genuinely-internal (non-`public`) +# names of upstream SciML packages that have no public replacement yet. They are +# imported/accessed from their true owner module, so only the two public-API checks +# still flag them; everything else (implicit imports, stale imports, owner) is clean. +# Each name below is tracked for a future make-public pass; see SciML/OrdinaryDiffEq.jl#3776. run_qa( OrdinaryDiffEqExtrapolation; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internals (solver/cache/controller interface) + Symbol("@cache"), Symbol("@threaded"), + :AbstractController, :AbstractControllerCache, :CompiledFloats, + :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqAdaptiveImplicitAlgorithm, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + :PIController, :PolyesterThreads, :_fixup_ad, :accept_step_controller, + :alg_cache, :alg_maximum_order, :beta1_default, :beta2_default, + :constvalue, :default_controller, :differentiation_rk_docstring, + :gamma_default, :generic_solver_docstring, :get_current_adaptive_order, + :get_current_alg_order, :get_fsalfirstlast, :get_qmax, :get_qmin, + :isthreaded, :perform_step!, :qmin_default, :reset_alg_dependent_opts!, + :setup_controller_cache, :step_accept_controller!, :step_reject_controller!, + :stepsize_controller!, :unwrap_alg, + # OrdinaryDiffEqDifferentiation internals (Jacobian/W construction) + :build_grad_config, :build_jac_config, :calc_J, :calc_J!, + :dolinsolve, :jacobian2W!, + # SciMLBase internals (derivative/jacobian wrappers, reshaping helpers) + :TimeDerivativeWrapper, :TimeGradientWrapper, :UDerivativeWrapper, + :UJacobianWrapper, :_reshape, :_unwrap_val, :_vec, + # DiffEqBase internals (residual/dt-floor helpers) + :calculate_residuals, :calculate_residuals!, :timedepentdtmin, + ), + ), + all_qualified_accesses_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internals accessed via qualified `OrdinaryDiffEqCore.x` + :CommonControllerOptions, :_resolved_QT, :get_EEst, :increment_nf!, + :resolve_basic, :set_EEst!, :sync_controllers!, + # other upstream internals + :fastpower, # FastPower + :has_Wfact, # SciMLBase + :maxthreadid, # Base.Threads + ), + ), + ), ) From 3848b3de0c23eaf340886c59508ce588c5cf74ab Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:17:35 -0400 Subject: [PATCH 016/108] OrdinaryDiffEqDifferentiation: minimize EI exceptions in QA Replace the blanket `ei_broken` suppression of all five ExplicitImports checks with concrete, documented per-check ignore lists, and fix the import header so the now-resolvable findings disappear: - Remove 38 stale (unused) explicit imports. - Import `_vec`, `_unwrap_val`, `UDerivativeWrapper`, `UJacobianWrapper` from their owner SciMLBase (OrdinaryDiffEqCore/DiffEqBase only re-export them), satisfying `all_explicit_imports_via_owners` for those names. - Tighten the residual ignores to exactly the genuinely non-public / non-owner re-exported names this sublibrary relies on (OrdinaryDiffEqCore solver internals, SciMLBase Jacobian-interface predicates, LinearSolve / ForwardDiff / DifferentiationInterface internals, the sublib's own sparse-extension API, and the Accessors `@set` / SciMLLogging `@SciMLMessage` macros). All six EI checks now run hard (no `ei_broken`). Verified GROUP=QA on Julia 1.12 against released SciMLTesting 1.7.0: Quality Assurance 15/15. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqDifferentiation.jl | 35 +++++------ .../test/qa/qa.jl | 60 ++++++++++++++++++- 2 files changed, 73 insertions(+), 22 deletions(-) diff --git a/lib/OrdinaryDiffEqDifferentiation/src/OrdinaryDiffEqDifferentiation.jl b/lib/OrdinaryDiffEqDifferentiation/src/OrdinaryDiffEqDifferentiation.jl index 5eba9a5d03b..61fcd696ca7 100644 --- a/lib/OrdinaryDiffEqDifferentiation/src/OrdinaryDiffEqDifferentiation.jl +++ b/lib/OrdinaryDiffEqDifferentiation/src/OrdinaryDiffEqDifferentiation.jl @@ -11,19 +11,18 @@ import FunctionWrappersWrappers import DiffEqBase import LinearAlgebra -import LinearAlgebra: Diagonal, I, UniformScaling, diagind, mul!, lmul!, axpby!, opnorm, lu -import LinearAlgebra: LowerTriangular, UpperTriangular +import LinearAlgebra: Diagonal, I, UniformScaling, diagind, opnorm +import LinearAlgebra: LowerTriangular import ArrayInterface -import ArrayInterface: fast_scalar_indexing, zeromatrix, lu_instance import StaticArraysCore: StaticArray, StaticMatrix -using DiffEqBase: TimeGradientWrapper, - UJacobianWrapper, TimeDerivativeWrapper, - UDerivativeWrapper -import SciMLBase: SciMLBase, constructorof, @set, isinplace, has_jvp, unwrapped_f, DEIntegrator, ODEFunction, SplitFunction, DynamicalODEFunction, DAEFunction, islinear, remake, solve!, isconstant -using SciMLBase: @set, @reset -import SciMLOperators: SciMLOperators, IdentityOperator, update_coefficients, update_coefficients!, MatrixOperator, AbstractSciMLOperator, ScalarOperator +# `_vec`, `_unwrap_val`, `UDerivativeWrapper`, `UJacobianWrapper` are owned by +# SciMLBase (OrdinaryDiffEqCore/DiffEqBase only re-export them), so import them +# from the owner to satisfy `all_explicit_imports_via_owners`. +using SciMLBase: UJacobianWrapper, UDerivativeWrapper, _vec, _unwrap_val +import SciMLBase: SciMLBase, @set, DEIntegrator, ODEFunction, SplitFunction, DAEFunction, islinear, remake, solve!, isconstant +import SciMLOperators: SciMLOperators, update_coefficients, update_coefficients!, MatrixOperator, AbstractSciMLOperator import SparseMatrixColorings: ConstantColoringAlgorithm, GreedyColoringAlgorithm, ColoringProblem, ncolors, column_colors, coloring, sparsity_pattern import OrdinaryDiffEqCore @@ -32,24 +31,18 @@ using OrdinaryDiffEqCore: OrdinaryDiffEqAlgorithm, OrdinaryDiffEqAdaptiveImplici OrdinaryDiffEqImplicitAlgorithm, CompositeAlgorithm, OrdinaryDiffEqExponentialAlgorithm, OrdinaryDiffEqAdaptiveExponentialAlgorithm, - StochasticDiffEqNewtonAlgorithm, StochasticDiffEqNewtonAdaptiveAlgorithm, - StochasticDiffEqJumpNewtonAdaptiveAlgorithm, - StochasticDiffEqJumpNewtonDiffusionAdaptiveAlgorithm, AbstractNLSolver, nlsolve_f, issplit, - concrete_jac, unwrap_alg, OrdinaryDiffEqCache, _vec, standardtag, - isnewton, _unwrap_val, - set_new_W!, set_W_γdt!, alg_difftype, unwrap_cache, diffdir, + concrete_jac, unwrap_alg, OrdinaryDiffEqCache, + isnewton, + set_new_W!, set_W_γdt!, diffdir, get_W, isfirstcall, isfirststage, isJcurrent, get_new_W_γdt_cutoff, isWmethod, - TryAgain, DIRK, COEFFICIENT_MULTISTEP, NORDSIECK_MULTISTEP, GLM, - FastConvergence, Convergence, SlowConvergence, - VerySlowConvergence, Divergence, NLStatus, MethodType, constvalue, @SciMLMessage + TryAgain, + Divergence, constvalue, @SciMLMessage -import OrdinaryDiffEqCore: get_chunksize, resize_J_W!, resize_nlsolver!, alg_autodiff, - _get_fwd_tag +import OrdinaryDiffEqCore: get_chunksize, resize_J_W!, alg_autodiff import ConstructionBase -using ConstructionBase: constructorof import DifferentiationInterface as DI diff --git a/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl b/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl index 251f8bac902..cef508f47f7 100644 --- a/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl @@ -1,8 +1,66 @@ using SciMLTesting, OrdinaryDiffEqDifferentiation, Test +# Residual ExplicitImports ignores: every name below is a genuinely non-public +# (or non-owner re-exported) symbol of another package that this differentiation +# sublibrary legitimately relies on. The OrdinaryDiffEqCore / SciMLBase / DiffEqBase +# entries are the internal solver/W-matrix/Jacobian-interface API that the sublib is +# built against and are make-public candidates upstream (tracked in SciML/OrdinaryDiffEq.jl#3776). run_qa( OrdinaryDiffEqDifferentiation; aqua_kwargs = (; piracies = false, ambiguities = false), explicit_imports = true, - ei_broken = (:no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # `@set` (Accessors) and `@SciMLMessage` (SciMLLogging) are re-exported by + # SciMLBase / OrdinaryDiffEqCore; their owners are not direct deps. + all_explicit_imports_via_owners = (; ignore = (Symbol("@set"), Symbol("@SciMLMessage"))), + all_qualified_accesses_via_owners = (; ignore = (Symbol("@set"),)), + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internal solver API (make-public candidates) + :AbstractNLSolver, :alg_autodiff, :CompositeAlgorithm, :concrete_jac, + :constvalue, :DAEAlgorithm, :diffdir, :Divergence, :get_chunksize, + :get_new_W_γdt_cutoff, :get_W, :isfirstcall, :isfirststage, :isJcurrent, + :isnewton, :issplit, :isWmethod, :nlsolve_f, + :OrdinaryDiffEqAdaptiveExponentialAlgorithm, + :OrdinaryDiffEqAdaptiveImplicitAlgorithm, :OrdinaryDiffEqAlgorithm, + :OrdinaryDiffEqCache, :OrdinaryDiffEqExponentialAlgorithm, + :OrdinaryDiffEqImplicitAlgorithm, :resize_J_W!, :set_new_W!, + Symbol("set_W_γdt!"), :TryAgain, :unwrap_alg, + # SciMLBase internal wrappers / helpers (make-public candidates) + :UDerivativeWrapper, :UJacobianWrapper, :_unwrap_val, :_vec, + # other framework internals + :AbstractSciMLOperator, # SciMLOperators + :OrdinaryDiffEqTag, # DiffEqBase + :StaticArray, :StaticMatrix, # StaticArraysCore + # Accessors `@set` / SciMLLogging `@SciMLMessage` re-exported by + # SciMLBase / OrdinaryDiffEqCore (owners are not direct deps) + Symbol("@set"), Symbol("@SciMLMessage"), + ), + ), + all_qualified_accesses_are_public = (; + ignore = ( + # Base / framework internals accessed by qualification + Symbol("@pure"), # Base + Symbol("@set"), # Accessors macro re-exported by SciMLBase + :AbstractSciMLOperator, # SciMLOperators + # LinearSolve internals + :DefaultLinearSolver, :InvPreconditioner, :LinearCache, + :init_cacheval, :needs_concrete_A, + # ForwardDiff internals + :JacobianConfig, :Tag, :pickchunksize, + # OrdinaryDiffEqCore internal solver API (make-public candidates) + :_get_fwd_chunksize_int, :get_EEst, Symbol("increment_nf!"), :unwrap_alg, + # DiffEqBase internals + :default_factorize, :prepare_alg, + # SciMLBase Jacobian-interface predicates (make-public candidates) + :has_Wfact_t, :has_colorvec, :has_jac_du, :has_jac_u, + # DifferentiationInterface internals + Symbol("prepare!_derivative"), Symbol("prepare!_jacobian"), + # this sublib's own internal sparse-handling API, accessed + # qualified from OrdinaryDiffEqDifferentiationSparseArraysExt + :get_nzval, :is_sparse, :is_sparse_csc, :nonzeros, + Symbol("set_all_nzval!"), :spzeros, + ), + ), + ), ) From 78095d843fca699d61d9967f50f58bda514f58ca Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:19:51 -0400 Subject: [PATCH 017/108] Minimize EI exceptions for OrdinaryDiffEqQPRK Make implicit imports explicit (FastBroadcast/@.., MuladdMacro/@muladd, Reexport/@reexport, SciMLBase), import alg_order from SciMLBase and initialize!/calculate_residuals[!] from their DiffEqBase owner, and drop the stale full_cache import. Replace the blanket ei_broken with tight, documented ignore lists for the residual OrdinaryDiffEqCore solver-interface internals and DiffEqBase residual helpers that are not yet public. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqQPRK.jl | 16 +++++++++------- lib/OrdinaryDiffEqQPRK/test/qa/qa.jl | 18 +++++++++++++++++- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/lib/OrdinaryDiffEqQPRK/src/OrdinaryDiffEqQPRK.jl b/lib/OrdinaryDiffEqQPRK/src/OrdinaryDiffEqQPRK.jl index 8bb7de03e45..a537a1da2e8 100644 --- a/lib/OrdinaryDiffEqQPRK/src/OrdinaryDiffEqQPRK.jl +++ b/lib/OrdinaryDiffEqQPRK/src/OrdinaryDiffEqQPRK.jl @@ -3,17 +3,19 @@ module OrdinaryDiffEqQPRK import OrdinaryDiffEqCore: OrdinaryDiffEqAdaptiveAlgorithm, OrdinaryDiffEqConstantCache, explicit_rk_docstring, @cache, OrdinaryDiffEqMutableCache, - OrdinaryDiffEqAdaptiveAlgorithm, @fold, @OnDemandTableauExtract, - trivial_limiter!, alg_cache, alg_order, initialize!, + @fold, @OnDemandTableauExtract, + trivial_limiter!, alg_cache, perform_step!, get_fsalfirstlast, - constvalue, calculate_residuals!, calculate_residuals, - full_cache -using FastBroadcast: Serial -using MuladdMacro, FastBroadcast + constvalue +import SciMLBase: alg_order +import DiffEqBase: initialize!, calculate_residuals!, calculate_residuals +using FastBroadcast: FastBroadcast, Serial, @.. +using MuladdMacro: MuladdMacro, @muladd using RecursiveArrayTools: recursive_unitless_bottom_eltype, recursivefill! import OrdinaryDiffEqCore -using Reexport +using SciMLBase: SciMLBase +using Reexport: Reexport, @reexport @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl b/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl index 8a2ab83ee4c..daf2f85e13c 100644 --- a/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl @@ -3,5 +3,21 @@ using SciMLTesting, OrdinaryDiffEqQPRK, Test run_qa( OrdinaryDiffEqQPRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + # OrdinaryDiffEqCore solver-interface internals (no public owner elsewhere) plus + # DiffEqBase residual helpers that QPRK extends but are not yet marked public. + all_explicit_imports_are_public = ( + ignore = ( + :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqConstantCache, + :OrdinaryDiffEqMutableCache, :explicit_rk_docstring, :alg_cache, + :trivial_limiter!, :perform_step!, :get_fsalfirstlast, :constvalue, + Symbol("@cache"), Symbol("@fold"), Symbol("@OnDemandTableauExtract"), + :calculate_residuals, :calculate_residuals!, + ), + ), + # OrdinaryDiffEqCore step-statistics setters accessed by qualified name. + all_qualified_accesses_are_public = ( + ignore = (:increment_nf!, :set_EEst!), + ), + ), ) From 7b677876e900e66e503bb8824bfbcb084c299dd3 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:20:33 -0400 Subject: [PATCH 018/108] OrdinaryDiffEqPRK: minimize EI exceptions in run_qa Migrate now-public names to their public owners and drop the blanket ei_broken for the three EI checks: - import alg_order and full_cache from SciMLBase (public owners) - import initialize! from DiffEqBase (public owner) - make Reexport/@reexport and the SciMLBase module reference explicit so no_implicit_imports passes The remaining all_explicit_imports_are_public failures are exactly the twelve OrdinaryDiffEqCore solver-interface names with no public owner on the registered releases; narrowed to a tight documented ignore list (tracked for make-public in SciML/OrdinaryDiffEq.jl#3776) instead of a blanket ei_broken. ExplicitImports now reports 6/6 checks passing. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqPRK.jl | 12 ++++++---- lib/OrdinaryDiffEqPRK/test/qa/qa.jl | 24 ++++++++++++++++++- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/lib/OrdinaryDiffEqPRK/src/OrdinaryDiffEqPRK.jl b/lib/OrdinaryDiffEqPRK/src/OrdinaryDiffEqPRK.jl index c2d45445a51..07db7e19237 100644 --- a/lib/OrdinaryDiffEqPRK/src/OrdinaryDiffEqPRK.jl +++ b/lib/OrdinaryDiffEqPRK/src/OrdinaryDiffEqPRK.jl @@ -1,15 +1,17 @@ module OrdinaryDiffEqPRK -import OrdinaryDiffEqCore: OrdinaryDiffEqAlgorithm, alg_order, OrdinaryDiffEqMutableCache, +import OrdinaryDiffEqCore: OrdinaryDiffEqAlgorithm, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, constvalue, @cache, alg_cache, get_fsalfirstlast, - unwrap_alg, perform_step!, @threaded, initialize!, isthreaded, - full_cache, generic_solver_docstring + unwrap_alg, perform_step!, @threaded, isthreaded, + generic_solver_docstring +import SciMLBase: alg_order, full_cache +import DiffEqBase: initialize! import MuladdMacro: @muladd import FastBroadcast: @.. - -using Reexport +using Reexport: Reexport, @reexport +using SciMLBase: SciMLBase @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqPRK/test/qa/qa.jl b/lib/OrdinaryDiffEqPRK/test/qa/qa.jl index f4200af3fe4..9f8cb2eb070 100644 --- a/lib/OrdinaryDiffEqPRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqPRK/test/qa/qa.jl @@ -3,5 +3,27 @@ using SciMLTesting, OrdinaryDiffEqPRK, Test run_qa( OrdinaryDiffEqPRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # OrdinaryDiffEqCore solver-interface names imported from their owner + # module (OrdinaryDiffEqCore) but not yet declared `public`. These are + # the OrdinaryDiffEq internal extension/dispatch API; no public + # alternative exists on the registered releases. Tracked for + # make-public in SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + Symbol("@cache"), + Symbol("@threaded"), + :alg_cache, + :constvalue, + :generic_solver_docstring, + :get_fsalfirstlast, + :isthreaded, + :OrdinaryDiffEqAlgorithm, + :OrdinaryDiffEqConstantCache, + :OrdinaryDiffEqMutableCache, + :perform_step!, + :unwrap_alg, + ), + ), + ), ) From 853ec9e3bbd4065b597eae5616498626c4ca064d Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:21:32 -0400 Subject: [PATCH 019/108] OrdinaryDiffEqRKN: minimize EI exceptions in QA MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the blanket ei_broken (5 checks) with targeted fixes plus tight, documented public-API ignores: - Remove 9 stale explicit imports (_vec, _reshape, _unwrap_val, trivial_limiter!, unwrap_alg, uses_uprev, isfsal, _ode_addsteps!, OrdinaryDiffEqAdaptiveAlgorithm) — none are used in src. - Import names from their owning modules: alg_order from SciMLBase (now public there), initialize!/calculate_residuals/calculate_residuals! and @tight_loop_macros from DiffEqBase, @def from SciMLBase. - Make previously-implicit imports explicit: FastBroadcast @.., MuladdMacro @muladd, RecursiveArrayTools ArrayPartition/recursivefill!, Reexport @reexport, and the SciMLBase module binding. no_implicit_imports, no_stale_explicit_imports, and all_explicit_imports_via_owners now pass with no exceptions. The only remaining ignores are genuinely internal (non-public) solver-stack names with no public alias yet (OrdinaryDiffEqCore extension internals, DiffEqBase residual interface + @tight_loop_macros, SciMLBase @def); tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqRKN.jl | 24 ++++++++++------- lib/OrdinaryDiffEqRKN/test/qa/qa.jl | 26 ++++++++++++++++++- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/lib/OrdinaryDiffEqRKN/src/OrdinaryDiffEqRKN.jl b/lib/OrdinaryDiffEqRKN/src/OrdinaryDiffEqRKN.jl index 0816dbb63f9..4f204553584 100644 --- a/lib/OrdinaryDiffEqRKN/src/OrdinaryDiffEqRKN.jl +++ b/lib/OrdinaryDiffEqRKN/src/OrdinaryDiffEqRKN.jl @@ -1,23 +1,27 @@ module OrdinaryDiffEqRKN -import OrdinaryDiffEqCore: alg_order, calculate_residuals!, - initialize!, perform_step!, unwrap_alg, - calculate_residuals, alg_extrapolates, +import OrdinaryDiffEqCore: perform_step!, + alg_extrapolates, OrdinaryDiffEqAlgorithm, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, OrdinaryDiffEqAdaptivePartitionedAlgorithm, OrdinaryDiffEqPartitionedAlgorithm, - OrdinaryDiffEqAdaptiveAlgorithm, CompiledFloats, uses_uprev, - alg_cache, _vec, _reshape, @cache, isfsal, full_cache, - constvalue, _unwrap_val, _ode_interpolant, + CompiledFloats, + alg_cache, @cache, full_cache, + constvalue, _ode_interpolant, get_fsalfirstlast, - trivial_limiter!, _ode_interpolant!, _ode_addsteps!, + _ode_interpolant!, generic_solver_docstring -using FastBroadcast, MuladdMacro, RecursiveArrayTools -using DiffEqBase: @def, @tight_loop_macros +import SciMLBase: alg_order, @def +using SciMLBase: SciMLBase +import DiffEqBase: initialize!, calculate_residuals, calculate_residuals!, + @tight_loop_macros +using FastBroadcast: FastBroadcast, @.. +using MuladdMacro: MuladdMacro, @muladd +using RecursiveArrayTools: RecursiveArrayTools, ArrayPartition, recursivefill! import OrdinaryDiffEqCore -using Reexport +using Reexport: Reexport, @reexport @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqRKN/test/qa/qa.jl b/lib/OrdinaryDiffEqRKN/test/qa/qa.jl index 1a36d11c50e..0a47f20190e 100644 --- a/lib/OrdinaryDiffEqRKN/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqRKN/test/qa/qa.jl @@ -1,7 +1,31 @@ using SciMLTesting, OrdinaryDiffEqRKN, Test +# The only remaining EI exceptions are genuinely internal (non-public) names from +# the SciML solver stack that OrdinaryDiffEqRKN must extend/use but which have no +# public alias yet. They are owned by the modules they are imported/accessed from; +# the sole remaining issue is that those owners have not marked them `public`. +# See SciML/OrdinaryDiffEq.jl#3776 for the make-public tracking. run_qa( OrdinaryDiffEqRKN; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # Qualified accesses of OrdinaryDiffEqCore internals (no public alias). + all_qualified_accesses_are_public = (; + ignore = (:increment_nf!, :set_EEst!),), + # Explicit imports of names that are owned by the importing module but + # not yet declared `public` there: OrdinaryDiffEqCore solver-extension + # internals, the DiffEqBase residual interface + @tight_loop_macros, and + # SciMLBase's @def. + all_explicit_imports_are_public = (; + ignore = ( + Symbol("@cache"), :CompiledFloats, :OrdinaryDiffEqAlgorithm, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + :OrdinaryDiffEqAdaptivePartitionedAlgorithm, + :OrdinaryDiffEqPartitionedAlgorithm, :_ode_interpolant, + :_ode_interpolant!, :alg_cache, :alg_extrapolates, :constvalue, + :generic_solver_docstring, :get_fsalfirstlast, :perform_step!, + Symbol("@tight_loop_macros"), :calculate_residuals, + :calculate_residuals!, Symbol("@def"), + ),), + ), ) From d8c9ae7812db370f60ccfe73ff3beff39fecb540 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:21:37 -0400 Subject: [PATCH 020/108] OrdinaryDiffEqNordsieck: minimize ExplicitImports exceptions Replace the blanket 5-check `ei_broken` with elimination plus tight, documented per-check ignores: - Import `alg_order` from its owner SciMLBase (public there) and `initialize!`/`calculate_residuals`/`calculate_residuals!` from their owner DiffEqBase, satisfying `all_explicit_imports_via_owners`. - Make the FastBroadcast/MuladdMacro/RecursiveArrayTools implicit imports explicit (`@..`, `@muladd`, `recursivefill!`, `Serial`). - Drop the stale `DummyController` import; un-qualify every `OrdinaryDiffEqCore.` access (method-extension targets and `get_EEst`/`set_EEst!`/`increment_nf!`) so `all_qualified_accesses_are_public` passes clean. The only remaining exceptions are tight documented ignores for the OrdinaryDiffEqCore solver-interface internals, the DiffEqBase residual primitives, and the OrdinaryDiffEqTsit5 first-step caches a Nordsieck solver must consume (`all_explicit_imports_are_public`), and the `@reexport using SciMLBase` idiom (`no_implicit_imports`). The other four EI checks pass with no ignore. Verified GROUP=QA on Julia 1.12: 17/17. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqNordsieck.jl | 25 +++++++---- lib/OrdinaryDiffEqNordsieck/src/alg_utils.jl | 2 +- .../src/controllers.jl | 12 +++--- .../src/nordsieck_perform_step.jl | 32 +++++++------- .../src/nordsieck_utils.jl | 12 +++--- lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl | 42 ++++++++++++++++++- 6 files changed, 86 insertions(+), 39 deletions(-) diff --git a/lib/OrdinaryDiffEqNordsieck/src/OrdinaryDiffEqNordsieck.jl b/lib/OrdinaryDiffEqNordsieck/src/OrdinaryDiffEqNordsieck.jl index 5dd6e4a6936..ce618452407 100644 --- a/lib/OrdinaryDiffEqNordsieck/src/OrdinaryDiffEqNordsieck.jl +++ b/lib/OrdinaryDiffEqNordsieck/src/OrdinaryDiffEqNordsieck.jl @@ -1,26 +1,33 @@ module OrdinaryDiffEqNordsieck -import OrdinaryDiffEqCore: alg_order, alg_adaptive_order, +# `alg_order` is owned (and public) by SciMLBase; import it from its owner. +import SciMLBase: alg_order +# `initialize!`, `calculate_residuals`, `calculate_residuals!` are owned by +# DiffEqBase (re-provided through OrdinaryDiffEqCore); import them from the owner +# so the ExplicitImports owner check passes. `initialize!` is public in +# DiffEqBase; the `calculate_residuals` pair is DiffEqBase-internal. +import DiffEqBase: initialize!, calculate_residuals, calculate_residuals! +import OrdinaryDiffEqCore: alg_adaptive_order, qmin_default, qmax_default, qsteady_min_default, qsteady_max_default, - get_current_alg_order, DummyController, + get_current_alg_order, AbstractController, AbstractControllerCache, OrdinaryDiffEqAdaptiveAlgorithm, OrdinaryDiffEqAdamsVarOrderVarStepAlgorithm, alg_cache, OrdinaryDiffEqMutableCache, - OrdinaryDiffEqConstantCache, initialize!, - initialize!, perform_step!, stepsize_controller!, + OrdinaryDiffEqConstantCache, + perform_step!, stepsize_controller!, step_accept_controller!, step_reject_controller!, accept_step_controller, post_newton_controller!, setup_controller_cache, get_qmin, get_qmax, get_qsteady_min, - get_qsteady_max, get_EEst, CommonControllerOptions, resolve_basic, _resolved_QT, - calculate_residuals, calculate_residuals!, + get_qsteady_max, get_EEst, set_EEst!, increment_nf!, + CommonControllerOptions, resolve_basic, _resolved_QT, get_current_adaptive_order, get_fsalfirstlast, ode_interpolant, ode_interpolant!, trivial_limiter!, generic_solver_docstring, default_controller -using MuladdMacro, FastBroadcast, RecursiveArrayTools +using MuladdMacro: @muladd +using FastBroadcast: @.., Serial +using RecursiveArrayTools: recursivefill! import LinearAlgebra: rmul! -using FastBroadcast: Serial using OrdinaryDiffEqTsit5: Tsit5ConstantCache, Tsit5Cache -import OrdinaryDiffEqCore using Reexport @reexport using SciMLBase diff --git a/lib/OrdinaryDiffEqNordsieck/src/alg_utils.jl b/lib/OrdinaryDiffEqNordsieck/src/alg_utils.jl index cfcee8e687e..f473fe1614e 100644 --- a/lib/OrdinaryDiffEqNordsieck/src/alg_utils.jl +++ b/lib/OrdinaryDiffEqNordsieck/src/alg_utils.jl @@ -13,7 +13,7 @@ qsteady_max_default(::JVODE) = 3 // 2 get_current_alg_order(alg::JVODE, cache) = get_current_adaptive_order(alg, cache) -function OrdinaryDiffEqCore.default_controller(QT, alg::JVODE) +function default_controller(QT, alg::JVODE) # Thread the alg-struct kwargs through to the controller so that # `JVODE(qmax = 20)` keeps working. return JVODEController( diff --git a/lib/OrdinaryDiffEqNordsieck/src/controllers.jl b/lib/OrdinaryDiffEqNordsieck/src/controllers.jl index 90279794cbe..23e2927d608 100644 --- a/lib/OrdinaryDiffEqNordsieck/src/controllers.jl +++ b/lib/OrdinaryDiffEqNordsieck/src/controllers.jl @@ -38,20 +38,20 @@ end # Algorithm owns the stepsize logic; controller cache delegates back to # alg-level dispatch (mirroring how DummyControllerCache used to behave). -@inline OrdinaryDiffEqCore.stepsize_controller!(integrator, ::JVODEControllerCache, alg) = +@inline stepsize_controller!(integrator, ::JVODEControllerCache, alg) = stepsize_controller!(integrator, alg) -@inline OrdinaryDiffEqCore.step_accept_controller!(integrator, ::JVODEControllerCache, alg, q) = +@inline step_accept_controller!(integrator, ::JVODEControllerCache, alg, q) = step_accept_controller!(integrator, alg, q) -@inline OrdinaryDiffEqCore.step_reject_controller!(integrator, ::JVODEControllerCache, alg) = +@inline step_reject_controller!(integrator, ::JVODEControllerCache, alg) = step_reject_controller!(integrator, alg) -@inline OrdinaryDiffEqCore.post_newton_controller!(integrator, ::JVODEControllerCache, alg) = +@inline post_newton_controller!(integrator, ::JVODEControllerCache, alg) = post_newton_controller!(integrator, alg) -@inline OrdinaryDiffEqCore.accept_step_controller( +@inline accept_step_controller( integrator, cache::JVODEControllerCache, alg, ) = get_EEst(cache) <= 1 function stepsize_controller!(integrator, alg::JVODE) - if iszero(OrdinaryDiffEqCore.get_EEst(integrator)) + if iszero(get_EEst(integrator)) η = get_qmax(integrator) else η = integrator.cache.η diff --git a/lib/OrdinaryDiffEqNordsieck/src/nordsieck_perform_step.jl b/lib/OrdinaryDiffEqNordsieck/src/nordsieck_perform_step.jl index 95bfed3e2de..72973341cee 100644 --- a/lib/OrdinaryDiffEqNordsieck/src/nordsieck_perform_step.jl +++ b/lib/OrdinaryDiffEqNordsieck/src/nordsieck_perform_step.jl @@ -2,7 +2,7 @@ function initialize!(integrator, cache::AN5ConstantCache) integrator.kshortsize = 7 integrator.k = typeof(integrator.k)(undef, integrator.kshortsize) integrator.fsalfirst = integrator.f(integrator.uprev, integrator.p, integrator.t) # Pre-start fsal - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) # Avoid undefined entries if k is an array of arrays integrator.fsallast = zero(integrator.fsalfirst) @@ -44,7 +44,7 @@ end perform_predict!(cache) cache.Δ = integrator.u - integrator.uprev update_nordsieck_vector!(cache) - if integrator.opts.adaptive && OrdinaryDiffEqCore.get_EEst(integrator) >= one(OrdinaryDiffEqCore.get_EEst(integrator)) + if integrator.opts.adaptive && get_EEst(integrator) >= one(get_EEst(integrator)) cache.order = 1 end else @@ -75,8 +75,8 @@ end integrator.opts.reltol, integrator.opts.internalnorm, t ) - OrdinaryDiffEqCore.set_EEst!(integrator, integrator.opts.internalnorm(atmp, t) * cache.c_LTE) - if OrdinaryDiffEqCore.get_EEst(integrator) > one(OrdinaryDiffEqCore.get_EEst(integrator)) + set_EEst!(integrator, integrator.opts.internalnorm(atmp, t) * cache.c_LTE) + if get_EEst(integrator) > one(get_EEst(integrator)) for i in 1:5 dts[i] = dts[i + 1] end @@ -107,7 +107,7 @@ function initialize!(integrator, cache::AN5Cache) integrator.k[6] = cache.tsit5cache.k6 integrator.k[7] = cache.tsit5cache.k7 integrator.f(integrator.fsalfirst, integrator.uprev, integrator.p, integrator.t) # Pre-start fsal - return OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + return increment_nf!(integrator.stats, 1) end @muladd function perform_step!(integrator, cache::AN5Cache, repeat_step = false) @@ -145,7 +145,7 @@ end perform_predict!(cache) @.. broadcast = false cache.Δ = integrator.u - integrator.uprev update_nordsieck_vector!(cache) - if integrator.opts.adaptive && OrdinaryDiffEqCore.get_EEst(integrator) >= one(OrdinaryDiffEqCore.get_EEst(integrator)) + if integrator.opts.adaptive && get_EEst(integrator) >= one(get_EEst(integrator)) cache.order = 1 end else @@ -176,8 +176,8 @@ end atmp, cache.Δ, uprev, integrator.u, integrator.opts.abstol, integrator.opts.reltol, integrator.opts.internalnorm, t ) - OrdinaryDiffEqCore.set_EEst!(integrator, integrator.opts.internalnorm(atmp, t) * cache.c_LTE) - if OrdinaryDiffEqCore.get_EEst(integrator) > one(OrdinaryDiffEqCore.get_EEst(integrator)) + set_EEst!(integrator, integrator.opts.internalnorm(atmp, t) * cache.c_LTE) + if get_EEst(integrator) > one(get_EEst(integrator)) for i in 1:5 dts[i] = dts[i + 1] end @@ -200,7 +200,7 @@ function initialize!(integrator, cache::JVODEConstantCache) integrator.kshortsize = 7 integrator.k = typeof(integrator.k)(undef, integrator.kshortsize) integrator.fsalfirst = integrator.f(integrator.uprev, integrator.p, integrator.t) # Pre-start fsal - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) # Avoid undefined entries if k is an array of arrays integrator.fsallast = zero(integrator.fsalfirst) @@ -219,7 +219,7 @@ end cache.order = 1 z[1] = integrator.uprev z[2] = f(uprev, p, t) * dt - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) dts[1] = dt end # Reset time @@ -247,8 +247,8 @@ end cache.Δ, uprev, integrator.u, integrator.opts.abstol, integrator.opts.reltol, integrator.opts.internalnorm, t ) - OrdinaryDiffEqCore.set_EEst!(integrator, integrator.opts.internalnorm(atmp, t) * cache.c_LTE) - if OrdinaryDiffEqCore.get_EEst(integrator) > one(OrdinaryDiffEqCore.get_EEst(integrator)) + set_EEst!(integrator, integrator.opts.internalnorm(atmp, t) * cache.c_LTE) + if get_EEst(integrator) > one(get_EEst(integrator)) for i in 1:12 dts[i] = dts[i + 1] end @@ -275,7 +275,7 @@ function initialize!(integrator, cache::JVODECache) integrator.k[6] = cache.tsit5cache.k6 integrator.k[7] = cache.tsit5cache.k7 integrator.f(integrator.fsalfirst, integrator.uprev, integrator.p, integrator.t) # Pre-start fsal - return OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + return increment_nf!(integrator.stats, 1) end @muladd function perform_step!(integrator, cache::JVODECache, repeat_step = false) @@ -286,7 +286,7 @@ end cache.order = 1 @.. broadcast = false z[1] = integrator.uprev f(z[2], uprev, p, t) - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) @.. broadcast = false z[2] = z[2] * dt dts[1] = dt end @@ -318,8 +318,8 @@ end atmp, cache.Δ, uprev, integrator.u, integrator.opts.abstol, integrator.opts.reltol, integrator.opts.internalnorm, t ) - OrdinaryDiffEqCore.set_EEst!(integrator, integrator.opts.internalnorm(atmp, t) * cache.c_LTE) - if OrdinaryDiffEqCore.get_EEst(integrator) > one(OrdinaryDiffEqCore.get_EEst(integrator)) + set_EEst!(integrator, integrator.opts.internalnorm(atmp, t) * cache.c_LTE) + if get_EEst(integrator) > one(get_EEst(integrator)) for i in 1:12 dts[i] = dts[i + 1] end diff --git a/lib/OrdinaryDiffEqNordsieck/src/nordsieck_utils.jl b/lib/OrdinaryDiffEqNordsieck/src/nordsieck_utils.jl index 0a48d242f55..88c8f8bef53 100644 --- a/lib/OrdinaryDiffEqNordsieck/src/nordsieck_utils.jl +++ b/lib/OrdinaryDiffEqNordsieck/src/nordsieck_utils.jl @@ -33,14 +33,14 @@ function nordsieck_prepare_next!(integrator, cache::T) where {T} (; maxη, order, L) = cache # TODO: further clean up (; bias1, bias2, bias3, addon) = integrator.alg - if OrdinaryDiffEqCore.get_EEst(integrator) > one(OrdinaryDiffEqCore.get_EEst(integrator)) + if get_EEst(integrator) > one(get_EEst(integrator)) nordsieck_rewind!(cache) cache.n_wait = max(2, cache.n_wait) cache.nextorder = order - cache.η = inv((bias2 * OrdinaryDiffEqCore.get_EEst(integrator))^inv(L) + addon) + cache.η = inv((bias2 * get_EEst(integrator))^inv(L) + addon) return nothing end - cache.ηq = inv((bias2 * OrdinaryDiffEqCore.get_EEst(integrator))^inv(L) + addon) + cache.ηq = inv((bias2 * get_EEst(integrator))^inv(L) + addon) stepsize_η!(integrator, cache, cache.order) if !is_nordsieck_change_order(cache) cache.η = cache.ηq @@ -218,7 +218,7 @@ function nlsolve_functional!(integrator, cache::T) where {T} (; ratetmp) = cache integrator.f(ratetmp, z[1], p, dt + t) end - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) maxiters = 3 div_rate = 2 # Zero out the difference vector @@ -258,7 +258,7 @@ function nlsolve_functional!(integrator, cache::T) where {T} return false end δ_prev = δ - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) isconstcache ? (ratetmp = integrator.f(integrator.u, p, dt + t)) : integrator.f(ratetmp, integrator.u, p, dt + t) end @@ -394,7 +394,7 @@ function stepsize_η!(integrator, cache, order) bias2 = integrator.alg.bias2 addon = integrator.alg.addon L = order + 1 - cache.ηq = inv((bias2 * OrdinaryDiffEqCore.get_EEst(integrator))^inv(L) + addon) + cache.ηq = inv((bias2 * get_EEst(integrator))^inv(L) + addon) return cache.ηq end diff --git a/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl b/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl index 5c13e2f0744..8d9ae212394 100644 --- a/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl @@ -3,5 +3,45 @@ using SciMLTesting, OrdinaryDiffEqNordsieck, Test run_qa( OrdinaryDiffEqNordsieck; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # `@reexport using SciMLBase` is the package's public-API surface; the + # reexport idiom is an unavoidable implicit import of these three names. + no_implicit_imports = (; + ignore = (:SciMLBase, :Reexport, Symbol("@reexport")), + ), + # A Nordsieck solver sublibrary necessarily extends and consumes the + # OrdinaryDiffEqCore solver interface (cache/algorithm abstract types, + # `alg_cache`/`perform_step!`/controller hooks, error-estimate accessors, + # docstring helper, interpolation primitives), plus the DiffEqBase + # `calculate_residuals`/`calculate_residuals!` residual primitives and the + # OrdinaryDiffEqTsit5 first-step cache types. None of these are declared + # `public`/exported by their owners yet; drop each entry as it is made + # public upstream (tracked in SciML/OrdinaryDiffEq.jl#3776). + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internal solver interface + :AbstractController, :AbstractControllerCache, + :OrdinaryDiffEqAdaptiveAlgorithm, + :OrdinaryDiffEqAdamsVarOrderVarStepAlgorithm, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + :alg_adaptive_order, :alg_cache, :perform_step!, + :stepsize_controller!, :step_accept_controller!, + :step_reject_controller!, :accept_step_controller, + :post_newton_controller!, :default_controller, + :setup_controller_cache, :CommonControllerOptions, + :resolve_basic, :_resolved_QT, + :get_current_alg_order, :get_current_adaptive_order, + :get_fsalfirstlast, :get_EEst, :set_EEst!, :increment_nf!, + :get_qmin, :get_qmax, :get_qsteady_min, :get_qsteady_max, + :qmin_default, :qmax_default, + :qsteady_min_default, :qsteady_max_default, + :generic_solver_docstring, :trivial_limiter!, + :ode_interpolant, :ode_interpolant!, + # DiffEqBase residual primitives + :calculate_residuals, :calculate_residuals!, + # OrdinaryDiffEqTsit5 first-step caches + :Tsit5Cache, :Tsit5ConstantCache, + ), + ), + ), ) From 8b4da394567e21798e576cea13c4bac13dff48ba Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:24:13 -0400 Subject: [PATCH 021/108] ExponentialRK: minimize EI exceptions, drop blanket ei_broken Eliminate the blanket ei_broken on all 5 ExplicitImports checks for OrdinaryDiffEqExponentialRK: - Make the 22 implicit imports explicit (ExponentialUtilities, FastBroadcast, MuladdMacro, RecursiveArrayTools, Reexport, SciMLBase/SplitFunction). - Remove 5 stale imports (AbstractADType, CompositeAlgorithm, _ad_chunksize_int, _ad_fdtype, the now-qualified-only DiffEqBase.prepare_alg import). - Route now-public / owner-correct names to their owners: alg_order from SciMLBase, initialize! from DiffEqBase; this clears the via-owners check. - Narrow the residual genuinely-internal names to a tight, documented per-name ignore (OrdinaryDiffEqCore / SciMLBase / DiffEqBase / OrdinaryDiffEqDifferentiation internals) instead of an opaque ei_broken over whole checks. QA group passes 17/17 on Julia 1.12 with only the tight ignores remaining. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqExponentialRK.jl | 35 +++++++++++-------- lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl | 30 +++++++++++++++- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/lib/OrdinaryDiffEqExponentialRK/src/OrdinaryDiffEqExponentialRK.jl b/lib/OrdinaryDiffEqExponentialRK/src/OrdinaryDiffEqExponentialRK.jl index 4689df60712..cd695cf0426 100644 --- a/lib/OrdinaryDiffEqExponentialRK/src/OrdinaryDiffEqExponentialRK.jl +++ b/lib/OrdinaryDiffEqExponentialRK/src/OrdinaryDiffEqExponentialRK.jl @@ -1,30 +1,35 @@ module OrdinaryDiffEqExponentialRK -import OrdinaryDiffEqCore: alg_order, alg_adaptive_order, ismultistep, +import OrdinaryDiffEqCore: alg_adaptive_order, ismultistep, OrdinaryDiffEqExponentialAlgorithm, - _unwrap_val, OrdinaryDiffEqMutableCache, + OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, @cache, alg_cache, - initialize!, perform_step!, unwrap_alg, - OrdinaryDiffEqAdaptiveExponentialAlgorithm, CompositeAlgorithm, + perform_step!, unwrap_alg, + OrdinaryDiffEqAdaptiveExponentialAlgorithm, ExponentialAlgorithm, fsal_typeof, isdtchangeable, - calculate_residuals, calculate_residuals!, full_cache, get_fsalfirstlast, - generic_solver_docstring, _ad_chunksize_int, _ad_fdtype, _fixup_ad + generic_solver_docstring, _fixup_ad import OrdinaryDiffEqCore -using RecursiveArrayTools -using MuladdMacro, FastBroadcast +using RecursiveArrayTools: RecursiveArrayTools +import RecursiveArrayTools: recursivecopy! +using MuladdMacro: MuladdMacro, @muladd +using FastBroadcast: FastBroadcast, @.. using LinearAlgebra: axpy!, mul! import DiffEqBase -import DiffEqBase: prepare_alg -using ExponentialUtilities -import RecursiveArrayTools: recursivecopy! -using OrdinaryDiffEqDifferentiation: build_jac_config, UJacobianWrapper, UDerivativeWrapper, - calc_J, calc_J! -import ADTypes: AutoForwardDiff, AbstractADType +import DiffEqBase: calculate_residuals, calculate_residuals!, initialize! +using ExponentialUtilities: ExponentialUtilities, ExpvCache, KrylovSubspace, + PhivCache, arnoldi, arnoldi!, expv, expv!, phi, + phiv, phiv!, phiv_timestep, phiv_timestep! +# alg_order / _unwrap_val are owned by SciMLBase (re-exported through OrdinaryDiffEqCore); +# import from the owner to satisfy ExplicitImports' via-owners check. +import SciMLBase: alg_order, _unwrap_val, UJacobianWrapper, UDerivativeWrapper +using OrdinaryDiffEqDifferentiation: build_jac_config, calc_J, calc_J! +import ADTypes: AutoForwardDiff -using Reexport +using Reexport: Reexport, @reexport @reexport using SciMLBase +using SciMLBase: SciMLBase, SplitFunction include("algorithms.jl") include("alg_utils.jl") diff --git a/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl b/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl index 98201407afe..0ebab97d20d 100644 --- a/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl @@ -3,5 +3,33 @@ using SciMLTesting, OrdinaryDiffEqExponentialRK, Test run_qa( OrdinaryDiffEqExponentialRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + # Internal (non-public) names from sibling solver packages and SciMLBase + # that have no public replacement yet. Tracked in SciML/OrdinaryDiffEq.jl#3776 + # for upstream `public` declarations. + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internals + Symbol("@cache"), :ExponentialAlgorithm, + :OrdinaryDiffEqAdaptiveExponentialAlgorithm, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqExponentialAlgorithm, + :OrdinaryDiffEqMutableCache, :alg_cache, :alg_adaptive_order, + :fsal_typeof, :generic_solver_docstring, :get_fsalfirstlast, + :isdtchangeable, :ismultistep, :perform_step!, :unwrap_alg, + :_fixup_ad, :full_cache, + # SciMLBase internals + :_unwrap_val, :UDerivativeWrapper, :UJacobianWrapper, + # DiffEqBase internals + :calculate_residuals, :calculate_residuals!, + # OrdinaryDiffEqDifferentiation internals + :build_jac_config, :calc_J, :calc_J!, + )), + all_qualified_accesses_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internals + :increment_nf!, :set_EEst!, + # DiffEqBase internal + :prepare_alg, + )), + ), ) From c1668fefb0b56f099ffd4962fe6ecafe7ae3f244 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:27:04 -0400 Subject: [PATCH 022/108] Minimize EI exceptions for OrdinaryDiffEqPDIRK Drop the blanket ei_broken (no_implicit_imports, no_stale_explicit_imports, all_explicit_imports_via_owners, all_explicit_imports_are_public) and fix at the source: - make Reexport/@reexport/SciMLBase explicit (no_implicit_imports) - remove stale imports uses_uprev, _ad_chunksize_int, _ad_fdtype, AbstractADType, and dolinsolve (no_stale_explicit_imports) - import alg_order/_unwrap_val from their owner SciMLBase and initialize! from its owner DiffEqBase (all_explicit_imports_via_owners); alg_order and initialize! are public on the owner module so they also clear all_explicit_imports_are_public Remaining all_explicit_imports_are_public exceptions are a tight, documented ignore of solver-internal names with no public alternative on the registered releases (OrdinaryDiffEqCore/OrdinaryDiffEqNonlinearSolve internals plus SciMLBase._unwrap_val); tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqPDIRK.jl | 16 +++++++------- lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl | 21 ++++++++++++++++++- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/lib/OrdinaryDiffEqPDIRK/src/OrdinaryDiffEqPDIRK.jl b/lib/OrdinaryDiffEqPDIRK/src/OrdinaryDiffEqPDIRK.jl index b17eac7c195..c66ad8c470e 100644 --- a/lib/OrdinaryDiffEqPDIRK/src/OrdinaryDiffEqPDIRK.jl +++ b/lib/OrdinaryDiffEqPDIRK/src/OrdinaryDiffEqPDIRK.jl @@ -1,24 +1,26 @@ module OrdinaryDiffEqPDIRK -import OrdinaryDiffEqCore: isfsal, alg_order, _unwrap_val, +import OrdinaryDiffEqCore: isfsal, OrdinaryDiffEqNewtonAlgorithm, OrdinaryDiffEqConstantCache, OrdinaryDiffEqMutableCache, constvalue, alg_cache, - uses_uprev, unwrap_alg, @cache, - @threaded, initialize!, perform_step!, isthreaded, + unwrap_alg, @cache, + @threaded, perform_step!, isthreaded, full_cache, get_fsalfirstlast, differentiation_rk_docstring, - _ad_chunksize_int, _ad_fdtype, _fixup_ad + _fixup_ad +import SciMLBase: alg_order, _unwrap_val +import DiffEqBase: initialize! import MuladdMacro: @muladd import FastBroadcast: @.. -using Reexport +using Reexport: Reexport, @reexport +using SciMLBase: SciMLBase @reexport using SciMLBase -using OrdinaryDiffEqDifferentiation: dolinsolve using OrdinaryDiffEqNonlinearSolve: NLNewton, build_nlsolver, nlsolve!, nlsolvefail, markfirststage! -import ADTypes: AutoForwardDiff, AbstractADType +import ADTypes: AutoForwardDiff include("algorithms.jl") include("alg_utils.jl") diff --git a/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl index 0bfa13f5788..b3ce6737ea9 100644 --- a/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl @@ -3,5 +3,24 @@ using SciMLTesting, OrdinaryDiffEqPDIRK, Test run_qa( OrdinaryDiffEqPDIRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # Solver-internal names extended/dispatched from their owner modules but + # not (yet) declared `public` on the registered releases. No public + # alternative exists; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore + Symbol("@cache"), Symbol("@threaded"), + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + :OrdinaryDiffEqNewtonAlgorithm, :_fixup_ad, :alg_cache, + :constvalue, :differentiation_rk_docstring, :get_fsalfirstlast, + :isfsal, :isthreaded, :perform_step!, :unwrap_alg, + # OrdinaryDiffEqNonlinearSolve + :NLNewton, :build_nlsolver, :markfirststage!, :nlsolve!, + :nlsolvefail, + # SciMLBase + :_unwrap_val, + ), + ), + ), ) From cfb1236a5744fa7f3523f26e5f573f2cad82eedc Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:28:06 -0400 Subject: [PATCH 023/108] OrdinaryDiffEqSSPRK: minimize EI exceptions, drop blanket ei_broken Replace the blanket 5-check ei_broken with explicit imports from owner modules and tight, documented ignore lists for the names that remain genuinely internal (no public counterpart in OrdinaryDiffEqCore / DiffEqBase / SciMLBase). - no_implicit_imports: make all implicit names explicit (@.., @muladd, recursivefill!, @reexport, ODEProblem, solve, and the SciMLBase module qualifier itself). - no_stale_explicit_imports: drop 7 unused imports (OrdinaryDiffEqNewton/RosenbrockAdaptiveAlgorithm, _vec, _reshape, _unwrap_val, unwrap_alg, uses_uprev). - all_*_via_owners: import from the owning module (alg_order <- SciMLBase; initialize!/calculate_residuals[!] <- DiffEqBase; copyat_or_push! <- RecursiveArrayTools). - Remaining non-public names are solver internals -> tight per-check ignore lists, not blanket ei_broken. See SciML/OrdinaryDiffEq.jl#3776. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqSSPRK.jl | 27 ++++++++------- lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl | 33 ++++++++++++++++++- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/lib/OrdinaryDiffEqSSPRK/src/OrdinaryDiffEqSSPRK.jl b/lib/OrdinaryDiffEqSSPRK/src/OrdinaryDiffEqSSPRK.jl index 29280c47236..b4af6d8f383 100644 --- a/lib/OrdinaryDiffEqSSPRK/src/OrdinaryDiffEqSSPRK.jl +++ b/lib/OrdinaryDiffEqSSPRK/src/OrdinaryDiffEqSSPRK.jl @@ -1,24 +1,23 @@ module OrdinaryDiffEqSSPRK -import OrdinaryDiffEqCore: alg_order, calculate_residuals!, - initialize!, perform_step!, unwrap_alg, - calculate_residuals, ssp_coefficient, +import OrdinaryDiffEqCore: perform_step!, ssp_coefficient, OrdinaryDiffEqAlgorithm, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, - OrdinaryDiffEqNewtonAdaptiveAlgorithm, - OrdinaryDiffEqRosenbrockAdaptiveAlgorithm, - OrdinaryDiffEqAdaptiveAlgorithm, uses_uprev, - alg_cache, _vec, _reshape, @cache, isfsal, full_cache, - constvalue, _unwrap_val, + OrdinaryDiffEqAdaptiveAlgorithm, + alg_cache, @cache, isfsal, full_cache, + constvalue, explicit_rk_docstring, trivial_limiter!, _ode_interpolant, _ode_interpolant!, - _ode_addsteps!, get_fsalfirstlast, copyat_or_push! -using FastBroadcast, MuladdMacro, RecursiveArrayTools -using DiffEqBase: @def -using FastBroadcast: Serial + _ode_addsteps!, get_fsalfirstlast import OrdinaryDiffEqCore - -using Reexport +import SciMLBase: alg_order +import DiffEqBase: initialize!, calculate_residuals, calculate_residuals! +using RecursiveArrayTools: RecursiveArrayTools, copyat_or_push!, recursivefill! +using FastBroadcast: FastBroadcast, @.., Serial +using MuladdMacro: MuladdMacro, @muladd +using SciMLBase: SciMLBase, @def, ODEProblem, solve + +using Reexport: Reexport, @reexport @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl b/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl index 93c40b050bf..f1d5bd7b973 100644 --- a/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl @@ -3,5 +3,36 @@ using SciMLTesting, OrdinaryDiffEqSSPRK, Test run_qa( OrdinaryDiffEqSSPRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + # Solver-internal names with no public counterpart in their owner. + # OrdinaryDiffEqCore internals: the RK perform_step/cache/limiter API + # (perform_step!, alg_cache, @cache, isfsal, constvalue, trivial_limiter!, + # explicit_rk_docstring, get_fsalfirstlast, ssp_coefficient, the + # _ode_interpolant/_ode_addsteps interpolation hooks, the abstract + # algorithm/cache supertypes). DiffEqBase residual hooks + # (calculate_residuals[!]). SciMLBase macros (@def, @cache reexport). + # See SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + Symbol("@cache"), Symbol("@def"), + :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqMutableCache, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqAdaptiveAlgorithm, + :perform_step!, :alg_cache, :isfsal, :constvalue, + :trivial_limiter!, :explicit_rk_docstring, :get_fsalfirstlast, + :ssp_coefficient, :_ode_interpolant, :_ode_interpolant!, + :_ode_addsteps!, + :calculate_residuals, :calculate_residuals!, + ), + ), + # Qualified accesses to solver-internal names: OrdinaryDiffEqCore + # step bookkeeping/test problems (increment_nf!, set_EEst!, lorenz[_oop]) + # and SciMLBase specialization tags used only inside the precompile + # workload (FunctionWrapperSpecialize, NoSpecialize). + all_qualified_accesses_are_public = (; + ignore = ( + :increment_nf!, :set_EEst!, :lorenz, :lorenz_oop, + :FunctionWrapperSpecialize, :NoSpecialize, + ), + ), + ), ) From ed3c743ebc3a5127b77f71facee9925e53c2fb21 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:30:07 -0400 Subject: [PATCH 024/108] OrdinaryDiffEqSymplecticRK: minimize EI exceptions in run_qa Drop the blanket ei_broken on all five ExplicitImports checks. Remove stale imports, make implicit imports explicit, import alg_order from its public owner SciMLBase, initialize! from DiffEqBase, and the FastBroadcast/MuladdMacro/ RecursiveArrayTools macros/names explicitly. The only remaining exceptions are tight documented ignores for OrdinaryDiffEqCore-internal (non-public) names the solver genuinely needs, tracked for make-public in #3776. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqSymplecticRK.jl | 24 +++++++++---------- lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl | 23 +++++++++++++++++- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/lib/OrdinaryDiffEqSymplecticRK/src/OrdinaryDiffEqSymplecticRK.jl b/lib/OrdinaryDiffEqSymplecticRK/src/OrdinaryDiffEqSymplecticRK.jl index 48c44115e82..70d1df66f03 100644 --- a/lib/OrdinaryDiffEqSymplecticRK/src/OrdinaryDiffEqSymplecticRK.jl +++ b/lib/OrdinaryDiffEqSymplecticRK/src/OrdinaryDiffEqSymplecticRK.jl @@ -1,22 +1,22 @@ module OrdinaryDiffEqSymplecticRK -import OrdinaryDiffEqCore: alg_order, calculate_residuals!, - initialize!, perform_step!, unwrap_alg, - calculate_residuals, - OrdinaryDiffEqAlgorithm, +import OrdinaryDiffEqCore: perform_step!, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, - OrdinaryDiffEqAdaptiveAlgorithm, OrdinaryDiffEqPartitionedAlgorithm, - CompiledFloats, uses_uprev, - alg_cache, _vec, _reshape, @cache, isfsal, full_cache, - constvalue, _unwrap_val, - explicit_rk_docstring, trivial_limiter!, - _ode_interpolant!, _ode_addsteps!, get_fsalfirstlast, + CompiledFloats, + alg_cache, @cache, + constvalue, + get_fsalfirstlast, generic_solver_docstring, default_linear_interpolation -using FastBroadcast, MuladdMacro, RecursiveArrayTools +import SciMLBase: alg_order, full_cache +import DiffEqBase: initialize! +using FastBroadcast: @.. +using MuladdMacro: @muladd +using RecursiveArrayTools: ArrayPartition import OrdinaryDiffEqCore -using Reexport +using Reexport: Reexport, @reexport +using SciMLBase: SciMLBase @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl b/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl index 092d6e594d8..5ccd948a83a 100644 --- a/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl @@ -3,5 +3,26 @@ using SciMLTesting, OrdinaryDiffEqSymplecticRK, Test run_qa( OrdinaryDiffEqSymplecticRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # OrdinaryDiffEqCore-internal (non-public) names the solver genuinely + # needs from Core; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + :perform_step!, + :OrdinaryDiffEqMutableCache, + :OrdinaryDiffEqConstantCache, + :OrdinaryDiffEqPartitionedAlgorithm, + :CompiledFloats, + :alg_cache, + Symbol("@cache"), + :constvalue, + :get_fsalfirstlast, + :generic_solver_docstring, + :default_linear_interpolation, + ), + ), + # `increment_nf!` is accessed as `OrdinaryDiffEqCore.increment_nf!`; + # non-public in Core, tracked for make-public in #3776. + all_qualified_accesses_are_public = (; ignore = (:increment_nf!,)), + ), ) From 46bcc7b9950786cda04444bad4b2e7e0184874a7 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:30:05 -0400 Subject: [PATCH 025/108] OrdinaryDiffEqCore: minimize ExplicitImports exceptions in QA Replace the blanket `ei_broken` over all six ExplicitImports checks with live checks plus tight, individually documented ignore lists. Source fixes (eliminate, not ignore): - Add explicit `using SciMLBase: ...` for the 21 names previously relied on implicitly through `@reexport using SciMLBase`; explicit `using SciMLOperators` and `using CommonSolve: solve` (CommonSolve added to deps/compat as the owner of `solve`). - Import `resize!` from its owner `Base` and `check_error!` from its owner SciMLBase (both verified identical to the DiffEqBase/SciMLBase bindings). - Migrate `initialize_dae!` and `value` qualified accesses from DiffEqBase to their owner SciMLBase; `initialize_dae!` is public there so it is fully clean. - Drop genuinely-unused imports (rank, issingular, chain, recursivefill!, isautodifferentiable, DEIntegrator, get_tstops_max, @def, @tight_loop_macros, AbstractADType, the unused SciMLLogging level names, the SciMLOperators abstract types, etc.) and the now-unused ConcreteStructs dependency. Re-export contract preserved: - BrownFullBasicInit, ShampineCollocationInit, DEVerbosity, Minimal, _vec, _reshape, unwrap_cache, calculate_residuals, calculate_residuals! are unused by this package but imported into its namespace and re-imported by dependent OrdinaryDiffEq.jl sublibraries; kept and documented, with matching `no_stale_explicit_imports` ignores that ExplicitImports cannot infer cross-package. Residual ignores are upstream-internal (non-`public`) names with no public replacement, documented per source module. `OrdinaryDiffEqCore.Predictor` (a generated EnumX submodule) is marked `allow_unanalyzable`. Verified on Julia 1.12 against released SciMLTesting 1.7.0 / SciMLBase 3.30.0: QA 15/15 pass (Aqua + all six EI checks run live, 0 fail/error/broken). Smoke solves with Tsit5, Rosenbrock23, and QNDF (BDF) all return Success. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqCore/Project.toml | 4 +- .../src/OrdinaryDiffEqCore.jl | 66 +++++++++-------- lib/OrdinaryDiffEqCore/src/initdt.jl | 12 ++-- lib/OrdinaryDiffEqCore/src/initialize_dae.jl | 2 +- .../src/integrators/controllers.jl | 20 +++--- .../src/integrators/integrator_interface.jl | 4 +- .../src/integrators/integrator_utils.jl | 6 +- lib/OrdinaryDiffEqCore/src/misc_utils.jl | 8 +-- lib/OrdinaryDiffEqCore/src/solve.jl | 10 +-- lib/OrdinaryDiffEqCore/test/qa/qa.jl | 70 ++++++++++++++++++- 10 files changed, 140 insertions(+), 62 deletions(-) diff --git a/lib/OrdinaryDiffEqCore/Project.toml b/lib/OrdinaryDiffEqCore/Project.toml index b78175271dd..50f484f5411 100644 --- a/lib/OrdinaryDiffEqCore/Project.toml +++ b/lib/OrdinaryDiffEqCore/Project.toml @@ -9,7 +9,7 @@ Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" BinaryHeaps = "b2a6c25c-c996-4615-94ab-6e519ffb8690" -ConcreteStructs = "2569d6c7-a4a2-43d3-a901-331e8e4be471" +CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" EnumX = "4e289a0a-7415-4d19-859d-a7e5c4648b56" @@ -52,7 +52,7 @@ Accessors = "0.1.42" Adapt = "4.3" ArrayInterface = "7.19" BinaryHeaps = "1" -ConcreteStructs = "0.2.3" +CommonSolve = "0.2.4" DiffEqBase = "7" DiffEqDevTools = "3" DifferentiationInterface = "0.7.18" diff --git a/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl b/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl index 1a68e5280e8..b89af245935 100644 --- a/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl +++ b/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl @@ -15,7 +15,7 @@ import Logging: @logmsg, LogLevel using MuladdMacro: @muladd -using LinearAlgebra: opnorm, I, UniformScaling, diag, rank, isdiag +using LinearAlgebra: opnorm, I, UniformScaling, diag, isdiag import PrecompileTools @@ -26,76 +26,86 @@ import FastPower: fastpower import SciMLBase: solve!, step!, isadaptive import DiffEqBase: initialize! -# DAE Initialization algorithms +# DAE Initialization algorithms. +# `ShampineCollocationInit`/`BrownFullBasicInit` are unused here but re-exported +# for dependent OrdinaryDiffEq.jl sublibraries that import them from this package. import DiffEqBase: DefaultInit, ShampineCollocationInit, BrownFullBasicInit -# Internal utils +# Internal utils. `DEVerbosity` is re-exported for dependent sublibraries. import DiffEqBase: ODE_DEFAULT_NORM, ODE_DEFAULT_ISOUTOFDOMAIN, ODE_DEFAULT_PROG_MESSAGE, ODE_DEFAULT_UNSTABLE_CHECK, - DEVerbosity, DEFAULT_VERBOSE, _process_verbose_param + DEVerbosity, _process_verbose_param -import SciMLOperators: AbstractSciMLOperator, AbstractSciMLScalarOperator, - MatrixOperator, FunctionOperator, - update_coefficients, update_coefficients!, DEFAULT_UPDATE_FUNC, +import SciMLOperators: MatrixOperator, FunctionOperator, + update_coefficients, update_coefficients!, isconstant -using DiffEqBase: DEIntegrator - import Random -import RecursiveArrayTools: chain, recursivecopy!, recursivecopy, recursive_bottom_eltype, recursive_unitless_bottom_eltype, recursive_unitless_eltype, copyat_or_push!, DiffEqArray, recursivefill! +import RecursiveArrayTools: recursivecopy!, recursivecopy, recursive_bottom_eltype, recursive_unitless_bottom_eltype, recursive_unitless_eltype, copyat_or_push!, DiffEqArray import RecursiveArrayTools using BinaryHeaps: BinaryHeap, FasterForward -using ArrayInterface: ArrayInterface, issingular +using ArrayInterface: ArrayInterface import TruncatedStacktraces: @truncate_stacktrace, VERBOSE_MSG # Integrator Interface -import SciMLBase: resize!, deleteat!, addat!, full_cache, user_cache, u_cache, du_cache, +import Base: resize! +import SciMLBase: deleteat!, addat!, full_cache, user_cache, u_cache, du_cache, resize_non_user_cache!, deleteat_non_user_cache!, addat_non_user_cache!, terminate!, get_du, get_dt, get_proposed_dt, set_proposed_dt!, savevalues!, add_tstop!, has_tstop, first_tstop, pop_tstop!, add_saveat!, set_reltol!, - set_abstol!, postamble!, last_step_failed, - isautodifferentiable -import DiffEqBase: get_tstops, get_tstops_array, get_tstops_max + set_abstol!, postamble!, last_step_failed +import DiffEqBase: get_tstops, get_tstops_array -using DiffEqBase: check_error!, @def, _vec, _reshape +# `check_error!` is owned by (and public in) SciMLBase, re-exported through DiffEqBase. +# `_vec`/`_reshape`/`unwrap_cache` are owned by SciMLBase and re-exported here for +# dependent OrdinaryDiffEq.jl sublibraries that import them from this package. +using SciMLBase: check_error!, _vec, _reshape, unwrap_cache -using FastBroadcast: @.., Serial, Threaded +using FastBroadcast: @.. using FunctionWrappers: FunctionWrapper using SciMLBase: NoInit, CheckInit, OverrideInit, AbstractDEProblem, _unwrap_val, ODEAliasSpecifier +# Names previously relied on implicitly through `@reexport using SciMLBase`. +using SciMLBase: SciMLBase, CallbackSet, ContinuousCallback, DAEProblem, + DAESolution, DiscreteProblem, DynamicalODEFunction, + IntervalNonlinearProblem, NonlinearLeastSquaresProblem, + ODEProblem, ReturnCode, SplitFunction, SplitSDEFunction, + VectorContinuousCallback, auto_dt_reset!, derivative_discontinuity!, + get_tmp_cache, isinplace, reinit! +using SciMLOperators: SciMLOperators +using CommonSolve: solve + import SciMLBase: AbstractNonlinearProblem, alg_order, LinearAliasSpecifier -import SciMLBase: unwrap_cache, - islinear -import DiffEqBase: calculate_residuals, - calculate_residuals!, @tight_loop_macros, - timedepentdtmin +import SciMLBase: islinear +# `calculate_residuals`/`calculate_residuals!` are unused here but re-exported for +# dependent OrdinaryDiffEq.jl sublibraries that import them from this package. +import DiffEqBase: timedepentdtmin, calculate_residuals, calculate_residuals! # MacroTools and Adapt imported but not directly used in OrdinaryDiffEqCore # using MacroTools, Adapt -import ADTypes: AutoFiniteDiff, AutoForwardDiff, AbstractADType, AutoSparse, dense_ad +import ADTypes: AutoFiniteDiff, AutoForwardDiff, AutoSparse, dense_ad import Accessors: @reset # SciMLStructures symbols imported but not directly used in OrdinaryDiffEqCore # using SciMLStructures: canonicalize, Tunable, isscimlstructure -using SciMLLogging: SciMLLogging, @SciMLMessage, MessageLevel, - None, Minimal, Standard, Detailed, All, Silent, InfoLevel, WarnLevel, ErrorLevel +# `Minimal` is unused here but re-exported for dependent OrdinaryDiffEq.jl +# sublibraries that import it from this package. +using SciMLLogging: SciMLLogging, @SciMLMessage, Standard, Minimal using SymbolicIndexingInterface: state_values import SymbolicIndexingInterface: parameter_values -using ConcreteStructs: @concrete - using EnumX: @enumx import EnzymeCore @@ -148,7 +158,7 @@ const TryAgain = SlowConvergence isdiscretecache(cache) = false -unitfulvalue(x) = DiffEqBase.unitfulvalue(x) +unitfulvalue(x) = SciMLBase.unitfulvalue(x) # Declare the documented custom-stepsize-controller author interface `public` so downstream # packages can drop their `OrdinaryDiffEqCore.X` non-public ExplicitImports ignores. These diff --git a/lib/OrdinaryDiffEqCore/src/initdt.jl b/lib/OrdinaryDiffEqCore/src/initdt.jl index 67015a880f3..f4968abe3f7 100644 --- a/lib/OrdinaryDiffEqCore/src/initdt.jl +++ b/lib/OrdinaryDiffEqCore/src/initdt.jl @@ -16,7 +16,7 @@ oneunit_tType = oneunit(t) dtmax_tdir = tdir * dtmax - dtmin = nextfloat(max(integrator.opts.dtmin, convert(_tType, oneunit_tType * eps(DiffEqBase.value(t))))) + dtmin = nextfloat(max(integrator.opts.dtmin, convert(_tType, oneunit_tType * eps(SciMLBase.value(t))))) smalldt = max(dtmin, convert(_tType, oneunit_tType * 1 // 10^(6))) if integrator.isdae @@ -194,7 +194,7 @@ (d₁ < 1 // 10^(5)), smalldt, convert( _tType, - oneunit_tType * DiffEqBase.value( + oneunit_tType * SciMLBase.value( (d₀ / d₁) / 100 ) @@ -278,7 +278,7 @@ dt₁ = convert( _tType, oneunit_tType * - DiffEqBase.value( + SciMLBase.value( 10.0^(-(2 + log10(max_d₁d₂)) / order) ) ) @@ -335,7 +335,7 @@ end oneunit_tType = oneunit(t) dtmax_tdir = tdir * dtmax - dtmin = nextfloat(max(integrator.opts.dtmin, convert(_tType, oneunit_tType * eps(DiffEqBase.value(t))))) + dtmin = nextfloat(max(integrator.opts.dtmin, convert(_tType, oneunit_tType * eps(SciMLBase.value(t))))) smalldt = max(dtmin, convert(_tType, oneunit_tType * 1 // 10^(6))) if integrator.isdae @@ -386,7 +386,7 @@ end if d₀ < 1 // 10^(5) || d₁ < 1 // 10^(5) dt₀ = smalldt else - dt₀ = convert(_tType, oneunit_tType * DiffEqBase.value((d₀ / d₁) / 100)) + dt₀ = convert(_tType, oneunit_tType * SciMLBase.value((d₀ / d₁) / 100)) end dt₀ = min(dt₀, dtmax_tdir) dt₀_tdir = tdir * dt₀ @@ -417,7 +417,7 @@ end else dt₁ = _tType( oneunit_tType * - DiffEqBase.value( + SciMLBase.value( 10^(-(2 + log10(max_d₁d₂)) / order) ) ) diff --git a/lib/OrdinaryDiffEqCore/src/initialize_dae.jl b/lib/OrdinaryDiffEqCore/src/initialize_dae.jl index b29de2ed34a..62d7fe476d8 100644 --- a/lib/OrdinaryDiffEqCore/src/initialize_dae.jl +++ b/lib/OrdinaryDiffEqCore/src/initialize_dae.jl @@ -13,7 +13,7 @@ variable, then the system is not Index 1! ## Expansion -function DiffEqBase.initialize_dae!( +function SciMLBase.initialize_dae!( integrator::ODEIntegrator, initializealg = integrator.initializealg ) diff --git a/lib/OrdinaryDiffEqCore/src/integrators/controllers.jl b/lib/OrdinaryDiffEqCore/src/integrators/controllers.jl index 8b956cb9ebe..c653adfbf30 100644 --- a/lib/OrdinaryDiffEqCore/src/integrators/controllers.jl +++ b/lib/OrdinaryDiffEqCore/src/integrators/controllers.jl @@ -551,16 +551,16 @@ end @inline function stepsize_controller!(integrator, cache::IControllerCache, alg) (; qmin, qmax, gamma) = cache.controller.basic qmax = get_current_qmax(integrator, qmax) - EEst = DiffEqBase.value(get_EEst(integrator)) + EEst = SciMLBase.value(get_EEst(integrator)) if iszero(EEst) q = inv(qmax) else expo = 1 / (get_current_adaptive_order(alg, integrator.cache) + 1) qtmp = fastpower(EEst, expo) / gamma - @fastmath q = DiffEqBase.value(max(inv(qmax), min(inv(qmin), qtmp))) + @fastmath q = SciMLBase.value(max(inv(qmax), min(inv(qmin), qtmp))) # TODO: Shouldn't this be in `step_accept_controller!` as for the PI controller? - cache.dtreject = DiffEqBase.value(integrator.dt) / q + cache.dtreject = SciMLBase.value(integrator.dt) / q end return q end @@ -693,7 +693,7 @@ end (; qmin, qmax, gamma) = controller.basic qmax = get_current_qmax(integrator, qmax) (; beta1, beta2) = controller - EEst = DiffEqBase.value(get_EEst(integrator)) + EEst = SciMLBase.value(get_EEst(integrator)) if iszero(EEst) q = inv(qmax) @@ -710,7 +710,7 @@ function step_accept_controller!(integrator, cache::PIControllerCache, alg, q) (; controller) = cache (; qsteady_min, qsteady_max) = controller.basic qoldinit = controller.qoldinit - EEst = DiffEqBase.value(get_EEst(integrator)) + EEst = SciMLBase.value(get_EEst(integrator)) if qsteady_min <= q <= qsteady_max q = one(q) @@ -900,7 +900,7 @@ end (; controller) = cache beta1, beta2, beta3 = controller.beta - EEst = DiffEqBase.value(get_EEst(integrator)) + EEst = SciMLBase.value(get_EEst(integrator)) # If the error estimate is zero, we can increase the step size as much as # desired. This additional check fixes problems of the code below when the @@ -1082,7 +1082,7 @@ end @inline function stepsize_controller!(integrator, cache::PredictiveControllerCache, alg) (; qmin, qmax, gamma) = cache.controller.basic qmax = get_current_qmax(integrator, qmax) - EEst = DiffEqBase.value(get_EEst(integrator)) + EEst = SciMLBase.value(get_EEst(integrator)) if iszero(EEst) q = inv(qmax) else @@ -1099,7 +1099,7 @@ end end expo = 1 / (get_current_adaptive_order(alg, integrator.cache) + 1) qtmp = fastpower(EEst, expo) / fac - @fastmath q = DiffEqBase.value(max(inv(qmax), min(inv(qmin), qtmp))) + @fastmath q = SciMLBase.value(max(inv(qmax), min(inv(qmin), qtmp))) cache.qold = q end return q @@ -1110,7 +1110,7 @@ function step_accept_controller!(integrator, cache::PredictiveControllerCache, a (; qmin, qmax, gamma, qsteady_min, qsteady_max) = controller.basic qmax = get_current_qmax(integrator, qmax) - EEst = DiffEqBase.value(get_EEst(integrator)) + EEst = SciMLBase.value(get_EEst(integrator)) if integrator.success_iter > 0 expo = 1 / (get_current_adaptive_order(alg, integrator.cache) + 1) @@ -1124,7 +1124,7 @@ function step_accept_controller!(integrator, cache::PredictiveControllerCache, a if qsteady_min <= qacc <= qsteady_max qacc = one(qacc) end - cache.dtacc = DiffEqBase.value(integrator.dt) + cache.dtacc = SciMLBase.value(integrator.dt) cache.erracc = max(1.0e-2, EEst) return integrator.dt / qacc diff --git a/lib/OrdinaryDiffEqCore/src/integrators/integrator_interface.jl b/lib/OrdinaryDiffEqCore/src/integrators/integrator_interface.jl index 28e07c2c7d4..845bdb66c13 100644 --- a/lib/OrdinaryDiffEqCore/src/integrators/integrator_interface.jl +++ b/lib/OrdinaryDiffEqCore/src/integrators/integrator_interface.jl @@ -56,7 +56,7 @@ function SciMLBase.reeval_internals_due_to_modification!( callback_initializealg = nothing ) if integrator.isdae - DiffEqBase.initialize_dae!( + SciMLBase.initialize_dae!( integrator, isnothing(callback_initializealg) ? integrator.initializealg : callback_initializealg @@ -587,7 +587,7 @@ function SciMLBase.reinit!( if reinit_dae && (integrator.isdae || SciMLBase.has_initializeprob(integrator.sol.prob.f)) - DiffEqBase.initialize_dae!(integrator) + SciMLBase.initialize_dae!(integrator) update_uprev!(integrator) end diff --git a/lib/OrdinaryDiffEqCore/src/integrators/integrator_utils.jl b/lib/OrdinaryDiffEqCore/src/integrators/integrator_utils.jl index dd9dc0a36bd..b405cdd5ac3 100644 --- a/lib/OrdinaryDiffEqCore/src/integrators/integrator_utils.jl +++ b/lib/OrdinaryDiffEqCore/src/integrators/integrator_utils.jl @@ -91,7 +91,7 @@ post_step_reject!(integrator) = nothing # For SDE: isdae=false skips DAE re-init; isfsal=false makes update_fsal! a no-op. function on_derivative_discontinuity_at_init!(integrator) if integrator.isdae - DiffEqBase.initialize_dae!(integrator) + SciMLBase.initialize_dae!(integrator) end update_uprev!(integrator) return update_fsal!(integrator) @@ -531,7 +531,7 @@ function _loopfooter!(integrator) end integrator.t = fixed_t_for_tstop_error!(integrator, ttmp) - dtnew = DiffEqBase.value( + dtnew = SciMLBase.value( step_accept_controller!( integrator, integrator.alg, @@ -564,7 +564,7 @@ function _loopfooter!(integrator) # Take value because if t is dual then maxeig can be dual if is_composite_cache(integrator.cache) cur_eigen_est = integrator.opts.internalnorm( - DiffEqBase.value(integrator.eigen_est), + SciMLBase.value(integrator.eigen_est), integrator.t ) cur_eigen_est > integrator.stats.maxeig && diff --git a/lib/OrdinaryDiffEqCore/src/misc_utils.jl b/lib/OrdinaryDiffEqCore/src/misc_utils.jl index a130166a388..d2f3ea15e54 100644 --- a/lib/OrdinaryDiffEqCore/src/misc_utils.jl +++ b/lib/OrdinaryDiffEqCore/src/misc_utils.jl @@ -29,12 +29,12 @@ end # Nest one layer of value in order to get rid of possible Dual{Complex} or Complex{Dual} issues # value should recurse for anything else. function constvalue(::Type{T}) where {T} - _T = DiffEqBase.value(T) - return _T <: Complex ? DiffEqBase.value(real(_T)) : DiffEqBase.value(_T) + _T = SciMLBase.value(T) + return _T <: Complex ? SciMLBase.value(real(_T)) : SciMLBase.value(_T) end function constvalue(x) - _x = DiffEqBase.value(x) - return _x isa Complex ? DiffEqBase.value(real(_x)) : DiffEqBase.value(_x) + _x = SciMLBase.value(x) + return _x isa Complex ? SciMLBase.value(real(_x)) : SciMLBase.value(_x) end function diffdir(integrator::SciMLBase.DEIntegrator) diff --git a/lib/OrdinaryDiffEqCore/src/solve.jl b/lib/OrdinaryDiffEqCore/src/solve.jl index e82fcbb80fb..e1240f747e6 100644 --- a/lib/OrdinaryDiffEqCore/src/solve.jl +++ b/lib/OrdinaryDiffEqCore/src/solve.jl @@ -11,10 +11,10 @@ Base.@constprop :aggressive function SciMLBase.__solve( return integrator.sol end -determine_controller_datatype(u::AbstractVector{<:Number}, internalnorm, ts::Tuple{<:Number, <:Number}) = promote_type(typeof(DiffEqBase.value(internalnorm(u, ts[1]))), typeof(DiffEqBase.value(internalnorm(u, ts[2]))), eltype(DiffEqBase.value.(ts))) -determine_controller_datatype(u, internalnorm, ts::Tuple{<:Number, <:Number}) = promote_type(typeof(DiffEqBase.value(ts[1])), typeof(DiffEqBase.value(ts[2]))) # This seems to be an assumption implicitly taken somewhere -determine_controller_datatype(u::AbstractVector{<:Number}, internalnorm, ts::Tuple{<:Integer, <:Integer}) = promote_type(typeof(DiffEqBase.value(internalnorm(u, ts[1]))), typeof(DiffEqBase.value(internalnorm(u, ts[2]))), eltype(float.(DiffEqBase.value(ts)))) -determine_controller_datatype(u, internalnorm, ts::Tuple{<:Integer, <:Integer}) = promote_type(typeof(float(DiffEqBase.value(ts[1]))), typeof(float(DiffEqBase.value(ts[2])))) # This seems to be an assumption implicitly taken somewhere +determine_controller_datatype(u::AbstractVector{<:Number}, internalnorm, ts::Tuple{<:Number, <:Number}) = promote_type(typeof(SciMLBase.value(internalnorm(u, ts[1]))), typeof(SciMLBase.value(internalnorm(u, ts[2]))), eltype(SciMLBase.value.(ts))) +determine_controller_datatype(u, internalnorm, ts::Tuple{<:Number, <:Number}) = promote_type(typeof(SciMLBase.value(ts[1])), typeof(SciMLBase.value(ts[2]))) # This seems to be an assumption implicitly taken somewhere +determine_controller_datatype(u::AbstractVector{<:Number}, internalnorm, ts::Tuple{<:Integer, <:Integer}) = promote_type(typeof(SciMLBase.value(internalnorm(u, ts[1]))), typeof(SciMLBase.value(internalnorm(u, ts[2]))), eltype(float.(SciMLBase.value(ts)))) +determine_controller_datatype(u, internalnorm, ts::Tuple{<:Integer, <:Integer}) = promote_type(typeof(float(SciMLBase.value(ts[1]))), typeof(float(SciMLBase.value(ts[2])))) # This seems to be an assumption implicitly taken somewhere mutable struct zero_func_struct{u1Type, uType, tType, kType, CacheType, idxsType, varsType, callbackType, outType, FunctionType, tType2, ParameterType} u₁::u1Type @@ -729,7 +729,7 @@ Base.@constprop :aggressive function _ode_init( if initialize_integrator if isdae || SciMLBase.has_initializeprob(prob.f) || prob isa SciMLBase.ImplicitDiscreteProblem - DiffEqBase.initialize_dae!(integrator) + SciMLBase.initialize_dae!(integrator) !isnothing(integrator.u) && update_uprev!(integrator) end diff --git a/lib/OrdinaryDiffEqCore/test/qa/qa.jl b/lib/OrdinaryDiffEqCore/test/qa/qa.jl index 5dab2c4ae10..de307e1039b 100644 --- a/lib/OrdinaryDiffEqCore/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqCore/test/qa/qa.jl @@ -1,8 +1,76 @@ using SciMLTesting, OrdinaryDiffEqCore, Test +# `OrdinaryDiffEqCore.Predictor` is a generated `EnumX.@enumx` submodule, which +# ExplicitImports cannot statically analyze; allow it to be unanalyzable. +const UNANALYZABLE = (OrdinaryDiffEqCore.Predictor,) + run_qa( OrdinaryDiffEqCore; aqua_kwargs = (; piracies = false, unbound_args = false), explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + no_implicit_imports = (; allow_unanalyzable = UNANALYZABLE), + # These names are not used by OrdinaryDiffEqCore itself, but are imported + # into its namespace and re-imported by dependent OrdinaryDiffEq.jl + # sublibraries (e.g. `import OrdinaryDiffEqCore: calculate_residuals!`). + # ExplicitImports cannot see that cross-package usage, so it reports them + # as stale; they must remain part of this package's namespace contract. + no_stale_explicit_imports = (; + allow_unanalyzable = UNANALYZABLE, + ignore = ( + :BrownFullBasicInit, :ShampineCollocationInit, :DEVerbosity, + :Minimal, :_vec, :_reshape, :unwrap_cache, + :calculate_residuals, :calculate_residuals!, + ), + ), + # `constructorof` is owned by ConstructionBase but reached through SciMLBase + # (not a direct dependency); accessing it via SciMLBase is intentional. + all_qualified_accesses_via_owners = (; ignore = (:constructorof,)), + # Internal (non-`public`) names of upstream packages that OrdinaryDiffEqCore + # genuinely needs and that have no public replacement yet. + all_qualified_accesses_are_public = (; + ignore = ( + # Base / Core internals + Symbol("@max_methods"), :Experimental, :Typeof, :promote_op, + # ConstructionBase via SciMLBase + :constructorof, + # SciMLOperators internal + :AbstractSciMLOperator, + # SciMLBase internals + :AbstractRODEProblem, :DECache, :FunctionWrapperSpecialize, + :NoSpecialize, :enable_interpolation_sensitivitymode, + :forwarddiff_chunksize, :get_root_indp, + :get_save_idxs_and_saved_subsystem, :has_initializeprob, + :has_lazy_interpolation, :late_binding_update_u0_p, :remaker_of, + :save_discretes_if_enabled!, :save_final_discretes!, + :strip_interpolation, :struct_as_namedtuple, :unitfulvalue, + :unwrap_cache, :value, + # DiffEqBase internals + :max_vector_callback_length_int, :prepare_alg, :stripunits, + # EnzymeCore internals + :EnzymeRules, :inactive_noinl, + ), + ), + # Internal (non-`public`) names imported from upstream packages. + all_explicit_imports_are_public = (; + ignore = ( + # TruncatedStacktraces internals + Symbol("@truncate_stacktrace"), :VERBOSE_MSG, + # FunctionWrappers internal + :FunctionWrapper, + # FastPower internal + :fastpower, + # SciMLBase internals + :SENSITIVITY_INTERP_MESSAGE, :_unwrap_val, :last_step_failed, + :postamble!, + # DiffEqBase internals + :ODE_DEFAULT_UNSTABLE_CHECK, :_process_verbose_param, + :timedepentdtmin, + # Non-public names re-exported for dependent sublibraries + # (see `no_stale_explicit_imports` above). + :_vec, :_reshape, :unwrap_cache, + :calculate_residuals, :calculate_residuals!, + ), + ), + ), ) From 8a8d7ef139d6aeaa15a466c3220ab24d79e4da59 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:32:23 -0400 Subject: [PATCH 026/108] Minimize EI exceptions for OrdinaryDiffEqTsit5 Convert the blanket ei_broken in the QA suite to tight, documented ignore lists. Fixes the source so the previously-broken checks pass: - no_implicit_imports / via_owners: import alg_order from its owner SciMLBase, calculate_residuals(!)/initialize! from DiffEqBase, copyat_or_push! from RecursiveArrayTools, and make Reexport/@reexport, SciMLBase/ODEProblem and solve (CommonSolve) explicit. Adds CommonSolve as a direct dependency. - The residual non-public names (OrdinaryDiffEqCore internals, DiffEqBase residual helpers, SciMLBase @def, TruncatedStacktraces macro, and the precompile-workload specialization markers / lorenz helpers) are listed as tight per-source ignores rather than a blanket ei_broken; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. Verified on Julia 1.12 (SciMLTesting 1.7.0, SciMLBase 3.30.0): QA EI suite 17/17 pass, 0 fail/error/broken. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqTsit5/Project.toml | 2 + .../src/OrdinaryDiffEqTsit5.jl | 22 ++++++---- lib/OrdinaryDiffEqTsit5/test/qa/qa.jl | 43 ++++++++++++++++++- 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/lib/OrdinaryDiffEqTsit5/Project.toml b/lib/OrdinaryDiffEqTsit5/Project.toml index e7edc6c5e05..b68220ea56e 100644 --- a/lib/OrdinaryDiffEqTsit5/Project.toml +++ b/lib/OrdinaryDiffEqTsit5/Project.toml @@ -4,6 +4,7 @@ version = "2.0.2" authors = ["ParamThakkar123 "] [deps] +CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" @@ -22,6 +23,7 @@ DiffEqDevTools = {path = "../DiffEqDevTools"} OrdinaryDiffEqCore = {path = "../OrdinaryDiffEqCore"} [compat] +CommonSolve = "0.2.4" DiffEqBase = "7" DiffEqDevTools = "3" FastBroadcast = "1.3" diff --git a/lib/OrdinaryDiffEqTsit5/src/OrdinaryDiffEqTsit5.jl b/lib/OrdinaryDiffEqTsit5/src/OrdinaryDiffEqTsit5.jl index 0e013dc8e44..02950a98073 100644 --- a/lib/OrdinaryDiffEqTsit5/src/OrdinaryDiffEqTsit5.jl +++ b/lib/OrdinaryDiffEqTsit5/src/OrdinaryDiffEqTsit5.jl @@ -1,27 +1,31 @@ module OrdinaryDiffEqTsit5 -import OrdinaryDiffEqCore: alg_order, alg_stability_size, explicit_rk_docstring, +import OrdinaryDiffEqCore: alg_stability_size, explicit_rk_docstring, OrdinaryDiffEqAdaptiveAlgorithm, OrdinaryDiffEqMutableCache, alg_cache, OrdinaryDiffEqConstantCache, @fold, trivial_limiter!, - constvalue, perform_step!, calculate_residuals, @cache, - calculate_residuals!, _ode_interpolant, _ode_interpolant!, - CompiledFloats, @OnDemandTableauExtract, initialize!, - perform_step!, - CompositeAlgorithm, _ode_addsteps!, copyat_or_push!, + constvalue, perform_step!, @cache, + _ode_interpolant, _ode_interpolant!, + CompiledFloats, @OnDemandTableauExtract, + CompositeAlgorithm, _ode_addsteps!, AutoAlgSwitch, get_fsalfirstlast, full_cache, DerivativeOrderNotPossibleError using FastBroadcast: Serial import MuladdMacro: @muladd import FastBroadcast: @.. -import RecursiveArrayTools: recursivefill!, recursive_unitless_bottom_eltype +import RecursiveArrayTools: recursivefill!, recursive_unitless_bottom_eltype, + copyat_or_push! import LinearAlgebra: norm using TruncatedStacktraces: @truncate_stacktrace -import SciMLBase: @def +import SciMLBase: alg_order, @def +using DiffEqBase: calculate_residuals, calculate_residuals! +import DiffEqBase: initialize! import OrdinaryDiffEqCore +using CommonSolve: solve -using Reexport +using Reexport: Reexport, @reexport @reexport using SciMLBase +using SciMLBase: SciMLBase, ODEProblem include("algorithms.jl") include("alg_utils.jl") diff --git a/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl b/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl index 8a44e3e7b8d..09c251790f0 100644 --- a/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl @@ -3,5 +3,46 @@ using SciMLTesting, OrdinaryDiffEqTsit5, Test run_qa( OrdinaryDiffEqTsit5; explicit_imports = true, - ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # Solver-internal names accessed via their (qualified) owner module that + # have no public alternative on the registered releases. The OrdinaryDiffEqCore + # step-statistics mutators (increment_nf!/set_EEst!) and the lorenz/lorenz_oop + # precompile-workload test functions are OrdinaryDiffEqCore internals; + # FunctionWrapperSpecialize/NoSpecialize are SciMLBase specialization markers + # used in the (preference-gated) precompile workload and are not declared public. + all_qualified_accesses_are_public = (; + ignore = ( + :increment_nf!, # OrdinaryDiffEqCore + :set_EEst!, # OrdinaryDiffEqCore + :lorenz, # OrdinaryDiffEqCore + :lorenz_oop, # OrdinaryDiffEqCore + :FunctionWrapperSpecialize, # SciMLBase + :NoSpecialize, # SciMLBase + ), + ), + # Core solver-interface names imported from their owner module but not yet + # declared `public`. These are the OrdinaryDiffEq internal extension/dispatch + # API (OrdinaryDiffEqCore), the DiffEqBase residual helpers, SciMLBase's @def, + # and the TruncatedStacktraces macro. No public alternative exists; tracked for + # make-public in SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore + :alg_cache, :alg_stability_size, :AutoAlgSwitch, + Symbol("@cache"), :CompiledFloats, :CompositeAlgorithm, + :constvalue, :DerivativeOrderNotPossibleError, + :explicit_rk_docstring, Symbol("@fold"), :get_fsalfirstlast, + :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, + Symbol("@OnDemandTableauExtract"), + :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqConstantCache, + :OrdinaryDiffEqMutableCache, :perform_step!, :trivial_limiter!, + # DiffEqBase + :calculate_residuals, :calculate_residuals!, + # SciMLBase + Symbol("@def"), + # TruncatedStacktraces + Symbol("@truncate_stacktrace"), + ), + ), + ), ) From 756bfd7ecd0abd3eb18564b96322ca2d8000f3ce Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:33:11 -0400 Subject: [PATCH 027/108] OrdinaryDiffEqRosenbrock: minimize EI exceptions in run_qa Replace the blanket six-check ei_broken with targeted fixes plus tight, documented ignore lists: - no_implicit_imports / no_stale_explicit_imports now PASS: bare `using` statements made explicit, and 9 unused imports removed (@capture, Diagonal, _ad_chunksize_int, _ad_fdtype, calc_W, diag, diagm, lu!, namify). - Migrated now-public names to their public owners: alg_order from SciMLBase (imported so methods can be extended), UniformScaling from LinearAlgebra. - The remaining residual is genuinely-internal cross-package solver-interface names from OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation (plus a few DiffEqBase / SciMLBase / Base internals) with no public home; these are now listed explicitly per-check via ei_kwargs ignore lists instead of a blanket ei_broken, so any name later made public surfaces as an Unexpected Pass. Verified GROUP=QA on Julia 1.12 against released SciMLTesting 1.7.0: Quality Assurance 17/17 pass, 0 fail/error/broken/unexpected-pass. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqRosenbrock.jl | 34 ++++++++----- lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl | 49 ++++++++++++++++++- 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl b/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl index 50153bacbc4..3a8346fb437 100644 --- a/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl +++ b/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl @@ -1,6 +1,6 @@ module OrdinaryDiffEqRosenbrock -import OrdinaryDiffEqCore: alg_order, alg_adaptive_order, isWmethod, isfsal, _unwrap_val, +import OrdinaryDiffEqCore: alg_adaptive_order, isWmethod, isfsal, _unwrap_val, OrdinaryDiffEqRosenbrockAlgorithm, @cache, alg_cache, initialize!, calculate_residuals!, OrdinaryDiffEqMutableCache, @@ -12,19 +12,18 @@ import OrdinaryDiffEqCore: alg_order, alg_adaptive_order, isWmethod, isfsal, _un constvalue, only_diagonal_mass_matrix, calculate_residuals, has_stiff_interpolation, ODEIntegrator, resize_non_user_cache!, _ode_addsteps!, full_cache, - DerivativeOrderNotPossibleError, _ad_chunksize_int, _ad_fdtype, _fixup_ad, + DerivativeOrderNotPossibleError, _fixup_ad, LinearAliasSpecifier, copyat_or_push!, DifferentialVarsUndefined -using MuladdMacro, FastBroadcast, RecursiveArrayTools -import MacroTools: namify -using MacroTools: @capture +using MuladdMacro: MuladdMacro, @muladd +using FastBroadcast: FastBroadcast, @.. +using RecursiveArrayTools: RecursiveArrayTools, recursivefill! using DiffEqBase: @def import DifferentiationInterface as DI import LinearSolve -import LinearSolve: UniformScaling import ForwardDiff -using FiniteDiff -using LinearAlgebra: mul!, diag, diagm, I, Diagonal, norm, lu, lu! -using ADTypes +using FiniteDiff: FiniteDiff +using LinearAlgebra: mul!, I, norm, lu, UniformScaling +using ADTypes: ADTypes, AutoFiniteDiff, AutoForwardDiff import OrdinaryDiffEqCore, OrdinaryDiffEqDifferentiation using OrdinaryDiffEqDifferentiation: TimeDerivativeWrapper, TimeGradientWrapper, @@ -32,14 +31,25 @@ using OrdinaryDiffEqDifferentiation: TimeDerivativeWrapper, TimeGradientWrapper, wrapprecs, calc_tderivative, build_grad_config, build_jac_config, issuccess_W, jacobian2W!, resize_jac_config!, resize_grad_config!, - calc_W, calc_rosenbrock_differentiation!, build_J_W, + calc_rosenbrock_differentiation!, build_J_W, UJacobianWrapper, dolinsolve, WOperator, resize_J_W! using OrdinaryDiffEqDifferentiation: calc_rosenbrock_differentiation -using OrdinaryDiffEqRosenbrockTableaus -using Reexport +using OrdinaryDiffEqRosenbrockTableaus: OrdinaryDiffEqRosenbrockTableaus, + GRK4ARodasTableau, GRK4TRodasTableau, ROS2PRRodasTableau, ROS2RodasTableau, + ROS2SRodasTableau, ROS34PRwRodasTableau, ROS34PW1aRodasTableau, + ROS34PW1bRodasTableau, ROS34PW2RodasTableau, ROS3PRL2RodasTableau, + ROS3PRLRodasTableau, ROS3PRRodasTableau, ROS3PRodasTableau, ROS3RodasTableau, + Rodas3PRodasTableau, Rodas3RodasTableau, Rodas42Tableau, Rodas4P2Tableau, + Rodas4PTableau, Rodas4PWTableau, Rodas4Tableau, Rodas5Tableau, RodasTableau, + Ros4LStabRodasTableau, RosShamp4RodasTableau, RosenbrockW6S4OSRodasTableau, + Scholz4_7RodasTableau, Veldd4RodasTableau, Velds4RodasTableau +using Reexport: Reexport, @reexport @reexport using SciMLBase +using SciMLBase: SciMLBase, LinearProblem, ODEProblem, init, solve +# alg_order is owned by and public in SciMLBase; import (not using) so methods can be extended +import SciMLBase: alg_order import OrdinaryDiffEqCore: alg_autodiff import OrdinaryDiffEqCore diff --git a/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl b/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl index 513189baadc..b5d934e4bb7 100644 --- a/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl @@ -1,7 +1,54 @@ using SciMLTesting, OrdinaryDiffEqRosenbrock, Test +# The names ignored below are internal (non-public) cross-package interface +# names. OrdinaryDiffEqRosenbrock is a solver sublibrary that, by design, +# consumes the internal solver interfaces of its sibling packages +# OrdinaryDiffEqCore and OrdinaryDiffEqDifferentiation (and a few DiffEqBase / +# SciMLBase / Base internals). These names have no public home to migrate to, +# so they are listed explicitly rather than blanket-skipped via `ei_broken`, so +# that any name later made public will surface as an Unexpected Pass and can be +# dropped from these lists. See SciML/OrdinaryDiffEq.jl#3776. + +# Internal names imported via a non-owner sibling package (re-exported through +# OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation) or otherwise not public in +# the module they are imported from. +const ROSENBROCK_INTERNAL_EXPLICIT_IMPORTS = ( + Symbol("@cache"), Symbol("@def"), + :DerivativeOrderNotPossibleError, :DifferentialVarsUndefined, :ODEIntegrator, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + :OrdinaryDiffEqRosenbrockAdaptiveAlgorithm, :OrdinaryDiffEqRosenbrockAlgorithm, + :TimeDerivativeWrapper, :TimeGradientWrapper, :UDerivativeWrapper, + :UJacobianWrapper, :WOperator, + :_fixup_ad, :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, + :_reshape, :_unwrap_val, :_vec, + :alg_adaptive_order, :alg_autodiff, :alg_cache, + :build_J_W, :build_grad_config, :build_jac_config, + :calc_rosenbrock_differentiation, :calc_rosenbrock_differentiation!, + :calc_tderivative, :calculate_residuals, :calculate_residuals!, + :constvalue, :copyat_or_push!, :dolinsolve, :generic_solver_docstring, + :get_fsalfirstlast, :has_stiff_interpolation, :initialize!, :isWmethod, + :isfsal, :issuccess_W, :jacobian2W!, :only_diagonal_mass_matrix, + :perform_step!, :resize_J_W!, :resize_grad_config!, :resize_jac_config!, + :trivial_limiter!, :wrapprecs, +) + +# Internal names accessed via qualified access on a non-owner / non-public name. +const ROSENBROCK_INTERNAL_QUALIFIED_ACCESSES = ( + Symbol("@set"), # SciMLBase.@set (owned by Accessors, non-public re-export) + :FunctionWrapperSpecialize, # SciMLBase internal (precompile workload only) + :NoSpecialize, # SciMLBase internal (precompile workload only) + :get_EEst, :set_EEst!, :increment_nf!, # OrdinaryDiffEqCore internal + :lorenz, :lorenz_oop, # OrdinaryDiffEqCore precompile test helpers + :setindex, # Base.setindex (non-public) +) + run_qa( OrdinaryDiffEqRosenbrock; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + all_explicit_imports_via_owners = (; ignore = ROSENBROCK_INTERNAL_EXPLICIT_IMPORTS), + all_explicit_imports_are_public = (; ignore = ROSENBROCK_INTERNAL_EXPLICIT_IMPORTS), + all_qualified_accesses_via_owners = (; ignore = ROSENBROCK_INTERNAL_QUALIFIED_ACCESSES), + all_qualified_accesses_are_public = (; ignore = ROSENBROCK_INTERNAL_QUALIFIED_ACCESSES), + ), ) From a09cb0533c0e22a59b80287fdc1632d7886923d8 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:34:35 -0400 Subject: [PATCH 028/108] Minimize EI exceptions for OrdinaryDiffEqStabilizedRK Replace the blanket six-entry ei_broken with tight, documented ignore lists. Import SciMLBase/DiffEqBase-owned names (alg_order, _vec, value, initialize!, calculate_residuals, calculate_residuals!) from their owner modules, make FastBroadcast/MuladdMacro/RecursiveArrayTools/Reexport imports explicit, drop stale OrdinaryDiffEqCore imports, and replace qualified DiffEqBase.value accesses with the imported binding. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqStabilizedRK.jl | 29 ++++++++++++------- .../src/rkc_perform_step.jl | 12 ++++---- lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl | 22 +++++++++++++- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/lib/OrdinaryDiffEqStabilizedRK/src/OrdinaryDiffEqStabilizedRK.jl b/lib/OrdinaryDiffEqStabilizedRK/src/OrdinaryDiffEqStabilizedRK.jl index 334bae67c01..d7217279db5 100644 --- a/lib/OrdinaryDiffEqStabilizedRK/src/OrdinaryDiffEqStabilizedRK.jl +++ b/lib/OrdinaryDiffEqStabilizedRK/src/OrdinaryDiffEqStabilizedRK.jl @@ -1,21 +1,28 @@ module OrdinaryDiffEqStabilizedRK -import OrdinaryDiffEqCore: alg_order, alg_adaptive_order, calculate_residuals!, - beta2_default, beta1_default, gamma_default, qmax_default, alg_extrapolates, +import OrdinaryDiffEqCore: alg_adaptive_order, + gamma_default, qmax_default, alg_extrapolates, fac_default_gamma, has_dtnew_modification, - initialize!, perform_step!, unwrap_alg, - calculate_residuals, - OrdinaryDiffEqAlgorithm, default_controller, PredictiveController, + perform_step!, unwrap_alg, + default_controller, PredictiveController, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, - OrdinaryDiffEqAdaptiveAlgorithm, calc_dt_propose!, - alg_cache, _vec, _reshape, @cache, - constvalue, _unwrap_val, full_cache, get_fsalfirstlast, + OrdinaryDiffEqAdaptiveAlgorithm, + alg_cache, @cache, + constvalue, full_cache, get_fsalfirstlast, generic_solver_docstring -using FastBroadcast, MuladdMacro, RecursiveArrayTools import OrdinaryDiffEqCore -using DiffEqBase: DiffEqBase, value +using FastBroadcast: FastBroadcast, @.. +using MuladdMacro: MuladdMacro, @muladd +using RecursiveArrayTools: RecursiveArrayTools, recursivefill! +# `calculate_residuals`/`calculate_residuals!`/`initialize!` are owned by DiffEqBase; +# `alg_order`/`_vec`/`value` are owned by SciMLBase. Import from the owner. +# `initialize!`/`alg_order` are extended here, so they must be `import`ed. +import DiffEqBase: initialize! +using DiffEqBase: calculate_residuals, calculate_residuals! -using Reexport +using SciMLBase: SciMLBase +import SciMLBase: alg_order, _vec, value +using Reexport: Reexport, @reexport @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqStabilizedRK/src/rkc_perform_step.jl b/lib/OrdinaryDiffEqStabilizedRK/src/rkc_perform_step.jl index 506cf576bcb..c1eb62461cc 100644 --- a/lib/OrdinaryDiffEqStabilizedRK/src/rkc_perform_step.jl +++ b/lib/OrdinaryDiffEqStabilizedRK/src/rkc_perform_step.jl @@ -139,7 +139,7 @@ end else @.. broadcast = false u = -δt₂ * k end - c = DiffEqBase.value(sign(δt₁)) * integrator.opts.internalnorm(δt₁, t) + c = value(sign(δt₁)) * integrator.opts.internalnorm(δt₁, t) tᵢ₋₁ += c f(k, uᵢ₋₁, p, tᵢ₋₁) OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) @@ -249,7 +249,7 @@ end # Stage-2 c₂ = a₂₁ - _c₂ = DiffEqBase.value(sign(c₂)) * integrator.opts.internalnorm(c₂, t) + _c₂ = value(sign(c₂)) * integrator.opts.internalnorm(c₂, t) tᵢ₋₂ = tᵢ₋₁ + _c₂ uᵢ₋₁ = f(uᵢ₋₁, p, tᵢ₋₂) OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) @@ -262,7 +262,7 @@ end # Stage-3 c₃ = a₃₁ + a₃₂ - _c₃ = DiffEqBase.value(sign(c₃)) * integrator.opts.internalnorm(c₃, t) + _c₃ = value(sign(c₃)) * integrator.opts.internalnorm(c₃, t) tᵢ₋₂ = tᵢ₋₁ + _c₃ uᵢ₋₂ = f(uᵢ₋₂, p, tᵢ₋₂) OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) @@ -274,7 +274,7 @@ end #Stage-4 c₄ = a₄₁ + a₄₂ + a₄₃ - _c₄ = DiffEqBase.value(sign(c₄)) * integrator.opts.internalnorm(c₄, t) + _c₄ = value(sign(c₄)) * integrator.opts.internalnorm(c₄, t) tᵢ₋₂ = tᵢ₋₁ + _c₄ uᵢ₋₃ = f(uᵢ₋₃, p, tᵢ₋₂) OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) @@ -400,7 +400,7 @@ end # Stage-3 c₃ = a₃₁ + a₃₂ - _c₃ = DiffEqBase.value(sign(c₃)) * integrator.opts.internalnorm(c₃, t) + _c₃ = value(sign(c₃)) * integrator.opts.internalnorm(c₃, t) tᵢ₋₂ = tᵢ₋₁ + _c₃ f(k, uᵢ₋₂, p, tᵢ₋₂) OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) @@ -412,7 +412,7 @@ end #Stage-4 c₄ = a₄₁ + a₄₂ + a₄₃ - _c₄ = DiffEqBase.value(sign(c₄)) * integrator.opts.internalnorm(c₄, t) + _c₄ = value(sign(c₄)) * integrator.opts.internalnorm(c₄, t) tᵢ₋₂ = tᵢ₋₁ + _c₄ f(k, uᵢ₋₃, p, tᵢ₋₂) OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) diff --git a/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl b/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl index fe026790d6c..3d787c7272d 100644 --- a/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl @@ -3,5 +3,25 @@ using SciMLTesting, OrdinaryDiffEqStabilizedRK, Test run_qa( OrdinaryDiffEqStabilizedRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + # OrdinaryDiffEqCore solver-interface internals (no public owner elsewhere) + # plus SciMLBase/DiffEqBase helpers that StabilizedRK extends/uses but which + # are not yet marked public in their owner modules. + all_explicit_imports_are_public = ( + ignore = ( + :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqConstantCache, + :OrdinaryDiffEqMutableCache, :PredictiveController, + :alg_adaptive_order, :alg_cache, :alg_extrapolates, :constvalue, + :default_controller, :fac_default_gamma, :gamma_default, + :generic_solver_docstring, :get_fsalfirstlast, + :has_dtnew_modification, :perform_step!, :qmax_default, :unwrap_alg, + Symbol("@cache"), + :_vec, :value, :calculate_residuals, :calculate_residuals!, + ), + ), + # OrdinaryDiffEqCore step-statistics setters accessed by qualified name. + all_qualified_accesses_are_public = ( + ignore = (:increment_nf!, :set_EEst!), + ), + ), ) From 1e197a0aa3fd8c3a9b9460484aa3a76213537151 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:39:46 -0400 Subject: [PATCH 029/108] OrdinaryDiffEqTaylorSeries: minimize EI exceptions in run_qa Eliminate the blanket ei_broken=(5 checks) by migrating now-public names to their public owners, making implicit imports explicit, removing stale imports, and narrowing residual non-public internals to tight documented ignore lists. - alg_order now imported from its owner SciMLBase (public) - initialize!/calculate_residuals!/calculate_residuals imported from owner DiffEqBase (initialize! public; residuals stay in ignore list) - @reexport made an explicit import (using Reexport: @reexport) - TaylorDiff get_coefficient/append_coefficient/flatten qualified at use sites so all TaylorDiff internals are qualified accesses, not explicit imports - dropped stale imports: @OnDemandTableauExtract, @def, @fold, AutoAlgSwitch, CompiledFloats, CompositeAlgorithm, constvalue, copyat_or_push!, extract_derivative(!), norm, recursive_unitless_bottom_eltype, full_cache, bare using FunctionWrappers, bare using TaylorDiff/Symbolics - remaining OrdinaryDiffEqCore solver-interface internals (perform_step!, alg_cache, controllers, stats hooks, etc.) plus a handful of other-package internals with no public alias are kept in tight ignore lists keyed per check (see SciML/OrdinaryDiffEq.jl#3776) run_qa EI verified green on Julia 1.12 (6/6 checks pass, no ei_broken, no @test_broken); package precompiles and all three solvers solve correctly. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqTaylorSeries.jl | 31 +++++++------- .../src/TaylorSeries_perform_step.jl | 10 ++--- .../src/alg_utils.jl | 6 +-- lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl | 41 ++++++++++++++++++- 4 files changed, 62 insertions(+), 26 deletions(-) diff --git a/lib/OrdinaryDiffEqTaylorSeries/src/OrdinaryDiffEqTaylorSeries.jl b/lib/OrdinaryDiffEqTaylorSeries/src/OrdinaryDiffEqTaylorSeries.jl index 3ca089f50e6..2efa6268db3 100644 --- a/lib/OrdinaryDiffEqTaylorSeries/src/OrdinaryDiffEqTaylorSeries.jl +++ b/lib/OrdinaryDiffEqTaylorSeries/src/OrdinaryDiffEqTaylorSeries.jl @@ -1,31 +1,30 @@ module OrdinaryDiffEqTaylorSeries -import OrdinaryDiffEqCore: alg_order, alg_stability_size, explicit_rk_docstring, +import OrdinaryDiffEqCore: alg_stability_size, explicit_rk_docstring, OrdinaryDiffEqAdaptiveAlgorithm, OrdinaryDiffEqMutableCache, alg_cache, - OrdinaryDiffEqConstantCache, @fold, trivial_limiter!, - constvalue, perform_step!, calculate_residuals, @cache, - calculate_residuals!, _ode_interpolant, _ode_interpolant!, - CompiledFloats, @OnDemandTableauExtract, initialize!, - perform_step!, OrdinaryDiffEqAlgorithm, - CompositeAlgorithm, _ode_addsteps!, copyat_or_push!, - AutoAlgSwitch, get_fsalfirstlast, - full_cache, DerivativeOrderNotPossibleError, unwrap_alg, step_accept_controller!, + OrdinaryDiffEqConstantCache, trivial_limiter!, + perform_step!, @cache, + _ode_interpolant, _ode_interpolant!, + OrdinaryDiffEqAlgorithm, + _ode_addsteps!, + get_fsalfirstlast, + DerivativeOrderNotPossibleError, unwrap_alg, step_accept_controller!, stepsize_controller!, get_current_adaptive_order, get_current_alg_order using FastBroadcast: Serial import MuladdMacro: @muladd import FastBroadcast: @.. -import RecursiveArrayTools: recursivefill!, recursive_unitless_bottom_eltype -import LinearAlgebra: norm +import RecursiveArrayTools: recursivefill! using TruncatedStacktraces: @truncate_stacktrace -using TaylorDiff, Symbolics -using TaylorDiff: make_seed, get_coefficient, append_coefficient, flatten -import SciMLBase: @def, unwrapped_f +using TaylorDiff: TaylorDiff, TaylorArray, TaylorScalar +using Symbolics: Symbolics, @variables, build_function +using SymbolicUtils: SymbolicUtils +import SciMLBase: SciMLBase, unwrapped_f, alg_order, ODEFunction, ODEProblem, solve +import DiffEqBase: initialize!, calculate_residuals, calculate_residuals! import OrdinaryDiffEqCore -using FunctionWrappers import FunctionWrappers: FunctionWrapper -using Reexport +using Reexport: @reexport @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqTaylorSeries/src/TaylorSeries_perform_step.jl b/lib/OrdinaryDiffEqTaylorSeries/src/TaylorSeries_perform_step.jl index 06535e63e36..c5de4050031 100644 --- a/lib/OrdinaryDiffEqTaylorSeries/src/TaylorSeries_perform_step.jl +++ b/lib/OrdinaryDiffEqTaylorSeries/src/TaylorSeries_perform_step.jl @@ -1,5 +1,3 @@ -using TaylorDiff: TaylorDiff, extract_derivative, extract_derivative! - # Extract the first-order derivative from TaylorScalar results. # For scalars, access .partials[1]; for arrays, map over elements. @inline _extract_taylor2_deriv(x::TaylorScalar) = x.partials[1] @@ -7,9 +5,9 @@ using TaylorDiff: TaylorDiff, extract_derivative, extract_derivative! # Extract the i-th coefficient from a TaylorScalar or array of TaylorScalars. # For scalar problems, returns a scalar. For array problems, returns a vector. -@inline _taylor_get_coefficient(ts::TaylorScalar, i::Int) = get_coefficient(ts, i) +@inline _taylor_get_coefficient(ts::TaylorScalar, i::Int) = TaylorDiff.get_coefficient(ts, i) @inline function _taylor_get_coefficient(arr::AbstractArray{<:TaylorScalar}, i::Int) - return map(ts -> get_coefficient(ts, i), arr) + return map(ts -> TaylorDiff.get_coefficient(ts, i), arr) end @inline make_taylor(all::Vararg{X, P}) where {P, X <: AbstractArray} = TaylorArray( @@ -101,7 +99,7 @@ function initialize!(integrator, cache::ExplicitTaylorCache{P}) where {P} resize!(integrator.k, P) # Setup k pointers for i in 1:P - integrator.k[i] = get_coefficient(cache.utaylor, i) + integrator.k[i] = TaylorDiff.get_coefficient(cache.utaylor, i) end return nothing end @@ -129,7 +127,7 @@ end # Copy Taylor coefficients into k for dense output interpolation. # Use map! to avoid the intermediate allocation from get_coefficient. for i in 1:P - map!(ts -> get_coefficient(ts, i), integrator.k[i], utaylor) + map!(ts -> TaylorDiff.get_coefficient(ts, i), integrator.k[i], utaylor) end return nothing end diff --git a/lib/OrdinaryDiffEqTaylorSeries/src/alg_utils.jl b/lib/OrdinaryDiffEqTaylorSeries/src/alg_utils.jl index 3e278d80a56..9750f7e41a1 100644 --- a/lib/OrdinaryDiffEqTaylorSeries/src/alg_utils.jl +++ b/lib/OrdinaryDiffEqTaylorSeries/src/alg_utils.jl @@ -74,8 +74,8 @@ function build_jet(f, ::Val{iip}, p, order::Val{P}, length = nothing) where {P, else fu = f(u, p, t) end - d = get_coefficient(fu, index - 1) / index - u = append_coefficient(u, d) + d = TaylorDiff.get_coefficient(fu, index - 1) / index + u = TaylorDiff.append_coefficient(u, d) end # Flatten TaylorScalar coefficients for build_function (it doesn't handle custom structs) @@ -126,7 +126,7 @@ end for i in P:-1:1 ex = :(v[$i] + z * $ex) end - return :($(Expr(:meta, :inline)); v = flatten(t); $ex) + return :($(Expr(:meta, :inline)); v = TaylorDiff.flatten(t); $ex) end # Evaluate polynomial for scalar TaylorScalar (returns scalar) diff --git a/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl b/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl index 80ff9e9cb67..4d631ad5cb6 100644 --- a/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl @@ -1,5 +1,11 @@ using SciMLTesting, OrdinaryDiffEqTaylorSeries, Test +# Every name in the ignore lists below is genuinely internal (not exported and +# not declared `public`) in its OWNER package, so there is no public name to +# migrate to. The vast majority are OrdinaryDiffEqCore solver-interface hooks +# (perform_step!/alg_cache/initialize!/controllers/etc.) that sublibraries must +# extend; once OrdinaryDiffEqCore marks them `public` these entries should be +# dropped (see SciML/OrdinaryDiffEq.jl#3776). run_qa( OrdinaryDiffEqTaylorSeries; aqua_kwargs = (; @@ -7,5 +13,38 @@ run_qa( ambiguities = false, ), explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # Explicit imports of names that are not `public` in their owner. + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore solver-interface internals + Symbol("@cache"), :DerivativeOrderNotPossibleError, + :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqAlgorithm, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, + :alg_cache, :alg_stability_size, :explicit_rk_docstring, + :get_current_adaptive_order, :get_current_alg_order, + :get_fsalfirstlast, :perform_step!, :step_accept_controller!, + :stepsize_controller!, :trivial_limiter!, :unwrap_alg, + # DiffEqBase residual-calculation internals + :calculate_residuals, :calculate_residuals!, + # other-package internals with no public alias + Symbol("@truncate_stacktrace"), :FunctionWrapper, + ), + ), + # Qualified accesses (Module.name) of non-public names. + all_qualified_accesses_are_public = (; + ignore = ( + # OrdinaryDiffEqCore stats/controller internals + :get_EEst, :increment_nf!, :set_EEst!, :sync_controllers!, + # lorenz/lorenz_oop test functions used in @compile_workload + :lorenz, :lorenz_oop, + # TaylorDiff internals (no public API for these primitives) + :append_coefficient, :flatten, :get_coefficient, :make_seed, + :partials, + # SciMLBase / Base / Symbolics internals + :NoSpecialize, :RefValue, :variables, + ), + ), + ), ) From 6305d3372b64da6b1a69935441c59837293aafbb Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:39:56 -0400 Subject: [PATCH 030/108] OrdinaryDiffEqVerner: minimize EI exceptions in run_qa Replace the blanket 5-check ei_broken with targeted fixes plus tight, documented ignore lists: - Remove stale explicit imports (OrdinaryDiffEqAlgorithm, uses_uprev, _reshape, _vec, @tight_loop_macros). - Relocate names to their public owners so the via_owners and public checks pass: alg_order from SciMLBase; initialize! and the calculate_residuals pair from DiffEqBase; copyat_or_push!, recursive_unitless_bottom_eltype, recursivecopy, recursivefill! from RecursiveArrayTools. - Make previously-implicit imports explicit (@.., Serial, @muladd, @reexport, ODEProblem) and qualify solve as SciMLBase.solve in the precompile workload. - Narrow the residual exceptions to tightly-scoped, documented ignore lists covering only the OrdinaryDiffEqCore / SciMLBase / DiffEqBase / TruncatedStacktraces internal (non-public) names actually used. Verified on Julia 1.12 against released SciMLTesting 1.7.0: all 6 ExplicitImports checks pass (6/6). Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqVerner.jl | 28 ++++++++------- lib/OrdinaryDiffEqVerner/test/qa/qa.jl | 34 ++++++++++++++++++- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/lib/OrdinaryDiffEqVerner/src/OrdinaryDiffEqVerner.jl b/lib/OrdinaryDiffEqVerner/src/OrdinaryDiffEqVerner.jl index 5ea1da71613..b218636c927 100644 --- a/lib/OrdinaryDiffEqVerner/src/OrdinaryDiffEqVerner.jl +++ b/lib/OrdinaryDiffEqVerner/src/OrdinaryDiffEqVerner.jl @@ -1,27 +1,29 @@ module OrdinaryDiffEqVerner -import OrdinaryDiffEqCore: alg_order, calculate_residuals!, - initialize!, perform_step!, unwrap_alg, - calculate_residuals, alg_stability_size, - OrdinaryDiffEqAlgorithm, +import OrdinaryDiffEqCore: perform_step!, unwrap_alg, + alg_stability_size, CompositeAlgorithm, accept_step_controller, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, - OrdinaryDiffEqAdaptiveAlgorithm, CompiledFloats, uses_uprev, - alg_cache, _vec, _reshape, @cache, isfsal, full_cache, - constvalue, _unwrap_val, + OrdinaryDiffEqAdaptiveAlgorithm, CompiledFloats, + alg_cache, @cache, isfsal, full_cache, + constvalue, explicit_rk_docstring, trivial_limiter!, _ode_interpolant, _ode_interpolant!, _ode_addsteps!, @fold, @OnDemandTableauExtract, AutoAlgSwitch, DerivativeOrderNotPossibleError, - get_fsalfirstlast, copyat_or_push! -using FastBroadcast, MuladdMacro, RecursiveArrayTools -using DiffEqBase: @def, @tight_loop_macros -using FastBroadcast: Serial + get_fsalfirstlast +import DiffEqBase: calculate_residuals!, calculate_residuals, initialize! +import SciMLBase: alg_order, _unwrap_val, @def +using FastBroadcast: @.., Serial +using MuladdMacro: @muladd +using RecursiveArrayTools: recursive_unitless_bottom_eltype, recursivecopy, + recursivefill!, copyat_or_push! using TruncatedStacktraces: @truncate_stacktrace using LinearAlgebra: norm import OrdinaryDiffEqCore -using Reexport +using Reexport: @reexport @reexport using SciMLBase +using SciMLBase: ODEProblem include("algorithms.jl") include("alg_utils.jl") @@ -94,7 +96,7 @@ PrecompileTools.@compile_workload begin end for prob in prob_list, solver in solver_list - solve(prob, solver)(5.0) + SciMLBase.solve(prob, solver)(5.0) end prob_list = nothing diff --git a/lib/OrdinaryDiffEqVerner/test/qa/qa.jl b/lib/OrdinaryDiffEqVerner/test/qa/qa.jl index 0c16eeda483..a5a34261413 100644 --- a/lib/OrdinaryDiffEqVerner/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqVerner/test/qa/qa.jl @@ -3,5 +3,37 @@ using SciMLTesting, OrdinaryDiffEqVerner, Test run_qa( OrdinaryDiffEqVerner; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + # `SciMLBase` module name is brought into scope by `@reexport using SciMLBase` + # (intentional: this package re-exports the SciMLBase public API and also uses + # it as a qualified accessor, e.g. `SciMLBase.solve`, `SciMLBase.AutoSpecialize`). + no_implicit_imports = (; ignore = (:SciMLBase,)), + # Qualified accesses to names that are not (yet) declared public by their owners. + all_qualified_accesses_are_public = (; + ignore = ( + # SciMLBase internals + :FunctionWrapperSpecialize, :NoSpecialize, :has_lazy_interpolation, + # OrdinaryDiffEqCore internals + :increment_nf!, :set_EEst!, :lorenz, :lorenz_oop, + )), + # Explicit imports of names not (yet) declared public by their owners. + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internals (solver/cache/interpolation interface) + :accept_step_controller, :alg_cache, :alg_stability_size, :AutoAlgSwitch, + Symbol("@cache"), :CompiledFloats, :CompositeAlgorithm, :constvalue, + :DerivativeOrderNotPossibleError, :explicit_rk_docstring, Symbol("@fold"), + :get_fsalfirstlast, :isfsal, :_ode_addsteps!, :_ode_interpolant, + :_ode_interpolant!, Symbol("@OnDemandTableauExtract"), + :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqConstantCache, + :OrdinaryDiffEqMutableCache, :perform_step!, :trivial_limiter!, + :unwrap_alg, + # SciMLBase internals + Symbol("@def"), :_unwrap_val, + # DiffEqBase internals + :calculate_residuals, :calculate_residuals!, + # TruncatedStacktraces internal macro + Symbol("@truncate_stacktrace"), + )), + ), ) From 2245280b2cc2e2da757846c2484abacaa3677052 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:40:01 -0400 Subject: [PATCH 031/108] Minimize EI exceptions for OrdinaryDiffEqStabilizedIRK QA Replace the blanket ei_broken (5 disabled checks) with all 6 EI checks passing. Fix the source so no_implicit_imports, no_stale_explicit_imports, and all_explicit_imports_via_owners pass: - Make bare `using` explicit: import @.. (FastBroadcast), recursivefill! (RecursiveArrayTools); `using Reexport: Reexport, @reexport`; `using SciMLBase: SciMLBase` before the @reexport. - Migrate names to their owner module: alg_order/_unwrap_val/_reshape/_vec from SciMLBase; calculate_residuals/calculate_residuals!/initialize! from DiffEqBase; get_W/isnewton from OrdinaryDiffEqCore. - Unqualify increment_nf!/set_EEst! (now explicitly imported). - Drop stale imports (alg_maximum_order, beta1/beta2_default, OrdinaryDiffEqAlgorithm/AdaptiveAlgorithm/AdaptiveImplicitAlgorithm, RKC, _ad_chunksize_int, _ad_fdtype, AbstractADType, full_cache) and the unused MuladdMacro dependency. The only residual EI exceptions are a tight, documented ignore list of solver-interface names that are imported from their owner module but not yet declared `public` on the registered releases (tracked for make-public in SciML/OrdinaryDiffEq.jl#3776). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqStabilizedIRK/Project.toml | 2 - .../src/OrdinaryDiffEqStabilizedIRK.jl | 39 ++++++++++--------- .../src/irkc_perform_step.jl | 16 ++++---- .../src/irkc_utils.jl | 8 ++-- lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl | 30 +++++++++++++- 5 files changed, 61 insertions(+), 34 deletions(-) diff --git a/lib/OrdinaryDiffEqStabilizedIRK/Project.toml b/lib/OrdinaryDiffEqStabilizedIRK/Project.toml index c8da6da231f..9c605a48298 100644 --- a/lib/OrdinaryDiffEqStabilizedIRK/Project.toml +++ b/lib/OrdinaryDiffEqStabilizedIRK/Project.toml @@ -5,7 +5,6 @@ version = "2.0.1" [deps] FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" -MuladdMacro = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" OrdinaryDiffEqDifferentiation = "4302a76b-040a-498a-8c04-15b101fed76b" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" @@ -34,7 +33,6 @@ Test = "<0.0.1, 1" FastBroadcast = "1.3" Random = "<0.0.1, 1" DiffEqDevTools = "3" -MuladdMacro = "0.2.1" LinearAlgebra = "1.10" OrdinaryDiffEqDifferentiation = "3" SciMLBase = "3.10.0" diff --git a/lib/OrdinaryDiffEqStabilizedIRK/src/OrdinaryDiffEqStabilizedIRK.jl b/lib/OrdinaryDiffEqStabilizedIRK/src/OrdinaryDiffEqStabilizedIRK.jl index c88cdd7b10d..b9f8a148431 100644 --- a/lib/OrdinaryDiffEqStabilizedIRK/src/OrdinaryDiffEqStabilizedIRK.jl +++ b/lib/OrdinaryDiffEqStabilizedIRK/src/OrdinaryDiffEqStabilizedIRK.jl @@ -1,29 +1,30 @@ module OrdinaryDiffEqStabilizedIRK -import OrdinaryDiffEqCore: alg_order, alg_maximum_order, - calculate_residuals!, default_controller, IController, - beta2_default, beta1_default, gamma_default, issplit, - initialize!, perform_step!, unwrap_alg, - calculate_residuals, fac_default_gamma, - OrdinaryDiffEqAlgorithm, OrdinaryDiffEqNewtonAdaptiveAlgorithm, +import OrdinaryDiffEqCore: default_controller, IController, + gamma_default, issplit, + perform_step!, unwrap_alg, fac_default_gamma, + OrdinaryDiffEqNewtonAdaptiveAlgorithm, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, - OrdinaryDiffEqAdaptiveAlgorithm, - OrdinaryDiffEqAdaptiveImplicitAlgorithm, - alg_cache, _unwrap_val, @cache, - _reshape, _vec, full_cache, get_fsalfirstlast, - generic_solver_docstring, _ad_chunksize_int, _ad_fdtype, _fixup_ad + alg_cache, @cache, + get_fsalfirstlast, increment_nf!, set_EEst!, + generic_solver_docstring, _fixup_ad, + get_W, isnewton -using OrdinaryDiffEqDifferentiation: dolinsolve, update_W! -using OrdinaryDiffEqNonlinearSolve: NLNewton, nlsolve!, isnewton, build_nlsolver, - markfirststage!, du_alias_or_new, get_W +import SciMLBase: alg_order, _unwrap_val, _reshape, _vec +import DiffEqBase: calculate_residuals, calculate_residuals!, initialize! -using OrdinaryDiffEqStabilizedRK: ESERK4, ESERK5, RKC, SERK2 +import OrdinaryDiffEqDifferentiation: dolinsolve, update_W! +import OrdinaryDiffEqNonlinearSolve: NLNewton, nlsolve!, build_nlsolver, + markfirststage!, du_alias_or_new -using FastBroadcast, MuladdMacro, RecursiveArrayTools -import OrdinaryDiffEqCore -import ADTypes: AutoForwardDiff, AbstractADType +using OrdinaryDiffEqStabilizedRK: ESERK4, ESERK5, SERK2 -using Reexport +import FastBroadcast: @.. +import RecursiveArrayTools: recursivefill! +import ADTypes: AutoForwardDiff + +using Reexport: Reexport, @reexport +using SciMLBase: SciMLBase @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqStabilizedIRK/src/irkc_perform_step.jl b/lib/OrdinaryDiffEqStabilizedIRK/src/irkc_perform_step.jl index 1a41409f24e..5ae18e9b7b9 100644 --- a/lib/OrdinaryDiffEqStabilizedIRK/src/irkc_perform_step.jl +++ b/lib/OrdinaryDiffEqStabilizedIRK/src/irkc_perform_step.jl @@ -5,7 +5,7 @@ function initialize!(integrator, cache::IRKCConstantCache) integrator.k = typeof(integrator.k)(undef, integrator.kshortsize) cache.du₁ = f1(uprev, p, t) cache.du₂ = f2(uprev, p, t) - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) integrator.stats.nf2 += 1 integrator.fsalfirst = cache.du₁ + cache.du₂ @@ -82,7 +82,7 @@ function perform_step!(integrator, cache::IRKCConstantCache, repeat_step = false f1ⱼ₋₁ = f1(gprev, p, t + Cⱼ₋₁ * dt) f2ⱼ₋₁ = f2(gprev, p, t + Cⱼ₋₁ * dt) - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) integrator.stats.nf2 += 1 nlsolver.tmp = (1 - μ - ν) * uprev + μ * gprev + ν * gprev2 + dt * μs * f2ⱼ₋₁ + dt * νs * du₂ + (νs - (1 - μ - ν) * μs₁) * dt * du₁ - ν * μs₁ * dt * f1ⱼ₋₂ nlsolver.z = dt * f1ⱼ₋₁ @@ -110,7 +110,7 @@ function perform_step!(integrator, cache::IRKCConstantCache, repeat_step = false cache.du₁ = f1(u, p, t + dt) cache.du₂ = f2(u, p, t + dt) - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) integrator.stats.nf2 += 1 # error estimate if isnewton(nlsolver) && integrator.opts.adaptive @@ -121,7 +121,7 @@ function perform_step!(integrator, cache::IRKCConstantCache, repeat_step = false tmp, uprev, u, integrator.opts.abstol, integrator.opts.reltol, integrator.opts.internalnorm, t ) - OrdinaryDiffEqCore.set_EEst!(integrator, integrator.opts.internalnorm(atmp, t)) + set_EEst!(integrator, integrator.opts.internalnorm(atmp, t)) end integrator.fsallast = cache.du₁ + cache.du₂ @@ -139,7 +139,7 @@ function initialize!(integrator, cache::IRKCCache) integrator.k[2] = integrator.fsallast f1(cache.du₁, uprev, p, t) f2(cache.du₂, uprev, p, t) - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) integrator.stats.nf2 += 1 return @.. broadcast = false integrator.fsalfirst = cache.du₁ + cache.du₂ end @@ -214,7 +214,7 @@ function perform_step!(integrator, cache::IRKCCache, repeat_step = false) f1(f1ⱼ₋₁, gprev, p, t + Cⱼ₋₁ * dt) f2(f2ⱼ₋₁, gprev, p, t + Cⱼ₋₁ * dt) - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) integrator.stats.nf2 += 1 @.. broadcast = false nlsolver.tmp = (1 - μ - ν) * uprev + μ * gprev + ν * gprev2 + dt * μs * f2ⱼ₋₁ + dt * νs * du₂ + (νs - (1 - μ - ν) * μs₁) * dt * du₁ - ν * μs₁ * dt * f1ⱼ₋₂ @.. broadcast = false nlsolver.z = dt * f1ⱼ₋₁ @@ -244,7 +244,7 @@ function perform_step!(integrator, cache::IRKCCache, repeat_step = false) @.. broadcast = false f2ⱼ₋₁ = du₂ f1(du₁, u, p, t + dt) f2(du₂, u, p, t + dt) - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) integrator.stats.nf2 += 1 # error estimate if isnewton(nlsolver) && integrator.opts.adaptive @@ -258,7 +258,7 @@ function perform_step!(integrator, cache::IRKCCache, repeat_step = false) atmp, tmp, uprev, u, integrator.opts.abstol, integrator.opts.reltol, integrator.opts.internalnorm, t ) - OrdinaryDiffEqCore.set_EEst!(integrator, integrator.opts.internalnorm(atmp, t)) + set_EEst!(integrator, integrator.opts.internalnorm(atmp, t)) end @.. broadcast = false integrator.fsallast = du₁ + du₂ diff --git a/lib/OrdinaryDiffEqStabilizedIRK/src/irkc_utils.jl b/lib/OrdinaryDiffEqStabilizedIRK/src/irkc_utils.jl index 602a2ddb206..bdc7cc39e3e 100644 --- a/lib/OrdinaryDiffEqStabilizedIRK/src/irkc_utils.jl +++ b/lib/OrdinaryDiffEqStabilizedIRK/src/irkc_utils.jl @@ -19,7 +19,7 @@ function maxeig!(integrator, cache::OrdinaryDiffEqConstantCache) else fz = fsalfirst z = f(fz, p, t) - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) end else z = cache.zprev @@ -56,7 +56,7 @@ function maxeig!(integrator, cache::OrdinaryDiffEqConstantCache) tmp = fz - cache.du₂ else fz = f(z, p, t) - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) tmp = fz - fsalfirst end Δ = integrator.opts.internalnorm(tmp, t) @@ -122,7 +122,7 @@ function maxeig!(integrator, cache::OrdinaryDiffEqMutableCache) else @.. broadcast = false fz = fsalfirst f(z, fz, p, t) - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) end else @.. broadcast = false z = ccache.zprev @@ -159,7 +159,7 @@ function maxeig!(integrator, cache::OrdinaryDiffEqMutableCache) @.. broadcast = false atmp = fz - cache.du₂ else f(fz, z, p, t) - OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1) + increment_nf!(integrator.stats, 1) @.. broadcast = false atmp = fz - fsalfirst end Δ = integrator.opts.internalnorm(atmp, t) diff --git a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl index e48c1acb1f6..584ad003c22 100644 --- a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl @@ -3,5 +3,33 @@ using SciMLTesting, OrdinaryDiffEqStabilizedIRK, Test run_qa( OrdinaryDiffEqStabilizedIRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # Solver-interface names imported from their owner module but not yet + # declared `public` on the registered releases. These are the + # OrdinaryDiffEq internal extension/dispatch API (OrdinaryDiffEqCore, + # OrdinaryDiffEqNonlinearSolve, OrdinaryDiffEqDifferentiation), plus + # DiffEqBase residual helpers and SciMLBase internals. No public + # alternative exists; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore + :default_controller, :IController, :gamma_default, :issplit, + :perform_step!, :unwrap_alg, :fac_default_gamma, + :OrdinaryDiffEqNewtonAdaptiveAlgorithm, + :OrdinaryDiffEqMutableCache, :OrdinaryDiffEqConstantCache, + :alg_cache, Symbol("@cache"), :get_fsalfirstlast, + :increment_nf!, :set_EEst!, :generic_solver_docstring, + :_fixup_ad, :get_W, :isnewton, + # OrdinaryDiffEqNonlinearSolve + :NLNewton, :nlsolve!, :build_nlsolver, :markfirststage!, + :du_alias_or_new, + # OrdinaryDiffEqDifferentiation + :dolinsolve, :update_W!, + # DiffEqBase + :calculate_residuals, :calculate_residuals!, + # SciMLBase + :_unwrap_val, :_reshape, :_vec, + ), + ), + ), ) From 17c273a2f5a8583a61dfcb9ffaadd736bbcbfa44 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:40:12 -0400 Subject: [PATCH 032/108] StochasticDiffEqHighOrder: minimize EI exceptions, drop blanket ei_broken Convert the blanket ei_broken (4 checks) to tight, documented ignore lists. Migrate now-public names to their public owners and make implicit imports explicit: - is_diagonal_noise: import from SciMLBase (public in 3.30) instead of DiffEqBase, fixing both via_owners and are_public. - Drop the unused/stale `initialize!` import from OrdinaryDiffEqCore. - Make the LinearAlgebra (dot, mul!) and StaticArrays (SArray) implicit imports explicit; replace `using RecursiveArrayTools` with a plain `import RecursiveArrayTools` (no exported names are used). - Add standalone `import StochasticDiffEqCore` / `import DiffEqBase` so the reexported module bindings are explicit (no_implicit_imports). Residual exceptions are genuine non-public internal API, narrowed to exact names: @.. (FastBroadcast macro reexported via DiffEqBase, not a direct dep), @cache (StochasticDiffEqCore), Tableau/calculate_residuals [!] (DiffEqBase), perform_step! and set_EEst! (OrdinaryDiffEqCore). Co-Authored-By: Chris Rackauckas --- .../src/StochasticDiffEqHighOrder.jl | 16 ++++++++------ lib/StochasticDiffEqHighOrder/test/qa/qa.jl | 21 ++++++++++++++++++- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/lib/StochasticDiffEqHighOrder/src/StochasticDiffEqHighOrder.jl b/lib/StochasticDiffEqHighOrder/src/StochasticDiffEqHighOrder.jl index 9629d0c37a0..196bb90950e 100644 --- a/lib/StochasticDiffEqHighOrder/src/StochasticDiffEqHighOrder.jl +++ b/lib/StochasticDiffEqHighOrder/src/StochasticDiffEqHighOrder.jl @@ -1,10 +1,13 @@ module StochasticDiffEqHighOrder -using Reexport +using Reexport: Reexport, @reexport +import StochasticDiffEqCore @reexport using StochasticDiffEqCore import OrdinaryDiffEqCore -import OrdinaryDiffEqCore: perform_step!, initialize! +import OrdinaryDiffEqCore: perform_step! + +import DiffEqBase import StochasticDiffEqCore: alg_cache, alg_order, alg_compatible, alg_needs_extra_process, alg_stability_size, delta_default, @@ -16,7 +19,7 @@ import StochasticDiffEqCore: alg_cache, alg_order, alg_compatible, calc_twopoint_random!, calc_twopoint_random, @cache -import DiffEqBase: is_diagonal_noise, @.. +import DiffEqBase: @.. import DiffEqBase: calculate_residuals, calculate_residuals! import DiffEqBase: full_cache, rand_cache, ratenoise_cache import DiffEqBase: Tableau @@ -24,10 +27,11 @@ import DiffEqBase: Tableau import MuladdMacro: @muladd import SciMLBase +import SciMLBase: is_diagonal_noise -using LinearAlgebra -using StaticArrays -using RecursiveArrayTools +using LinearAlgebra: LinearAlgebra, dot, mul! +using StaticArrays: StaticArrays, SArray +import RecursiveArrayTools include("tableaus.jl") include("algorithms.jl") diff --git a/lib/StochasticDiffEqHighOrder/test/qa/qa.jl b/lib/StochasticDiffEqHighOrder/test/qa/qa.jl index e72ae93263e..83f5a1f7409 100644 --- a/lib/StochasticDiffEqHighOrder/test/qa/qa.jl +++ b/lib/StochasticDiffEqHighOrder/test/qa/qa.jl @@ -5,5 +5,24 @@ run_qa( StochasticDiffEqHighOrder; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + # `@..` is owned by FastBroadcast but reexported through DiffEqBase, and + # FastBroadcast is not a direct dependency of this sublibrary, so the + # broadcast macro can only be reached via the DiffEqBase reexport. + all_explicit_imports_via_owners = (; ignore = (Symbol("@.."),)), + # Solver-internal names with no public counterpart in their owner. + # DiffEqBase residual hooks (calculate_residuals[!]), the Tableau type, + # and the @.. broadcast macro; StochasticDiffEqCore's @cache macro; and + # OrdinaryDiffEqCore's perform_step! dispatch hook. + # See SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + Symbol("@.."), Symbol("@cache"), + :Tableau, :calculate_residuals, :calculate_residuals!, + :perform_step!, + ), + ), + # Qualified access to OrdinaryDiffEqCore's internal step-error setter. + all_qualified_accesses_are_public = (; ignore = (:set_EEst!,)), + ), ) From e32e5b01ca06358dec8811d97be4db0b4f69493e Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:45:49 -0400 Subject: [PATCH 033/108] OrdinaryDiffEqFIRK: minimize EI exceptions in run_qa Drop the blanket six-check `ei_broken` and instead make the explicit-imports checks pass on their own: - Route imports to their true owner module so `all_*_via_owners` pass with no ignores (`alg_order`/`_vec`/`_reshape`/`_unwrap_val`/`value`/`UDerivativeWrapper`/ `UJacobianWrapper` from SciMLBase; `calculate_residuals`/`initialize!` from DiffEqBase; convergence-state names from OrdinaryDiffEqCore). - Make the previously-implicit imports explicit and drop the genuinely-stale ones, so `no_implicit_imports` and `no_stale_explicit_imports` pass with no ignores. - `value` is now accessed via its bare (owner-routed) import in controllers.jl. - Keep a module-only `import OrdinaryDiffEqNonlinearSolve` so the load-bearing nonlinear-solver dependency is not flagged stale once its names move to Core. The remaining residue is a tight, documented ignore list of genuinely-internal non-public names of the OrdinaryDiffEq stack in the two `*_are_public` checks; see SciML/OrdinaryDiffEq.jl#3776 for make-public tracking. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqFIRK.jl | 59 +++++++++++-------- lib/OrdinaryDiffEqFIRK/src/controllers.jl | 2 +- lib/OrdinaryDiffEqFIRK/test/qa/qa.jl | 42 ++++++++++++- 3 files changed, 75 insertions(+), 28 deletions(-) diff --git a/lib/OrdinaryDiffEqFIRK/src/OrdinaryDiffEqFIRK.jl b/lib/OrdinaryDiffEqFIRK/src/OrdinaryDiffEqFIRK.jl index 70fa90df7e1..626941241b3 100644 --- a/lib/OrdinaryDiffEqFIRK/src/OrdinaryDiffEqFIRK.jl +++ b/lib/OrdinaryDiffEqFIRK/src/OrdinaryDiffEqFIRK.jl @@ -1,41 +1,48 @@ module OrdinaryDiffEqFIRK -import OrdinaryDiffEqCore: alg_order, calculate_residuals!, - initialize!, perform_step!, unwrap_alg, - calculate_residuals, default_controller, PredictiveController, PIController, - OrdinaryDiffEqAlgorithm, OrdinaryDiffEqNewtonAdaptiveAlgorithm, +import OrdinaryDiffEqCore: unwrap_alg, + default_controller, PredictiveController, PIController, + OrdinaryDiffEqNewtonAdaptiveAlgorithm, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, - OrdinaryDiffEqAdaptiveAlgorithm, CompiledFloats, uses_uprev, - alg_cache, _vec, _reshape, @cache, @threaded, isthreaded, - PolyesterThreads, - isfsal, full_cache, constvalue, _unwrap_val, + alg_cache, @threaded, isthreaded, + constvalue, differentiation_rk_docstring, trivial_limiter!, - _ode_interpolant!, _ode_addsteps!, AbstractController, qmax_default, alg_adaptive_order, - stepsize_controller!, step_accept_controller!, - step_reject_controller!, + step_accept_controller!, step_reject_controller!, alg_can_repeat_jac, NewtonAlgorithm, - fac_default_gamma, get_current_adaptive_order, get_fsalfirstlast, get_current_alg_order, - isfirk, generic_solver_docstring, - _ad_chunksize_int, _ad_fdtype, _fixup_ad, - LinearAliasSpecifier, set_discontinuity -using MuladdMacro, DiffEqBase, RecursiveArrayTools, Polyester -using SciMLOperators: AbstractSciMLOperator -using LinearAlgebra: I, UniformScaling, mul!, lu, dot, eigvals + isfirk, + _fixup_ad, perform_step!, + LinearAliasSpecifier, set_discontinuity, + Convergence, FastConvergence, NLStatus, + VerySlowConvergence, Divergence, get_new_W_γdt_cutoff +import SciMLBase +import SciMLBase: alg_order, _vec, _reshape, _unwrap_val, + UDerivativeWrapper, UJacobianWrapper, value, + LinearProblem, get_tmp_cache, init +import DiffEqBase: initialize!, calculate_residuals, calculate_residuals! +using MuladdMacro: @muladd +using RecursiveArrayTools: recursivefill! +import Polyester +using LinearAlgebra: I, UniformScaling, mul!, lu, dot import LinearSolve import FastBroadcast: @.. import OrdinaryDiffEqCore -import OrdinaryDiffEqCore: _ode_interpolant, _ode_interpolant!, has_stiff_interpolation +import OrdinaryDiffEqCore: _ode_interpolant, _ode_interpolant!, _ode_addsteps!, + has_stiff_interpolation import FastPower: fastpower -using OrdinaryDiffEqDifferentiation: UJacobianWrapper, build_J_W, build_jac_config, - UDerivativeWrapper, calc_J!, dolinsolve, calc_J, +using OrdinaryDiffEqDifferentiation: build_J_W, build_jac_config, + calc_J!, dolinsolve, calc_J, islinearfunction -using OrdinaryDiffEqNonlinearSolve: du_alias_or_new, Convergence, FastConvergence, NLStatus, - VerySlowConvergence, - Divergence, get_new_W_γdt_cutoff -import ADTypes: AutoForwardDiff, AbstractADType +import ADTypes: AutoForwardDiff +import SciMLOperators +import SciMLOperators: AbstractSciMLOperator +# Load-bearing runtime dependency: provides the nonlinear-solver machinery the FIRK +# integrators dispatch into. The convergence-state names FIRK uses are owned by +# OrdinaryDiffEqCore (imported above), so this is a module-only import to keep the +# dependency from registering as stale. +import OrdinaryDiffEqNonlinearSolve import OrdinaryDiffEqCore: PredictiveControllerCache @@ -50,7 +57,7 @@ else end end -using Reexport +using Reexport: @reexport @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqFIRK/src/controllers.jl b/lib/OrdinaryDiffEqFIRK/src/controllers.jl index 473c9be9dfe..140707e95de 100644 --- a/lib/OrdinaryDiffEqFIRK/src/controllers.jl +++ b/lib/OrdinaryDiffEqFIRK/src/controllers.jl @@ -7,7 +7,7 @@ function step_accept_controller!( (; cache) = integrator (; num_stages, step, iter, hist_iter, index) = cache - EEst = DiffEqBase.value(OrdinaryDiffEqCore.get_EEst(integrator)) + EEst = value(OrdinaryDiffEqCore.get_EEst(integrator)) if integrator.success_iter > 0 expo = 1 / (get_current_adaptive_order(alg, cache) + 1) diff --git a/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl index b0cabb6693f..567d4ba3f3e 100644 --- a/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl @@ -3,5 +3,45 @@ using SciMLTesting, OrdinaryDiffEqFIRK, Test run_qa( OrdinaryDiffEqFIRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + # These names are accessed/imported from their true owner module but are + # not (yet) declared `public`/exported there. They are internal solver-framework + # entry points of the OrdinaryDiffEq stack (and a few helper deps) that FIRK + # legitimately extends/uses; nothing here is fixable from this sublibrary. + # See SciML/OrdinaryDiffEq.jl#3776 for the make-public tracking. + all_qualified_accesses_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internal integrator-stats / error-estimate API + :get_EEst, :set_EEst!, :increment_nf!, + ), + ), + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internal solver-framework API + :unwrap_alg, :default_controller, :PredictiveController, :PIController, + :OrdinaryDiffEqNewtonAdaptiveAlgorithm, :OrdinaryDiffEqMutableCache, + :OrdinaryDiffEqConstantCache, :alg_cache, Symbol("@threaded"), + :isthreaded, :constvalue, :differentiation_rk_docstring, + :trivial_limiter!, :qmax_default, :alg_adaptive_order, + :step_accept_controller!, :step_reject_controller!, :alg_can_repeat_jac, + :NewtonAlgorithm, :get_current_adaptive_order, :get_fsalfirstlast, + :get_current_alg_order, :isfirk, :_fixup_ad, :perform_step!, + :LinearAliasSpecifier, :set_discontinuity, :get_current_qmax, + :PredictiveControllerCache, :_ode_interpolant, :_ode_interpolant!, + :_ode_addsteps!, :has_stiff_interpolation, + # OrdinaryDiffEqCore-owned convergence states / cutoff (re-exported by NonlinearSolve) + :Convergence, :FastConvergence, :NLStatus, :VerySlowConvergence, + :Divergence, :get_new_W_γdt_cutoff, + # SciMLBase internal helpers / wrappers + :_vec, :_reshape, :_unwrap_val, :UDerivativeWrapper, :UJacobianWrapper, + # DiffEqBase internal residual / value helpers + :calculate_residuals, :calculate_residuals!, :value, + # OrdinaryDiffEqDifferentiation internal Jacobian / linsolve API + :build_J_W, :build_jac_config, :calc_J!, :calc_J, :dolinsolve, + :islinearfunction, + # FastPower / SciMLOperators internal names + :fastpower, :AbstractSciMLOperator, + ), + ), + ), ) From 9b2581222a285d9bdb16ecaa11e1c33ca7b86546 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:51:57 -0400 Subject: [PATCH 034/108] StochasticDiffEqImplicit: minimize ExplicitImports exceptions Replace the blanket `ei_broken` (all 6 EI checks) with all checks enabled and only tight, documented ignore lists for the names that are genuinely internal (non-`public`) in their owner packages. Source cleanups that eliminate exceptions outright: - Import now-public/owner-correct names from their owners: `is_diagonal_noise` and `initialize!` (public in SciMLBase / DiffEqBase respectively); `_vec`, `_reshape`, `_unwrap_val`, `has_Wfact` from their owner SciMLBase. - Drop the duplicate `get_W` import from OrdinaryDiffEqDifferentiation (owned by OrdinaryDiffEqCore, already imported there). - Replace qualified `DiffEqBase._reshape`/`DiffEqBase._vec` accesses with the owner-correct unqualified imports. - Make implicit imports explicit (LinearAlgebra `mul!`/`norm`, StaticArrays `SArray`, module names) and remove stale imports (`NLSolver`, `current_extrapolant`). Residual ignores cover OrdinaryDiffEqCore / OrdinaryDiffEqNonlinearSolve / OrdinaryDiffEqDifferentiation / DiffEqBase / SciMLBase internal names and the `@..` macro re-exported through DiffEqBase; tracked in SciML/OrdinaryDiffEq.jl#3776. Co-Authored-By: Chris Rackauckas --- .../src/StochasticDiffEqImplicit.jl | 26 ++++++++++------- .../src/algorithms.jl | 2 +- .../src/perform_step/kencarp.jl | 8 ++--- lib/StochasticDiffEqImplicit/test/qa/qa.jl | 29 ++++++++++++++++++- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/lib/StochasticDiffEqImplicit/src/StochasticDiffEqImplicit.jl b/lib/StochasticDiffEqImplicit/src/StochasticDiffEqImplicit.jl index 6ffe128638f..c24b5a9638a 100644 --- a/lib/StochasticDiffEqImplicit/src/StochasticDiffEqImplicit.jl +++ b/lib/StochasticDiffEqImplicit/src/StochasticDiffEqImplicit.jl @@ -1,10 +1,12 @@ module StochasticDiffEqImplicit -using Reexport +using Reexport: Reexport, @reexport @reexport using StochasticDiffEqCore +import StochasticDiffEqCore +import DiffEqBase import OrdinaryDiffEqCore -import OrdinaryDiffEqCore: perform_step!, initialize!, issplit, default_controller, PIController +import OrdinaryDiffEqCore: perform_step!, issplit, default_controller, PIController import StochasticDiffEqCore: alg_cache, alg_order, alg_compatible, alg_needs_extra_process, is_split_step, supports_regular_jumps, isadaptive, @@ -15,25 +17,27 @@ import StochasticDiffEqCore: alg_cache, alg_order, alg_compatible, unwrap_alg, @cache -import DiffEqBase: is_diagonal_noise, @.., SplitSDEFunction +import DiffEqBase: @.., SplitSDEFunction, initialize! import DiffEqBase: calculate_residuals, calculate_residuals! -import DiffEqBase: full_cache, rand_cache, ratenoise_cache, has_Wfact +import DiffEqBase: full_cache, rand_cache, ratenoise_cache import MuladdMacro: @muladd import SciMLBase +import SciMLBase: is_diagonal_noise, has_Wfact, _vec, _reshape, _unwrap_val -using OrdinaryDiffEqCore: _vec, _reshape, current_extrapolant, current_extrapolant!, +using OrdinaryDiffEqCore: current_extrapolant!, isnewton, set_new_W!, get_W -using OrdinaryDiffEqNonlinearSolve: NLSolver, nlsolvefail, nlsolve!, build_nlsolver, +using OrdinaryDiffEqNonlinearSolve: nlsolvefail, nlsolve!, build_nlsolver, markfirststage!, NLNewton import OrdinaryDiffEqDifferentiation -using OrdinaryDiffEqDifferentiation: calc_J, calc_J!, dolinsolve, get_W +using OrdinaryDiffEqDifferentiation: calc_J, calc_J!, dolinsolve using JumpProcesses: JumpProblem -using LinearAlgebra -using StaticArrays -using RecursiveArrayTools -using ForwardDiff, FiniteDiff +using LinearAlgebra: LinearAlgebra, mul!, norm +using StaticArrays: StaticArrays, SArray +using RecursiveArrayTools: RecursiveArrayTools +using ForwardDiff: ForwardDiff +using FiniteDiff: FiniteDiff import ADTypes include("tableaus.jl") diff --git a/lib/StochasticDiffEqImplicit/src/algorithms.jl b/lib/StochasticDiffEqImplicit/src/algorithms.jl index 0b98d2b8af3..3851565367c 100644 --- a/lib/StochasticDiffEqImplicit/src/algorithms.jl +++ b/lib/StochasticDiffEqImplicit/src/algorithms.jl @@ -1,5 +1,5 @@ using ADTypes: AutoForwardDiff -using OrdinaryDiffEqCore: _fixup_ad, _unwrap_val +using OrdinaryDiffEqCore: _fixup_ad struct ImplicitEM{AD, F, F2, T2, T3, CJ} <: StochasticDiffEqNewtonAdaptiveAlgorithm diff --git a/lib/StochasticDiffEqImplicit/src/perform_step/kencarp.jl b/lib/StochasticDiffEqImplicit/src/perform_step/kencarp.jl index ce7e38f4bc3..9c092c6d3cf 100644 --- a/lib/StochasticDiffEqImplicit/src/perform_step/kencarp.jl +++ b/lib/StochasticDiffEqImplicit/src/perform_step/kencarp.jl @@ -124,8 +124,8 @@ tmp = btilde1 * z₁ + btilde2 * z₂ + btilde3 * z₃ + btilde4 * z₄ + chi2 * (g1 - g4) end if alg.smooth_est # From Shampine - E₁ = DiffEqBase._reshape( - get_W(nlsolver) \ DiffEqBase._vec(tmp), + E₁ = _reshape( + get_W(nlsolver) \ _vec(tmp), axes(tmp) ) else @@ -316,8 +316,8 @@ end if alg.smooth_est # From Shampine linres = dolinsolve( integrator, nlsolver.cache.linsolve; - b = DiffEqBase._vec(g1), - linu = DiffEqBase._vec(E₁) + b = _vec(g1), + linu = _vec(E₁) ) else E₁ .= dz diff --git a/lib/StochasticDiffEqImplicit/test/qa/qa.jl b/lib/StochasticDiffEqImplicit/test/qa/qa.jl index df755963ff6..cd5833e7744 100644 --- a/lib/StochasticDiffEqImplicit/test/qa/qa.jl +++ b/lib/StochasticDiffEqImplicit/test/qa/qa.jl @@ -5,5 +5,32 @@ run_qa( StochasticDiffEqImplicit; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # `@..` is owned by FastBroadcast and re-exported through DiffEqBase; FastBroadcast + # is not a direct dependency, so it is imported from DiffEqBase by design. + all_explicit_imports_via_owners = (; ignore = (Symbol("@.."),)), + # Internal (non-`public`) names from SciML packages used to implement the solvers. + # These have no public replacement yet; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + # `@..` (FastBroadcast macro re-exported via DiffEqBase) is not `public` there. + Symbol("@.."), + # StochasticDiffEqCore internals + Symbol("@cache"), + # OrdinaryDiffEqCore internals + :perform_step!, :issplit, :default_controller, :PIController, + :current_extrapolant!, :isnewton, :set_new_W!, :get_W, :_fixup_ad, + # OrdinaryDiffEqNonlinearSolve internals + :nlsolvefail, :nlsolve!, :build_nlsolver, :markfirststage!, :NLNewton, + # OrdinaryDiffEqDifferentiation internals + :calc_J, :calc_J!, :dolinsolve, + # DiffEqBase internals + :calculate_residuals, :calculate_residuals!, + # SciMLBase internals (owner-correct but not yet `public`) + :has_Wfact, :_vec, :_reshape, :_unwrap_val, + )), + # SciMLBase / OrdinaryDiffEqCore internals accessed via qualified name. + all_qualified_accesses_are_public = (; + ignore = (:AlgorithmInterpretation, :alg_interpretation, :set_EEst!)), + ), ) From 990d5bd3dfdbe1e7c47d170f5e8ada7485467448 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:53:08 -0400 Subject: [PATCH 035/108] OrdinaryDiffEqNonlinearSolve: minimize ExplicitImports exceptions Replace the blanket 5-check `ei_broken` in the sublibrary's qa.jl with fully-passing EI checks plus tight, per-name documented ignores. - Remove genuinely unused (stale) imports: FastConvergence, GLM, NORDSIECK_MULTISTEP, NonlinearVerbosity, OperatorAssumptions, the three OrdinaryDiffEq*Algorithm aliases, OverrideInit, SlowConvergence, VerySlowConvergence, _unwrap_val, has_autodiff, dense_ad, pickchunksize, ismutable, restructure, solve!, and the entire SciMLStructures import (canonicalize/Tunable/isscimlstructure unused; drop the dep). - Migrate names to their owning packages so the via_owners and public checks pass natively: I/rmul!/norm/mul!/ldiv! -> LinearAlgebra; BrownFullBasicInit/ShampineCollocationInit -> DiffEqBase; alg_order/isadaptive/_vec/_reshape/postamble! -> SciMLBase; calculate_residuals(!) -> DiffEqBase; alg_autodiff -> OrdinaryDiffEqCore; AbstractSciMLOperator -> SciMLOperators; DiffEqBase.value/anyeltypedual -> SciMLBase; SciMLBase.setproperties -> ConstructionBase (added as dep). - Bump SciMLBase floor to 3.30 (alg_order/isadaptive are public there). The remaining ignores are non-public internal names (OrdinaryDiffEqCore solver interface, OrdinaryDiffEqDifferentiation Jacobian/W machinery, a few SciMLBase/ DiffEqBase/SciMLOperators/ForwardDiff internals) with no public alternative, tracked in SciML/OrdinaryDiffEq.jl#3776. QA group is fully green on Julia 1.12 (16/16, 0 broken) against released SciMLTesting 1.7.0. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqNonlinearSolve/Project.toml | 6 +-- .../src/OrdinaryDiffEqNonlinearSolve.jl | 51 +++++++++---------- .../src/initialize_dae.jl | 20 ++++---- .../src/nlsolve.jl | 4 +- lib/OrdinaryDiffEqNonlinearSolve/src/utils.jl | 2 +- .../test/qa/qa.jl | 50 +++++++++++++++++- 6 files changed, 88 insertions(+), 45 deletions(-) diff --git a/lib/OrdinaryDiffEqNonlinearSolve/Project.toml b/lib/OrdinaryDiffEqNonlinearSolve/Project.toml index d77cbadbc47..878f93c6aa0 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/Project.toml +++ b/lib/OrdinaryDiffEqNonlinearSolve/Project.toml @@ -22,8 +22,8 @@ ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" PreallocationTools = "d236fae5-4411-538c-8e31-a6e3d9e00b46" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" -SciMLStructures = "53ae85a6-f571-4167-b2af-e1d143709226" SciMLOperators = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" [extras] Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" @@ -62,7 +62,7 @@ OrdinaryDiffEqFIRK = "2" OrdinaryDiffEqRosenbrock = "2" OrdinaryDiffEqSDIRK = "2" Statistics = "1.10.0" -SciMLBase = "3.10.0" +SciMLBase = "3.30" OrdinaryDiffEqCore = "4" SimpleNonlinearSolve = "2.11.1" FastClosures = "0.3.2" @@ -78,7 +78,7 @@ PreallocationTools = "1.1.2" DiffEqBase = "7" SafeTestsets = "0.1.0" SciMLOperators = "1.15" -SciMLStructures = "1.7" +ConstructionBase = "1" [targets] test = ["DiffEqDevTools", "LineSearches", "ODEProblemLibrary", "OrdinaryDiffEqBDF", "OrdinaryDiffEqFIRK", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqSDIRK", "Random", "SafeTestsets", "StaticArrays", "Statistics", "Test", "Pkg"] diff --git a/lib/OrdinaryDiffEqNonlinearSolve/src/OrdinaryDiffEqNonlinearSolve.jl b/lib/OrdinaryDiffEqNonlinearSolve/src/OrdinaryDiffEqNonlinearSolve.jl index beda98b52cf..9aa58167f83 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/src/OrdinaryDiffEqNonlinearSolve.jl +++ b/lib/OrdinaryDiffEqNonlinearSolve/src/OrdinaryDiffEqNonlinearSolve.jl @@ -1,35 +1,37 @@ module OrdinaryDiffEqNonlinearSolve -using ADTypes: ADTypes, dense_ad, AutoForwardDiff, AutoFiniteDiff +using ADTypes: ADTypes, AutoForwardDiff, AutoFiniteDiff import SciMLBase -import SciMLBase: init, solve, solve!, remake +import SciMLBase: init, solve, remake using SciMLBase: DAEFunction, DEIntegrator, NonlinearFunction, NonlinearProblem, NonlinearLeastSquaresProblem, LinearProblem, ODEProblem, DAEProblem, - update_coefficients!, get_tmp_cache, AbstractSciMLOperator, ReturnCode, - AbstractNonlinearProblem, LinearAliasSpecifier + update_coefficients!, get_tmp_cache, ReturnCode, + AbstractNonlinearProblem, LinearAliasSpecifier, + _vec, _reshape, postamble!, alg_order, isadaptive import DiffEqBase +import DiffEqBase: OrdinaryDiffEqTag, calculate_residuals, calculate_residuals!, + BrownFullBasicInit, ShampineCollocationInit +import ConstructionBase import PreallocationTools: DiffCache, get_tmp using SimpleNonlinearSolve: SimpleTrustRegion, SimpleGaussNewton using NonlinearSolve: FastShortcutNonlinearPolyalg, FastShortcutNLLSPolyalg, NewtonRaphson, - step!, NonlinearVerbosity + step! using MuladdMacro: @muladd using FastBroadcast: @.. import FastClosures: @closure -using LinearAlgebra: UniformScaling, UpperTriangular, givens, cond, dot, lmul!, axpy! +using LinearAlgebra: UniformScaling, UpperTriangular, givens, cond, dot, lmul!, axpy!, + I, rmul!, norm, mul!, ldiv! import LinearAlgebra using SparseArrays: SparseMatrixCSC -import ArrayInterface: ArrayInterface, ismutable, restructure -import LinearSolve: OperatorAssumptions +import ArrayInterface: ArrayInterface import LinearSolve -import ForwardDiff: ForwardDiff, pickchunksize +import ForwardDiff: ForwardDiff using ForwardDiff: Dual -using LinearSolve: I, rmul!, norm, mul!, ldiv! using RecursiveArrayTools: recursivecopy! -import SciMLStructures: canonicalize, Tunable, isscimlstructure import OrdinaryDiffEqCore -import SciMLOperators: islinear +import SciMLOperators: islinear, AbstractSciMLOperator import OrdinaryDiffEqCore: nlsolve_f, set_new_W!, set_W_γdt! import OrdinaryDiffEqCore: default_nlsolve @@ -37,33 +39,26 @@ import OrdinaryDiffEqCore: default_nlsolve using OrdinaryDiffEqCore: resize_nlsolver!, _initialize_dae!, AbstractNLSolverAlgorithm, AbstractNLSolverCache, AbstractNLSolver, NewtonAlgorithm, - OverrideInit, ShampineCollocationInit, BrownFullBasicInit, - _vec, _unwrap_val, DAEAlgorithm, - OrdinaryDiffEqAdaptiveImplicitAlgorithm, - OrdinaryDiffEqImplicitAlgorithm, - OrdinaryDiffEqCompositeAlgorithm, - _reshape, calculate_residuals, calculate_residuals!, - has_special_newton_error, isadaptive, - TryAgain, DIRK, COEFFICIENT_MULTISTEP, NORDSIECK_MULTISTEP, GLM, - FastConvergence, Convergence, - SlowConvergence, VerySlowConvergence, Divergence, NLStatus, - MethodType, alg_order, error_constant, - alg_extrapolates, resize_J_W!, has_autodiff + DAEAlgorithm, + has_special_newton_error, + TryAgain, DIRK, COEFFICIENT_MULTISTEP, + Convergence, + Divergence, NLStatus, + MethodType, error_constant, + alg_extrapolates, resize_J_W!, alg_autodiff import OrdinaryDiffEqCore: _initialize_dae!, isnewton, get_W, isfirstcall, isfirststage, isJcurrent, get_new_W_γdt_cutoff, resize_nlsolver!, apply_step!, - postamble!, @SciMLMessage + @SciMLMessage import OrdinaryDiffEqDifferentiation: update_W!, is_always_new, build_uf, build_J_W, WOperator, StaticWOperator, wrapprecs, - build_jac_config, dolinsolve, alg_autodiff, + build_jac_config, dolinsolve, resize_jac_config!, jacobian2W!, jacobian! import StaticArraysCore: StaticArray -import DiffEqBase: OrdinaryDiffEqTag - include("type.jl") include("utils.jl") include("nlsolve.jl") diff --git a/lib/OrdinaryDiffEqNonlinearSolve/src/initialize_dae.jl b/lib/OrdinaryDiffEqNonlinearSolve/src/initialize_dae.jl index d1b8bf583c8..62b0295bef5 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/src/initialize_dae.jl +++ b/lib/OrdinaryDiffEqNonlinearSolve/src/initialize_dae.jl @@ -176,7 +176,7 @@ function _initialize_dae!( # _u0 should be non-dual since NonlinearSolve does not differentiate the solver # These non-dual values are thus used to make the caches #_du = SciMLBase.value.(du) - _u0 = DiffEqBase.value.(u0) + _u0 = SciMLBase.value.(u0) # If not doing auto-diff of the solver, save an allocation if typeof(u0) === typeof(_u0) @@ -195,7 +195,7 @@ function _initialize_dae!( end nlequation! = @closure (out, u, p) -> begin - TP = DiffEqBase.anyeltypedual(p) + TP = SciMLBase.anyeltypedual(p) if TP <: Dual T = Base.promote_type(eltype(u), TP) else @@ -370,7 +370,7 @@ function _initialize_dae!( # _du and _u should be non-dual since NonlinearSolve does not differentiate the solver # These non-dual values are thus used to make the caches #_du = SciMLBase.value.(du) - _u0 = DiffEqBase.value.(u0) + _u0 = SciMLBase.value.(u0) # If not doing auto-diff of the solver, save an allocation if typeof(u0) === typeof(_u0) @@ -388,7 +388,7 @@ function _initialize_dae!( end nlequation! = @closure (out, u, p) -> begin - TP = DiffEqBase.anyeltypedual(p) + TP = SciMLBase.anyeltypedual(p) if TP <: Dual T = Base.promote_type(eltype(u), TP) else @@ -549,11 +549,11 @@ function _initialize_dae!( alg_u = @view u[algebraic_vars] # These non-dual values are thus used to make the caches - _u = DiffEqBase.value.(u) + _u = SciMLBase.value.(u) # If auto-diff of the solver, should be non-dual since NonlinearSolve does not differentiate the solver if typeof(u) !== typeof(_u) - tmp = DiffEqBase.value.(tmp) + tmp = SciMLBase.value.(tmp) end isAD = alg_autodiff(integrator.alg) isa AutoForwardDiff || typeof(u) !== typeof(_u) @@ -571,7 +571,7 @@ function _initialize_dae!( end nlequation! = @closure (out, x, p) -> begin - TP = DiffEqBase.anyeltypedual(p) + TP = SciMLBase.anyeltypedual(p) if TP <: Dual T = Base.promote_type(eltype(x), TP) else @@ -706,8 +706,8 @@ function _initialize_dae!( # _du and _u should be non-dual since NonlinearSolve does not differentiate the solver # These non-dual values are thus used to make the caches - _du = DiffEqBase.value.(du) - _u = DiffEqBase.value.(u) + _du = SciMLBase.value.(du) + _u = SciMLBase.value.(u) # If not doing auto-diff of the solver, save an allocation if typeof(u) === typeof(_u) @@ -738,7 +738,7 @@ function _initialize_dae!( end nlequation! = @closure (out, x, p) -> begin - TP = DiffEqBase.anyeltypedual(p) + TP = SciMLBase.anyeltypedual(p) if TP <: Dual T = Base.promote_type(eltype(x), TP) else diff --git a/lib/OrdinaryDiffEqNonlinearSolve/src/nlsolve.jl b/lib/OrdinaryDiffEqNonlinearSolve/src/nlsolve.jl index 9d61596bf52..b86e0edf65e 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/src/nlsolve.jl +++ b/lib/OrdinaryDiffEqNonlinearSolve/src/nlsolve.jl @@ -120,7 +120,7 @@ function nlsolve!( apply_step!(nlsolver, integrator) # check for convergence - η = DiffEqBase.value(θ / (1 - θ)) + η = SciMLBase.value(θ / (1 - θ)) # don't trust θ for non-adaptive on first iter because the solver doesn't provide feedback # for us to know whether our previous nlsolve converged sufficiently well check_η_convergence = ( @@ -184,7 +184,7 @@ function apply_step!( return nothing end -function postamble!(nlsolver::NLSolver, integrator::SciMLBase.DEIntegrator) +function SciMLBase.postamble!(nlsolver::NLSolver, integrator::SciMLBase.DEIntegrator) if SciMLBase.has_stats(integrator) integrator.stats.nnonliniter += nlsolver.iter diff --git a/lib/OrdinaryDiffEqNonlinearSolve/src/utils.jl b/lib/OrdinaryDiffEqNonlinearSolve/src/utils.jl index 63fcf4ea67a..25f8da80e95 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/src/utils.jl +++ b/lib/OrdinaryDiffEqNonlinearSolve/src/utils.jl @@ -98,7 +98,7 @@ mutable struct DAEResidualJacobianWrapper{ end end -function SciMLBase.setproperties(wrap::DAEResidualJacobianWrapper, patch::NamedTuple) +function ConstructionBase.setproperties(wrap::DAEResidualJacobianWrapper, patch::NamedTuple) for key in keys(patch) setproperty!(wrap, key, patch[key]) end diff --git a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl index 20cbf618205..bb241095e2e 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl @@ -4,5 +4,53 @@ run_qa( OrdinaryDiffEqNonlinearSolve; aqua_kwargs = (; piracies = false), explicit_imports = true, - ei_broken = (:no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # Names imported from a re-exporter rather than their defining package. + # `@SciMLMessage` is owned by SciMLLogging but reached through OrdinaryDiffEqCore + # (SciMLLogging is not a direct dependency); `WOperator`/`StaticWOperator` are the + # OrdinaryDiffEqDifferentiation W-operator types, which ExplicitImports attributes + # to SciMLOperators (their abstract supertype's package). + all_explicit_imports_via_owners = (; + ignore = (Symbol("@SciMLMessage"), :WOperator, :StaticWOperator), + ), + # Non-public names of upstream packages with no public alternative. Each is owned + # by the package it is imported from; remove an entry once that package marks the + # name `public`/exports it. Tracked in SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internals (solver interface) + :AbstractNLSolver, :AbstractNLSolverAlgorithm, :AbstractNLSolverCache, + :NewtonAlgorithm, :DAEAlgorithm, :TryAgain, :DIRK, :COEFFICIENT_MULTISTEP, + :Convergence, :Divergence, :NLStatus, :MethodType, :error_constant, + :alg_extrapolates, :resize_J_W!, :alg_autodiff, :has_special_newton_error, + :_initialize_dae!, :resize_nlsolver!, :nlsolve_f, :set_new_W!, :set_W_γdt!, + :default_nlsolve, :isnewton, :get_W, :isfirstcall, :isfirststage, + :isJcurrent, :get_new_W_γdt_cutoff, :apply_step!, Symbol("@SciMLMessage"), + # SciMLBase internals (owner of these names but not public) + :_vec, :_reshape, :postamble!, + # DiffEqBase internals + :OrdinaryDiffEqTag, :calculate_residuals, :calculate_residuals!, + # SciMLOperators abstract type (not public) + :AbstractSciMLOperator, + # OrdinaryDiffEqDifferentiation internals (Jacobian/W machinery) + :update_W!, :is_always_new, :build_uf, :build_J_W, :WOperator, + :StaticWOperator, :wrapprecs, :build_jac_config, :dolinsolve, + :resize_jac_config!, :jacobian2W!, :jacobian!, + # ForwardDiff / StaticArraysCore internals + :Dual, :StaticArray, + ), + ), + # Qualified `Module.name` accesses to non-public names with no public alternative. + all_qualified_accesses_are_public = (; + ignore = ( + # SciMLBase internals (`postamble!` is extended via `SciMLBase.postamble!`) + :value, :anyeltypedual, :FullSpecialize, :forwarddiff_chunksize, + :has_Wfact, :has_Wfact_t, :has_jac_u, :has_jac_du, :postamble!, + # OrdinaryDiffEqCore internals + :ODEIntegrator, :increment_nf!, + # ForwardDiff internals + :Tag, :pickchunksize, + ), + ), + ), ) From aec2fe18b2d06ead3390d83f4ba23d61bcac0dc9 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:56:39 -0400 Subject: [PATCH 036/108] StochasticDiffEqCore: minimize EI exceptions, drop blanket ei_broken Replace the blanket `ei_broken` over all six ExplicitImports checks with genuine fixes plus tight, documented ignore lists for the residual upstream non-public/non-owner names. All six EI checks now pass on Julia 1.12. Source changes: - Make all implicit imports explicit, importing each name from its owner (SciMLBase abstract types/`is_diagonal_noise`, CommonSolve `init/solve/solve!`, DiffEqBase `DEVerbosity`/`ODE_DEFAULT_*`, RecursiveArrayTools, etc.). - Migrate now-public names off DiffEqBase to their SciMLBase owners: `__solve`, `__init`, `has_analytic`, `AbstractRODEProblem`, `parameterless_type`, plus `AbstractNoiseProcess`/`reinit!` off DiffEqNoiseProcess and `DefaultInit` to DiffEqBase. - Remove 80+ stale explicit imports (loop helpers/controllers extended only via qualified `OrdinaryDiffEqCore.x`, unused abstract types and wrappers). - Drop the Base-owned `resize!`/`deleteat!` from the DiffEqBase import (used only as plain array ops). - Add CommonSolve as a direct dependency (owner of init/solve/solve!). QA: the remaining EI ignores are all genuinely non-public upstream names (OrdinaryDiffEqCore solver-loop/trait internals, still-internal SciMLBase/DiffEqBase interface names, JumpProcesses/DiffEqNoiseProcess/ForwardDiff internals, Base `@pure`), each documented by source in test/qa/qa.jl, pending make-public upstream. The pre-existing Aqua/JET failures are unchanged and out of scope. See SciML/OrdinaryDiffEq.jl#3776. Co-Authored-By: Chris Rackauckas --- lib/StochasticDiffEqCore/Project.toml | 2 + .../src/StochasticDiffEqCore.jl | 118 +++++++----------- .../src/initialize_dae.jl | 2 +- .../src/integrators/integrator_utils.jl | 14 +-- lib/StochasticDiffEqCore/src/solve.jl | 46 +++---- lib/StochasticDiffEqCore/test/qa/qa.jl | 70 ++++++++++- 6 files changed, 147 insertions(+), 105 deletions(-) diff --git a/lib/StochasticDiffEqCore/Project.toml b/lib/StochasticDiffEqCore/Project.toml index 007a4d16898..07534467476 100644 --- a/lib/StochasticDiffEqCore/Project.toml +++ b/lib/StochasticDiffEqCore/Project.toml @@ -7,6 +7,7 @@ authors = ["Chris Rackauckas "] ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" DiffEqNoiseProcess = "77a26b50-5914-5dd7-bc55-306e6241c503" FastPower = "a4df4552-cc26-4903-aec0-212e50a0e84b" @@ -37,6 +38,7 @@ StochasticDiffEqLevyArea = {path = "../StochasticDiffEqLevyArea"} ADTypes = "1.22.0" Adapt = "4.3.0" ArrayInterface = "7.19.0" +CommonSolve = "0.2.4" DiffEqBase = "7" DiffEqNoiseProcess = "5.30.0" FastPower = "1.1.2" diff --git a/lib/StochasticDiffEqCore/src/StochasticDiffEqCore.jl b/lib/StochasticDiffEqCore/src/StochasticDiffEqCore.jl index 0e62eb9c17d..b9e8d4cb6c2 100644 --- a/lib/StochasticDiffEqCore/src/StochasticDiffEqCore.jl +++ b/lib/StochasticDiffEqCore/src/StochasticDiffEqCore.jl @@ -1,11 +1,15 @@ module StochasticDiffEqCore -using Reexport +using Reexport: Reexport, @reexport @reexport using DiffEqBase import ADTypes import OrdinaryDiffEqCore +# SDE/RODE/Jump algorithm and cache supertypes plus the shared solver-loop +# helpers live in OrdinaryDiffEqCore and are not part of its public API; they +# are dispatched on and extended here (see the EI ignore lists in +# test/qa/qa.jl). import OrdinaryDiffEqCore: ODEIntegrator, StochasticDiffEqAlgorithm, StochasticDiffEqAdaptiveAlgorithm, StochasticDiffEqCompositeAlgorithm, @@ -17,101 +21,69 @@ import OrdinaryDiffEqCore: ODEIntegrator, StochasticDiffEqJumpDiffusionAlgorithm, StochasticDiffEqJumpDiffusionAdaptiveAlgorithm, StochasticDiffEqJumpNewtonDiffusionAdaptiveAlgorithm, StochasticDiffEqCache, StochasticDiffEqConstantCache, StochasticDiffEqMutableCache, - default_controller, PredictiveController, - beta2_default, beta1_default, gamma_default, + beta2_default, beta1_default, qmin_default, qmax_default, qsteady_min_default, - qsteady_max_default, - stepsize_controller!, accept_step_controller, - step_accept_controller!, - step_reject_controller!, PIController, DummyController, issplit - -# Import shared loop functions from OrdinaryDiffEqCore. -import OrdinaryDiffEqCore: handle_callbacks!, handle_tstop!, - solution_endpoint_match_cur_integrator!, - _savevalues!, _postamble!, - is_composite_cache, is_composite_algorithm, final_progress, - loopheader!, loopfooter!, _loopfooter!, _step!, perform_step!, - isaposteriori, - increment_accept!, increment_reject!, - calc_dt_propose!, fix_dt_at_bounds!, modify_dt_for_tstops!, - log_step!, choose_algorithm!, update_uprev!, - alg_extrapolates, isfsal, - accept_noise!, reject_noise!, save_noise!, noise_curt, is_noise_saveable, - reinit_noise!, _determine_initdt, is_constant_cache, - handle_callback_modifiers!, - initialize_callbacks!, - current_extrapolant, current_extrapolant! - -using RecursiveArrayTools -using DiffEqNoiseProcess, Random, ArrayInterface -using SimpleNonlinearSolve, ForwardDiff, StaticArrays, MuladdMacro, FiniteDiff, Base.Threads -using Adapt + qsteady_max_default, issplit, + is_composite_algorithm, perform_step!, handle_callback_modifiers! + +using RecursiveArrayTools: RecursiveArrayTools, ArrayPartition, + recursive_bottom_eltype, recursive_unitless_bottom_eltype, + recursive_unitless_eltype, recursivecopy +using DiffEqNoiseProcess: DiffEqNoiseProcess, CompoundPoissonProcess, + CompoundPoissonProcess!, NoiseProcess, NoiseTransport, RSWM, + WienerProcess, WienerProcess! +using ArrayInterface: ArrayInterface +using SimpleNonlinearSolve: SimpleNonlinearSolve, SimpleTrustRegion +using ForwardDiff: ForwardDiff +using StaticArrays: StaticArrays, SArray +using MuladdMacro: MuladdMacro, @muladd +using FiniteDiff: FiniteDiff +using Adapt: Adapt, adapt import DiffEqBase: ODE_DEFAULT_NORM, ODE_DEFAULT_ISOUTOFDOMAIN, ODE_DEFAULT_PROG_MESSAGE, ODE_DEFAULT_UNSTABLE_CHECK using SciMLOperators: MatrixOperator, WOperator -using DiffEqBase: TimeGradientWrapper, UJacobianWrapper, TimeDerivativeWrapper, - UDerivativeWrapper +using Logging: Logging +using SparseArrays: SparseArrays, issparse -import RecursiveArrayTools: chain +# DEVerbosity is owned (and made public) by DiffEqBase but also re-exported +# through OrdinaryDiffEqCore; import it from the owner. +using DiffEqBase: DEVerbosity -using Logging, SparseArrays - -using SciMLLogging: AbstractVerbositySpecifier, AbstractVerbosityPreset, - None, Minimal, Standard, Detailed, All, - Silent, DebugLevel, InfoLevel, WarnLevel, ErrorLevel, @SciMLMessage - -using OrdinaryDiffEqCore: DEVerbosity - -using LinearAlgebra, Random +using LinearAlgebra: LinearAlgebra, I, mul! +using Random: Random import ForwardDiff.Dual import FastPower -import DiffEqBase: step!, initialize!, AbstractDEAlgorithm, - AbstractSDEAlgorithm, AbstractRODEAlgorithm, DEIntegrator, - DECache, AbstractSDEIntegrator, AbstractRODEIntegrator, - AbstractContinuousCallback, - Tableau, AbstractSDDEIntegrator +import DiffEqBase: step!, initialize! # Integrator Interface -import DiffEqBase: resize!, deleteat!, addat!, full_cache, user_cache, u_cache, du_cache, +import DiffEqBase: addat!, full_cache, user_cache, u_cache, du_cache, rand_cache, ratenoise_cache, resize_non_user_cache!, deleteat_non_user_cache!, addat_non_user_cache!, terminate!, get_du, get_dt, get_proposed_dt, set_proposed_dt!, savevalues!, add_tstop!, add_saveat!, set_reltol!, - set_abstol!, postamble!, last_step_failed, has_Wfact, has_jac, - get_tstops, get_tstops_array, get_tstops_max - -using DiffEqBase: check_error!, is_diagonal_noise, @.. - -using OrdinaryDiffEqCore: set_new_W!, get_W, _vec, _reshape + set_abstol! -if isdefined(OrdinaryDiffEqCore, :FastConvergence) - using OrdinaryDiffEqCore: - FastConvergence, Convergence, SlowConvergence, - VerySlowConvergence, Divergence - - import OrdinaryDiffEqCore: - calculate_residuals, calculate_residuals!, nlsolve_f, - unwrap_cache, islinear -else - using DiffEqBase: - FastConvergence, Convergence, SlowConvergence, VerySlowConvergence, - Divergence - - import DiffEqBase: - calculate_residuals, calculate_residuals!, nlsolve_f, unwrap_cache, - islinear -end +using DiffEqBase: @.. import SciMLBase -import SciMLBase: isadaptive, alg_order - -using StochasticDiffEqLevyArea +# AbstractDEAlgorithm/AbstractSDDEIntegrator supertypes are owned and exported +# by SciMLBase; is_diagonal_noise is public SciMLBase API. +import SciMLBase: isadaptive, alg_order, AbstractDEAlgorithm, + AbstractSDDEIntegrator, is_diagonal_noise +using SciMLBase: CallbackSet, DiscreteProblem, DynamicalSDEFunction, + NonlinearFunction, NonlinearProblem, ODEAliasSpecifier, SDEProblem, + get_tmp_cache, isinplace, reinit! +using CommonSolve: init, solve, solve! +using SciMLOperators: SciMLOperators +using DiffEqBase: DiffEqBase + +using StochasticDiffEqLevyArea: StochasticDiffEqLevyArea, MaxL2, terms_needed const CompiledFloats = Union{Float32, Float64} diff --git a/lib/StochasticDiffEqCore/src/initialize_dae.jl b/lib/StochasticDiffEqCore/src/initialize_dae.jl index a0c443d7be7..eaf749f64ec 100644 --- a/lib/StochasticDiffEqCore/src/initialize_dae.jl +++ b/lib/StochasticDiffEqCore/src/initialize_dae.jl @@ -3,7 +3,7 @@ function OrdinaryDiffEqCore._initialize_dae!( integrator::Union{SDEIntegrator, AbstractSDDEIntegrator}, prob::Union{SciMLBase.AbstractRODEProblem, SciMLBase.AbstractSDDEProblem}, - ::OrdinaryDiffEqCore.DefaultInit, isinplace + ::DiffEqBase.DefaultInit, isinplace ) return if SciMLBase.has_initializeprob(prob.f) OrdinaryDiffEqCore._initialize_dae!(integrator, prob, SciMLBase.OverrideInit(), isinplace) diff --git a/lib/StochasticDiffEqCore/src/integrators/integrator_utils.jl b/lib/StochasticDiffEqCore/src/integrators/integrator_utils.jl index c88ab987e1c..a8ab18409e0 100644 --- a/lib/StochasticDiffEqCore/src/integrators/integrator_utils.jl +++ b/lib/StochasticDiffEqCore/src/integrators/integrator_utils.jl @@ -64,22 +64,22 @@ OrdinaryDiffEqCore.is_composite_cache(cache::StochasticCompositeCache) = true # is_noise_saveable interface that ODE's unified loop functions call. # ============================================================================ -function OrdinaryDiffEqCore.accept_noise!(W::DiffEqNoiseProcess.AbstractNoiseProcess, dt, u, p, setup) +function OrdinaryDiffEqCore.accept_noise!(W::SciMLBase.AbstractNoiseProcess, dt, u, p, setup) return DiffEqNoiseProcess.accept_step!(W, dt, u, p, setup) end -function OrdinaryDiffEqCore.reject_noise!(W::DiffEqNoiseProcess.AbstractNoiseProcess, dt, u, p) +function OrdinaryDiffEqCore.reject_noise!(W::SciMLBase.AbstractNoiseProcess, dt, u, p) return DiffEqNoiseProcess.reject_step!(W, dt, u, p) end -function OrdinaryDiffEqCore.save_noise!(W::DiffEqNoiseProcess.AbstractNoiseProcess) +function OrdinaryDiffEqCore.save_noise!(W::SciMLBase.AbstractNoiseProcess) return DiffEqNoiseProcess.save_noise!(W) end -OrdinaryDiffEqCore.noise_curt(W::DiffEqNoiseProcess.AbstractNoiseProcess) = W.curt +OrdinaryDiffEqCore.noise_curt(W::SciMLBase.AbstractNoiseProcess) = W.curt OrdinaryDiffEqCore.is_noise_saveable(W::NoiseProcess) = true -OrdinaryDiffEqCore.is_noise_saveable(W::DiffEqNoiseProcess.AbstractNoiseProcess) = false +OrdinaryDiffEqCore.is_noise_saveable(W::SciMLBase.AbstractNoiseProcess) = false # ============================================================================ # is_constant_cache for SDE cache types (needed by ODE's change_t_via_interpolation!) @@ -106,8 +106,8 @@ OrdinaryDiffEqCore.get_fsalfirstlast(::StochasticDiffEqMutableCache, u) = # reinit_noise!: reinitialize noise process (called from ODE's reinit!) # ============================================================================ -function OrdinaryDiffEqCore.reinit_noise!(W::DiffEqNoiseProcess.AbstractNoiseProcess, dt) - return DiffEqNoiseProcess.reinit!(W, dt) +function OrdinaryDiffEqCore.reinit_noise!(W::SciMLBase.AbstractNoiseProcess, dt) + return SciMLBase.reinit!(W, dt) end # _determine_initdt: SDE extension (called from ODE's auto_dt_reset!) diff --git a/lib/StochasticDiffEqCore/src/solve.jl b/lib/StochasticDiffEqCore/src/solve.jl index 8647307aa57..018a3f66084 100644 --- a/lib/StochasticDiffEqCore/src/solve.jl +++ b/lib/StochasticDiffEqCore/src/solve.jl @@ -8,14 +8,14 @@ function _get_alias_noise_from_kwargs(; alias_noise = nothing, alias = nothing, end end -function DiffEqBase.__solve( - prob::DiffEqBase.AbstractRODEProblem, +function SciMLBase.__solve( + prob::SciMLBase.AbstractRODEProblem, alg::Union{StochasticDiffEqAlgorithm, StochasticDiffEqRODEAlgorithm}; kwargs... ) - integrator = DiffEqBase.__init(prob, alg; kwargs...) + integrator = SciMLBase.__init(prob, alg; kwargs...) solve!(integrator) - if prob isa DiffEqBase.AbstractRODEProblem && + if prob isa SciMLBase.AbstractRODEProblem && typeof(prob.noise) == typeof(integrator.sol.W) && _get_alias_noise_from_kwargs(; kwargs...) copy!(prob.noise, integrator.sol.W) @@ -24,15 +24,15 @@ function DiffEqBase.__solve( end # More specific method for JumpProblem to win over JumpProcesses.jl's ambiguity fix dispatch -function DiffEqBase.__solve( +function SciMLBase.__solve( prob::JumpProblem, alg::Union{StochasticDiffEqAlgorithm, StochasticDiffEqRODEAlgorithm}; merge_callbacks = true, kwargs... ) kwargs = DiffEqBase.merge_problem_kwargs(prob; merge_callbacks, kwargs...) - integrator = DiffEqBase.__init(prob, alg; kwargs...) + integrator = SciMLBase.__init(prob, alg; kwargs...) solve!(integrator) - if concrete_prob(prob) isa DiffEqBase.AbstractRODEProblem && + if concrete_prob(prob) isa SciMLBase.AbstractRODEProblem && typeof(concrete_prob(prob).noise) == typeof(integrator.sol.W) && _get_alias_noise_from_kwargs(; kwargs...) copy!(concrete_prob(prob).noise, integrator.sol.W) @@ -67,7 +67,7 @@ function _resolve_rng(rng, seed, prob) # `remake(prob, seed=s)` inside an ensemble is actually reproducible. if !iszero(seed) return Random.Xoshiro(seed), seed, false - elseif prob isa DiffEqBase.AbstractRODEProblem && !iszero(prob.seed) + elseif prob isa SciMLBase.AbstractRODEProblem && !iszero(prob.seed) return Random.Xoshiro(prob.seed), prob.seed, false end _seed = rand(rng, UInt64) @@ -76,7 +76,7 @@ function _resolve_rng(rng, seed, prob) return rng, UInt64(0), true end _seed = if iszero(seed) - if (!(prob isa DiffEqBase.AbstractRODEProblem) || iszero(prob.seed)) + if (!(prob isa SciMLBase.AbstractRODEProblem) || iszero(prob.seed)) seed_multiplier() * rand(UInt64) else prob.seed @@ -99,8 +99,8 @@ function _z_prototype(alg, rand_prototype, iip::Bool) return rand_prototype end -function DiffEqBase.__init( - _prob::Union{DiffEqBase.AbstractRODEProblem, JumpProblem}, +function SciMLBase.__init( + _prob::Union{SciMLBase.AbstractRODEProblem, JumpProblem}, alg::Union{StochasticDiffEqAlgorithm, StochasticDiffEqRODEAlgorithm}; kwargs... ) @@ -108,7 +108,7 @@ function DiffEqBase.__init( end function _sde_init( - _prob::Union{DiffEqBase.AbstractRODEProblem, JumpProblem}, + _prob::Union{SciMLBase.AbstractRODEProblem, JumpProblem}, alg::Union{StochasticDiffEqAlgorithm, StochasticDiffEqRODEAlgorithm}; saveat = (), tstops = (), @@ -117,8 +117,8 @@ function _sde_init( save_everystep = isempty(saveat), save_noise = save_everystep && ( typeof(concrete_prob(_prob).f) <: Tuple ? - DiffEqBase.has_analytic(concrete_prob(_prob).f[1]) : - DiffEqBase.has_analytic(concrete_prob(_prob).f) + SciMLBase.has_analytic(concrete_prob(_prob).f[1]) : + SciMLBase.has_analytic(concrete_prob(_prob).f) ), save_on = true, save_start = save_everystep || isempty(saveat) || saveat isa Number ? true : @@ -162,7 +162,7 @@ function _sde_init( seed = UInt64(0), rng = nothing, alias = nothing, - initializealg = OrdinaryDiffEqCore.DefaultInit(), + initializealg = DiffEqBase.DefaultInit(), kwargs... ) # NOTE: JumpProblem kwargs merge is already done by init_call / __solve @@ -206,12 +206,12 @@ function _sde_init( if any(mm != I for mm in prob.f.mass_matrix) error("This solver is not able to use mass matrices.") end - elseif prob isa DiffEqBase.AbstractRODEProblem && prob.f.mass_matrix != I && + elseif prob isa SciMLBase.AbstractRODEProblem && prob.f.mass_matrix != I && !alg_mass_matrix_compatible(alg) error("This solver is not able to use mass matrices.") end - if prob isa DiffEqBase.AbstractRODEProblem && typeof(prob.noise) <: NoiseProcess && + if prob isa SciMLBase.AbstractRODEProblem && typeof(prob.noise) <: NoiseProcess && prob.noise.bridge === nothing && adaptive error("Bridge function must be given for adaptivity. Either declare this function in noise process or set adaptive=false") end @@ -275,7 +275,7 @@ function _sde_init( uBottomEltypeNoUnits = recursive_unitless_bottom_eltype(u) uEltypeNoUnits = recursive_unitless_eltype(u) tTypeNoUnits = typeof(one(tType)) - noise = prob isa DiffEqBase.AbstractRODEProblem ? prob.noise : nothing + noise = prob isa SciMLBase.AbstractRODEProblem ? prob.noise : nothing tspan = prob.tspan t = tspan[1] @@ -326,7 +326,7 @@ function _sde_init( noise_rate_prototype = rate_prototype.x[1] elseif is_diagonal_noise(prob) noise_rate_prototype = rate_prototype - elseif prob isa DiffEqBase.AbstractRODEProblem + elseif prob isa SciMLBase.AbstractRODEProblem if prob isa SciMLBase.AbstractSDEProblem noise_rate_prototype = copy(prob.noise_rate_prototype) else @@ -355,12 +355,12 @@ function _sde_init( elseif prob isa SciMLBase.AbstractSDEProblem if issparse(u) rand_prototype = adapt( - DiffEqBase.parameterless_type(u), zeros(randElType, size(noise_rate_prototype, 2)) + SciMLBase.parameterless_type(u), zeros(randElType, size(noise_rate_prototype, 2)) ) else rand_prototype = false .* noise_rate_prototype[1, :] end - elseif prob isa DiffEqBase.AbstractRODEProblem + elseif prob isa SciMLBase.AbstractRODEProblem rand_prototype = copy(prob.rand_prototype) else rand_prototype = nothing @@ -372,7 +372,7 @@ function _sde_init( CallbackSet(callback, _prob.jump_callback) : callback # ── Noise creation (WienerProcess / user noise handling) ───────────── - if prob isa DiffEqBase.AbstractRODEProblem && prob.noise === nothing + if prob isa SciMLBase.AbstractRODEProblem && prob.noise === nothing rswm = isadaptive(alg) ? RSWM(adaptivealg = :RSwM3) : RSWM(adaptivealg = :RSwM1) if isinplace(prob) if alg_needs_extra_process(alg) @@ -405,7 +405,7 @@ function _sde_init( ) end end - elseif prob isa DiffEqBase.AbstractRODEProblem + elseif prob isa SciMLBase.AbstractRODEProblem _alias_noise = if hasproperty(aliases, :alias_noise) && aliases.alias_noise !== nothing aliases.alias_noise else diff --git a/lib/StochasticDiffEqCore/test/qa/qa.jl b/lib/StochasticDiffEqCore/test/qa/qa.jl index ea9a3f1382c..9b34dc6bd5a 100644 --- a/lib/StochasticDiffEqCore/test/qa/qa.jl +++ b/lib/StochasticDiffEqCore/test/qa/qa.jl @@ -1,9 +1,77 @@ using SciMLTesting, StochasticDiffEqCore, Test using JET +# StochasticDiffEqCore is an extension package for OrdinaryDiffEqCore's solver +# loop: it dispatches on and extends OrdinaryDiffEqCore-internal traits/loop +# helpers and a handful of still-internal SciMLBase/DiffEqBase interface names. +# Every remaining EI ignore below is a genuinely non-public (or non-owner) name +# from an upstream package; each is documented with its source. Names that +# became public (SciMLBase abstract types, is_diagonal_noise, __solve/__init, +# DEVerbosity, etc.) were migrated to their public owners in src/ rather than +# ignored. See SciML/OrdinaryDiffEq.jl#3776. + +# OrdinaryDiffEqCore-internal names that this package dispatches on or extends. +# These are not part of OrdinaryDiffEqCore's public API; they need make-public +# upstream before they can be dropped from the ignore lists. +const ODEC_INTERNAL = ( + # Algorithm/cache supertypes + controllers/defaults (explicit imports) + :ODEIntegrator, :StochasticDiffEqAlgorithm, :StochasticDiffEqAdaptiveAlgorithm, + :StochasticDiffEqCompositeAlgorithm, :StochasticDiffEqRODEAlgorithm, + :StochasticDiffEqRODEAdaptiveAlgorithm, :StochasticDiffEqRODECompositeAlgorithm, + :StochasticDiffEqNewtonAdaptiveAlgorithm, :StochasticDiffEqNewtonAlgorithm, + :StochasticDiffEqJumpAlgorithm, :StochasticDiffEqJumpAdaptiveAlgorithm, + :StochasticDiffEqJumpNewtonAdaptiveAlgorithm, :StochasticDiffEqJumpDiffusionAlgorithm, + :StochasticDiffEqJumpDiffusionAdaptiveAlgorithm, + :StochasticDiffEqJumpNewtonDiffusionAdaptiveAlgorithm, + :StochasticDiffEqCache, :StochasticDiffEqConstantCache, :StochasticDiffEqMutableCache, + :beta1_default, :beta2_default, + :qmin_default, :qmax_default, :qsteady_min_default, :qsteady_max_default, + :issplit, :is_composite_algorithm, :perform_step!, :handle_callback_modifiers!, + # Loop/trait/autodiff helpers extended via qualified `OrdinaryDiffEqCore.x` + :DEOptions, :_determine_initdt, :_get_fdtype, :_get_fwd_chunksize, + :_get_fwd_chunksize_int, :_initialize_dae!, :_ode_init, :accept_noise!, + :alg_autodiff, :alg_difftype, :alg_extrapolates, :concrete_jac, :gamma_default, + :get_chunksize, :get_current_alg_autodiff, :get_fsalfirstlast, :has_autodiff, + :is_composite_cache, :is_constant_cache, :is_noise_saveable, :isfsal, + :noise_curt, :ode_determine_initdt, :reinit_noise!, :reject_noise!, + :save_noise!, :standardtag, +) + +# Still-internal SciMLBase interface names (problem/alg supertypes, alias +# specifiers, mass-matrix/initialization helpers, autodiff val unwrap). +const SCIMLBASE_INTERNAL = ( + :AbstractRODEProblem, :AbstractSDDEProblem, :AbstractSDDEIntegrator, + :AlgorithmInterpretation, :alg_interpretation, :RODEAliasSpecifier, + :SDEAliasSpecifier, :__has_mass_matrix, :has_initializeprob, + :parameterless_type, :_unwrap_val, +) + +# Still-internal DiffEqBase names. `@..` is owned by FastBroadcast and obtained +# through DiffEqBase's re-export (the standard SciML access path), so it is also +# listed in the via-owners ignore below. +const DIFFEQBASE_INTERNAL = (:prob2dtmin, :ODE_DEFAULT_UNSTABLE_CHECK, Symbol("@..")) + +# Non-public names from other upstream packages. +const JUMPPROCESSES_INTERNAL = (:reset_jump_problem!, :resetted_jump_problem) +const DIFFEQNOISEPROCESS_INTERNAL = (:resize_stack!,) +const FORWARDDIFF_INTERNAL = (:Tag, :pickchunksize) +const BASE_INTERNAL = (Symbol("@pure"),) + +const NONPUBLIC_IGNORE = ( + ODEC_INTERNAL..., SCIMLBASE_INTERNAL..., DIFFEQBASE_INTERNAL..., + JUMPPROCESSES_INTERNAL..., DIFFEQNOISEPROCESS_INTERNAL..., + FORWARDDIFF_INTERNAL..., BASE_INTERNAL..., +) + run_qa( StochasticDiffEqCore; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # `@..` reaches StochasticDiffEqCore via DiffEqBase's re-export of + # FastBroadcast; FastBroadcast is not a direct dependency. + all_explicit_imports_via_owners = (; ignore = (Symbol("@.."),)), + all_qualified_accesses_are_public = (; ignore = NONPUBLIC_IGNORE), + all_explicit_imports_are_public = (; ignore = NONPUBLIC_IGNORE), + ), ) From b5a83d8764fe592cf68c45703774a8094758043c Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:56:51 -0400 Subject: [PATCH 037/108] OrdinaryDiffEqBDF: minimize ExplicitImports exceptions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the blanket 5-check `ei_broken` in test/qa/qa.jl with tight, documented ignore lists, and fix the underlying import hygiene in src so that 3 of the 5 EI checks pass with no exceptions: - no_stale_explicit_imports: removed 18 genuinely-unused imports (@capture, AbstractADType, AutoFiniteDiff, CompiledFloats, DummyController, NonlinearSolveAlg, OrdinaryDiffEqAlgorithm, UJacobianWrapper, _ad_chunksize_int, _ad_fdtype, _reshape, _vec, accept_step_controller, compute_step!, ismutable, qmin_default, set_EEst!, uses_uprev). Names still needed are accessed qualified. - all_explicit_imports_via_owners: route names to their owning module — alg_order/isadaptive/_unwrap_val from SciMLBase; calculate_residuals/calculate_residuals!/initialize! from DiffEqBase; DIRK/COEFFICIENT_MULTISTEP/isnewton/set_new_W! from OrdinaryDiffEqCore (were imported via OrdinaryDiffEqNonlinearSolve). initialize! is public in DiffEqBase so it needs no ignore. - no_implicit_imports: make the 6 implicit names explicit (Reexport/@reexport; SciMLBase + ODEProblem/derivative_discontinuity!/ solve via an explicit `import SciMLBase`/`using SciMLBase: ...`). The two remaining checks (all_qualified_accesses_are_public, all_explicit_imports_are_public) are reduced from a blanket ei_broken to tight named-ignore lists covering only internal (non-public) API of the sibling solver sublibraries (OrdinaryDiffEqCore/SDIRK/NonlinearSolve) plus a few SciMLBase/DiffEqBase/TruncatedStacktraces internals that have no public replacement. Each is a candidate for an upstream `public` declaration; see SciML/OrdinaryDiffEq.jl#3776. Verified on Julia 1.12 against released SciMLTesting 1.7.0 / SciMLBase 3.30.0: run_qa ExplicitImports 6/6 pass. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqBDF.jl | 38 ++++++++-------- lib/OrdinaryDiffEqBDF/test/qa/qa.jl | 45 ++++++++++++++++++- 2 files changed, 62 insertions(+), 21 deletions(-) diff --git a/lib/OrdinaryDiffEqBDF/src/OrdinaryDiffEqBDF.jl b/lib/OrdinaryDiffEqBDF/src/OrdinaryDiffEqBDF.jl index 994ec91e16c..3c5f198dcb9 100644 --- a/lib/OrdinaryDiffEqBDF/src/OrdinaryDiffEqBDF.jl +++ b/lib/OrdinaryDiffEqBDF/src/OrdinaryDiffEqBDF.jl @@ -1,44 +1,43 @@ module OrdinaryDiffEqBDF -import OrdinaryDiffEqCore: alg_order, calculate_residuals!, - initialize!, perform_step!, unwrap_alg, - calculate_residuals, alg_extrapolates, - OrdinaryDiffEqAlgorithm, default_controller, IController, +import OrdinaryDiffEqCore: perform_step!, unwrap_alg, + alg_extrapolates, + default_controller, IController, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, OrdinaryDiffEqNewtonAdaptiveAlgorithm, OrdinaryDiffEqNewtonAlgorithm, AbstractController, - CompiledFloats, uses_uprev, - alg_cache, _vec, _reshape, @cache, + alg_cache, @cache, isfsal, full_cache, - constvalue, isadaptive, error_constant, + constvalue, error_constant, has_special_newton_error, trivial_limiter!, - issplit, qmin_default, qmax_default, gamma_default, + issplit, qmax_default, gamma_default, qsteady_min_default, qsteady_max_default, get_current_alg_order, get_current_adaptive_order, stepsize_controller!, step_accept_controller!, step_reject_controller!, post_newton_controller!, - accept_step_controller, get_EEst, set_EEst!, + get_EEst, setup_controller_cache, get_qmax, get_gamma, get_qsteady_min, get_qsteady_max, get_failfactor, CommonControllerOptions, resolve_basic, _resolved_QT, AbstractControllerCache, - DAEAlgorithm, _unwrap_val, DummyController, - get_fsalfirstlast, generic_solver_docstring, _ad_chunksize_int, _ad_fdtype, _fixup_ad, + DAEAlgorithm, + get_fsalfirstlast, generic_solver_docstring, _fixup_ad, _ode_interpolant, _ode_interpolant!, has_stiff_interpolation, - _ode_addsteps!, DerivativeOrderNotPossibleError, set_discontinuity + _ode_addsteps!, DerivativeOrderNotPossibleError, set_discontinuity, + DIRK, COEFFICIENT_MULTISTEP, isnewton, set_new_W! +import SciMLBase: alg_order, isadaptive, _unwrap_val +import DiffEqBase: calculate_residuals, calculate_residuals!, initialize! using OrdinaryDiffEqSDIRK: ESDIRKIMEXConstantCache, ESDIRKIMEXCache, ImplicitEulerESDIRKIMEXTableau using TruncatedStacktraces: @truncate_stacktrace using MuladdMacro: @muladd -using MacroTools: @capture using FastBroadcast: @.. using RecursiveArrayTools: recursivefill! using LinearAlgebra: mul!, I import ArrayInterface -using ArrayInterface: ismutable import OrdinaryDiffEqCore import OrdinaryDiffEqCore: default_controller @@ -53,14 +52,13 @@ else end end -using OrdinaryDiffEqDifferentiation: UJacobianWrapper using OrdinaryDiffEqNonlinearSolve: NLNewton, du_alias_or_new, build_nlsolver, - nlsolve!, nlsolvefail, isnewton, markfirststage!, - set_new_W!, DIRK, compute_step!, COEFFICIENT_MULTISTEP, - NonlinearSolveAlg -import ADTypes: AutoForwardDiff, AutoFiniteDiff, AbstractADType + nlsolve!, nlsolvefail, markfirststage! +import ADTypes: AutoForwardDiff -using Reexport +using Reexport: Reexport, @reexport +import SciMLBase +using SciMLBase: ODEProblem, derivative_discontinuity!, solve @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqBDF/test/qa/qa.jl b/lib/OrdinaryDiffEqBDF/test/qa/qa.jl index d0d82553098..5e20ad76926 100644 --- a/lib/OrdinaryDiffEqBDF/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqBDF/test/qa/qa.jl @@ -1,7 +1,50 @@ using SciMLTesting, OrdinaryDiffEqBDF, Test +# The names below are internal (non-public) API of sibling solver sublibraries +# (OrdinaryDiffEqCore / OrdinaryDiffEqSDIRK / OrdinaryDiffEqNonlinearSolve) plus a +# handful of SciMLBase / DiffEqBase / TruncatedStacktraces internals that BDF must +# use to plug into the integrator framework. They are owned by those packages and +# have no public replacement, so they are imported/accessed from their owner and +# ignored here. Each becomes a candidate for a `public` declaration upstream; see +# SciML/OrdinaryDiffEq.jl#3776. +const QUALIFIED_NONPUBLIC = ( + :CompositeControllerCache, :accept_step_controller, :get_EEst, :increment_nf!, + :post_newton_controller!, :set_EEst!, :step_accept_controller!, + :step_reject_controller!, :stepsize_controller!, + :lorenz, :lorenz_oop, # precompile-workload test problems + :FunctionWrapperSpecialize, :NoSpecialize, # SciMLBase specialization markers +) + +const EXPLICIT_IMPORT_NONPUBLIC = ( + Symbol("@cache"), Symbol("@truncate_stacktrace"), + :AbstractController, :AbstractControllerCache, :CommonControllerOptions, + :DAEAlgorithm, :DerivativeOrderNotPossibleError, :IController, + :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, + :OrdinaryDiffEqNewtonAdaptiveAlgorithm, :OrdinaryDiffEqNewtonAlgorithm, + :COEFFICIENT_MULTISTEP, :DIRK, + :ESDIRKIMEXCache, :ESDIRKIMEXConstantCache, :ImplicitEulerESDIRKIMEXTableau, + :NLNewton, :build_nlsolver, :du_alias_or_new, :markfirststage!, + :nlsolve!, :nlsolvefail, :isnewton, :set_new_W!, + :alg_cache, :alg_extrapolates, :constvalue, :default_controller, :error_constant, + :_fixup_ad, :gamma_default, :generic_solver_docstring, + :get_current_adaptive_order, :get_current_alg_order, :get_current_qmax, + :get_EEst, :get_failfactor, :get_fsalfirstlast, :get_gamma, :get_qmax, + :get_qsteady_max, :get_qsteady_min, :has_special_newton_error, + :has_stiff_interpolation, :isfsal, :issplit, + :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, + :perform_step!, :post_newton_controller!, :qmax_default, + :qsteady_max_default, :qsteady_min_default, :resolve_basic, :_resolved_QT, + :set_discontinuity, :setup_controller_cache, + :step_accept_controller!, :step_reject_controller!, :stepsize_controller!, + :trivial_limiter!, :unwrap_alg, :_unwrap_val, + :calculate_residuals, :calculate_residuals!, # DiffEqBase-owned, non-public +) + run_qa( OrdinaryDiffEqBDF; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + all_qualified_accesses_are_public = (; ignore = QUALIFIED_NONPUBLIC), + all_explicit_imports_are_public = (; ignore = EXPLICIT_IMPORT_NONPUBLIC), + ), ) From d1089a72549c801d2d62257157aadbfcd2053c24 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:58:19 -0400 Subject: [PATCH 038/108] StochasticDiffEqIIF: minimize ExplicitImports exceptions in QA Drop the blanket ei_broken in test/qa/qa.jl by fixing the underlying explicit-imports issues in src: - import `is_diagonal_noise` from its public owner SciMLBase (was DiffEqBase) - import `initialize!` from its public owner DiffEqBase (was OrdinaryDiffEqCore) - import `@..` from its owner FastBroadcast (was DiffEqBase); add FastBroadcast dep - make implicit imports explicit (Reexport/@reexport, mul!/rmul!, module bindings) - drop the unused `using RecursiveArrayTools` Only `perform_step!`, `issplit`, `current_extrapolant`, `current_extrapolant!` (OrdinaryDiffEqCore) and `@cache` (StochasticDiffEqCore) remain non-public solver-author internals; these are narrowed to a tight, documented ignore in the all_explicit_imports_are_public check (tracked in #3776) instead of a blanket ei_broken. All six EI checks pass on Julia 1.12. Co-Authored-By: Chris Rackauckas --- lib/StochasticDiffEqIIF/Project.toml | 8 ++++---- .../src/StochasticDiffEqIIF.jl | 18 ++++++++++++------ lib/StochasticDiffEqIIF/test/qa/qa.jl | 14 +++++++++++++- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/lib/StochasticDiffEqIIF/Project.toml b/lib/StochasticDiffEqIIF/Project.toml index 006818fe25b..8f6a8aeb0c5 100644 --- a/lib/StochasticDiffEqIIF/Project.toml +++ b/lib/StochasticDiffEqIIF/Project.toml @@ -1,14 +1,14 @@ name = "StochasticDiffEqIIF" uuid = "ebf54054-c36b-4494-9aba-657e36df524f" authors = ["Chris Rackauckas "] -version = "2.0.1" +version = "2.0.2" [deps] DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" +FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" MuladdMacro = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" -RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" @@ -23,13 +23,13 @@ DiffEqBase = {path = "../DiffEqBase"} [compat] DiffEqBase = "7" +FastBroadcast = "1.3" LinearAlgebra = "1.10" MuladdMacro = "0.2.4" OrdinaryDiffEqCore = "4" Pkg = "1" -RecursiveArrayTools = "4.2.0" Reexport = "1.2.2" -SciMLBase = "3.10.0" +SciMLBase = "3.30" StochasticDiffEqCore = "2" Test = "<0.0.1, 1" SafeTestsets = "0.1.0" diff --git a/lib/StochasticDiffEqIIF/src/StochasticDiffEqIIF.jl b/lib/StochasticDiffEqIIF/src/StochasticDiffEqIIF.jl index 96ed3d6684f..1aa7a833eaf 100644 --- a/lib/StochasticDiffEqIIF/src/StochasticDiffEqIIF.jl +++ b/lib/StochasticDiffEqIIF/src/StochasticDiffEqIIF.jl @@ -1,10 +1,15 @@ module StochasticDiffEqIIF -using Reexport +using Reexport: Reexport, @reexport @reexport using StochasticDiffEqCore +using StochasticDiffEqCore: StochasticDiffEqCore import OrdinaryDiffEqCore -import OrdinaryDiffEqCore: perform_step!, initialize!, issplit, +# `perform_step!`, `issplit`, `current_extrapolant`, `current_extrapolant!` are part +# of OrdinaryDiffEqCore's solver-author interface but are not (yet) declared `public`, +# so they are tightly ignored in the QA explicit-imports checks. (`initialize!` is +# owned by DiffEqBase and imported from its public owner there.) +import OrdinaryDiffEqCore: perform_step!, issplit, current_extrapolant, current_extrapolant! import StochasticDiffEqCore: alg_cache, alg_order, alg_compatible, @@ -15,14 +20,15 @@ import StochasticDiffEqCore: alg_cache, alg_order, alg_compatible, determine_chunksize, unwrap_alg, @cache -import DiffEqBase: is_diagonal_noise, @.. -import DiffEqBase: full_cache, rand_cache, ratenoise_cache +import DiffEqBase +import DiffEqBase: initialize!, full_cache, rand_cache, ratenoise_cache +import SciMLBase: is_diagonal_noise +import FastBroadcast: @.. import MuladdMacro: @muladd import SciMLBase -using LinearAlgebra -using RecursiveArrayTools +using LinearAlgebra: mul!, rmul! include("algorithms.jl") include("alg_utils.jl") diff --git a/lib/StochasticDiffEqIIF/test/qa/qa.jl b/lib/StochasticDiffEqIIF/test/qa/qa.jl index 192271adc53..cbd8c415d12 100644 --- a/lib/StochasticDiffEqIIF/test/qa/qa.jl +++ b/lib/StochasticDiffEqIIF/test/qa/qa.jl @@ -5,5 +5,17 @@ run_qa( StochasticDiffEqIIF; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # These names are part of the OrdinaryDiffEqCore solver-author interface and + # StochasticDiffEqCore's cache machinery, but are not (yet) declared `public`. + # They are imported from their owning module; the only residual EI complaint is + # that they are not public there. Tracked for make-public in + # SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; + ignore = ( + :perform_step!, :issplit, :current_extrapolant, :current_extrapolant!, # OrdinaryDiffEqCore + Symbol("@cache"), # StochasticDiffEqCore + ), + ), + ), ) From 3c192a895555fe4b3aa96eca99abc2b0fe282282 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 12:59:29 -0400 Subject: [PATCH 039/108] Minimize EI exceptions for StochasticDiffEqLeaping Replace the blanket `ei_broken` over all six ExplicitImports checks with genuine fixes plus tight, documented per-check ignore lists: - Remove stale explicit imports (NLSolver, NLAnderson, NLNewton, isnewton, nlsolvefail, accept_step_controller, is_diagonal_noise, initialize!, _vec, _reshape) and the stale `nlsolve_f` import (used only qualified). - Drop vestigial whole-module `using LinearAlgebra/StaticArrays/RecursiveArrayTools` (none of their names are used) and make the Reexport/DiffEqBase module-name reliance explicit, clearing no_implicit_imports. - Access `default_controller` via its owner OrdinaryDiffEqCore instead of StochasticDiffEqCore, clearing one via_owners finding. - Narrow the remaining exceptions to tight ignore lists for genuinely non-public internal solver-interface names (OrdinaryDiffEqCore, OrdinaryDiffEqNonlinearSolve, StochasticDiffEqCore, DiffEqBase) plus the FastBroadcast `@..` macro and PoissonRandom `pois_rand`, all re-exported through the natural dependency. ExplicitImports now passes 6/6. The two remaining Aqua failures (method ambiguity and undefined exports checkSRAOrder/checkSRIOrder via the StochasticDiffEqCore reexport) are pre-existing on master and unrelated to ExplicitImports. Co-Authored-By: Chris Rackauckas --- .../src/StochasticDiffEqLeaping.jl | 20 +++++++------- lib/StochasticDiffEqLeaping/src/alg_utils.jl | 2 +- .../src/integrator_utils.jl | 2 -- lib/StochasticDiffEqLeaping/test/qa/qa.jl | 27 ++++++++++++++++++- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/lib/StochasticDiffEqLeaping/src/StochasticDiffEqLeaping.jl b/lib/StochasticDiffEqLeaping/src/StochasticDiffEqLeaping.jl index fc766f9de94..cc5b9617cef 100644 --- a/lib/StochasticDiffEqLeaping/src/StochasticDiffEqLeaping.jl +++ b/lib/StochasticDiffEqLeaping/src/StochasticDiffEqLeaping.jl @@ -1,11 +1,12 @@ module StochasticDiffEqLeaping -using Reexport +using Reexport: Reexport, @reexport @reexport using StochasticDiffEqCore +using StochasticDiffEqCore: StochasticDiffEqCore import OrdinaryDiffEqCore -import OrdinaryDiffEqCore: perform_step!, initialize!, issplit, - stepsize_controller!, accept_step_controller, step_accept_controller!, +import OrdinaryDiffEqCore: perform_step!, issplit, + stepsize_controller!, step_accept_controller!, step_reject_controller!, DummyController import StochasticDiffEqCore: alg_cache, alg_order, alg_compatible, @@ -17,19 +18,16 @@ import StochasticDiffEqCore: alg_cache, alg_order, alg_compatible, TauLeapingDrift, @cache -import DiffEqBase: is_diagonal_noise, @.. +import DiffEqBase +# `@..` is the SciML fused-broadcast macro; its owner is FastBroadcast (not a +# direct dependency here), so it is re-exported through DiffEqBase. +import DiffEqBase: @.. import DiffEqBase: full_cache, rand_cache, ratenoise_cache import MuladdMacro: @muladd import SciMLBase -using OrdinaryDiffEqCore: _vec, _reshape -using OrdinaryDiffEqNonlinearSolve: NLSolver, NLFunctional, NLAnderson, NLNewton, - nlsolvefail, isnewton - -using LinearAlgebra -using StaticArrays -using RecursiveArrayTools +using OrdinaryDiffEqNonlinearSolve: NLFunctional import JumpProcesses diff --git a/lib/StochasticDiffEqLeaping/src/alg_utils.jl b/lib/StochasticDiffEqLeaping/src/alg_utils.jl index f48d74122fd..d0b47c89fdb 100644 --- a/lib/StochasticDiffEqLeaping/src/alg_utils.jl +++ b/lib/StochasticDiffEqLeaping/src/alg_utils.jl @@ -4,7 +4,7 @@ alg_order(alg::ImplicitTauLeaping) = 1 // 1 # Weak first order (backward Euler) alg_order(alg::ThetaTrapezoidalTauLeaping) = 2 // 1 # Weak second order # special cases in stepsize_controllers.jl -function StochasticDiffEqCore.default_controller( +function OrdinaryDiffEqCore.default_controller( alg::Union{TauLeaping, CaoTauLeaping, ThetaTrapezoidalTauLeaping}, args... ) return DummyController() diff --git a/lib/StochasticDiffEqLeaping/src/integrator_utils.jl b/lib/StochasticDiffEqLeaping/src/integrator_utils.jl index fd3bc773c22..5698c5b9533 100644 --- a/lib/StochasticDiffEqLeaping/src/integrator_utils.jl +++ b/lib/StochasticDiffEqLeaping/src/integrator_utils.jl @@ -1,5 +1,3 @@ -import OrdinaryDiffEqCore: nlsolve_f - # nlsolve_f override for ImplicitTauLeaping: return TauLeapingDrift wrapper # Uses ODEIntegrator{A} directly since parameterized type aliases don't work. function OrdinaryDiffEqCore.nlsolve_f(integrator::OrdinaryDiffEqCore.ODEIntegrator{A}) where {A <: ImplicitTauLeaping} diff --git a/lib/StochasticDiffEqLeaping/test/qa/qa.jl b/lib/StochasticDiffEqLeaping/test/qa/qa.jl index 371e69d96e1..be1547472d1 100644 --- a/lib/StochasticDiffEqLeaping/test/qa/qa.jl +++ b/lib/StochasticDiffEqLeaping/test/qa/qa.jl @@ -5,5 +5,30 @@ run_qa( StochasticDiffEqLeaping; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + # `@..` is the SciML fused-broadcast macro, owned by FastBroadcast and + # re-exported through DiffEqBase (FastBroadcast is not a direct dep here). + all_explicit_imports_via_owners = (; ignore = (Symbol("@.."),)), + # `pois_rand` is owned by PoissonRandom and re-exported by JumpProcesses, + # the natural dependency that owns the jump-process interface here. + all_qualified_accesses_via_owners = (; ignore = (:pois_rand,)), + # Internal (non-public) solver-interface names this method package must + # extend/import. These are private API of OrdinaryDiffEqCore, + # OrdinaryDiffEqNonlinearSolve, StochasticDiffEqCore, and DiffEqBase; they + # have no public replacement (track make-public in SciML/OrdinaryDiffEq.jl#3776). + all_explicit_imports_are_public = (; + ignore = ( + Symbol("@.."), Symbol("@cache"), :DummyController, :NLFunctional, + :issplit, :perform_step!, :step_accept_controller!, + :step_reject_controller!, :stepsize_controller!, + ) + ), + all_qualified_accesses_are_public = (; + ignore = ( + :ODEIntegrator, :build_nlsolver, :default_controller, :get_EEst, + :isaposteriori, :markfirststage!, :nlsolve!, :nlsolve_f, + :nlsolvefail, :pois_rand, :set_EEst!, + ) + ), + ), ) From f1ede3303df18cbf833f9d324d01d190952bac7a Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 13:05:12 -0400 Subject: [PATCH 040/108] OrdinaryDiffEqDefault: minimize EI exceptions in QA Replace the blanket `ei_broken` over all four ExplicitImports checks with real fixes plus tight, documented per-name ignores: - Make implicit imports explicit (EnumX, Reexport, SciMLBase ODEProblem/ DAEProblem/solve) and remove genuinely-stale imports (Vern6/8/9, isdiag, trivial_limiter!, ODEIntegrator, OrdinaryDiffEqAlgorithm, OrdinaryDiffEqMutableCache, PIController, AutoForwardDiff, AbstractADType). - `no_implicit_imports` and `no_stale_explicit_imports` now pass via `allow_unanalyzable` for the `EnumX.@enumx` `DefaultSolverChoice` submodule; the five solver-name imports it shadows (Tsit5, Vern7, Rosenbrock23, Rodas5P, FBDF) are genuinely used by default_alg.jl and ignored only for the stale check. - Remaining ignores are OrdinaryDiffEqCore / SciMLBase internal (non-public) API with no public replacement (see #3776). QA group 16/16 pass on Julia 1.12 (SciMLBase 3.30, OrdinaryDiffEqCore 4.4.1, SciMLTesting 1.7.0, JET 0.11.5). Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqDefault.jl | 15 ++++---- lib/OrdinaryDiffEqDefault/test/qa/qa.jl | 35 ++++++++++++++++++- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/lib/OrdinaryDiffEqDefault/src/OrdinaryDiffEqDefault.jl b/lib/OrdinaryDiffEqDefault/src/OrdinaryDiffEqDefault.jl index 2c1a359791c..cfa66b61498 100644 --- a/lib/OrdinaryDiffEqDefault/src/OrdinaryDiffEqDefault.jl +++ b/lib/OrdinaryDiffEqDefault/src/OrdinaryDiffEqDefault.jl @@ -1,22 +1,21 @@ module OrdinaryDiffEqDefault using OrdinaryDiffEqCore: alg_stability_size, beta2_default, beta1_default, AutoSwitchCache, - ODEIntegrator, trivial_limiter!, PIController, - CompositeAlgorithm, OrdinaryDiffEqAlgorithm, - OrdinaryDiffEqMutableCache, AutoAlgSwitch -using OrdinaryDiffEqVerner: Vern7, Vern8, Vern9, Vern6 + CompositeAlgorithm, AutoAlgSwitch +using OrdinaryDiffEqVerner: Vern7 using OrdinaryDiffEqTsit5: Tsit5 using OrdinaryDiffEqRosenbrock: Rosenbrock23, Rodas5P using OrdinaryDiffEqBDF: FBDF, DFBDF import OrdinaryDiffEqCore import OrdinaryDiffEqCore: is_mass_matrix_alg, default_autoswitch, isdefaultalg -import ADTypes: AutoFiniteDiff, AutoForwardDiff, AbstractADType +import ADTypes: AutoFiniteDiff import LinearSolve -using LinearAlgebra: I, isdiag -using EnumX +using LinearAlgebra: I +using EnumX: EnumX -using Reexport +using Reexport: Reexport, @reexport +using SciMLBase: SciMLBase, ODEProblem, DAEProblem, solve @reexport using SciMLBase include("default_alg.jl") diff --git a/lib/OrdinaryDiffEqDefault/test/qa/qa.jl b/lib/OrdinaryDiffEqDefault/test/qa/qa.jl index 58d1d553d1b..4662987fc7d 100644 --- a/lib/OrdinaryDiffEqDefault/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqDefault/test/qa/qa.jl @@ -1,8 +1,41 @@ using SciMLTesting, OrdinaryDiffEqDefault, Test +# `DefaultSolverChoice` is an `EnumX.@enumx`-generated submodule that +# ExplicitImports cannot statically analyze. Its members (`Tsit5`, `Vern7`, +# `Rosenbrock23`, `Rodas5P`, `FBDF`, ...) share names with the solver types +# imported into `OrdinaryDiffEqDefault`, so the stale-import analysis +# mis-attributes those still-used imports as unused. +const ENUM_SUBMODULE = (OrdinaryDiffEqDefault.DefaultSolverChoice,) + run_qa( OrdinaryDiffEqDefault; aqua_kwargs = (; piracies = false), explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = (; + no_implicit_imports = (; allow_unanalyzable = ENUM_SUBMODULE), + no_stale_explicit_imports = (; + allow_unanalyzable = ENUM_SUBMODULE, + # Used by `default_alg.jl` (solver constructors) but mis-flagged + # stale because of the unanalyzable enum submodule above. + ignore = (:Tsit5, :Vern7, :Rosenbrock23, :Rodas5P, :FBDF), + ), + # OrdinaryDiffEqCore internal API the default-alg machinery depends on + # (no public replacement; see SciML/OrdinaryDiffEq.jl#3776). + all_explicit_imports_are_public = (; + ignore = ( + :AutoAlgSwitch, :AutoSwitchCache, :CompositeAlgorithm, + :alg_stability_size, :beta1_default, :beta2_default, + :default_autoswitch, :is_mass_matrix_alg, :isdefaultalg, + ), + ), + all_qualified_accesses_are_public = (; + ignore = ( + # SciMLBase specialization sentinels used only inside opt-in + # (default-off) precompile-workload branches. + :FunctionWrapperSpecialize, :NoSpecialize, + # OrdinaryDiffEqCore precompile test problems. + :lorenz, :lorenz_oop, + ), + ), + ), ) From ec5d18217a832d9ebadb21085b94348a479d8b3c Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 13:07:30 -0400 Subject: [PATCH 041/108] DelayDiffEq: minimize EI exceptions in QA Eliminate the all_explicit_imports_via_owners ei_broken by importing each name from its owner: initialize! is already imported from DiffEqBase (its owner) so drop the duplicate OrdinaryDiffEqCore import, and import the now SciMLBase-public is_diagonal_noise from SciMLBase instead of DiffEqBase. Drop the now-unnecessary no_implicit_imports @reexport ignore and the no_stale_explicit_imports (:AbstractVerbositySpecifier, :Standard) ignores (both checks pass clean against the resolved releases). Replace the blanket all_qualified_accesses_are_public / all_explicit_imports_are_public ei_broken with tight, documented, per-source ignore lists naming exactly the OrdinaryDiffEq*/SciMLBase/DiffEqBase/ForwardDiff internals DelayDiffEq legitimately reaches into; each is a make-public candidate tracked in SciML/OrdinaryDiffEq.jl#3776. Co-Authored-By: Chris Rackauckas --- lib/DelayDiffEq/src/DelayDiffEq.jl | 5 +- lib/DelayDiffEq/test/qa/qa_tests.jl | 72 +++++++++++++++++++++++++---- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/lib/DelayDiffEq/src/DelayDiffEq.jl b/lib/DelayDiffEq/src/DelayDiffEq.jl index 8a3a7127f1d..aef37670f7b 100644 --- a/lib/DelayDiffEq/src/DelayDiffEq.jl +++ b/lib/DelayDiffEq/src/DelayDiffEq.jl @@ -30,14 +30,15 @@ import FastBroadcast: @.. using OrdinaryDiffEqNonlinearSolve: NLAnderson, NLFunctional using OrdinaryDiffEqCore: AbstractNLSolverCache, SlowConvergence, - alg_extrapolates, alg_maximum_order, initialize! + alg_extrapolates, alg_maximum_order using OrdinaryDiffEqCore: StochasticDiffEqAlgorithm, StochasticDiffEqRODEAlgorithm using OrdinaryDiffEqRosenbrock: RosenbrockMutableCache using OrdinaryDiffEqFunctionMap: FunctionMap # using OrdinaryDiffEqDifferentiation: resize_grad_config!, resize_jac_config! -using DiffEqBase: is_diagonal_noise, DEVerbosity +using SciMLBase: is_diagonal_noise +using DiffEqBase: DEVerbosity # Explicit imports for functions using OrdinaryDiffEqCore: AutoSwitch, CompositeAlgorithm diff --git a/lib/DelayDiffEq/test/qa/qa_tests.jl b/lib/DelayDiffEq/test/qa/qa_tests.jl index bd4632cc403..3e690d62adc 100644 --- a/lib/DelayDiffEq/test/qa/qa_tests.jl +++ b/lib/DelayDiffEq/test/qa/qa_tests.jl @@ -4,6 +4,67 @@ using OrdinaryDiffEqCore: OrdinaryDiffEqAlgorithm, StochasticDiffEqAlgorithm, StochasticDiffEqRODEAlgorithm, StochasticDiffEqConstantCache, StochasticDiffEqMutableCache +# Names that are non-public in their owning package on the registered releases +# resolved here (SciMLBase 3.30, OrdinaryDiffEqCore 4.4, DiffEqBase 7, etc.). +# DelayDiffEq builds a DDE integrator on top of the OrdinaryDiffEq solver +# internals, so it legitimately reaches into these internal stepping/cache/ +# discontinuity hooks. Each is a candidate for `public` declaration upstream +# (tracked in SciML/OrdinaryDiffEq.jl#3776); until then they are listed +# explicitly rather than hidden behind a blanket `ei_broken`. +const QUALIFIED_INTERNAL = ( + # SciMLBase internals (problem/function/solution interface, init plumbing) + :AbstractDDEFunction, :AbstractHistoryFunction, :AbstractSDDEFunction, + :AbstractSDEFunction, :DAEInitializationAlgorithm, + :get_save_idxs_and_saved_subsystem, :has_initializeprob, :last_step_failed, + :postamble!, :save_discretes_if_enabled!, :unwrap_cache, + # DiffEqBase internals + :calculate_residuals, :calculate_residuals!, :check_prob_alg_pairing, + :ODE_DEFAULT_UNSTABLE_CHECK, :prepare_alg, :prob2dtmin, :Stats, + # OrdinaryDiffEqCore internals (integrator stepping/cache/controller/discontinuity) + :AbstractNLSolver, :alg_adaptive_order, :alg_autodiff, :alg_cache, + :alg_difftype, :alg_extrapolates, :alg_maximum_order, :apply_step!, + :AutoSwitchCache, :_change_t_via_interpolation!, :concrete_jac, + :current_interpolant, :current_interpolant!, :DefaultCache, + :default_controller, :DEOptions, :determine_controller_datatype, + :first_discontinuity, :get_chunksize, :get_chunksize_int, + :get_differential_vars, :get_EEst, :get_fsalfirstlast, + :_get_next_step_tstop, :_get_tstop_target, :handle_callback_modifiers!, + :handle_discontinuities!, :handle_dt!, :handle_starting_time_discontinuity!, + :handle_tstop!, :has_discontinuity, :initialize_callbacks!, + :_initialize_dae!, :initialize_d_discontinuities, :initialize_saveat, + :initialize_tstops, :init_ith_default_cache, :InterpolationData, + :isautoswitch, :isdtchangeable, :isimplicit, :ismultistep, :_loopfooter!, + :loopfooter!, :loopheader!, :modify_dt_for_tstops!, :nlsolve_f, :NLStatus, + :_ode_addsteps!, :ode_addsteps!, :ode_determine_initdt, + :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqCompositeAlgorithm, :perform_step!, + :pop_discontinuity!, :_postamble!, :reinit_controller!, :resize_J_W!, + :resize_nlsolver!, :_savevalues!, :set_EEst!, :_set_tstop_flag!, + :setup_controller_cache, :shift_past_discontinuity!, :standardtag, + :update_uprev!, :uses_uprev, + # OrdinaryDiffEqNonlinearSolve internals (fixed-point solver hooks) + :anderson, :anderson!, :compute_step!, :initial_η, :nlsolve!, :nlsolvefail, + # OrdinaryDiffEqDifferentiation internals + :resize_grad_config!, :resize_jac_config!, + # ForwardDiff internal type used in discontinuity tracking + :Dual, +) + +# Explicit `using A: name` of names that are non-public in `A`. Same upstream +# make-public story as above (subset of the qualified names plus the abstract +# algorithm/cache supertypes DelayDiffEq subtypes and piracy-dispatches on). +const EXPLICIT_INTERNAL = ( + # SciMLBase + :AbstractDDEAlgorithm, :AbstractSDDEProblem, :ProblemSolverPairingError, + # OrdinaryDiffEqCore + :AbstractNLSolverCache, :alg_extrapolates, :alg_maximum_order, :AutoSwitch, + :CompositeAlgorithm, :SlowConvergence, :StochasticDiffEqAlgorithm, + :StochasticDiffEqRODEAlgorithm, + # OrdinaryDiffEqNonlinearSolve + :NLAnderson, :NLFunctional, + # OrdinaryDiffEqRosenbrock + :RosenbrockMutableCache, +) + run_qa( DelayDiffEq; aqua_kwargs = (; @@ -22,13 +83,8 @@ run_qa( ), explicit_imports = true, ei_kwargs = (; - no_implicit_imports = (; skip = (Base, Core), ignore = (Symbol("@reexport"),)), - no_stale_explicit_imports = (; ignore = (:AbstractVerbositySpecifier, :Standard)), - ), - # known-broken; see SciML/OrdinaryDiffEq.jl#3776 - ei_broken = ( - :all_explicit_imports_via_owners, - :all_qualified_accesses_are_public, - :all_explicit_imports_are_public, + no_implicit_imports = (; skip = (Base, Core)), + all_qualified_accesses_are_public = (; ignore = QUALIFIED_INTERNAL), + all_explicit_imports_are_public = (; ignore = EXPLICIT_INTERNAL), ), ) From 1d776150bb2d9165150ce5593be01de53626e9c6 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 13:21:22 -0400 Subject: [PATCH 042/108] OrdinaryDiffEqSDIRK: minimize EI exceptions (drop blanket ei_broken) Replace the blanket `ei_broken` over all six ExplicitImports checks with tight, documented per-name ignores plus genuine import cleanups: - Make implicit exported-name imports explicit (FastBroadcast/@.., MacroTools, MuladdMacro/@muladd, RecursiveArrayTools/recursivefill!, Reexport/@reexport, SciMLBase/ODEProblem, CommonSolve/solve). - Remove stale (unused) imports: @cache, OrdinaryDiffEqAlgorithm, OrdinaryDiffEqAdaptiveAlgorithm, UJacobianWrapper, _ad_chunksize_int, _ad_fdtype, _ode_interpolant, _ode_interpolant!, isfsal, uses_uprev. - Import names from their true owners so the *_via_owners checks pass: alg_order from SciMLBase; initialize!/calculate_residuals/calculate_residuals! from DiffEqBase; get_W/isnewton/set_new_W!/COEFFICIENT_MULTISTEP from OrdinaryDiffEqCore; _vec/_reshape/_unwrap_val from SciMLBase. Extended functions use `import`, called-only names use `using`. - Qualified-access cleanup: OrdinaryDiffEqCore.SciMLBase.addsteps! -> SciMLBase.addsteps! (addsteps! is public in SciMLBase). Residual ignores are all non-public internals of their owning packages with no public alternative yet (OrdinaryDiffEqCore / OrdinaryDiffEqNonlinearSolve / OrdinaryDiffEqDifferentiation internals, a few non-public SciMLBase/DiffEqBase names, and ConstructionBase.constructorof reached via SciMLBase's re-export). QA group passes 17/17 on Julia 1.12 (released SciMLTesting 1.7.0). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqSDIRK/Project.toml | 2 + .../src/OrdinaryDiffEqSDIRK.jl | 48 ++++++---- .../src/generic_imex_perform_step.jl | 88 +++++++++---------- lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl | 45 +++++++++- 4 files changed, 121 insertions(+), 62 deletions(-) diff --git a/lib/OrdinaryDiffEqSDIRK/Project.toml b/lib/OrdinaryDiffEqSDIRK/Project.toml index 07541490269..4c848307f80 100644 --- a/lib/OrdinaryDiffEqSDIRK/Project.toml +++ b/lib/OrdinaryDiffEqSDIRK/Project.toml @@ -5,6 +5,7 @@ version = "2.7.1" [deps] ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" @@ -52,6 +53,7 @@ PrecompileTools = "1.2.1, 1.3" Preferences = "1.5.0" julia = "1.10" ADTypes = "1.22.0" +CommonSolve = "0.2.4" RecursiveArrayTools = "4.2.0" OrdinaryDiffEqNonlinearSolve = "2" DiffEqBase = "7" diff --git a/lib/OrdinaryDiffEqSDIRK/src/OrdinaryDiffEqSDIRK.jl b/lib/OrdinaryDiffEqSDIRK/src/OrdinaryDiffEqSDIRK.jl index 51fe7334e99..7cbc0e174e6 100644 --- a/lib/OrdinaryDiffEqSDIRK/src/OrdinaryDiffEqSDIRK.jl +++ b/lib/OrdinaryDiffEqSDIRK/src/OrdinaryDiffEqSDIRK.jl @@ -1,33 +1,47 @@ module OrdinaryDiffEqSDIRK -import OrdinaryDiffEqCore: alg_order, calculate_residuals!, - initialize!, perform_step!, unwrap_alg, - calculate_residuals, alg_extrapolates, - OrdinaryDiffEqAlgorithm, +# These OrdinaryDiffEqCore functions are extended with SDIRK-specific methods, so +# they must be brought in with `import` (not `using`) to allow method definitions. +import OrdinaryDiffEqCore: perform_step!, + alg_extrapolates, + alg_cache, full_cache, + isesdirk, issplit, + ssp_coefficient, get_fsalfirstlast +# OrdinaryDiffEqCore names used (called/referenced) but not extended here. +using OrdinaryDiffEqCore: unwrap_alg, OrdinaryDiffEqMutableCache, OrdinaryDiffEqConstantCache, OrdinaryDiffEqNewtonAdaptiveAlgorithm, OrdinaryDiffEqNewtonAlgorithm, - OrdinaryDiffEqAdaptiveAlgorithm, CompiledFloats, uses_uprev, - alg_cache, _vec, _reshape, @cache, isfsal, full_cache, - constvalue, _unwrap_val, _ode_interpolant, - trivial_limiter!, _ode_interpolant!, - isesdirk, issplit, - ssp_coefficient, get_fsalfirstlast, generic_solver_docstring, - _ad_chunksize_int, _ad_fdtype, _fixup_ad, current_extrapolant!, Predictor + CompiledFloats, + constvalue, + trivial_limiter!, + generic_solver_docstring, + _fixup_ad, current_extrapolant!, Predictor, + isnewton, get_W, set_new_W!, COEFFICIENT_MULTISTEP export Predictor using TruncatedStacktraces: @truncate_stacktrace -using MuladdMacro, MacroTools, FastBroadcast, RecursiveArrayTools -using SciMLBase: SplitFunction +using MuladdMacro: MuladdMacro, @muladd +using MacroTools: MacroTools +using FastBroadcast: FastBroadcast, @.. +using RecursiveArrayTools: RecursiveArrayTools, recursivefill! +# `alg_order` is owned by SciMLBase and extended here, so it needs `import`. +import SciMLBase: alg_order +using SciMLBase: SciMLBase, SplitFunction, ODEProblem, _vec, _reshape, _unwrap_val +# `initialize!` is owned by DiffEqBase and extended here, so it needs `import`; +# `calculate_residuals`/`calculate_residuals!` are only called. +import DiffEqBase: initialize! +using DiffEqBase: calculate_residuals, calculate_residuals! using LinearAlgebra: mul!, I import OrdinaryDiffEqCore -using OrdinaryDiffEqDifferentiation: UJacobianWrapper, dolinsolve +using OrdinaryDiffEqDifferentiation: dolinsolve using OrdinaryDiffEqNonlinearSolve: du_alias_or_new, markfirststage!, build_nlsolver, - nlsolve!, nlsolvefail, isnewton, get_W, set_new_W!, - NLNewton, COEFFICIENT_MULTISTEP + nlsolve!, nlsolvefail, + NLNewton import ADTypes: AutoForwardDiff +using CommonSolve: solve -using Reexport +using Reexport: Reexport, @reexport @reexport using SciMLBase include("algorithms.jl") diff --git a/lib/OrdinaryDiffEqSDIRK/src/generic_imex_perform_step.jl b/lib/OrdinaryDiffEqSDIRK/src/generic_imex_perform_step.jl index efea5b9c948..6c044073a6d 100644 --- a/lib/OrdinaryDiffEqSDIRK/src/generic_imex_perform_step.jl +++ b/lib/OrdinaryDiffEqSDIRK/src/generic_imex_perform_step.jl @@ -146,7 +146,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) fill!(zs[2], zero(eltype(u))) elseif predictor == Predictor.MaxOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[2] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -163,7 +163,7 @@ end end @.. broadcast = false zs[2] = (zs[2] - tmp) * inv(γ) elseif predictor == Predictor.CutoffOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[2] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -180,7 +180,7 @@ end end @.. broadcast = false zs[2] = (zs[2] - tmp) * inv(γ) elseif predictor == Predictor.VariableOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[2] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -238,7 +238,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) fill!(zs[3], zero(eltype(u))) elseif predictor == Predictor.MaxOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[3] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -255,7 +255,7 @@ end end @.. broadcast = false zs[3] = (zs[3] - tmp) * inv(γ) elseif predictor == Predictor.CutoffOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[3] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -272,7 +272,7 @@ end end @.. broadcast = false zs[3] = (zs[3] - tmp) * inv(γ) elseif predictor == Predictor.VariableOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[3] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -328,7 +328,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) fill!(zs[4], zero(eltype(u))) elseif predictor == Predictor.MaxOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[4] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -345,7 +345,7 @@ end end @.. broadcast = false zs[4] = (zs[4] - tmp) * inv(γ) elseif predictor == Predictor.CutoffOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[4] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -362,7 +362,7 @@ end end @.. broadcast = false zs[4] = (zs[4] - tmp) * inv(γ) elseif predictor == Predictor.VariableOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[4] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -419,7 +419,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) fill!(zs[5], zero(eltype(u))) elseif predictor == Predictor.MaxOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[5] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -436,7 +436,7 @@ end end @.. broadcast = false zs[5] = (zs[5] - tmp) * inv(γ) elseif predictor == Predictor.CutoffOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[5] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -453,7 +453,7 @@ end end @.. broadcast = false zs[5] = (zs[5] - tmp) * inv(γ) elseif predictor == Predictor.VariableOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[5] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -511,7 +511,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) fill!(zs[6], zero(eltype(u))) elseif predictor == Predictor.MaxOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[6] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -528,7 +528,7 @@ end end @.. broadcast = false zs[6] = (zs[6] - tmp) * inv(γ) elseif predictor == Predictor.CutoffOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[6] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -545,7 +545,7 @@ end end @.. broadcast = false zs[6] = (zs[6] - tmp) * inv(γ) elseif predictor == Predictor.VariableOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[6] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -604,7 +604,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) fill!(zs[7], zero(eltype(u))) elseif predictor == Predictor.MaxOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[7] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -621,7 +621,7 @@ end end @.. broadcast = false zs[7] = (zs[7] - tmp) * inv(γ) elseif predictor == Predictor.CutoffOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[7] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -638,7 +638,7 @@ end end @.. broadcast = false zs[7] = (zs[7] - tmp) * inv(γ) elseif predictor == Predictor.VariableOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[7] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -698,7 +698,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) fill!(zs[8], zero(eltype(u))) elseif predictor == Predictor.MaxOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[8] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -715,7 +715,7 @@ end end @.. broadcast = false zs[8] = (zs[8] - tmp) * inv(γ) elseif predictor == Predictor.CutoffOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[8] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -732,7 +732,7 @@ end end @.. broadcast = false zs[8] = (zs[8] - tmp) * inv(γ) elseif predictor == Predictor.VariableOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[8] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -793,7 +793,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) fill!(zs[9], zero(eltype(u))) elseif predictor == Predictor.MaxOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[9] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -810,7 +810,7 @@ end end @.. broadcast = false zs[9] = (zs[9] - tmp) * inv(γ) elseif predictor == Predictor.CutoffOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[9] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -827,7 +827,7 @@ end end @.. broadcast = false zs[9] = (zs[9] - tmp) * inv(γ) elseif predictor == Predictor.VariableOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[9] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -889,7 +889,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) fill!(zs[10], zero(eltype(u))) elseif predictor == Predictor.MaxOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[10] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -906,7 +906,7 @@ end end @.. broadcast = false zs[10] = (zs[10] - tmp) * inv(γ) elseif predictor == Predictor.CutoffOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[10] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -923,7 +923,7 @@ end end @.. broadcast = false zs[10] = (zs[10] - tmp) * inv(γ) elseif predictor == Predictor.VariableOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[10] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -986,7 +986,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) fill!(zs[11], zero(eltype(u))) elseif predictor == Predictor.MaxOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[11] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -1003,7 +1003,7 @@ end end @.. broadcast = false zs[11] = (zs[11] - tmp) * inv(γ) elseif predictor == Predictor.CutoffOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[11] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -1020,7 +1020,7 @@ end end @.. broadcast = false zs[11] = (zs[11] - tmp) * inv(γ) elseif predictor == Predictor.VariableOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[11] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -1084,7 +1084,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) fill!(zs[12], zero(eltype(u))) elseif predictor == Predictor.MaxOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[12] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -1101,7 +1101,7 @@ end end @.. broadcast = false zs[12] = (zs[12] - tmp) * inv(γ) elseif predictor == Predictor.CutoffOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[12] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -1118,7 +1118,7 @@ end end @.. broadcast = false zs[12] = (zs[12] - tmp) * inv(γ) elseif predictor == Predictor.VariableOrder - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) if _uses_hermite_interp(alg) Θ_pred = (t + c[12] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev @@ -1419,7 +1419,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) z_guess = zero(u) elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) Θ_pred = (t + c[2] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev q_pred = predictor == Predictor.MaxOrder ? 3 : @@ -1487,7 +1487,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) z_guess = zero(u) elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) Θ_pred = (t + c[3] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev q_pred = predictor == Predictor.MaxOrder ? 3 : @@ -1552,7 +1552,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) z_guess = zero(u) elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) Θ_pred = (t + c[4] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev q_pred = predictor == Predictor.MaxOrder ? 3 : @@ -1617,7 +1617,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) z_guess = zero(u) elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) Θ_pred = (t + c[5] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev q_pred = predictor == Predictor.MaxOrder ? 3 : @@ -1682,7 +1682,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) z_guess = zero(u) elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) Θ_pred = (t + c[6] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev q_pred = predictor == Predictor.MaxOrder ? 3 : @@ -1747,7 +1747,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) z_guess = zero(u) elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) Θ_pred = (t + c[7] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev q_pred = predictor == Predictor.MaxOrder ? 3 : @@ -1812,7 +1812,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) z_guess = zero(u) elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) Θ_pred = (t + c[8] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev q_pred = predictor == Predictor.MaxOrder ? 3 : @@ -1877,7 +1877,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) z_guess = zero(u) elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) Θ_pred = (t + c[9] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev q_pred = predictor == Predictor.MaxOrder ? 3 : @@ -1942,7 +1942,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) z_guess = zero(u) elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) Θ_pred = (t + c[10] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev q_pred = predictor == Predictor.MaxOrder ? 3 : @@ -2007,7 +2007,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) z_guess = zero(u) elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) Θ_pred = (t + c[11] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev q_pred = predictor == Predictor.MaxOrder ? 3 : @@ -2072,7 +2072,7 @@ end elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) && (integrator.success_iter == 0 || integrator.reeval_fsal) z_guess = zero(u) elseif predictor in (Predictor.MaxOrder, Predictor.VariableOrder, Predictor.CutoffOrder) - OrdinaryDiffEqCore.SciMLBase.addsteps!(integrator) + SciMLBase.addsteps!(integrator) Θ_pred = (t + c[12] * dt - integrator.tprev) / (integrator.t - integrator.tprev) dtp_pred = integrator.t - integrator.tprev q_pred = predictor == Predictor.MaxOrder ? 3 : diff --git a/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl index 3e170f4ea79..17084c1408b 100644 --- a/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl @@ -1,7 +1,50 @@ using SciMLTesting, OrdinaryDiffEqSDIRK, Test +# The remaining ignores are all names that are genuinely non-public internals of +# the SDIRK solver stack (OrdinaryDiffEqCore / OrdinaryDiffEqNonlinearSolve / +# OrdinaryDiffEqDifferentiation), plus a handful of non-public SciMLBase / +# DiffEqBase / ConstructionBase names with no public alternative. They are owned +# by the module they are imported/accessed from (so the *_via_owners checks pass); +# they are only flagged because those owners have not yet declared them `public`. +# Each will drop off once the owning package marks the corresponding name public. run_qa( OrdinaryDiffEqSDIRK; explicit_imports = true, - ei_broken = (:no_implicit_imports, :no_stale_explicit_imports, :all_explicit_imports_via_owners, :all_qualified_accesses_via_owners, :all_qualified_accesses_are_public, :all_explicit_imports_are_public), # known-broken; see SciML/OrdinaryDiffEq.jl#3776 + ei_kwargs = ( + # `constructorof` is owned by ConstructionBase (not a direct dep) and is + # reached through SciMLBase's re-export; it is the only non-owner access. + all_qualified_accesses_via_owners = (; ignore = (:constructorof,)), + all_qualified_accesses_are_public = (; + ignore = ( + # non-public in SciMLBase + :constructorof, :NoSpecialize, :FunctionWrapperSpecialize, + # non-public OrdinaryDiffEqCore internals + :increment_nf!, :set_EEst!, :get_EEst, :strip_cache, + :lorenz, :lorenz_oop, + )), + all_explicit_imports_are_public = (; + ignore = ( + # non-public SciMLBase internals + :_reshape, :_unwrap_val, :_vec, + # non-public DiffEqBase internals + :calculate_residuals, :calculate_residuals!, + # non-public TruncatedStacktraces macro + Symbol("@truncate_stacktrace"), + # non-public OrdinaryDiffEqCore internals + :CompiledFloats, :OrdinaryDiffEqConstantCache, + :OrdinaryDiffEqMutableCache, + :OrdinaryDiffEqNewtonAdaptiveAlgorithm, + :OrdinaryDiffEqNewtonAlgorithm, + :_fixup_ad, :alg_cache, :alg_extrapolates, :constvalue, + :current_extrapolant!, :generic_solver_docstring, + :get_fsalfirstlast, :isesdirk, :issplit, :perform_step!, + :ssp_coefficient, :trivial_limiter!, :unwrap_alg, + :COEFFICIENT_MULTISTEP, :get_W, :isnewton, :set_new_W!, + # non-public OrdinaryDiffEqNonlinearSolve internals + :NLNewton, :build_nlsolver, :du_alias_or_new, :markfirststage!, + :nlsolve!, :nlsolvefail, + # non-public OrdinaryDiffEqDifferentiation internals + :dolinsolve, + )), + ), ) From 9bb1400bedd467b33c26a384f3796091eceae471 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 14:30:47 -0400 Subject: [PATCH 043/108] DiffEqBase: declare curated solver-author extension API `public` Mark the DiffEqBase-owned, documented/intended solver-author extension API names `public` so downstream OrdinaryDiffEq sublibraries can drop their `DiffEqBase.X` non-public ExplicitImports ignores. Only the de-facto extension interface accessed by sibling solver packages is declared: residual hooks (calculate_residuals/!), algorithm/dt setup hooks (prepare_alg, prob2dtmin, timedepentdtmin, check_prob_alg_pairing, default_factorize, stripunits, ODE_DEFAULT_UNSTABLE_CHECK), tableau supertypes (Tableau, ODERKTableau), wrapper/tag types (EvalFunc, OrdinaryDiffEqTag), the convergence-testing entry type (ConvergenceSetup), and max_vector_callback_length_int. Bump patch version to 7.6.1. Co-Authored-By: Chris Rackauckas --- lib/DiffEqBase/Project.toml | 2 +- lib/DiffEqBase/src/DiffEqBase.jl | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/DiffEqBase/Project.toml b/lib/DiffEqBase/Project.toml index a3eea73ae63..d38d103f282 100644 --- a/lib/DiffEqBase/Project.toml +++ b/lib/DiffEqBase/Project.toml @@ -1,7 +1,7 @@ name = "DiffEqBase" uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" authors = ["Chris Rackauckas "] -version = "7.6.0" +version = "7.6.1" [deps] ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" diff --git a/lib/DiffEqBase/src/DiffEqBase.jl b/lib/DiffEqBase/src/DiffEqBase.jl index d4d96804055..cfe597da37c 100644 --- a/lib/DiffEqBase/src/DiffEqBase.jl +++ b/lib/DiffEqBase/src/DiffEqBase.jl @@ -192,9 +192,19 @@ export SensitivityADPassThrough # Callback API (DiffEqBase-owned shared functionality used by downstream solvers) :apply_callback!, :apply_discrete_callback!, :CallbackCache, :find_first_continuous_callback, :find_callback_time, - :max_vector_callback_length, :get_condition, + :max_vector_callback_length, :max_vector_callback_length_int, :get_condition, # Default-callback API (integrator defaults overridable via solver keywords) - :ODE_DEFAULT_NORM, :ODE_DEFAULT_ISOUTOFDOMAIN, :ODE_DEFAULT_PROG_MESSAGE + :ODE_DEFAULT_NORM, :ODE_DEFAULT_ISOUTOFDOMAIN, :ODE_DEFAULT_PROG_MESSAGE, + :ODE_DEFAULT_UNSTABLE_CHECK, + # Tableau extension supertypes downstream tableau packages subtype + :Tableau, :ODERKTableau, + # Error-estimate residual hooks solvers call/extend + :calculate_residuals, :calculate_residuals!, + # Algorithm/dt setup hooks solvers specialize + :prepare_alg, :prob2dtmin, :timedepentdtmin, :check_prob_alg_pairing, + :default_factorize, :stripunits, + # Solver-author wrapper/tag types and convergence-testing entry type + :EvalFunc, :OrdinaryDiffEqTag, :ConvergenceSetup ) ) end From 9f5bfc8aabb67bf8a1d3200edeb978d0d6435e98 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 14:32:06 -0400 Subject: [PATCH 044/108] Declare OrdinaryDiffEqNonlinearSolve solver-author extension API public MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Curated `public` declarations for the documented nonlinear-solver extension interface (algorithm types NLNewton/NLFunctional/NLAnderson, build_nlsolver, and the stepping/status/Anderson hooks nlsolve!/nlsolvefail/compute_step!/ initial_η/markfirststage!/du_alias_or_new/anderson/anderson!) that downstream solver sublibs and DelayDiffEq legitimately construct and extend. Gated to Julia >= 1.11.0-DEV.469 to keep the 1.10 floor parsing. Private codegen/perf internals are intentionally left non-public. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqNonlinearSolve/Project.toml | 2 +- .../src/OrdinaryDiffEqNonlinearSolve.jl | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/OrdinaryDiffEqNonlinearSolve/Project.toml b/lib/OrdinaryDiffEqNonlinearSolve/Project.toml index 878f93c6aa0..8f44b6f56d0 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/Project.toml +++ b/lib/OrdinaryDiffEqNonlinearSolve/Project.toml @@ -1,7 +1,7 @@ name = "OrdinaryDiffEqNonlinearSolve" uuid = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8" authors = ["Chris Rackauckas ", "Yingbo Ma "] -version = "2.0.1" +version = "2.0.2" [deps] NonlinearSolve = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" diff --git a/lib/OrdinaryDiffEqNonlinearSolve/src/OrdinaryDiffEqNonlinearSolve.jl b/lib/OrdinaryDiffEqNonlinearSolve/src/OrdinaryDiffEqNonlinearSolve.jl index 9aa58167f83..a96bfd9b1a5 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/src/OrdinaryDiffEqNonlinearSolve.jl +++ b/lib/OrdinaryDiffEqNonlinearSolve/src/OrdinaryDiffEqNonlinearSolve.jl @@ -68,4 +68,28 @@ include("initialize_dae.jl") export BrownFullBasicInit, ShampineCollocationInit +# Declare the documented solver-author extension API `public` so downstream solver +# packages (the OrdinaryDiffEq solver sublibs, DelayDiffEq's fixed-point solver, etc.) +# can drop their `OrdinaryDiffEqNonlinearSolve.X` non-public ExplicitImports ignores. +# These are the nonlinear-solver algorithm types and the stepping/build hooks that +# downstream packages legitimately construct and extend. The `public` keyword is only +# parseable on Julia >= 1.11.0-DEV.469, so it is gated to keep the 1.10 floor parsing. +# Pure internal codegen/perf helpers are intentionally left non-public. +@static if VERSION >= v"1.11.0-DEV.469" + eval( + Expr( + :public, + # Nonlinear-solver algorithm types + :NLNewton, :NLFunctional, :NLAnderson, + # Solver construction + :build_nlsolver, + # Stepping / status hooks extended and called by downstream solvers + :nlsolve!, :nlsolvefail, :compute_step!, :initial_η, + :markfirststage!, :du_alias_or_new, + # Anderson-acceleration kernels (DelayDiffEq fixed-point solver reuses these) + :anderson, :anderson! + ) + ) +end + end From 038909ba6f3e909d3fca3600738c188885952126 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 14:35:04 -0400 Subject: [PATCH 045/108] OrdinaryDiffEqDifferentiation: declare solver-author extension API public Mark the documented Jacobian/W-matrix and differentiation-config hooks that downstream OrdinaryDiffEq solver sublibraries access as `public`, so they are no longer flagged as non-public accesses in the ExplicitImports QA sweep. Codegen/perf internals remain non-public. Bump to 3.2.2. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqDifferentiation/Project.toml | 2 +- .../src/OrdinaryDiffEqDifferentiation.jl | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/OrdinaryDiffEqDifferentiation/Project.toml b/lib/OrdinaryDiffEqDifferentiation/Project.toml index ed1b9c46f9d..a35ea8030b9 100644 --- a/lib/OrdinaryDiffEqDifferentiation/Project.toml +++ b/lib/OrdinaryDiffEqDifferentiation/Project.toml @@ -1,5 +1,5 @@ name = "OrdinaryDiffEqDifferentiation" -version = "3.2.1" +version = "3.2.2" uuid = "4302a76b-040a-498a-8c04-15b101fed76b" authors = ["Chris Rackauckas ", "Yingbo Ma "] diff --git a/lib/OrdinaryDiffEqDifferentiation/src/OrdinaryDiffEqDifferentiation.jl b/lib/OrdinaryDiffEqDifferentiation/src/OrdinaryDiffEqDifferentiation.jl index 61fcd696ca7..96263bc1dcb 100644 --- a/lib/OrdinaryDiffEqDifferentiation/src/OrdinaryDiffEqDifferentiation.jl +++ b/lib/OrdinaryDiffEqDifferentiation/src/OrdinaryDiffEqDifferentiation.jl @@ -76,4 +76,17 @@ include("derivative_utils.jl") include("derivative_wrappers.jl") include("operators.jl") +# Documented solver-author extension API: the Jacobian/W-matrix and +# differentiation-config hooks that downstream OrdinaryDiffEq solver sublibraries +# build on. Codegen/perf internals are intentionally left non-public. +@static if VERSION >= v"1.11.0-DEV.469" + eval(Expr(:public, + :build_J_W, :build_grad_config, :build_jac_config, :build_uf, + :calc_J, :calc_J!, :calc_tderivative, :calc_tderivative!, + :calc_rosenbrock_differentiation, :calc_rosenbrock_differentiation!, + :jacobian!, :jacobian2W!, :update_W!, + :resize_grad_config!, :resize_jac_config!, + :dolinsolve, :wrapprecs, :is_always_new, :islinearfunction, :issuccess_W)) +end + end From f5ef299895fb93f2ed71aeea6508862f984ba790 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 29 Jun 2026 14:35:18 -0400 Subject: [PATCH 046/108] Declare solver-author extension API public in OrdinaryDiffEqCore Mark the documented/intended extension-API surface (abstract algorithm/cache/ controller/nlsolver/integrator types, the extension hook functions, enum member values, the @cache cache-defining macro, and options/wrapper types) as public via an Expr(:public, ...) block. These are the names downstream OrdinaryDiffEq.jl / StochasticDiffEq.jl solver packages legitimately subtype, extend, or call, so ExplicitImports' public-API checks recognize them as the supported extension surface. Genuine codegen/perf macros (@fold / @threaded / @OnDemandTableauExtract / @swap!) and precompile-workload helpers are kept non-public. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqCore.jl | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl b/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl index b89af245935..c66bc5d0406 100644 --- a/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl +++ b/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl @@ -205,4 +205,44 @@ include("enzyme_rules.jl") include("precompilation_setup.jl") +# Solver-author extension API. These names are the documented/intended interface +# that downstream OrdinaryDiffEq.jl / StochasticDiffEq.jl solver packages subtype, +# extend, or call. They are made public (not exported) so that ExplicitImports' +# public-API checks recognize them as the supported extension surface. Genuine +# codegen/perf internals (@fold/@threaded/@OnDemandTableauExtract/@swap!) and +# precompile-workload helpers are deliberately NOT included here. +@static if VERSION >= v"1.11.0-DEV.469" + eval(Expr( + :public, + :AbstractController, :AbstractControllerCache, :AbstractNLSolver, :AbstractNLSolverAlgorithm, :AbstractNLSolverCache, :AbstractThreadingOption, + :accept_step_controller, :alg_adaptive_order, :alg_autodiff, :alg_cache, :alg_difftype, :alg_extrapolates, + :alg_maximum_order, :alg_stability_size, :AutoAlgSwitch, :AutoSwitch, :AutoSwitchCache, :BaseThreads, + :beta1_default, :beta2_default, Symbol("@cache"), :COEFFICIENT_MULTISTEP, :CommonControllerOptions, :CompositeAlgorithm, + :CompositeCache, :CompositeController, :CompositeControllerCache, :constvalue, :Convergence, :current_extrapolant, + :current_interpolant, :DAEAlgorithm, :default_autoswitch, :DefaultCache, :default_controller, :default_linear_interpolation, + :default_nlsolve, :DEOptions, :DIRK, :Divergence, :dt_required, :DummyController, + :DummyControllerCache, :explicit_rk_docstring, :ExponentialAlgorithm, :FastConvergence, :gamma_default, :generic_solver_docstring, + :get_current_adaptive_order, :get_current_alg_autodiff, :get_differential_vars, :get_EEst, :get_failfactor, :get_fsalfirstlast, + :get_gamma, :get_new_W_γdt_cutoff, :get_qmax, :get_qmax_first_step, :get_qmin, :get_qsteady_max, + :get_qsteady_min, :get_W, :GLM, :hermite_interpolant, :IController, :IControllerCache, + :ImplicitSecondOrderAlgorithm, :increment_accept!, :increment_nf!, :increment_reject!, :InterpolationData, :isautoswitch, + :is_composite_algorithm, :is_composite_cache, :is_constant_cache, :isdefaultalg, :isdtchangeable, :isfirstcall, + :isfirststage, :isfsal, :isimplicit, :isJcurrent, :is_mass_matrix_alg, :ismultistep, + :issplit, :isthreaded, :isWmethod, :MethodType, :NewtonAlgorithm, :nlsolve_f, + :NLStatus, :NORDSIECK_MULTISTEP, :_ode_addsteps!, :ode_addsteps!, :ODEIntegrator, :_ode_interpolant, + :OrdinaryDiffEqAdamsVarOrderVarStepAlgorithm, :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqAdaptiveExponentialAlgorithm, :OrdinaryDiffEqAdaptiveImplicitAlgorithm, :OrdinaryDiffEqAdaptiveImplicitSecondOrderAlgorithm, :OrdinaryDiffEqAdaptivePartitionedAlgorithm, + :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqCache, :OrdinaryDiffEqCompositeAlgorithm, :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqExponentialAlgorithm, :OrdinaryDiffEqImplicitAlgorithm, + :OrdinaryDiffEqImplicitSecondOrderAlgorithm, :OrdinaryDiffEqInterpolation, :OrdinaryDiffEqLinearExponentialAlgorithm, :OrdinaryDiffEqMutableCache, :OrdinaryDiffEqNewtonAdaptiveAlgorithm, :OrdinaryDiffEqNewtonAlgorithm, + :OrdinaryDiffEqPartitionedAlgorithm, :OrdinaryDiffEqRosenbrockAdaptiveAlgorithm, :OrdinaryDiffEqRosenbrockAlgorithm, :PartitionedAlgorithm, :perform_step!, :PIController, + :PIControllerCache, :PIDController, :PIDControllerCache, :PolyesterThreads, :post_newton_controller!, :PredictiveController, + :PredictiveControllerCache, :qmax_default, :qmin_default, :reinit_controller!, :resize_J_W!, :resize_nlsolver!, + :RosenbrockAlgorithm, :Sequential, :set_EEst!, :set_new_W!, :setup_controller_cache, :set_W_γdt!, + :SlowConvergence, :step_accept_controller!, :step_reject_controller!, :stepsize_controller!, :StochasticDiffEqAdaptiveAlgorithm, :StochasticDiffEqAlgorithm, + :StochasticDiffEqCache, :StochasticDiffEqCompositeAlgorithm, :StochasticDiffEqConstantCache, :StochasticDiffEqJumpAdaptiveAlgorithm, :StochasticDiffEqJumpAlgorithm, :StochasticDiffEqJumpDiffusionAdaptiveAlgorithm, + :StochasticDiffEqJumpDiffusionAlgorithm, :StochasticDiffEqJumpNewtonAdaptiveAlgorithm, :StochasticDiffEqJumpNewtonDiffusionAdaptiveAlgorithm, :StochasticDiffEqMutableCache, :StochasticDiffEqNewtonAdaptiveAlgorithm, :StochasticDiffEqNewtonAlgorithm, + :StochasticDiffEqRODEAdaptiveAlgorithm, :StochasticDiffEqRODEAlgorithm, :StochasticDiffEqRODECompositeAlgorithm, :strip_cache, :sync_controllers!, :TryAgain, + :unwrap_alg, :uses_uprev, :VerySlowConvergence, + )) +end + end From f25f10f24bff6aa2078b6b9292e5dcdabc1557eb Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 07:40:05 -0400 Subject: [PATCH 047/108] Re-clean OrdinaryDiffEqExplicitRK QA ExplicitImports ignore lists The base packages (OrdinaryDiffEqCore/DiffEqBase) now declare their solver-author API `public` on this branch, so the prior bloated ignore lists can be trimmed to the genuine residual (26 -> 7 entries). Dropped everything now public (alg_adaptive_order, perform_step!, alg_cache, unwrap_alg, isfsal, get_fsalfirstlast, the OrdinaryDiffEq* algorithm/cache supertypes, CompositeAlgorithm, _ode_interpolant, _ode_addsteps!, @cache, increment_nf!, set_EEst!, hermite_interpolant, calculate_residuals/calculate_residuals!). Kept only the still-non-public names: OrdinaryDiffEqCore internals not part of the make-public surface (DerivativeOrderNotPossibleError, _ode_interpolant!, interpolation_differential_vars, hermite_interpolant!) and genuine externals (@truncate_stacktrace, Base.Cartesian @nexprs/@nif). Develop DiffEqBase from lib/ in the QA env so the on-branch `public` decls (calculate_residuals et al.) are picked up during the EI check. Verified on Julia 1.12: run_qa EI 6/6 pass, 0 flagged. Co-Authored-By: Chris Rackauckas --- .../test/qa/Project.toml | 15 ++++++------ lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl | 24 ++++++------------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml b/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml index 45d610e28ef..a4da92f52b2 100644 --- a/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqExplicitRK/test/qa/Project.toml @@ -1,6 +1,7 @@ [deps] AllocCheck = "9b6a8646-10ed-4001-bbdc-1d2f46dfbb1a" Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqExplicitRK = "9286f039-9fbf-40e8-bf65-aa933bdc4db0" @@ -8,18 +9,18 @@ SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -[sources.OrdinaryDiffEqExplicitRK] -path = "../../" - -[sources.OrdinaryDiffEqCore] -path = "../../../OrdinaryDiffEqCore" +[sources] +DiffEqBase = {path = "../../../DiffEqBase"} +OrdinaryDiffEqCore = {path = "../../../OrdinaryDiffEqCore"} +OrdinaryDiffEqExplicitRK = {path = "../.."} [compat] AllocCheck = "0.2" Aqua = "0.8.11" +DiffEqBase = "6, 7" JET = "0.9, 0.11" -SciMLTesting = "1.7" -julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqExplicitRK = "2" SciMLBase = "3" +SciMLTesting = "1.7" +julia = "1.10" diff --git a/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl b/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl index ceaf2a66f52..3cb18cf17a1 100644 --- a/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl @@ -4,30 +4,20 @@ run_qa( OrdinaryDiffEqExplicitRK; explicit_imports = true, ei_kwargs = (; - # Names imported from OrdinaryDiffEqCore/DiffEqBase/TruncatedStacktraces that are - # genuinely internal (not exported, not `public`) in their owner module. These are - # the solver-internal extension points OrdinaryDiffEqExplicitRK must hook into; - # there is no public alternative. Tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. all_explicit_imports_are_public = (; ignore = ( - :alg_adaptive_order, :alg_stability_size, :alg_cache, :unwrap_alg, - :isfsal, :perform_step!, :get_fsalfirstlast, - :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqConstantCache, - :OrdinaryDiffEqMutableCache, :CompositeAlgorithm, - :DerivativeOrderNotPossibleError, - :_ode_interpolant, :_ode_interpolant!, :_ode_addsteps!, - Symbol("@cache"), - :calculate_residuals, :calculate_residuals!, + # OrdinaryDiffEqCore solver-internal names still kept non-public + # (the `!`/error variants were not part of the make-public surface). + :DerivativeOrderNotPossibleError, :_ode_interpolant!, + # TruncatedStacktraces-owned macro (external, not `public`). Symbol("@truncate_stacktrace"), ), ), - # Qualified accesses of solver-internal OrdinaryDiffEqCore names plus the Base - # cartesian-loop macros. None are public; no public alternative exists. all_qualified_accesses_are_public = (; ignore = ( - :increment_nf!, :set_EEst!, - :hermite_interpolant, :hermite_interpolant!, - :interpolation_differential_vars, + # OrdinaryDiffEqCore solver-internal interpolation hooks kept non-public. + :interpolation_differential_vars, :hermite_interpolant!, + # Base.Cartesian codegen macros (external, not `public`). Symbol("@nexprs"), Symbol("@nif"), ), ), From 82c8ce50d3769cd0c879378849d85ac8cbc7d3a9 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:03:02 -0400 Subject: [PATCH 048/108] Re-clean OrdinaryDiffEqFeagin QA ExplicitImports ignore list Now that OrdinaryDiffEqCore and DiffEqBase declare their solver-author extension API public on this branch (PHASE A), drop every now-public name from the QA ExplicitImports ignore lists. The all_qualified_accesses ignore is emptied entirely (increment_nf!/set_EEst! are now public), and the all_explicit_imports ignore keeps only the three genuinely owner- internal names: CompiledFloats/trivial_limiter! (OrdinaryDiffEqCore) and @tight_loop_macros (DiffEqBase). Source DiffEqBase from the in-repo lib copy so its on-branch public decls are honored. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqFeagin/test/qa/Project.toml | 5 +++++ lib/OrdinaryDiffEqFeagin/test/qa/qa.jl | 15 ++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml b/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml index a84e3092b0c..01fb780a9ca 100644 --- a/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqFeagin/test/qa/Project.toml @@ -1,6 +1,7 @@ [deps] AllocCheck = "9b6a8646-10ed-4001-bbdc-1d2f46dfbb1a" Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqFeagin = "101fe9f7-ebb6-4678-b671-3a81e7194747" @@ -8,6 +9,9 @@ SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +[sources.DiffEqBase] +path = "../../../DiffEqBase" + [sources.OrdinaryDiffEqCore] path = "../../../OrdinaryDiffEqCore" @@ -17,6 +21,7 @@ path = "../../" [compat] AllocCheck = "0.2" Aqua = "0.8.11" +DiffEqBase = "7" JET = "0.9, 0.11" SciMLTesting = "1.7" julia = "1.10" diff --git a/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl b/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl index 1e05b39aa81..13eac13824d 100644 --- a/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqFeagin/test/qa/qa.jl @@ -7,19 +7,12 @@ run_qa( # `@reexport using SciMLBase` deliberately re-exports SciMLBase's API # as part of this solver package's public surface. no_implicit_imports = (; ignore = (:SciMLBase,)), - # OrdinaryDiffEqCore solver-interface internals not declared `public`. - all_qualified_accesses_are_public = (; - ignore = (:increment_nf!, :set_EEst!)), - # Non-public solver-interface internals (OrdinaryDiffEqCore) and - # DiffEqBase residual/loop internals; not declared `public` upstream. all_explicit_imports_are_public = (; ignore = ( - Symbol("@cache"), Symbol("@tight_loop_macros"), - :CompiledFloats, :OrdinaryDiffEqAdaptiveAlgorithm, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - :alg_cache, :calculate_residuals, :calculate_residuals!, - :constvalue, :generic_solver_docstring, :get_fsalfirstlast, - :perform_step!, :trivial_limiter!, + # OrdinaryDiffEqCore-owned internals, deliberately not `public`. + :CompiledFloats, :trivial_limiter!, + # DiffEqBase-owned internal macro, deliberately not `public`. + Symbol("@tight_loop_macros"), )), ), ) From 9874f9c777913c9ebe42f55ae25971aa85f3b746 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:25:32 -0400 Subject: [PATCH 049/108] Re-clean OrdinaryDiffEqLowStorageRK QA ignore lists after public decls The solver-author API of OrdinaryDiffEqCore / DiffEqBase is now declared public on this branch, so the enumerated non-public ignores collapse to the genuine residual: OrdinaryDiffEqCore precompile probes (lorenz/lorenz_oop), its default no-op trivial_limiter!, and Base.Broadcast internals (Broadcasted/materialize!). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl | 24 ++++++-------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl b/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl index ebabf7a97eb..aec612cd9c0 100644 --- a/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqLowStorageRK/test/qa/qa.jl @@ -4,30 +4,20 @@ run_qa( OrdinaryDiffEqLowStorageRK; explicit_imports = true, ei_kwargs = ( - # All residual names below are non-public internals of their owning - # package. They are imported/accessed from their true owner; the only - # thing left is that those owners have not yet declared them `public`. - # See SciML/OrdinaryDiffEq.jl#3776. + # Every remaining name is a genuine non-public internal of its owner. The + # solver-author API of OrdinaryDiffEqCore / DiffEqBase is now declared + # `public`, so those ignores were dropped. all_qualified_accesses_are_public = (; ignore = ( - # OrdinaryDiffEqCore internal stats accessors / precompile probes - :increment_nf!, :set_EEst!, :lorenz, :lorenz_oop, - # SciMLBase specialization markers (used in @compile_workload) - :FunctionWrapperSpecialize, :NoSpecialize, + # OrdinaryDiffEqCore precompile-workload probes (owner-internal) + :lorenz, :lorenz_oop, # Base.Broadcast internals used in ArrayFuse copyto!/materialize! :Broadcasted, :materialize!, )), all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore solver-interface internals - Symbol("@cache"), :alg_cache, :perform_step!, :constvalue, - :trivial_limiter!, :get_fsalfirstlast, :explicit_rk_docstring, - :default_controller, :PIDController, :isfsal, :uses_uprev, - :full_cache, - :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqAdaptiveAlgorithm, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - # DiffEqBase residual-calculation internals - :calculate_residuals, :calculate_residuals!, + # OrdinaryDiffEqCore default no-op limiter (owner-internal) + :trivial_limiter!, )), ), ) From 320b8bc8f1534a4c180da7dd390ef012ec405108 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:28:44 -0400 Subject: [PATCH 050/108] Re-clean OrdinaryDiffEqFunctionMap QA ExplicitImports ignore lists Drop the now-redundant explicit ignores for solver-author API names that OrdinaryDiffEqCore / DiffEqBase now declare public on this branch. Keep only the genuine residual: three OrdinaryDiffEqCore solver-internal hooks not yet in the public-API declaration (_ode_interpolant!/isdiscretealg/isdiscretecache) and the two SciMLBase-owned non-public default-solve sentinels (DISCRETE_INPLACE_DEFAULT/DISCRETE_OUTOFPLACE_DEFAULT). Verified green: run_qa ExplicitImports 6/6 on Julia 1.12. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl b/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl index 1d5b85da69b..50eff28d8dc 100644 --- a/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl @@ -5,24 +5,14 @@ run_qa( aqua_kwargs = (; piracies = false), # piracy is needed for default-algorithm dispatch explicit_imports = true, ei_kwargs = (; - # Internal (non-public) names extended/dispatched from OrdinaryDiffEqCore. - # No public API exists for these solver-internal hooks; see SciML/OrdinaryDiffEq.jl#3776. + # OrdinaryDiffEqCore-owned solver-internal hooks that FunctionMap extends but + # that are not (yet) in OrdinaryDiffEqCore's public-API declaration. all_explicit_imports_are_public = (; - ignore = ( - :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqMutableCache, - :OrdinaryDiffEqConstantCache, :perform_step!, :unwrap_alg, - :alg_cache, Symbol("@cache"), :_ode_addsteps!, :_ode_interpolant, - :_ode_interpolant!, :get_fsalfirstlast, :isfsal, :beta1_default, - :beta2_default, :dt_required, :isdiscretecache, :isdiscretealg, - ), + ignore = (:_ode_interpolant!, :isdiscretealg, :isdiscretecache), ), - # increment_nf! is OrdinaryDiffEqCore-internal; EvalFunc is DiffEqBase-internal; - # DISCRETE_{IN,OUT}OFPLACE_DEFAULT are SciMLBase-owned but non-public. + # SciMLBase-owned default-solve sentinels; non-public in SciMLBase. all_qualified_accesses_are_public = (; - ignore = ( - :increment_nf!, :EvalFunc, - :DISCRETE_INPLACE_DEFAULT, :DISCRETE_OUTOFPLACE_DEFAULT, - ), + ignore = (:DISCRETE_INPLACE_DEFAULT, :DISCRETE_OUTOFPLACE_DEFAULT), ), ), ) From ccd08df3ed10f0799e7faa83363070838ae26cea Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:31:48 -0400 Subject: [PATCH 051/108] Re-clean OrdinaryDiffEqNordsieck QA ExplicitImports ignore lists Drop the now-public OrdinaryDiffEqCore solver-extension API names (and the DiffEqBase residual primitives) from the all_explicit_imports_are_public ignore list, since PHASE A declared them public on this branch. Only the genuine owner-internal residual remains: eight OrdinaryDiffEqCore names not in the public extension API and the two OrdinaryDiffEqTsit5 first-step caches. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl | 36 ++++++----------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl b/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl index 8d9ae212394..129418082ca 100644 --- a/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqNordsieck/test/qa/qa.jl @@ -9,37 +9,19 @@ run_qa( no_implicit_imports = (; ignore = (:SciMLBase, :Reexport, Symbol("@reexport")), ), - # A Nordsieck solver sublibrary necessarily extends and consumes the - # OrdinaryDiffEqCore solver interface (cache/algorithm abstract types, - # `alg_cache`/`perform_step!`/controller hooks, error-estimate accessors, - # docstring helper, interpolation primitives), plus the DiffEqBase - # `calculate_residuals`/`calculate_residuals!` residual primitives and the - # OrdinaryDiffEqTsit5 first-step cache types. None of these are declared - # `public`/exported by their owners yet; drop each entry as it is made - # public upstream (tracked in SciML/OrdinaryDiffEq.jl#3776). + # Genuine solver-author internals that their owners deliberately keep + # non-public. Everything OrdinaryDiffEqCore made public for the solver + # extension API has been dropped; drop each remaining entry once its + # owner marks it public upstream (tracked in SciML/OrdinaryDiffEq.jl#3776). all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore internal solver interface - :AbstractController, :AbstractControllerCache, - :OrdinaryDiffEqAdaptiveAlgorithm, - :OrdinaryDiffEqAdamsVarOrderVarStepAlgorithm, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - :alg_adaptive_order, :alg_cache, :perform_step!, - :stepsize_controller!, :step_accept_controller!, - :step_reject_controller!, :accept_step_controller, - :post_newton_controller!, :default_controller, - :setup_controller_cache, :CommonControllerOptions, - :resolve_basic, :_resolved_QT, - :get_current_alg_order, :get_current_adaptive_order, - :get_fsalfirstlast, :get_EEst, :set_EEst!, :increment_nf!, - :get_qmin, :get_qmax, :get_qsteady_min, :get_qsteady_max, - :qmin_default, :qmax_default, + # OrdinaryDiffEqCore internals (not in the public extension API) + :_resolved_QT, :resolve_basic, + :get_current_alg_order, :qsteady_min_default, :qsteady_max_default, - :generic_solver_docstring, :trivial_limiter!, :ode_interpolant, :ode_interpolant!, - # DiffEqBase residual primitives - :calculate_residuals, :calculate_residuals!, - # OrdinaryDiffEqTsit5 first-step caches + :trivial_limiter!, + # OrdinaryDiffEqTsit5 first-step caches (owner-internal) :Tsit5Cache, :Tsit5ConstantCache, ), ), From 0a62ff24544629a2f4816aee3943751117e2c1d4 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:32:19 -0400 Subject: [PATCH 052/108] Re-clean OrdinaryDiffEqPRK QA EI ignore list (PHASE B) Base packages now declare their solver-author API public on this branch (PHASE A), so the enumerated ignore list is stale. Drop the 11 names now public in OrdinaryDiffEqCore (@cache, alg_cache, constvalue, generic_solver_docstring, get_fsalfirstlast, isthreaded, OrdinaryDiffEqAlgorithm, OrdinaryDiffEqConstantCache, OrdinaryDiffEqMutableCache, perform_step!, unwrap_alg). Keep only the deliberately non-public codegen macro @threaded. run_qa EI verified green (17/17) on Julia 1.12. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqPRK/test/qa/qa.jl | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/lib/OrdinaryDiffEqPRK/test/qa/qa.jl b/lib/OrdinaryDiffEqPRK/test/qa/qa.jl index 9f8cb2eb070..a46221003bf 100644 --- a/lib/OrdinaryDiffEqPRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqPRK/test/qa/qa.jl @@ -4,25 +4,11 @@ run_qa( OrdinaryDiffEqPRK; explicit_imports = true, ei_kwargs = (; - # OrdinaryDiffEqCore solver-interface names imported from their owner - # module (OrdinaryDiffEqCore) but not yet declared `public`. These are - # the OrdinaryDiffEq internal extension/dispatch API; no public - # alternative exists on the registered releases. Tracked for - # make-public in SciML/OrdinaryDiffEq.jl#3776. all_explicit_imports_are_public = (; ignore = ( - Symbol("@cache"), + # OrdinaryDiffEqCore: deliberately non-public codegen macro + # (kept internal alongside @fold/@OnDemandTableauExtract/@swap!). Symbol("@threaded"), - :alg_cache, - :constvalue, - :generic_solver_docstring, - :get_fsalfirstlast, - :isthreaded, - :OrdinaryDiffEqAlgorithm, - :OrdinaryDiffEqConstantCache, - :OrdinaryDiffEqMutableCache, - :perform_step!, - :unwrap_alg, ), ), ), From 878fcc6cab33db93c0eb275f31f9b52ae4dc2139 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:33:12 -0400 Subject: [PATCH 053/108] Re-clean OrdinaryDiffEqLowOrderRK QA ExplicitImports ignore lists PHASE A declared the OrdinaryDiffEqCore / DiffEqBase solver-author extension API `public` on this branch, so the prior bloated ignore lists no longer match what ExplicitImports flags. Drop every now-public name and keep only the genuine residual (11 -> 1 qualified + 10 explicit): - has_lazy_interpolation (SciMLBase, qualified access) - OrdinaryDiffEqCore owner-internal names deliberately not made public: @fold, @OnDemandTableauExtract codegen macros plus CompiledFloats, DerivativeOrderNotPossibleError, _ode_interpolant!, ssp_coefficient, trivial_limiter! - DiffEqBase @tight_loop_macros (private loop macro) - SciMLBase @def, _unwrap_val internals Verified on Julia 1.12 with the on-branch lib/* sources developed via [sources]: run_qa ExplicitImports checks 6/6 pass, 0 fail/error/broken. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl | 39 ++++++++-------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl b/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl index 43a3d011a49..7c6f85946f1 100644 --- a/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqLowOrderRK/test/qa/qa.jl @@ -4,40 +4,27 @@ run_qa( OrdinaryDiffEqLowOrderRK; explicit_imports = true, ei_kwargs = (; - # Solver-internal names with no public alternative: OrdinaryDiffEqCore's - # increment_nf!/set_EEst! step-statistics mutators and SciMLBase's - # has_lazy_interpolation interpolation trait. Accessed via qualified - # owner module; none are public on the registered releases. + # SciMLBase's has_lazy_interpolation interpolation trait, accessed via its + # owner module. Not declared public on the registered SciMLBase release. all_qualified_accesses_are_public = (; ignore = ( :has_lazy_interpolation, # SciMLBase - :increment_nf!, # OrdinaryDiffEqCore - :set_EEst!, # OrdinaryDiffEqCore ), ), - # Core solver-interface names that are imported from their owner module - # but not yet declared `public`. These are the OrdinaryDiffEq internal - # extension/dispatch API (OrdinaryDiffEqCore), plus DiffEqBase residual - # helpers and SciMLBase internals (@def/_unwrap_val). No public - # alternative exists; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. + # Owner-internal names imported from their owning module but deliberately + # NOT declared `public`. OrdinaryDiffEqCore's public solver-author API is + # now declared public on this branch; the residual here is the codegen/perf + # macros and a few helpers/types that OrdinaryDiffEqCore keeps internal, + # DiffEqBase's private @tight_loop_macros, and SciMLBase internals. all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore - :accept_step_controller, :alg_cache, :alg_stability_size, - :AutoAlgSwitch, :beta1_default, :beta2_default, - Symbol("@cache"), :CompiledFloats, :CompositeAlgorithm, - :constvalue, :DerivativeOrderNotPossibleError, - :explicit_rk_docstring, Symbol("@fold"), - :generic_solver_docstring, :get_fsalfirstlast, :isfsal, - :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, + # OrdinaryDiffEqCore (owner-internal; not part of the public + # solver-author surface declared in OrdinaryDiffEqCore) + :CompiledFloats, :DerivativeOrderNotPossibleError, + Symbol("@fold"), :_ode_interpolant!, Symbol("@OnDemandTableauExtract"), - :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqAlgorithm, - :OrdinaryDiffEqConstantCache, - :OrdinaryDiffEqExponentialAlgorithm, - :OrdinaryDiffEqMutableCache, :perform_step!, :ssp_coefficient, - :trivial_limiter!, :unwrap_alg, - # DiffEqBase - :calculate_residuals, :calculate_residuals!, :prepare_alg, + :ssp_coefficient, :trivial_limiter!, + # DiffEqBase (private loop macro) Symbol("@tight_loop_macros"), # SciMLBase Symbol("@def"), :_unwrap_val, From bb0173152153aecc50410e26ac1a6fa24fa8566c Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:34:00 -0400 Subject: [PATCH 054/108] Re-clean OrdinaryDiffEqAdamsBashforthMoulton QA ignore lists after public-API decls PHASE A declared the OrdinaryDiffEqCore solver-author extension API public on this branch, so the enumerated ExplicitImports ignore lists here are now mostly stale. Drop every name that is now public (get_EEst/set_EEst!/increment_nf!, @cache/alg_cache/perform_step!/constvalue/get_fsalfirstlast/generic_solver_docstring/ default_controller/IController, the abstract algorithm types, the mutable/constant cache supertypes, and DiffEqBase calculate_residuals/!), keeping only the genuine residual: OrdinaryDiffEqLowOrderRK's BS3/RK4 starter-cache types and OrdinaryDiffEqCore's trivial_limiter! (all deliberately kept non-public). Verified on Julia 1.12 with the in-repo lib/* siblings developed via [sources]: QA group 17/17 pass, 0 fail/error/broken. Co-Authored-By: Chris Rackauckas --- .../test/qa/qa.jl | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl index 4aa09810661..c9719b75f9a 100644 --- a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl @@ -4,28 +4,13 @@ run_qa( OrdinaryDiffEqAdamsBashforthMoulton; explicit_imports = true, ei_kwargs = ( - # All residual names below are non-public internals of their owning - # package (OrdinaryDiffEqCore / DiffEqBase / OrdinaryDiffEqLowOrderRK). - # They are imported from their true owner; the only thing left is that - # those owners have not yet declared them `public`. See SciML/OrdinaryDiffEq.jl#3776. - all_qualified_accesses_are_public = (; - ignore = ( - # OrdinaryDiffEqCore internal stats/error-estimate accessors - :get_EEst, :set_EEst!, :increment_nf!, - )), all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore solver-interface internals - Symbol("@cache"), :alg_cache, :perform_step!, :constvalue, - :trivial_limiter!, :get_fsalfirstlast, :generic_solver_docstring, - :default_controller, :IController, - :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqAdaptiveAlgorithm, - :OrdinaryDiffEqAdamsVarOrderVarStepAlgorithm, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - # DiffEqBase residual-calculation internals - :calculate_residuals, :calculate_residuals!, - # OrdinaryDiffEqLowOrderRK starter-cache types + # OrdinaryDiffEqLowOrderRK starter-cache types (owner-internal; + # kept non-public — used only as the multistep bootstrap cache). :BS3Cache, :BS3ConstantCache, :RK4Cache, :RK4ConstantCache, + # OrdinaryDiffEqCore internal limiter hook (owner-internal). + :trivial_limiter!, )), ), ) From b4b2add5c2faac3baaa5bcffd126782cf1dfe77b Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:34:12 -0400 Subject: [PATCH 055/108] ImplicitDiscreteSolve: re-clean QA EI ignore lists after make-public Drop the 19 now-public OrdinaryDiffEqCore solver-author API names from the explicit-import and qualified-access ignore lists (declared public in this branch's OrdinaryDiffEqCore). Keep only the genuine residual: OrdinaryDiffEqCore internals still non-public (isdiscretecache/isdiscretealg/_initialize_dae!/ allows_null_u0/_resolved_QT/resolve_basic), NonlinearSolveBase solver internals (get_fu/get_u/not_terminated/update_from_termination_cache!/update_trace!), and SciMLBase.has_initializeprob. Co-Authored-By: Chris Rackauckas --- lib/ImplicitDiscreteSolve/test/qa/qa.jl | 28 ++++++++++--------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/lib/ImplicitDiscreteSolve/test/qa/qa.jl b/lib/ImplicitDiscreteSolve/test/qa/qa.jl index 1c3c8127cd9..4be9f2b49b0 100644 --- a/lib/ImplicitDiscreteSolve/test/qa/qa.jl +++ b/lib/ImplicitDiscreteSolve/test/qa/qa.jl @@ -5,29 +5,23 @@ run_qa( aqua_kwargs = (; piracies = false), explicit_imports = true, ei_kwargs = (; - # Non-public OrdinaryDiffEqCore internals we extend/dispatch on. These are - # the solver-interface generics and abstract types that OrdinaryDiffEqCore - # has not (yet) marked `public`; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. + # OrdinaryDiffEqCore solver-internal predicates/hooks that remain + # non-public: DAE-init entry point, discrete-cache/algorithm predicates, + # and null-u0 support flag. Not part of the make-public extension surface. all_explicit_imports_are_public = (; ignore = ( - :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqMutableCache, :alg_cache, - :get_fsalfirstlast, :isfsal, :perform_step!, :isdiscretecache, - :isdiscretealg, :beta2_default, :beta1_default, :dt_required, - :_initialize_dae!, :allows_null_u0, :AbstractController, - :AbstractControllerCache, + :isdiscretecache, :isdiscretealg, :_initialize_dae!, :allows_null_u0, ), ), - # Non-public names accessed by qualification: the OrdinaryDiffEqCore - # controller interface, NonlinearSolveBase solver internals, and - # SciMLBase.has_initializeprob. Same make-public tracking as above. all_qualified_accesses_are_public = (; ignore = ( - :CommonControllerOptions, :_resolved_QT, :accept_step_controller, - :default_controller, :resolve_basic, :setup_controller_cache, - :step_accept_controller!, :step_reject_controller!, - :stepsize_controller!, :sync_controllers!, - :get_fu, :get_u, :not_terminated, :update_from_termination_cache!, - :update_trace!, :has_initializeprob, + # OrdinaryDiffEqCore controller-resolution internals (non-public). + :_resolved_QT, :resolve_basic, + # NonlinearSolveBase solver internals (external, not public). + :get_fu, :get_u, :not_terminated, + :update_from_termination_cache!, :update_trace!, + # SciMLBase initialization-problem predicate (external, not public). + :has_initializeprob, ), ), ), From 79f5c1cac05387ec685a8f9a195d9715d7ebad40 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:34:15 -0400 Subject: [PATCH 056/108] Re-clean OrdinaryDiffEqCore QA EI ignore lists after public decls The solver-author extension API is now declared public on this branch for OrdinaryDiffEqCore and DiffEqBase, so their names no longer need explicit ExplicitImports ignore entries. Drop the 11 now-public names from the all_qualified_accesses_are_public and all_explicit_imports_are_public ignore lists, keeping only genuine residual: SciMLBase internals with no public replacement yet, externals (SciMLOperators/EnzymeCore/FastPower/ FunctionWrappers/TruncatedStacktraces/ConstructionBase), Base/Core internals, and the one remaining DiffEqBase internal (_process_verbose_param). Verified on Julia 1.12 against the on-branch lib/* sources: all 6 ExplicitImports checks pass with the tightened lists. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqCore/test/qa/qa.jl | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/lib/OrdinaryDiffEqCore/test/qa/qa.jl b/lib/OrdinaryDiffEqCore/test/qa/qa.jl index de307e1039b..ed26b1359e1 100644 --- a/lib/OrdinaryDiffEqCore/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqCore/test/qa/qa.jl @@ -32,23 +32,20 @@ run_qa( ignore = ( # Base / Core internals Symbol("@max_methods"), :Experimental, :Typeof, :promote_op, - # ConstructionBase via SciMLBase + # ConstructionBase (owned there, accessed via SciMLBase) :constructorof, # SciMLOperators internal :AbstractSciMLOperator, - # SciMLBase internals - :AbstractRODEProblem, :DECache, :FunctionWrapperSpecialize, - :NoSpecialize, :enable_interpolation_sensitivitymode, + # EnzymeCore / EnzymeCore.EnzymeRules internals + :EnzymeRules, :inactive_noinl, + # SciMLBase internals with no public replacement yet + :DECache, :enable_interpolation_sensitivitymode, :forwarddiff_chunksize, :get_root_indp, :get_save_idxs_and_saved_subsystem, :has_initializeprob, :has_lazy_interpolation, :late_binding_update_u0_p, :remaker_of, :save_discretes_if_enabled!, :save_final_discretes!, :strip_interpolation, :struct_as_namedtuple, :unitfulvalue, :unwrap_cache, :value, - # DiffEqBase internals - :max_vector_callback_length_int, :prepare_alg, :stripunits, - # EnzymeCore internals - :EnzymeRules, :inactive_noinl, ), ), # Internal (non-`public`) names imported from upstream packages. @@ -63,13 +60,11 @@ run_qa( # SciMLBase internals :SENSITIVITY_INTERP_MESSAGE, :_unwrap_val, :last_step_failed, :postamble!, - # DiffEqBase internals - :ODE_DEFAULT_UNSTABLE_CHECK, :_process_verbose_param, - :timedepentdtmin, + # DiffEqBase internal + :_process_verbose_param, # Non-public names re-exported for dependent sublibraries # (see `no_stale_explicit_imports` above). :_vec, :_reshape, :unwrap_cache, - :calculate_residuals, :calculate_residuals!, ), ), ), From 270ee8fadfbe3f58d38ae3b8ca4124e931989f99 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:34:38 -0400 Subject: [PATCH 057/108] Re-clean OrdinaryDiffEqHighOrderRK QA explicit-imports ignore lists Now that OrdinaryDiffEqCore and DiffEqBase declare their solver-author extension API public on this branch, drop every ignore entry that has become public. The residual is only the genuinely non-public names: - no_stale/are_public: @tight_loop_macros (DiffEqBase-internal codegen macro, still non-public upstream). - are_public: CompiledFloats, DerivativeOrderNotPossibleError, _ode_interpolant!, isdp8, trivial_limiter! (OrdinaryDiffEqCore internals deliberately kept non-public). all_qualified_accesses_are_public is dropped entirely (get_EEst, increment_nf!, set_EEst! are now public). Source the in-repo DiffEqBase in the QA env so the on-branch public declarations are picked up. Co-Authored-By: Chris Rackauckas --- .../test/qa/Project.toml | 14 ++++----- lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl | 29 +++++++------------ 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml b/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml index bd9ba59346c..f160d3c0bd9 100644 --- a/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqHighOrderRK/test/qa/Project.toml @@ -1,6 +1,7 @@ [deps] AllocCheck = "9b6a8646-10ed-4001-bbdc-1d2f46dfbb1a" Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqHighOrderRK = "d28bc4f8-55e1-4f49-af69-84c1a99f0f58" @@ -8,18 +9,17 @@ SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -[sources.OrdinaryDiffEqCore] -path = "../../../OrdinaryDiffEqCore" - -[sources.OrdinaryDiffEqHighOrderRK] -path = "../../" +[sources] +DiffEqBase = {path = "../../../DiffEqBase"} +OrdinaryDiffEqCore = {path = "../../../OrdinaryDiffEqCore"} +OrdinaryDiffEqHighOrderRK = {path = "../.."} [compat] AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.7" -julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqHighOrderRK = "2" SciMLBase = "3" +SciMLTesting = "1.7" +julia = "1.10" diff --git a/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl b/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl index f0ba06c1ca1..6f76f22209e 100644 --- a/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl @@ -8,28 +8,19 @@ run_qa( # necessarily brings the `SciMLBase`/`Reexport`/`@reexport` bindings in # implicitly, which there is no way to make explicit. no_implicit_imports = (ignore = (:SciMLBase, :Reexport, Symbol("@reexport")),), - # `@tight_loop_macros` is used throughout the perform_step/addsteps loops - # but ExplicitImports cannot see macro invocations nested inside the - # `@muladd`-expanded function bodies, so it is a false stale positive. + # `@tight_loop_macros` is used inside the `@muladd`-expanded perform_step/ + # addsteps bodies, which ExplicitImports cannot see, so it reads as a stale + # positive; it is a DiffEqBase-internal codegen macro (not public upstream). no_stale_explicit_imports = (ignore = (Symbol("@tight_loop_macros"),),), - # OrdinaryDiffEqCore-internal solver-statistics accessors; not yet - # declared public upstream (SciML/OrdinaryDiffEq.jl#3776). - all_qualified_accesses_are_public = ( - ignore = (:get_EEst, :increment_nf!, :set_EEst!), - ), - # Internal solver-extension API of OrdinaryDiffEqCore (and the - # `calculate_residuals`/`@tight_loop_macros` helpers of DiffEqBase) that - # is not yet declared public upstream (SciML/OrdinaryDiffEq.jl#3776). all_explicit_imports_are_public = ( ignore = ( - Symbol("@cache"), Symbol("@tight_loop_macros"), :CompiledFloats, - :DerivativeOrderNotPossibleError, :OrdinaryDiffEqAdaptiveAlgorithm, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, :alg_cache, - :beta1_default, :beta2_default, :calculate_residuals, - :calculate_residuals!, :constvalue, :explicit_rk_docstring, - :get_fsalfirstlast, :isdp8, :perform_step!, :qmax_default, - :qmin_default, :trivial_limiter!, :unwrap_alg, + # DiffEqBase-internal codegen macro (not declared public upstream). + Symbol("@tight_loop_macros"), + # OrdinaryDiffEqCore internals deliberately kept non-public: the + # precompile-float helper, the derivative-order error type, the + # mutating interpolant helper, and the DP8/limiter internals. + :CompiledFloats, :DerivativeOrderNotPossibleError, + :_ode_interpolant!, :isdp8, :trivial_limiter!, ), ), ), From 5d778f4cb9a77dccd3f54a1ae68369dde73993a8 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:34:21 -0400 Subject: [PATCH 058/108] Re-clean OrdinaryDiffEqLinear QA ignore list to genuine residual The OrdinaryDiffEqCore/DiffEqBase solver-author API is now declared public on this branch, so those names are dropped from the ExplicitImports ignore lists. Only three genuine non-public externals remain: AbstractSciMLOperator (SciMLOperators), _vec (SciMLBase), and alloc_mem (ExponentialUtilities). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqLinear/test/qa/qa.jl | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/lib/OrdinaryDiffEqLinear/test/qa/qa.jl b/lib/OrdinaryDiffEqLinear/test/qa/qa.jl index 3077bbd8fe4..30a24c023eb 100644 --- a/lib/OrdinaryDiffEqLinear/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqLinear/test/qa/qa.jl @@ -4,31 +4,21 @@ run_qa( OrdinaryDiffEqLinear; explicit_imports = true, ei_kwargs = (; - # All residual names below are non-public internals of upstream packages - # that have no public-API replacement yet; they are tightly listed (not - # blanket ei_broken) and feed the next make-public round (see SciML/OrdinaryDiffEq.jl#3776). + # Residual non-public names below have no public-API replacement yet. + # The OrdinaryDiffEqCore/DiffEqBase solver-author API is now declared + # public on this branch, so those names are no longer ignored here. all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore internal solver-interface API (no public surface yet) - Symbol("@cache"), :OrdinaryDiffEqAdaptiveAlgorithm, - :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqConstantCache, - :OrdinaryDiffEqLinearExponentialAlgorithm, :OrdinaryDiffEqMutableCache, - :alg_cache, :alg_extrapolates, :dt_required, :generic_solver_docstring, - :get_fsalfirstlast, :isdtchangeable, :perform_step!, :unwrap_alg, - # DiffEqBase internal (owner of calculate_residuals!), non-public - :calculate_residuals!, - # SciMLBase internal (owner of _vec), non-public - :_vec, # SciMLOperators internal abstract type, non-public :AbstractSciMLOperator, + # SciMLBase internal (owner of _vec), non-public + :_vec, ), ), all_qualified_accesses_are_public = (; ignore = ( - :alloc_mem, # ExponentialUtilities internal cache allocator - :increment_nf!, # OrdinaryDiffEqCore internal stats mutator - :set_EEst!, # OrdinaryDiffEqCore internal error-estimate setter - :prepare_alg, # DiffEqBase internal algorithm-preparation hook + # ExponentialUtilities internal cache allocator, non-public + :alloc_mem, ), ), ), From 338978b5e3848bfd7f94f9e49628288f7529c7dc Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:36:35 -0400 Subject: [PATCH 059/108] Re-clean OrdinaryDiffEqExtrapolation QA ExplicitImports ignore lists Now that the solver-author extension API is declared `public` in OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation / DiffEqBase on this branch, drop every ignore entry that is now recognized as public API. Only genuine owner-internal names (OrdinaryDiffEqCore @threaded codegen macro and a handful of perf/controller/docstring helpers) plus still-non-public SciMLBase reshaping helpers and Base.Threads/FastPower internals remain. Reduces the two public-API ignore lists from 62 to 14 entries; QA is green on Julia 1.12. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl | 43 ++++++------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl b/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl index 32bdd518cc6..1f0f25c41d7 100644 --- a/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl @@ -1,44 +1,29 @@ using SciMLTesting, OrdinaryDiffEqExtrapolation, Test -# The only remaining ExplicitImports exceptions are genuinely-internal (non-`public`) -# names of upstream SciML packages that have no public replacement yet. They are -# imported/accessed from their true owner module, so only the two public-API checks -# still flag them; everything else (implicit imports, stale imports, owner) is clean. -# Each name below is tracked for a future make-public pass; see SciML/OrdinaryDiffEq.jl#3776. +# After the solver-author extension API was declared `public` in OrdinaryDiffEqCore / +# OrdinaryDiffEqDifferentiation / DiffEqBase, the only remaining ExplicitImports +# public-API exceptions are the genuinely-internal names below that have no public +# replacement yet. They are imported/accessed from their true owner module, so only +# the two public-API checks flag them; everything else is clean. +# Each name is tracked for a future make-public pass; see SciML/OrdinaryDiffEq.jl#3776. run_qa( OrdinaryDiffEqExtrapolation; explicit_imports = true, ei_kwargs = (; all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore internals (solver/cache/controller interface) - Symbol("@cache"), Symbol("@threaded"), - :AbstractController, :AbstractControllerCache, :CompiledFloats, - :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqAdaptiveImplicitAlgorithm, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - :PIController, :PolyesterThreads, :_fixup_ad, :accept_step_controller, - :alg_cache, :alg_maximum_order, :beta1_default, :beta2_default, - :constvalue, :default_controller, :differentiation_rk_docstring, - :gamma_default, :generic_solver_docstring, :get_current_adaptive_order, - :get_current_alg_order, :get_fsalfirstlast, :get_qmax, :get_qmin, - :isthreaded, :perform_step!, :qmin_default, :reset_alg_dependent_opts!, - :setup_controller_cache, :step_accept_controller!, :step_reject_controller!, - :stepsize_controller!, :unwrap_alg, - # OrdinaryDiffEqDifferentiation internals (Jacobian/W construction) - :build_grad_config, :build_jac_config, :calc_J, :calc_J!, - :dolinsolve, :jacobian2W!, - # SciMLBase internals (derivative/jacobian wrappers, reshaping helpers) - :TimeDerivativeWrapper, :TimeGradientWrapper, :UDerivativeWrapper, - :UJacobianWrapper, :_reshape, :_unwrap_val, :_vec, - # DiffEqBase internals (residual/dt-floor helpers) - :calculate_residuals, :calculate_residuals!, :timedepentdtmin, + # OrdinaryDiffEqCore owner-internal (codegen macro + perf/docstring/order helpers) + Symbol("@threaded"), :CompiledFloats, :_fixup_ad, + :differentiation_rk_docstring, :get_current_alg_order, + :reset_alg_dependent_opts!, + # SciMLBase internals (reshaping / val-unwrap helpers) + :_reshape, :_unwrap_val, :_vec, ), ), all_qualified_accesses_are_public = (; ignore = ( - # OrdinaryDiffEqCore internals accessed via qualified `OrdinaryDiffEqCore.x` - :CommonControllerOptions, :_resolved_QT, :get_EEst, :increment_nf!, - :resolve_basic, :set_EEst!, :sync_controllers!, + # OrdinaryDiffEqCore owner-internal (controller QT resolution) + :_resolved_QT, :resolve_basic, # other upstream internals :fastpower, # FastPower :has_Wfact, # SciMLBase From 1ad25ba5f83c096d57682ff13894715daf983fb0 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:36:44 -0400 Subject: [PATCH 060/108] Re-clean OrdinaryDiffEqIMEXMultistep QA ExplicitImports ignore list Now that OrdinaryDiffEqCore / OrdinaryDiffEqNonlinearSolve / DiffEqBase declare their solver-author extension API public on this branch, drop every ignore-list entry that has become public and keep only the genuine residual. all_qualified_accesses_are_public: dropped entirely (`increment_nf!` is now public in OrdinaryDiffEqCore). all_explicit_imports_are_public: trimmed from 17 names to 2. The now-public OrdinaryDiffEqCore cache/algorithm/dispatch internals (OrdinaryDiffEqConstantCache, OrdinaryDiffEqMutableCache, OrdinaryDiffEqNewtonAlgorithm, @cache, alg_cache, perform_step!, get_fsalfirstlast, generic_solver_docstring, issplit) and the OrdinaryDiffEqNonlinearSolve nlsolver internals (NLNewton, build_nlsolver, markfirststage!, nlsolve!, nlsolvefail, du_alias_or_new) are dropped. Only two remain: `_fixup_ad` (OrdinaryDiffEqCore private autodiff-fixup helper, kept non-public in the public-API pass) and `_unwrap_val` (SciMLBase-internal). The QA env now develops the in-repo OrdinaryDiffEqDifferentiation / OrdinaryDiffEqNonlinearSolve / DiffEqBase via [sources] so the on-branch public declarations are picked up during the ExplicitImports analysis. Verified on Julia 1.12: run_qa Quality Assurance 17/17 pass, 0 fail/error/broken. Co-Authored-By: Chris Rackauckas --- .../test/qa/Project.toml | 18 +++++++++------- lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl | 21 +++++-------------- 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml index f24526a853a..773d04a5ddc 100644 --- a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/Project.toml @@ -1,25 +1,29 @@ [deps] AllocCheck = "9b6a8646-10ed-4001-bbdc-1d2f46dfbb1a" Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +OrdinaryDiffEqDifferentiation = "4302a76b-040a-498a-8c04-15b101fed76b" OrdinaryDiffEqIMEXMultistep = "9f002381-b378-40b7-97a6-27a27c83f129" +OrdinaryDiffEqNonlinearSolve = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -[sources.OrdinaryDiffEqCore] -path = "../../../OrdinaryDiffEqCore" - -[sources.OrdinaryDiffEqIMEXMultistep] -path = "../../" +[sources] +DiffEqBase = {path = "../../../DiffEqBase"} +OrdinaryDiffEqCore = {path = "../../../OrdinaryDiffEqCore"} +OrdinaryDiffEqDifferentiation = {path = "../../../OrdinaryDiffEqDifferentiation"} +OrdinaryDiffEqIMEXMultistep = {path = "../.."} +OrdinaryDiffEqNonlinearSolve = {path = "../../../OrdinaryDiffEqNonlinearSolve"} [compat] AllocCheck = "0.2" Aqua = "0.8.11" JET = "0.9, 0.11" -SciMLTesting = "1.7" -julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqIMEXMultistep = "2" SciMLBase = "3" +SciMLTesting = "1.7" +julia = "1.10" diff --git a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl index 519f3bfe72b..6d0681289cf 100644 --- a/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqIMEXMultistep/test/qa/qa.jl @@ -7,21 +7,10 @@ run_qa( # `@reexport using SciMLBase` brings the `SciMLBase` module name into scope # implicitly; this is the intended SciML re-export pattern, not a stray import. no_implicit_imports = (; ignore = (:SciMLBase,)), - # `OrdinaryDiffEqCore.increment_nf!` is a solver-internal stats helper that is - # not (yet) declared public in OrdinaryDiffEqCore. - all_qualified_accesses_are_public = (; ignore = (:increment_nf!,)), - # Solver-internal building blocks imported from their owning packages but not - # (yet) declared public there: OrdinaryDiffEqCore cache/algorithm/dispatch - # internals, OrdinaryDiffEqNonlinearSolve nlsolver internals, and the - # SciMLBase-internal `_unwrap_val`. - all_explicit_imports_are_public = (; - ignore = ( - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - :OrdinaryDiffEqNewtonAlgorithm, Symbol("@cache"), :alg_cache, - :perform_step!, :get_fsalfirstlast, :generic_solver_docstring, - :issplit, :_fixup_ad, :_unwrap_val, - :NLNewton, :build_nlsolver, :markfirststage!, :nlsolve!, - :nlsolvefail, :du_alias_or_new, - )), + # Solver-internal helpers imported from their owning packages but deliberately + # kept non-public there: + # OrdinaryDiffEqCore: `_fixup_ad` (autodiff-fixup private helper) + # SciMLBase: `_unwrap_val` + all_explicit_imports_are_public = (; ignore = (:_fixup_ad, :_unwrap_val)), ), ) From 32833a5065287cfde1785a13580948e51d3f12ef Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:37:51 -0400 Subject: [PATCH 061/108] OrdinaryDiffEqRKN: re-clean QA EI ignore list after PHASE A public decls Drop every OrdinaryDiffEqCore/DiffEqBase solver-author name now declared public on this branch (increment_nf!, set_EEst!, perform_step!, alg_cache, constvalue, generic_solver_docstring, get_fsalfirstlast, _ode_interpolant, the OrdinaryDiffEq*Algorithm/*Cache types, @cache, calculate_residuals[!]). Keep only the genuine residual: @def (SciMLBase), @tight_loop_macros (DiffEqBase), and CompiledFloats / _ode_interpolant! (OrdinaryDiffEqCore internals still deliberately non-public). Drops all_qualified_accesses ignores entirely (both now public); no ei_broken needed. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqRKN/test/qa/qa.jl | 34 +++++++++++------------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/lib/OrdinaryDiffEqRKN/test/qa/qa.jl b/lib/OrdinaryDiffEqRKN/test/qa/qa.jl index 0a47f20190e..c1164acf77a 100644 --- a/lib/OrdinaryDiffEqRKN/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqRKN/test/qa/qa.jl @@ -1,31 +1,23 @@ using SciMLTesting, OrdinaryDiffEqRKN, Test -# The only remaining EI exceptions are genuinely internal (non-public) names from -# the SciML solver stack that OrdinaryDiffEqRKN must extend/use but which have no -# public alias yet. They are owned by the modules they are imported/accessed from; -# the sole remaining issue is that those owners have not marked them `public`. -# See SciML/OrdinaryDiffEq.jl#3776 for the make-public tracking. run_qa( OrdinaryDiffEqRKN; explicit_imports = true, ei_kwargs = (; - # Qualified accesses of OrdinaryDiffEqCore internals (no public alias). - all_qualified_accesses_are_public = (; - ignore = (:increment_nf!, :set_EEst!),), - # Explicit imports of names that are owned by the importing module but - # not yet declared `public` there: OrdinaryDiffEqCore solver-extension - # internals, the DiffEqBase residual interface + @tight_loop_macros, and - # SciMLBase's @def. + # Genuine solver-author internals that their owners deliberately keep + # non-public. Everything OrdinaryDiffEqCore/DiffEqBase made public for the + # solver extension API has been dropped; drop each remaining entry once its + # owner marks it public upstream (tracked in SciML/OrdinaryDiffEq.jl#3776). all_explicit_imports_are_public = (; ignore = ( - Symbol("@cache"), :CompiledFloats, :OrdinaryDiffEqAlgorithm, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - :OrdinaryDiffEqAdaptivePartitionedAlgorithm, - :OrdinaryDiffEqPartitionedAlgorithm, :_ode_interpolant, - :_ode_interpolant!, :alg_cache, :alg_extrapolates, :constvalue, - :generic_solver_docstring, :get_fsalfirstlast, :perform_step!, - Symbol("@tight_loop_macros"), :calculate_residuals, - :calculate_residuals!, Symbol("@def"), - ),), + # SciMLBase codegen macro (owner keeps non-public) + Symbol("@def"), + # DiffEqBase perf macro (owner keeps non-public) + Symbol("@tight_loop_macros"), + # OrdinaryDiffEqCore internals not in the public extension API + # (the non-bang `_ode_interpolant` is public; the `!`-variant is not) + :CompiledFloats, :_ode_interpolant!, + ), + ), ), ) From d7b70aa810643e803aebeeadcc3b8663d09b6f97 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:38:18 -0400 Subject: [PATCH 062/108] Re-clean OrdinaryDiffEqBDF QA ExplicitImports ignore lists Now that OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation / OrdinaryDiffEqNonlinearSolve / DiffEqBase declare their solver-author extension API public on this branch, drop every now-public name from the BDF QA ignore lists. Only genuine owner-internal names remain: OrdinaryDiffEqCore internals not in the public extension API, the OrdinaryDiffEqSDIRK ESDIRK-IMEX caches/tableau, SciMLBase._unwrap_val, TruncatedStacktraces.@truncate_stacktrace, and the lorenz/lorenz_oop precompile-workload test fixtures. Verified run_qa EI green on Julia 1.12. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqBDF/test/qa/qa.jl | 69 +++++++++++------------------ 1 file changed, 27 insertions(+), 42 deletions(-) diff --git a/lib/OrdinaryDiffEqBDF/test/qa/qa.jl b/lib/OrdinaryDiffEqBDF/test/qa/qa.jl index 5e20ad76926..6f38b2e7df7 100644 --- a/lib/OrdinaryDiffEqBDF/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqBDF/test/qa/qa.jl @@ -1,50 +1,35 @@ using SciMLTesting, OrdinaryDiffEqBDF, Test -# The names below are internal (non-public) API of sibling solver sublibraries -# (OrdinaryDiffEqCore / OrdinaryDiffEqSDIRK / OrdinaryDiffEqNonlinearSolve) plus a -# handful of SciMLBase / DiffEqBase / TruncatedStacktraces internals that BDF must -# use to plug into the integrator framework. They are owned by those packages and -# have no public replacement, so they are imported/accessed from their owner and -# ignored here. Each becomes a candidate for a `public` declaration upstream; see -# SciML/OrdinaryDiffEq.jl#3776. -const QUALIFIED_NONPUBLIC = ( - :CompositeControllerCache, :accept_step_controller, :get_EEst, :increment_nf!, - :post_newton_controller!, :set_EEst!, :step_accept_controller!, - :step_reject_controller!, :stepsize_controller!, - :lorenz, :lorenz_oop, # precompile-workload test problems - :FunctionWrapperSpecialize, :NoSpecialize, # SciMLBase specialization markers -) - -const EXPLICIT_IMPORT_NONPUBLIC = ( - Symbol("@cache"), Symbol("@truncate_stacktrace"), - :AbstractController, :AbstractControllerCache, :CommonControllerOptions, - :DAEAlgorithm, :DerivativeOrderNotPossibleError, :IController, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - :OrdinaryDiffEqNewtonAdaptiveAlgorithm, :OrdinaryDiffEqNewtonAlgorithm, - :COEFFICIENT_MULTISTEP, :DIRK, - :ESDIRKIMEXCache, :ESDIRKIMEXConstantCache, :ImplicitEulerESDIRKIMEXTableau, - :NLNewton, :build_nlsolver, :du_alias_or_new, :markfirststage!, - :nlsolve!, :nlsolvefail, :isnewton, :set_new_W!, - :alg_cache, :alg_extrapolates, :constvalue, :default_controller, :error_constant, - :_fixup_ad, :gamma_default, :generic_solver_docstring, - :get_current_adaptive_order, :get_current_alg_order, :get_current_qmax, - :get_EEst, :get_failfactor, :get_fsalfirstlast, :get_gamma, :get_qmax, - :get_qsteady_max, :get_qsteady_min, :has_special_newton_error, - :has_stiff_interpolation, :isfsal, :issplit, - :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, - :perform_step!, :post_newton_controller!, :qmax_default, - :qsteady_max_default, :qsteady_min_default, :resolve_basic, :_resolved_QT, - :set_discontinuity, :setup_controller_cache, - :step_accept_controller!, :step_reject_controller!, :stepsize_controller!, - :trivial_limiter!, :unwrap_alg, :_unwrap_val, - :calculate_residuals, :calculate_residuals!, # DiffEqBase-owned, non-public -) - run_qa( OrdinaryDiffEqBDF; explicit_imports = true, ei_kwargs = ( - all_qualified_accesses_are_public = (; ignore = QUALIFIED_NONPUBLIC), - all_explicit_imports_are_public = (; ignore = EXPLICIT_IMPORT_NONPUBLIC), + # Precompile-workload test problems that live in OrdinaryDiffEqCore but are + # deliberately kept non-public (they are test fixtures, not solver-author API). + all_qualified_accesses_are_public = (; + ignore = (:lorenz, :lorenz_oop), + ), + # Genuine solver-author internals still kept non-public by their owners. + # Everything OrdinaryDiffEqCore made public for the solver extension API has + # been dropped; drop each remaining entry once its owner marks it public + # upstream (tracked in SciML/OrdinaryDiffEq.jl#3776). + all_explicit_imports_are_public = (; + ignore = ( + # OrdinaryDiffEqCore internals (not in the public extension API) + :DerivativeOrderNotPossibleError, :error_constant, + :get_current_alg_order, :get_current_qmax, + :has_special_newton_error, :has_stiff_interpolation, + :isnewton, :qsteady_min_default, :qsteady_max_default, + :resolve_basic, :_resolved_QT, :set_discontinuity, + :trivial_limiter!, :_ode_interpolant!, :_fixup_ad, + # OrdinaryDiffEqSDIRK ESDIRK-IMEX caches/tableau (owner-internal) + :ESDIRKIMEXCache, :ESDIRKIMEXConstantCache, + :ImplicitEulerESDIRKIMEXTableau, + # SciMLBase internal + :_unwrap_val, + # TruncatedStacktraces internal macro + Symbol("@truncate_stacktrace"), + ), + ), ), ) From 9281f6106179072791024622aee9afaa8f5c38ab Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:39:32 -0400 Subject: [PATCH 063/108] Re-clean OrdinaryDiffEqSymplecticRK QA ignore list post make-public The base OrdinaryDiffEqCore now declares its solver-author API public on this branch, so the previously-enumerated ignore list collapses to a single genuine residual: CompiledFloats (a Core-internal Union const, not public). Dropped the 11 now-public names and the whole all_qualified_accesses_are_public block (increment_nf! is now public). EI 6/6 green on Julia 1.12. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl | 25 ++++---------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl b/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl index 5ccd948a83a..c0ef6602d0e 100644 --- a/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl @@ -4,25 +4,10 @@ run_qa( OrdinaryDiffEqSymplecticRK; explicit_imports = true, ei_kwargs = (; - # OrdinaryDiffEqCore-internal (non-public) names the solver genuinely - # needs from Core; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. - all_explicit_imports_are_public = (; - ignore = ( - :perform_step!, - :OrdinaryDiffEqMutableCache, - :OrdinaryDiffEqConstantCache, - :OrdinaryDiffEqPartitionedAlgorithm, - :CompiledFloats, - :alg_cache, - Symbol("@cache"), - :constvalue, - :get_fsalfirstlast, - :generic_solver_docstring, - :default_linear_interpolation, - ), - ), - # `increment_nf!` is accessed as `OrdinaryDiffEqCore.increment_nf!`; - # non-public in Core, tracked for make-public in #3776. - all_qualified_accesses_are_public = (; ignore = (:increment_nf!,)), + # OrdinaryDiffEqCore-internal (non-public) name the solver genuinely + # needs; `CompiledFloats` is `const CompiledFloats = Union{Float32,Float64}`, + # not declared public in Core. Tracked for make-public in + # SciML/OrdinaryDiffEq.jl#3776. + all_explicit_imports_are_public = (; ignore = (:CompiledFloats,)), ), ) From 6b7a24e075b22a3dfa5618295292b4e01cfd757b Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:39:44 -0400 Subject: [PATCH 064/108] Trim OrdinaryDiffEqFIRK QA ignore list to genuine residual The OrdinaryDiffEqCore solver-author extension API is now declared public, so the previously-enumerated ignore entries for those names are redundant. Re-clean the ExplicitImports ignore list down to the genuine residual: OrdinaryDiffEqCore owner-internal names kept non-public (private codegen macro + framework internals), SciMLBase internal helpers/wrappers still pending public declaration, and genuine external deps (FastPower, SciMLOperators). The all_qualified_accesses_are_public ignore list is now empty (get_EEst/set_EEst!/increment_nf! are public) and is dropped. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqFIRK/test/qa/qa.jl | 48 ++++++++-------------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl index 567d4ba3f3e..1bd8fd82dcb 100644 --- a/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl @@ -4,43 +4,21 @@ run_qa( OrdinaryDiffEqFIRK; explicit_imports = true, ei_kwargs = ( - # These names are accessed/imported from their true owner module but are - # not (yet) declared `public`/exported there. They are internal solver-framework - # entry points of the OrdinaryDiffEq stack (and a few helper deps) that FIRK - # legitimately extends/uses; nothing here is fixable from this sublibrary. - # See SciML/OrdinaryDiffEq.jl#3776 for the make-public tracking. - all_qualified_accesses_are_public = (; - ignore = ( - # OrdinaryDiffEqCore internal integrator-stats / error-estimate API - :get_EEst, :set_EEst!, :increment_nf!, - ), - ), all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore internal solver-framework API - :unwrap_alg, :default_controller, :PredictiveController, :PIController, - :OrdinaryDiffEqNewtonAdaptiveAlgorithm, :OrdinaryDiffEqMutableCache, - :OrdinaryDiffEqConstantCache, :alg_cache, Symbol("@threaded"), - :isthreaded, :constvalue, :differentiation_rk_docstring, - :trivial_limiter!, :qmax_default, :alg_adaptive_order, - :step_accept_controller!, :step_reject_controller!, :alg_can_repeat_jac, - :NewtonAlgorithm, :get_current_adaptive_order, :get_fsalfirstlast, - :get_current_alg_order, :isfirk, :_fixup_ad, :perform_step!, - :LinearAliasSpecifier, :set_discontinuity, :get_current_qmax, - :PredictiveControllerCache, :_ode_interpolant, :_ode_interpolant!, - :_ode_addsteps!, :has_stiff_interpolation, - # OrdinaryDiffEqCore-owned convergence states / cutoff (re-exported by NonlinearSolve) - :Convergence, :FastConvergence, :NLStatus, :VerySlowConvergence, - :Divergence, :get_new_W_γdt_cutoff, - # SciMLBase internal helpers / wrappers - :_vec, :_reshape, :_unwrap_val, :UDerivativeWrapper, :UJacobianWrapper, - # DiffEqBase internal residual / value helpers - :calculate_residuals, :calculate_residuals!, :value, - # OrdinaryDiffEqDifferentiation internal Jacobian / linsolve API - :build_J_W, :build_jac_config, :calc_J!, :calc_J, :dolinsolve, - :islinearfunction, - # FastPower / SciMLOperators internal names - :fastpower, :AbstractSciMLOperator, + # OrdinaryDiffEqCore owner-internal names deliberately kept non-public + # (private codegen/perf macro + solver-framework internals not part of + # the declared extension surface). + Symbol("@threaded"), :_fixup_ad, :_ode_interpolant!, + :alg_can_repeat_jac, :differentiation_rk_docstring, + :get_current_alg_order, :get_current_qmax, + :has_stiff_interpolation, :isfirk, :set_discontinuity, + :trivial_limiter!, + # SciMLBase internal helpers / wrappers (pending SciMLBase#1412) + :_vec, :_reshape, :_unwrap_val, :value, + # Genuine external deps + :fastpower, # FastPower + :AbstractSciMLOperator, # SciMLOperators ), ), ), From 7a49176c36b3e9b77a97e2f61ac51058b09b4c5d Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:40:23 -0400 Subject: [PATCH 065/108] Re-clean OrdinaryDiffEqSSPRK QA ignore lists after public-API decls The solver-author API in OrdinaryDiffEqCore and DiffEqBase is now declared public on this branch, so most of the previously-enumerated non-public ignore entries are redundant. Trim the ExplicitImports ignore lists to only the genuine residual owner-internals (@def, _ode_interpolant!, ssp_coefficient, trivial_limiter!, lorenz, lorenz_oop) and develop the in-repo DiffEqBase so its public calculate_residuals decls are picked up. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml | 15 ++++---- lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl | 37 +++++++------------- 2 files changed, 21 insertions(+), 31 deletions(-) diff --git a/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml b/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml index 62450e6c9b3..2d4ad7d1e6a 100644 --- a/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqSSPRK/test/qa/Project.toml @@ -1,6 +1,7 @@ [deps] AllocCheck = "9b6a8646-10ed-4001-bbdc-1d2f46dfbb1a" Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqSSPRK = "669c94d9-1f4b-4b64-b377-1aa079aa2388" @@ -8,18 +9,18 @@ SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -[sources.OrdinaryDiffEqCore] -path = "../../../OrdinaryDiffEqCore" - -[sources.OrdinaryDiffEqSSPRK] -path = "../../" +[sources] +DiffEqBase = {path = "../../../DiffEqBase"} +OrdinaryDiffEqCore = {path = "../../../OrdinaryDiffEqCore"} +OrdinaryDiffEqSSPRK = {path = "../.."} [compat] AllocCheck = "0.2" Aqua = "0.8.11" +DiffEqBase = "7" JET = "0.9, 0.11" -SciMLTesting = "1.7" -julia = "1.10" OrdinaryDiffEqCore = "4" OrdinaryDiffEqSSPRK = "2" SciMLBase = "3" +SciMLTesting = "1.7" +julia = "1.10" diff --git a/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl b/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl index f1d5bd7b973..2051be79206 100644 --- a/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqSSPRK/test/qa/qa.jl @@ -4,35 +4,24 @@ run_qa( OrdinaryDiffEqSSPRK; explicit_imports = true, ei_kwargs = ( - # Solver-internal names with no public counterpart in their owner. - # OrdinaryDiffEqCore internals: the RK perform_step/cache/limiter API - # (perform_step!, alg_cache, @cache, isfsal, constvalue, trivial_limiter!, - # explicit_rk_docstring, get_fsalfirstlast, ssp_coefficient, the - # _ode_interpolant/_ode_addsteps interpolation hooks, the abstract - # algorithm/cache supertypes). DiffEqBase residual hooks - # (calculate_residuals[!]). SciMLBase macros (@def, @cache reexport). - # See SciML/OrdinaryDiffEq.jl#3776. + # Residual non-public names after the solver-author API was made public + # in OrdinaryDiffEqCore / DiffEqBase. Everything still listed here is a + # deliberate owner-internal that is NOT part of the supported public + # surface. all_explicit_imports_are_public = (; ignore = ( - Symbol("@cache"), Symbol("@def"), - :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqMutableCache, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqAdaptiveAlgorithm, - :perform_step!, :alg_cache, :isfsal, :constvalue, - :trivial_limiter!, :explicit_rk_docstring, :get_fsalfirstlast, - :ssp_coefficient, :_ode_interpolant, :_ode_interpolant!, - :_ode_addsteps!, - :calculate_residuals, :calculate_residuals!, + # SciMLBase private codegen macro (no public counterpart). + Symbol("@def"), + # OrdinaryDiffEqCore codegen/perf internals kept non-public on + # purpose (see OrdinaryDiffEqCore's public block comment): + # the interpolation write-hook, the SSP coefficient accessor, + # and the no-op limiter. + :_ode_interpolant!, :ssp_coefficient, :trivial_limiter!, ), ), - # Qualified accesses to solver-internal names: OrdinaryDiffEqCore - # step bookkeeping/test problems (increment_nf!, set_EEst!, lorenz[_oop]) - # and SciMLBase specialization tags used only inside the precompile - # workload (FunctionWrapperSpecialize, NoSpecialize). + # OrdinaryDiffEqCore precompile-workload test problems (not public API). all_qualified_accesses_are_public = (; - ignore = ( - :increment_nf!, :set_EEst!, :lorenz, :lorenz_oop, - :FunctionWrapperSpecialize, :NoSpecialize, - ), + ignore = (:lorenz, :lorenz_oop), ), ), ) From defe662c15a40fc7af620400770020e7d05b758f Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:40:54 -0400 Subject: [PATCH 066/108] QPRK QA: re-clean EI ignore list to genuine residual (PHASE B) Base packages now declare their solver-author API public on this branch (PHASE A). Drop every now-public OrdinaryDiffEqCore/DiffEqBase name from the QPRK explicit-imports ignore lists; keep only the three genuine owner-internal OrdinaryDiffEqCore names that remain non-public: @fold, @OnDemandTableauExtract (private codegen macros) and trivial_limiter! (default limiter). Drop the entire all_qualified_accesses_are_public ignore (increment_nf!/set_EEst! are now public). Verified GROUP EI green on Julia 1.12 (6/6). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqQPRK/test/qa/qa.jl | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl b/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl index daf2f85e13c..2bcc54b5a9e 100644 --- a/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqQPRK/test/qa/qa.jl @@ -4,20 +4,12 @@ run_qa( OrdinaryDiffEqQPRK; explicit_imports = true, ei_kwargs = ( - # OrdinaryDiffEqCore solver-interface internals (no public owner elsewhere) plus - # DiffEqBase residual helpers that QPRK extends but are not yet marked public. all_explicit_imports_are_public = ( ignore = ( - :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqConstantCache, - :OrdinaryDiffEqMutableCache, :explicit_rk_docstring, :alg_cache, - :trivial_limiter!, :perform_step!, :get_fsalfirstlast, :constvalue, - Symbol("@cache"), Symbol("@fold"), Symbol("@OnDemandTableauExtract"), - :calculate_residuals, :calculate_residuals!, + # OrdinaryDiffEqCore owner-internal codegen macros and default limiter + # (deliberately not declared public: private codegen/perf surface). + Symbol("@fold"), Symbol("@OnDemandTableauExtract"), :trivial_limiter!, ), ), - # OrdinaryDiffEqCore step-statistics setters accessed by qualified name. - all_qualified_accesses_are_public = ( - ignore = (:increment_nf!, :set_EEst!), - ), ), ) From 90cc3ea72c66ffa8bfbdc34e40323fffc1d3fe88 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:42:05 -0400 Subject: [PATCH 067/108] Re-clean OrdinaryDiffEqStabilizedIRK QA EI ignore list (PHASE B) The base packages (OrdinaryDiffEqCore, OrdinaryDiffEqDifferentiation, OrdinaryDiffEqNonlinearSolve, DiffEqBase) now declare their solver-author extension API `public` on this branch, so the bulk of the enumerated all_explicit_imports_are_public ignore entries are redundant. Drop every now-public name and keep only the genuine residual: - OrdinaryDiffEqCore owner-internal helpers deliberately kept non-public (fac_default_gamma, _fixup_ad, isnewton) - SciMLBase internals not public on registered releases (_unwrap_val, _reshape, _vec) Verified on Julia 1.12 (branch lib/* developed via native [sources]): Quality Assurance / ExplicitImports 6/6 pass, 0 non-public flags. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl | 27 ++++--------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl index 584ad003c22..ee23a5cd5f9 100644 --- a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl @@ -4,30 +4,13 @@ run_qa( OrdinaryDiffEqStabilizedIRK; explicit_imports = true, ei_kwargs = (; - # Solver-interface names imported from their owner module but not yet - # declared `public` on the registered releases. These are the - # OrdinaryDiffEq internal extension/dispatch API (OrdinaryDiffEqCore, - # OrdinaryDiffEqNonlinearSolve, OrdinaryDiffEqDifferentiation), plus - # DiffEqBase residual helpers and SciMLBase internals. No public - # alternative exists; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore - :default_controller, :IController, :gamma_default, :issplit, - :perform_step!, :unwrap_alg, :fac_default_gamma, - :OrdinaryDiffEqNewtonAdaptiveAlgorithm, - :OrdinaryDiffEqMutableCache, :OrdinaryDiffEqConstantCache, - :alg_cache, Symbol("@cache"), :get_fsalfirstlast, - :increment_nf!, :set_EEst!, :generic_solver_docstring, - :_fixup_ad, :get_W, :isnewton, - # OrdinaryDiffEqNonlinearSolve - :NLNewton, :nlsolve!, :build_nlsolver, :markfirststage!, - :du_alias_or_new, - # OrdinaryDiffEqDifferentiation - :dolinsolve, :update_W!, - # DiffEqBase - :calculate_residuals, :calculate_residuals!, - # SciMLBase + # OrdinaryDiffEqCore owner-internal helpers deliberately kept + # non-public (perf/dispatch/misc utilities, not part of the + # documented solver-author extension surface). + :fac_default_gamma, :_fixup_ad, :isnewton, + # SciMLBase internals, not public on registered releases. :_unwrap_val, :_reshape, :_vec, ), ), From 7d293cda7fdabef556608c1b15f1f9e69086da7e Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:42:23 -0400 Subject: [PATCH 068/108] Re-clean OrdinaryDiffEqStabilizedRK QA EI ignore list after public decls Drop now-public OrdinaryDiffEqCore/DiffEqBase names (public on this branch) and the fully-public all_qualified_accesses_are_public block. Keep only the genuine residual: SciMLBase _vec/value (pending release) and Core owner-internal fac_default_gamma/has_dtnew_modification. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl b/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl index 3d787c7272d..61d88129055 100644 --- a/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl @@ -4,24 +4,13 @@ run_qa( OrdinaryDiffEqStabilizedRK; explicit_imports = true, ei_kwargs = ( - # OrdinaryDiffEqCore solver-interface internals (no public owner elsewhere) - # plus SciMLBase/DiffEqBase helpers that StabilizedRK extends/uses but which - # are not yet marked public in their owner modules. all_explicit_imports_are_public = ( ignore = ( - :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqConstantCache, - :OrdinaryDiffEqMutableCache, :PredictiveController, - :alg_adaptive_order, :alg_cache, :alg_extrapolates, :constvalue, - :default_controller, :fac_default_gamma, :gamma_default, - :generic_solver_docstring, :get_fsalfirstlast, - :has_dtnew_modification, :perform_step!, :qmax_default, :unwrap_alg, - Symbol("@cache"), - :_vec, :value, :calculate_residuals, :calculate_residuals!, + # SciMLBase-owned helpers not yet declared public (pending release). + :_vec, :value, + # OrdinaryDiffEqCore owner-internal hooks kept non-public. + :fac_default_gamma, :has_dtnew_modification, ), ), - # OrdinaryDiffEqCore step-statistics setters accessed by qualified name. - all_qualified_accesses_are_public = ( - ignore = (:increment_nf!, :set_EEst!), - ), ), ) From 58743b54383a800612a1f2eb602313f3eaf315bd Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:42:32 -0400 Subject: [PATCH 069/108] Re-clean OrdinaryDiffEqSDIRK QA ignore list after PHASE A public decls The base solver-author API (OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation / OrdinaryDiffEqNonlinearSolve / DiffEqBase) is now declared `public`, so those names drop out of the ExplicitImports ignore lists. Only genuine non-public residual remains: OrdinaryDiffEqCore internals not promoted to public, SciMLBase private helpers, and external names with no public export (ConstructionBase, TruncatedStacktraces). Verified via run_qa explicit-imports on Julia 1.12: 6/6 green. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl | 41 +++++++++------------------ 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl index 17084c1408b..52cd4741e91 100644 --- a/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl @@ -1,12 +1,14 @@ using SciMLTesting, OrdinaryDiffEqSDIRK, Test -# The remaining ignores are all names that are genuinely non-public internals of -# the SDIRK solver stack (OrdinaryDiffEqCore / OrdinaryDiffEqNonlinearSolve / -# OrdinaryDiffEqDifferentiation), plus a handful of non-public SciMLBase / -# DiffEqBase / ConstructionBase names with no public alternative. They are owned -# by the module they are imported/accessed from (so the *_via_owners checks pass); -# they are only flagged because those owners have not yet declared them `public`. -# Each will drop off once the owning package marks the corresponding name public. +# The base solver-author API of OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation / +# OrdinaryDiffEqNonlinearSolve / DiffEqBase is now declared `public`, so those names +# no longer need ignoring here. What remains are genuine non-public internals with no +# public alternative, grouped by owning package: +# * OrdinaryDiffEqCore internals that were intentionally NOT promoted to public +# (test fixtures + a few perf/codegen helpers). +# * SciMLBase private helpers (`_reshape`/`_unwrap_val`/`_vec`). +# * External packages whose names have no public export (ConstructionBase, +# TruncatedStacktraces). run_qa( OrdinaryDiffEqSDIRK; explicit_imports = true, @@ -16,35 +18,20 @@ run_qa( all_qualified_accesses_via_owners = (; ignore = (:constructorof,)), all_qualified_accesses_are_public = (; ignore = ( - # non-public in SciMLBase - :constructorof, :NoSpecialize, :FunctionWrapperSpecialize, - # non-public OrdinaryDiffEqCore internals - :increment_nf!, :set_EEst!, :get_EEst, :strip_cache, + # non-public in ConstructionBase (via SciMLBase re-export) + :constructorof, + # non-public OrdinaryDiffEqCore test fixtures :lorenz, :lorenz_oop, )), all_explicit_imports_are_public = (; ignore = ( # non-public SciMLBase internals :_reshape, :_unwrap_val, :_vec, - # non-public DiffEqBase internals - :calculate_residuals, :calculate_residuals!, # non-public TruncatedStacktraces macro Symbol("@truncate_stacktrace"), # non-public OrdinaryDiffEqCore internals - :CompiledFloats, :OrdinaryDiffEqConstantCache, - :OrdinaryDiffEqMutableCache, - :OrdinaryDiffEqNewtonAdaptiveAlgorithm, - :OrdinaryDiffEqNewtonAlgorithm, - :_fixup_ad, :alg_cache, :alg_extrapolates, :constvalue, - :current_extrapolant!, :generic_solver_docstring, - :get_fsalfirstlast, :isesdirk, :issplit, :perform_step!, - :ssp_coefficient, :trivial_limiter!, :unwrap_alg, - :COEFFICIENT_MULTISTEP, :get_W, :isnewton, :set_new_W!, - # non-public OrdinaryDiffEqNonlinearSolve internals - :NLNewton, :build_nlsolver, :du_alias_or_new, :markfirststage!, - :nlsolve!, :nlsolvefail, - # non-public OrdinaryDiffEqDifferentiation internals - :dolinsolve, + :CompiledFloats, :_fixup_ad, :current_extrapolant!, + :isesdirk, :isnewton, :ssp_coefficient, :trivial_limiter!, )), ), ) From 091dfaa24329dce75a4c0c1479601fcc2d2c9992 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:44:38 -0400 Subject: [PATCH 070/108] Re-clean OrdinaryDiffEqDifferentiation QA ExplicitImports ignore lists Now that OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation / DiffEqBase declare their solver-author extension API `public` on this branch, drop the now-public names from the ExplicitImports ignore lists (68 -> 38 residual entries). Source in-repo lib/DiffEqBase in the QA env so its on-branch public decls are picked up, matching the pattern already used by the other re-cleaned sublibraries. The residual is the genuine remainder: non-public externals (ForwardDiff, LinearSolve, DifferentiationInterface, SciMLOperators, StaticArraysCore, Base), SciMLBase internals/predicates, re-exported Accessors/SciMLLogging macros, this sublib's own internal sparse-handling API, and the handful of OrdinaryDiffEqCore names not yet in its public block (make-public follow-ups, tracked in SciML/OrdinaryDiffEq.jl#3776). Co-Authored-By: Chris Rackauckas --- .../test/qa/Project.toml | 5 +++ .../test/qa/qa.jl | 41 +++++++------------ 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml b/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml index 63d8b9c3328..e878fbec165 100644 --- a/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqDifferentiation/test/qa/Project.toml @@ -1,11 +1,15 @@ [deps] Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" OrdinaryDiffEqDifferentiation = "4302a76b-040a-498a-8c04-15b101fed76b" SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +[sources.DiffEqBase] +path = "../../../DiffEqBase" + [sources.OrdinaryDiffEqCore] path = "../../../OrdinaryDiffEqCore" @@ -14,6 +18,7 @@ path = "../.." [compat] Aqua = "0.8.11" +DiffEqBase = "7" JET = "0.9, 0.11" OrdinaryDiffEqCore = "4" OrdinaryDiffEqDifferentiation = "3" diff --git a/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl b/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl index cef508f47f7..ccbcc923c96 100644 --- a/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl @@ -1,10 +1,11 @@ using SciMLTesting, OrdinaryDiffEqDifferentiation, Test -# Residual ExplicitImports ignores: every name below is a genuinely non-public -# (or non-owner re-exported) symbol of another package that this differentiation -# sublibrary legitimately relies on. The OrdinaryDiffEqCore / SciMLBase / DiffEqBase -# entries are the internal solver/W-matrix/Jacobian-interface API that the sublib is -# built against and are make-public candidates upstream (tracked in SciML/OrdinaryDiffEq.jl#3776). +# Residual ExplicitImports ignores. After the solver-author extension API of +# OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation / DiffEqBase was declared +# `public` (Julia 1.11+ `public`), the only names left are genuine non-public +# externals, this sublib's own internal sparse-handling API, and a small set of +# OrdinaryDiffEqCore names not yet in that public block (make-public follow-ups, +# tracked in SciML/OrdinaryDiffEq.jl#3776). run_qa( OrdinaryDiffEqDifferentiation; aqua_kwargs = (; piracies = false, ambiguities = false), @@ -16,30 +17,20 @@ run_qa( all_qualified_accesses_via_owners = (; ignore = (Symbol("@set"),)), all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore internal solver API (make-public candidates) - :AbstractNLSolver, :alg_autodiff, :CompositeAlgorithm, :concrete_jac, - :constvalue, :DAEAlgorithm, :diffdir, :Divergence, :get_chunksize, - :get_new_W_γdt_cutoff, :get_W, :isfirstcall, :isfirststage, :isJcurrent, - :isnewton, :issplit, :isWmethod, :nlsolve_f, - :OrdinaryDiffEqAdaptiveExponentialAlgorithm, - :OrdinaryDiffEqAdaptiveImplicitAlgorithm, :OrdinaryDiffEqAlgorithm, - :OrdinaryDiffEqCache, :OrdinaryDiffEqExponentialAlgorithm, - :OrdinaryDiffEqImplicitAlgorithm, :resize_J_W!, :set_new_W!, - Symbol("set_W_γdt!"), :TryAgain, :unwrap_alg, - # SciMLBase internal wrappers / helpers (make-public candidates) - :UDerivativeWrapper, :UJacobianWrapper, :_unwrap_val, :_vec, - # other framework internals - :AbstractSciMLOperator, # SciMLOperators - :OrdinaryDiffEqTag, # DiffEqBase - :StaticArray, :StaticMatrix, # StaticArraysCore # Accessors `@set` / SciMLLogging `@SciMLMessage` re-exported by # SciMLBase / OrdinaryDiffEqCore (owners are not direct deps) Symbol("@set"), Symbol("@SciMLMessage"), + # SciMLBase internal helpers (make-public candidates) + :_unwrap_val, :_vec, + # OrdinaryDiffEqCore internals not yet in its public block + :concrete_jac, :diffdir, :get_chunksize, :isnewton, + # other framework internals + :AbstractSciMLOperator, # SciMLOperators + :StaticArray, :StaticMatrix, # StaticArraysCore ), ), all_qualified_accesses_are_public = (; ignore = ( - # Base / framework internals accessed by qualification Symbol("@pure"), # Base Symbol("@set"), # Accessors macro re-exported by SciMLBase :AbstractSciMLOperator, # SciMLOperators @@ -48,10 +39,8 @@ run_qa( :init_cacheval, :needs_concrete_A, # ForwardDiff internals :JacobianConfig, :Tag, :pickchunksize, - # OrdinaryDiffEqCore internal solver API (make-public candidates) - :_get_fwd_chunksize_int, :get_EEst, Symbol("increment_nf!"), :unwrap_alg, - # DiffEqBase internals - :default_factorize, :prepare_alg, + # OrdinaryDiffEqCore internal not yet in its public block + :_get_fwd_chunksize_int, # SciMLBase Jacobian-interface predicates (make-public candidates) :has_Wfact_t, :has_colorvec, :has_jac_du, :has_jac_u, # DifferentiationInterface internals From 1d83d39ba4fd70827d23f01aa863054ff8284e93 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:49:15 -0400 Subject: [PATCH 071/108] StochasticDiffEqHighOrder: re-clean qa EI ignore lists after PHASE A public decls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop now-public solver-author API names (Tableau, calculate_residuals, calculate_residuals!, perform_step! from all_explicit_imports_are_public; set_EEst! from all_qualified_accesses_are_public) — these are now declared public on-branch in OrdinaryDiffEqCore/DiffEqBase. The whole all_qualified_accesses_are_public ignore is now empty and removed. Residual keeps: `@..` (external FastBroadcast macro reexported through DiffEqBase) in via_owners + are_public, and `@cache` (StochasticDiffEqCore owner-internal codegen macro, no public-API surface declared) in are_public. Verified on Julia 1.12: full qa 18/18 pass, 0 fail/error/broken. Co-Authored-By: Chris Rackauckas --- lib/StochasticDiffEqHighOrder/test/qa/qa.jl | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/lib/StochasticDiffEqHighOrder/test/qa/qa.jl b/lib/StochasticDiffEqHighOrder/test/qa/qa.jl index 83f5a1f7409..a373471ecc7 100644 --- a/lib/StochasticDiffEqHighOrder/test/qa/qa.jl +++ b/lib/StochasticDiffEqHighOrder/test/qa/qa.jl @@ -10,19 +10,11 @@ run_qa( # FastBroadcast is not a direct dependency of this sublibrary, so the # broadcast macro can only be reached via the DiffEqBase reexport. all_explicit_imports_via_owners = (; ignore = (Symbol("@.."),)), - # Solver-internal names with no public counterpart in their owner. - # DiffEqBase residual hooks (calculate_residuals[!]), the Tableau type, - # and the @.. broadcast macro; StochasticDiffEqCore's @cache macro; and - # OrdinaryDiffEqCore's perform_step! dispatch hook. - # See SciML/OrdinaryDiffEq.jl#3776. + # `@..`: external FastBroadcast macro reexported through DiffEqBase (not + # public there). `@cache`: StochasticDiffEqCore's owner-internal codegen + # macro; StochasticDiffEqCore has no public-API surface declared yet. all_explicit_imports_are_public = (; - ignore = ( - Symbol("@.."), Symbol("@cache"), - :Tableau, :calculate_residuals, :calculate_residuals!, - :perform_step!, - ), + ignore = (Symbol("@.."), Symbol("@cache")), ), - # Qualified access to OrdinaryDiffEqCore's internal step-error setter. - all_qualified_accesses_are_public = (; ignore = (:set_EEst!,)), ), ) From 41455b35773d5ccb7c818a4adb22988b371fab76 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:49:53 -0400 Subject: [PATCH 072/108] Re-clean OrdinaryDiffEqTsit5 QA ExplicitImports ignore list PHASE B: drop now-public solver-author API names (OrdinaryDiffEqCore / DiffEqBase) made `public` in PHASE A. Keep only the genuine residual: owner-internal codegen macros (@fold/@OnDemandTableauExtract), Core precompile-workload helpers and internals (lorenz/lorenz_oop/CompiledFloats/ DerivativeOrderNotPossibleError/_ode_interpolant!/trivial_limiter!), and the externals @def (SciMLBase) and @truncate_stacktrace (TruncatedStacktraces). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqTsit5/test/qa/qa.jl | 49 ++++++++++++--------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl b/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl index 09c251790f0..de55e47ea6f 100644 --- a/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl @@ -4,40 +4,33 @@ run_qa( OrdinaryDiffEqTsit5; explicit_imports = true, ei_kwargs = (; - # Solver-internal names accessed via their (qualified) owner module that - # have no public alternative on the registered releases. The OrdinaryDiffEqCore - # step-statistics mutators (increment_nf!/set_EEst!) and the lorenz/lorenz_oop - # precompile-workload test functions are OrdinaryDiffEqCore internals; - # FunctionWrapperSpecialize/NoSpecialize are SciMLBase specialization markers - # used in the (preference-gated) precompile workload and are not declared public. + # Residual after the PHASE-A make-public sweep: every solver-author API name + # (alg_cache/perform_step!/_ode_interpolant/... in OrdinaryDiffEqCore, + # calculate_residuals in DiffEqBase, etc.) is now declared `public` on this + # branch and no longer needs an ignore. What remains are owner-internal names + # with no public alternative. all_qualified_accesses_are_public = (; ignore = ( - :increment_nf!, # OrdinaryDiffEqCore - :set_EEst!, # OrdinaryDiffEqCore - :lorenz, # OrdinaryDiffEqCore - :lorenz_oop, # OrdinaryDiffEqCore - :FunctionWrapperSpecialize, # SciMLBase - :NoSpecialize, # SciMLBase + # OrdinaryDiffEqCore — private codegen macros kept non-public in PHASE A + Symbol("@fold"), Symbol("@OnDemandTableauExtract"), + # OrdinaryDiffEqCore — precompile-workload test functions (internal) + :lorenz, :lorenz_oop, + # OrdinaryDiffEqCore — genuine internals (no public alternative) + :CompiledFloats, :DerivativeOrderNotPossibleError, + :_ode_interpolant!, :trivial_limiter!, + # SciMLBase + Symbol("@def"), + # TruncatedStacktraces + Symbol("@truncate_stacktrace"), ), ), - # Core solver-interface names imported from their owner module but not yet - # declared `public`. These are the OrdinaryDiffEq internal extension/dispatch - # API (OrdinaryDiffEqCore), the DiffEqBase residual helpers, SciMLBase's @def, - # and the TruncatedStacktraces macro. No public alternative exists; tracked for - # make-public in SciML/OrdinaryDiffEq.jl#3776. all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore - :alg_cache, :alg_stability_size, :AutoAlgSwitch, - Symbol("@cache"), :CompiledFloats, :CompositeAlgorithm, - :constvalue, :DerivativeOrderNotPossibleError, - :explicit_rk_docstring, Symbol("@fold"), :get_fsalfirstlast, - :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, - Symbol("@OnDemandTableauExtract"), - :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqConstantCache, - :OrdinaryDiffEqMutableCache, :perform_step!, :trivial_limiter!, - # DiffEqBase - :calculate_residuals, :calculate_residuals!, + # OrdinaryDiffEqCore — private codegen macros kept non-public in PHASE A + Symbol("@fold"), Symbol("@OnDemandTableauExtract"), + # OrdinaryDiffEqCore — genuine internals (no public alternative) + :CompiledFloats, :DerivativeOrderNotPossibleError, + :_ode_interpolant!, :trivial_limiter!, # SciMLBase Symbol("@def"), # TruncatedStacktraces From eddf57c0ab011d6541ecaa2d9ba0d5012be34688 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:50:39 -0400 Subject: [PATCH 073/108] Re-clean StochasticDiffEqLeaping QA EI ignore lists (PHASE B) Drop now-public OrdinaryDiffEqCore/NonlinearSolve/DiffEqBase solver-author names (perform_step!, issplit, controllers, nlsolve family, ODEIntegrator, DummyController, NLFunctional, etc.) made public on this branch in PHASE A. Residual kept (4 names, documented by owner): - @.. (FastBroadcast, re-exported via DiffEqBase) - pois_rand (PoissonRandom, re-exported via JumpProcesses) - @cache (StochasticDiffEqCore internal, not a PHASE-A base package) - isaposteriori (OrdinaryDiffEqCore internal, not made public) ei_broken dropped (all 6 EI checks pass with the tight lists on Julia 1.12). Co-Authored-By: Chris Rackauckas --- lib/StochasticDiffEqLeaping/test/qa/qa.jl | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/StochasticDiffEqLeaping/test/qa/qa.jl b/lib/StochasticDiffEqLeaping/test/qa/qa.jl index be1547472d1..0982a9ab16f 100644 --- a/lib/StochasticDiffEqLeaping/test/qa/qa.jl +++ b/lib/StochasticDiffEqLeaping/test/qa/qa.jl @@ -12,22 +12,21 @@ run_qa( # `pois_rand` is owned by PoissonRandom and re-exported by JumpProcesses, # the natural dependency that owns the jump-process interface here. all_qualified_accesses_via_owners = (; ignore = (:pois_rand,)), - # Internal (non-public) solver-interface names this method package must - # extend/import. These are private API of OrdinaryDiffEqCore, - # OrdinaryDiffEqNonlinearSolve, StochasticDiffEqCore, and DiffEqBase; they - # have no public replacement (track make-public in SciML/OrdinaryDiffEq.jl#3776). all_explicit_imports_are_public = (; ignore = ( - Symbol("@.."), Symbol("@cache"), :DummyController, :NLFunctional, - :issplit, :perform_step!, :step_accept_controller!, - :step_reject_controller!, :stepsize_controller!, + # FastBroadcast fused-broadcast macro, re-exported via DiffEqBase. + Symbol("@.."), + # StochasticDiffEqCore internal cache-alloc macro (non-public). + Symbol("@cache"), ) ), all_qualified_accesses_are_public = (; ignore = ( - :ODEIntegrator, :build_nlsolver, :default_controller, :get_EEst, - :isaposteriori, :markfirststage!, :nlsolve!, :nlsolve_f, - :nlsolvefail, :pois_rand, :set_EEst!, + # OrdinaryDiffEqCore internal a-posteriori error-estimate predicate + # (non-public). + :isaposteriori, + # PoissonRandom sampler, re-exported via JumpProcesses (non-public). + :pois_rand, ) ), ), From f7e9283c804f69b89a9964456bb7c6af280b9e8d Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:51:19 -0400 Subject: [PATCH 074/108] StochasticDiffEqIIF QA: re-clean EI ignore list after PHASE A public decls The base OrdinaryDiffEqCore now declares perform_step!, issplit, and current_extrapolant public, so those drop from the explicit-imports ignore list. Only genuine residuals remain: current_extrapolant! (the in-place variant was omitted from the OrdinaryDiffEqCore public decls) and @cache (public in OrdinaryDiffEqCore but imported here through StochasticDiffEqCore, which does not re-declare it public). Co-Authored-By: Chris Rackauckas --- lib/StochasticDiffEqIIF/test/qa/qa.jl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/StochasticDiffEqIIF/test/qa/qa.jl b/lib/StochasticDiffEqIIF/test/qa/qa.jl index cbd8c415d12..27936f3c259 100644 --- a/lib/StochasticDiffEqIIF/test/qa/qa.jl +++ b/lib/StochasticDiffEqIIF/test/qa/qa.jl @@ -6,14 +6,14 @@ run_qa( jet_kwargs = (; target_defined_modules = true), explicit_imports = true, ei_kwargs = (; - # These names are part of the OrdinaryDiffEqCore solver-author interface and - # StochasticDiffEqCore's cache machinery, but are not (yet) declared `public`. - # They are imported from their owning module; the only residual EI complaint is - # that they are not public there. Tracked for make-public in - # SciML/OrdinaryDiffEq.jl#3776. all_explicit_imports_are_public = (; ignore = ( - :perform_step!, :issplit, :current_extrapolant, :current_extrapolant!, # OrdinaryDiffEqCore + # OrdinaryDiffEqCore solver-author interface, still not `public` there + # (the no-bang `current_extrapolant` was made public; the in-place + # `current_extrapolant!` was not). + :current_extrapolant!, + # `@cache` is public in OrdinaryDiffEqCore but imported here from + # StochasticDiffEqCore, which does not re-declare it `public`. Symbol("@cache"), # StochasticDiffEqCore ), ), From 7a94d06be3bc55369b2a3b4476f2f463a81e06b5 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:51:27 -0400 Subject: [PATCH 075/108] StochasticDiffEqImplicit QA: re-clean EI ignore lists after PHASE A public decls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The base packages OrdinaryDiffEqCore/OrdinaryDiffEqDifferentiation/ OrdinaryDiffEqNonlinearSolve/DiffEqBase now declare their solver-author API `public` on this branch, so most of the previously-enumerated ignores are redundant. Re-probed with empty ignore lists on Julia 1.12 (native [sources]) and kept only the genuine residual: - `@..` (FastBroadcast, re-exported via DiffEqBase) — via_owners + are_public. - `@cache` (StochasticDiffEqCore internal codegen macro). - `current_extrapolant!`, `isnewton`, `_fixup_ad` (OrdinaryDiffEqCore internals not in the PHASE A public set). - `has_Wfact`, `_vec`, `_reshape`, `_unwrap_val` (SciMLBase internals, not yet `public` on the registered SciMLBase). Dropped everything now public: perform_step!, issplit, default_controller, PIController, set_new_W!, get_W (OrdinaryDiffEqCore); nlsolvefail, nlsolve!, build_nlsolver, markfirststage!, NLNewton (OrdinaryDiffEqNonlinearSolve); calc_J, calc_J!, dolinsolve (OrdinaryDiffEqDifferentiation); calculate_residuals, calculate_residuals! (DiffEqBase); and the entire all_qualified_accesses_are_public block (AlgorithmInterpretation, alg_interpretation, set_EEst!). Verified EI green on Julia 1.12: Quality Assurance 6/6, 0 fail/error. Co-Authored-By: Chris Rackauckas --- lib/StochasticDiffEqImplicit/test/qa/qa.jl | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/lib/StochasticDiffEqImplicit/test/qa/qa.jl b/lib/StochasticDiffEqImplicit/test/qa/qa.jl index cd5833e7744..6c3fb0c3cea 100644 --- a/lib/StochasticDiffEqImplicit/test/qa/qa.jl +++ b/lib/StochasticDiffEqImplicit/test/qa/qa.jl @@ -9,28 +9,16 @@ run_qa( # `@..` is owned by FastBroadcast and re-exported through DiffEqBase; FastBroadcast # is not a direct dependency, so it is imported from DiffEqBase by design. all_explicit_imports_via_owners = (; ignore = (Symbol("@.."),)), - # Internal (non-`public`) names from SciML packages used to implement the solvers. - # These have no public replacement yet; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. all_explicit_imports_are_public = (; ignore = ( # `@..` (FastBroadcast macro re-exported via DiffEqBase) is not `public` there. Symbol("@.."), - # StochasticDiffEqCore internals + # StochasticDiffEqCore internal codegen macro (owner-internal). Symbol("@cache"), - # OrdinaryDiffEqCore internals - :perform_step!, :issplit, :default_controller, :PIController, - :current_extrapolant!, :isnewton, :set_new_W!, :get_W, :_fixup_ad, - # OrdinaryDiffEqNonlinearSolve internals - :nlsolvefail, :nlsolve!, :build_nlsolver, :markfirststage!, :NLNewton, - # OrdinaryDiffEqDifferentiation internals - :calc_J, :calc_J!, :dolinsolve, - # DiffEqBase internals - :calculate_residuals, :calculate_residuals!, - # SciMLBase internals (owner-correct but not yet `public`) + # OrdinaryDiffEqCore internals with no public replacement yet. + :current_extrapolant!, :isnewton, :_fixup_ad, + # SciMLBase internals (not yet `public` on registered SciMLBase). :has_Wfact, :_vec, :_reshape, :_unwrap_val, )), - # SciMLBase / OrdinaryDiffEqCore internals accessed via qualified name. - all_qualified_accesses_are_public = (; - ignore = (:AlgorithmInterpretation, :alg_interpretation, :set_EEst!)), ), ) From e06bec8b58e83fff9ed4d36b045f2904cd9b8407 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:52:20 -0400 Subject: [PATCH 076/108] Re-clean OrdinaryDiffEqNonlinearSolve QA ExplicitImports ignore lists Drop now-public OrdinaryDiffEqCore/Differentiation/NonlinearSolve/DiffEqBase solver-author API names from the ignore lists (declared public on this branch). Keep only the genuine residual: OrdinaryDiffEqCore internals not in the public extension surface, SciMLBase/SciMLOperators internals, and ForwardDiff/StaticArraysCore externals. Co-Authored-By: Chris Rackauckas --- .../test/qa/qa.jl | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl index bb241095e2e..f37273856be 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl @@ -18,37 +18,27 @@ run_qa( # name `public`/exports it. Tracked in SciML/OrdinaryDiffEq.jl#3776. all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore internals (solver interface) - :AbstractNLSolver, :AbstractNLSolverAlgorithm, :AbstractNLSolverCache, - :NewtonAlgorithm, :DAEAlgorithm, :TryAgain, :DIRK, :COEFFICIENT_MULTISTEP, - :Convergence, :Divergence, :NLStatus, :MethodType, :error_constant, - :alg_extrapolates, :resize_J_W!, :alg_autodiff, :has_special_newton_error, - :_initialize_dae!, :resize_nlsolver!, :nlsolve_f, :set_new_W!, :set_W_γdt!, - :default_nlsolve, :isnewton, :get_W, :isfirstcall, :isfirststage, - :isJcurrent, :get_new_W_γdt_cutoff, :apply_step!, Symbol("@SciMLMessage"), - # SciMLBase internals (owner of these names but not public) - :_vec, :_reshape, :postamble!, - # DiffEqBase internals - :OrdinaryDiffEqTag, :calculate_residuals, :calculate_residuals!, - # SciMLOperators abstract type (not public) + # OrdinaryDiffEqCore internals not part of the solver-author public API. + :apply_step!, :error_constant, :has_special_newton_error, + :_initialize_dae!, :isnewton, Symbol("@SciMLMessage"), + # SciMLBase internals (owner of these names but not public). + :_vec, :_reshape, :postamble!, :value, :anyeltypedual, + :forwarddiff_chunksize, :has_Wfact, :has_Wfact_t, :has_jac_u, :has_jac_du, + # SciMLOperators abstract type (not public). :AbstractSciMLOperator, - # OrdinaryDiffEqDifferentiation internals (Jacobian/W machinery) - :update_W!, :is_always_new, :build_uf, :build_J_W, :WOperator, - :StaticWOperator, :wrapprecs, :build_jac_config, :dolinsolve, - :resize_jac_config!, :jacobian2W!, :jacobian!, - # ForwardDiff / StaticArraysCore internals - :Dual, :StaticArray, + # OrdinaryDiffEqDifferentiation W-operator types (attributed to SciMLOperators). + :WOperator, :StaticWOperator, + # ForwardDiff / StaticArraysCore internals. + :Dual, :Tag, :pickchunksize, :StaticArray, ), ), # Qualified `Module.name` accesses to non-public names with no public alternative. all_qualified_accesses_are_public = (; ignore = ( - # SciMLBase internals (`postamble!` is extended via `SciMLBase.postamble!`) - :value, :anyeltypedual, :FullSpecialize, :forwarddiff_chunksize, + # SciMLBase internals. + :value, :anyeltypedual, :forwarddiff_chunksize, :has_Wfact, :has_Wfact_t, :has_jac_u, :has_jac_du, :postamble!, - # OrdinaryDiffEqCore internals - :ODEIntegrator, :increment_nf!, - # ForwardDiff internals + # ForwardDiff internals. :Tag, :pickchunksize, ), ), From 797a68770a386436017fe0cf6db81e1a693ac19f Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:51:35 -0400 Subject: [PATCH 077/108] Re-clean OrdinaryDiffEqPDIRK QA explicit-imports ignore list Drop names now declared public on-branch by the OrdinaryDiffEqCore / OrdinaryDiffEqNonlinearSolve solver-author API (PHASE A). Only genuine residual remains: OrdinaryDiffEqCore's deliberately-private @threaded / _fixup_ad / differentiation_rk_docstring and SciMLBase's _unwrap_val. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl index b3ce6737ea9..cd5e2e1c99a 100644 --- a/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl @@ -4,21 +4,14 @@ run_qa( OrdinaryDiffEqPDIRK; explicit_imports = true, ei_kwargs = (; - # Solver-internal names extended/dispatched from their owner modules but - # not (yet) declared `public` on the registered releases. No public - # alternative exists; tracked for make-public in SciML/OrdinaryDiffEq.jl#3776. all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore - Symbol("@cache"), Symbol("@threaded"), - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - :OrdinaryDiffEqNewtonAlgorithm, :_fixup_ad, :alg_cache, - :constvalue, :differentiation_rk_docstring, :get_fsalfirstlast, - :isfsal, :isthreaded, :perform_step!, :unwrap_alg, - # OrdinaryDiffEqNonlinearSolve - :NLNewton, :build_nlsolver, :markfirststage!, :nlsolve!, - :nlsolvefail, - # SciMLBase + # OrdinaryDiffEqCore: solver-author API is public, but these three + # are deliberately kept non-public upstream. `@threaded` is a + # codegen/perf macro; `_fixup_ad` and `differentiation_rk_docstring` + # are AD-fixup / docstring helpers not part of the extension surface. + Symbol("@threaded"), :_fixup_ad, :differentiation_rk_docstring, + # SciMLBase: not declared public on the registered release. :_unwrap_val, ), ), From deddb7de8501433a94552a047ffb332d0528dafd Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 08:53:25 -0400 Subject: [PATCH 078/108] Re-clean OrdinaryDiffEqTaylorSeries QA ignore list to genuine residual Drop the now-public OrdinaryDiffEqCore solver-author API names from the ExplicitImports ignore lists (they are declared `public` on this branch), keeping only the genuine residual: OrdinaryDiffEqCore names deliberately kept non-public, TaylorDiff/Symbolics/FunctionWrappers/TruncatedStacktraces externals, and Base internals. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl | 31 +++++++------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl b/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl index 4d631ad5cb6..3014a5bd1b9 100644 --- a/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl @@ -2,10 +2,9 @@ using SciMLTesting, OrdinaryDiffEqTaylorSeries, Test # Every name in the ignore lists below is genuinely internal (not exported and # not declared `public`) in its OWNER package, so there is no public name to -# migrate to. The vast majority are OrdinaryDiffEqCore solver-interface hooks -# (perform_step!/alg_cache/initialize!/controllers/etc.) that sublibraries must -# extend; once OrdinaryDiffEqCore marks them `public` these entries should be -# dropped (see SciML/OrdinaryDiffEq.jl#3776). +# migrate to. The base solver-author API (perform_step!/alg_cache/controllers/ +# etc.) is now declared `public` in OrdinaryDiffEqCore, so those entries have +# been dropped; only the genuine residual remains (see SciML/OrdinaryDiffEq.jl#3776). run_qa( OrdinaryDiffEqTaylorSeries; aqua_kwargs = (; @@ -17,17 +16,10 @@ run_qa( # Explicit imports of names that are not `public` in their owner. all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore solver-interface internals - Symbol("@cache"), :DerivativeOrderNotPossibleError, - :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqAlgorithm, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, - :alg_cache, :alg_stability_size, :explicit_rk_docstring, - :get_current_adaptive_order, :get_current_alg_order, - :get_fsalfirstlast, :perform_step!, :step_accept_controller!, - :stepsize_controller!, :trivial_limiter!, :unwrap_alg, - # DiffEqBase residual-calculation internals - :calculate_residuals, :calculate_residuals!, + # OrdinaryDiffEqCore internals deliberately kept non-public + # (not part of the solver-author extension API surface). + :DerivativeOrderNotPossibleError, :_ode_interpolant!, + :get_current_alg_order, :trivial_limiter!, # other-package internals with no public alias Symbol("@truncate_stacktrace"), :FunctionWrapper, ), @@ -35,15 +27,14 @@ run_qa( # Qualified accesses (Module.name) of non-public names. all_qualified_accesses_are_public = (; ignore = ( - # OrdinaryDiffEqCore stats/controller internals - :get_EEst, :increment_nf!, :set_EEst!, :sync_controllers!, - # lorenz/lorenz_oop test functions used in @compile_workload + # lorenz/lorenz_oop precompile-workload helpers (OrdinaryDiffEqCore, + # deliberately non-public per its public-API comment). :lorenz, :lorenz_oop, # TaylorDiff internals (no public API for these primitives) :append_coefficient, :flatten, :get_coefficient, :make_seed, :partials, - # SciMLBase / Base / Symbolics internals - :NoSpecialize, :RefValue, :variables, + # Base / Symbolics internals + :RefValue, :variables, ), ), ), From 803005c2bb9f2320010a764fd6bac5edabcc7510 Mon Sep 17 00:00:00 2001 From: Chris Rackauckas Date: Thu, 2 Jul 2026 08:54:13 -0400 Subject: [PATCH 079/108] Re-clean StochasticDiffEqCore QA ExplicitImports ignore lists Drop the now-public OrdinaryDiffEqCore/DiffEqBase solver-author API names and the SciMLBase abstract-type/alias-specifier names (already public on the resolved SciMLBase) from the EI ignore lists, keeping only the genuine residual: OrdinaryDiffEqCore loop/trait/noise internals still kept owner-internal, SciMLBase round-5 names pending #1412, DiffEqBase-re-exported `@..`, and non-public externals (ForwardDiff/JumpProcesses/DiffEqNoiseProcess/ Base). EI is green on Julia 1.12. Co-Authored-By: Chris Rackauckas --- lib/StochasticDiffEqCore/test/qa/qa.jl | 64 +++++++++----------------- 1 file changed, 22 insertions(+), 42 deletions(-) diff --git a/lib/StochasticDiffEqCore/test/qa/qa.jl b/lib/StochasticDiffEqCore/test/qa/qa.jl index 9b34dc6bd5a..f4e6e2f60c4 100644 --- a/lib/StochasticDiffEqCore/test/qa/qa.jl +++ b/lib/StochasticDiffEqCore/test/qa/qa.jl @@ -1,55 +1,35 @@ using SciMLTesting, StochasticDiffEqCore, Test using JET -# StochasticDiffEqCore is an extension package for OrdinaryDiffEqCore's solver -# loop: it dispatches on and extends OrdinaryDiffEqCore-internal traits/loop -# helpers and a handful of still-internal SciMLBase/DiffEqBase interface names. -# Every remaining EI ignore below is a genuinely non-public (or non-owner) name -# from an upstream package; each is documented with its source. Names that -# became public (SciMLBase abstract types, is_diagonal_noise, __solve/__init, -# DEVerbosity, etc.) were migrated to their public owners in src/ rather than -# ignored. See SciML/OrdinaryDiffEq.jl#3776. +# StochasticDiffEqCore extends OrdinaryDiffEqCore's solver loop and dispatches on +# a handful of still-internal SciMLBase/DiffEqBase interface names. The base +# packages (OrdinaryDiffEqCore/DiffEqBase) now declare their solver-author API +# public, so every name that became public was dropped from the ignore lists +# below. Each remaining ignore is a genuinely non-public (or non-owner) name +# from an upstream package, documented with its source. See +# SciML/OrdinaryDiffEq.jl#3776. -# OrdinaryDiffEqCore-internal names that this package dispatches on or extends. -# These are not part of OrdinaryDiffEqCore's public API; they need make-public -# upstream before they can be dropped from the ignore lists. +# OrdinaryDiffEqCore names this package dispatches on/extends that were kept +# owner-internal (loop/trait/autodiff/noise helpers not in the public +# solver-author surface). These need make-public upstream before they can drop. const ODEC_INTERNAL = ( - # Algorithm/cache supertypes + controllers/defaults (explicit imports) - :ODEIntegrator, :StochasticDiffEqAlgorithm, :StochasticDiffEqAdaptiveAlgorithm, - :StochasticDiffEqCompositeAlgorithm, :StochasticDiffEqRODEAlgorithm, - :StochasticDiffEqRODEAdaptiveAlgorithm, :StochasticDiffEqRODECompositeAlgorithm, - :StochasticDiffEqNewtonAdaptiveAlgorithm, :StochasticDiffEqNewtonAlgorithm, - :StochasticDiffEqJumpAlgorithm, :StochasticDiffEqJumpAdaptiveAlgorithm, - :StochasticDiffEqJumpNewtonAdaptiveAlgorithm, :StochasticDiffEqJumpDiffusionAlgorithm, - :StochasticDiffEqJumpDiffusionAdaptiveAlgorithm, - :StochasticDiffEqJumpNewtonDiffusionAdaptiveAlgorithm, - :StochasticDiffEqCache, :StochasticDiffEqConstantCache, :StochasticDiffEqMutableCache, - :beta1_default, :beta2_default, - :qmin_default, :qmax_default, :qsteady_min_default, :qsteady_max_default, - :issplit, :is_composite_algorithm, :perform_step!, :handle_callback_modifiers!, - # Loop/trait/autodiff helpers extended via qualified `OrdinaryDiffEqCore.x` - :DEOptions, :_determine_initdt, :_get_fdtype, :_get_fwd_chunksize, - :_get_fwd_chunksize_int, :_initialize_dae!, :_ode_init, :accept_noise!, - :alg_autodiff, :alg_difftype, :alg_extrapolates, :concrete_jac, :gamma_default, - :get_chunksize, :get_current_alg_autodiff, :get_fsalfirstlast, :has_autodiff, - :is_composite_cache, :is_constant_cache, :is_noise_saveable, :isfsal, - :noise_curt, :ode_determine_initdt, :reinit_noise!, :reject_noise!, - :save_noise!, :standardtag, + :_determine_initdt, :_get_fdtype, :_get_fwd_chunksize, :_get_fwd_chunksize_int, + :_initialize_dae!, :_ode_init, :accept_noise!, :concrete_jac, :get_chunksize, + :handle_callback_modifiers!, :has_autodiff, :is_noise_saveable, :noise_curt, + :ode_determine_initdt, :qsteady_max_default, :qsteady_min_default, + :reinit_noise!, :reject_noise!, :save_noise!, :standardtag, ) -# Still-internal SciMLBase interface names (problem/alg supertypes, alias -# specifiers, mass-matrix/initialization helpers, autodiff val unwrap). +# Still-internal SciMLBase interface names (pending SciMLBase#1412 round-5 +# make-public; not yet public on the registered SciMLBase this branch resolves). const SCIMLBASE_INTERNAL = ( - :AbstractRODEProblem, :AbstractSDDEProblem, :AbstractSDDEIntegrator, - :AlgorithmInterpretation, :alg_interpretation, :RODEAliasSpecifier, - :SDEAliasSpecifier, :__has_mass_matrix, :has_initializeprob, - :parameterless_type, :_unwrap_val, + :__has_mass_matrix, :_unwrap_val, :has_initializeprob, :parameterless_type, ) -# Still-internal DiffEqBase names. `@..` is owned by FastBroadcast and obtained -# through DiffEqBase's re-export (the standard SciML access path), so it is also -# listed in the via-owners ignore below. -const DIFFEQBASE_INTERNAL = (:prob2dtmin, :ODE_DEFAULT_UNSTABLE_CHECK, Symbol("@..")) +# `@..` is owned by FastBroadcast and reaches StochasticDiffEqCore through +# DiffEqBase's re-export (the standard SciML access path); it is non-public in +# DiffEqBase, so it is ignored for the are-public check as well as via-owners. +const DIFFEQBASE_INTERNAL = (Symbol("@.."),) # Non-public names from other upstream packages. const JUMPPROCESSES_INTERNAL = (:reset_jump_problem!, :resetted_jump_problem) From 2cbe0d7f27420b4daa562c583cc806a1367535a3 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:05:22 -0400 Subject: [PATCH 080/108] Re-clean OrdinaryDiffEqVerner QA ExplicitImports ignore list Drop names now declared public on this branch by OrdinaryDiffEqCore / DiffEqBase (PHASE A solver-author public API). Keep only the genuine residual: SciMLBase internals (has_lazy_interpolation/@def/_unwrap_val), OrdinaryDiffEqCore owner-internal codegen macros + cache/interpolation internals (@fold/@OnDemandTableauExtract/CompiledFloats/ DerivativeOrderNotPossibleError/_ode_interpolant!/trivial_limiter! and test-only lorenz/lorenz_oop), and the TruncatedStacktraces macro. Verified on Julia 1.12.6 against in-repo lib/* [sources]: QA 17/17 pass. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqVerner/test/qa/qa.jl | 27 +++++++++++--------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/lib/OrdinaryDiffEqVerner/test/qa/qa.jl b/lib/OrdinaryDiffEqVerner/test/qa/qa.jl index a5a34261413..094ca453ed9 100644 --- a/lib/OrdinaryDiffEqVerner/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqVerner/test/qa/qa.jl @@ -11,27 +11,22 @@ run_qa( # Qualified accesses to names that are not (yet) declared public by their owners. all_qualified_accesses_are_public = (; ignore = ( - # SciMLBase internals - :FunctionWrapperSpecialize, :NoSpecialize, :has_lazy_interpolation, - # OrdinaryDiffEqCore internals - :increment_nf!, :set_EEst!, :lorenz, :lorenz_oop, + # SciMLBase internals (not public on registered SciMLBase 3.30.x) + :has_lazy_interpolation, + # OrdinaryDiffEqCore test-only helpers (deliberately kept non-public) + :lorenz, :lorenz_oop, )), # Explicit imports of names not (yet) declared public by their owners. all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore internals (solver/cache/interpolation interface) - :accept_step_controller, :alg_cache, :alg_stability_size, :AutoAlgSwitch, - Symbol("@cache"), :CompiledFloats, :CompositeAlgorithm, :constvalue, - :DerivativeOrderNotPossibleError, :explicit_rk_docstring, Symbol("@fold"), - :get_fsalfirstlast, :isfsal, :_ode_addsteps!, :_ode_interpolant, - :_ode_interpolant!, Symbol("@OnDemandTableauExtract"), - :OrdinaryDiffEqAdaptiveAlgorithm, :OrdinaryDiffEqConstantCache, - :OrdinaryDiffEqMutableCache, :perform_step!, :trivial_limiter!, - :unwrap_alg, - # SciMLBase internals + # OrdinaryDiffEqCore owner-internal names (private codegen macros + + # cache/interpolation internals deliberately not part of the public + # solver-author API declared in PHASE A) + Symbol("@fold"), Symbol("@OnDemandTableauExtract"), + :CompiledFloats, :DerivativeOrderNotPossibleError, + :_ode_interpolant!, :trivial_limiter!, + # SciMLBase internals (not public on registered SciMLBase 3.30.x) Symbol("@def"), :_unwrap_val, - # DiffEqBase internals - :calculate_residuals, :calculate_residuals!, # TruncatedStacktraces internal macro Symbol("@truncate_stacktrace"), )), From 59bb6949a06f225def2764a780a87b80b5b53609 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:41:54 -0400 Subject: [PATCH 081/108] Make @cache public in StochasticDiffEqCore (solver-author cache API) The @cache macro is the cache-definition extension API imported by every StochasticDiffEq* solver subpackage to define their alg_cache structs and the associated full_cache/rand_cache/ratenoise_cache accessors. It mirrors the public @cache in OrdinaryDiffEqCore, so declare it public (not exported) via the same Expr(:public, ...) mechanism so ExplicitImports' public-API checks recognize it as the supported extension surface. Bump patch version. Co-Authored-By: Chris Rackauckas --- lib/StochasticDiffEqCore/Project.toml | 2 +- lib/StochasticDiffEqCore/src/StochasticDiffEqCore.jl | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/StochasticDiffEqCore/Project.toml b/lib/StochasticDiffEqCore/Project.toml index 07534467476..c08cc41a781 100644 --- a/lib/StochasticDiffEqCore/Project.toml +++ b/lib/StochasticDiffEqCore/Project.toml @@ -1,6 +1,6 @@ name = "StochasticDiffEqCore" uuid = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f" -version = "2.0.2" +version = "2.0.3" authors = ["Chris Rackauckas "] [deps] diff --git a/lib/StochasticDiffEqCore/src/StochasticDiffEqCore.jl b/lib/StochasticDiffEqCore/src/StochasticDiffEqCore.jl index b9e8d4cb6c2..f470c59fd4c 100644 --- a/lib/StochasticDiffEqCore/src/StochasticDiffEqCore.jl +++ b/lib/StochasticDiffEqCore/src/StochasticDiffEqCore.jl @@ -165,4 +165,13 @@ export TauLeapingDrift # General functions export solve, init, solve!, step! +# `@cache` is the cache-definition extension macro that downstream StochasticDiffEq +# solver subpackages import to define their `alg_cache` structs plus the associated +# `full_cache`/`rand_cache`/`ratenoise_cache` accessors (mirrors the public `@cache` +# in OrdinaryDiffEqCore). It is made public (not exported) so ExplicitImports' +# public-API checks recognize it as the supported solver-author surface. +@static if VERSION >= v"1.11.0-DEV.469" + eval(Expr(:public, Symbol("@cache"))) +end + end # module From 9bcb23f365b38e3ffdbdeecb42e584f684804cb7 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:44:25 -0400 Subject: [PATCH 082/108] Publicize OrdinaryDiffEqCore round-2 cross-sublib extension API Round 2 of the make-public sweep: declares public the remaining OrdinaryDiffEqCore-owned names that solver sublibs qualify-access as supported extension API but which PHASE A did not yet cover. Covers error/sentinel types (CompiledFloats, DerivativeOrderNotPossibleError, DifferentialVarsUndefined), interpolation kernels, algorithm-trait predicates, order/stepsize/AD-config accessors, integrator step/cache/init hooks, SDE/RODE noise hooks, and the docstring builder. Genuine codegen/perf macros (@fold/@threaded/@OnDemandTableauExtract/@swap!) and precompile-only helpers (lorenz/lorenz_oop) remain private. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqCore.jl | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl b/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl index c66bc5d0406..d1b7cd834cf 100644 --- a/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl +++ b/lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl @@ -242,6 +242,31 @@ include("precompilation_setup.jl") :StochasticDiffEqJumpDiffusionAlgorithm, :StochasticDiffEqJumpNewtonAdaptiveAlgorithm, :StochasticDiffEqJumpNewtonDiffusionAdaptiveAlgorithm, :StochasticDiffEqMutableCache, :StochasticDiffEqNewtonAdaptiveAlgorithm, :StochasticDiffEqNewtonAlgorithm, :StochasticDiffEqRODEAdaptiveAlgorithm, :StochasticDiffEqRODEAlgorithm, :StochasticDiffEqRODECompositeAlgorithm, :strip_cache, :sync_controllers!, :TryAgain, :unwrap_alg, :uses_uprev, :VerySlowConvergence, + # Round 2: remaining cross-sublib / extension surface owned by OrdinaryDiffEqCore. + # Error / sentinel / dispatch-helper types shared across solver sublibs. + :CompiledFloats, :DerivativeOrderNotPossibleError, :DifferentialVarsUndefined, + # Interpolation kernels (companions to the public _ode_interpolant / ode_addsteps!). + :_ode_interpolant!, :ode_interpolant, :ode_interpolant!, :hermite_interpolant!, + :current_extrapolant!, :interpolation_differential_vars, + # Algorithm-trait predicates extended/queried by solver sublibs. + :standardtag, :concrete_jac, :has_autodiff, :has_dtnew_modification, + :has_special_newton_error, :has_stiff_interpolation, :alg_can_repeat_jac, + :allows_null_u0, :isaposteriori, :isdiscretealg, :isdiscretecache, :isdp8, + :isesdirk, :isfirk, :isnewton, :only_diagonal_mass_matrix, :fsal_typeof, + :ssp_coefficient, :fac_default_gamma, :qsteady_max_default, :qsteady_min_default, + # Order / stepsize / autodiff-config accessors used across sublibs. + :get_current_alg_order, :get_current_qmax, :get_chunksize, :_get_fdtype, + :_get_fwd_chunksize, :_get_fwd_chunksize_int, :_fixup_ad, :diffdir, + :error_constant, :unitfulvalue, + # Integrator step / cache / initialization hooks. + :_ode_init, :_determine_initdt, :ode_determine_initdt, :_initialize_dae!, + :postamble!, :apply_step!, :last_step_failed, :reset_alg_dependent_opts!, + :handle_callback_modifiers!, :set_discontinuity, :resolve_basic, + # Noise hooks used by the SDE/RODE solver sublibs. + :accept_noise!, :reinit_noise!, :reject_noise!, :save_noise!, :noise_curt, + :is_noise_saveable, + # Docstring builder used by solver sublibs. + :differentiation_rk_docstring, )) end From 6f3ece2a8f7df3f687997d96e8c4afefff34c0a9 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:46:15 -0400 Subject: [PATCH 083/108] QA: mark cross-sublibrary cache/tableau types public Declare the cache/tableau types that other OrdinaryDiffEq solver sublibraries reference cross-sublibrary as public in their owning sublibraries, so ExplicitImports recognizes them as a supported extension API rather than non-public internal access: - OrdinaryDiffEqLowOrderRK: BS3Cache, BS3ConstantCache, RK4Cache, RK4ConstantCache (used by OrdinaryDiffEqAdamsBashforthMoulton) - OrdinaryDiffEqTsit5: Tsit5Cache, Tsit5ConstantCache (used by OrdinaryDiffEqNordsieck) - OrdinaryDiffEqSDIRK: ESDIRKIMEXCache, ESDIRKIMEXConstantCache, ImplicitEulerESDIRKIMEXTableau (used by OrdinaryDiffEqBDF) - OrdinaryDiffEqRosenbrock: RosenbrockMutableCache (used by DelayDiffEq) Uses the existing version-guarded Expr(:public, ...) mechanism (matching OrdinaryDiffEqDifferentiation). Bumps each edited sublibrary's patch version. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqLowOrderRK/Project.toml | 2 +- .../src/OrdinaryDiffEqLowOrderRK.jl | 9 +++++++++ lib/OrdinaryDiffEqRosenbrock/Project.toml | 2 +- .../src/OrdinaryDiffEqRosenbrock.jl | 8 ++++++++ lib/OrdinaryDiffEqSDIRK/Project.toml | 2 +- lib/OrdinaryDiffEqSDIRK/src/OrdinaryDiffEqSDIRK.jl | 10 ++++++++++ lib/OrdinaryDiffEqTsit5/Project.toml | 2 +- lib/OrdinaryDiffEqTsit5/src/OrdinaryDiffEqTsit5.jl | 8 ++++++++ 8 files changed, 39 insertions(+), 4 deletions(-) diff --git a/lib/OrdinaryDiffEqLowOrderRK/Project.toml b/lib/OrdinaryDiffEqLowOrderRK/Project.toml index 8ef9657128b..b6c5db207b8 100644 --- a/lib/OrdinaryDiffEqLowOrderRK/Project.toml +++ b/lib/OrdinaryDiffEqLowOrderRK/Project.toml @@ -1,7 +1,7 @@ name = "OrdinaryDiffEqLowOrderRK" uuid = "1344f307-1e59-4825-a18e-ace9aa3fa4c6" authors = ["ParamThakkar123 "] -version = "2.1.1" +version = "2.1.2" [deps] MuladdMacro = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" diff --git a/lib/OrdinaryDiffEqLowOrderRK/src/OrdinaryDiffEqLowOrderRK.jl b/lib/OrdinaryDiffEqLowOrderRK/src/OrdinaryDiffEqLowOrderRK.jl index c6c26631687..b4d4181b137 100644 --- a/lib/OrdinaryDiffEqLowOrderRK/src/OrdinaryDiffEqLowOrderRK.jl +++ b/lib/OrdinaryDiffEqLowOrderRK/src/OrdinaryDiffEqLowOrderRK.jl @@ -49,4 +49,13 @@ export Euler, SplitEuler, Heun, Ralston, Midpoint, RK4, Alshina2, Alshina3, Alshina6, AutoDP5, Ralston4 +# Cross-sublibrary cache/tableau types that other OrdinaryDiffEq solver +# sublibraries (e.g. OrdinaryDiffEqAdamsBashforthMoulton) reference to reuse +# these low-order RK steps. Marked public so those references are recognized as +# a supported extension API rather than internal access. +@static if VERSION >= v"1.11.0-DEV.469" + eval(Expr(:public, + :BS3Cache, :BS3ConstantCache, :RK4Cache, :RK4ConstantCache)) +end + end diff --git a/lib/OrdinaryDiffEqRosenbrock/Project.toml b/lib/OrdinaryDiffEqRosenbrock/Project.toml index c36958ede50..6121c0ca912 100644 --- a/lib/OrdinaryDiffEqRosenbrock/Project.toml +++ b/lib/OrdinaryDiffEqRosenbrock/Project.toml @@ -1,6 +1,6 @@ name = "OrdinaryDiffEqRosenbrock" uuid = "43230ef6-c299-4910-a778-202eb28ce4ce" -version = "2.3.1" +version = "2.3.2" authors = ["ParamThakkar123 "] [deps] diff --git a/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl b/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl index 3a8346fb437..ee5192bf528 100644 --- a/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl +++ b/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl @@ -215,4 +215,12 @@ export Rosenbrock23, Rosenbrock32, RosShamp4, Veldd4, Velds4, GRK4T, GRK4A, ROS3PRL, ROS3PRL2, ROK4a, ROS2, ROS2PR, ROS2S, ROS3, ROS3PR, Scholz4_7 +# Abstract Rosenbrock cache supertype that other OrdinaryDiffEq consumers +# (e.g. DelayDiffEq) reference to special-case Rosenbrock cache resizing. +# Marked public so that cross-package reference is recognized as a supported +# extension API rather than internal access. +@static if VERSION >= v"1.11.0-DEV.469" + eval(Expr(:public, :RosenbrockMutableCache)) +end + end diff --git a/lib/OrdinaryDiffEqSDIRK/Project.toml b/lib/OrdinaryDiffEqSDIRK/Project.toml index 4c848307f80..7c7a82aa6ad 100644 --- a/lib/OrdinaryDiffEqSDIRK/Project.toml +++ b/lib/OrdinaryDiffEqSDIRK/Project.toml @@ -1,7 +1,7 @@ name = "OrdinaryDiffEqSDIRK" uuid = "2d112036-d095-4a1e-ab9a-08536f3ecdbf" authors = ["ParamThakkar123 "] -version = "2.7.1" +version = "2.7.2" [deps] ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" diff --git a/lib/OrdinaryDiffEqSDIRK/src/OrdinaryDiffEqSDIRK.jl b/lib/OrdinaryDiffEqSDIRK/src/OrdinaryDiffEqSDIRK.jl index 7cbc0e174e6..deda6d93501 100644 --- a/lib/OrdinaryDiffEqSDIRK/src/OrdinaryDiffEqSDIRK.jl +++ b/lib/OrdinaryDiffEqSDIRK/src/OrdinaryDiffEqSDIRK.jl @@ -133,4 +133,14 @@ PrecompileTools.@compile_workload begin solver_list = nothing end +# Cross-sublibrary IMEX cache/tableau API that other OrdinaryDiffEq solver +# sublibraries (e.g. OrdinaryDiffEqBDF) reference to build IMEX methods on top +# of the ESDIRK-IMEX machinery. Marked public so those references are +# recognized as a supported extension API rather than internal access. +@static if VERSION >= v"1.11.0-DEV.469" + eval(Expr(:public, + :ESDIRKIMEXCache, :ESDIRKIMEXConstantCache, + :ImplicitEulerESDIRKIMEXTableau)) +end + end diff --git a/lib/OrdinaryDiffEqTsit5/Project.toml b/lib/OrdinaryDiffEqTsit5/Project.toml index b68220ea56e..798ff5bdfb7 100644 --- a/lib/OrdinaryDiffEqTsit5/Project.toml +++ b/lib/OrdinaryDiffEqTsit5/Project.toml @@ -1,6 +1,6 @@ name = "OrdinaryDiffEqTsit5" uuid = "b1df2697-797e-41e3-8120-5422d3b24e4a" -version = "2.0.2" +version = "2.0.3" authors = ["ParamThakkar123 "] [deps] diff --git a/lib/OrdinaryDiffEqTsit5/src/OrdinaryDiffEqTsit5.jl b/lib/OrdinaryDiffEqTsit5/src/OrdinaryDiffEqTsit5.jl index 02950a98073..5f025dbb3e3 100644 --- a/lib/OrdinaryDiffEqTsit5/src/OrdinaryDiffEqTsit5.jl +++ b/lib/OrdinaryDiffEqTsit5/src/OrdinaryDiffEqTsit5.jl @@ -107,4 +107,12 @@ end export Tsit5, AutoTsit5 +# Cross-sublibrary cache types that other OrdinaryDiffEq solver sublibraries +# (e.g. OrdinaryDiffEqNordsieck) reference to reuse the Tsit5 step. Marked +# public so those references are recognized as a supported extension API rather +# than internal access. +@static if VERSION >= v"1.11.0-DEV.469" + eval(Expr(:public, :Tsit5Cache, :Tsit5ConstantCache)) +end + end From 56ef321567ab29782a0108467efeb1e047a811e1 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:52:04 -0400 Subject: [PATCH 084/108] ImplicitDiscreteSolve QA: re-clean EI ignores after PHASE A make-public Drop stale ExplicitImports ignores that became public on this branch (OrdinaryDiffEqCore round-2 make-public: isdiscretecache, isdiscretealg, _initialize_dae!, allows_null_u0, resolve_basic). The all_explicit_imports_are_public list is now empty (all four names public), so it is removed entirely. The all_qualified_accesses_are_public list is trimmed to the genuine residual: _resolved_QT (OrdinaryDiffEqCore owner-internal, deliberately non-public) plus external non-public names from NonlinearSolveBase (get_fu/get_u/not_terminated/ update_from_termination_cache!/update_trace!) and SciMLBase (has_initializeprob). Co-Authored-By: Chris Rackauckas --- lib/ImplicitDiscreteSolve/test/qa/qa.jl | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/lib/ImplicitDiscreteSolve/test/qa/qa.jl b/lib/ImplicitDiscreteSolve/test/qa/qa.jl index 4be9f2b49b0..b9b405db284 100644 --- a/lib/ImplicitDiscreteSolve/test/qa/qa.jl +++ b/lib/ImplicitDiscreteSolve/test/qa/qa.jl @@ -5,18 +5,11 @@ run_qa( aqua_kwargs = (; piracies = false), explicit_imports = true, ei_kwargs = (; - # OrdinaryDiffEqCore solver-internal predicates/hooks that remain - # non-public: DAE-init entry point, discrete-cache/algorithm predicates, - # and null-u0 support flag. Not part of the make-public extension surface. - all_explicit_imports_are_public = (; - ignore = ( - :isdiscretecache, :isdiscretealg, :_initialize_dae!, :allows_null_u0, - ), - ), all_qualified_accesses_are_public = (; ignore = ( - # OrdinaryDiffEqCore controller-resolution internals (non-public). - :_resolved_QT, :resolve_basic, + # OrdinaryDiffEqCore controller-resolution internal (owner-internal, + # deliberately kept non-public in the make-public extension surface). + :_resolved_QT, # NonlinearSolveBase solver internals (external, not public). :get_fu, :get_u, :not_terminated, :update_from_termination_cache!, :update_trace!, From 4c76ac1f596145c5e578237c8f45ace682910506 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:53:12 -0400 Subject: [PATCH 085/108] DiffEqDevTools QA: re-clean EI ignore list after public-API decls The base packages now declare their solver-author API public on this branch (PHASE A), and SciMLBase's round-5 abstract problem/solution/algorithm types (AbstractBVProblem/AbstractRODEProblem/AbstractSDDEProblem/AbstractDDEAlgorithm/ AbstractODESolution) are public in the resolved SciMLBase 3.30.1. DiffEqBase's ConvergenceSetup/ODERKTableau are likewise public on the in-repo copy. Drop those 7 now-public names from the ExplicitImports ignore lists, leaving only the genuine SciMLBase-owned-but-not-public residual: allowedkeywords and calculate_ensemble_errors (qualified accesses) and @def (explicit import). Verified on Julia 1.12 against the in-repo lib/* [sources]: run_qa EI green (6/6, 0 flagged). Co-Authored-By: Chris Rackauckas --- lib/DiffEqDevTools/test/qa/qa.jl | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/DiffEqDevTools/test/qa/qa.jl b/lib/DiffEqDevTools/test/qa/qa.jl index 858928d820a..9752cb7d476 100644 --- a/lib/DiffEqDevTools/test/qa/qa.jl +++ b/lib/DiffEqDevTools/test/qa/qa.jl @@ -8,20 +8,15 @@ run_qa( ), explicit_imports = true, ei_kwargs = (; - # SciMLBase-owned solver-interface predicates that are accessed via SciMLBase - # (their owner) but not yet declared `public` there. + # SciMLBase-owned solver-interface predicates accessed via SciMLBase (their + # owner) but not declared `public` in the registered SciMLBase release. all_qualified_accesses_are_public = (; ignore = (:allowedkeywords, :calculate_ensemble_errors), ), - # Abstract problem/solution/algorithm types + `@def` are owned by SciMLBase but - # not yet `public` there; `ConvergenceSetup`/`ODERKTableau` live only in DiffEqBase - # (not re-exported by SciMLBase) and are likewise not `public`. + # SciMLBase-owned `@def`, imported from SciMLBase (its owner) but not declared + # `public` in the registered SciMLBase release. all_explicit_imports_are_public = (; - ignore = ( - :AbstractDDEAlgorithm, :AbstractODESolution, :AbstractRODEProblem, - :AbstractSDDEProblem, :AbstractBVProblem, Symbol("@def"), - :ConvergenceSetup, :ODERKTableau, - ), + ignore = (Symbol("@def"),), ), ), ) From e1269b21ac03962117b6cdc07ef40904ed61f02c Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:53:16 -0400 Subject: [PATCH 086/108] Re-clean OrdinaryDiffEqFunctionMap QA ignore list after public decls Later OrdinaryDiffEqCore public-API commits on this branch now cover the three solver-internal hooks (_ode_interpolant!/isdiscretealg/isdiscretecache) that the prior pass still ignored under all_explicit_imports_are_public, so drop that whole block. The only genuine residual is the two SciMLBase-owned non-public default-solve sentinels (DISCRETE_INPLACE_DEFAULT/DISCRETE_OUTOFPLACE_DEFAULT). Verified green: run_qa ExplicitImports 6/6 on Julia 1.12. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl b/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl index 50eff28d8dc..ef0ba066122 100644 --- a/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqFunctionMap/test/qa/qa.jl @@ -5,11 +5,6 @@ run_qa( aqua_kwargs = (; piracies = false), # piracy is needed for default-algorithm dispatch explicit_imports = true, ei_kwargs = (; - # OrdinaryDiffEqCore-owned solver-internal hooks that FunctionMap extends but - # that are not (yet) in OrdinaryDiffEqCore's public-API declaration. - all_explicit_imports_are_public = (; - ignore = (:_ode_interpolant!, :isdiscretealg, :isdiscretecache), - ), # SciMLBase-owned default-solve sentinels; non-public in SciMLBase. all_qualified_accesses_are_public = (; ignore = (:DISCRETE_INPLACE_DEFAULT, :DISCRETE_OUTOFPLACE_DEFAULT), From 75eb4b8640acdb574ca6ab6424aa7994e5d82992 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:55:51 -0400 Subject: [PATCH 087/108] Re-clean OrdinaryDiffEqExplicitRK QA EI ignore lists after round-2 public decls The OrdinaryDiffEqCore round-2 make-public sweep (cc11e02) declared DerivativeOrderNotPossibleError, _ode_interpolant!, hermite_interpolant!, and interpolation_differential_vars `public`, so they no longer need to be ignored in the ExplicitImports public-API checks. Trimmed the ignore lists from 7 to 3 entries. The empty-ignore probe on Julia 1.12 (native [sources] developing the on-branch lib/OrdinaryDiffEqCore + lib/DiffEqBase) flags only three genuine externals, which are kept: - @truncate_stacktrace (TruncatedStacktraces) - @nexprs, @nif (Base.Cartesian codegen macros) Verified on Julia 1.12: run_qa ExplicitImports 6/6 pass, 0 flagged. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl b/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl index 3cb18cf17a1..ecd43246396 100644 --- a/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExplicitRK/test/qa/qa.jl @@ -6,17 +6,12 @@ run_qa( ei_kwargs = (; all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore solver-internal names still kept non-public - # (the `!`/error variants were not part of the make-public surface). - :DerivativeOrderNotPossibleError, :_ode_interpolant!, # TruncatedStacktraces-owned macro (external, not `public`). Symbol("@truncate_stacktrace"), ), ), all_qualified_accesses_are_public = (; ignore = ( - # OrdinaryDiffEqCore solver-internal interpolation hooks kept non-public. - :interpolation_differential_vars, :hermite_interpolant!, # Base.Cartesian codegen macros (external, not `public`). Symbol("@nexprs"), Symbol("@nif"), ), From 3854e15f85625883535afb779b865ab58e97c91b Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:56:54 -0400 Subject: [PATCH 088/108] Drop now-public DECache from OrdinaryDiffEqCore QA EI ignore list SciMLBase 3.30.1 declares DECache public, so the qualified access SciMLBase.DECache no longer needs an all_qualified_accesses_are_public ignore entry. Verified on Julia 1.12 against the on-branch lib/* sources (DiffEqBase in-repo, SciMLBase 3.30.1 registry): run_qa passes 15/15 with the tightened list. Remaining residual is genuine (still-non-public SciMLBase internals, EnzymeCore/SciMLOperators/FastPower/FunctionWrappers/ TruncatedStacktraces/ConstructionBase externals, Base/Core internals, the DiffEqBase _process_verbose_param internal, and OrdinaryDiffEqCore's own re-exported names for dependent sublibraries). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqCore/test/qa/qa.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/OrdinaryDiffEqCore/test/qa/qa.jl b/lib/OrdinaryDiffEqCore/test/qa/qa.jl index ed26b1359e1..b5624c83158 100644 --- a/lib/OrdinaryDiffEqCore/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqCore/test/qa/qa.jl @@ -39,7 +39,7 @@ run_qa( # EnzymeCore / EnzymeCore.EnzymeRules internals :EnzymeRules, :inactive_noinl, # SciMLBase internals with no public replacement yet - :DECache, :enable_interpolation_sensitivitymode, + :enable_interpolation_sensitivitymode, :forwarddiff_chunksize, :get_root_indp, :get_save_idxs_and_saved_subsystem, :has_initializeprob, :has_lazy_interpolation, :late_binding_update_u0_p, :remaker_of, From b6b5adb382387df9fe67acf02bc7dac88e7d2b3e Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:56:58 -0400 Subject: [PATCH 089/108] Re-clean OrdinaryDiffEqHighOrderRK QA explicit-imports ignore lists (phase B) Now that the on-branch OrdinaryDiffEqCore declares its solver-author extension API public, four names that were previously ignored in all_explicit_imports_are_public have become public and are dropped: CompiledFloats, DerivativeOrderNotPossibleError, _ode_interpolant!, isdp8. The genuine residual is only: - @tight_loop_macros (DiffEqBase-internal codegen macro, still non-public upstream; also the no_stale false positive from @muladd-hidden usage). - trivial_limiter! (OrdinaryDiffEqCore-internal no-op limiter default, deliberately kept non-public). Verified on Julia 1.12 against the in-repo lib/* [sources]: ExplicitImports 6/6 pass, full Quality Assurance 17/17. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl b/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl index 6f76f22209e..07750eecc2f 100644 --- a/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqHighOrderRK/test/qa/qa.jl @@ -16,11 +16,9 @@ run_qa( ignore = ( # DiffEqBase-internal codegen macro (not declared public upstream). Symbol("@tight_loop_macros"), - # OrdinaryDiffEqCore internals deliberately kept non-public: the - # precompile-float helper, the derivative-order error type, the - # mutating interpolant helper, and the DP8/limiter internals. - :CompiledFloats, :DerivativeOrderNotPossibleError, - :_ode_interpolant!, :isdp8, :trivial_limiter!, + # OrdinaryDiffEqCore-internal no-op limiter default, deliberately + # kept non-public. + :trivial_limiter!, ), ), ), From c70c393635cafc7ca78216bca79fadde4d799619 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:58:03 -0400 Subject: [PATCH 090/108] QA: re-clean AdamsBashforthMoulton EI ignores after LowOrderRK public decls Drop BS3Cache/BS3ConstantCache/RK4Cache/RK4ConstantCache now that they are declared public in OrdinaryDiffEqLowOrderRK. Only trivial_limiter! (OrdinaryDiffEqCore, deliberately owner-internal) remains ignored. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl index c9719b75f9a..fde19946ece 100644 --- a/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqAdamsBashforthMoulton/test/qa/qa.jl @@ -6,10 +6,8 @@ run_qa( ei_kwargs = ( all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqLowOrderRK starter-cache types (owner-internal; - # kept non-public — used only as the multistep bootstrap cache). - :BS3Cache, :BS3ConstantCache, :RK4Cache, :RK4ConstantCache, - # OrdinaryDiffEqCore internal limiter hook (owner-internal). + # OrdinaryDiffEqCore internal limiter hook (owner-internal; + # deliberately not declared public, like the @fold/@threaded codegen macros). :trivial_limiter!, )), ), From 8375888bbab0329988dea7da29f38eec74a28346 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:58:30 -0400 Subject: [PATCH 091/108] Re-clean OrdinaryDiffEqExtrapolation QA EI ignore list (PHASE B) Drop the now-public OrdinaryDiffEqCore names (CompiledFloats, _fixup_ad, differentiation_rk_docstring, get_current_alg_order, reset_alg_dependent_opts!, resolve_basic) that are declared public on this branch. Keep only the genuine residual: OrdinaryDiffEqCore's private @threaded macro and _resolved_QT helper, plus upstream SciMLBase/FastPower/Base.Threads internals with no public replacement. Verified run_qa EI green (17/17) on Julia 1.12. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl b/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl index 1f0f25c41d7..759afc97903 100644 --- a/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExtrapolation/test/qa/qa.jl @@ -1,29 +1,28 @@ using SciMLTesting, OrdinaryDiffEqExtrapolation, Test # After the solver-author extension API was declared `public` in OrdinaryDiffEqCore / -# OrdinaryDiffEqDifferentiation / DiffEqBase, the only remaining ExplicitImports -# public-API exceptions are the genuinely-internal names below that have no public -# replacement yet. They are imported/accessed from their true owner module, so only -# the two public-API checks flag them; everything else is clean. -# Each name is tracked for a future make-public pass; see SciML/OrdinaryDiffEq.jl#3776. +# OrdinaryDiffEqDifferentiation / OrdinaryDiffEqNonlinearSolve / DiffEqBase, the only +# remaining ExplicitImports public-API exceptions are the genuinely-internal names +# below that have no public replacement: OrdinaryDiffEqCore's private `@threaded` +# codegen macro and `_resolved_QT` controller helper, plus a handful of upstream +# (SciMLBase / FastPower / Base.Threads) internals. Everything else is clean. +# Tracked for a future make-public pass; see SciML/OrdinaryDiffEq.jl#3776. run_qa( OrdinaryDiffEqExtrapolation; explicit_imports = true, ei_kwargs = (; all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore owner-internal (codegen macro + perf/docstring/order helpers) - Symbol("@threaded"), :CompiledFloats, :_fixup_ad, - :differentiation_rk_docstring, :get_current_alg_order, - :reset_alg_dependent_opts!, - # SciMLBase internals (reshaping / val-unwrap helpers) + # OrdinaryDiffEqCore private codegen macro (deliberately kept non-public) + Symbol("@threaded"), + # SciMLBase internals (reshaping / val-unwrap helpers, no public replacement) :_reshape, :_unwrap_val, :_vec, ), ), all_qualified_accesses_are_public = (; ignore = ( # OrdinaryDiffEqCore owner-internal (controller QT resolution) - :_resolved_QT, :resolve_basic, + :_resolved_QT, # other upstream internals :fastpower, # FastPower :has_Wfact, # SciMLBase From a7f6c8a1c1cc1a97b51b49dfafcc8516195e8bc8 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 09:59:44 -0400 Subject: [PATCH 092/108] Re-clean OrdinaryDiffEqExponentialRK QA explicit-imports ignore list Now that OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation / DiffEqBase declare their solver-author extension API public on this branch, drop the now-redundant ignore entries. Only three genuine residuals remain: _fixup_ad / fsal_typeof (OrdinaryDiffEqCore owner-internal helpers) and _unwrap_val (SciMLBase, pending #1412). The whole all_qualified_accesses_are_public ignore list is now empty and removed. Wire DiffEqBase and OrdinaryDiffEqDifferentiation as in-repo [sources] so the QA env resolves the on-branch public declarations. Co-Authored-By: Chris Rackauckas --- .../test/qa/Project.toml | 18 +++++++----- lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl | 29 ++++--------------- 2 files changed, 16 insertions(+), 31 deletions(-) diff --git a/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml b/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml index fdde9ed9932..f21fc7c8b64 100644 --- a/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml +++ b/lib/OrdinaryDiffEqExponentialRK/test/qa/Project.toml @@ -1,25 +1,29 @@ [deps] AllocCheck = "9b6a8646-10ed-4001-bbdc-1d2f46dfbb1a" Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +OrdinaryDiffEqDifferentiation = "4302a76b-040a-498a-8c04-15b101fed76b" OrdinaryDiffEqExponentialRK = "e0540318-69ee-4070-8777-9e2de6de23de" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -[sources.OrdinaryDiffEqExponentialRK] -path = "../../" - -[sources.OrdinaryDiffEqCore] -path = "../../../OrdinaryDiffEqCore" +[sources] +DiffEqBase = {path = "../../../DiffEqBase"} +OrdinaryDiffEqCore = {path = "../../../OrdinaryDiffEqCore"} +OrdinaryDiffEqDifferentiation = {path = "../../../OrdinaryDiffEqDifferentiation"} +OrdinaryDiffEqExponentialRK = {path = "../.."} [compat] AllocCheck = "0.2" Aqua = "0.8.11" +DiffEqBase = "7" JET = "0.9, 0.11" -SciMLTesting = "1.7" -julia = "1.10" OrdinaryDiffEqCore = "4" +OrdinaryDiffEqDifferentiation = "3" OrdinaryDiffEqExponentialRK = "2" SciMLBase = "3" +SciMLTesting = "1.7" +julia = "1.10" diff --git a/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl b/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl index 0ebab97d20d..4514bf7907c 100644 --- a/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqExponentialRK/test/qa/qa.jl @@ -4,32 +4,13 @@ run_qa( OrdinaryDiffEqExponentialRK; explicit_imports = true, ei_kwargs = ( - # Internal (non-public) names from sibling solver packages and SciMLBase - # that have no public replacement yet. Tracked in SciML/OrdinaryDiffEq.jl#3776 - # for upstream `public` declarations. all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore internals - Symbol("@cache"), :ExponentialAlgorithm, - :OrdinaryDiffEqAdaptiveExponentialAlgorithm, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqExponentialAlgorithm, - :OrdinaryDiffEqMutableCache, :alg_cache, :alg_adaptive_order, - :fsal_typeof, :generic_solver_docstring, :get_fsalfirstlast, - :isdtchangeable, :ismultistep, :perform_step!, :unwrap_alg, - :_fixup_ad, :full_cache, - # SciMLBase internals - :_unwrap_val, :UDerivativeWrapper, :UJacobianWrapper, - # DiffEqBase internals - :calculate_residuals, :calculate_residuals!, - # OrdinaryDiffEqDifferentiation internals - :build_jac_config, :calc_J, :calc_J!, - )), - all_qualified_accesses_are_public = (; - ignore = ( - # OrdinaryDiffEqCore internals - :increment_nf!, :set_EEst!, - # DiffEqBase internal - :prepare_alg, + # OrdinaryDiffEqCore owner-internal helpers (deliberately not in the + # solver-author public API surface declared upstream). + :_fixup_ad, :fsal_typeof, + # SciMLBase internal; pending a `public` declaration (SciMLBase#1412). + :_unwrap_val, )), ), ) From fac50470534f525cd28a8f7bf0f622dbb097a055 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:01:50 -0400 Subject: [PATCH 093/108] OrdinaryDiffEqRKN: tighten QA EI ignore to genuine residual (phase B) Empty-ignore EI probe on the branch (Core/RKN/DiffEqBase dev'd from lib/* so the PHASE A public decls apply) flags only `@def` (SciMLBase) and `@tight_loop_macros` (DiffEqBase), both owner-internal codegen/perf macros. Drop the now-public `CompiledFloats` and `_ode_interpolant!` (OrdinaryDiffEqCore made them public on this branch). All 6 EI checks pass. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqRKN/test/qa/qa.jl | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/lib/OrdinaryDiffEqRKN/test/qa/qa.jl b/lib/OrdinaryDiffEqRKN/test/qa/qa.jl index c1164acf77a..e1d6e31e47b 100644 --- a/lib/OrdinaryDiffEqRKN/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqRKN/test/qa/qa.jl @@ -4,19 +4,12 @@ run_qa( OrdinaryDiffEqRKN; explicit_imports = true, ei_kwargs = (; - # Genuine solver-author internals that their owners deliberately keep - # non-public. Everything OrdinaryDiffEqCore/DiffEqBase made public for the - # solver extension API has been dropped; drop each remaining entry once its - # owner marks it public upstream (tracked in SciML/OrdinaryDiffEq.jl#3776). all_explicit_imports_are_public = (; ignore = ( - # SciMLBase codegen macro (owner keeps non-public) + # SciMLBase codegen macro, deliberately kept non-public by its owner. Symbol("@def"), - # DiffEqBase perf macro (owner keeps non-public) + # DiffEqBase perf macro, deliberately kept non-public by its owner. Symbol("@tight_loop_macros"), - # OrdinaryDiffEqCore internals not in the public extension API - # (the non-bang `_ode_interpolant` is public; the `!`-variant is not) - :CompiledFloats, :_ode_interpolant!, ), ), ), From dfef6d511df53f5a9297edad471e27b91cdd9024 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:03:21 -0400 Subject: [PATCH 094/108] Re-clean OrdinaryDiffEqPDIRK QA ignore list after PHASE A public decls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop dead ignore entries (_fixup_ad, differentiation_rk_docstring — never imported by PDIRK) now that the base solver-author API is declared public. Residual: @threaded (OrdinaryDiffEqCore private codegen macro) and _unwrap_val (non-public on the registered SciMLBase release). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl index cd5e2e1c99a..6c1c594e198 100644 --- a/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqPDIRK/test/qa/qa.jl @@ -6,11 +6,9 @@ run_qa( ei_kwargs = (; all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore: solver-author API is public, but these three - # are deliberately kept non-public upstream. `@threaded` is a - # codegen/perf macro; `_fixup_ad` and `differentiation_rk_docstring` - # are AD-fixup / docstring helpers not part of the extension surface. - Symbol("@threaded"), :_fixup_ad, :differentiation_rk_docstring, + # OrdinaryDiffEqCore: `@threaded` is a private codegen/perf macro, + # deliberately kept non-public upstream (owner-internal). + Symbol("@threaded"), # SciMLBase: not declared public on the registered release. :_unwrap_val, ), From 0704bcbdf2e266a64cb941378f05656788308eb7 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:04:26 -0400 Subject: [PATCH 095/108] Re-clean OrdinaryDiffEqSymplecticRK QA EI ignore list (PHASE B) CompiledFloats is now public in OrdinaryDiffEqCore on this branch (PHASE A), so the sole all_explicit_imports_are_public ignore is redundant. All six ExplicitImports checks pass with empty ignore lists on Julia 1.12. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl b/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl index c0ef6602d0e..0ec74dcfcbc 100644 --- a/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqSymplecticRK/test/qa/qa.jl @@ -3,11 +3,4 @@ using SciMLTesting, OrdinaryDiffEqSymplecticRK, Test run_qa( OrdinaryDiffEqSymplecticRK; explicit_imports = true, - ei_kwargs = (; - # OrdinaryDiffEqCore-internal (non-public) name the solver genuinely - # needs; `CompiledFloats` is `const CompiledFloats = Union{Float32,Float64}`, - # not declared public in Core. Tracked for make-public in - # SciML/OrdinaryDiffEq.jl#3776. - all_explicit_imports_are_public = (; ignore = (:CompiledFloats,)), - ), ) From e42bae51414f268eb42b24c9f355fd346f8430f0 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:04:56 -0400 Subject: [PATCH 096/108] Drop now-public OrdinaryDiffEqCore names from StabilizedIRK QA EI ignore list PHASE B re-clean follow-up: with the OrdinaryDiffEqCore solver-author API declared `public` on this branch, fac_default_gamma / _fixup_ad / isnewton are no longer flagged by ExplicitImports, so their ignore entries were redundant. Drop them; keep only the genuine residual (SciMLBase internals _unwrap_val / _reshape / _vec, not public on registered releases). Verified on Julia 1.12 (in-repo lib/* developed via native [sources] so the on-branch public decls are active): empty-ignore probe flags only the 3 SciMLBase names; with the tight list, ExplicitImports 6/6 pass, 0 flags. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl index ee23a5cd5f9..6a8cfc6f7af 100644 --- a/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqStabilizedIRK/test/qa/qa.jl @@ -6,10 +6,6 @@ run_qa( ei_kwargs = (; all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore owner-internal helpers deliberately kept - # non-public (perf/dispatch/misc utilities, not part of the - # documented solver-author extension surface). - :fac_default_gamma, :_fixup_ad, :isnewton, # SciMLBase internals, not public on registered releases. :_unwrap_val, :_reshape, :_vec, ), From bb73357d7848763c7f4291bef993dfd4a3acc7ef Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:06:17 -0400 Subject: [PATCH 097/108] Tighten OrdinaryDiffEqTsit5 QA ExplicitImports ignore list to residual MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PHASE B re-clean: probe with emptied EI ignore lists on Julia 1.12 against the on-branch PHASE-A public decls (OrdinaryDiffEqCore/DiffEqBase now declare their solver-author API public) shows only 7 genuinely non-public residual names. Drop the stale entries the prior pass over-kept (CompiledFloats, DerivativeOrderNotPossibleError, _ode_interpolant! — all now public), plus @def/@truncate_stacktrace from all_qualified where they never flagged. Residual kept (ground-truth flagged, grouped by owner): all_qualified_accesses_are_public: lorenz, lorenz_oop (OrdinaryDiffEqCore precompile-workload helpers, deliberately non-public) all_explicit_imports_are_public: @fold, @OnDemandTableauExtract, trivial_limiter! (OrdinaryDiffEqCore owner-internal codegen/limiter), @def (SciMLBase), @truncate_stacktrace (TruncatedStacktraces) Verified GROUP=QA EI on Julia 1.12: Quality Assurance 6/6 pass, 0 fail/error/broken. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqTsit5/test/qa/qa.jl | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl b/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl index de55e47ea6f..0f96839c0c0 100644 --- a/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqTsit5/test/qa/qa.jl @@ -4,33 +4,23 @@ run_qa( OrdinaryDiffEqTsit5; explicit_imports = true, ei_kwargs = (; - # Residual after the PHASE-A make-public sweep: every solver-author API name - # (alg_cache/perform_step!/_ode_interpolant/... in OrdinaryDiffEqCore, - # calculate_residuals in DiffEqBase, etc.) is now declared `public` on this - # branch and no longer needs an ignore. What remains are owner-internal names - # with no public alternative. + # Residual after the PHASE-A make-public sweep: the solver-author API + # (alg_cache/perform_step!/_ode_interpolant!/CompiledFloats/... in + # OrdinaryDiffEqCore, calculate_residuals in DiffEqBase, etc.) is now + # declared `public` on this branch and no longer needs an ignore. What + # remains are owner-internal names with no public alternative. all_qualified_accesses_are_public = (; ignore = ( - # OrdinaryDiffEqCore — private codegen macros kept non-public in PHASE A - Symbol("@fold"), Symbol("@OnDemandTableauExtract"), # OrdinaryDiffEqCore — precompile-workload test functions (internal) :lorenz, :lorenz_oop, - # OrdinaryDiffEqCore — genuine internals (no public alternative) - :CompiledFloats, :DerivativeOrderNotPossibleError, - :_ode_interpolant!, :trivial_limiter!, - # SciMLBase - Symbol("@def"), - # TruncatedStacktraces - Symbol("@truncate_stacktrace"), ), ), all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore — private codegen macros kept non-public in PHASE A + # OrdinaryDiffEqCore — private codegen macros / limiter kept + # non-public in PHASE A (owner-internal, no public alternative) Symbol("@fold"), Symbol("@OnDemandTableauExtract"), - # OrdinaryDiffEqCore — genuine internals (no public alternative) - :CompiledFloats, :DerivativeOrderNotPossibleError, - :_ode_interpolant!, :trivial_limiter!, + :trivial_limiter!, # SciMLBase Symbol("@def"), # TruncatedStacktraces From c3ff14d8e3ea30cef8435658eecf47ddfe4e5336 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:06:22 -0400 Subject: [PATCH 098/108] Re-clean OrdinaryDiffEqStabilizedRK QA EI ignore list to residual Drop fac_default_gamma and has_dtnew_modification from the all_explicit_imports_are_public ignore list: both are now declared public in OrdinaryDiffEqCore on this branch. The remaining residual is the two SciMLBase-owned helpers (_vec, value) that are not yet public on the registered SciMLBase (pending release). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl b/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl index 61d88129055..0990c5e0138 100644 --- a/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqStabilizedRK/test/qa/qa.jl @@ -8,8 +8,6 @@ run_qa( ignore = ( # SciMLBase-owned helpers not yet declared public (pending release). :_vec, :value, - # OrdinaryDiffEqCore owner-internal hooks kept non-public. - :fac_default_gamma, :has_dtnew_modification, ), ), ), From 6b8215c9f3c4295501d359e5d03b9e9498251c70 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:07:40 -0400 Subject: [PATCH 099/108] StochasticDiffEqHighOrder: drop now-public @cache from QA EI ignore StochasticDiffEqCore declares @cache public on this branch (PHASE A), so it no longer needs an explicit_imports ignore. Only the genuine residual @.. (FastBroadcast macro reexported non-public through DiffEqBase) remains. Co-Authored-By: Chris Rackauckas --- lib/StochasticDiffEqHighOrder/test/qa/qa.jl | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/StochasticDiffEqHighOrder/test/qa/qa.jl b/lib/StochasticDiffEqHighOrder/test/qa/qa.jl index a373471ecc7..aa0ebe1af81 100644 --- a/lib/StochasticDiffEqHighOrder/test/qa/qa.jl +++ b/lib/StochasticDiffEqHighOrder/test/qa/qa.jl @@ -10,11 +10,8 @@ run_qa( # FastBroadcast is not a direct dependency of this sublibrary, so the # broadcast macro can only be reached via the DiffEqBase reexport. all_explicit_imports_via_owners = (; ignore = (Symbol("@.."),)), - # `@..`: external FastBroadcast macro reexported through DiffEqBase (not - # public there). `@cache`: StochasticDiffEqCore's owner-internal codegen - # macro; StochasticDiffEqCore has no public-API surface declared yet. - all_explicit_imports_are_public = (; - ignore = (Symbol("@.."), Symbol("@cache")), - ), + # `@..`: external FastBroadcast macro reexported through DiffEqBase, where + # it is not public. + all_explicit_imports_are_public = (; ignore = (Symbol("@.."),)), ), ) From 32fd4035a5eae1e884a6a346b9a1b61418fe874a Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:08:35 -0400 Subject: [PATCH 100/108] Drop now-public OrdinaryDiffEqCore names from OrdinaryDiffEqTaylorSeries QA ignore DerivativeOrderNotPossibleError, _ode_interpolant!, and get_current_alg_order are declared `public` in OrdinaryDiffEqCore on this branch, so they no longer need to be ignored by the ExplicitImports public-API checks. Trim them from the all_explicit_imports_are_public ignore list, leaving only the genuine residual (trivial_limiter! plus the external TruncatedStacktraces/FunctionWrappers names). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl b/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl index 3014a5bd1b9..bdf30b5f910 100644 --- a/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqTaylorSeries/test/qa/qa.jl @@ -16,10 +16,9 @@ run_qa( # Explicit imports of names that are not `public` in their owner. all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore internals deliberately kept non-public - # (not part of the solver-author extension API surface). - :DerivativeOrderNotPossibleError, :_ode_interpolant!, - :get_current_alg_order, :trivial_limiter!, + # OrdinaryDiffEqCore limiter default, deliberately kept + # non-public (codegen/perf helper, not extension API). + :trivial_limiter!, # other-package internals with no public alias Symbol("@truncate_stacktrace"), :FunctionWrapper, ), From d1398f6a2cfde7f56cdf1b1fa84132f942dd367f Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:08:59 -0400 Subject: [PATCH 101/108] QA: re-clean OrdinaryDiffEqSDIRK EI ignores after base-lib public decls The solver-author API of OrdinaryDiffEqCore is now declared public on this branch, so drop the six now-public names (CompiledFloats, _fixup_ad, current_extrapolant!, isesdirk, isnewton, ssp_coefficient) from the all_explicit_imports_are_public ignore list. The remaining residual is the genuine set still flagged by run_qa with emptied ignore lists on Julia 1.12: lorenz/lorenz_oop/trivial_limiter! (OrdinaryDiffEqCore internals), _reshape/ _unwrap_val/_vec (SciMLBase private), @truncate_stacktrace (TruncatedStacktraces) and constructorof (ConstructionBase via SciMLBase re-export). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl index 52cd4741e91..c6c8f3dc310 100644 --- a/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqSDIRK/test/qa/qa.jl @@ -5,10 +5,11 @@ using SciMLTesting, OrdinaryDiffEqSDIRK, Test # no longer need ignoring here. What remains are genuine non-public internals with no # public alternative, grouped by owning package: # * OrdinaryDiffEqCore internals that were intentionally NOT promoted to public -# (test fixtures + a few perf/codegen helpers). +# (the `lorenz`/`lorenz_oop` precompile-workload fixtures and the +# `trivial_limiter!` default limiter). # * SciMLBase private helpers (`_reshape`/`_unwrap_val`/`_vec`). -# * External packages whose names have no public export (ConstructionBase, -# TruncatedStacktraces). +# * External packages whose names have no public export (ConstructionBase's +# `constructorof`, TruncatedStacktraces' `@truncate_stacktrace`). run_qa( OrdinaryDiffEqSDIRK; explicit_imports = true, @@ -20,7 +21,7 @@ run_qa( ignore = ( # non-public in ConstructionBase (via SciMLBase re-export) :constructorof, - # non-public OrdinaryDiffEqCore test fixtures + # non-public OrdinaryDiffEqCore precompile-workload fixtures :lorenz, :lorenz_oop, )), all_explicit_imports_are_public = (; @@ -29,9 +30,8 @@ run_qa( :_reshape, :_unwrap_val, :_vec, # non-public TruncatedStacktraces macro Symbol("@truncate_stacktrace"), - # non-public OrdinaryDiffEqCore internals - :CompiledFloats, :_fixup_ad, :current_extrapolant!, - :isesdirk, :isnewton, :ssp_coefficient, :trivial_limiter!, + # non-public OrdinaryDiffEqCore internal (limiter default) + :trivial_limiter!, )), ), ) From 6ffbabab1b3e3979f8fd75e344ab6d10f39be0fe Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:09:31 -0400 Subject: [PATCH 102/108] StochasticDiffEqIIF QA: drop now-public EI ignore list (PHASE B re-clean) PHASE A declared the solver-author API public on this branch: OrdinaryDiffEqCore now `public`-declares current_extrapolant! (and perform_step!/issplit/current_extrapolant), and StochasticDiffEqCore `public`-declares @cache. With the on-branch lib/* [sources] siblings, all_explicit_imports_are_public passes with no ignores, so the entire ei_kwargs ignore list is redundant and removed. Verified on Julia 1.12 (SciMLTesting 1.7, in-repo [sources]): ExplicitImports 6/6 pass with empty ei_kwargs. (The unrelated Aqua undefined-exports failure for checkSRAOrder/checkSRIOrder is pre-existing, owned by StochasticDiffEqCore's export line and reexported here; out of scope for this EI re-clean.) Co-Authored-By: Chris Rackauckas --- lib/StochasticDiffEqIIF/test/qa/qa.jl | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/lib/StochasticDiffEqIIF/test/qa/qa.jl b/lib/StochasticDiffEqIIF/test/qa/qa.jl index 27936f3c259..c8c13853ba2 100644 --- a/lib/StochasticDiffEqIIF/test/qa/qa.jl +++ b/lib/StochasticDiffEqIIF/test/qa/qa.jl @@ -5,17 +5,4 @@ run_qa( StochasticDiffEqIIF; jet_kwargs = (; target_defined_modules = true), explicit_imports = true, - ei_kwargs = (; - all_explicit_imports_are_public = (; - ignore = ( - # OrdinaryDiffEqCore solver-author interface, still not `public` there - # (the no-bang `current_extrapolant` was made public; the in-place - # `current_extrapolant!` was not). - :current_extrapolant!, - # `@cache` is public in OrdinaryDiffEqCore but imported here from - # StochasticDiffEqCore, which does not re-declare it `public`. - Symbol("@cache"), # StochasticDiffEqCore - ), - ), - ), ) From 9c54645e5fb688984b3e2889aeffce7ac3d428b7 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:09:58 -0400 Subject: [PATCH 103/108] QA: re-clean OrdinaryDiffEqRosenbrock EI ignores after public-API decls (phase B) Re-clean the ExplicitImports ignore lists now that OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation / DiffEqBase / SciMLBase declare their solver-author extension API public on this branch. The bloated per-name ignore list (50 explicit + 9 qualified) collapses to the genuine residual: cross-package internals whose owner keeps them non-public, plus a couple of owner-internal Core helpers. Source: the four derivative/jacobian wrappers (TimeDerivativeWrapper, TimeGradientWrapper, UDerivativeWrapper, UJacobianWrapper) moved to SciMLBase (where they are now public) and are no longer re-exported by OrdinaryDiffEqDifferentiation, so import them from SciMLBase; without this OrdinaryDiffEqRosenbrock fails to precompile (UndefVarError TimeGradientWrapper). Import the now-public resize_J_W! from its owner OrdinaryDiffEqCore instead of via OrdinaryDiffEqDifferentiation so it drops from the ignore list. Also drop a duplicate UJacobianWrapper from the Differentiation import. Verified on Julia 1.12.6 against released SciMLTesting 1.7: full QA 17/17 (Aqua + JET + 6 ExplicitImports checks), 0 fail/error/broken, no Unexpected Pass. Co-Authored-By: Chris Rackauckas --- .../src/OrdinaryDiffEqRosenbrock.jl | 11 ++-- lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl | 55 +++++++------------ 2 files changed, 25 insertions(+), 41 deletions(-) diff --git a/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl b/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl index ee5192bf528..bd4ee9c8e08 100644 --- a/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl +++ b/lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl @@ -13,7 +13,7 @@ import OrdinaryDiffEqCore: alg_adaptive_order, isWmethod, isfsal, _unwrap_val, calculate_residuals, has_stiff_interpolation, ODEIntegrator, resize_non_user_cache!, _ode_addsteps!, full_cache, DerivativeOrderNotPossibleError, _fixup_ad, - LinearAliasSpecifier, copyat_or_push!, DifferentialVarsUndefined + LinearAliasSpecifier, copyat_or_push!, DifferentialVarsUndefined, resize_J_W! using MuladdMacro: MuladdMacro, @muladd using FastBroadcast: FastBroadcast, @.. using RecursiveArrayTools: RecursiveArrayTools, recursivefill! @@ -26,13 +26,11 @@ using LinearAlgebra: mul!, I, norm, lu, UniformScaling using ADTypes: ADTypes, AutoFiniteDiff, AutoForwardDiff import OrdinaryDiffEqCore, OrdinaryDiffEqDifferentiation -using OrdinaryDiffEqDifferentiation: TimeDerivativeWrapper, TimeGradientWrapper, - UDerivativeWrapper, UJacobianWrapper, - wrapprecs, calc_tderivative, build_grad_config, +using OrdinaryDiffEqDifferentiation: wrapprecs, calc_tderivative, build_grad_config, build_jac_config, issuccess_W, jacobian2W!, resize_jac_config!, resize_grad_config!, calc_rosenbrock_differentiation!, build_J_W, - UJacobianWrapper, dolinsolve, WOperator, resize_J_W! + dolinsolve, WOperator using OrdinaryDiffEqDifferentiation: calc_rosenbrock_differentiation @@ -47,7 +45,8 @@ using OrdinaryDiffEqRosenbrockTableaus: OrdinaryDiffEqRosenbrockTableaus, Scholz4_7RodasTableau, Veldd4RodasTableau, Velds4RodasTableau using Reexport: Reexport, @reexport @reexport using SciMLBase -using SciMLBase: SciMLBase, LinearProblem, ODEProblem, init, solve +using SciMLBase: SciMLBase, LinearProblem, ODEProblem, init, solve, + TimeDerivativeWrapper, TimeGradientWrapper, UDerivativeWrapper, UJacobianWrapper # alg_order is owned by and public in SciMLBase; import (not using) so methods can be extended import SciMLBase: alg_order diff --git a/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl b/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl index b5d934e4bb7..1af09042e61 100644 --- a/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqRosenbrock/test/qa/qa.jl @@ -1,45 +1,30 @@ using SciMLTesting, OrdinaryDiffEqRosenbrock, Test -# The names ignored below are internal (non-public) cross-package interface -# names. OrdinaryDiffEqRosenbrock is a solver sublibrary that, by design, -# consumes the internal solver interfaces of its sibling packages -# OrdinaryDiffEqCore and OrdinaryDiffEqDifferentiation (and a few DiffEqBase / -# SciMLBase / Base internals). These names have no public home to migrate to, -# so they are listed explicitly rather than blanket-skipped via `ei_broken`, so -# that any name later made public will surface as an Unexpected Pass and can be -# dropped from these lists. See SciML/OrdinaryDiffEq.jl#3776. +# OrdinaryDiffEqRosenbrock consumes the solver-author extension API of its sibling +# packages, most of which is now declared public (so those names are no longer +# listed here). The names below are the genuine residual: cross-package internals +# whose *owner* does not make them public, plus a couple of owner-internal Core +# helpers. Each is grouped and commented by owning package so that any name later +# made public will surface as an Unexpected Pass and can be dropped. See +# SciML/OrdinaryDiffEq.jl#3776. -# Internal names imported via a non-owner sibling package (re-exported through -# OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation) or otherwise not public in -# the module they are imported from. +# Explicitly-imported names that are non-public in (and/or owned outside) the +# module they are imported from. const ROSENBROCK_INTERNAL_EXPLICIT_IMPORTS = ( - Symbol("@cache"), Symbol("@def"), - :DerivativeOrderNotPossibleError, :DifferentialVarsUndefined, :ODEIntegrator, - :OrdinaryDiffEqConstantCache, :OrdinaryDiffEqMutableCache, - :OrdinaryDiffEqRosenbrockAdaptiveAlgorithm, :OrdinaryDiffEqRosenbrockAlgorithm, - :TimeDerivativeWrapper, :TimeGradientWrapper, :UDerivativeWrapper, - :UJacobianWrapper, :WOperator, - :_fixup_ad, :_ode_addsteps!, :_ode_interpolant, :_ode_interpolant!, - :_reshape, :_unwrap_val, :_vec, - :alg_adaptive_order, :alg_autodiff, :alg_cache, - :build_J_W, :build_grad_config, :build_jac_config, - :calc_rosenbrock_differentiation, :calc_rosenbrock_differentiation!, - :calc_tderivative, :calculate_residuals, :calculate_residuals!, - :constvalue, :copyat_or_push!, :dolinsolve, :generic_solver_docstring, - :get_fsalfirstlast, :has_stiff_interpolation, :initialize!, :isWmethod, - :isfsal, :issuccess_W, :jacobian2W!, :only_diagonal_mass_matrix, - :perform_step!, :resize_J_W!, :resize_grad_config!, :resize_jac_config!, - :trivial_limiter!, :wrapprecs, + Symbol("@def"), # owner SciMLBase (MacroTools codegen macro), non-public + :_reshape, :_unwrap_val, :_vec, # owner SciMLBase, non-public internals + :calculate_residuals, :calculate_residuals!, :initialize!, # owner DiffEqBase, non-public + :copyat_or_push!, # owner RecursiveArrayTools, non-public + :WOperator, # owner SciMLOperators, non-public + :trivial_limiter!, # OrdinaryDiffEqCore owner-internal, non-public ) -# Internal names accessed via qualified access on a non-owner / non-public name. +# Qualified accesses to names that are non-public in (and/or owned outside) the +# module they are accessed through. const ROSENBROCK_INTERNAL_QUALIFIED_ACCESSES = ( - Symbol("@set"), # SciMLBase.@set (owned by Accessors, non-public re-export) - :FunctionWrapperSpecialize, # SciMLBase internal (precompile workload only) - :NoSpecialize, # SciMLBase internal (precompile workload only) - :get_EEst, :set_EEst!, :increment_nf!, # OrdinaryDiffEqCore internal - :lorenz, :lorenz_oop, # OrdinaryDiffEqCore precompile test helpers - :setindex, # Base.setindex (non-public) + Symbol("@set"), # owner Accessors, accessed via SciMLBase.@set, non-public + :lorenz, :lorenz_oop, # OrdinaryDiffEqCore precompile-workload helpers, non-public + :setindex, # Base internal, non-public ) run_qa( From cb9634ab53951c69fdbaa7851658f50d719500f5 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:15:56 -0400 Subject: [PATCH 104/108] OrdinaryDiffEqNonlinearSolve QA: drop now-public names from EI ignore lists Re-probe on the branch with in-repo lib/* dev-pathed (PHASE A public decls active) flags a smaller residual than the prior pass kept. Drop the OrdinaryDiffEqCore names now declared public (apply_step!, error_constant, has_special_newton_error, _initialize_dae!, isnewton) and the qualified-access -only SciMLBase/ForwardDiff names that never flag under all_explicit_imports_are_public. Residual is now the genuine externals: SciMLBase/SciMLOperators/ForwardDiff/ StaticArraysCore internals plus @SciMLMessage (owner SciMLLogging) and the W-operator types. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl index f37273856be..573ebfc67e7 100644 --- a/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqNonlinearSolve/test/qa/qa.jl @@ -18,18 +18,16 @@ run_qa( # name `public`/exports it. Tracked in SciML/OrdinaryDiffEq.jl#3776. all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore internals not part of the solver-author public API. - :apply_step!, :error_constant, :has_special_newton_error, - :_initialize_dae!, :isnewton, Symbol("@SciMLMessage"), + # `@SciMLMessage` reached through OrdinaryDiffEqCore (owner SciMLLogging). + Symbol("@SciMLMessage"), # SciMLBase internals (owner of these names but not public). - :_vec, :_reshape, :postamble!, :value, :anyeltypedual, - :forwarddiff_chunksize, :has_Wfact, :has_Wfact_t, :has_jac_u, :has_jac_du, + :_vec, :_reshape, :postamble!, # SciMLOperators abstract type (not public). :AbstractSciMLOperator, # OrdinaryDiffEqDifferentiation W-operator types (attributed to SciMLOperators). :WOperator, :StaticWOperator, # ForwardDiff / StaticArraysCore internals. - :Dual, :Tag, :pickchunksize, :StaticArray, + :Dual, :StaticArray, ), ), # Qualified `Module.name` accesses to non-public names with no public alternative. From 79a465554637bb866edde9a03e223a92d95ef9a2 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:19:49 -0400 Subject: [PATCH 105/108] Re-clean OrdinaryDiffEqBDF QA EI ignore list after PHASE A public decls Drop the 16 OrdinaryDiffEqCore names now declared public on-branch (round-1 solver-author extension API plus round-2 cross-sublib cache/tableau/error types). Keep only the genuine residual that still flags against the on-branch lib/* develop on Julia 1.12: lorenz/lorenz_oop precompile fixtures, the OrdinaryDiffEqCore owner-internal helpers _resolved_QT/trivial_limiter!, SciMLBase _unwrap_val, and the TruncatedStacktraces @truncate_stacktrace macro. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqBDF/test/qa/qa.jl | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/lib/OrdinaryDiffEqBDF/test/qa/qa.jl b/lib/OrdinaryDiffEqBDF/test/qa/qa.jl index 6f38b2e7df7..fa9e2274347 100644 --- a/lib/OrdinaryDiffEqBDF/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqBDF/test/qa/qa.jl @@ -4,30 +4,21 @@ run_qa( OrdinaryDiffEqBDF; explicit_imports = true, ei_kwargs = ( - # Precompile-workload test problems that live in OrdinaryDiffEqCore but are - # deliberately kept non-public (they are test fixtures, not solver-author API). all_qualified_accesses_are_public = (; - ignore = (:lorenz, :lorenz_oop), + ignore = ( + # Precompile-workload test problems in OrdinaryDiffEqCore, kept + # non-public on purpose (test fixtures, not solver-author API). + :lorenz, :lorenz_oop, + ), ), - # Genuine solver-author internals still kept non-public by their owners. - # Everything OrdinaryDiffEqCore made public for the solver extension API has - # been dropped; drop each remaining entry once its owner marks it public - # upstream (tracked in SciML/OrdinaryDiffEq.jl#3776). all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore internals (not in the public extension API) - :DerivativeOrderNotPossibleError, :error_constant, - :get_current_alg_order, :get_current_qmax, - :has_special_newton_error, :has_stiff_interpolation, - :isnewton, :qsteady_min_default, :qsteady_max_default, - :resolve_basic, :_resolved_QT, :set_discontinuity, - :trivial_limiter!, :_ode_interpolant!, :_fixup_ad, - # OrdinaryDiffEqSDIRK ESDIRK-IMEX caches/tableau (owner-internal) - :ESDIRKIMEXCache, :ESDIRKIMEXConstantCache, - :ImplicitEulerESDIRKIMEXTableau, - # SciMLBase internal + # OrdinaryDiffEqCore owner-internal helpers (deliberately excluded + # from the public solver-author extension surface). + :_resolved_QT, :trivial_limiter!, + # SciMLBase internal. :_unwrap_val, - # TruncatedStacktraces internal macro + # TruncatedStacktraces internal macro. Symbol("@truncate_stacktrace"), ), ), From d9fe7f9de0064cdc5e0466da17288d4d36523dd8 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:20:21 -0400 Subject: [PATCH 106/108] QA: re-clean DelayDiffEq EI ignore lists after solver-author API made public The OrdinaryDiffEqCore / Differentiation / NonlinearSolve / DiffEqBase solver-author extension API is now declared `public` on this branch, so the enumerated ignore entries for those names are redundant. Drop them and keep only the genuine residual: - SciMLBase abstract problem/function/algorithm types pending SciMLBase#1412 - SciMLBase init/save/step plumbing and DiffEqBase Stats not yet public - OrdinaryDiffEqCore DDE-specific integrator/discontinuity/tstop/saveat hooks that were not part of the public extension surface declared on this branch - ForwardDiff.Dual (external internal) QUALIFIED_INTERNAL: 94 -> 40, EXPLICIT_INTERNAL: 14 -> 3. Verified green on Julia 1.12 (all 6 ExplicitImports checks pass). Co-Authored-By: Chris Rackauckas --- lib/DelayDiffEq/test/qa/qa_tests.jl | 74 ++++++++++------------------- 1 file changed, 26 insertions(+), 48 deletions(-) diff --git a/lib/DelayDiffEq/test/qa/qa_tests.jl b/lib/DelayDiffEq/test/qa/qa_tests.jl index 3e690d62adc..153c0de38dd 100644 --- a/lib/DelayDiffEq/test/qa/qa_tests.jl +++ b/lib/DelayDiffEq/test/qa/qa_tests.jl @@ -5,64 +5,42 @@ using OrdinaryDiffEqCore: OrdinaryDiffEqAlgorithm, StochasticDiffEqAlgorithm, StochasticDiffEqConstantCache, StochasticDiffEqMutableCache # Names that are non-public in their owning package on the registered releases -# resolved here (SciMLBase 3.30, OrdinaryDiffEqCore 4.4, DiffEqBase 7, etc.). -# DelayDiffEq builds a DDE integrator on top of the OrdinaryDiffEq solver -# internals, so it legitimately reaches into these internal stepping/cache/ -# discontinuity hooks. Each is a candidate for `public` declaration upstream -# (tracked in SciML/OrdinaryDiffEq.jl#3776); until then they are listed -# explicitly rather than hidden behind a blanket `ei_broken`. +# resolved here. The OrdinaryDiffEqCore/Differentiation/NonlinearSolve/DiffEqBase +# solver-author extension API is now declared `public` on this branch, so those +# names are dropped from the ignore lists below. What remains is the genuine +# residual: DDE-specific integrator hooks that OrdinaryDiffEqCore has not made +# public, the SciMLBase problem/function/solution abstract types still pending a +# `public` declaration (SciML/SciMLBase.jl#1412), and true external internals. const QUALIFIED_INTERNAL = ( - # SciMLBase internals (problem/function/solution interface, init plumbing) + # SciMLBase abstract problem/function types, pending SciMLBase#1412. :AbstractDDEFunction, :AbstractHistoryFunction, :AbstractSDDEFunction, :AbstractSDEFunction, :DAEInitializationAlgorithm, + # SciMLBase init/save/step plumbing not yet public (make-public candidates). :get_save_idxs_and_saved_subsystem, :has_initializeprob, :last_step_failed, :postamble!, :save_discretes_if_enabled!, :unwrap_cache, - # DiffEqBase internals - :calculate_residuals, :calculate_residuals!, :check_prob_alg_pairing, - :ODE_DEFAULT_UNSTABLE_CHECK, :prepare_alg, :prob2dtmin, :Stats, - # OrdinaryDiffEqCore internals (integrator stepping/cache/controller/discontinuity) - :AbstractNLSolver, :alg_adaptive_order, :alg_autodiff, :alg_cache, - :alg_difftype, :alg_extrapolates, :alg_maximum_order, :apply_step!, - :AutoSwitchCache, :_change_t_via_interpolation!, :concrete_jac, - :current_interpolant, :current_interpolant!, :DefaultCache, - :default_controller, :DEOptions, :determine_controller_datatype, - :first_discontinuity, :get_chunksize, :get_chunksize_int, - :get_differential_vars, :get_EEst, :get_fsalfirstlast, - :_get_next_step_tstop, :_get_tstop_target, :handle_callback_modifiers!, - :handle_discontinuities!, :handle_dt!, :handle_starting_time_discontinuity!, - :handle_tstop!, :has_discontinuity, :initialize_callbacks!, - :_initialize_dae!, :initialize_d_discontinuities, :initialize_saveat, - :initialize_tstops, :init_ith_default_cache, :InterpolationData, - :isautoswitch, :isdtchangeable, :isimplicit, :ismultistep, :_loopfooter!, - :loopfooter!, :loopheader!, :modify_dt_for_tstops!, :nlsolve_f, :NLStatus, - :_ode_addsteps!, :ode_addsteps!, :ode_determine_initdt, - :OrdinaryDiffEqAlgorithm, :OrdinaryDiffEqCompositeAlgorithm, :perform_step!, - :pop_discontinuity!, :_postamble!, :reinit_controller!, :resize_J_W!, - :resize_nlsolver!, :_savevalues!, :set_EEst!, :_set_tstop_flag!, - :setup_controller_cache, :shift_past_discontinuity!, :standardtag, - :update_uprev!, :uses_uprev, - # OrdinaryDiffEqNonlinearSolve internals (fixed-point solver hooks) - :anderson, :anderson!, :compute_step!, :initial_η, :nlsolve!, :nlsolvefail, - # OrdinaryDiffEqDifferentiation internals - :resize_grad_config!, :resize_jac_config!, - # ForwardDiff internal type used in discontinuity tracking + # DiffEqBase internal stats type. + :Stats, + # OrdinaryDiffEqCore DDE-specific integrator stepping / discontinuity / + # tstop / saveat hooks — reached by the DDE integrator but not part of the + # OrdinaryDiffEqCore public extension surface declared on this branch. + :_change_t_via_interpolation!, :current_interpolant!, + :determine_controller_datatype, :first_discontinuity, :get_chunksize_int, + :_get_next_step_tstop, :_get_tstop_target, :handle_discontinuities!, + :handle_dt!, :handle_starting_time_discontinuity!, :handle_tstop!, + :has_discontinuity, :initialize_callbacks!, :initialize_d_discontinuities, + :initialize_saveat, :initialize_tstops, :init_ith_default_cache, + :_loopfooter!, :loopfooter!, :loopheader!, :modify_dt_for_tstops!, + :pop_discontinuity!, :_postamble!, :_savevalues!, :_set_tstop_flag!, + :shift_past_discontinuity!, :update_uprev!, + # ForwardDiff internal type used in discontinuity tracking. :Dual, ) -# Explicit `using A: name` of names that are non-public in `A`. Same upstream -# make-public story as above (subset of the qualified names plus the abstract -# algorithm/cache supertypes DelayDiffEq subtypes and piracy-dispatches on). +# Explicit `using A: name` of names non-public in `A`. const EXPLICIT_INTERNAL = ( - # SciMLBase + # SciMLBase abstract algorithm/problem types + pairing error, pending + # SciMLBase#1412. :AbstractDDEAlgorithm, :AbstractSDDEProblem, :ProblemSolverPairingError, - # OrdinaryDiffEqCore - :AbstractNLSolverCache, :alg_extrapolates, :alg_maximum_order, :AutoSwitch, - :CompositeAlgorithm, :SlowConvergence, :StochasticDiffEqAlgorithm, - :StochasticDiffEqRODEAlgorithm, - # OrdinaryDiffEqNonlinearSolve - :NLAnderson, :NLFunctional, - # OrdinaryDiffEqRosenbrock - :RosenbrockMutableCache, ) run_qa( From 48a7289071373b548116cc987425a9ed41763446 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:32:01 -0400 Subject: [PATCH 107/108] QA: re-clean OrdinaryDiffEqFIRK EI ignore list after solver-author API made public Trim all_explicit_imports_are_public ignores for OrdinaryDiffEqFIRK to the genuine non-public residual. The OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation / OrdinaryDiffEqNonlinearSolve / DiffEqBase solver-author names are now declared `public` on this branch, so the following redundant entries were dropped (verified as Unexpected Pass on Julia 1.12.6 against the on-branch libs): _fixup_ad, _ode_interpolant!, alg_can_repeat_jac, differentiation_rk_docstring, get_current_alg_order, get_current_qmax, has_stiff_interpolation, isfirk, set_discontinuity. Remaining residual (all still genuinely non-public in their owner): @threaded, trivial_limiter! (OrdinaryDiffEqCore); _reshape, _unwrap_val, _vec, value (SciMLBase, pending #1412); fastpower (FastPower); AbstractSciMLOperator (SciMLOperators). OrdinaryDiffEqLowStorageRK was already tight (verified green, no change). run_qa EI green (17/17) for both on Julia 1.12.6. Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqFIRK/test/qa/qa.jl | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl b/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl index 1bd8fd82dcb..ed57373371d 100644 --- a/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqFIRK/test/qa/qa.jl @@ -1,22 +1,23 @@ using SciMLTesting, OrdinaryDiffEqFIRK, Test +# The solver-author API of OrdinaryDiffEqCore / OrdinaryDiffEqDifferentiation / +# OrdinaryDiffEqNonlinearSolve / DiffEqBase is now declared `public` on this branch, +# so those names no longer need ignoring. The residual below is the genuine set of +# non-public internals with no public alternative, grouped by owning package. Any +# name later made public will surface as an Unexpected Pass and can be dropped. +# See SciML/OrdinaryDiffEq.jl#3776. run_qa( OrdinaryDiffEqFIRK; explicit_imports = true, ei_kwargs = ( all_explicit_imports_are_public = (; ignore = ( - # OrdinaryDiffEqCore owner-internal names deliberately kept non-public - # (private codegen/perf macro + solver-framework internals not part of - # the declared extension surface). - Symbol("@threaded"), :_fixup_ad, :_ode_interpolant!, - :alg_can_repeat_jac, :differentiation_rk_docstring, - :get_current_alg_order, :get_current_qmax, - :has_stiff_interpolation, :isfirk, :set_discontinuity, - :trivial_limiter!, - # SciMLBase internal helpers / wrappers (pending SciMLBase#1412) - :_vec, :_reshape, :_unwrap_val, :value, - # Genuine external deps + # OrdinaryDiffEqCore — private codegen macro / default no-op limiter, + # kept owner-internal (no public alternative). + Symbol("@threaded"), :trivial_limiter!, + # SciMLBase internal helpers (pending public decl, SciMLBase#1412). + :_reshape, :_unwrap_val, :_vec, :value, + # Genuine external deps, non-public in their owner. :fastpower, # FastPower :AbstractSciMLOperator, # SciMLOperators ), From 299dccbccb060418c49c884999be19cb0d1ca158 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 2 Jul 2026 10:33:53 -0400 Subject: [PATCH 108/108] QA: re-clean OrdinaryDiffEqDefault EI ignore lists after make-public Drop the entire all_explicit_imports_are_public ignore (AutoAlgSwitch, AutoSwitchCache, CompositeAlgorithm, alg_stability_size, beta1_default, beta2_default, default_autoswitch, is_mass_matrix_alg, isdefaultalg) -- all nine are now declared public in OrdinaryDiffEqCore on this branch, so the check passes clean with no ignores. Drop FunctionWrapperSpecialize/NoSpecialize from all_qualified_accesses_are_public -- both are public in the resolved SciMLBase (>= 3.30.1) and no longer flagged. Keep only lorenz/lorenz_oop, which are OrdinaryDiffEqCore precompile-workload test fixtures. The DefaultSolverChoice enum unanalyzable handling and the mis-flagged stale solver-name ignores remain (genuine ExplicitImports limitation). Co-Authored-By: Chris Rackauckas --- lib/OrdinaryDiffEqDefault/test/qa/qa.jl | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/lib/OrdinaryDiffEqDefault/test/qa/qa.jl b/lib/OrdinaryDiffEqDefault/test/qa/qa.jl index 4662987fc7d..e6e9bfacee6 100644 --- a/lib/OrdinaryDiffEqDefault/test/qa/qa.jl +++ b/lib/OrdinaryDiffEqDefault/test/qa/qa.jl @@ -19,23 +19,11 @@ run_qa( # stale because of the unanalyzable enum submodule above. ignore = (:Tsit5, :Vern7, :Rosenbrock23, :Rodas5P, :FBDF), ), - # OrdinaryDiffEqCore internal API the default-alg machinery depends on - # (no public replacement; see SciML/OrdinaryDiffEq.jl#3776). - all_explicit_imports_are_public = (; - ignore = ( - :AutoAlgSwitch, :AutoSwitchCache, :CompositeAlgorithm, - :alg_stability_size, :beta1_default, :beta2_default, - :default_autoswitch, :is_mass_matrix_alg, :isdefaultalg, - ), - ), all_qualified_accesses_are_public = (; - ignore = ( - # SciMLBase specialization sentinels used only inside opt-in - # (default-off) precompile-workload branches. - :FunctionWrapperSpecialize, :NoSpecialize, - # OrdinaryDiffEqCore precompile test problems. - :lorenz, :lorenz_oop, - ), + # `lorenz`/`lorenz_oop` are OrdinaryDiffEqCore precompile-workload + # test problems (defined in `precompilation_setup.jl`), deliberately + # not part of its public extension surface. + ignore = (:lorenz, :lorenz_oop), ), ), )