Skip to content

QA: run_qa v1.6 form + ExplicitImports (root + sublibs)#627

Draft
ChrisRackauckas-Claude wants to merge 2 commits into
SciML:masterfrom
ChrisRackauckas-Claude:qa-run-qa-v16-ei
Draft

QA: run_qa v1.6 form + ExplicitImports (root + sublibs)#627
ChrisRackauckas-Claude wants to merge 2 commits into
SciML:masterfrom
ChrisRackauckas-Claude:qa-run-qa-v16-ei

Conversation

@ChrisRackauckas-Claude

Copy link
Copy Markdown
Contributor

Please ignore until reviewed by @ChrisRackauckas.

Converts every QA environment in the monorepo to the SciMLTesting v1.6 run_qa form with ExplicitImports enabled, in one branch.

Per-env summary

Env qa.jl Aqua JET ExplicitImports
root test/qa run_qa(DataDrivenDiffEq; jet = false, explicit_imports = true, ei_broken = (:no_implicit_imports,)) + curated jet_tests.jl via run_qa (new) curated @test_opt in jet_tests.jl (kept) on
lib/DataDrivenDMD/test/qa run_qa(DataDrivenDMD; explicit_imports = true, ei_broken = (:no_implicit_imports,)) via run_qa via run_qa (using JET) on
lib/DataDrivenSparse/test/qa run_qa(DataDrivenSparse; explicit_imports = true, ei_broken = (:no_implicit_imports,)) via run_qa via run_qa on
lib/DataDrivenSR/test/qa run_qa(DataDrivenSR; explicit_imports = true, ei_broken = (:no_implicit_imports,)) via run_qa via run_qa on
lib/DataDrivenLux/test/qa run_qa(DataDrivenLux; explicit_imports = true, ei_broken = (:no_implicit_imports,)) via run_qa via run_qa on

Sublibs converted: 4 (DataDrivenDMD, DataDrivenSparse, DataDrivenSR, DataDrivenLux) + root.

Notes

  • no_implicit_imports is ei_broken in every env because each module pulls a re-exported public surface in implicitly by design: the root @reexport using ModelingToolkit/StatsBase/DataInterpolations/MLUtils/CommonSolve; the sublibs using DataDrivenDiffEq (umbrella) plus using DataDrivenDiffEq.<submodule> re-exports, and DataDrivenSR additionally @reexport using SymbolicRegression. Making every such name explicit is a large refactor tracked separately. The other five EI checks run as hard @test.
  • Root JET unchanged: run_qa is called with jet = false; the curated @test_opt checks in jet_tests.jl (targeted at concrete DataDrivenDiffEq code) are kept, because JET.test_package on the whole method table reports many false positives from the re-exported Symbolics/ModelingToolkit infrastructure. The QA group body now includes both qa/qa.jl and qa/jet_tests.jl.
  • QA env Project.toml: SciMLTesting added with [compat] SciMLTesting = "1.6". ExplicitImports stays a transitive SciMLTesting dependency (not listed). Aqua + JET kept where they run. The [sources]/develop wiring pinning the in-repo sublib + umbrella root is unchanged.

🤖 Generated with Claude Code

ChrisRackauckas and others added 2 commits June 25, 2026 13:21
Convert every QA environment in the monorepo to the SciMLTesting v1.6 run_qa
form with ExplicitImports enabled:

- Root test/qa: new qa.jl calls run_qa(DataDrivenDiffEq; jet = false,
  explicit_imports = true). Aqua and ExplicitImports now run via run_qa; the
  curated JET @test_opt checks stay in jet_tests.jl (JET.test_package on the
  whole method table reports many false positives from the re-exported
  Symbolics/ModelingToolkit surface). runtests.jl QA body includes both.
- lib/DataDrivenDMD, DataDrivenSparse, DataDrivenSR, DataDrivenLux test/qa:
  qa.jl rewritten to using SciMLTesting, <Sublib>, JET, Test +
  run_qa(<Sublib>; explicit_imports = true). Aqua + JET preserved.

ExplicitImports: no_implicit_imports is marked ei_broken in every env because
each module pulls a re-exported public surface in implicitly by design (root:
@reexport using ModelingToolkit/StatsBase/DataInterpolations/MLUtils/CommonSolve;
sublibs: umbrella using DataDrivenDiffEq, plus DataDrivenSR's
@reexport using SymbolicRegression). The other five EI checks run hard.

QA env Project.toml: add SciMLTesting (compat 1.6); ExplicitImports stays a
transitive SciMLTesting dep (not listed). Aqua + JET kept where they run. The
[sources]/develop wiring that pins the in-repo sublib + umbrella root is
unchanged.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…oors

The Downgrade Sublibraries / test (lib/DataDrivenLux) lane resolves and
builds, then fails at runtime with 5 errors (reproduces on master, not
introduced by this QA PR; the PR does not touch DataDrivenLux src or
Project.toml). Two distinct root causes, both gated by [compat] floors:

1. IntervalArithmetic floor 0.22.0 (4 errors).
   `safe_sin`/`safe_cos` in src/utils.jl evaluate `real(sin(Complex(x)))`
   on `x::Interval{Float64}` during path-interval propagation
   (path_state.jl `update_path`). Base's `sin(::Complex)` does `zr == 0`,
   which dispatches to `==(::Interval, ::Interval)`. IntervalArithmetic
   0.22.0-0.22.9 throw `ArgumentError("== is purposely not supported for
   intervals")` there; 0.22.10 added the thin-interval fallback so the
   comparison returns a value and `sin(Complex{Interval})` works. Bisected
   locally: 0.22.9 THROW, 0.22.10 OK. Raise floor to 0.22.10.

2. Optim floor 1.7.6 (1 BoundsError).
   `BoundsError: attempt to access Float64 at index [2]` in
   `LineSearches.var"#ϕdϕSciML#2"`. Optim's `ManifoldObjective.value_gradient!`
   returns a scalar `value(...)` in all Optim versions; LineSearches <= 7.5.x
   `make_ϕdϕ` does `f, g = value_gradient!(df, x_new)` and fails to unpack
   the scalar into 2 vars. LineSearches 7.6.0 switched to
   `value_jvp!(df, x_new, s)` (which returns a 2-tuple) and requires
   NLSolversBase 8. No Optim 1.x admits NLSolversBase 8 (all cap "7.9.0"),
   so LineSearches stays <= 7.5.x at the Optim 1.7 floor. Optim 2.0.0
   requires LineSearches "7.6" + NLSolversBase "8". The passing Core lane
   already resolves Optim 2.2.1 / LineSearches 7.7.1 / NLSolversBase 8.
   Raise Optim floor to 2.

Verified locally on Julia 1.10 by pinning the new floors and running
`Pkg.test("DataDrivenLux")`: sandbox resolved IntervalArithmetic 0.22.10,
Optim 2.0.0, LineSearches 7.7.1, NLSolversBase 8.0.0; result 96/96 pass
(was 0 pass / 5 errored on the old floors).

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ChrisRackauckas-Claude

Copy link
Copy Markdown
Contributor Author

Downgrade lane fix (commit 478e89e): the downgrade-sublibraries / test (lib/DataDrivenLux) red is pre-existing on master (also red on eb11901, run 28267588245) and not introduced by this QA PR — the PR doesn't touch DataDrivenLux src/Project.toml. It resolves+builds fine but hits 5 runtime errors, both gated by [compat] floors:

  1. IntervalArithmetic floor 0.22.0 (4 errors): safe_sin/safe_cos do real(sin(Complex(x))) on x::Interval during path-interval propagation. Base sin(::Complex) does zr == 0 -> ==(::Interval, ::Interval), which IntervalArithmetic 0.22.0–0.22.9 throw on (== purposely not supported). 0.22.10 added the thin-interval fallback. Bisected locally: 0.22.9 THROW, 0.22.10 OK. Floor -> 0.22.10.
  2. Optim floor 1.7.6 (1 BoundsError: access Float64 at index [2]): Optim's ManifoldObjective.value_gradient! returns a scalar in all Optim versions; LineSearches <=7.5.x make_ϕdϕ unpacks it as a 2-tuple. LineSearches 7.6.0 switched to value_jvp! (2-tuple) but requires NLSolversBase 8, which no Optim 1.x admits (all cap "7.9.0"). Optim 2.0.0 requires LineSearches "7.6"+NLSolversBase "8"; the passing Core lane already resolves Optim 2.2.1. Floor -> 2.

Verified locally (Julia 1.10): pinned the new floors, Pkg.test("DataDrivenLux") sandbox resolved IntervalArithmetic 0.22.10 / Optim 2.0.0 / LineSearches 7.7.1 / NLSolversBase 8.0.0 -> 96/96 pass (was 0 pass / 5 errored at old floors).

Ignore until reviewed by @ChrisRackauckas.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants