Skip to content

Add QA (Aqua/JET) groups to sublibraries (SciML/.github#77)#618

Merged
ChrisRackauckas merged 2 commits into
SciML:masterfrom
ChrisRackauckas-Claude:sublib-qa
Jun 15, 2026
Merged

Add QA (Aqua/JET) groups to sublibraries (SciML/.github#77)#618
ChrisRackauckas merged 2 commits into
SciML:masterfrom
ChrisRackauckas-Claude:sublib-qa

Conversation

@ChrisRackauckas-Claude

Copy link
Copy Markdown
Contributor

Part of SciML/.github#77 (canonical QA groups for monorepo sublibraries).

Adds the canonical QA test group to each sublibrary, mirroring the OrdinaryDiffEq.jl sublibrary pattern: a test/qa environment with Aqua + JET (sublibrary pulled in via [sources] path), a qa.jl driver running Aqua.test_all and JET.test_package(...; target_defined_modules = true), a QA dispatch in test/runtests.jl gated on DATADRIVENDIFFEQ_TEST_GROUP == "QA", and a [QA] group declared in test/test_groups.toml with versions = ["lts", "1"] (no pre, ubuntu-only). Pkg is added to each sublibrary's test extras/targets with a compat entry so Aqua's deps_compat stays green.

Units in this batch:

  • lib/DataDrivenDMD
  • lib/DataDrivenLux
  • lib/DataDrivenSparse
  • lib/DataDrivenSR

Verification: static only (TOML parse, Meta.parseall on the touched Julia files, [sources] path resolution, Runic format check). QA findings surfaced by CI will be triaged per the established mark-broken+issue policy.

Further batches may be pushed to this branch. Ignore until reviewed by @ChrisRackauckas.

ChrisRackauckas and others added 2 commits June 10, 2026 06:13
…parse

Adds a canonical QA test group to each sublibrary, mirroring the
OrdinaryDiffEq.jl sublibrary pattern (SciML/.github#77):

- test/qa/Project.toml with Aqua + JET and the sublibrary via [sources]
- test/qa/qa.jl running Aqua.test_all and JET.test_package
- QA dispatch in test/runtests.jl gated on the repo group env var
- [QA] group declared in test/test_groups.toml with versions [lts, 1]
- Pkg added to test extras/targets (with compat for Aqua deps_compat)

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Same canonical QA group pattern as the sibling sublibraries:
test/qa env (Aqua + JET via [sources] path), QA dispatch in
test/runtests.jl, [QA] declared in test/test_groups.toml with
versions [lts, 1], and Pkg wired into the test extras/targets.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ChrisRackauckas ChrisRackauckas marked this pull request as ready for review June 15, 2026 04:57
@ChrisRackauckas ChrisRackauckas merged commit f3c9f27 into SciML:master Jun 15, 2026
21 of 39 checks passed
ChrisRackauckas-Claude pushed a commit to ChrisRackauckas-Claude/DataDrivenDiffEq.jl that referenced this pull request Jun 20, 2026
The sublibraries QA group (Aqua + JET) for DataDrivenLux has failed since it
was added (SciML#618). The findings are genuine source bugs:

Aqua (unbound type parameter):
- update_path(f, id, states::PathState{T}...) left T unbound when called with
  zero states. Require at least one state (state1::PathState{T}, states...) so
  T always binds.

JET (5 possible errors):
- custom_priors.jl summary referenced an undefined `E` ($E) in its interpolated
  string; print the error-model name (nameof(typeof(d.errormodel))) instead.
- dataset.jl built the empty t-interval with Interval{T}(zero(T), zero(T)),
  which is no longer a valid IntervalArithmetic constructor (errors at runtime);
  use interval(zero(T), zero(T)), matching the other branch.
- The DataDrivenFunction OOP/IIP *matrix* dispatch was missing the
  {true, true} (implicit + controls) methods in DataDrivenDiffEq's
  build_function.jl, so a Basis{true,true}(::Dataset) call had no matching
  method. Add the two missing matrix methods (additive, mirrors the existing
  {true,false} pair).
- Candidate / CommonAlgOptions: the @concrete field type-constraints made the
  generated inner constructors unprovable to JET when fed Any-typed values.
  Drop the (non-load-bearing) Candidate field bounds, and give CommonAlgOptions
  an explicit type-asserting keyword constructor in place of @kwdef so the
  positional @concrete constructor receives concretely-typed arguments.

QA now resolves the in-repo DataDrivenDiffEq (not the registered release): add
DataDrivenDiffEq to the qa env [deps]/[sources], and in activate_qa_env develop
the local paths on Julia < 1.11 (where [sources] is ignored), mirroring
.github's develop_sources helper.

Verified locally: DataDrivenLux QA (Aqua + JET) passes 12/12 on both Julia 1.10
(lts) and 1.12, and the DataDrivenLux Core test suite passes on 1.12.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ChrisRackauckas added a commit that referenced this pull request Jun 23, 2026
)

* Fix master CI: DataDrivenLux downgrade resolution and docs linkcheck

Two unrelated master CI failures.

1. downgrade-sublibraries / test (lib/DataDrivenLux): the test target listed
   `OrdinaryDiffEq` as a dependency, but it is not used anywhere in
   DataDrivenLux's sources or tests. Under the strict downgrade resolver it
   forced the entire OrdinaryDiffEq solver split-package ecosystem
   (OrdinaryDiffEqBDF, OrdinaryDiffEqNonlinearSolve, ...) to its ancient floor
   (v6/7.0.x), which no longer co-resolves with the modern SciMLBase 3 /
   ModelingToolkit 11 / Symbolics 7 stack that DataDrivenDiffEq pins, yielding
   "Unsatisfiable requirements". Removing the unused dependency lets the
   downgrade `Pkg.test` resolve and the suite pass on Julia 1.10.

2. Documentation / Build and Deploy: `linkcheck` errored on
   docs.sciml.ai/ModelingToolkit/.../AbstractSystem (HTTP 403 anti-crawler) and
   on dead ai.damtp.cam.ac.uk/symbolicregression/.../api/#Options and
   #EquationSearch anchors (404 after the SymbolicRegression docs reorganized).
   Repoint the dead API links to the maintained canonical SciML-hosted docs
   (#EquationSearch -> #equation_search, the current function name) and add a
   linkcheck_ignore regex for docs.sciml.ai, which rejects the linkcheck bot
   with 403 even though the cross-doc links resolve in a browser.

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

* Fix DataDrivenLux QA: real Aqua/JET findings + local-source resolution

The sublibraries QA group (Aqua + JET) for DataDrivenLux has failed since it
was added (#618). The findings are genuine source bugs:

Aqua (unbound type parameter):
- update_path(f, id, states::PathState{T}...) left T unbound when called with
  zero states. Require at least one state (state1::PathState{T}, states...) so
  T always binds.

JET (5 possible errors):
- custom_priors.jl summary referenced an undefined `E` ($E) in its interpolated
  string; print the error-model name (nameof(typeof(d.errormodel))) instead.
- dataset.jl built the empty t-interval with Interval{T}(zero(T), zero(T)),
  which is no longer a valid IntervalArithmetic constructor (errors at runtime);
  use interval(zero(T), zero(T)), matching the other branch.
- The DataDrivenFunction OOP/IIP *matrix* dispatch was missing the
  {true, true} (implicit + controls) methods in DataDrivenDiffEq's
  build_function.jl, so a Basis{true,true}(::Dataset) call had no matching
  method. Add the two missing matrix methods (additive, mirrors the existing
  {true,false} pair).
- Candidate / CommonAlgOptions: the @concrete field type-constraints made the
  generated inner constructors unprovable to JET when fed Any-typed values.
  Drop the (non-load-bearing) Candidate field bounds, and give CommonAlgOptions
  an explicit type-asserting keyword constructor in place of @kwdef so the
  positional @concrete constructor receives concretely-typed arguments.

QA now resolves the in-repo DataDrivenDiffEq (not the registered release): add
DataDrivenDiffEq to the qa env [deps]/[sources], and in activate_qa_env develop
the local paths on Julia < 1.11 (where [sources] is ignored), mirroring
.github's develop_sources helper.

Verified locally: DataDrivenLux QA (Aqua + JET) passes 12/12 on both Julia 1.10
(lts) and 1.12, and the DataDrivenLux Core test suite passes on 1.12.

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

* docs: repoint remaining dead SymbolicRegression api link in DataDrivenSR docstring

PR #624 repointed the dead ai.damtp.cam.ac.uk/symbolicregression/.../api/#Options
links in the datadrivensr examples, but missed the same dead link in the
DataDrivenSR `Options` docstring (lib/DataDrivenSR/src/DataDrivenSR.jl), which is
rendered into the docs and linkchecked. That URL 404s, failing the docs build.
Repoint it to the maintained docs.sciml.ai host (already covered by the
linkcheck_ignore added in #624).

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

* Fix DataDrivenSR QA: coef field bug + local-source resolution

Touching DataDrivenSR's source makes the affected-sublibrary detector run its
QA group, which (like DataDrivenLux's) had never passed. Two real findings:

- JET: coef(x::SRResult) read getfield(x, :k), but SRResult has no :k field
  (the accessor errored on every call and is untested). Return the model
  coefficients — the parameter values of the result's basis,
  get_parameter_values(x.basis) — matching how the parameters are produced in
  the SRResult constructor and used in solution.jl.
- Aqua deps_compat failed because, on Julia < 1.11, the qa env's [sources] is
  ignored and QA analyzed the *registered* DataDrivenSR (whose Project.toml
  lacks compat for the test extras); the in-repo Project already declares them.
  Resolve the in-repo DataDrivenSR/DataDrivenDiffEq by adding DataDrivenDiffEq
  to the qa env [deps]/[sources] and developing the local paths on Julia < 1.11
  in activate_qa_env (no-op effect on >= 1.11), mirroring the DataDrivenLux fix.

Verified locally: DataDrivenSR QA (Aqua + JET) passes 12/12 on Julia 1.12.

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

* Revert DataDrivenLux OrdinaryDiffEq removal; downgrade waits on upstream release

Restores `OrdinaryDiffEq = "6, 7"` to [compat], the OrdinaryDiffEq UUID to
[extras], and OrdinaryDiffEq to [targets].test in lib/DataDrivenLux/Project.toml
(reverts the 10af37c removal).

The DataDrivenLux downgrade lane does NOT actually require dropping
OrdinaryDiffEq: with OrdinaryDiffEq removed, the lane is still red, and the
failure is identical with it present. The CI failing step is
`julia-runtest` (step 11), not the resolver step (8) or buildpkg (10): the
downgrade-compat resolve and buildpkg both succeed; the `Pkg.test()` test-env
re-resolve is what fails Unsatisfiable. Reproduced locally on Julia 1.10 with
the exact CI sequence (downgrade.jl alldeps 1.10 -> Pkg.test allow_reresolve=false):

  Unsatisfiable requirements detected for package ModelingToolkitBase:
   ModelingToolkit [restricted to 11.21.0-11 by DataDrivenDiffEq]
     -> ModelingToolkitBase 1.30.0-1.45.0
        -> SymbolicUtils 4.23.1-4
   but SymbolicUtils is held at <= 4.21.0 at the downgrade floor -> no versions left

Root cause (release-dependent, not test-dep-dependent): DataDrivenDiffEq's
master floor `ModelingToolkit = "11.21.0"` (set in 24ae52c for the Julia 1.10
precompile) transitively requires ModelingToolkitBase >= 1.30.0, whose
SymbolicUtils floor is 4.23.1 (monotone: every MTKBase >= 1.30 needs >= 4.23.1).
Under the strict downgrade min-resolve the symbolic stack is held at its floor
(Symbolics 7.0-7.21 guarantee only SymbolicUtils >= 4.21.0), so SymbolicUtils
cannot reach 4.23.1 and there is no overlap. This is the broader SciML
symbolic-stack downgrade-floor wall; it resolves once an upstream
ModelingToolkit 11.x release raises its `Symbolics` compat floor to >= 7.22.0
(the first Symbolics whose SymbolicUtils floor, 4.27.0, satisfies MTKBase 1.30),
forcing the downgrade min to a SymbolicUtils >= 4.23.1. Verified: pinning the
test floor to Symbolics >= 7.22.0 (or SymbolicUtils >= 4.23.1) resolves cleanly.

Per the directive: do not drop a real test dependency to dodge the downgrade
resolver. The DataDrivenLux downgrade lane stays red until that upstream release
lands; the rest of #624 (DataDrivenSR coef fix, docs linkcheck, QA source fixes,
qa [sources]) is release-independent and ready.

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

---------

Co-authored-by: ChrisRackauckas-Claude <accounts@chrisrackauckas.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants