Skip to content

Migrate QA to SciMLTesting 2.4 - #102

Closed
ChrisRackauckas-Claude wants to merge 1 commit into
SciML:mainfrom
ChrisRackauckas-Claude:codex/scimltesting-24-operator-splitting
Closed

Migrate QA to SciMLTesting 2.4#102
ChrisRackauckas-Claude wants to merge 1 commit into
SciML:mainfrom
ChrisRackauckas-Claude:codex/scimltesting-24-operator-splitting

Conversation

@ChrisRackauckas-Claude

@ChrisRackauckas-Claude ChrisRackauckas-Claude commented Jul 27, 2026

Copy link
Copy Markdown
Member

Ignore until reviewed by @ChrisRackauckas.

Migrates both compatibility constraints to SciMLTesting 2.4, cuts the QA exception list down to five documented entries by fixing the underlying accesses, documents the developer extension interface v1, and enables strict docs/doctests.

QA

The run_qa call previously carried ~30 ignore entries. Most are gone because the access itself was corrected rather than listed:

  • timedepentdtmin is owned by and public in DiffEqBase; it was being reached through OrdinaryDiffEqCore. Fixed at both call sites (src/utils.jl, src/integrator.jl).
  • src/config_tree.jl reached the broadcast machinery through Base. dotview and broadcastable are public in Base.Broadcast, so they are now accessed there.
  • DiffEqBase.NAN_CHECK on a scalar dt is isnan; SciMLBase.check_error uses isnan directly.
  • The controller-protocol names (stepsize_controller!, step_accept_controller!, increment_accept!, setup_controller_cache, …) are public in the resolved OrdinaryDiffEqCore, so their entries were stale.

Five entries remain, each with the reason inline in test/qa/qa.jl:

  • Broadcasted, materialize!Base.Broadcast marks dotview, broadcastable and BroadcastStyle public but not these two, and there is no alias for either. TreeOption's .= overload needs both.
  • fix_dt_at_bounds!, handle_tstop! — public as of the unreleased OrdinaryDiffEqCore 4.13. The [compat] floor is 4.4 and the newest registered 4.x is 4.12, so the check still resolves a version without them.
  • failfactor_defaultMake failfactor_default and qmax_first_step_default public OrdinaryDiffEq.jl#4111 makes this public alongside the rest of the per-algorithm controller defaults (gamma_default, qmin_default, … are already public).

Verbosity

DiffEqBase.DEFAULT_VERBOSE is not public, but it is defined as const DEFAULT_VERBOSE = DEVerbosity() and DEVerbosity is public, so DiffEqBase.DEVerbosity() is used instead. This is the same value — not DEVerbosity(Minimal()), which differs in five toggles (dense_output_saveat, newton_convergence, mismatched_input_output_type, near_singular, state_dependent_delay) and would have been a silent behavior change.

SciMLLogging becomes a direct dependency so None() comes from its owner rather than through DiffEqBase.

Documentation

docs/make.jl drops warnonly = true and turns on doctest = true with checkdocs = :exports. Docstrings for OperatorSplittingProblem, GenericSplitFunction, LieTrotterGodunov and StrangMarchuk gained argument sections, and the developer extension interface v1 (AbstractOperatorSplittingAlgorithm, AbstractOperatorSplittingCache, init_cache, _perform_step!, the synchronizer entry points) is now documented and rendered in docs/src/devdocs/index.md, including a worked ReverseLieTrotterGodunov example.

Tests

test/operator_splitting_api.jl gains a mock solver extension implementing exactly that interface — algorithm type with inner_algs, concrete cache, init_cache, _perform_step! — sweeping the operators in reverse order. It asserts the cache type (so the mock really is the one stepping), a successful solve, and first-order convergence: measured errors over dt ∈ {0.1, 0.05, 0.01, 0.005} are 2.019e-6, 1.019e-6, 2.053e-7, 1.027e-7.

Note that reverse order does not give a different answer than LieTrotterGodunov on the reference problem — trueA is a multiple of the identity, so the two operators commute and the sweep order cancels out exactly (the two agree to 5.6e-20). An assertion that the results differ would be testing floating-point noise, so there isn't one.

A second testset covers nested rollback restoring child buffers.

Local verification

  • GROUP=Core Pkg.test() on Julia 1.12.6 — all groups pass (adaptivity 70, alias_u0 13, backward 35, config_tree 140, consistency 27, convergence 90, failure_escalation 20, operator_splitting_api 1341, sync 9)
  • test/qa/qa.jl on Julia 1.12.6 (20/20) and 1.10.11 LTS (18/18)
  • docs/make.jl under the new strict settings — exit 0, no doctest or cross-reference failures
  • Runic clean on src, test, docs

🤖 Generated with Claude Code

https://claude.ai/code/session_015jcWBstA52cVLXo1L38ZPm

Moves both compatibility constraints to SciMLTesting 2.4 and cuts the QA
exception list from ~30 entries to 5 by fixing the underlying accesses:

- `timedepentdtmin` is owned by and public in DiffEqBase; it was reached
  through OrdinaryDiffEqCore at both call sites.
- `Base.dotview` / `Base.broadcastable` / `Base.materialize!` now go through
  `Base.Broadcast`, where the first two are public.
- `DiffEqBase.NAN_CHECK` on a scalar dt is `isnan`.
- The controller-protocol names are public in the resolved OrdinaryDiffEqCore,
  so those entries were stale.

The five that remain carry their reason inline. `Broadcasted` and
`materialize!` have no public spelling in `Base.Broadcast`;
`fix_dt_at_bounds!` and `handle_tstop!` are public only from the unreleased
OrdinaryDiffEqCore 4.13, above the 4.4 compat floor; `failfactor_default`
awaits SciML/OrdinaryDiffEq.jl#4111.

`DiffEqBase.DEFAULT_VERBOSE` is not public but is defined as `DEVerbosity()`,
and `DEVerbosity` is, so the default verbosity is spelled `DEVerbosity()`.
This keeps the exact value -- `DEVerbosity(Minimal())` differs in five
toggles. SciMLLogging becomes a direct dependency so `None()` comes from its
owner.

Documents the developer extension interface v1 and renders it, with a worked
example, in the developer docs. `docs/make.jl` drops `warnonly` and enables
doctests with `checkdocs = :exports`.

Adds a mock solver extension to the test suite implementing that interface --
algorithm type, cache, `init_cache`, `_perform_step!` -- and a nested rollback
testset.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
@ChrisRackauckas-Claude
ChrisRackauckas-Claude force-pushed the codex/scimltesting-24-operator-splitting branch from d22655a to 6d995fb Compare August 4, 2026 09:40
@ChrisRackauckas-Claude

Copy link
Copy Markdown
Member Author

Superseded by #108, which includes the SciMLTesting 2.4 QA migration without package-specific strict-QA exceptions and adds the direct developer-interface documentation work.

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