Skip to content

testing... - #1

Closed
rokke-git wants to merge 163 commits into
vector_shortcutfrom
master
Closed

rokke-git wants to merge 163 commits into
vector_shortcutfrom
master

Conversation

@rokke-git

Copy link
Copy Markdown
Owner

No description provided.

ChrisRackauckas and others added 30 commits March 18, 2026 14:59
Migrate GPU tests from Buildkite to GitHub Actions using self-hosted
runners with the `gpu` label (Tesla T4 on arctic1).

- Add .github/workflows/GPU.yml for GPU tests on [self-hosted, Linux, X64, gpu]
- Delete .buildkite/pipeline.yml

Part of the SciML-wide migration from Buildkite to GitHub Actions
self-hosted runners. See ChrisRackauckas/InternalJunk#16
for runner infrastructure details.

Co-Authored-By: Chris Rackauckas <[email protected]>
…dkite-with-gha

Replace Buildkite CI with GitHub Actions self-hosted runners
adds vector syntax for `ArrayPartition`s and `VectorOfArray`s
…liance

This is a breaking change that completes the long-planned migration (documented
since 2023) to make AbstractVectorOfArray a proper AbstractArray subtype.

Key changes:
- AbstractVectorOfArray{T,N,A} <: AbstractArray{T,N}
- Linear indexing A[i] now returns the i-th element in column-major order
  (previously returned A.u[i], the i-th inner array)
- size() uses maximum sizes across inner arrays for ragged data
- Ragged out-of-bounds elements are treated as zero (sparse interpretation)
- Iteration goes over scalar elements (AbstractArray default)
- Removed deprecated linear indexing methods
- Updated Zygote extension (some adjoints marked broken pending update)
- Added parameter_values(::AbstractDiffEqArray, i) to fix dispatch ambiguity

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Invalidation analysis and cleanup:
- Remove IndexStyle instance method (type method sufficient)
- Remove size(VA, i), lastindex(VA, d) (inherited from AbstractArray)
- Remove checkbounds override (inherited from AbstractArray via size)
- Remove isassigned, isapprox, CartesianIndices, adjoint overrides
- Remove reshape, vec, convert(Array, ...), maybeview overrides
- Remove +, -, *, / operator overrides (use broadcasting)
- Remove 2-arg show for AbstractVectorOfArray (use AbstractArray display)

Fix Zygote extension:
- Remove all getindex/view adjoint overrides (Zygote's AbstractArray rules apply)
- Fix VectorOfArray(u) adjoint to return .u (plain Vector) not VectorOfArray
- Fix DiffEqArray(u, t) adjoint similarly
- All 12 adjoint tests now pass (was 4 pass + 8 broken)

Invalidation trees: 8 total, all minimal (max 20 mt_backedges from
Colon(::Integer, ::RaggedEnd) which is inherent to the type)

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Massive cleanup removing code that is no longer reachable or duplicates
AbstractArray defaults:

Removed (dead code since lastindex returns plain Ints):
- RaggedEnd/RaggedRange structs and all Colon methods (caused 4 invalidations)
- _column_indices, _resolve_ragged_index, _resolve_ragged_indices
- _has_ragged_end, _resolve_ragged_end_args
- _ragged_getindex, _ragged_getindex_nm1dims, _ragged_getindex_full
- _checkbounds_ragged, _preserve_array_type, _padded_resolved_indices
- _is_ragged_dim, __parameterless_type

Removed (inherited from AbstractArray):
- size(::Adjoint{T, <:AbstractVectorOfArray}), getindex(::Adjoint{...})
- check_parent_index_match, SubArray constructor override
- CartesianIndex setindex! (handled by Int... method)
- broadcastable (AbstractArray is already broadcastable)
- mapreduce for N==1 case
- show(io, ::AbstractVectorOfArray) 2-arg (use AbstractArray display)

Added back:
- getindex/setindex! for CartesianIndex with more dims than ndims(A)
  (needed for heterogeneous inner arrays like [zeros(20), zeros(3,3,3)])

Invalidation trees: 8 → 4 (removed all Colon/RaggedEnd invalidations)
Net: -379 lines removed, +43 added

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
…alidation

This method conflicted with AbstractArray's similar(a, dims...) contract
and caused 469 invalidation children. Users should use standard
similar(VA, T, dims) or construct VectorOfArrays directly.

Invalidation trees: 4 → 3 (and 0 from AbstractVectorOfArray itself —
all 3 remaining are pre-existing from ArrayPartition/NamedArrayPartition)

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Create lib/RecursiveArrayToolsShorthandConstructors as a separate
subpackage for methods that cause invalidations:

- VA[...] and AP[...] shorthand constructors (getindex on Type)
- Optimized any/all for ArrayPartition (partition-level short-circuit)

Users who want these opt in with:
  using RecursiveArrayToolsShorthandConstructors

Invalidation trees after `using RecursiveArrayTools`: 3 → 1
(only NamedArrayPartition.setindex! remains, pre-existing)

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- NamedArrayPartition: narrow setindex!(x, args...) to setindex!(x, v, i::Int)
  instead of catching all signatures. AbstractVector only needs the Int method.
- Remove setindex! CartesianIndex from Union in multi-index method (Base handles it)
- Remove dedicated (Int, CartesianIndex) getindex/setindex! methods; flatten
  inside the multi-arg dispatcher instead
- Fix NamedArrayPartition test: x[1:end] now preserves type (correct behavior)

Result: `using RecursiveArrayTools` causes 0 invalidation trees.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
RecursiveArrayToolsShorthandConstructors now only has the VA[...] and
AP[...] constructor syntax. The any/all partition-level optimizations
are in their own RecursiveArrayToolsArrayPartitionOptimizations subpackage
since they are unrelated to shorthand constructors.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
The partition-level any/all short-circuiting is not actually an
optimization — the AbstractArray fallback already short-circuits
element-by-element. Both stop at the first match. Iterating
partition-by-partition doesn't skip any work.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Benchmarking shows the partition-by-partition any/all IS ~1.5-1.8x faster
than the AbstractArray default for full scans, because ArrayPartition's
generic element iteration has per-element partition lookup overhead.

Kept as a separate lib/ subpackage (not a submodule) because submodules
are loaded at package load time and would still cause invalidations.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Since AbstractVectorOfArray <: AbstractArray, convert(AbstractArray, va)
returns va itself. Use stack(va.u) to get a dense CuArray instead.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
…legation

## Ragged Arrays (RecursiveArrayToolsRaggedArrays sublibrary)

- Add AbstractRaggedVectorOfArray and AbstractRaggedDiffEqArray abstract types
- Add RaggedVectorOfArray and RaggedDiffEqArray concrete types that preserve
  true ragged structure without zero-padding
- Column-major linear indexing, no-padding A[:, i], symbolic indexing,
  broadcasting, and callable interpolation interface
- Isolated in lib/ sublibrary to avoid invalidations

## Interpolation Interface on DiffEqArray

- Add `interp` and `dense` fields to DiffEqArray (new type parameter I)
- Callable syntax: da(t), da(t; idxs=1), da(t, Val{1})
- All constructors accept `interp=nothing, dense=false` kwargs

## Plotting Delegation

- Full-featured AbstractDiffEqArray plot recipe with:
  - idxs variable selection (integer, array, tuple for phase plots, symbolic)
  - Dense interpolation via callable interface
  - denseplot, plotdensity, tspan, plotat keyword arguments
- Export plotting helpers for SciMLBase delegation:
  DEFAULT_PLOT_FUNC, plottable_indices, plot_indices, getindepsym_defaultt,
  interpret_vars, add_labels!, diffeq_to_arrays, solplot_vecs_and_labels

## Bug Fix

- Fix ragged VectorOfArray .= zero broadcast (DimensionMismatch)
  by using dest.u[i] instead of dest[:, i] in copyto!

## Version

- Bump to v4.0.0

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
…Style

Change RaggedVectorOfArrayStyle to subtype BroadcastStyle instead of
AbstractArrayStyle. This eliminates all invalidations from the ragged
sublibrary except the unavoidable 1 from materialize (needed because
non-AbstractArray types can't provide axes/size for instantiate).

Invalidation breakdown for `using RecursiveArrayToolsRaggedArrays`:
- 1 from our materialize override (unavoidable for non-AbstractArray)
- 17 from Accessors.jl (SII transitive dep, not our code)
- 20 from Base cat chain (SII transitive dep, not our code)

Also update sublibrary compat bounds to RecursiveArrayTools v4.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Remove SciMLBase and SnoopCompileCore that leaked into [deps] from
  Pkg.develop during testing. SciMLBase remains a test-only dependency.
- Remove SnoopCompileCore from ragged sublibrary deps.
- Update all sublibrary compats to RecursiveArrayTools v4.
- Port v3 ragged behavior tests to RaggedVectorOfArray/RaggedDiffEqArray:
  ragged indexing, heterogeneous views (SciML#453), end indexing, push! making
  arrays ragged, broadcast assignment (SciML#454), 2D ragged inner arrays,
  zero/fill on ragged, component timeseries extraction.
  212 tests total (up from 143).

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Fixes issues reported by @JoshuaLampert:
- Add view(r, :, i) and view(r, I, i) for ragged arrays
- Add axes(r, d) and lastindex(r, d) so `end` works in indexing
- Add range indexing: r[1:3, i], r[:, 2:end]
- Note: `end` in first dim uses max inner array length (not per-column
  like v3's RaggedEnd), so r[end, i] may throw BoundsError for shorter
  inner arrays. Use r[:, i] for safe column access.

Tests: 243 pass (up from 212).

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
SciMLBase can't resolve against RAT v4 until the companion SciMLBase PR
(SciML/SciMLBase.jl#1297) is merged. Move it out of the main test deps
into the downstream test Project.toml.

- Remove SciMLBase from [extras] and [targets] in Project.toml
- Add SciMLBase and ForwardDiff to test/downstream/Project.toml
- Move adjoints.jl to test/downstream/ (uses ODEProblem from SciMLBase)
- Core tests now pass without SciMLBase dependency

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- docs/Project.toml: bump RecursiveArrayTools compat from "3" to "4"
- test/jet_tests.jl: filter RecipesBase is_key_supported false positive
  (user recipe keywords like denseplot are dynamic, JET can't verify them)
- test/adjoints.jl: remove loss6/ODEProblem (needs SciMLBase) from Core,
  keep in test/downstream/adjoints.jl (disabled until SciMLBase compat bump)
- test/downstream/Project.toml: revert SciMLBase/ForwardDiff additions
  (can't resolve until SciML/SciMLBase.jl#1297 merges)

Pre-existing failures NOT from our changes:
- LTS @inferred sum(VA[VA[zeros(4,4)]]) — inference regression from
  AbstractArray subtyping, present since initial PR commits
- GPU CuArray ambiguity — from AbstractVectorOfArray <: AbstractArray
- Downstream SciMLBase resolution — expected until SciMLBase bumps compat

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Fix CuArray ambiguity: replace (T::Type{<:AnyGPUArray})(VA) = T(Array(VA))
  with T(stack(VA.u)) and add N type parameter to disambiguate against
  CuArray(::AbstractArray{T,N}) from CUDA.jl
- Add type-stable Base.sum(VA::AbstractVectorOfArray) that reduces over
  .u to avoid inference failure on Julia 1.10 with deeply nested type
  parameters (fixes @inferred sum(VA[VA[zeros(4,4)]]) on LTS)

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Remove the fast-path branch in the AbstractDiffEqArray recipe that
bypassed diffeq_to_arrays when no interp was available. Now all cases
go through the same code path, ensuring denseplot=true/false is always
respected:

- denseplot=true: generates plotdensity interpolated points via callable
- denseplot=false: uses raw saved time points from A.t

Also clean up SciMLBase that leaked into [deps] from Pkg.develop.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Disambiguate CuArray(::AbstractArray{T,N}) from CUDA.jl by defining
(::Type{GA})(::AbstractVectorOfArray{T,N}) where {T,N,GA<:AbstractGPUArray}

AbstractVectorOfArray{T,N} is strictly more specific than AbstractArray{T,N}
on arg2, so this method wins dispatch for VectorOfArray arguments.
Uses stack(VA.u) to stay on GPU (avoids GPU→CPU→GPU round-trip).

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
ChrisRackauckas and others added 29 commits June 4, 2026 12:28
Convert the bespoke Tests.yml to a tests.yml@v1 caller now that the
reusable workflow supports `num-threads` (SciML/.github#43). Preserves the
exact version x group matrix and JULIA_NUM_THREADS=2 (needed so the
threaded regression tests for SciML#570 actually exercise the multi-thread path)
and coverage-directories src,ext.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
…ests

ci: centralize Tests.yml (tests.yml@v1 with num-threads: 2)
This monorepo had no sublibrary CI, so its lib/* sublibraries were never
tested. Add a thin caller of the centralized sublibrary-project-tests.yml,
which lists lib/* and tests each via tests.yml project=lib/X.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Part of bringing this repo onto the full centralized CI setup (SciML/.github
@v1): remove retired CompatHelper (Dependabot drives [compat]) and/or add the
centralized Documenter preview cleanup.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
…i-project-model

ci: uniformize onto centralized CI (project-model SublibraryCI + cleanup)
…adjoint

The Zygote pullbacks for VectorOfArray/DiffEqArray (vofa_u_adjoint) and
ArrayPartition only special-cased `isnothing(d_i)` for missing per-slice
gradients. A ChainRulesCore.ZeroTangent (AbstractZero) cotangent element
was passed through unchanged, and the subsequent VectorOfArray/DiffEqArray
construction called `size(::ZeroTangent)`, throwing a MethodError. This
broke reverse-mode AD through DiffEqArray(vec, ts) (e.g. DifferenceEquations.jl
test/linear_gradients.jl).

Treat AbstractZero the same as nothing: a structural zero gradient for that
slice. Added a regression test in test/adjoints.jl exercising a ZeroTangent
cotangent element for both VectorOfArray and DiffEqArray.

Regression test run locally on Julia 1.10: PASS.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
…erotangent-adjoint

fix: handle ZeroTangent/AbstractZero in RecursiveArrayToolsZygoteExt adjoint
Add missing standard SciML centralized caller workflows:
- RunicSuggestions.yml (Runic auto-format suggestions on PRs)
- DependabotAutoMerge.yml (auto-merge Dependabot PRs)

Co-authored-by: ChrisRackauckas-Claude <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
The reusable SciML/.github downgrade workflows now always use
allow_reresolve: false and no longer accept an allow-reresolve input
(see SciML/.github#71). Remove the now-invalid input so this caller keeps
working once @v1 is retagged.

Co-authored-by: Chris Rackauckas <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
Packages should not pin crate-ci/typos; minor/patch updates should flow
through Dependabot automatically. Remove the typos ignore entry while
preserving the julia and github-actions ecosystem blocks.

Co-authored-by: ChrisRackauckas-Claude <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6 to 7.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](codecov/codecov-action@v6...v7)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…L#611)

* Uniformize monorepo structure to OrdinaryDiffEq canonical style

Align RecursiveArrayTools.jl with the OrdinaryDiffEq.jl canonical monorepo
layout:

- Add [sources] to each sublibrary pointing at the umbrella root via ../..
  (true leaf->root dependency direction; the 3 sublibs depend on the
  registered root today). No cyclic root->leaf [sources] are added because
  the root does not depend on its sublibs.
- Remove the redundant double-dispatch of the sublibraries: the root
  Tests.yml no longer GROUP-dispatches RaggedArrays/ArrayPartitionAnyAll/
  ShorthandConstructors, and the root test/runtests.jl no longer activates
  and Pkg.tests them. Sublibraries are now covered exclusively by
  SublibraryCI's per-project model.
- Rewrite root test/runtests.jl as a _detect_sublibrary_group dispatcher
  mirroring OrdinaryDiffEq: a GROUP naming lib/<X> activates that sublib,
  develops its [sources] path deps on Julia < 1.11, sets the sub group env,
  and Pkg.tests it; otherwise the root runs its own @safetestset groups.
- SublibraryCI.yml: thread group-env-name RECURSIVEARRAYTOOLS_TEST_GROUP and
  check-bounds auto.
- DowngradeSublibraries.yml: add group-env-name/group-env-value Core, expand
  the skip list to the siblings (root + 3 sublibs) plus stdlibs; auto-discovers
  lib/* (sublibrary-downgrade.yml@v1 has no allow-reresolve input).
- Each sublibrary test/runtests.jl now reads
  get(ENV, "RECURSIVEARRAYTOOLS_TEST_GROUP", "Core") and gates its tests on
  the Core group.
- Add test/test_groups.toml to each sublibrary declaring only [Core] on
  [lts, 1.11, 1, pre], since none of them have QA-group tests (the default
  expansion would otherwise emit an unsupported QA group on [1]).

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* Use canonical Title-case All test-group name in sublib gates

Match the SciML/OrdinaryDiffEq.jl convention: the catch-all test group
is canonical Title-case All, not all-caps ALL. The sublib runtests.jl
gates compared TEST_GROUP against "ALL" while the default and the
test_groups.toml key are already canonical ("Core"). Align the gate
string casing so all group-name strings are consistent.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* ci: canonicalize TagBot, .gitignore, and NoPre group casing

- TagBot.yml: adopt canonical OrdinaryDiffEq structure — top-level
  permissions block, workflow_dispatch.inputs.lookback default "3",
  named root TagBot job, and a TagBot-Subpackages matrix
  (fail-fast: false) over the three registered sublibraries, each
  invoking TagBot@v1 with subdir: lib/<package>.
- .gitignore: complete to canonical set (docs/build, LocalPreferences.toml,
  *.jl.*.mem, *.DS_Store, profile.pb.gz, .*.swp, .claude/, etc.).
- Casing: rename the special test group "nopre" -> "NoPre" on both
  sides of the workflow<->runtests contract (Tests.yml matrix.group +
  exclude, and runtests.jl GROUP comparison) so it is canonical
  Title-case and case-consistent.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* docs/ci: canonical sublib README headers + declare ShorthandConstructors test dep

- Sublibrary READMEs: prepend the canonical OrdinaryDiffEq-style badge
  block (Zulip, Global Docs -> RecursiveArrayTools, ColPrac, SciML Code
  Style) and the "<Name>.jl is a component of the RecursiveArrayTools.jl
  monorepo. <role>. While completely independent and usable on its own,
  users wanting the full functionality should use RecursiveArrayTools.jl."
  wording, substituting names. Existing content preserved below.
- Project.toml: declare RecursiveArrayToolsShorthandConstructors as a
  proper test dependency — added to [extras], [targets].test, [compat]
  ("1"), and a [sources] path entry so the Core test group resolves it
  from the in-repo lib/ on Julia >= 1.11 (runtests.jl Pkg.develop
  fallback still covers Julia < 1.11 where [sources] is ignored).

Verified: project resolves and `VA[...]`/`AP[...]` from the sublibrary
load in a Core-test-like environment.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* test: isolate root QA (Aqua) into canonical test/qa/ sub-environment

Move the inline Aqua quality-assurance test out of the main test
environment and into a dedicated test/qa/ project, matching the
canonical OrdinaryDiffEq sublib layout (lib/*/test/qa/).

- Add test/qa/Project.toml: Aqua + RecursiveArrayTools (via [sources])
  + Pkg + Test, with [compat] for each dep and julia.
- Move test/qa.jl -> test/qa/qa.jl (Aqua testset + the existing
  downstream-package manifest sentinel; behavior unchanged).
- runtests.jl: add activate_qa_env() and, in the Core/All branch,
  activate the qa env, run the QA safetestset, then restore the main
  test project so the remaining Core functional tests keep their full
  dependency set.
- Remove Aqua from the main Project.toml [extras], [targets].test, and
  [compat]; it now lives only in the qa env.

JET (NoPre group) is already isolated in test/nopre/ and is left as-is.
The three lib/* sublibraries run no QA today and are left untouched.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* fix: correct root test env — drop ShorthandConstructors [sources] and downstream-only NLsolve

The branch had added RecursiveArrayToolsShorthandConstructors to the umbrella
root [sources]. It is a test-only dependency (the VA[]/AP[] shorthand tests),
not a dependency of the RecursiveArrayTools package itself, so sourcing it at
the package level makes Pkg.test add it to the Core test env as a declared
package dependency. Aqua.test_stale_deps then flags it as a stale dep of
RecursiveArrayTools (the module never imports it), failing the QA group.

master never had this [sources] entry: its runtests.jl Pkg.develops the
sublibrary into the test env directly, which the current runtests.jl still
does. Removing the [sources] entry restores master's green QA behavior
(verified: Core+QA Pkg.test now passes — Quality Assurance 9 pass / 1 broken
(expected ambiguities @test_broken) / 0 fail; previously 1 fail).

Also drop NLsolve from the main [extras]/[targets].test/[compat]: it is used
only by test/downstream/odesolve.jl and is already declared in
test/downstream/Project.toml, so it does not belong in the base test env.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* ci: fold bespoke GPU.yml into CI.yml [GPU] group; canonical group Project.tomls

Replace the root Tests.yml + bespoke GPU.yml with a single canonical CI.yml
(matching the OrdinaryDiffEq umbrella layout):

- CI.yml carries the version matrix for the root base groups
  (Core/SymbolicIndexingInterface/Downstream/NoPre on [lts, 1, pre], NoPre
  excluded on pre) via SciML/.github tests.yml@v1.
- The GPU tests become a dep-adding group on the self-hosted GPU runner: a
  dedicated CI.yml job passes group=GPU and
  runner=[self-hosted, Linux, X64, gpu] to tests.yml@v1 (which sets
  GROUP=GPU; runtests.jl then activates test/gpu and runs the GPU
  safetestsets). This reproduces the former GPU.yml (same runner labels,
  60-min timeout, src,ext coverage) so GPU.yml is deleted.

- Give the dep-adding root group Project.tomls the canonical
  [sources] = {path=../..} (+ sibling sublib paths) plus the package and Test
  deps so they resolve on Julia >= 1.11 against the PR-branch code:
  - test/gpu: add Adapt/ArrayInterface/RecursiveArrayTools/Test/Zygote +
    [sources] for the root and RecursiveArrayToolsArrayPartitionAnyAll.
  - test/nopre: add RecursiveArrayTools + [sources].
  - test/downstream: add Test + [sources] for root and
    RecursiveArrayToolsShorthandConstructors.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* test: canonicalize test-group structure (standalone QA group, group folders)

Make the root test layout match the OrdinaryDiffEq canonical pattern: every
test lives in exactly one group, each group in its own capitalized test/<Group>/
folder, dep-adding groups have their own Project.toml (excluded from the light
main env), and the version matrix is consistent between CI and test_groups.toml.

- Split QA (Aqua) out of the Core branch into a standalone QA group keyed on
  GROUP == "QA" || GROUP == "All", running in its dep-adding test/QA env. Add a
  dedicated QA matrix row to CI.yml restricted to [lts, 1] (excluded on pre),
  so QA no longer runs inside the functional Core job.
- Normalize sublib test_groups.toml [Core] versions ["lts","1.11","1","pre"] ->
  ["lts","1","pre"] for all three sublibraries.
- Move the loose root Core test files into test/Core/, including the previously
  orphaned partitions_and_static_arrays.jl which was never wired into runtests
  and is now part of the Core group. Capitalize the remaining group folders
  (downstream->Downstream, gpu->GPU, nopre->NoPre, qa->QA) and route the
  SymbolicIndexingInterface and NoPre tests into their own group folders so all
  group folder names match their CI GROUP names.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* test: exclude standalone QA group from All

QA is its own dep-adding test group (test/QA/Project.toml) and is run as
a separate CI matrix entry, so it should not also fire under the "All"
group. CI never runs "All", and a local "All" run should not pull the QA
tooling into the functional test pass.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* ci: canonical TagBot thin-caller + downgrade-caller cleanup

Replace TagBot.yml with the canonical SciML/.github tagbot.yml@v1 thin
caller, plus a tagbot-subpackages matrix over the registered monorepo
sublibraries (RecursiveArrayToolsArrayPartitionAnyAll,
RecursiveArrayToolsRaggedArrays, RecursiveArrayToolsShorthandConstructors).

Drop hand-maintained skip lists and pinned julia-version floors from the
downgrade callers; the centralized workflow now auto-populates skip
(stdlibs union in-repo sublibs union caller package) and defaults to the
LTS floor.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

---------

Co-authored-by: Chris Rackauckas <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
…oml) (SciML#613)

Replace the hand-maintained group x version matrix (plus the bespoke GPU
job) in the root CI.yml `tests` job with the reusable grouped-tests.yml@v1
thin caller. The matrix now lives in test/test_groups.toml and is computed
by compute_affected_sublibraries.jl --root-matrix.

The root runtests.jl dispatches on the default GROUP env var, so no
group-env-name override is needed. check-bounds: auto is preserved as a
workflow-level input. coverage-directories defaults to src,ext (matches old).

Verified the computed root matrix equals the old workflow's (group, version,
runner) set exactly: 14/14.

Co-authored-by: ChrisRackauckas-Claude <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
Replace the hand-written GROUP if-ladder in test/runtests.jl with a single
declarative SciMLTesting.run_tests call. Behavior-equivalent: the set of tests
run under every GROUP value (bare/All, Core, QA, SymbolicIndexingInterface,
Downstream, GPU, NoPre, and each lib/ sublibrary name + _<group>) is identical
to the pre-conversion runtests.jl.

v1.1.0 specifics used (this corrected pass fixes two v1.0.0-style bugs):

- sublib_env = "RECURSIVEARRAYTOOLS_TEST_GROUP". The monorepo root reads GROUP to
  pick which lib/<Sublibrary> to Pkg.test, but the sublibraries read their own
  RECURSIVEARRAYTOOLS_TEST_GROUP for the sub-group. The first pass relied on the
  default sublib_env=GROUP, which left RECURSIVEARRAYTOOLS_TEST_GROUP unset in the
  sublibrary subprocess (it only coincidentally ran Core via the sublib's own
  default). Setting sublib_env restores the original withenv handoff exactly.

- all = ["Core", "SII_Main"]. "All" runs exactly the root Core body plus the
  in-main-env SymbolicIndexingInterface API safetestset, matching the original
  `GROUP == "Core" || "All"` and `GROUP == "SymbolicIndexingInterface" || "All"`
  branches. It deliberately excludes QA, Downstream, GPU and NoPre, which the
  original All branch never ran.

- umbrellas: GROUP=SymbolicIndexingInterface expands to the SII API safetestset
  (main env) then the DiffEqArray symbol-indexing test (Downstream env), in that
  order, preserving the original two-stage env handoff. The Downstream group runs
  its four functional safetestsets followed by the same symbol_indexing test, as
  before.

- lib_dir = lib routes a bare sublibrary GROUP (or <sublib>_<group>) to
  Pkg.test(sublib) with the sub-group exported via sublib_env.

- per-group env = (Downstream / GPU / NoPre / QA) replaces the activate_*_env
  helpers; GPU keeps its explicit parent develop of root + the
  ArrayPartitionAnyAll sublibrary.

Add SciMLTesting (1) to [extras] + [compat] + targets.test. Pkg is retained in
the test deps because the Core body still Pkg.develops the ShorthandConstructors
sublibrary into the main env. qa.jl is unchanged and SciMLTesting is not added to
test/QA/Project.toml (qa.jl uses Aqua directly, not run_qa).

Verified locally: GROUP=Core ran the full Core suite to green via the new harness
(RecursiveArrayTools tests passed), and a routing simulation against the real
SciMLTesting source confirmed the recorded action sequence per GROUP matches the
pre-conversion runtests.jl, including RECURSIVEARRAYTOOLS_TEST_GROUP handoff.

Co-authored-by: ChrisRackauckas-Claude <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
Adds a canonical QA test group to each sublibrary:
RecursiveArrayToolsArrayPartitionAnyAll, RecursiveArrayToolsRaggedArrays,
RecursiveArrayToolsShorthandConstructors.

Each unit gets test/qa/{Project.toml,qa.jl} running Aqua.test_all +
JET.test_package(target_defined_modules=true), a QA dispatch in
test/runtests.jl gated on RECURSIVEARRAYTOOLS_TEST_GROUP == "QA" (with
the Julia < 1.11 [sources] develop fallback mirroring the root QA env),
Pkg wired into [extras]/[targets] with compat so Aqua deps_compat stays
green, and a [QA] entry (versions = ["lts", "1"]) in test_groups.toml.

Co-authored-by: Chris Rackauckas (Claude) <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
…#616)

The ArrayPartitionAnyAll and ShorthandConstructors sublibrary QA groups
(added in SciML#614) fail Aqua's piracy check because they extend Base
functions on RecursiveArrayTools-owned types:

  * ArrayPartitionAnyAll: any/all on ArrayPartition
  * ShorthandConstructors: getindex(::Type{VA}, ...), getindex(::Type{AP}, ...)

These are intentional methods on types the sublibraries hard-depend on, not
type piracy. Pass them via Aqua.test_all(...; piracies = (; treat_as_own = ...))
so the owned-type extensions are not flagged.

Co-authored-by: ChrisRackauckas-Claude <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
…ds >= 1.10.8) (SciML#617)

* Run downgrade CI on Julia 1.11 (Mooncake 0.5 needs >= 1.10.8)

The Downgrade (Core) job fails on master with `ERROR: LoadError:
Unsatisfiable`. The downgrade resolver runs `--min=@deps` and minimizes
the Julia version to the floor implied by the workflow's Julia channel.
With the default `lts` channel that floor is 1.10.0, but every Mooncake
0.5.x release (used by RecursiveArrayToolsMooncakeExt) declares
`julia = "1.10.8 - 1.10, 1.11.6 - 1"`, so no Mooncake version is
installable at 1.10.0 and Mooncake gets no candidate version.

Reproduced locally with the actual julia-actions/julia-downgrade-compat
downgrade.jl driver against a checkout of this repo:
  julia_version=1.10 -> ERROR: LoadError: Unsatisfiable
  julia_version=1.11 -> "Successfully resolved minimal versions"

Pin the downgrade job to Julia 1.11 (the same approach OrdinaryDiffEq.jl
uses), where 1.10.8+ is satisfied and every declared floor is jointly
installable. Core support for Julia 1.10 is unchanged and is still
exercised by the normal lts test legs; this only affects which Julia the
downgrade resolver minimizes against.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* Fix typo: tupe -> type in named_array_partition comment

Fixes the Spell Check with Typos CI failure flagging `tupe` in
src/named_array_partition.jl.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* Split AD tests into a dedicated off-downgrade group

Move the Mooncake/Zygote/ForwardDiff/ReverseDiff test files out of the root
Core group and into a dedicated `AD` group with its own sub-environment
(test/AD/Project.toml, [sources] RecursiveArrayTools = path), modeled on the
NoPre group. The AD group is marked in_all = false and is not run in the
Downgrade lane (which runs only Core), so its deps are never fed to the
downgrade resolver.

This removes Mooncake (and the other AD backends) from the root [targets].test
set. The downgrade workflow builds/tests with project: "@." (the repo root) and
minimizes every direct dep plus the Julia version to the 1.10.0 LTS floor;
Mooncake 0.5 requires Julia >= 1.10.8, so at the 1.10.0 floor it was
Unsatisfiable. With Mooncake out of the root test target the resolver no longer
sees it, fixing the wall at the source instead of pinning the downgrade Julia
version.

This reverts the Downgrade.yml julia-version: "1.11" approach from this branch
in favor of the AD split. Mooncake/Zygote/ForwardDiff/ReverseDiff remain as
[weakdeps]+[compat] for the AD extensions; the AD tests still run (in their own
group on a normal Julia). The tupe->type spellcheck fix is kept.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

---------

Co-authored-by: ChrisRackauckas-Claude <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
* Release RecursiveArrayToolsArrayPartitionAnyAll v1.0.1

* Release RecursiveArrayToolsRaggedArrays v1.1.1

* Release RecursiveArrayToolsShorthandConstructors v1.0.1
The GPU test environments pinned CUDA.jl below v6, but the V100 GPU CI
runners now use nvidia driver 580, which requires CUDA.jl v6.2+ for
correct CUDA runtime selection (CUDA.jl versions <6.2 select the runtime
based on the driver version and pick an incompatible runtime; see
JuliaGPU/CUDA.jl#3134). Widen the CUDA compat to "6" so the resolver
picks the latest 6.x with the fix.
* QA: run_qa v1.6 form + ExplicitImports (root + sublibs)

Convert every QA environment (root test/QA and each lib/<Sub>/test/qa) to the
SciMLTesting v1.6 `run_qa` form with ExplicitImports enabled.

Per env:
- root RecursiveArrayTools: aqua_broken=(:ambiguities,) (tracking SciML#326);
  ei_broken=(:no_implicit_imports,) (tracking SciML#619); EI public-access ignore-list
  for non-public upstream names. Pkg sentinel guard preserved.
- RecursiveArrayToolsArrayPartitionAnyAll: piracies treat_as_own=[ArrayPartition];
  JET target_defined_modules. EI clean.
- RecursiveArrayToolsShorthandConstructors: piracies treat_as_own=[VA, AP];
  JET target_defined_modules. EI clean.
- RecursiveArrayToolsRaggedArrays: piracies treat_as_own on the RAT-owned
  AbstractRagged{VectorOfArray,DiffEqArray} abstract types (fixes the pre-existing
  Aqua piracy false-positive); ei_broken=(:no_implicit_imports,) (SciML#619);
  EI ignore-lists for the RAT-owned ragged types and non-public upstream names.
  Removed the stale `AllObserved` explicit import (EI no_stale fix). The JET
  similar_type(::Any) report is a pre-existing master finding tracked in SciML#620 and
  is left as a hard check (not silenced).

Add SciMLTesting (compat "1.6") to each QA env; ExplicitImports comes in
transitively. [sources]/develop wiring preserved exactly.

Co-Authored-By: Chris Rackauckas <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* RaggedArrays QA: mark pre-existing JET similar_type finding as jet_broken

The RecursiveArrayToolsRaggedArrays QA lane fails JET typo-mode with 4
similar_type(::Any) no-matching-method reports from the copyto!/fill!/
broadcast immutable-element branches (dest.u[i] infers as ::Any because the
abstract AbstractRaggedVectorOfArray .u field is untyped). Verified byte-
identically pre-existing on unmodified master (run JET.report_package on a
clean bf98ebd checkout: same 4 reports at src lines 1335/1347/1468/1636; the
current master tip 5e20683 Sublibrary CI also fails on exactly this one lane).
Not introduced by the run_qa v1.6 conversion.

Use jet_broken=true so the lane records the finding as @test_broken (report-
only, auto-flags an Unexpected Pass once the real fix lands) instead of a hard
red. The underlying inference fix is tracked in
SciML#620.

Verified locally vs released SciMLTesting 1.7.0: QA group green on Julia 1.12.6
(16 pass / 2 broken / 0 fail) and Julia 1.10 LTS (14 pass / 2 broken / 0 fail).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Co-Authored-By: Chris Rackauckas <[email protected]>

---------

Co-authored-by: ChrisRackauckas-Claude <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
- RecursiveArrayTools 4.3.3 -> 4.3.4 (patch): only change since 4.3.3 is a
  CI-only TagBot.yml workflow update (targeted monorepo TagBot); no source
  changes.
- RecursiveArrayToolsArrayPartitionAnyAll 1.0.1 -> 1.0.2 (patch): QA/test
  scaffolding conversion to SciMLTesting run_qa v1.6 form; no src changes.
- RecursiveArrayToolsRaggedArrays 1.1.1 -> 1.1.2 (patch): QA/test scaffolding
  conversion plus removal of a stale unused `AllObserved` import (mechanical,
  behavior-preserving; symbol confirmed unused in the file).
- RecursiveArrayToolsShorthandConstructors 1.0.1 -> 1.0.2 (patch): QA/test
  scaffolding conversion to SciMLTesting run_qa v1.6 form; no src changes.

No compat floor cascades required: none of the bumped packages added new
public API, so sibling packages' existing "RecursiveArrayTools = 4" /
"RecursiveArrayToolsShorthandConstructors = 1" compat floors already resolve
correctly against the new versions.
Add missing docstrings and rendered docs entries for exported RecursiveArrayTools API, switch QA to SciMLTesting's shared rendered public-docs check, and load the ragged-array subpackage through the docs environment instead of a LOAD_PATH hack.

Co-authored-by: ChrisRackauckas-Claude <[email protected]>
@rokke-git rokke-git closed this Jul 20, 2026
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.

5 participants